我有一个项目,我的工作是分割图像。它通过评估每一对像素的位置和强度差异(或相似性)来实现。它将每个像素看作图上的一个节点,每个像素的相似度对应于其连接边的权重。因此,我需要构建一个大小为(imageHeight*imageWidth)^2
的对称权重矩阵。你知道吗
结果证明,构建矩阵需要很长时间,所以我正在尝试实践它(如果这是一个词的话)。你知道吗
下面是有问题的代码片段:
def Multiprocess(self, sigmaI, sigmaX):
cpus = mp.cpu_count()
print('Number of cpu\'s to process WM: %d' % cpus)
jobs = []
i = 0
for p in range(self.numPixels):
for c in range(cpus):
if i >= self.numPixels:
break
else:
weightCalculation = mp.Process(name='weightCalc%d'%(i), target = self.CreateMatrixMp, args = (sigmaI, sigmaX, i,))
jobs.append(weightCalculation)
weightCalculation.start()
i += 1
实际上,你唯一需要知道的是self.numPixels
是图像中的像素数。sigmaX
和sigmaI
是任意两个像素之间位置和强度的差异。你知道吗
该算法所做的是观察一个像素,像素i
,然后循环遍历图像中的其他每个像素j
,找出它们之间的相似性。所以它是在并发中执行numPixels^2
操作。你知道吗
我希望我上面写的代码也能做同样的事情,但是一次只能做cpus
个像素。现在应该有(numPixels^2)/cpus
进程在并发运行,对吗?对于大的,甚至是小的图像,这将大大减少时间。你知道吗
但我说的对吗?我必须有某种循环,这种循环的数量超过了cpu的数量(即for p in range(self.numpixels)
)。所以在这种情况下,我是否有行for c in range(cpus)
也很重要?如果它本身是while循环,它也会做同样的事情,因为一旦它分配了cpu
个进程,它就会再次循环。你知道吗
我应该在for循环的末尾“等待”一些东西,并且只在一个进程完成之后才开始下一个进程吗?或者如果我让它保持原样,它会以某种方式让它们排队吗?但这又让我想知道是否需要在任何地方指定cpu计数。我想这是一个多处理python包如何工作的问题,但是我已经阅读了一些教程和所有文档,似乎遗漏了一些东西。你知道吗
感谢所有读过这篇文章的人:p,以及任何能帮上忙的人!你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐