6.1 实习经历

239 阅读5分钟

离职原因

上一份实习让我对医疗诊断这个行业充满浓厚的兴趣,我个人坚信医疗人工智能在未来可以重构整个病理行业,所以这也是我坚定不移地想要在这份事业上发展下去,以及寻找更广阔的平台来提升自己。那么通过我个人的了解,贵公司非常符合我的期待,所以今天也是带着诚意来了解您的团队。

1. 介绍实习

岗位:医疗人工智能算法岗

个人职责

该公司致力于医疗病理领域AI智能软件研发,面向的是医院的影像诊断业务。我个人参与项目“一种基于目标检测和Unet分割的乳腺癌肿瘤细胞诊断系统”,主要从事肿瘤细胞目标检测模型的优化,以YOLOv5模型作为基线模型,通过改进模型结构提升mAP50 6个百分点;通过对模型进行剪枝操作,降低了模型32%的参数量,并在推理速度上提升了2倍。

检测过程

step 1 标注:我们从客户端拿到SVS格式的数据(大约是5万×5万的像素),有医学经验的老师会使用QPath软件对 svs 图片上的目标标注边界框,并对每个边界框标注类别;

step 2 切片和训练:对 svs 数据进行切片,划分为若干个1000×1000像素的png图片,并将每张图片中的标注信息(x,y,w,h,cls)导出为对应的txt文件;将这些图片和对应的 txt 标注文件划分训练集和测试集在 yolov5 模型上进行训练和预测。

step 3 推理:将 svs 数据在训练好的模型上进行全片推理。最终,在同一张svs上,将yolov5推理出来的txt文件与Unet分割出来的癌区进行合并,得到癌区的细胞检测情况。

项目意义

  • 高效性:传统的手动检测需要耗费大量时间和人力,而 AI 系统可以短时间内处理大量的影像数据,提高医院的运营效率。
  • 准确性:AI诊断系统相比人工诊断,更加客观,避免了人为因素导致的错误。
  • 早发现和早治疗:提高了早期乳腺癌的检出率,有助于早期治疗和干预。

2. YOLOv5模型结构

YOLOv5结构

YOLOv5损失函数

YOLOv5训练、验证过程

改进点

  1. 不需要太大的检测头(指检测最大目标的检测头):

(1)根据我们细胞的尺寸,我们在最大检测头得到框的大小是远超过一般的细胞大小的;另一方面经过NMS后最大检测头检测出的目标数量非常少,因此我们考虑去掉最大的检测头。

(2)为了提高小目标的检测精度,更加细致提取图像特征,我们对卷积核的步距进行了缩放,最终检测头的输出feature map扩大了2倍,同时我们重新调整了Anchor尺寸,使我们的检测头更加适用于小目标检测。

  1. 不需要太深的网络:

考虑参数量是冗余的,我们采取适用于YOLO模型的结构化剪枝算法,叫做依赖图算法。这个算法的核心思想是对每层的 filter 依赖性分组,并通过L2范数进行重要性度量,并根据组的重要性排序,将不重要的组移除。

我们使用了32%的剪枝率,参数量由11M缩减到3.4M,同时速度提升了2倍,但是精度几乎是没有下降。

  1. 适当提高网络的宽度:

通过更宽的结构,网络能学到更加细致的纹理特征,这个对于学习细胞之间的边界非常重要。我们考虑了几种方案:调整网络宽度的参数、给模块添加跳跃连接的结构、增加注意力机制模块。

3. 训练策略

调试参数的策略

conf_thres

在NMS之前会用置信度阈值过滤掉置信度较低的检测框。因此当出现误判的情况,可以尝试把置信度阈值调高。

优化器使用AdamW

Adam:结合动量梯度下降和RMSProp算法,既能适应稀疏梯度,又能缓解梯度震荡的问题。

  1. 适应收敛梯度:梯度通常是稀疏的,即反向传播时大部分参数的梯度为0,这样会导致参数更新缓慢。由于Adam引入了动量项,因此在参数更新时考虑历史梯度的方向,这样就避免受到稀疏梯度的影响。
  2. 缓解梯度震荡:由于损失函数的复杂性,梯度可能出现大幅度的波动和震荡,这种振荡会影响参数更新。Adam引入自适应学习率的机制,当梯度过大,学习率就减小,梯度过小,学习率就增大。在一定程度上缓解了梯度震荡。

AdamW:是Adam的一种变种,不仅具备Adam适应收敛梯度和缓解梯度震荡的优点,而且引入了权重衰减项,起到防止出现过大权重、防止过拟合的情况,进一步提高模型的泛化能力。

max_det

检测框的最大数量。统计数据集每张图片Ground Truth的数量,将最大的数量设置为检测框的最大数量。

NMS

背景:将测试集进行预测时,batchsize=1精度是正常的,batchsize=32时精度很低。最后找到的原因是NMS的代码中,设置了:NMS处理一个batch的图片,超时则跳出循环,不再将一个batch中剩下的图片进行NMS处理。

def non_max_supression():
    for 1张image的预测向量 in 1个batch images的预测向量:
        ...
        if (time.time()-t)>time_limit:
            LOGGER.warning(f'WAENING NMS time limit {time_limit:.3f}s exceeded')
            break

解决方案:

要么将超时代码注释,要么设置batch_size 设置更小。