TensorFlow目标检测API的奇怪行为

23
我正在使用TensorFlow的全新目标检测API进行实验,并决定在其他公开可用的数据集上进行训练。我偶然发现了这个杂货数据集,其中包含超市货架上各种品牌香烟盒的图像,以及一个文本文件,列出了每个图像中每个香烟盒的边界框。该数据集标记了10个主要品牌,所有其他品牌都属于第11个“杂项”类别。
我按照他们的教程进行操作,并在此数据集上训练了模型。由于处理能力有限,我仅使用了数据集的三分之一,并将70:30拆分为训练和测试数据。我使用了faster_rcnn_resnet101模型。我的配置文件中的所有参数与TF提供的默认参数相同。
经过16491个全局步骤后,我对一些图像进行了测试,但结果并不太满意 -

无法检测到顶架上的骆驼,而它可以检测其他图像中的产品

为什么它无法检测到顶行的万宝路?

我遇到的另一个问题是该模型从未检测到除标签1以外的任何其他标签

未在训练数据中检测到产品的任何种植实例

它即使在负面图像中也能以99%的置信度检测到香烟盒!有人能帮助我找出问题吗?我该怎么提高准确性?为什么它会将所有产品都检测为类别1,尽管我已经提到总共有11个类别?编辑:添加了我的标签映射:
item {
  id: 1
  name: '1'
}

item {
  id: 2
  name: '2'
}

item {
  id: 3
  name: '3'
}

item {
  id: 4
  name: '4'
}

item {
  id: 5
  name: '5'
}

item {
  id: 6
  name: '6'
}

item {
  id: 7
  name: '7'
}

item {
  id: 8
  name: '8'
}

item {
  id: 9
  name: '9'
}

item {
  id: 10
  name: '10'
}

item {
  id: 11
  name: '11'
}

1
你能提供你的工作的标签映射吗? - Jonathan Huang
@JonathanHuang 我把我的标签映射添加到了编辑中。 - Banach Tarski
1
谢谢,看起来很好。可能像其他人提到的那样,你需要更多的数据,但我很困惑为什么你总是预测相同的类别...也许你需要再次检查TFRecord文件? - Jonathan Huang
我注意到标签数量在某种程度上被限制为20个。 - Julez
@BanachTarski 做得好。你可以分享一下从杂货数据集创建tfrecords的代码吗? - Ivan Shelonik
5个回答

16

所以我想我弄清楚了发生了什么。我对数据集进行了一些分析,发现它偏向于类别1的对象。

这是从1到11(使用0索引)的每个类别的频率分布。

0 10440
1 304
2 998
3 67
4 412
5 114
6 190
7 311
8 195
9 78
10 75

我猜模型正陷入一种局部最小值,即将一切都标记为类别1就足够了。

关于无法检测到一些盒子的问题:我尝试重新训练,但这次我没有区分品牌。相反,我试图教模型什么是香烟盒。它仍然没有检测到所有的盒子。

然后我决定裁剪输入图像并将其提供为输入。只是想看看结果是否会改善,它确实有所改进!

原来输入图像的尺寸要比模型接受的600 x 1024大得多。因此,它正在将这些图像缩小到600 x 1024,这意味着香烟盒失去了它们的细节 :)

因此,我决定在裁剪后的图像上测试训练所有类别的原始模型,效果非常好 :)

原始图像

这是模型对原始图像的输出

从原始图像左上角裁剪

这是模型在我裁剪出左上角四分之一并将其提供为输入时的输出。

感谢所有帮助过我的人!祝贺TensorFlow团队做了一项了不起的API :) 现在每个人都可以训练物体检测模型!


嗨@Banach Tarski,您提到您缩小了图像。您如何处理注释的更改? - Jundong
1
注释应该相对于图像的大小而不是绝对坐标进行。这样,注释就不会因缩放而变化。 - Banach Tarski
非常感谢!您量化了训练图像缩小后mAP的提高吗? - Jundong
实际上,我在推断过程中缩小了图像,因为我的测试集中的图像比我训练模型时使用的图像要大得多 :) 但是,在理论上,您可以将此技术用作数据增强机制,用于稀疏训练数据集,其中图像大小非常大。 - Banach Tarski
我有同样的问题。我使用三个类别训练了模型,在 49000 步时,使用批大小为 1,模型对所有对象预测了一个类别,但是对象被完美地检测出来,只是标签错误。后来我尝试了早停止,但发现模型随机返回三个类别中的任意一个。我使用一些教程数据集尝试了这个,似乎在早停止时预测了两个以上的类别。我应该重新注释数据集还是您有任何建议? - user3201928

5
数据集中有多少图片?拥有更多的训练数据可以使API的表现更好。我试图让它对每个分类训练约20张图片,但准确率非常糟糕。我基本上遇到了你提到的所有问题。当我生成了更多数据时,准确性显著提高了。
PS:抱歉,由于我的声望不够,无法发表评论。

数据集中有300张图片,每张图片包含多个类别的实例。我估计每个品牌在这300张图片中都有超过1000个实例。另外,你的模型中的类别标注是否正确? - Banach Tarski
类别标签与您发布的非常相似。即使我的模型开始以高置信度预测所有内容,我认为它从我提供的有限数据中学习了非常基本的特征。 - Nikhil Kasukurthi
嗯...那么问题只是数据不够还是我没有训练足够?该死,这似乎很愚蠢。我会运行更多迭代的模型,看看是否有任何改进。 - Banach Tarski
我认为这不会有太大的帮助,因为训练会在某个点上收敛。既然你已经运行了16000步,再运行更多的迭代将是多余的。我建议你尝试增加数据量。此外,你能否重新检查一下你的注释,以防你错过或错误标记了一些数据。 - Nikhil Kasukurthi
是的,我也增加了数据量。最初我只使用了三分之一的数据进行训练。我会尝试使用完整的数据集和更多的迭代次数,看看是否会有所改善。 - Banach Tarski

2
也许现在已经有点晚了,但我想发布评论,以便将来有人遇到这个问题:

不幸的是,TF文档不是最好的,我在找到原因之前遇到了很多困难。模型构建的方式是允许每张图像最多进行x次预测。在您的情况下,我认为是20次。您可以通过像这样编辑原始照片轻松测试我的假设:enter image description here

显然,在绘制框之前,您应该看到一些更好的结果。

非常恶心的限制。


2

有一些需要配置的参数,例如:

train_input_reader {
  max_number_of_boxes: 1000
}

eval_input_reader {
  max_number_of_boxes: 1000
}

它们非常重要。默认情况下,它们设置为100。


1
似乎数据集规模相当小。Resnet是一个大型网络,需要更多的数据来正确训练。
该怎么办:
1.增加数据集大小 2.使用预训练网络并在您的数据集上进行微调(您可能已经这样做了) 3.使用数据增强(调整大小、模糊等;翻转可能不适用于此数据集)。

我可以尝试这样做,但我不明白为什么在全局步骤约为16000之后,它会以99%的置信度标记对象。难道它现在至少没有学会区分品牌吗? - Banach Tarski

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