人脑核磁共振海马体分割竞赛总结

前言

最终结果是进决赛拿了二等奖
话说一等奖分数比我低很多诶,凭啥他一等= =
这个比赛其实从头水到尾,都没干啥事…
不过还是挑一些重点的有价值的东西讲讲
很多比赛总结其实一直好像是一个比较流水线的报告
从预处理到最后的集成
即便trick百出,仍似千篇一律

但我仍然喜欢有人能相对于trick提出更多的问题

下面只讲一下个人感觉有价值的东西
就不千篇一律的从数据预处理数据增强的一步步介绍了

比赛介绍

这个比赛是一个3D医学图像分割问题
目标是对大脑中的左右海马体进行分割

数据特点

132组样本
3D图像,4D张量,5D一个batchsize
十分吃显存
卷积核数稍微大一点就给你爆0.1T显存

训练不稳定
模型对海马体的差异十分敏感,不同的海马体dice loss差距对比有0.85 , 0.42

验证集阈值浮动
由于模型对海马体差异十分敏感
所以所以验证集分数经常会从几十跳成0

海马体强度不均
一些海马体体素强度在0至200的范围,部分在0至两千的范围

问题的解决方式

吃显存是真的没法子了
只能减通道数
毕竟换tesla P40是不可能的,这辈子都不可能换的
写插值压小图片又不想写,只能随随便便改改卷积核数才适合我

训练不稳定和验证集阈值浮动提供几个很棒的解决方案

  1. 改batchsize
    将batchsize设置为8问题就被缓解很多了,简单粗暴,但要牺牲一些通道数
  2. 将sigmoid激活改成tanh + score map MinMax归一化 + diceLoss
    这个方式超级显著,可以说完全解决了这个问题,小batchsize大概要几千轮的样子才能让loss和验证集稳定
    这个配合8 batchsize在仅仅600轮即可收敛到88的分数
    score map MinMax归一化是利用了图片中必定存在海马体的先验信息,即必定存在正例体素
  3. 一堆后处理trick(基于梯度,类间方差,类内方差,knn+先验等
    在这里我创了很多方法,这个方法有点慢,效果是有的,不如2+1
  4. ConvLSTM
    将3D图片的一个轴作为循环轴,利用循环单元拟合,这种结构契合了海马体的形态变化
    这个结构分数真的很稳,鲁棒性棒棒哒
  5. 在像素级的任务中尽量少用Pool,因为像素级的不对齐任务似乎还是有点影响的

summary

其他的事不想说了,毕竟水过来的,很不认真hh
一些数据增强,预处理都不想说了
我的几个模型结构也懒得聊,看多了只觉得模型结构要么是拍脑袋拿到的,要么是暴力搜素
毕竟缺乏理论性,马后炮式的分析结构是很抗拒的