如何在外部代码中调用多进程细胞检测函数并获取返回值
多进程细胞检测跨文件调用解决方案
问题说明
为解决deepcell处理大图像效率低的问题,将大图像切割为小图块后用多进程检测,需要在独立文件中调用检测函数并获取返回值,但原代码结构无法实现跨文件调用。
修改后的code1
需调整以下核心点:
- 避免全局初始化模型和图像,防止多进程重复加载引发冲突
- 修正多进程参数传递逻辑(
Pool.map仅支持单参数,多参数需用starmap) - 暴露检测函数,确保跨文件可调用
import numpy as np import cv2 as cv from multiprocessing import Pool from deepcell.mesmer import Mesmer def deepcell_detection(image0, mpp): # 每个进程单独初始化Mesmer,规避多进程共享实例的冲突 app = Mesmer() image = np.stack((image0, image0), axis=-1) image = np.expand_dims(image, 0) labeled_image, coords = app.predict(image, image_mpp=mpp) return coords def pool_cell_detection(img_channel): r, c = img_channel.shape[0:2] mpp = 2 rstep = r // 10 cstep = c // 10 patches = [] for i in range(10): for j in range(10): img_patch = img_channel[i*rstep:(i+1)*rstep, j*cstep:(j+1)*cstep] # 将多参数打包为元组,适配starmap的参数传递规则 patches.append((img_patch, mpp)) with Pool(4) as p: # 用starmap处理多参数函数调用 allPoints = p.starmap(deepcell_detection, patches) return allPoints # 保留main函数用于单独测试 def main(): blevel_image = cv.imread("./images/blevel_eq_p.png", 0) allPoints = pool_cell_detection(blevel_image) print(f"检测到的细胞坐标组数:{len(allPoints)}") if __name__ == '__main__': main()
code2的实现
在code2中直接导入code1的检测函数,传入目标图像即可获取返回值:
import cv2 as cv import code1 def func_something(): # 加载需要处理的大图像 blevel_image = cv.imread("./images/blevel_eq_p.png", 0) # 调用检测函数并接收结果 allPoints = code1.pool_cell_detection(blevel_image) # 后续可对allPoints进行分析或存储 print(f"获取到的细胞坐标组数:{len(allPoints)}") if __name__ == '__main__': func_something()
关键说明
- 多进程参数传递:原代码用
map传递列表参数会触发参数不匹配错误,starmap支持直接传递元组形式的多参数,适配deepcell_detection的参数需求。 - 模型初始化:将
Mesmer实例化放到检测函数内部,让每个进程单独创建模型实例,避免多进程共享同一实例导致的资源冲突。 - 函数可访问性:
pool_cell_detection未被if __name__ == '__main__'包裹,因此能被其他文件导入并调用。
内容的提问来源于stack exchange,提问作者Maryam Sadeghi
相关产品推荐
相关产品推荐

