从 batch 中提取矩阵,表示为 Tensor
Extract matrix from batch, represented as Tensor
我在 C++ 中使用 Tensorflow。我正在使用经过训练的模型从输入图像中提取补丁。
我的输出张量(在会话 运行 之后)是 outputs
并且在 outputs[0]
中有一批 N 个补丁,MxMxD。
auto patches = outputs[0].tensor<float, 4>();
现在,我想使用 OpenCV 显示此图像,特别是,我想使用 cv::eigen2cv
函数,给定一个 Eigen::Matrix
给我一个 cv::Mat
。
问题是我需要遍历这个输出张量并为每个元素提取一个 Eigen::Matrix
.
我已经在此处尝试了建议的解决方案: 但由于 Eigen 错误,我什至无法编译代码:EIGEN_STATIC_ASSERT_VECTOR_ONLY:
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++;
}
}
那么,我怎样才能从 Eigen::Tensor(或 tf::Tensor)中得到一个可以用于 cv::eigen2cv
的矩阵?
环顾四周 the documenation of OpenCV,考虑到 TensorFlow 张量始终是行优先的,您应该能够像这样做:
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
。
我在 C++ 中使用 Tensorflow。我正在使用经过训练的模型从输入图像中提取补丁。
我的输出张量(在会话 运行 之后)是 outputs
并且在 outputs[0]
中有一批 N 个补丁,MxMxD。
auto patches = outputs[0].tensor<float, 4>();
现在,我想使用 OpenCV 显示此图像,特别是,我想使用 cv::eigen2cv
函数,给定一个 Eigen::Matrix
给我一个 cv::Mat
。
问题是我需要遍历这个输出张量并为每个元素提取一个 Eigen::Matrix
.
我已经在此处尝试了建议的解决方案:
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++;
}
}
那么,我怎样才能从 Eigen::Tensor(或 tf::Tensor)中得到一个可以用于 cv::eigen2cv
的矩阵?
环顾四周 the documenation of OpenCV,考虑到 TensorFlow 张量始终是行优先的,您应该能够像这样做:
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
。