9

我正在使用 Tensorflow 对象检测 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 种情况是两个或更多对象彼此靠近:在其中一些情况下,在对象之间绘制了边界框(“误报”<-当然,称这些“误报”等是不准确的,但这只是为了让我在这里理解精度的概念)。几乎没有其他“误报”。这似乎比我希望得到的结果要好得多,

但是,当我运行评估 ( 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 object detection api validation data size并且有一些模糊的想法,即有一些可以更改的默认值?)

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

问题 3:从每张图像有多个标记对象的图像中形成训练和评估数据是否有问题(即,评估例程肯定会将一张图像中的所有预测边界框与一张图像中的所有标记边界框进行比较,以及不是一张图像中的所有预测框都指向一个标记框,这会导致许多“误报”?)

(问题 4:在我看来,如果 mAP 趋于平稳,模型训练可能在大约 10000 个时间步后停止,现在是否过度训练?很难说它什么时候波动这么大。)

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

4

1 回答 1

9

问题1:这是一个艰难的问题......首先,我认为您没有正确理解mAP是什么,因为您的粗略计算是错误的。简而言之,它是如何计算的:

  • 对于每一类对象,利用真实对象与检测对象之间的重叠,将检测标记为“真阳性”或“假阳性”;所有没有与之关联的“真阳性”的真实对象都被标记为“假阴性”。

  • 然后,以置信度降序遍历所有检测(在数据集的所有图像上)。计算准确率 ( 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 张图像。如果是这样,请更改它,原因有两个: 1. 也许您在这些图像上非常幸运,它们并不能代表接下来的内容,只是靠运气。2.实际上,不仅仅是运气,如果这些图像是评估集中的第一张,它们是在你的视频中训练集结束之后出现的,所以它们可能与训练集中的一些图像非常相似,所以它们是更容易预测,因此它们不代表您的评估集。

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

问题 3:不,这根本不是问题,所有这些算法都是为了检测图像中的多个对象而设计的。

问题 4:考虑到波动,我实际上会继续训练它,直到你看到改进或明显过度训练。10k 步其实很小,可能因为你的任务比较简单就够了,也可能还不够,需要等十倍才能有明显的提升……

于 2017-12-07T13:37:49.653 回答