代码之家  ›  专栏  ›  技术社区  ›  nessuno

从批中提取矩阵,用张量表示

  •  3
  • nessuno  · 技术社区  · 6 年前

    我在C++中使用Tensorflow。我正在使用一个经过训练的模型从输入图像中提取补丁。

    我的输出张量(会话运行后)是 outputs 并且已经进入 outputs[0] 一批n个补丁,mxmxd。

    auto patches = outputs[0].tensor<float, 4>();
    

    现在,我想使用opencv显示这些图像,特别是,我想使用 cv::eigen2cv 函数,给出 Eigen::Matrix 给我一个 cv::Mat .

    问题是我需要循环这个输出张量,对于每个元素,提取 矩阵 .

    我尝试过建议的解决方案,这里: https://stackoverflow.com/a/39475756/2891324 但我甚至无法编译代码,因为存在本征错误:本征\静态\断言\矢量\仅:

    const auto patch_side = 256;
    int batch_id = 0;
    using Matrix =
        Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
    for (auto i = 0; i < grid_shape.second; ++i) {
        for (auto j = 0; j < grid_shape.first; ++j) {
            auto size = patch_side * patch_side * depth;
            auto map =
                Eigen::Map<Matrix>(patches.data() + batch_id * size, size);
            // Eigen::Matrix4f m = map;
            Matrix m = map;
    
            cv::Mat p;
            cv::eigen2cv(m, p);
            cv::imshow("p", p);
            cv::waitKey();
            /*
            ml(cv::Rect(i * patch_side, j * patch_side, patch_side,
                        patch_side)) =
                cv::Mat(cv::Size(patch_side, patch_side), CV_32F, patches.slice
                        patches.data() + (i + j) * patch_side * patch_side);
                        */
    
            std::cout << "i,j" << i << "," << j << "\n";
            batch_id++;
        }
    }
    

    那么,我怎样才能从我能用到的本征::张量(或tf::张量)中得到一个矩阵呢? cv::eigen2cv 是吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   javidcf    6 年前

    看看周围 the documenation of OpenCV ,并且考虑到张量流张量总是行主张量,您应该能够执行如下操作:

    const auto patch_side = 256;
    int batch_id = 0;
    for (auto i = 0; i < grid_shape.second; ++i) {
        for (auto j = 0; j < grid_shape.first; ++j) {
            auto size = patch_side * patch_side * depth;
            cv::Mat p(patch_side, patch_side, CV_32FC(depth), patches.data() + batch_id * size);
            cv::imshow("p", p);
            cv::waitKey();
            /*
            ml(cv::Rect(i * patch_side, j * patch_side, patch_side,
                        patch_side)) =
                cv::Mat(cv::Size(patch_side, patch_side), CV_32F, patches.slice
                        patches.data() + (i + j) * patch_side * patch_side);
                        */
    
            std::cout << "i,j" << i << "," << j << "\n";
            batch_id++;
        }
    }
    

    注意这是 复制张量数据,但创建 cv::Mat 这就是问题所在。