资讯动态

图像分割的深度卷积神经网络演进:从FCN到U-Net与DeepLab

发布时间:2026/10/17 5:48:39 来源:尧图企业网站定制
图像分割这些年几乎成了深度学习入门绕不开的一道门槛不管是自动驾驶里的车道线还是医学影像里的病灶区域底层核心技术都指向同一个方向基于深度卷积神经网络的逐像素预测。最近我花时间重读了一份以“Evolution of Image Segmentation using Deep Convolutional Neural Network: A Survey”为主题的综述资料标题直译过来就是“基于深度卷积神经网络的图像分割演进一项综述”这篇文章把分割技术从传统方法到深度模型的进化路径梳理得相当完整。这篇博文我不打算逐段复述综述原文而是结合我自己在分割任务上的复现和踩坑经历把你们最关心的技术脉络、关键转折点、训练细节和常见问题拆开说。不管你是在做遥感、医疗、自动驾驶还是刚入坑分割想找方向这篇内容应该都能帮你省掉不少瞎折腾的时间。1. 标题翻译与领域地图这个主题到底在聊什么1.1 标题逐词翻译与拆解先把标题本身讲透。Evolution of Image Segmentation using Deep Convolutional Neural Network: A Survey这个英文标题拆开看是这么几层意思Evolution演进、进化史强调的是“变化过程”不是某一种具体的技术参数或者某一篇论文的局部改进Image Segmentation图像分割任务目标是把图像划分成有语义的区域输出的不是框而是像素级的类别标签using Deep Convolutional Neural Network使用深度卷积神经网络限定了技术工具说明这条演进主线是围绕卷积神经网络展开的A Survey综述说明这是一篇梳理文献、总结经验规律的文章而不是提出新方法的论文。合起来的直译是“基于深度卷积神经网络的图像分割演进一项综述”。注意“using”在这里表示“采用/基于”不要理解成“正在使用”的进行时。如果只看标题很容易忽略一个重点为什么是Evolution而不是Comparison或者State-of-the-Art这说明文章关心的不是“哪个模型在哪个数据集上拿了第一名”而是这些模型为什么一个接一个地出现每个阶段要解决什么问题。理解了这个逻辑读任何综述都会轻松很多。1.2 三个关键词透露出的三条关键线索Image Segmentation是目标它比分类和检测更细粒度。分类告诉图片里有什么检测告诉物体在哪里分割直接回答“每一个像素属于哪个类别”。这就把问题从“图像级”拉到“像素级”输出也是一整张与输入图像等大的概率图。正因为输出粒度细分割任务对空间信息的敏感度比分类高一个数量级。Deep Convolutional Neural Network是手段。卷积神经网络天生适合图像这种强结构化数据原因一句话参数共享和局部连接让网络在像素量大的输入上也能学。但早期CNN主要用于图像分类分割要等到“全卷积化”才真正起飞这是后文的重头戏。Survey是定位。一篇综述的价值不是复述论文而是把分散在几年时间里、几十篇论文里的技术碎片串成一条线。看完你会知道FCN为什么重要、U-Net为什么在医学图像里火、DeepLab系列到底改了哪几刀。所以这篇博文也遵循同样的叙述逻辑先讲旧问题再讲新解法最后落到工程实践上。2. 深度卷积网络之前传统分割方法卡在哪里2.1 传统方法工具箱与核心逻辑大家都先说深度学习但如果不清楚传统方法很难理解DCNN带来的进步有多大。我在早期项目里试过传统方法比如阈值分割、区域生长、边缘检测、分水岭算法还有后来常用的图割Graph Cut和条件随机场CRF。这些方法背后是一个共同逻辑手工设计规则和能量函数。阈值分割假设灰度有明显分界把像素按灰度值硬切成几类图割把分割看成最小化一个能量项用图上的最小割来求解标签CRF则建模像素之间的空间关系通过平滑项让相邻像素更倾向于取相同类别。参数少、解释性强、算得快是它们的优点。缺点同样致命规则是写死的遇到光照变化、遮挡、纹理复杂的情况就失效。有个项目里我要从前视图中分割车道线传统方法在晴天还行一到阴影区域就出问题。这是必然的因为手工特征无法覆盖真实世界里的组合爆炸。你不可能预先写清所有场景的灰度分布规律只能靠数据把特征“学”出来。2.2 从“打补丁”到“端到端”的转折点深度卷积网络最早介入分割时也不是直接做整图预测而是“打补丁”式做法把每个像素周围的一块小窗口送进CNN让网络对窗口中心像素做分类。这种思路在本质上就是把分割转换成了密集分类但缺点很明显相邻像素的窗口大量重叠计算完全重复感受野受限于窗口大小小窗口看不到全局结构边缘像素和物体中心的上下文差异很大。真正转折点是全卷积网络的出现。它把分类网络里的全连接层全部换成卷积层输入任意尺寸图像直接输出逐像素的分类结果。表面上只是“去全连接”一个小改动实际改变了整个训练范式损失可以直接在空间维度上计算网络可以端到端训练不需要再为每个像素抠窗口。这也是综述类文章必然把FCN当成深度学习分割起点的原因之前的CNN分割方案都只能算“前传”。理解了传统方法的核心逻辑再看看深度模型做了什么你会发现其实并没有玄学传统方法是人写规则深度模型是让网络从数据里学规则。后半程的演进则围绕“怎么学得更细、看得更大”展开。3. 深度卷积分割网络的核心演进路线3.1 全卷积网络端到端分割的起点FCNFully Convolutional Network并不是一个复杂的新训练技巧而是把卷积网络的内部结构彻底重排。它的做法是先通过卷积和池化把空间分辨率逐步降低再从低分辨率特征图上用转置卷积或双线性插值上采样回原尺寸。但仅仅上采样是不够的。低分辨率特征图虽然含“语义”却丢失了“细节”。如果只在最后一层上采样输出mask边界往往糊成一片。FCN的经典处理是把不同阶段的特征图逐层融合浅层特征保留边缘位置深层特征保留类别语义两者相加再上采样。这个取舍本身说的就是分割任务的核心矛盾语义和细节互斥。每次池化都在扩大感受野但也在抹平细节。做分割时网络既要回答“这是什么”又要回答“这在哪儿”这两个目标天然冲突。理解这一点再看后面的编码器—解码器结构就顺理成章了。3.2 编码器—解码器U-Net与U型结构的崛起U-Net是医学图像分割里最常用的结构名字来自它的形状左边是编码器逐级下采样右边是解码器逐级上采样中间用跳跃连接把同尺度的编码器特征直接接到解码器上。这样的设计逻辑直接针对FCN的细节丢失问题池化让高层特征有语义但要还原子像素位置信息时与其让解码器从头学不如把浅层的边缘信息直接拿过来。跳跃连接的本质是给解码器“抄答案”让网络不用把精力浪费在重建高频细节上而把主要算力留给语义判断。我在医学分割和遥感分割里都用过U-Net类结构感受是训练曲线比纯FCN稳定不少小样本下的泛化也更好。SegNet走了另一条路线编码器在池化时记住最大值的位置上采样时把数值放回原位置。好处是内存开销低坏处是记住位置但没保留强度信息本质上更“粗放”。我在实际对比里发现U-Net类的跳连对大多数任务效果更稳健。所以后来很多模型都带上了类U型骨架的影子这不算巧合是因为它刚好命中分割任务最本质的需求。3.3 上下文与多尺度DeepLab系列与金字塔池化FCN和U-Net解决的是“细节去哪了”下一个问题是“更大的上下文怎么来”。一个小目标被切碎后仅靠局部感受野根本分不清它是什么一大片连续区域如果没有全局上下文模型很容易把相邻的相似类别混在一起。DeepLab系列在这里起到关键作用。标志性操作是空洞卷积在不增加参数量的前提下通过给卷积核插入空洞来扩大感受野相当于用同样的卷积核覆盖更大区域。这样在分辨率不进一步下降的情况下特征图上的每个点都能感知到更大范围的图像。后面又加入ASPP模块同时用多个不同空洞率的卷积核去并行扫描拿到多尺度特征。PSPNet则用金字塔池化模块把特征图分成不同网格尺寸做全局平均池化再把不同粒度的上下文信息拼回去。两位选手目标一致让最终预测不只依赖局部外观还能“看到”整张图的结构。这类模块现在几乎成了分割模型标配很多新模型的创新点就是在多尺度融合的方式上做文章。3.4 从语义到实例Mask R-CNN带来的能力重构前面聊的都是语义分割只回答“这个像素属于哪个类别”但同一类别里的不同物体比如两个相邻的人会被归成一块。实例分割要更进一步把每个独立物体单独抠出来这需要物体级别的边界和像素级别的mask同时存在。Mask R-CNN的做法是在目标检测框架上并行加一个mask分支先用区域提议找出候选框对每个候选框做RoIAlign再在固定尺寸特征上预测一个掩码。RoIAlign本身是当时训练不稳定问题的关键修复点它用双线性插值解决候选区域与特征图对齐不准的问题比之前的RoIPool要精细很多。工程上这类两阶段结构跑得比较重但精度上限高。如果项目里同时需要检测和分割不用重复造轮子直接在统一框架上训练往往更省事。我现在做工业质检时缺陷既要框出来又要给像素级边界就经常在这条路线上找人少走弯路。3.5 全景分割与基于Transformer的新趋势全景分割把语义分割和实例分割统一起来要求对“thing”类别做实例区分对“stuff”类别做语义分类。这是任务定义的进一步扩展模型要同时输出像素类别和物体编号。以前是“两个任务两个模型”现在变成一个模型同时预测全景图好处是类别间的冲突可以在内部统一消解。再往后DCNN内部开始融入注意力机制和Transformer结构很多新模型已经把自注意力当作基础模块但survey标题限定在DCNN所以这部分更多是“后续演进方向”。我实际用过基于Transformer的分割模型它的长距离建模能力确实比纯卷积强但数据量小的时候反而不如设计良好的卷积模型稳定这也是很多工程项目的现实经验。技术演进方向可以性感落到业务里还得看数据量。4. 数据、损失函数与评估指标刷分背后的三根支柱4.1 经典公开数据集怎么选模型结构只是分割效果的一半另一半在数据和训练细节里。常见的公开分割数据集按用途可以分几档通用物体识别类、场景解析类、街景驾驶类。通用物体识别类的图像来自真实场景类别多背景杂适合验证模型泛化能力场景解析类标注更细图像带很强的室内外结构适合做复杂的语义分割街景驾驶类采集自车载摄像头包含大量道路目标适合自动驾驶方向的预实验。选数据集的关键不是越大越好而是要匹配任务分布。我做遥感分割时一开始用通用预训练模型调效果一般后来换成更贴近遥感目标的预训练策略mIoU涨了十来个点。这个经验就是数据集选择要从最终场景倒推。你最终要处理的是无人机俯视图就不要总在自然街景上磨去爬公开的俯视图数据打底更实际。4.2 损失函数搭配方案分割最常用的损失是像素级交叉熵但它在类别不平衡时很吃亏。比如遥感图里道路只占5%背景占95%交叉熵会让网络把重心全压到背景上因为把每个背景像素猜对的收益太高了。我在实践中常用的组合有几种加权交叉熵给稀有类别更高的权重简单但需要手动调权重Dice Loss直接优化区域重叠度对小目标相对友好Focal Loss降低易分样本的损失值把注意力引导到难分样本上。这几种每个都不是万能的能不能生效要结合具体的数据分布来试。经验是损失函数没有银弹。医学图像我常用Dice和交叉熵的加权组合遥感分割我用混合损失单纯换损失不调权重也不会有奇效。最好把损失权重视为与学习率同级的重要超参数每次实验都要记录这样后面想回溯时不会手忙脚乱。4.3 评估指标的数学含义与坑分割论文里最常见指标是mIoU和Pixel Accuracy。mIoU对每个类别分别计算预测与真实交并比再平均类别不平均的测试集上更容易看出真实能力。Pixel Accuracy是所有正确像素占总像素的比例看似直观却在背景占比极高时严重失真。很多新人在城市街景数据上看到Pixel Accuracy刷到95%以上就以为解决问题了其实那个目标类别可能一只都没预测出来。Dice系数在医学图像里更常见计算逻辑是2倍交集除以两个区域面积之和比IoU更接近“重叠率”直觉对类别不平衡更敏感。这里有个容易踩的坑不同实现的评估脚本会把空类别从指标里剔除。我在对比模型时遇到过mIoU涨了十个点但实际mask更差的情况最后发现是某个评估脚本把没人预测的类别整类跳过了。所以如果要刷分先统一评估脚本再去调网络顺序不能反。5. 工程实战中的常见问题与排查记录5.1 类别不平衡不是所有像素都值得同等待遇类别不平衡是分割里最普遍也最磨人的问题。典型症状是模型预测结果几乎全是背景稀有目标永远“漏检”。这个问题不是模型能力不够而是损失函数被大类别绑架了。第一个排查点不是调损失函数而是先看数据统计。统计每个类别像素占比如果某个类只占1%交叉熵几乎不可能学好。然后做三件事一是数据层面多做目标区域的裁剪和过采样二是损失层面改加权交叉熵或Dice三是输出层面在推理时调整类别阈值。我排过的一个真实案例一段路面mask里车道线占比不到2%把训练切成patch并把包含车道线的patch权重提高到背景patch的4倍后mIoU提升非常明显。小改动但比换模型见效快。这个思路其实和综述里的演进逻辑一致在网络结构之前先解决“学习信号被淹没”的问题。5.2 边缘不干净如何把边界从“马赛克”救回来模型输出mask边缘要么毛躁要么像缩了一圈这是上采样信息丢失的典型表现。首先要确认输出头是否包含了多尺度特征融合很多现代模型会在解码器里把不同层特征拼起来如果只用最后一层卷积输出边缘就会差。其次检查是否有后处理早期DeepLab常用全连接CRF在推理阶段做微调现在很多模型不再需要但对某些数据集仍然有额外收益。手工经验里最常见也最容易被忽视的是数据标注质量。边缘像素的错误标注会直接误导损失函数我建议在标注时统一“边界准则”比如规定目标边界画在亮度梯度的中点。还可以尝试加一个边缘损失分支让网络把边界当成独立监督信号来学。这个分支不需要很重一个轻量的边缘预测头就够了。5.3 显存不足与训练过慢算力约束下的妥协方案分割是显存杀手输入原图往往几千乘几千直接全图训练在消费级显卡上基本爆显存。我常用的突破点有patch训练把大图切成固定大小的patch训练时随机采样包含目标的patch推理时滑窗再拼回结果减少batch size配合梯度累积混合精度训练在保留精度的情况下能减少约一半显存速度和显存都受益。注意梯度累积会增加训练时间并且学习率一般要适当调小。滑窗推理时相邻patch的边界预测容易出现拼接缝重叠区域设置20到50个像素再做均值融合效果会好很多。这套组合在多个项目里都挺稳尤其是遥感大图和病理全切片图离开patch方案几乎没法训练。5.4 标注数据不够弱监督与伪标签的现实玩法公开数据集很丰富但工业场景里拿到的往往只有几百张图人工标注又贵又慢。这条路在综述里通常被放在讨论部分但工程上却是最常遇到的需求。弱监督方向是我看过最有性价比的路线用检测框替代像素级mask让模型在粗标注下学一个大概的区域响应再把响应图变成种子给区域生长或类激活图方法。虽然精度不如全监督但能快速产出初版模型后面再逐步人工修正。另一种做法是自训练或半监督先用少量标注样本训练一个老师模型给大量未标注数据生成伪标签再用伪标签混合真实标签去训练学生模型。关键是过滤低置信度区域否则伪标签噪声会被放大。我踩过这个坑第一次做时把置信度阈值设得太低结果学生模型学到了老师模型的所有幻觉后来又加了一个基于不确定性过滤的组件才恢复正常。真实经验是伪标签的过滤规则比模型结构更重要。6. 从综述走向复现给新人的入门实操建议6.1 第一个模型建议从U型结构开始如果第一次接触分割我建议不要直接上最新花活。先从U-Net或带ASPP的编码器—解码器开始这类模型结构相对透明训练曲线稳定出了问题好排查。同时它们对算力要求低适合在个人电脑上先跑通流程。实现时建议优先用现成开源实现而不是自己从零写网络。不是说不该理解原理而是初始阶段先把模型、数据、训练、评估这条链路跑通之后再逐步替换成自己的优化。我第一次手写解码器时细节错误频出用现成baseline调试几天后很快就知道真正的问题在哪里。对比实验时也要保留好每次改动的记录否则到最后一排查全是改坏了的版本。6.2 工程框架与预训练权重选型主流深度学习框架都支持分割训练我更推荐用带完善生态的框架尤其是已经有分割模型库和预训练权重的。选型标准有三条社区活跃度、预训练权重覆盖度、与部署流程的兼容性。别只看模型多炫先看它能不能方便地导出到你需要的推理环境这一步决定上线成本。预训练权重非常重要。分割模型通常先用图像识别任务预训练骨干网络再在分割数据上微调。这样比从头训练收敛快效果也明显更好。下载权重时注意来源是否可信跑基准实验时记录骨干和数据集版本否则后面对比实验会一地鸡毛。框架版本不一致导致同一模型跑出两个结果的事我遇到不止一次。6.3 最小复现流程从数据到mIoU数值最后给一个可以直接抄作业的最小流程假设你已经有一份按类别的标注mask数据准备统一图像尺寸建议长边resize到512或1024把数据集划分成训练/验证/测试比例大致70/15/15。定义配置记录骨干网络、输入尺寸、batch size、学习率、优化器、损失函数权重。开始训练先跑10个epoch观察loss是否下降如果不动优先降低学习率或换损失函数。验证评估每轮用验证集计算mIoU/Dice保留表现最好的权重不要只看最后一次。推理输出对测试集做滑窗推理和后处理统一用同一份评估脚本计算指标。这条流程我重复了很多项目问题大多出在第1步和第4步数据读取顺序不一致、评估脚本被人改过。把“数据链路确定性”控制好后面所有实验才有可比性。我个人的体会是综述里的技术演进都是拿时间换出来的真正到工程里先把一个模型跑通、跑稳再去追热点效果反而更好。这套从标题到复现的拆解希望能帮你把图像分割这条进化路线看明白同时在真刀真枪的项目里少踩几个坑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑