TensorFlow 对象检测 API:评估 mAP 行为异常?

TensorFlow Object Detection API: evaluation mAP behaves weirdly?

我正在使用 Tensorflow 对象检测为我自己的数据训练对象检测器 API。我正在关注 Dat T运行 https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9 的(很棒的)教程。我使用提供的 ssd_mobilenet_v1_coco-model 预训练模型检查点作为训练的起点。我只有一个对象 class.

我导出了经过训练的模型,运行 它在评估数据上并查看了生成的边界框。经过训练的模型效果很好;我会说如果有 20 个对象,通常有 13 个对象在预测的边界框上有斑点 ("true positives"); 7 未检测到对象 ("false negatives");出现问题的 2 种情况是两个或多个对象彼此靠近:在某些情况下,边界框会在对象之间绘制("false positives"<-当然,称这些为 "false positives" 等是不准确,但这只是为了让我在这里理解精度的概念)。其他的几乎没有"false positives"。这似乎比我希望得到的结果好得多,虽然这种视觉检查没有给出实际的 mAP(它是根据预测和标记的边界框的重叠计算的?),但我会粗略估计 mAP 为类似于 13/(13+2) >80%。

然而,当我 运行 评估 (eval.py)(在两个不同的评估集上)时,我得到以下 mAP 图(0.7 平滑): mAP during training

这表明 mAP 存在巨大差异,训练结束时水平约为 0.3,这比我根据使用导出的 output_inference_graph.pb 在评估集上。

这是训练的总损失图: total loss during training

我的训练数据包含 200 张图像,每张图像大约有 20 个标记对象(我使用 labelImg 应用标记它们);图像是从视频中提取的,对象很小而且有点模糊。原始图像大小为 1200x900,因此我将训练数据缩小为 600x450。评估数据(我将其用作 eval.py 的评估数据集并直观地检查预测结果)相似,由 50 张图像组成,每张图像包含 20 个对象,但 仍在原始大小(训练数据是从视频的前30分钟和最后30分钟的评估数据中提取的)。

问题 1:当模型看起来运行良好时,为什么 mAP 的评估如此之低? mAP图波动这么大正常吗?我没有触及张量板用于绘制图形的默认值(我读了这个问题:Tensorflow object detection api validation data size 并且有一些模糊的想法,即有一些可以更改的默认值?)

问题 2:这是否与训练数据和评估数据的不同大小有关(1200x700 与 600x450)?如果是这样,我是否也应该调整评估数据的大小? (我不想这样做,因为我的应用程序使用原始图像大小,我想评估模型在该数据上的表现如何)。

问题 3:从每个图像有多个标记对象的图像形成训练和评估数据是否有问题(即,评估例程肯定会将一幅图像中的所有预测边界框与所有标记边界框进行比较在一幅图像中,不是 将一幅图像中的所有预测框都映射到一个标记框,这会推导出许多 "false false positives"?)

(问题 4:在我看来,模型训练可能会在大约 10000 个时间步后停止,如果 mAP 有点趋于平稳,它现在是不是训练过度了?很难判断它何时波动如此之大。)

我是对象检测方面的新手,所以我非常感谢任何人可以提供的任何见解! :)

问题1:这个比较难...首先,我认为你没有正确理解什么是mAP,因为你的粗略计算是错误的。下面简单介绍一下它的计算方式:

  • 对于每个class的对象,利用真实对象和检测到的对象之间的重叠,检测被标记为"True positive"或"False positive";所有没有 "True positive" 关联的真实对象都被标记为 "False Negative".

  • 然后,以置信度降序遍历所有检测(在数据集的所有图像上)。计算准确率 (TP/(TP+FP)) 和召回率 (TP/(TP+FN)), 仅计算您已经看到的检测结果(置信度大于当前检测结果)TP 和 FP。这给了你一个点(acc,recc),你可以把它放在精确召回图上。

  • 将所有可能的点添加到图表后,您可以计算曲线下的面积:这是该类别的平均精度

  • 如果您有多个类别,则 mAP 是所有 AP 的标准平均值。

将其应用于您的案例:在最好的情况下,您的真阳性是最有信心的检测。在那种情况下,你的 acc/rec 曲线看起来像一个矩形:你将有 100% 的准确率达到 (13/20) 召回率,然后以 13/20 的召回率和 <100% 的准确率点;这给你 mAP=AP(category 1)=13/20=0.65。这是最好的情况,由于误报率更高,您可以在实践中期望更少。

您的可能更低的其他原因:

  • 也许在看起来不错的边界框中,有些仍然在计算中被拒绝,因为检测与真实对象之间的重叠不够大。标准是两个边界框(真实边界框和检测边界框)的交并比(IoU) 应该超过0.5。虽然这似乎是一个温和的门槛,但事实并非如此。您可能应该尝试编写一个脚本来根据检测到的边界框是否被接受(如果不接受,您将同时获得 FP 和 FN)以不同的颜色显示检测到的边界框。

  • 也许您只看到了评估的前 10 张图片。如果是这样,请更改它,原因有 2 个:1. 也许您在这些图像上非常幸运,它们并不代表接下来的内容,只是运气。 2. 其实不仅仅是运气,如果这些图像是评估集中的第一张,它们是在你的视频中训练集结束后立即出现的,所以它们可能与训练集中的某些图像非常相似,所以它们是更容易预测,因此它们不能代表您的评估集。

问题 2: 如果您没有更改配置文件中的那部分 mobilenet_v1_coco-model,您的所有图像(用于训练和测试)都将重新缩放为 300x300 像素在网络的开始,所以你的预处理并不重要。

问题 3: 不,这根本不是问题,所有这些算法都旨在检测图像中的多个对象。

问题 4: 鉴于波动,我实际上会继续训练它,直到您看到改进或明显的过度训练。 10k步其实很小,也许够了,因为你的任务相对简单,也许还不够,你需要等十倍才能有明显的进步...