【问题标题】:Multiprocessing with python to find Max value使用python进行多处理以找到最大值
【发布时间】:2014-05-07 01:16:21
【问题描述】:

我正在使用 Python 2.7.5 和 OpenCV。我有一个测试图像,我想在一组图像中找到它最相似的图像。我已经使用 OpenCV 编写了一个函数,它将给出相似点的总数。我的点越相似,图像就越相似。不幸的是,这是一个相当耗时的函数,所以我想并行化我的代码以使其更快。

#img is the image that I am trying to find the most number of similar pointswith
maxSimilarPts = 0;

#testImages is a list of testImages
for testImage in testImages:
    #getNumSimilarPts returns the number of similar points between two images
    similarPts = getNumSimilarPts(img, testImage) 

    if similarPts > maxSimilarPts:
        maxSimilarPts = similarPts

如何与 python 并行执行此操作?任何帮助将不胜感激。

【问题讨论】:

  • 你可能想看看this post。它与 OpenCV 无关。但是它有很多关于使用python进行多线程的讨论。

标签: python multithreading python-2.7 opencv multiprocessing


【解决方案1】:

以下是原始代码的(未经测试的)并行版本。它并行运行 5 个工作人员。每个人从输入队列中取出一张图像,计算相似度,然后将值和图像放入输出队列。当所有的worker都完成后,没有更多的图像了,然后父进程打印最相似的图像的(相似度,imageID)。

# adapted from Raymond Hettinger
# http://stackoverflow.com/questions/11920490/how-do-i-run-os-walk-in-parallel-in-python/23779787#23779787

from multiprocessing.pool import Pool
from multiprocessing import JoinableQueue as Queue
import os, sys


def parallel_worker():
    while True:
        testImage = imageq.get()
        similarPts = getNumSimilarPts(img, testImage) 
        similarq.put( [similarPts, testImage] )
        imageq.task_done()

similarq = Queue()
imageq = Queue()
for testImage in testImages:
    imageq.put(testImage)

pool = Pool(5)
for i in range(5):
    pool.apply_async(parallel_worker)

imageq.join()
print 'Done'

print max(similarq)

【讨论】:

    【解决方案2】:

    重要提示:

    此代码仅适用于 python3。要在 python2 上运行它,您必须安装 concurrent.futures PyPI package

    from concurrent.futures import ProcessPoolExecutor
    
    
    def multiprocess_max(iterable, key):
        with ProcessPoolExecutor() as executor:
            return max(executor.map(lambda item: (item, key(item)), iterable),
                       key=lambda item: item[1])[0]
    

    背后的思路如下:

    昂贵的过程是计算比较项目的关键。 那么,如何不通过多进程计算密钥而只使用一个进程进行比较呢?

    它是这样工作的:

    创建一个concurrent.futures.ProcessPoolExecutor,它是一个易于使用的multiprocessing 模块的包装器,并提供一个类似于内置函数的map() 函数,但可以同时工作。

    然后,从集合中,为每个项创建具有 2 个元素的元组:原始项(我们想要返回的,如果它的键是最大值)和键,使用传递的 key 函数计算。

    得到结果后,将其传递给内置函数max() - 但我们有一个问题:现在的集合是元组的集合!因此,我们传递了一个 key 函数,该函数返回第二项 - 计算的键。

    最后,由于max() 返回整个项目(包括不需要的键),我们从其结果中提取第一项 - 原始项目 - 并将其返回。

    编辑:

    将此代码锁定在我的控制台(IDLE;我发现这个问题是因为我也需要它)后,我认为我的解决方案是错误的 :-)

    但我错了,不是解决办法。 此解决方案在解释器中不起作用。来自the docs

    __main__ 模块必须可由工作子进程导入。这 表示ProcessPoolExecutor 在交互中不起作用 口译员。

    【讨论】:

      猜你喜欢
      • 2020-06-17
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2022-11-12
      • 2017-10-09
      相关资源
      最近更新 更多