DSB2017冠军源码解析

三维卷积网络设计与医学影像处理

Posted by XI Changzun on 2017-07-18

前言

因为实验室的需要,最近研究了DSB2017的几个优胜方案。一月份就知道这个奖金丰厚的比赛,没想到半年后自己也会和它扯上关系。就个人感受来说,医学影像的处理已经成为深度学习领域的热潮。这也让我不得不佩服导师的大局观,在深度学习刚刚兴起时,他就朝着与医学结合的方向走,早早站住了脚。人生啊···果然需要一点深谋远虑的智慧。

肺癌检测任务分析

深度学习与医学结合,免不了要和大量的的3D图像接触:CT,超声,MRI。这次比赛的肺癌图像,在分辨率和信噪比方面,质量都很高,这为参赛人员省去了很多预处理的工作。以第一名为例,预处理阶段也仅仅是对图像的体素值进行了映射和归一化。

肺癌图像处理的主要难点在于图像的大小。由于是3d图像,即使模型本身并不大,整张图在训练过程产生的中间结果依然会超出显存(12G)。排名最高的几个方法都对原始图像进行了缩放和裁剪。第一名的算法,从每个样本中裁剪出大小为128*128*128的方块组成训练样本,其中70%为正样本,包含至少一个目标节点;30%为负样本,从样本中随意抽取,其中一些不包含节点。

模型分析

作者开源的代码可读性比较高,无奈自己比较懒,愣是拖了这么久才看完。模型的定义主要分布在layer.py net_detector.py net_classifer.py中。net_classifer.py是整个模型的定义文件,包含了net_detector中定义的区域提出网络。layer.py定义了一些可复用的组建,比如:残差块,hard_mining,提取区域函数等。这是作者提模型的detector部分。 Nodule_net

整个模型类似于FasterRCNN,同时借鉴了U-net的思想。模型主要由18层的残差CNN组成,第一个方块对应程序中的preBlock,包含2个简单的3d卷积层,紧接着4个Block是4个残差Block,每个block分别包含[2,2,3,3]个卷积层。这四个Block相当于U-net中用于特征提取的前半部分。对应的后半部分由两个残差Block构成,分别接受前面Block的输出和对应的前向Block的输出。值得注意的是,在最后一个Block的输入中,还加入了坐标信息,加入坐标信息的作用还不太清楚。测试阶段,coord似乎只是计算出特征图每个点相对于输入中心点的偏移程度,每个点的值在-0.5到0.5之间。最后一个Block的输出作为提取到的特征,传递给分类网络做概率预测。分类网络抽取每个输出特征图的中心值作为分类特征。最后一个Block的输出为每个预测节点输出5个值,第一个用于分类,后面四个为x,y,z,r对应的回归量。

模型训练

分类的损失函数是二分类交叉熵。检测的损失主为SmoothL1,作者还在其中加入了missLoss用于惩罚严重被低估的训练目标,不过该loss的有效性还不得而知。训练时,检测网络加入了实时硬例挖掘,同时交替训练分类和检测网络来减少过拟合。

参考资料

总结

冠军的算法充分地了深度学习现有的一些成果,还有许多训练,设计技巧,读完收获还是很大的。写下这篇博客做个笔记,也算是对近期工作的总结吧。