一、检测 vs 分割:从"框"到"像素"
"检测用'框'框住目标,但框是矩形——人不是矩形,书架不是矩形。"老周说,"图像分割(Image Segmentation)做到像素级:给图中每个像素一个类别标签。"
检测 vs 分割:
检测:框(矩形)→ "这里有个人"
分割:每个像素 → "这个像素是人,这个像素是书架"
分割输出 = 一张"标签图"
每个像素的值 = 类别编号(0=背景, 1=书架, 2=人...)
云间书店应用:
区域热力图:把"书架区/走道区/收银区"分割出来
→ 统计哪个区域人多(客流热区)
抠图:把书从背景抠出来做商品图
货架管理:识别货架上的空位(商品检测+分割)
两种分割:
语义分割(Semantic):人/书架/地面,同类不区分个体
实例分割(Instance):每个人分开标(人1、人2、人3)
"分割是'像素级的理解'——比检测精细一个维度。检测管'哪有一块目标',分割管'每一粒像素属于谁'。"
二、U-Net:语义分割的"经典框架"
"语义分割最经典的网络:U-Net(医学影像出身,通用分割也好用)。"老周说:
U-Net 结构(为什么叫 U):
左边:编码器(Encoder)—— 卷积+池化,逐层"缩小"
作用:提取越来越抽象的特征(下采样)
右边:解码器(Decoder)—— 上采样,逐层"放大"
作用:把特征图恢复到原图大小(逐像素分类)
中间跳连(Skip Connection):把"细节"从左边接到右边
→ 补回池化丢失的细节(边缘、小物体)
┌───────────────────────────┐
│ 输入图 ─── 编码器 ── 解码器 ── 输出标签图 │
│ (缩小,提特征) (放大,分类) │
└───────────────────────────┘
跳连:细节从编码器直接传给解码器(保留边缘)
U-Net 特点:
数据少也能训练好(医学影像常用小数据)
输出和输入同尺寸(逐像素分类)
结构简洁,各种任务都能改
"U-Net 是分割界的'国民网络'——结构优雅(U 形+跳连),效果好,从医学影像到卫星图都能用。理解它=理解大多数分割网络。"
三、分割任务的数据标注:像素级"涂色"
"分割模型训练要什么数据?逐像素标注图——比检测框标注费劲得多。"老周说:
分割标注:
语义分割标注:每个像素标类别
原图 标签图(Mask)
┌──────┬──────┐ ┌──────┬──────┐
│ 人 │ 书架 │ │ 红色 │ 蓝色 │
├──────┼──────┤ ├──────┼──────┤
│ 地面 │ 书 │ │ 绿色 │ 黄色 │
└──────┴──────┘ └──────┴──────┘
实例分割标注:每个"个体"单独标(人1/人2/人3)
标注工具:
LabelMe、CVAT、Supervisely、EISeg(百度)
标注成本:
检测:框一下(几秒/对象)
分割:描边填色(几十秒/对象)→ 贵!
数据集格式:
COCO(有实例分割标注:polygon 轮廓)
VOC(语义分割:每个类一个掩膜文件)
Cityscapes(街景分割)
"分割是'标注最贵'的视觉任务——逐像素涂色很费人工。所以工程上优先用预训练/现成模型,自己标注只做小样本微调。"
四、Mask R-CNN:实例分割的代表
"实例分割(区分每个人)的代表:Mask R-CNN。"老周说:
Mask R-CNN(Faster R-CNN 的扩展):
在检测的基础上,多输出一个"像素掩膜(Mask)"
每个框内部,再分割出"目标的具体轮廓"
输出三样:
框(哪里有人)
类别(是人)
掩膜(人的精确轮廓像素)
Faster R-CNN 两阶段 + 一个 Mask 分支:
第一阶段:候选区域(ROI)
第二阶段:分类 + 精修框 + 生成掩膜
vs U-Net:
U-Net:整图语义分割(不区分个体)
Mask R-CNN:先检测个体,再给每个个体抠轮廓
云间书店场景:
语义分割(U-Net):分区热力图(书架区/走道区)
实例分割(Mask R-CNN):数每个人 + 精确轮廓
"语义分割'按类别分',实例分割'按个体分'——热力图用语义分割够了,'精确数人头+轮廓'要实例分割。"
五、分割评估:mIoU 指标
"分割模型好不好,用 mIoU(平均交并比) 评估。"老周说:
mIoU(Mean Intersection over Union):
对每个类别:
IoU = 预测区域 ∩ 真实区域 / 预测区域 ∪ 真实区域
(预测对了多少 / 预测+真实总共多少)
所有类别的 IoU 平均 = mIoU
例(书架类别):
真实书架 1000 像素,预测出 900 像素,
其中 800 像素和真实重叠:
IoU = 800 / (900 + 1000 - 800) = 800/1100 ≈ 0.73
mIoU = 各类 IoU 平均(0-1,越高越好)
像素准确率(Pixel Accuracy):
所有像素预测对的比率(简单,但类别不均衡时失真)
→ 分割评估:mIoU 是标准,PA 做参考
工程阈值:mIoU > 0.7 通常可用
"mIoU 是分割的'考试分数'——和检测的 mAP 一个地位。'交并比'这个思想贯穿检测和分割,必须熟练。"
六、用现成工具做分割:一行代码出结果
"工程上不用手写 U-Net,用现成模型最快。"老周演示:
# 方案一:Ultralytics YOLOv8-seg(实例分割)
from ultralytics import YOLO
model = YOLO("yolov8n-seg.pt") # 分割版预训练
results = model("store_shelf.jpg")
# 解析掩膜
for r in results:
if r.masks is not None:
for i, mask in enumerate(r.masks.data):
# mask = 每个目标的像素掩膜(H×W 的 0/1 图)
cls = r.boxes.cls[i].item()
name = model.names[int(cls)]
print(f"检测到: {name},掩膜大小: {mask.shape}")
# 方案二:HuggingFace Transformers 分割管线
from transformers import pipeline
seg = pipeline("image-segmentation", model="nvidia/segformer-b0-finetuned-ade-512-512")
result = seg("store_shelf.jpg")
# result = [{'label': '书架', 'mask': 掩膜}, {'label': '人', ...}]
# 应用:算每个区域的"面积占比"做热力图
total_pixels = img.shape[0] * img.shape[1]
for item in result:
area_ratio = item['mask'].sum() / total_pixels
print(f"{item['label']}: 占画面 {area_ratio:.1%}")
分割应用落地(云间书店):
摄像头画面 → 分割模型 → 各类别掩膜
→ 统计"书架区/走道区/收银区"的客流占比
→ 生成热力图(哪个区域最热闹,货架怎么摆)
"分割的工程套路:现成模型出掩膜 → 按业务算统计。 热力图、区域分析、抠图,都是这样做的。"
七、章末:老周的第九章总结
第八层:图像分割
├── 任务:逐像素分类(比检测精细一个维度)
├── 语义分割(按类别)/ 实例分割(按个体)
├── U-Net:编码器-解码器+跳连(国民分割网络)
├── 标注:逐像素涂色(贵!用现成模型减少标注)
├── Mask R-CNN:检测+像素掩膜(实例分割代表)
├── 评估:mIoU(交并比平均)
└── 工程:YOLOv8-seg / SegFormer 一行出掩膜
第十层(预告):人脸识别与 OCR —— 刷脸和认字
"小陈,分割上线了——王姐终于看到'哪个书架区最热'的热力图,把畅销书全挪过去了!"老周说,"剩下两个需求:会员刷脸(人脸识别)和快递单录入(OCR 文字识别)。下一章,我们把这两样一次讲完——它们分别是'认人'和'认字',是视觉最贴近日常的两个方向。"