【发布时间】:2019-10-22 11:15:14
【问题描述】:
我正在尝试在 OD 模型(用于定位对象)之上运行分类器模型。为了减少延迟,我对 OD 和 Classifier 模型都使用了多处理。输出是正确的,但我得到了重复的结果。
我有一台 8 核的机器,所以我使用 pool=mp.Pool(8) 进行多处理
我正在使用map_async 并有一个可迭代的图像路径列表。
为了获得列表中的结果,我使用.get()。
一开始我没有在pool.close()之后实现pool.join(),这是我在浏览了几个站点后发现的。我得到的输出错误是因为chunksize 我传递给pool.map_async()。相同输出的重复次数与块大小相同。但是根据我对 chunksize 的理解,它应该只创建与 chunksize 大小相同的批次,并将每个批次传递给一个进程。
return_stuff_classifier=[]
def label_it(image_path):
file_name = image_path
image_name=image_path.split('/')[-1]
frame_id=image_name.split('_')[0]
object_id=image_name.split('_')[1].split('.')[0]
label="gt"
result="0.86" #Here I have explicitly mentioned this, not to go through the
#classifier model prediction
return_stuff_classifier.append((frame_id,object_id,label,result))
return return_stuff_classifier
def multiprocessor():
m_class = mp.Manager()
queue_class = m_class.Queue()
pool_class=mp.Pool(8)
# Here cropped_image_no 24 -> chunk_size_class=3
chunk_size_class=round(cropped_images_no/8)
results_class=pool_class.map_async(label_it,cropped_images,chunk_size_class).get()
#label_it is the method to be multiprocessed
#cropped_images is the list of all image paths to be multiprocessed
pool_class.close()
pool_class.join()
final_results.append(results_class)
输出:
[[['443', '10', 'ugt', '0.85964435'],
['443', '11', 'ugut', '0.48011008'],
['443', '4', 'gut', '0.50242084']],
[['443', '10', 'ugt', '0.85964435'],
['443', '11', 'ugut', '0.48011008'],
['443', '4', 'gut', '0.50242084']],
[['443', '10', 'ugt', '0.85964435'],
['443', '11', 'ugut', '0.48011008'],
['443', '4', 'gut', '0.50242084']],
[['443', '2', 'ugut', '0.8623834'],
['443', '6', 'gt', '0.95684755'],
['443', '1', 'gut', '0.683893']],
[['443', '2', 'ugut', '0.8623834'],
['443', '6', 'gt', '0.95684755'],
['443', '1', 'gut', '0.683893']],
[['443', '2', 'ugut', '0.8623834'],
['443', '6', 'gt', '0.95684755'],
['443', '1', 'gut', '0.683893']]]
预期输出:
[[['443', '10', 'ugt', '0.85964435'],
['443', '11', 'ugut', '0.48011008']
['443', '4', 'gut', '0.50242084']],
[['443', '2', 'ugut', '0.8623834'],
['443', '6', 'gt', '0.95684755'],
['443', '1', 'gut', '0.683893']]]
【问题讨论】:
-
您没有提供minimal reproducible example,当我自己编造一个时,我无法重复您所说的结果。建议您提供自己的可重现问题的可运行代码。
-
感谢@matineau 的回复。我遇到的问题是由于 pool.map_async() 方法中的 chunksize 参数。一旦我删除该论点,问题就会得到解决。但我想知道是否有任何方法可以用 chunksize 解决这个问题。以及为什么即使调用 pool.join() 也会出现这个问题。
-
文件名是 - './
/frame_1.jpg' 并且列表索引是根据这个符号。 -
我理解你所说的关于 chunksize 的内容——并且做了同样的事情。将尝试使用您添加的代码再次尝试。
-
谢谢..请告诉我。