【发布时间】:2019-02-02 06:36:24
【问题描述】:
我正在使用滑动窗口对大矩形图像进行深度学习。图像具有形状(高度、宽度)。
预测输出是一个形状(高度、宽度、预测概率)的ndarray。我的预测在重叠窗口中输出,我需要将这些窗口加在一起以获得整个输入图像的逐像素预测。窗口在(高度、宽度)上重叠超过 2 个像素。
我以前在 C++ 中做过这样的事情,创建一个大的结果索引,然后将所有 ROI 相加。
#include <opencv2/core/core.hpp>
using namespace std;
template <int numberOfChannels>
static void AddBlobToBoard(Mat& board, vector<float> blobData,
int blobWidth, int blobHeight,
Rect roi) {
for (int y = roi.y; y < roi.y + roi.height; y++) {
auto vecPtr = board.ptr< Vec <float, numberOfChannels> >(y);
for (int x = roi.x; x < roi.x + roi.width; x++) {
for (int channel = 0; channel < numberOfChannels; channel++) {
vecPtr[x][channel] +=
blobData[(band * blobHeight + y - roi.y) * blobWidth + x - roi.x];}}}
在 Python 中是否有一种矢量化的方式来执行此操作?
【问题讨论】:
-
投票结束,因为过于广泛。使用 numpy ndarrays 来保存图像:有许多使用 Numpy as_strided 步幅技巧的滑动窗口实现,可以通过搜索找到。 Scikit 有一个提取补丁方法/功能 - 它曾经使用 as_strided - 不知道它是否仍然如此。
-
@Kevin,在审阅者关闭之前,您可能希望在问题的结尾处进行类似于我上面的评论的简介。并尽量避免在问题中使用“最快”或“最佳”之类的词,因为它们只是接近投票的诱饵。您想要一种快速的方法来执行当前需要
for循环的事情。要求一个“矢量化”解决方案(这个问题你不会得到它,但你也会避免接近投票)。 -
还要检查
this,了解为什么有人会说“建议尽可能避免使用as_strided”。 -
我知道,@kevinkayaks,提问者也叫凯文。 :P
-
已编辑以防止审查队列关闭。如果我误解了这个问题,请随时回复。