1. 图像语义分割的原理
图像语义分割任务的目标是:逐像素分类。也就是说,对输入图像中的每一个像素都预测其所属类别(例如前景/背景或多类别场景)。
-
输入:一张图片
-
输出:同尺寸的 mask,每个像素属于某个类别(例如:前景/背景,或者多类分割)。
在 行人语义分割 任务中:
-
类别 1:行人(前景)
-
类别 0:背景
⚠️ 注意:这里讨论的是 语义分割,即对所有像素赋予类别标签;并不区分图像中不同个体的行人实例。
U-Net 采用 编码器-解码器结构:
-
编码器逐步下采样,提取语义特征。
-
解码器逐步上采样,恢复空间分辨率。
-
跳跃连接 (skip connection) 把低层细节特征与高层语义特征融合,使输出既有语义信息又保留边缘细节。
2. 损失函数:以二分类交叉熵 (BCE) 为例
为了训练模型,需要定义损失函数,衡量预测结果与真实标签的差距。
BCE 损失函数:
-
N:像素总数
-
yi:真实标签(0=背景,1=行人)
-
pi:模型预测的属于行人的概率
例子
假设某个像素真实是行人 (y=1),模型预测概率为 p=0.9。
代入公式:
数值结果:
说明预测很好,损失较小。
如果预测错误,例如 p=0.1:
损失大得多,模型会受到强烈惩罚。
3. 梯度的计算
要优化模型,需要计算损失对参数的梯度。
对预测概率 pi求导:
这就是反馈信号:
-
如果真实 yi=1,梯度是 −1/pi。
→ 当 pi 小(预测错,模型信心不足),梯度大 → 强烈惩罚,推动模型增大 pi。 -
如果真实 yi=0,梯度是 1/(1−pi)。
→ 当 pi 大(预测错,把负类当正类),梯度大 → 强烈惩罚,推动模型减小 pi。
4. 梯度下降:约束模型
梯度表示损失函数在当前点对参数的变化趋势,它指向损失函数增长最快的方向。要让损失变小,必须沿着 梯度的反方向 更新,也就是减去梯度。
参数更新公式:
-
θ:模型参数(卷积核权重等)
-
η:学习率
-
∇θL:损失函数对参数的梯度
直观理解:
-
预测正确 → 损失小,梯度小 → 参数更新幅度小。
-
预测错误 → 损失大,梯度大 → 参数快速调整。
通过反复迭代,模型逐渐学会让行人像素概率接近 1,背景像素概率接近 0,从而完成分割任务。
5. 总结
-
分割原理:逐像素分类,U-Net 编码+解码+跳跃连接。
-
损失函数:BCE 衡量预测概率与真实标签的差异。
-
梯度:通过对损失函数求导,得到反馈信号,指示模型参数该往哪个方向更新。
-
梯度下降:不断沿损失下降方向更新参数,最终让模型学会正确分割图像。