【问题标题】:In tensorflow c++ api, how to save a picture or an array from a tensor在tensorflow c++ api中,如何从张量中保存图片或数组
【发布时间】:2018-03-15 09:31:49
【问题描述】:

我正在尝试使用 tf 1.5.0 c++ api 运行保存的图像分割模型。 我的模型得到一个大小为 1*256*256*3 的输入图像,并提供给这样的张量:

  for (int x = 0; x < 256; x++) {
    for (int y = 0; y <256; y++) {
      data_(0, x, y, 0) =
          (float) image_out.at<cv::Vec3b>(x, y)[0];
      data_(0, x, y, 1) =
          (float) image_out.at<cv::Vec3b>(x, y)[1];
      data_(0, x, y, 2) =
          (float) image_out.at<cv::Vec3b>(x, y)[2];
    }
  }

然后我使用sess-&gt;Run() 运行模型,并得到输出:

输入张量类型:浮点形状:[1,224,224,3] 值:[[[254 254 254]]]... 输出张量类型:浮点形状:[1,224,224,1] 值: [[[0.160249829][0.0639446825][0.0414313935]]]...

我想使用 cv::imwrite() 将输出保存到图像中。但是,张量不能直接保存。所以我尝试像这样转换张量:tensorflow::tensor->eigen::mat->cv::mat。代码是:

auto m = Eigen::Map<Eigen::Matrix<
             float,           /* scalar element type */
             Eigen::Dynamic,  /* num_rows is a run-time value */
             Eigen::Dynamic,  /* num_cols is a run-time value */
             Eigen::RowMajor  /* tensorflow::Tensor is always row-major */
              >>(
                 outputs[0].flat<float>().data(),  /* ptr to data */
                 outputs[0].dim_size(1),           /* num_rows */
                 outputs[0].dim_size(2)            /* num_cols */);

  //std::cout << "m " << m << std::endl;

  cv::Mat rotMatrix;
  cv::eigen2cv(m, rotMatrix);

这会在编译时引发错误:

注意:模板 void cv::eigen2cv(const Eigen::Matrix<_scalar _rows _cols _options _maxrows _maxcols>&, cv::Mat&) void eigen2cv( const Eigen::Matrix<_tp _rows _cols _maxcols>& src, Mat& dst ) ^ /usr/local/opencv3.1/include/opencv2/core/eigen.hpp:63:6:注意:模板参数推导/替换失败: src/demo/demo.cpp:152:28:注意:
\u2018Eigen::Map >\u2019 不是 源自 \u2018const Eigen::Matrix<_scalar _rows _cols _options _maxrows _maxcols>\u2019 cv::eigen2cv(m, rotMatrix); ^ 在 src/demo/demo.cpp:11:0 中包含的文件中: /usr/local/opencv3.1/include/opencv2/core/eigen.hpp:81:6:注意: 模板无效 cv::eigen2cv(const Eigen::Matrix<_scalar _rows _cols _options _maxrows _maxcols>&, cv::Matx<_tp m n>&) void eigen2cv( const Eigen::Matrix<_tp _rows _cols _options _maxrows _maxcols>& 源代码, ^ /usr/local/opencv3.1/include/opencv2/core/eigen.hpp:81:6: 注意:模板参数推导/替换失败: src/demo/demo.cpp:152:28:注意:
\u2018Eigen::Map >\u2019 不是 源自 \u2018const Eigen::Matrix<_scalar _rows _cols _options _maxrows _maxcols>\u2019 cv::eigen2cv(m, rotMatrix); ^ make: *** [obj/demo.o] 错误 1

怎么了?

另一方面,我认为这不是从张量获取图片的好方法。我已经删除了 tf 的 c++ api 文档,但没有找到好方法。 https://www.tensorflow.org/api_docs/cc/class/tensorflow/tensor#classtensorflow_1_1_tensor_1a6afab48885080a80ff0b52437959d929

那么,有没有方便的方法呢?

【问题讨论】:

  • 您找到问题的解决方案了吗?我也有同样的问题,我也在寻找答案。所以,如果是的话。请公布答案。

标签: c++ opencv tensorflow eigen


【解决方案1】:

我认为你可以通过这种方式直接用 OpenCV 矩阵头包装张量数据:

cv::Mat rotMatrix(outputs[0].dim_size(1), outputs[0].dim_size(2), CV_32FC1, outputs[0].flat<float>().data())

【讨论】:

  • 我试过这种方式,结果是一维数组,不是分割图像。
  • @Zaher88abd,矩阵形状由前两个参数指定。在上面的代码示例中,我使用了张量的 #1 和 #2 维度。当然,这取决于张量布局(是否包括批量维度以及通道维度是在开头还是结尾)。所以你需要根据你的张量调整cv::Mat的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多