使用多重处理有效地切片和读取图像

时间:2019-03-11 06:49:00

标签: python multiprocessing python-multiprocessing ray

我的卫星图像很大,想对它进行物体检测模型推断。目前,我将大图像切成薄片,保存切片,然后读取它们,以使模型输出检测结果(框和蒙版)。我知道这是一种低效的处理方式,因为一旦读取了图像切片/切片,就不再需要它了,但是我目前将其保存到磁盘中。

是否有更有效的方法来执行此过程?也许通过多重处理或射线库?

1 个答案:

答案 0 :(得分:0)

如您所述,Ray非常适合使用共享内存,并且能够在一台或多台计算机上运行相同的代码。

类似下面的结构可能会起作用。

import numpy as np
import ray

ray.init()

@ray.remote
def do_object_detection(image, index):
    image_slice = image[index]
    # Do object detection.
    return 1

# Store the object in shared memory.
image = np.ones((1000, 1000))
image_id = ray.put(image)

# Process the slices in parallel. You probably want to use 2D slices instead
# of 1D slices.
result_ids = [do_object_detection.remote(image_id, i) for i in range(1000)]
results = ray.get(result_ids)

请注意,执行do_object_detection任务的工作程序不会创建自己的映像副本。相反,他们将有权访问驻留在共享内存中的映像副本。

如果图像已经在单独的文件中,则另一种方法是执行以下操作。

import numpy as np
import ray

ray.init()

@ray.remote
def do_object_detection(filename):
    # Load the file and process it.
    return 1

filenames = ['file1.png', 'file2.png', 'file3.png']

# Process all of the images.
result_ids = [do_object_detection.remote(filename) for filename in filenames]
results = ray.get(result_ids)