提问人:LeXela-ED 提问时间:2/27/2022 最后编辑:LeXela-ED 更新时间:2/27/2022 访问量:595
等效于 numpy.transpose 和 numpy.expand_dims in C++ (OpenCV)
equivalent for numpy.transpose and numpy.expand_dims in C++ (OpenCV)
问:
我正在尝试将以下用 Python 编写的代码转换为 C++:
blob = cv2.dnn.blobFromImages(frames, 1.0, (SAMPLE_SIZE, SAMPLE_SIZE), (0, 0, 0), swapRB=True, crop=True)
blob = np.transpose(blob, (1, 0, 2, 3))
blob = np.expand_dims(blob, axis=0)
但是,我不知道该怎么做,在 C++ 和/或 OpenCV 中。任何帮助或建议将不胜感激。np.transpose
np.expand_dims
答:
1赞
berak
2/27/2022
#1
你可以试试这个(是的,我知道,它看起来很奇怪......
// the input blob structure for the resnet-34_kinetics action recognition,
// taken from:
// https://github.com/opencv/opencv/blob/master/modules/dnn/test/test_onnx_importer.cpp#L611
//
Mat blob5D(const std::vector<Mat> &images) {
Mat blob0 = blobFromImages(images, 1.0, Size(112, 112), Scalar(114.7748, 107.7354, 99.4750), true, true);
Net permute;
LayerParams lp;
int order[] = {1, 0, 2, 3};
lp.set("order", DictValue::arrayInt<int*>(&order[0], 4));
permute.addLayerToPrev("perm", "Permute", lp);
permute.setInput(blob0);
Mat input0 = permute.forward().clone();
int dims[] = {1, 3, 16, 112, 112}; // 16 == time batch size
return input0.reshape(0, 5, &dims[0]);
}
然后,你可能应该改变方式,图像被采样—— 不是连续的(就像在 py 示例中一样),而是将你的剪辑分成 16 个等距步骤(就像在训练代码中所做的那样)
GL与它!
评论
0赞
LeXela-ED
2/28/2022
非常感谢@berak。问题解决了!但是,我完全不明白解决方案!是否有任何合适的资源来阅读和熟悉正在发生的事情?:->
0赞
berak
2/28/2022
同样,它取自一些 DNN 单元测试(请参阅评论中的链接),是的,我也花了一段时间才发现它。也许看看原始的 PyTorch 存储库
评论