图像分割基础 - 理解区域划分原理与应用
什么是图像分割 - 在像素级别理解图像
图像分割将图像中的每个像素分配到特定类别或区域,实现像素级别的图像理解。它是计算机视觉中最精细的识别任务。
分割类型:
- 语义分割: 每个像素分配一个类别标签 (如天空、道路、建筑)。不区分同类别的不同实例
- 实例分割: 不仅分类,还区分同类别的不同个体 (如区分不同的行人)
- 全景分割: 语义分割 + 实例分割的统一。所有像素都有类别,可数物体还有实例 ID
与其他任务的关系:
- 图像分类: 整张图像一个标签
- 目标检测: 边界框级别定位
- 图像分割: 像素级别定位 (最精细)
应用场景: 自动驾驶 (道路/行人/车辆分割)、医学影像 (器官/病灶分割)、卫星遥感 (土地覆盖分类)、视频会议 (人物/背景分离)、图像编辑 (精确选区)。
经典方法 - 阈值法与边缘检测分割
在深度学习之前,图像分割主要依赖手工设计的算法,基于像素值、梯度或区域特征进行分割。
阈值分割:
- 全局阈值: 选择一个阈值 T,像素值 > T 为前景,否则为背景
- Otsu 方法: 自动计算最优阈值,最大化类间方差。OpenCV:
cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) - 自适应阈值: 每个像素根据局部邻域计算阈值。适合光照不均的场景
边缘检测 + 轮廓:
- Canny 边缘检测找到物体边界
- 轮廓查找 (
cv2.findContours) 提取封闭区域 - 适合形状规则、对比度高的物体
分水岭算法: 将图像视为地形,从标记点"注水",水域相遇处形成分割边界。适合分离接触的物体 (如细胞)。需要手动或自动提供标记点。
局限性: 经典方法对复杂场景 (多类别、遮挡、纹理变化) 效果差,无法学习语义信息。
深度学习方法 - 从 FCN 到 U-Net 和 DeepLab
深度学习彻底改变了图像分割,通过端到端学习实现了前所未有的精度。
FCN (2015): 首个端到端的分割网络。将分类网络的全连接层替换为卷积层,输出与输入同尺寸的分割图。开创了深度学习分割的先河。
U-Net (2015):
- 编码器-解码器结构,对称的 U 形架构
- 跳跃连接将编码器特征传递给解码器,保留空间细节
- 在医学图像分割中表现卓越,少量数据即可训练
- 变体: U-Net++, Attention U-Net, nnU-Net
DeepLab 系列:
- 空洞卷积 (Atrous Convolution): 扩大感受野而不降低分辨率
- ASPP (Atrous Spatial Pyramid Pooling): 多尺度特征提取
- DeepLabV3+: 编码器-解码器 + ASPP,当前最强通用分割架构之一
- COCO 全景分割 mIoU > 60%
SAM (Segment Anything Model) - 通用分割的革命
Meta 于 2023 年发布的 SAM 是图像分割领域的里程碑,实现了零样本通用分割能力。
核心创新:
- 提示式分割: 通过点击、框选或文本提示指定要分割的对象
- 零样本泛化: 无需针对特定类别训练,可分割任意物体
- 大规模预训练: 在 SA-1B 数据集 (11M 图像, 1.1B 掩码) 上训练
架构:
- 图像编码器: ViT-H (Vision Transformer),提取图像特征
- 提示编码器: 编码点、框、文本等提示信息
- 掩码解码器: 轻量级解码器,快速生成分割掩码
SAM 2 (2024): 扩展到视频分割,支持时间维度的物体跟踪和分割。实时交互式视频分割成为可能。
应用: 交互式图像编辑、自动标注工具、医学图像辅助分割、遥感图像分析。SAM 大幅降低了分割任务的门槛。
评估指标 - 理解 IoU、mIoU 和 Dice 系数
分割质量的定量评估需要标准化的指标,用于比较不同方法和监控模型性能。
IoU (Intersection over Union):
IoU = 预测 ∩ 真值 / 预测 ∪ 真值
- 值域 [0, 1],1 表示完美分割
- 对每个类别分别计算
- mIoU: 所有类别 IoU 的平均值,是最常用的分割指标
Dice 系数:
Dice = 2 × |预测 ∩ 真值| / (|预测| + |真值|)
- 与 IoU 高度相关但数值更高 (Dice ≈ 2×IoU / (1+IoU))
- 医学图像分割中更常用
- 对小目标更敏感
像素精度: 正确分类的像素比例。简单但对类别不平衡敏感 (背景占主导时精度虚高)。
基准参考: COCO 全景分割 SOTA mIoU > 60%; Cityscapes 语义分割 SOTA mIoU > 85%; 医学分割 Dice > 0.9 通常被认为优秀。
浏览器端分割 - TensorFlow.js 和 ONNX Runtime 实现
在浏览器中运行分割模型,实现无需服务器的实时图像分割。
TensorFlow.js 实现:
- BodyPix: 人体分割和姿态估计,适合视频会议背景替换
- DeepLab: 通用语义分割,20 个类别
- 加载:
const model = await deeplab.load({base: 'pascal'}) - 推理:
const result = await model.segment(image)
ONNX Runtime Web:
- 支持更多模型格式,性能通常优于 TensorFlow.js
- WebGL 和 WebGPU 后端加速
- 可运行 PyTorch 导出的 ONNX 模型
性能考虑:
- 模型大小: 轻量模型 (MobileNet 骨干) 5-20MB,适合 Web
- 推理速度: 512×512 输入约 50-200ms (WebGL)
- WebGPU: 比 WebGL 快 2-5 倍,但浏览器支持仍在扩展中
实际应用: 视频会议虚拟背景 (实时人物分割); 照片编辑器 (交互式物体选择); AR 滤镜 (人脸/身体分割)。