018、图像分割:语义分割与实例分割模型

张开发
2026/5/19 4:12:57 15 分钟阅读
018、图像分割:语义分割与实例分割模型
昨天深夜调一个分割模型输入尺寸改到512x512后mIoU直接从0.78掉到0.62。盯着输出张量看了半小时才发现原来是卷积层padding没跟着调整特征图尺寸对不上最后上采样时边缘信息全乱了。这种细节问题在分割任务里太常见了今天就来聊聊语义分割和实例分割那些实战中的门道。语义分割的核心像素级分类语义分割的本质是给每个像素打标签。FCN全卷积网络把全连接层换成卷积层让网络能接受任意尺寸输入这是现代分割模型的起点。但FCN的输出比较粗糙边缘细节丢失严重。后来U-Net加了跳跃连接把浅层特征和深层特征拼接起来。注意这里有个坑拼接前要确保通道数对齐。我见过有人直接concat结果训练时loss震荡得厉害。# 典型的跳跃连接实现defforward(self,x):# 编码器部分enc1self.enc1(x)# 浅层特征细节多enc2self.enc2(enc1)# 中间层enc3self.enc3(enc2)# 深层特征语义强# 解码器部分dec3self.dec3(enc3)# 关键在这里先调整enc2的通道数再拼接enc2_adjustedself.conv_adjust(enc2)# 不加这个会出问题dec2_inputtorch.cat([dec3,enc2_adjusted],dim1)dec2self.dec2(dec2_input)# 继续上采样...returnfinal_outputDeepLab系列用了空洞卷积扩大感受野但计算量要注意。V3版本那个ASPP模块空洞空间金字塔池化效果确实好不过部署到边缘设备时得考虑内存占用。实例分割既要分割也要区分Mask R-CNN在Faster R-CNN基础上加了个mask分支这个设计很巧妙。但训练时有个细节ROI Align比ROI Pooling效果好因为避免了两次量化误差。实际部署时如果硬件不支持双线性插值得自己实现个轻量版本。YOLACT这类单阶段模型速度快但小目标分割质量一般。它的原型生成和mask系数预测是并行的训练时要注意两个分支的loss平衡。我试过调整权重系数发现mask_loss_weight设到1.5时效果比较均衡。实战调试经验输入归一化要用训练集的均值和标准差这个很多人会忽略。有一次我用ImageNet的统计量归一化医学图像结果模型根本不收敛。数据增强方面随机裁剪和颜色抖动对分割任务很有效但要注意裁剪不能把目标物体切没了。我一般会先统计标注框尺寸设定合适的裁剪范围。损失函数的选择交叉熵最常用但对于类别不平衡的数据Dice Loss或Focal Loss更好用。不过Dice Loss训练初期可能不稳定可以先用交叉熵训几轮再切换。# 混合损失函数的写法classHybridLoss(nn.Module):def__init__(self,alpha0.5):super().__init__()self.alphaalpha self.cenn.CrossEntropyLoss(ignore_index255)self.diceDiceLoss()defforward(self,pred,target):# 前期主要靠CE后期Dice贡献增大ce_lossself.ce(pred,target)dice_lossself.dice(pred,target)# 这里可以加个动态权重我一般epoch10后让alpha从0.5慢慢升到0.7total_loss(1-self.alpha)*ce_lossself.alpha*dice_lossreturntotal_loss部署时的注意事项ONNX导出时要注意opset版本有些自定义操作如可变形卷积需要特定版本支持。TensorRT加速时如果模型有动态尺寸输入记得显式指定优化profile。内存优化方面尝试过把float32换成float16推理速度能提升30%左右但某些边缘设备上精度损失明显。建议先做量化感知训练再导出INT8模型。个人建议别盲目追求新模型。很多场景下好好调参的U-Net比没调好的最新SOTA更管用。工业项目里稳定性和推理速度往往比那1-2个点的精度提升更重要。多看看中间特征图。用TensorBoard或简单的可视化脚本观察不同层的输出能帮你快速定位问题在哪一层。特别是跳跃连接前后特征对齐没有一目了然。保持数据一致性。训练、验证、测试集的数据预处理必须完全一致我吃过亏验证时用了不同的resize方法指标虚高上线后效果差一截。最后分割任务很吃数据。没有足够标注数据时试试半监督方法或者用预训练模型做迁移学习。但要注意领域差异用Cityscapes预训练的模型直接去分割卫星图像效果肯定打折扣。分割模型调试是个细致活从数据管道到损失函数每个环节都可能藏坑。多写测试用例验证数据流养成可视化中间结果的习惯这些时间不会白花。

更多文章