2017-04-25 51 views
0

我有一个函数称为cartoonize(image_path),它需要'path/to/image'作为参数。该脚本有点沉重,需要几分钟才能处理1920x1080大小的图像。我试图使用我所有的8 cores使用multiprocessing module,但没有性能增益,我看到下面的代码。另一个问题是如何保存图像。它返回一个CV2对象。通常情况下,我通过see below code将映像保存到磁盘上,但是使用多处理功能时出现错误"img is not a numpy array, neither a scalar."我还希望获得性能提升,但我无法弄清楚如何有效地执行此操作。使用多处理来处理图像,但没有性能增益与8 cpus

out_final = cartoonize('path/to/image')) 
cv2.imwrite('cartoon.png', out_final) 



import multiprocessing 

if __name__ == '__main__': 
    # mark the start time 
    startTime = time.time() 

    print "cartoonizing please wait ..." 
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) 
    pool_outputs = pool.apply_async(cartoonize, args=(image_path,)) 
    pool.close() 
    pool.join() 
    print ('Pool:', pool_outputs) 

    # mark the end time 
    endTime = time.time() 
    print('Took %.3f seconds' % (startTime - endTime)) 
+1

多重处理不会像魔术一样自动提升性能。你需要喂它的工作单位。如果你只给它一张图片来处理它可以并行的东西?注意:某些图像处理库能够将单个图像分解为许多工作单元......但这可能不是这种情况。 –

+0

@RalphCaraveo,它很好。我想分解成许多部分,并在此之前分别处理它们。你能给我建议如何保存图片吗?基本上它是一个CV对象,但我在这里接收一个多处理对象。 –

+0

您实际上应该会失去使用该脚本的性能。实际上,对于每个核心,您都将相同的功能应用于相同的整个图像。 –

回答

0

问题:多它给错误 “IMG是不是numpy的阵列,既不是标量。”

pool_outputs = pool.apply_async(cartoonize, args=(image_path,)) 

你的代码返回AsyncResult

的Python»3.6.1文档»multiprocessing.pool.AsyncResult
类multiprocessing.pool.AsyncResult 类由Pool.apply_async返回结果( )和Pool.map_async()。