python 并行化 图像处理_Python:使用多处理的并行图像读取和预处理

对于机器学习应用程序,我尝试用python编写一个图像读取器类,该类读入图像,对其进行预处理,然后成批传递给应用程序。在

阅读和预处理需要与机器学习训练/测试并行进行,使用线程和队列很容易实现。然而,由于预处理在计算上很昂贵,我想进一步并行化,以便在不同的处理中并行读取和预处理单个图像。我试着用下面的方法来实现这一点(注意,这个例子去掉了与问题无关的所有内容,例如标签的读取)import numpy as np

import cv2

import csv

from multiprocessing import Queue, Pool

def load_image(fname):

return cv2.imread(fname)[:,:,[2,1,0]].astype(np.float32)

class ImageReader(object):

def __init__(self, path_to_csv, batchsize, transform=None):

self.path_to_csv = path_to_csv

self.batchsize = batchsize

self.transform = transform

self.fnames = []

csvfile = open(path_to_csv, 'rb')

reader = csv.reader(csvfile)

for row in reader:

self.fnames.append(row[0])

self.num_samples = len(self.fnames)

def __iter__(self):

q = Queue(maxsize=3*self.batchsize)

def producer(fname):

if self.transform is None:

q.put(load_image(fname))

else:

q.put(self.transform(load_image(fname)))

p = Pool()

p.map(producer, self.fnames)

for i in range(self.num_samples//self.batchsize):

Xlst = []

for j in range(self.batchsize):

Xlst.append(q.get())

yield np.array(Xlst)

if __name__ == '__main__':

r = ImageReader('some_path', 128, transform=None)

for Xb in r:

print Xb.shape

重要的是

^{pr2}$

其中,我希望一个worker池并行处理映像(在文件名列表中指定),并将它们放入稍后访问的队列中。在

由于producer是在类内定义的,因此无法进行pickle,因此无法执行此操作。在stackoverflow周围有一些解决方法,它们使函数可以pickle,但是在我的特殊情况下,似乎没有一个可以工作,即producer将项放入队列中。有人知道我的具体情况吗?在

另外:除了腌渍问题,我还有正确的方法吗?我不太确定,因为这是我第一次使用多处理。在

你可能感兴趣的:(python,并行化,图像处理)