TensorFlow 对象检测 API 奇怪的行为

TensorFlow Object Detection API Weird Behavior

我正在使用 TensorFlow 的全新 Object Detection API 并决定在其他一些公开可用的数据集上对其进行训练。

我偶然发现了 this 杂货数据集,其中包含超市货架上各种品牌香烟盒的图像以及一个文本文件,其中列出了每张图像中每个香烟盒的边界框。数据集中标记了 10 个主要品牌,所有其他品牌都属于第 11 "miscellaneous" 类别。

我跟着他们 tutorial 并设法在这个数据集上训练模型。由于处理能力的限制,我只使用了数据集的三分之一,并对训练和测试数据进行了 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'
}

数据集中有多少张图片?您拥有的训练数据越多,API 的表现就越好。我尝试在每个 class 大约 20 张图像上训练它,准确性非常差。我几乎遇到了你上面提到的所有问题。当我生成更多数据时,准确性大大提高。

PS: 对不起,我没有足够的声誉,所以无法发表评论

看来,数据集的大小相当小。 Resnet 是一个大型网络,需要更多数据才能正确训练。

要做什么:

  1. 增加数据集大小
  2. 使用预先训练的网络并对您的数据集进行微调(您可能已经这样做了)
  3. 使用数据增强(调整大小、模糊、...;翻转可能不适合此数据集)。

所以我想我明白是怎么回事了。我对数据集做了一些分析,发现它偏向于类别 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 所做的出色工作 :) 现在每个人都可以训练对象检测模型了!

也许现在为时已晚,但我想 post 如果将来有人遇到这个问题,请发表评论:

不幸的是,TF 文档不是最好的,在找到原因之前我为此苦苦挣扎了很多。该模型的构建方式是它允许每张图像进行最多 x 次预测。在你的情况下,我认为它是 20。你可以通过像这样编辑原始照片来轻松验证我的假设:

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

相当讨厌的限制。

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

train_input_reader {
  max_number_of_boxes: 1000
}

eval_input_reader {
  max_number_of_boxes: 1000
}

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