图像分割基础 - 理解区域划分原理与应用
什么是图像分割 - 在像素级别理解图像
图像分割将图像中的每个像素分配到特定类别或区域,实现像素级别的图像理解。它是计算机视觉中最精细的识别任务。
分割类型:
- 语义分割:每个像素分配一个类别标签 (如天空、道路、建筑)。不区分同类别的不同实例
- 实例分割:不仅分类,还区分同类别的不同个体 (如区分不同的行人)
- 全景分割:语义分割 + 实例分割的统一。所有像素都有类别,可数物体还有实例 ID
与其他任务的关系:
- 图像分类:整张图像一个标签
- 目标检测:边界框级别定位
- 图像分割:像素级别定位 (最精细)
应用场景:自动驾驶 (道路/行人/车辆分割)、医学影像 (器官/病灶分割)、卫星遥感 (土地覆盖分类)、视频会议 (人物/背景分离)、图像编辑 (精确选区)。
经典方法 - 阈值法与边缘检测分割
在深度学习之前,图像分割主要依赖手工设计的算法,基于像素值、梯度或区域特征进行分割。
阈值分割:
- 全局阈值:选择一个阈值 T,像素值 > T 为前景,否则为背景
- Otsu 方法:自动计算最优阈值,最大化类间方差。OpenCV:
cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) - 自适应阈值:每个像素根据局部邻域计算阈值。适合光照不均的场景
边缘检测 + 轮廓:
- Canny 边缘检测找到物体边界
- 轮廓查找 (
cv2.findContours) 提取封闭区域 - 适合形状规则、对比度高的物体
分水岭算法:将图像视为地形,从标记点"注水",水域相遇处形成分割边界。适合分离接触的物体 (如细胞)。需要手动或自动提供标记点。
局限性:经典方法对复杂场景 (多类别、遮挡、纹理变化) 效果差,无法学习语义信息。
阈值法 (Thresholding):最简单的方法,按像素值是否超过阈值来分离前景与背景。大津法 (Otsu's method) 是自动确定「使类间方差最大化的最优阈值」的算法,用 OpenCV 的 cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) 就能轻松实现。
边缘检测:用 Sobel 滤波器或 Laplacian 滤波器计算边缘的梯度,再以非极大值抑制和滞后阈值处理检测出精细的边缘。
区域生长法 (Region Growing):从种子点出发,当相邻像素满足相似条件 (色差在阈值以内) 时,就把区域向外扩张。
GrabCut 算法:用户指定一个大致的矩形后,用高斯混合模型 (GMM) 与图割来分离前景与背景,是一种交互式方法。可通过 OpenCV 的 cv2.grabCut 使用,长期被广泛用作背景去除工具的基础技术。
深度学习方法 - 从 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%
FCN (Fully Convolutional Network, 2015):把用于图像分类的 CNN (VGG、ResNet 等) 的全连接层替换为卷积层,从而实现了逐像素预测的开创性模型。
DeepLab 系列 (2016-2018):引入空洞卷积 (Atrous Convolution / Dilated Convolution),在扩大感受野的同时维持分辨率。DeepLab v3+ 用 ASPP (Atrous Spatial Pyramid Pooling) 整合多尺度的上下文信息,在 PASCAL VOC 2012 上达到了 mIoU 89.0%。
基于 Transformer (2021-):SegFormer、Mask2Former 等基于 Vision Transformer 的模型相继登场,精度已超过基于 CNN 的模型。
SAM (Segment Anything Model) - 通用分割的革命
Meta 于 2023 年发布的 SAM 是图像分割领域的里程碑,实现了零样本通用分割能力。
核心创新:
- 提示式分割:通过点击、框选或文本提示指定要分割的对象
- 零样本泛化:无需针对特定类别训练,可分割任意物体
- 大规模预训练:在 SA-1B 数据集 (11M 图像,1.1B 掩码) 上训练
架构:
- 图像编码器:ViT-H (Vision Transformer),提取图像特征
- 提示编码器:编码点、框、文本等提示信息
- 掩码解码器:轻量级解码器,快速生成分割掩码
SAM 2 (2024):扩展到视频分割,支持时间维度的物体跟踪和分割。实时交互式视频分割成为可能。
应用:交互式图像编辑、自动标注工具、医学图像辅助分割、遥感图像分析。SAM 大幅降低了分割任务的门槛。
SAM 的架构:Image Encoder 基于 ViT-H (Vision Transformer Huge),图像只要编码 1 次,就能对多个提示复用;Prompt Encoder 接受点 (点击位置)、框 (矩形选择)、文本、掩码等多样的提示;Mask Decoder 是轻量的 Transformer 解码器,能快速生成与提示对应的掩码。
使用模式与成本:交互式分割能立即生成包含用户点击点的物体掩码。由于 SAM 的 Image Encoder 计算成本较高 (ViT-H 在 GPU 上约 600ms/张),实时用途请考虑使用轻量版的 MobileSAM 或 EfficientSAM。
评估指标 - 理解 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 通常被认为优秀。
IoU 与 mIoU:一般把 IoU 在 0.5 以上判定为「正确的分割」。mIoU (mean IoU) 是全部类别 IoU 的平均值,是语义分割的标准评价指标,用于 PASCAL VOC、Cityscapes 等基准。截至 2024 年的 SOTA (State of the Art),在 Cityscapes 上达到了 mIoU 85% 以上。
Pixel Accuracy 与 Boundary F1 Score:Pixel Accuracy 是被正确分类的像素比例。例如当图像的 90% 是背景时,只要把所有像素都预测为背景,就能得到 90% 的精度。Boundary F1 Score 则是评价分割边界精度的指标。
浏览器端分割 - 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 滤镜 (人脸/身体分割)。
用 TensorFlow.js 实现:Google 提供的 BodyPix 以及 MediaPipe 的 Selfie Segmentation,可以在浏览器上实时执行人物分割。import * as bodySegmentation from '@tensorflow-models/body-segmentation'; const model = bodySegmentation.SupportedModels.MediaPipeSelfieSegmentation; const segmenter = await bodySegmentation.createSegmenter(model); const people = await segmenter.segmentPeople(image); MediaPipe Selfie Segmentation 以 256 × 256 的输入分辨率运行,即便在移动设备上也能做到 30fps 以上的实时处理。输出是逐像素的概率图,用阈值 (通常 0.5-0.7) 二值化来生成掩码。
用 ONNX Runtime Web 实现:可以把用 PyTorch 训练的模型导出为 ONNX 格式,再用浏览器的 WebAssembly 或 WebGL 后端执行。也有把 SAM 的轻量版 (MobileSAM) 转为 ONNX 后在浏览器中运行的公开实现示例。
实现上的注意点:考虑到首次加载时间,应实现渐进式加载或用 Service Worker 缓存。内存管理方面要显式释放 GPU 内存:TensorFlow.js 中别忘了调用 tf.dispose(),ONNX Runtime 中别忘了调用 session.release()。Web Worker 方面,把推理处理与主线程分离以防止 UI 阻塞,若与 OffscreenCanvas 组合,绘制也能在工作线程中执行。
与服务端推理的分工:需要实时性时 (视频会议的背景去除) 在浏览器执行,需要高精度时 (电商网站的商品抠图) 则在服务端运行 SAM,这样的结构是推荐做法。