目录

端侧实例分割实战:YOLO26-seg 与 MobileSAM 部署到 iPhone

从检测框到像素级轮廓

目标检测输出的是矩形框,实例分割输出的则是物体轮廓的像素级掩码。同一个画面,检测告诉你这里有个人,分割告诉你这个人具体占哪些像素。多出的这层信息,直接解锁三类端侧应用:

  • 抠图与编辑:按 mask 抠出主体,替换背景、加滤镜
  • AR 与交互:把虚拟物体精确叠在真实物体表面,或做手势识别
  • 质检与辅助:工业缺陷面积测量、医学影像病灶标注、儿童教育里把绘本里的动物圈出来

上一篇文章讲了 YOLOv8 检测模型的 Core ML 部署,这篇把分割链路走通:选型对比、模型导出、Swift 集成、mask 后处理。

端侧分割方案怎么选(截至 2026-08-24 验证)

方案 参数量 特点 适合场景
YOLO26-seg(n 规格) 2.7M 实例分割,可训练任意业务类别,端到端无 NMS 类别明确的自动分割(人、车、缺陷、动物)
MobileSAM 9.66M 点或框提示引导的通用分割,不支持训练新类别 交互式抠图、辅助标注
SAM 2.1(hiera-tiny) 38.9M 图像与视频分割,精度最强 服务器或桌面端,移动端需蒸馏量化

选型口诀:业务类别明确(比如只分割鸟类、只分割缺陷)用 YOLO26-seg,能自己训练且模型最小;交互式任意物体抠图用 MobileSAM;视频分割或追求极致精度用 SAM 2.1,再考虑蒸馏成小模型。

YOLO26-seg:2.7M 参数的分割主力

YOLO26 是 Ultralytics 2026 年 1 月发布的最新模型系列(官方文档 docs.ultralytics.com/models/yolo26),默认端到端推理(无 NMS),实例分割相对 YOLO11 的 box AP 提升最多 2.5、mask AP 提升最多 3.7。官方数据(截至 2026-08-24):

模型 参数量 mAPbox mAPmask CPU ONNX T4 TensorRT
yolo26n-seg 2.7M 39.6 33.9 53.3ms 2.1ms
yolo26s-seg 10.4M 47.3 40.0 118.4ms 3.3ms
yolo26m-seg 23.6M 52.5 44.1 328.2ms 6.7ms

n 规格只有 2.7M 参数、9.1 GFLOPs,是 iPhone 上可实时运行的最小分割模型。

导出 Core ML:一行命令

1
2
3
4
5
6
7
8
from ultralytics import YOLO

# 官方预训练权重会自动下载
model = YOLO("yolo26n-seg.pt")

# 导出 Core ML,imgsz 640 是官方移动端标准输入尺寸
# quantize=8 表示 INT8 权重量化,官方 App 同款配置
model.export(format="coreml", imgsz=640, quantize=8)

产物是 yolo26n-seg.mlpackage。两个官方文档强调的坑:

  1. 分割任务导出 Core ML 时强制 nms=False(嵌入式 NMS 只支持检测任务),拿到的是无 NMS 的原始模型,mask 解码逻辑要自己在 App 里写
  2. quantize 可选 16(FP16)、8(INT8)、w8a16(INT8 权重加 FP16 激活);要在 Xcode 里做模型预览的话用 FP16 更稳

想跳过全部集成工作,Ultralytics 官方 iOS SDK(github.com/ultralytics/yolo-ios-app)支持所有任务开箱即用,包括相机实时推理。

Swift 集成:解码 mask

Core ML 模型输出的是低分辨率 prototype mask 加每个实例的 mask 系数,需要一次矩阵乘法把 mask 还原到原图尺寸:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import CoreML
import Vision

// 1. 加载 mlpackage
let model = try VNCoreMLModel(for: YOLO26nSeg().model)

// 2. 每个实例:mask 系数 (1, 32) x prototype mask (32, 160, 160)
//    得到 (160, 160) 的原始 mask,再双线性插值到 640x640
let mask = matmul(coeffs: instance.coeffs, prototypes: protoMasks)
let upsampled = bilinearResize(mask, to: CGSize(width: 640, height: 640))

// 3. 阈值化后按原图比例缩放,叠加到画面
let binary = upsampled.map { $0 > 0.5 ? 1.0 : 0.0 }

完整实现参考官方 yolo-ios-app 里的 YOLO 与 YOLOProcessor 类,mask 解码和叠加逻辑都是现成的。

MobileSAM 路线:交互式抠图

MobileSAM(github.com/ChaoningZhang/MobileSAM,Apache-2.0)用 5M 的 TinyViT 替换 SAM 的 611M ViT-H 编码器,整管线 9.66M 参数,官方数据单 GPU 12ms 一张图(编码器 8ms 加 mask 解码器 4ms),Mac i5 CPU 上约 3 秒。它保留 SAM 的提示机制:点一下、画个框,就分割出对应物体。

1
2
3
4
5
6
7
pip install git+https://github.com/ChaoningZhang/MobileSAM.git

# 导出 ONNX(官方测试版本 onnx 1.12.0 / onnxruntime 1.13.1)
python scripts/export_onnx_model.py \
  --checkpoint ./weights/mobile_sam.pt \
  --model-type vit_t \
  --output ./mobile_sam.onnx

拿到 ONNX 后用 coremltools 转成 mlpackage,Swift 侧用 MLModel 加载,把用户点击的坐标编码成 prompt 张量输入即可。

开源方案汇总

项目 一句话说明
ultralytics/ultralytics YOLO26-seg 的训练、验证、导出一体(活跃维护)
ChaoningZhang/MobileSAM 轻量级提示式分割,9.66M 参数(维护节奏慢但可用)
facebookresearch/sam2 图像与视频分割 SOTA(活跃维护,移动端偏重)
ultralytics/yolo-ios-app 官方 iOS SDK,Core ML 开箱即用(活跃维护)
ultralytics/yolo-flutter-app 官方 Flutter 插件,跨平台端侧推理(活跃维护)

小结

分割等于检测加一层 mask 解码,原型 mask 还原是端侧集成的关键成本。业务类别明确优先 YOLO26-seg(2.7M 参数可实时),交互式场景用 MobileSAM,追求视频级精度再考虑 SAM 2.1 蒸馏。以上模型与性能数据均截至 2026-08-24 官方文档验证。