目标检测与图像分割
检测预测类别/框,分割预测像素;评价需 IoU、AP/mAP 或 mIoU。
学习目标
- 两个 4×4 框的 IoU
- 分割 mask 缩放为什么不用普通双线性插值?
- 说明:IoU 只描述重叠;检测 AP 还需要排序、阈值与一对一匹配协议。
为什么需要这个概念
目标检测输出类别与边界框;语义分割输出逐像素类别;实例分割进一步区分同类的不同个体。它们需要各自的标注、损失和匹配评估。
学习前需要掌握
背景与问题
分类只回答图中有什么,检测还回答在哪里,分割则给每个像素分配标签。目标格式与评估单位改变后,不能直接沿用图像级分类管道。
概念定义
目标检测输出类别与边界框;语义分割输出逐像素类别;实例分割进一步区分同类的不同个体。它们需要各自的标注、损失和匹配评估。
直观理解
检测画框圈出对象,语义分割给每块区域上色,实例分割再为两只同类动物分别编号。
核心原理
检测框可用 xyxy 或中心宽高等格式,需明确坐标是否归一化及边界定义。resize、crop、flip 必须同步变换图像和框;分割 mask 缩放通常用最近邻以免制造不存在的类别编号。
IoU 是交集面积除以并集面积,可比较框或像素区域。检测评估还要按类别、置信度和 IoU 阈值匹配预测与真实框,重复框不能都算真阳性;AP 不是一个 IoU 均值。
语义分割常输出 logits、目标为 整数类别,ignore 区域需从损失与指标排除。小目标、遮挡与类不平衡会使总像素准确率掩盖错误,应查看每类 IoU 和对象尺度。
数学表达
核心公式
目标检测输出类别与边界框;语义分割输出逐像素类别;实例分割进一步区分同类的不同个体。它们需要各自的标注、损失和匹配评估。
变量含义
Nbatch sizeD/H特征或隐藏维度
计算步骤
- 1交集是 2×2,面积为 4。
- 2两框面积均为 16,并集为 28。
- 3IoU=4/28=1/7。
代码对应位置
示例 1两个 4×4 框的 IoU的最小验证:使用完整构造输入核对两个 4×4 框的 IoU,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | batch size |
D/H | 特征或隐藏维度 |
完整数值示例
两个 4×4 框的 IoU
已知条件
- A=(0,0,4,4),B=(2,2,6,6)
- 采用连续 xyxy 坐标,面积不额外加 1
计算步骤
- 交集是 2×2,面积为 4。
- 两框面积均为 16,并集为 28。
- IoU=4/28=1/7。
计算结果
IoU 约为 0.142857;互不相交时为 0。
处理前后对比
- IoU 只描述重叠;检测 AP 还需要排序、阈值与一对一匹配协议。
两个 4×4 框的 IoU
若把框当作包含端点的整数像素坐标并加 1,面积会变成另一套口径。应按数据集规范统一,而不是在同一项目里混用。
本例只验证几何重叠,没有类别、置信度或匹配过程,因此不能把 0.142857 称为检测准确率。空框或退化框也要有明确处理,本实现把非正并集返回 0。
计算与实现步骤
- 交集是 2×2,面积为 4。
- 两框面积均为 16,并集为 28。
- IoU=4/28=1/7。
代码实现
示例 1
两个 4×4 框的 IoU的最小验证
example_01.py用途:使用完整构造输入核对两个 4×4 框的 IoU,输出只表示本例计算。
def iou(a, b):
inter_w = max(0., min(a[2], b[2]) - max(a[0], b[0]))
inter_h = max(0., min(a[3], b[3]) - max(a[1], b[1]))
intersection = inter_w * inter_h
area_a = max(0., a[2] - a[0]) * max(0., a[3] - a[1])
area_b = max(0., b[2] - b[0]) * max(0., b[3] - b[1])
union = area_a + area_b - intersection
return intersection / union if union > 0 else 0.
print(f"overlap={iou([0, 0, 4, 4], [2, 2, 6, 6]):.6f}")
print(f"disjoint={iou([0, 0, 1, 1], [2, 2, 3, 3]):.6f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对两个 4×4 框的 IoU,输出只表示本例计算。
b- 偏置项。
Step 1 · 1–10 行
输出中间参数、形状或最终指标,用于核对代码是否符合预期。
def iou(a, b):
inter_w = max(0., min(a[2], b[2]) - max(a[0], b[0]))
inter_h = max(0., min(a[3], b[3]) - max(a[1], b[1]))
intersection = inter_w * inter_h
area_a = max(0., a[2] - a[0]) * max(0., a[3] - a[1])
area_b = max(0., b[2] - b[0]) * max(0., b[3] - b[1])
union = area_a + area_b - intersection
return intersection / union if union > 0 else 0.
print(f"overlap={iou([0, 0, 4, 4], [2, 2, 6, 6]):.6f}")
print(f"disjoint={iou([0, 0, 1, 1], [2, 2, 3, 3]):.6f}")预期输出或运行结果
overlap=0.142857 disjoint=0.000000
常见错误 · 4 条
- 框格式混用
- 只变图不变标注
- mask 双线性插值
- 测试调 NMS
实际应用
- 目标定位与区域理解
- 核对图像增强后的标注同步
常见错误
- 框格式混用
- 只变图不变标注
- mask 双线性插值
- 测试调 NMS
常见问题
分割 mask 缩放为什么不用普通双线性插值?
类别编号是离散标签,双线性会混合编号产生无意义值;通常用最近邻,概率图的处理则应另行定义。
这个示例能说明什么边界?
IoU 只描述重叠;检测 AP 还需要排序、阈值与一对一匹配协议。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。