跳到主要内容

分割实战

本节定位

分割项目最大的挑战常常不是模型名,
而是:

  • mask 标注质量
  • 类别不平衡
  • 评估方式是否合理

所以这一节的重点,是把一个最小分割项目的骨架讲清楚。

学习目标

  • 学会定义一个最小分割项目
  • 理解 mask 数据和指标的基本组织方式
  • 通过可运行示例建立项目评估直觉
  • 学会展示分割项目里最重要的结果

一、项目问题怎么定?

一个很适合练手的分割项目是:

  • 道路场景分割

或:

  • 医疗区域分割

共同特点:

  • mask 标签清楚
  • 区域边界重要
  • IoU 指标有意义

二、先跑一个最小分割项目评估示例

pred_masks = [
[[0, 0, 1], [0, 1, 1], [0, 0, 1]],
[[1, 1, 0], [1, 0, 0], [1, 0, 0]],
]

gt_masks = [
[[0, 0, 1], [0, 1, 1], [0, 1, 1]],
[[1, 1, 0], [1, 1, 0], [1, 0, 0]],
]


def iou(mask_a, mask_b, target=1):
inter = 0
union = 0
for row_a, row_b in zip(mask_a, mask_b):
for a, b in zip(row_a, row_b):
if a == target and b == target:
inter += 1
if a == target or b == target:
union += 1
return inter / union if union else 0.0


ious = [iou(pred, gt) for pred, gt in zip(pred_masks, gt_masks)]
mean_iou = sum(ious) / len(ious)

print("ious:", [round(x, 4) for x in ious])
print("mean_iou:", round(mean_iou, 4))

2.1 这个示例最想表达什么?

分割项目最终最重要的通常不是:

  • 某一张图看起来还行

而是:

  • 一组样本整体表现怎样

所以项目里通常都要汇总:

  • per-sample IoU
  • mean IoU

三、分割项目最容易踩的坑

3.1 mask 标注边界不一致

这会让训练和评估一起受污染。

3.2 类别太不平衡

小区域类别经常被主背景淹没。

3.3 只看均值,不看失败样本

均值可能掩盖一些特别糟的案例。


四、小结

这节最重要的是建立一个项目意识:

分割项目的核心,不只是模型训练,还包括 mask 标签质量、IoU 评估和失败样本分析。


练习

  1. 再构造一组 pred_masksgt_masks,观察 mean_iou 如何变化。
  2. 为什么分割项目里 mask 标注标准尤其重要?
  3. 如果某类目标区域很小,为什么 IoU 会特别敏感?
  4. 你会怎样把一个分割项目做成作品集页面?