gpt4 book ai didi

python - 在python中异步读取和处理图像

转载 作者:太空狗 更新时间:2023-10-29 17:40:54 27 4
gpt4 key购买 nike

上下文

我经常发现自己处于以下情况:

  • 我有一个需要处理的图像文件名列表
  • 我使用例如 scipy.misc.imread 按顺序读取每个图像
  • 然后我对每张图片进行某种处理并返回结果
  • 我将结果连同图像文件名保存到 Shelf 中

问题在于,仅仅读取图像所花费的时间不可忽略,有时与图像处理相当甚至更长。

问题

所以我在想,理想情况下我可以在处理图像 n 的同时读取图像 n + 1。或者以自动确定的最佳方式更好地一次处理和读取多张图像?

我读过有关多处理、线程、twisted、gevent 等的内容,但我不知道该使用哪一个以及如何实现这个想法。有没有人能解决此类问题?

最小示例

# generate a list of images
scipy.misc.imsave("lena.png", scipy.misc.lena())
files = ['lena.png'] * 100

# a simple image processing task
def process_image(im, threshold=128):
label, n = scipy.ndimage.label(im > threshold)
return n

# my current main loop
for f in files:
im = scipy.misc.imread(f)
print process_image(im)

最佳答案

Philip's answer很好,但只会创建几个进程(一个读取,一个计算),这几乎不会最大化现代 >2 核心系统。这是使用 multiprocessing.Pool 的替代方法(具体来说,它的 map 方法)创建了同时执行读取和计算方面的进程,但应该更好地利用您可用的所有内核(假设文件多于内核)。

#!/usr/bin/env python

import multiprocessing
import scipy
import scipy.misc
import scipy.ndimage

class Processor:
def __init__(self,threshold):
self._threshold=threshold

def __call__(self,filename):
im = scipy.misc.imread(filename)
label,n = scipy.ndimage.label(im > self._threshold)
return n

def main():
scipy.misc.imsave("lena.png", scipy.misc.lena())
files = ['lena.png'] * 100

proc=Processor(128)
pool=multiprocessing.Pool()
results=pool.map(proc,files)

print results

if __name__ == "__main__":
main()

如果我将图像数量增加到 500,并为 Pool 使用 processes=N 参数,那么我会得到

Processes   Runtime
1 6.2s
2 3.2s
4 1.8s
8 1.5s

在我的四核超线程 i7 上。

如果您进入更现实的用例(即实际不同的图像),您的进程可能会花费更多时间等待图像数据从存储加载(在我的测试中,它们几乎是瞬间从缓存磁盘加载)然后明确创建比核心更多的进程以获得更多的计算和负载重叠可能是值得的。不过,只有您自己在实际负载和硬件上进行的可扩展性测试才能告诉您什么才是最适合您的。

关于python - 在python中异步读取和处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12474182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com