bdd100k语义分割与可行驶区域评测:mIoU计算原理逐步拆解
bdd100k语义分割与可行驶区域评测mIoU计算原理逐步拆解【免费下载链接】bdd100kThis repo has been moved to https://github.com/bdd100k/bdd100k permanently.项目地址: https://gitcode.com/gh_mirrors/bd/bdd100kbdd100k 是一个大规模驾驶视频数据集包含约 10 万个街景视频、1000 万帧图像和 7000 个场景片段广泛用于自动驾驶的语义分割、可行驶区域识别与 2D/3D 目标检测。本文将带你逐步拆解 bdd100k 语义分割与可行驶区域评测中 mIoU 指标的计算原理从混淆矩阵的构建到每类 IoU 的推导再到最终 mIoU 的求平均帮助你在提交结果前彻底搞懂评测脚本的每一行逻辑。 先认识 bdd100k一张图看懂数据与标注下图展示了 bdd100k 语义分割与目标检测的标注效果绿色/紫色区域即可行驶区域与道路分割结果绿色框为 2D 检测框覆盖了白天、夜晚、雨天、隧道等多种真实驾驶场景。数据集还提供基于 GPS 的行驶轨迹信息可以用 show_gps_trajectory.py 将轨迹绘制到地图上直观了解每段视频的采集路线 两个评测任务语义分割与可行驶区域bdd100k 的分割类评测包含两个任务二者共用同一套 mIoU 评测流程见 evaluation.md 的说明任务类别数评测入口语义分割seg19 类evaluate_segmentation(..., 19, 17)可行驶区域drivable3 类evaluate_drivable(...)→evaluate_segmentation(..., 3, 17)结果文件要求很简单但有几个硬性约定评测代码位于 evaluate.py结果为 PNG 图像尺寸必须与输入图像一致文件名以前缀 XXX 开头XXX 是 19 字符的视频名如c993615f-350c682c脚本取前 17 个字符作为对齐 GT 的键像素值必须使用train_id编码例如 car 是 13完整标签定义见 label.py。 第一步逐类统计构建全局混淆矩阵评测的第一件事是把 GT 与预测逐像素对齐累加进一个 n×n 的混淆矩阵hist其中hist[i][j]表示「GT 为第 i 类、预测为第 j 类」的像素数量。核心实现在fast_hist函数中技巧非常巧妙——把二维索引「拍平」成一维计数k (gt 0) (gt n) return np.bincount( n * gt[k].astype(int) prediction[k], minlengthn ** 2).reshape(n, n)n * gt pred把 (GT, 预测) 这个二维坐标映射成一个 0~n²-1 的一维编号一次np.bincount就完成了整张图的像素级统计。每评测 100 张图脚本会打印一次当前 IoU 方便观察进度。 注意所有图像的结果都累加到同一个矩阵里即 mIoU 是在整个测试集上全局计算的——这正是 bdd100k 沿用 Cityscapes 评测惯例的做法而不是逐张图算 IoU 再平均。 第二步从混淆矩阵推导每类 IoU有了混淆矩阵单类 IoU 的公式就是教科书定义IoU_i 交集 / (GT 中该类总数 预测中该类总数 − 交集)对应到per_class_iu函数ious np.diag(hist) / (hist.sum(1) hist.sum(0) - np.diag(hist)) ious[np.isnan(ious)] 0逐项拆解np.diag(hist)对角线元素即「GT 与预测同为 i 类」的像素数交集 TPhist.sum(1)按行求和GT 中该类的总像素TP FNhist.sum(0)按列求和预测中该类的总像素TP FP两者相加再减一次对角线恰好是 TP FP FN并集np.isnan(ious) 0若 GT 和预测中都没有该类分母为 0 产生 NaN直接置 0 避免报错。 第三步只对 GT 中出现的类别求平均得到 mIoU最后一步在evaluate_segmentation中完成遍历所有 GT 图像收集实际出现过的类别集合gt_id_set剔除 255unlabeled不可评估区域只对这些类别的 IoU 求平均miou np.mean(ious[list(gt_id_set)])。为什么不能直接对所有 19 类求平均因为测试集中可能根本没有某些类别它们的 IoU 被置 0 后会不公平地拉低总分。只平均 GT 中出现过的类别才是公平的 mIoU。✅ 提交前自检清单常见翻车点❓ 文件名前 17 字符与 GT 对不上 → 脚本会直接抛出ValueError: Result folder only has X of Y ground truth files❓ 像素值用了 label id 而不是 train_id比如 car 写成了 35→ 全图算错类mIoU 暴跌❓ 结果图尺寸与输入不一致 → 逐像素对比时就会出错❓ 255 区域GT 中标 255 的像素不计入任何统计预测值不影响分数❓ 可行驶区域任务只需 3 个类别的 mask不要套用 19 类分割的编码。 本地跑一次评测命令拿到 GT 和自己的预测结果后用仓库自带的评测脚本即可复现官方指标python bdd100k/evaluate.py --task seg --gt GT目录 --result 结果目录 python bdd100k/evaluate.py --task drivable --gt GT目录 --result 结果目录输出格式为「mIoU, 各类 IoU」例如62.35, 55.10, 71.24, ...第一个数就是最终榜单上看到的分数。 小结回顾 bdd100k 语义分割与可行驶区域评测的三步曲fast_hist把 GT 与预测逐像素映射到 n×n 混淆矩阵per_class_iu用对角线与行列和推出每类 IoU对 GT 实际出现的类别求平均得到mIoU。理解了这套流程你就能快速定位分数异常的原因也能把同样的方法迁移到 Cityscapes 等其他分割数据集的评测中。相关源码入口evaluate.py评测主逻辑、label.py标签与 train_id 定义、format.md标签 JSON 格式、evaluation.md评测规范。【免费下载链接】bdd100kThis repo has been moved to https://github.com/bdd100k/bdd100k permanently.项目地址: https://gitcode.com/gh_mirrors/bd/bdd100k创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考