首页 > 解决方案 > 使用多处理来预处理图像

问题描述

我试图在 python 中使用多处理来弄湿我的脚。因此,我正在尝试使用多处理来操作图像预处理管道。我的所有图像都在一个名为的目录中image_files,并且我有一个该目录中所有文件名的列表。我将列表分成两个块ab并将每个块传递给它自己的块,multiprocessing.Process其中调用的方法preprocess_image对每个图像进行预处理。

按照关于如何使用多处理计算平方根的教程,我想出了一个工作代码(见下文)。

这段代码有效,但是,速度很重要,我不确定是否适合定义两个基本相同的方法,或者只使用一个方法并简单地将a和传递bmultiprocessing.Process(target=work....

因此我的问题是这是否是使用多处理的正确方法,或者我是否可以以某种方式加速它?

def work1(array):
    for i in tqdm(array):
        image_path = "C:/Users/aaron/Desktop/image_files/"+i

        image = preprocess_image(image_path)
        cv2.imwrite("C:/Users/aaron/Desktop/destination/"+i, image)

def work2(array):
    for i in tqdm(array):
        image_path = "C:/Users/aaron/Desktop/image_files/"+i

        image = preprocess_image(image_path)
        cv2.imwrite("C:/Users/aaron/Desktop/destination/"+i, image)


if __name__ == "__main__":
    p1 = multiprocessing.Process(target=work1, args=(a,))
    p2 = multiprocessing.Process(target=work2, args=(b,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print("Done!")

标签: python

解决方案


由于您的所有流程输出似乎都是独立的,因此您应该使用MultiProcessing.Pool

from multiprocessing import Pool

l = # list of all your image files

f = # function to modify each of these, taking element of l as input.

p = Pool(10) # however many process you want to spawn

p.map(f, l)

就是这样,您不需要两次定义相同的函数或手动拆分列表。它将为您自动分配和管理。


推荐阅读