
图像分割这个方向2024年给人最大的感受就是能落地的模型忽然多起来了。前几年提到图像分割大家脑子里还是FCN、U-Net这些老面孔一两个模型打天下。今年不一样从Meta的SAM 2到YOLO11-seg从统一分割框架到扩散模型分割从云端大模型到能跑在边缘设备上的轻量版本整个赛道几乎是一口气把“算法、架构、部署”三个维度同时往前推了一大步。这篇文章我想掰开揉碎聊一聊我自己在今年实际用过、看得见的五大革新图像分割模型。不是纯粹堆论文而是站在工程落地的角度把每个模型的架构创新点、适用场景、实际操作过程中的步骤和坑都过一遍。适合正在选型、做技术预研或者说已经在练手但没完全摸清楚门路的同学参考。1. 图像分割赛道现状与五大模型选型总览1.1 2024年图像分割到底卷在哪儿先花点时间把今年的技术主线捋清楚。图像分割这个任务本身不算新但2024年它的进化速度明显加快了而且方向很集中第一通用分割模型从“能分”走向“能跟踪”从静态图片走向视频流代表就是SAM 2第二实时检测分割一体化的模型继续白菜化YOLO系列背靠ultralytics生态把训练和部署门槛压到了历史最低第三学术界不再满足于单任务模型开始做一个模型同时搞定语义分割、实例分割、全景分割的统一框架第四扩散模型这种生成式思路渗透到分割领域带来了一种完全不同于传统判别式分割的新范式第五也是我作为工程人员最关心的轻量化分割模型终于能跑了MobileSAM、EfficientSAM这类项目让嵌入式设备也有了“分割一切”的能力。换句话说2024年不是某一个模型单点突破而是整条链路——从模型架构、训练范式到部署方案——都在改。这也提醒我们做技术选型的时候不能只看论文刷了多少分更要看它在你真实的硬件环境、数据分布、业务约束下能不能站得住。1.2 五大模型横向对比与应用场景映射我这次列出的五大模型不是按论文引用量排的而是按“实践价值”筛的SAM 2、YOLO11-seg、OneFormer、扩散分割代表模型、MobileSAM/EfficientSAM。它们在架构思路上差异非常大覆盖了从研究到生产的全部需求。模型方向核心架构突破典型优势典型劣势合适场景SAM 2可提示分割 流式记忆视频跟踪视频分割效果好、提示灵活显存开销大、推理偏慢视频交互标注、目标跟踪、医学影像YOLO11-seg单阶段检测器 anchor-free分割头速度快、部署成熟、生态好对开放词汇支持弱、边界质量中等工业质检、自动驾驶、实时监控OneFormer任务token Transformer统一框架一个模型产三种分割结果训练成本高、小目标易丢全景理解、多任务统一建模扩散分割生成式掩膜、与CLIP结合开放词汇、零样本潜力大推理慢、多轮采样不稳定学术研究、开放场景分割MobileSAM/EfficientSAM大模型蒸馏 轻量ViT可跑移动端/嵌入式、保留SAM基础能力精度有损失、复杂提示下降端侧交互、实时辅助标注这张表先给大家一个整体印象。下面我按模型逐个展开每个都从架构讲到实操。2. SAM 2从“分割一切”到“跟踪分割一切”2.1 SAM 2的架构创新记忆注意力与流式处理如果说2023年的SAM解决了“给个点或框把目标抠出来”的问题那么2024年SAM 2解决的问题就是“视频里这个目标一直在动你怎么连续地把它抠出来”。SAM 2的架构本质上是在原来的双塔结构图像编码器 提示编码器 掩膜解码器中间引入了一个记忆模块。关键改动有三点第一视频被当成一个流式序列处理每帧的预测结果会写进记忆库第二模型增加了记忆注意力层让当前帧的视觉特征能够和过去帧的预测结果做跨帧匹配这样即使目标和镜头之间有遮挡、模糊模型也能靠历史信息猜出目标大概在哪第三SAM 2的提示机制扩展到了时间维度你可以在任意一帧上点一下模型就会自动往前和往后传播这个提示完成整个视频片段的分割。这个架构创新的意义在于它把“分割”和“跟踪”两件事合并成了一个统一的流程。以前做视频目标分割常规做法是先用检测器或分割模型跑单帧再叠加一个跟踪算法流程复杂、错误会累积。SAM 2直接用分割模型本身解决时序一致性问题这是我今年觉得最“革新”的一点。2.2 实战在视频目标分割任务中引入SAM 2我的实际使用场景是给一批监控视频做目标抠图目标是提取固定区域内的移动物体。我用的方式是先把视频抽帧然后在关键帧上打点提示再交给SAM 2去传播。我基于官方仓库的推理脚本做了一点改造核心调用逻辑如下from sam2.build_sam import build_sam2_video_predictor import torch checkpoint ./checkpoints/sam2.pt model_cfg sam2_hiera.yaml predictor build_sam2_video_predictor(model_cfg, checkpoint, devicecuda) # 初始化视频目录按照约定视频需要先抽帧保存为jpg序列 predictor.init_state(video_path./frames) # 在第5帧点击目标中心 frame_idx 5 points np.array([[640, 420]], dtypenp.float32) labels np.array([1], dtypenp.int32) _, obj_ids, mask_logits predictor.add_new_points( frame_idxframe_idx, obj_id1, pointspoints, labelslabels, ) # 向后传播得到整段视频的分割掩膜 for out_frame_idx, out_obj_ids, out_mask_logits in predictor.propagate_in_video(start_frame_idxframe_idx): mask (out_mask_logits[0] 0.0).cpu().numpy() cv2.imwrite(f./results/mask_{out_frame_idx:04d}.png, mask.astype(np.uint8) * 255)这里有个容易被新手忽略的地方SAM 2对输入视频的尺寸非常敏感官方默认要求帧分辨率在1024附近太小的帧会显著影响掩膜边界质量。我一开始直接拿720p的帧喂进去结果小目标经常漏。后来统一缩放到长边1024再推理效果立刻稳定很多。另外如果视频里有镜头切换最好在切换位置重新给提示否则记忆信息会污染新场景的特征匹配。2.3 显卡资源与推理速度的取舍SAM 2大模型版本在单张1024分辨率图片上的显存开销大约在6到8GB视频传播时因为要存历史帧的特征和掩膜显存会更高。我实际测试在RTX 3090上1080p视频抽帧后跑60帧的传播推理平均每帧大约需要0.2到0.3秒做离线标注够用但要做实时视频分割肯定不现实。我的建议是如果你只是做单帧交互式抠图用2023年的原版SAM就行没必要上SAM 2但如果你要做视频级的像素级跟踪SAM 2是当前开源方案里最省心的一条路。官方提供了Hiera系列的不同大小实际工程一般用SAM 2.1_hiera_large或者sam2.1_hiera_base_plus既保证精度又控制显存。3. YOLO11-seg实时实例分割的工业落地首选3.1 从YOLOv8到YOLO11分割头的改进逻辑行业里很多人可能还在用YOLOv8-seg但ultralytics在今年更新到了YOLO11其中YOLO11-seg是最适合工业落地的实时实例分割模型。它最大的特点是延续了单阶段框架的简单性不搞两阶段也不依赖Transformer而是把分割任务直接挂在检测框架后面用一个额外的分割分支输出每个目标的二进制掩膜。YOLO11相比YOLOv8的几个关键改动包括主干网络里用了C3k2模块也就是在CSPNet基础上进一步优化了梯度路径让信息流动更顺畅SPPF部分继续保留但配合通道数调整让特征图尺寸控制更灵活检测头和解码头分得更细分割分支和分类回归分支彼此解耦这样训练时梯度干扰更小。从效果来看YOLO11-seg在COCO上的Mask mAP比YOLOv8-seg提升了两三个点而推理速度几乎持平甚至略快。我做工业项目时选择YOLO11-seg核心原因不是它精度最高而是它生态太成熟了ultralytics库把数据集配置、训练、导出ONNX、TensorRT部署全部打通了。相比自己去拼装SAM 2和跟踪器YOLO11-seg开箱即用。3.2 训练自定义数据集的完整流程以我最近做的一个包装缺陷检测项目为例目标是分割出包装袋上的破损区域。整套流程大概三步第一步准备数据集。YOLOv8/YOLO11分割需要的标注格式是每行一个目标多个多边形点坐标用归一化的xy坐标保存0 0.512 0.314 0.512 0.372 0.563 0.372 0.563 0.314 1 0.731 0.512 0.731 0.579 0.804 0.579 0.804 0.512我图省事直接用LabelMe标注多边形然后写了一个小脚本转成YOLO格式。这一步最容易被忽视的是“归一化”坐标必须除以图片宽高否则训练直接崩。另一个常见问题是标注太稀疏每个对象只标了十来个点模型学到的是粗糙多边形而不是精确边缘。我的经验是关键转角处多标点平滑曲线处可以少标保证边缘误差在2到3个像素以内。第二步配置数据文件并启动训练。# dataset.yaml train: ./datasets/packaging/train/images val: ./datasets/packaging/val/images names: 0: defectyolo segment train datadataset.yaml modelyolo11s-seg.pt epochs100 imgsz640 batch16 device0第三步验证效果并导出yolo segment val datadataset.yaml modelruns/segment/train/weights/best.pt yolo export modelruns/segment/train/weights/best.pt formatonnx dynamicTrue训练环节我踩过的坑主要是类别不平衡。包装袋破损通常是小概率事件负样本远多于正样本。这时候不要只调损失函数权重最简单有效的手段是“复制粘贴增强”——把缺陷区域通过随机缩放、旋转后叠加到正常样本上生成更多带标注的合成样本。实测在1350张原始图片的基础上通过这个方式扩到3600张mAP直接涨了4个多点。3.3 推理速度与精度的平衡艺术YOLO11-seg有三个常用体积档位n、s、m。工业场景我一般推荐从s起步在自定义数据集上s版本比n版本mAP高不少但速度在RTX 3060上依然能跑到80到120 FPS完全满足实时要求。如果部署到NVIDIA Jetson Orin这类边缘设备n或s版本配合TensorRT半精度量化也能达到30到50 FPS。需要特别提醒的是YOLOv11-seg的分割掩膜本质上还是以检测框为边界生成的也就是“mask是在框内预测”的。因此对大而扁的物体、或者目标之间互相重叠的场景掩膜精度会明显下降。这是单阶段实例分割的通病选型时要心里有数。4. OneFormer / 统一分割框架一个模型搞定语义、实例、全景4.1 为什么需要统一分割图像分割的三个子任务——语义分割、实例分割、全景分割——在传统方法里几乎都要维护独立的模型和训练流程。语义分割用FCN/U-Net那套实例分割用Mask R-CNN或YOLO-seg那套全景分割又要把语义和实例结果融合。工程上一个很痛的问题是三种标签体系不一致数据标注成本翻倍模型维护也麻烦。OneFormer这个框架2023年已经提出2024年在社区里被关注得更多核心卖点就是用同一个Transformer架构、同一套训练权重、同一份训练数据同时输出语义分割、实例分割和全景分割三种结果。它的架构核心是引入了“任务token”这个机制输入一张图再输入一个代表当前任务类型的tokensemantic/instance/panopticTransformer解码器会根据这个token的引导从相同的特征里解码出对应的任务结果。这有点像给模型一个“工作指令”让它知道自己这次要做哪一站。4.2 架构细节query、Transformer解码器与任务tokenOneFormer整体上走的是基于query的Transformer分割路线和Mask2Former血缘很近。区别在于Mask2Former的query是无差别的每个query都做所有任务而OneFormer的query是由任务token调制过的每一个query都绑定一个任务上下文。这个设计的好处是模型在训练时共享视觉编码器和大部分解码器参数只有任务token那一层的小部分参数在不同任务间变化所以训练阶段的收敛速度明显比分开训练三个模型更快。另一个值得提的细节是query数量。默认配置里OneFormer使用150个query而语义分割通常只需要几十个类别实例分割则需要更多query来覆盖所有实例。150这个数字是对三个任务的折中。实际用下来当一张图里的实例数量超过这个数时会漏掉一些极小的目标。所以如果你的场景里密集小目标特别多建议把query数量调到240甚至300但显存占用也会相应上升。4.3 实际使用效果与局限我在开放场景测试集上跑过OneFormer的官方预训练模型全景分割质量相当不错特别是对室内场景中的“东西”和“墙面、地板”这类stuff的划分非常干净。但它的问题也很明显一是训练成本高从零开始训练要4块甚至8块A100跑好几天一般小团队很难自己重训二是端侧推理太重Transformer解码器这一层在推理时计算量很大我在Jetson Orin上跑一次全景分割要超过200ms实时性不足。我的建议是OneFormer适合做离线的场景理解、数据自动标注这类任务不适合做线上实时分割。如果你的目标是统一标注体系、把多套模型合并成一套OneFormer是一个值得花时间做预研的方向但生产落地前需要做充分的蒸馏和量化压缩。5. 扩散模型做分割生成式分割的新范式5.1 扩散分割的基本原理扩散模型大家听得多的是文生图比如Stable Diffusion。2024年有一个趋势是把这套生成式思路搬到分割任务里来做法大致是训练一个模型从随机噪声逐步去噪最终“生成”出一个分割掩膜。换句话说传统分割模型是判别式地给每个像素分类扩散分割则是把分割当成一个从噪声中恢复掩膜的生成过程。这个思路听着反直觉但细想有它的道理生成过程天然适合建模复杂的结构性输出比如边界不规则、拓扑复杂的掩膜判别式模型很容易在边界处“画糊”扩散模型因为每一轮都在细化可以把边界磨得更清楚。同时扩散分割还可以和CLIP这类图文对齐模型结合实现开放词汇分割——你不需要预先定义类别只要给一句自然语言描述模型就能分割出对应目标。5.2 在开放词汇分割上的潜力开放词汇是扩散分割最吸引我的点。传统分割模型训练时定义了80类它就只会分这80类遇到新类别直接就懵。扩散分割可以借助预训练图文模型的语义空间把文本特征当成条件输入让模型分割出“没有训练过的类别”。实际操作上我试过一个基于扩散和CLIP结合的方案输入一张街景图提示文本写“red car”模型输出的掩膜可以较为准确地选中红色车辆即使训练数据里“red car”这个组合从未出现过。这对工程来说意义很大因为场景里类别是动态变化的时候你不需要重新收集数据、重新训练直接换文本提示就行。5.3 当前短板与应用边界不过我必须泼盆冷水扩散分割目前还远没到可以随便上线做生产的状态。第一推理速度太慢采样50步和采样5步之间精度差距极大而即使5步采样单张图也要一两秒和YOLO11-seg的毫秒级速度完全不在一个量级。第二结果不稳定同一个prompt跑两次掩膜可能在细节上有明显差异这对质检、医疗这类要求可复现性的场景是致命的。第三训练难度高想从零训练一个扩散分割模型对数据和算力的要求比传统模型高一个台阶。所以我把扩散分割定位为“研究和新场景探索工具”适合用来做数据预标注、快速试错、或者那些类别极端多样且难以枚举数据的场景。真要上生产还是得回到传统的判别式分割模型。6. 轻量化分割模型MobileSAM、EfficientSAM 与边缘部署6.1 大模型蒸馏的思路SAM系列精度是高但动辄几十GB的模型、十几GB的显存让很多嵌入式项目只能干瞪眼。2024年一个重要分支就是把SAM这类大模型“蒸馏成小模型”代表就是MobileSAM和EfficientSAM。MobileSAM的思路非常直接SAM的大头在图像编码器也就是一个巨大的ViT-HMobileSAM用一个轻量的小ViT替换掉它然后利用原版SAM的预测结果作教师信号只蒸馏图像编码器的输出特征。解码器部分保持原样不动。这样做出来的模型参数量大概是原来的几十分之一而交互提示后的分割效果在常规场景下和原版差距并不大。EfficientSAM走的是另外一条路利用掩膜对齐的跨注意力蒸馏让小模型的中间层特征尽可能接近大模型同时在注意力模块里做结构剪枝。两种方案各有优劣我的实测感受是MobileSAM部署更简单、社区资料更多EfficientSAM在某些细粒度边界上略好一点。6.2 端侧部署实测我在一块RK3588开发板上分别跑过MobileSAM和EfficientSAM的ONNX导出版本图片分辨率512x512CPU上单次推理时间在1.2到2秒之间加上NPU加速后能压到300到500毫秒。虽然不是实时但在交互式标注工具里已经足够流畅——用户点一下一两秒后出掩膜体验是可以接受的。部署步骤大致是这样# 1. 导出ONNX python scripts/export_onnx_model.py --model-type mobile_sam --checkpoint ./weights/mobile_sam.pt --output ./onnx/mobile_sam.onnx # 2. 用onnxruntime推理 import onnxruntime as ort sess ort.InferenceSession(./onnx/mobile_sam.onnx, providers[CPUExecutionProvider]) # 输入包括image、point_coords、point_labels等张量 outputs sess.run(None, {image: image_input, point_coords: pt_input, point_labels: label_input})这一步最容易出问题的是onnx导出的动态轴配置。SAM系列模型里image的尺寸是固定的但point数量是变化的导出时必须把point_coords和point_labels的维度标为动态否则运行时只要点的数量变了就报错。6.3 从模型压缩到硬件适配的经验做轻量化分割部署我有几条实际心得。第一蒸馏后的小模型对提示噪声更敏感原来在大模型上点偏几个像素没关系小模型可能就分割错误所以前端的点击提示要做好坐标偏移校验。第二量化的精度损失在分割任务上比检测任务更明显尤其是掩膜边缘建议优先采用INT8量化而不是二值化或4bit量化。第三如果目标非常小比如医学影像里的病灶点轻量化模型漏检率会显著上升这种情况下不要迷信蒸馏还是保留一个云端大模型做难例处理。7. 模型评估、调参与避坑实录7.1 分割任务的指标mIoU、mAP、F1 怎么选很多新手上来就看mIoU但不同任务侧重点完全不一样。语义分割任务的核心指标是mIoU因为它逐像素统计分类结果能反映整张图的理解程度实例分割任务核心指标是mask mAP它和检测任务的AP类似先算IoU匹配再对预测实例打分排序全景分割则更复杂需要同时计算PQPQ同时考虑到识别质量和分割质量。工程上我最常用的组合是mIoU做模型训练收敛判断mAP做实例级性能对比F1配合业务阈值做最终是否上线的决策。比如质检场景缺陷必须高召回那就要在低置信度阈值下看F1而不是只看最高点的mAP。7.2 常见训练问题与排查方案训练分割模型经常遇到的四类问题我做成一个速查表现象可能原因排查方法Loss降不下去学习率过大、数据标注有错误标签降低学习率一个数量级错标比例超过5%时先清洗数据掩膜边缘呈锯齿状标注多边形点数太少、下采样倍数过大增加标注精细度输出分辨率从640提到1024小目标全漏掉输入分辨率太低、anchor/Autoassign问题提升输入分辨率对小目标区域做裁剪训练训练震荡不收敛batch size太小或没做warmupbatch至少8前10个epoch做线性warmup我还要提醒一个不常被提到的点分割标签和检测框那种矩形标注不同它是密集像素级标签对标注一致性要求极高。同一个目标两个标注员画的多边形边缘差3个像素模型学出来的边界就是模糊的。有条件的话在训练前做一次标签清洗把形状诡异的标注查一遍再训。7.3 工程化经验标注、数据增强、锚点设置数据增强这块分割任务用颜色抖动和随机尺度变换收益很高但不要盲目用旋转。如果业务场景里物体都是直立摆放的模型不需要学旋转不变性转了反而增加学习难度。锚点设置方面YOLO系列是自动锚点但建议还是对训练集跑一下自动锚点计算尤其当目标形状分布和目标宽高比与你预期的差距很大时自动锚点能显著减少前期的无效训练。另外一个细节分割头的loss权重不要默认走我习惯把box loss降低、把mask loss权重抬高因为分割项目最终评价的是掩膜质量而不是框的贴合度。8. 如何根据业务场景选出正确模型很多同学问得最多的一句话是“我到底该用哪个模型”其实这个问题没有标准答案但可以根据几条硬约束快速缩小范围。先把硬约束列出来第一实时性要求响应延迟要毫秒级那就别考虑扩散模型和OneFormer直接从YOLO11-seg里选第二硬件条件只有CPU或者嵌入式板子优先MobileSAM、EfficientSAM或者YOLO11n-seg云端有GPU就放开用SAM 2和YOLO11m-seg第三类别是否固定如果类别固定、场景封闭传统判别式模型足够如果类别开放、需求随时变考虑扩散分割做研究同时用SAM 2做交互式辅助标注第四视频还是单帧视频场景直接看SAM 2单帧场景看YOLO11-seg或OneFormer。再补充一个我自己的选型经验不要为了新模型而新模型。今年SAM 2出来后很多团队第一时间就想着把原有点击分割服务切过去但对单帧交互点击这个业务来说原版SAM和MobileSAM已经能满足90%的需求切到SAM 2不仅推理更慢还要重新做服务适配。新模型的收益如果覆盖不了迁移成本就不要动。技术选型不是追新是找最吻合约束条件的解。最后分享一个小技巧不管最后选哪个模型都建议在项目里同时保留一个“大模型离线处理 小模型实时兜底”的双通道。倒不是说小模型一定差而是它在边界细节、遮挡、小目标上确实会有短板这时把特别难的帧异步送到大模型里重新处理既保证了整体速度又守住了精度底线。这是我跑了多个落地项目之后觉得ROI最高的一笔架构投入。