我正在使用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似乎已经趋于稳定,那么它是否被过度训练了呢?当波动如此之大时很难判断。
我是一个目标检测的新手,非常感谢任何人可以提供的见解!:)