TensorFlow 目标检测 API:评估 mAP 表现奇怪?

10

我正在使用Tensorflow Object Detection API训练自己的数据集目标检测器。我正在按照Dat Tran的优秀教程 https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9 进行操作。我将提供的ssd_mobilenet_v1_coco-model预训练模型检查点用作训练的起点,我的数据集只有一个目标类别。

我导出了训练好的模型,对评估数据进行了运行并查看了生成的边界框。经过训练的模型效果很好;如果有20个对象,通常会有13个对象具有准确的预测边界框(“真正的正例”);7个对象未被检测到(“假负例”);2种情况是两个或更多对象靠近时出现问题:在某些情况下,在对象之间绘制边界框(“假正例”)<-当然,将其称为“假正例”等不准确,但这只是为了帮助我理解这里的精度概念). 其他“假正例”几乎没有。这似乎比我希望得到的结果要好得多,尽管这种视觉检查并不能给出实际的mAP(基于预测和标记边界框之间的重叠计算),但我大致估计mAP大约为13/(13+2)>80%。

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

这表明mAP的变化很大,最终水平约为0.3,这比我使用导出的output_inference_graph.pb在评估集上绘制边界框的效果差得多。

这是训练的总损失图:

训练期间的总损失

我的训练数据包含200张图像,每张图像大约有20个标记对象(我使用labelImg应用程序对它们进行了标记);这些图像是从视频中提取出来的,对象很小且有点模糊。原始图像大小为1200x900,因此我将其缩小为600x450以供训练数据使用。评估数据(我既用作eval.py的评估数据集,也用于视觉检查预测结果的外观)类似,包括50个图像,每个图像有20个对象,但是仍然保持原始大小(训练数据从视频的前30分钟提取,而评估数据则从后30分钟提取)。

问题1:为什么模型看起来效果很好,但评估时mAP很低? mAP图表波动如此之大是正常的吗?我没有更改tensorboard用于绘制图表的图像数量的默认值(我阅读了这个问题:Tensorflow目标检测api验证数据大小,并有一些模糊的想法,可以更改一些默认值?)

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

问题3:从多个标记对象的图像中形成训练和评估数据是否会产生问题(即,评估例程肯定会将一个图像中的所有预测边界框与一个图像中的所有标记边界框进行比较,而不是将一个图像中的所有预测框与一个标记框进行比较,这将产生许多“假阴性”)?

问题4:在我看来,模型训练可能在大约10000个时间步骤后就可以停止,因为mAP似乎已经趋于稳定,那么它是否被过度训练了呢?当波动如此之大时很难判断。

我是一个目标检测的新手,非常感谢任何人可以提供的见解!:)

1个回答

9

问题1: 这个问题有点难... 首先我认为您对mAP的理解有误,因为您的快速计算是错误的。以下是简要的计算过程:

  • 针对每个物体类别,使用实际物体与检测物体之间的重叠,将检测结果标记为“真正的正例”或“伪正例”;所有没有与“真正的正例”相关联的实际物体都被标记为“假阴性”。

  • 然后,按置信度递减顺序迭代所有检测结果(在数据集中的所有图像上)。计算精度 (TP/(TP+FP)) 和召回率 (TP/(TP+FN)),仅计算已经看到的检测结果(置信度大于当前值)的TP和FP。这会给您一个点 (acc, recc),您可以将其放在精度-召回率图中。

  • 一旦您在图表中添加了所有可能的点,就可以计算曲线下面积:这就是该类别的平均精度 (Average Precision)

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

将其应用于您的情况:在最佳情况下,您的真正阳性是置信度最高的检测结果。在这种情况下,您的精度/召回率曲线将呈矩形形状:您将获得100%的精确度,直到 (13/20) 的召回率,然后是一些召回率为 13/20 且精确度小于 100% 的点;这会给您 mAP=AP(类别1)=13/20=0.65。而这是最好的情况,实际情况下由于误报可能会少一些。

导致您的平均精度可能更低的其他原因:

  • 也许在看似良好的边界框中,仍然有一些被计算拒绝,因为检测结果和实际物体之间的重叠不够大。标准是两个边界框(真实的和检测的)的交集比并集应该大于 0.5 。虽然看起来很宽松,但实际上还是挺苛刻的。您应该尝试编写一个脚本,根据是否接受检测结果来显示检测出的边界框的不同颜色(如果不接受,则会同时得到 FP 和 FN)。

  • 也许您只可视化了评估中的前 10 张图像。如果是这样,请更改一下,有两个原因:1. 您可能仅仅在这些图像上非常幸运,它们并不代表后面的情况,这只是出于运气。2. 实际上,除了运气之外,如果这些图像是评估集中的第一张图像,那么它们会接在视频中的训练集结束后出现,因此它们可能与训练集中的某些图像相似,所以比较容易进行预测,因此它们并不代表您的评估集。

问题2:如果你没有在配置文件mobilenet_v1_coco-model中更改那部分内容,那么你所有的图片(包括训练和测试)都会在网络开始时被重新调整大小为300x300像素,所以你的预处理并不重要。

问题3:不,这完全不是问题,所有这些算法都是设计用来检测图像中的多个对象的。

问题4:考虑到波动,我建议你继续训练,直到你看到改进或明显的过度训练。1万步实际上相当少,也许已经足够因为你的任务相对容易,也可能不够,你需要等待十倍的时间才能有显著的改进...


感谢您清晰的解释! :) 真的帮了很多忙! - Mari
2
我现在明白了四件事:准确度,召回率,AP和mAP。您写下这段简短的文字对我帮助很大。请记住,我已经在生产中部署了网络,但是我找不到一个合适的解释这些概念的方法。干得好先生! - JQCorreia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接