ps前段时间一直在将肺结节检测和3Dcnn降阳性模型封装到一起.输入一个检查输出检测结果插入数据库.同时编写接口供前端和中间件调用.可检测结果的去假阳性这步还是不太令人满意.故再用3Dunet 降假阳性模型联合3Dcnn降阳性模型一起去假阳性.
由于想获取32*32*32的块(分辨率1*1*1mm),故需要重采样.但是luna16中给的candidates_V2.csv有70多万个候选结节.而经过测试光是统一重采样这步要花费2s多.算了下光截取结节就要16天以上的时间.所幸其实一共的序列才888个.所以先将读取,重采样,归一化等处理了保存为npy,同时还要保存对应的Origin.npy.
在这里就有大量的列表操作.想到了DSB2017的代码中就有利用下面这两个函数来多进程操作列表计算.
from multiprocessing import Pool
from functools import partial
下面看看实际情况下到底能加快多少(88个序列).
不用多进程花费时间:238.038193s
多进程花费时间:48.443767s
将近5倍的时间,感觉很不错.下面采70多万个用上去能省不少时间呢.
下面介绍一下Pool多进程的关键步骤以防自己忘记.
1.pool = Pool()#开启进程池
2.partial_getsave = partial(getsave, filenames=filenames, path=path, # 函数修饰器,将一些参数预先设定,后面调用更简洁 save_path=save_path)
这里getsave是多进程函数.filenames是列表
3._=pool.map(partial_getsave,range(len(filenames)))
这步是多进程调用函数
4.pool.close() # 关闭进程池,不再接受新的进程 pool.join() # 主进程阻塞等待子进程的退出
没什么好多的退出多进程
5.关键是getsave函数的定义 def getsave(id,filenames,path,save_path):
主要是多了个id来对照range(len(filenames)).