我想知道如何使用CUDA或OpenCL来加速我的Python块匹配算法,因为这样的算法应该是高度并行的。目前,我的算法的工作原理如下:
For some blocks B1_i of the first image:
For blocks B2_j (in the neighborhood of B1_i) in the second image:
Find the block which minimizes the distance d(B1_i,B2_j)
由于我的代码目前需要大约1小时,我想避免第一个循环,即我想以并行方式处理所有的B1_i块。
然而,当我尝试在第二个图像上找到最相似的块时,我需要使用一些特定的函数,例如使用scikit-learn的内核密度估计,所以这部分理想情况下应该用Python编写。
你认为这是一种“聪明”的做法吗?
编辑:
我对我的代码进行了描述,并且我意识到最慢的部分是联合直方图估计。到目前为止,我已经通过scikit-learn(KernelDensity)使用高斯核密度估计来实现这一点,并且看起来numpy histogram2d函数更快。但是,我想我仍然可以提高这一部分的速度,但我想知道如何。
你认为用C或C ++等低级语言重写2D联合直方图会有所帮助吗?
答案 0 :(得分:2)
为其中一个图像保持块静态(例如:block_1将始终为x:0 y:0 w:64 h:64,2将为x:64 y:0 w:64 h:64)并且对于另一个图像,根据您的邻域阈值创建所有可能的块。
For y = -NeighborHoodThresholdY To NeighborHoodThresholdY
For x = -NeighborHoodThresholdX To NeighborHoodThresholdX
// parallelize
FOr Each block2 In image2
// separate thread / task / kernel
block1 = image1.Region(block2.X + x, block2.Y + y, block2.Width, block2.Height)
Compare(block1, block2)
Next
Next
Next