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

我偶然发现this杂货店数据集,该数据集由超市货架上各种品牌烟盒的图像以及一个文本文件组成,该文本文件列出了每个图像中每个烟盒的边界框。数据集中已经标记了10个主要品牌,所有其他品牌都属于第11个“杂项”类别。

我遵循他们的tutorial并设法在该数据集上训练模型。由于处理能力的限制,我只使用了三分之一的数据集,并以70:30的比例进行了训练和测试。我使用了fast_rcnn_resnet101模型。我的配置文件中的所有参数都与TF提供的默认参数相同。

经过16491次全局步骤后,我在一些图像上测试了该模型,但对结果并不满意-

python - TensorFlow对象检测API怪异行为-LMLPHP
无法在上架中检测到 Camel ,而在其他图像中检测到产品

python - TensorFlow对象检测API怪异行为-LMLPHP
为什么无法在第一行中检测到万宝路呢?

python - TensorFlow对象检测API怪异行为-LMLPHP
我遇到的另一个问题是该模型从未检测到除标签1之外的任何其他标签。

python - TensorFlow对象检测API怪异行为-LMLPHP

没有从训练数据中检测到产品的作物实例

python - TensorFlow对象检测API怪异行为-LMLPHP

即使在负像中,它也能以99%的置信度检测香烟盒!

有人可以帮助我解决问题吗?我该怎么做才能提高准确性?为什么即使我提到总共有11个类别,它也能检测到所有属于类别1的产品?

编辑添加了我的标签图:

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的对象。

这是从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,这意味着烟盒丢失了其详细信息:)

因此,我决定测试原始模型,该模型在裁剪图像上的所有类(class)上都经过了培训,它的工作原理很像:)

python - TensorFlow对象检测API怪异行为-LMLPHP

这是模型在原始图像上的输出

python - TensorFlow对象检测API怪异行为-LMLPHP

当我裁剪左上四分之一并将其作为输入时,这就是模型的输出。

谢谢大家的帮助!并祝贺TensorFlow团队为API做出了出色的工作:)现在,每个人都可以训练对象检测模型!

09-26 21:10
查看更多