Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中在图像上快速运行滑动窗口方法的技巧_Python_Python 2.7_Opencv_Sliding Window - Fatal编程技术网

Python中在图像上快速运行滑动窗口方法的技巧

Python中在图像上快速运行滑动窗口方法的技巧,python,python-2.7,opencv,sliding-window,Python,Python 2.7,Opencv,Sliding Window,Haar级联分类器采用带金字塔的滑动窗口方法检测目标。对我来说,检测图像中的物体大约需要0.01秒。然而,我的问题是,当使用滑动窗口方法时,它如何能如此快速?(我实现了一个用于检测对象的CNN,它使用滑动窗口检测没有金字塔的对象,尽管检测对象需要2秒钟)。我想知道什么是技巧运行滑动窗口方法更快?我使用了两个循环来快速滑动整个图像,并使其并行,但仍然比OpenCV实现慢得多 根据我的经验,最快的方法是使用numpy.lib.stride\u技巧.as\u stride函数。实际上,我们要做的是首先

Haar级联分类器采用带金字塔的滑动窗口方法检测目标。对我来说,检测图像中的物体大约需要0.01秒。然而,我的问题是,当使用滑动窗口方法时,它如何能如此快速?(我实现了一个用于检测对象的CNN,它使用滑动窗口检测没有金字塔的对象,尽管检测对象需要2秒钟)。我想知道什么是技巧运行滑动窗口方法更快?我使用了两个循环来快速滑动整个图像,并使其并行,但仍然比OpenCV实现慢得多

根据我的经验,最快的方法是使用
numpy.lib.stride\u技巧.as\u stride
函数。实际上,我们要做的是首先使用numpy函数在一个大数组中生成并存储所有面片(滑动窗口位置)。然后我们就可以把这个数组映射到我们的函数

首先,定义定义为(图像高度、图像宽度、内核高度、内核宽度)的形状。然后您可以跨过图像的各个位(即,8位图像每个像素都是8位跨步)。在这种情况下,补丁将是图像步幅的重复两次。您可以使用
img.strips
检查步幅

def some_func(roi):
    '''
    simple function to return the mean of the region
    of interest
    '''
    return np.mean(roi)

img = np.zeros((30000,30000), dtype=np.uint8)
img_shape = img.shape

size = 3 # window size i.e. here is 3x3 window

shape = (img.shape[0] - size + 1, img.shape[1] - size + 1, size, size)
strides = 2 * img.strides
patches = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
patches = patches.reshape(-1, size, size)

output_img = np.array([some_func(roi) for roi in patches])
output_img.reshape(img_size)
在某些情况下,还可以做一些其他的增加,比如对函数进行向量化
np.vectorize()
。如果您想要计算平均值,您也可以只使用
output\u img=patches.mean(axis=-1,-2))
,而不需要映射到函数,也不需要重塑形状。还有一些可能更快的方法可以将数组映射到函数。我给出了这个解决方案,因为任何过程都可以添加到函数中,而且这个问题似乎很一般。

根据我的经验,最快的方法是使用
numpy.lib.stride\u tricks.as\u stride
函数。实际上,我们要做的是首先使用numpy函数在一个大数组中生成并存储所有面片(滑动窗口位置)。然后我们就可以把这个数组映射到我们的函数

首先,定义定义为(图像高度、图像宽度、内核高度、内核宽度)的形状。然后您可以跨过图像的各个位(即,8位图像每个像素都是8位跨步)。在这种情况下,补丁将是图像步幅的重复两次。您可以使用
img.strips
检查步幅

def some_func(roi):
    '''
    simple function to return the mean of the region
    of interest
    '''
    return np.mean(roi)

img = np.zeros((30000,30000), dtype=np.uint8)
img_shape = img.shape

size = 3 # window size i.e. here is 3x3 window

shape = (img.shape[0] - size + 1, img.shape[1] - size + 1, size, size)
strides = 2 * img.strides
patches = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
patches = patches.reshape(-1, size, size)

output_img = np.array([some_func(roi) for roi in patches])
output_img.reshape(img_size)

在某些情况下,还可以做一些其他的增加,比如对函数进行向量化
np.vectorize()
。如果您想要计算平均值,您也可以只使用
output\u img=patches.mean(axis=-1,-2))
,而不需要映射到函数,也不需要重塑形状。还有一些可能更快的方法可以将数组映射到函数。我给出了这个解决方案,因为任何过程都可以添加到函数中,这个问题似乎非常普遍。

您使用的是python循环吗?大多数OpenCV方法都是用C++运行的,其中很多都是经过严格优化的(SSE、OMP等)。而且,python循环相当慢。。。通常情况下,您会尽量避免使用它们,并使用诸如numpy(预编译)之类的优化工具。感谢您的评论,是否可以在一条评论中使用numpy将图像分割为重叠的切片,并将其存储在子numpy数组中?用numpy来做这件事。另外,如果您想在纯python中执行此操作,可以尝试将其转换为c并使用编译?大多数OpenCV方法都是用C++运行的,其中很多都是经过严格优化的(SSE、OMP等)。而且,python循环相当慢。。。通常情况下,您会尽量避免使用它们,并使用诸如numpy(预编译)之类的优化工具。感谢您的评论,是否可以在一条评论中使用numpy将图像分割为重叠的切片,并将其存储在子numpy数组中?用numpy来做这件事。另外,如果你想在纯python中实现它,你可以尝试将它转换成c并用编译。这是一种非常有效的方法。谢谢。初始的
补丁
是地址数组吗?这是一种非常有效的方法。谢谢。初始的
补丁
是地址数组吗?