我正在使用TensorFlow的全新Object Detection API,并决定在其他一些公共(public)可用数据集上对其进行训练。
我偶然发现this杂货店数据集,该数据集由超市货架上各种品牌烟盒的图像以及一个文本文件组成,该文本文件列出了每个图像中每个烟盒的边界框。数据集中已经标记了10个主要品牌,所有其他品牌都属于第11个“杂项”类别。
我遵循他们的tutorial并设法在该数据集上训练模型。由于处理能力的限制,我只使用了三分之一的数据集,并以70:30的比例进行了训练和测试。我使用了fast_rcnn_resnet101模型。我的配置文件中的所有参数都与TF提供的默认参数相同。
经过16491次全局步骤后,我在一些图像上测试了该模型,但对结果并不满意-
无法在上架中检测到 Camel ,而在其他图像中检测到产品
为什么无法在第一行中检测到万宝路呢?
我遇到的另一个问题是该模型从未检测到除标签1之外的任何其他标签。
没有从训练数据中检测到产品的作物实例
即使在负像中,它也能以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)上都经过了培训,它的工作原理很像:)
这是模型在原始图像上的输出
当我裁剪左上四分之一并将其作为输入时,这就是模型的输出。
谢谢大家的帮助!并祝贺TensorFlow团队为API做出了出色的工作:)现在,每个人都可以训练对象检测模型!