Kaggle CZII语义分割与物体检测Top方案总结!


Kaggle CZII语义分割与物体检测Top方案总结!

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

↑↑↑关注后\“星标\“kaggle竞赛宝典
kaggle竞赛宝典
作者:FakeOrange,文章摘自Zlab实验室
KaggleCZII语义分割与物体检测Top方案总结!
00
前言
01
数据准备与探索
数据归一化
使用类似NormalizeIntensityd(MONAI)或PyTorch中的z-score归一化方式,为扫描数据带来一致性。
如果不同样本的强度分布差异很大,可考虑实例级或全局的min-max归一化。
分割半径/热力图生成
多个方案都对每种粒子类型(如apo-ferritin,beta-galactosidase,ribosome等)采用不同的自定义半径(或高斯sigma)。
GaussianFunction对于Mask的处理(实现代码在最后,仅供参考,未经实测)
使用高斯函数来创建掩码(或称热图)是一种将粒子位置信息以平滑、连续的方式表达的方法,而不是简单地将某个像素点标记为1,其余全部为0。
高斯函数在粒子中心处取值最高(例如1. 0),随着距离增加,值逐渐降低。平滑数据能为模型提供更多的梯度信息,更精确地学习到粒子的中心位置。
真实图像中的粒子中心可能由于噪声或成像问题而存在不确定性。使用高斯“斑点”可以反映这种不确定性,使得模型在训练过程中不必严格拘泥于一个精确的点,而是可以在一定范围内进行判断。
平滑的高斯分布能够提供连续的误差信号,这使得模型在反向传播时得到的梯度更加平滑,有助于稳定训练过程,加速收敛。
在某些模型中(如tattaka的模型),会根据粒子的实际大小采用不同的sigma值。较大的粒子使用较大的sigma值,生成的高斯分布更宽;较小的粒子则使用较小的sigma值,生成的分布更窄。
如果使用热力图方法,可以为小粒子使用较小半径,为大粒子使用稍大半径,以平衡精确定位与多粒子重叠的矛盾。
据第四名方案中提到,在Disscussion贴中标定的中心点计算有偏差。
半径缩放:
位置偏移:
数据增强
旋转与翻转:
沿Z轴随机±90°旋转,并做小角度(±10°)的X/Y轴旋转。
沿X、Y、Z轴随机翻转。
强度扰动(intensityshifts):
对体数据加少量高斯噪声或亮度平移,帮助模型泛化。
裁剪/采样策略:
使用RandCropByLabelClassesd或类似的方法平衡正负样本(包含或不包含粒子的区域)。
(可选)粘贴/Mixup:
若数据量稀少,可尝试从其他体数据中复制小块含粒子区域并粘贴到当前样本空白区。但需通过交叉验证来验证增益。
02
模型结构
Backbone(主干)
使用2. 5DUNet,在2D骨干网络(如ResNet101、ConvNeXt、EfficientNetB3等)基础上:
通过平均池化或最小步幅卷积在深度维度聚合信息,减少显存使用。
在保留2D特征提取能力的同时,保证一定的3D语义上下文(如在每个stage后适度进行3D卷积或pooling)。
Decoder&Upsampling
借鉴第4名方案中“pixelshuffle”(depth_to_space)的上采样方法,从stride=4或stride=2的featuremap生成最终输出。
使用InstanceNorm3d+PReLU(或LeakyReLU)来替代3DBatchNorm,有助于收敛稳定。
注意,LeakyReLU会造成更多的参数选择问题。
检测头(Head)可选方案
纯热力图(分割方式):输出3D热力图(C通道),再通过局部极大值搜索中心点坐标。
无锚点(Anchor-Free)偏移回归:除了输出分类热力图,还预测每个像素到粒子中心的偏移量,可提升精度,尤其适合坐标回归。
03
损失函数
根据最后的输出类型(纯热力图或热力图+偏移),可选择不同损失:
热力图分割类损失
TverskyLoss+CrossEntropy:能很好处理前景/背景不平衡,效果稳定。
MSE/Varifocal:如果纯热力图回归(第4名方案的做法),也可以用MSE进行简单直接的监督,但注意平衡正负样本。
无锚点检测类损失
CenterNet-StyleFocal或Varifocal用于分类热力图。
SmoothL1/IoU-basedLoss用于偏移回归。
点与点之间的距离IoU(如exp⁡(−∥Δx∥^2/(2r^2))可模拟边框IoU的概念。
无锚点检测完整代码来自第一名方案。
04
训练策略
交叉验证
建议采用5折(或6+1)CV,根据体数据数量做最优切分。
为每折保存多个最佳权重(如Fβ\betaβ排名前35个checkpoint)以进行后续集成。
Patch(块)级训练
常用patch大小为[64–128,128–256,128–256],具体视显存决定。
验证/推理时可采用与训练相同或更大尺寸(如[128,256,256]),以获取更完整上下文。
学习率&优化器
多数方案使用AdamW+小基准LR(如1e-3或5e-4)。
LR调度可用Cosine或简单“Step”策略。
若训练不稳定,可调β1,β2(如β1=0. 7,β2=0. 9996)或开启梯度裁剪。
模型选择
每轮计算在验证集上的Fβ或自定义检测指标。
若分数长期无提升,可早停(patience=20
30)。
EMA或SWA
在训练后期,对模型权重应用EMA(指数滑动平均)或SWA(随机权重平均),常能带来小幅但稳定的提升。
滑窗推理(Sliding-Window)
使用与训练类似的窗口尺寸或更大(如[192,256,256])。
设置合理的重叠(50%),避免边缘效应。
重叠区域使用加权平均融合,每块中心的权值较高,边缘较低。
第一名的物体检测方案中,推理采用stride=2或stride=4的FeatureMap,能显著降低推理时间(或显存)。
当stride从1调整到2,性能仅下降约0. 002,但推理速度可提升约50%。
若使用stride=2/4,后处理要注意坐标缩放。
采用PixelShuffle的上采样中stride=4,也有助于推理加速。
多GPU&加速
如果竞赛环境允许,可在2张T4上并行推理,加速一倍。
使用TensorRT(或ONNX/OpenVINO)进行推理,可以获得2×
3×的加速。
06
后处理:粒子中心点
根据是否是纯热力图或热力图+偏移的方法,后处理略有不同:
局部极大值&阈值过滤
先用3D最大池化(如3×3×3或7×7×7kernel)找到局部极大值。
针对不同粒子类型,设置不同置信度阈值(或统一阈值),过滤低分检测。
偏移修正(若使用无锚点检测Head)
获取offset分支输出,为每个峰值做坐标细化。
将voxel索引映射回原图坐标系,如果训练时中心做了+0. 5/+1. 0像素偏移,请在推理时反向修正。
修正前vs修正后:
NMS/分裂合并
贪心式3DNMS:同类粒子点若相距很近(或点IoU大),可合并或剔除置信度较低者。
连通域(如cc3d,connected-components)或自定义算法(如第10名方案的KL-based颗粒分裂),识别并拆分重叠较大的区域。
坐标缩放
预测坐标最后要乘以体素-物理单位比例(如10. 0/voxel),变换到真实单位坐标。
07
集成策略
关于集成:一般都会选择集成,并且在本次方案之中有多模型集成,但从实际公布的效果上来看,单模的性能也是很不错的。所以对于显卡紧张的朋友可以专注于CV单模。(仅个人推荐)
模型多样性
训练多个不同骨干(ResNet101、ConvNeXt、SegResNet、DynUNet等)。
变化超参(patchsize、batchsize、stride等),保证模型多样性。
甚至可混合纯分割模型与点检测模型,可能获得更高收益。
融合方式
分割/热力图模型:可在输出热力图或logits级直接加权平均,再做一次后处理。
点检测模型:可对最终点集进行后期融合(如多组检测结果合并,再用NMS去重)。
平均融合效果常见且易操作,也可根据验证Fβ对不同模型做加权。
效率平衡
越多模型推理越慢。需在分数提升与12小时推理限制之间取得平衡,留意速度瓶颈。
08
时间与显存优化
降低输出步幅(Stride)
像第一名的物体检测方案提到,通过将最后层stride从1调到2,可极大提升推理效率,性能损失很小。尝试stride=2或4,若Fβ下降可接受,则可显著减少推理时间。
TensorRT/ONNX
将PyTorch模型先导出为ONNX,再转成TensorRT。
核查推理正确性后测量实际加速效果。
并行化
充分利用竞赛环境的多GPU(如T4×2)并行处理不同体或不同slidingwindow。
智能切片
减少过多切片带来的重叠计算。
适度增大补丁尺寸可降低拼接次数,但需留意显存。
09
总结
多种骨干网络性能也很近似:
实际效果的重点推测应处于数据处理方面,比如高斯平滑,定位点的抵消以及对于热力图输出的后处理。(未实测,仅推测。)
在分割后使用CC3D的定位方案中,综合来看最通用且效果较好的是Weighted-Cross-EntropyLoss。
10
代码
3D物体高斯MASK处理:

Pytorch内置PixelShuffle使用:


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录