【问题标题】:TensorFlow Object Detection API Weird BehaviorTensorFlow 对象检测 API 奇怪的行为
【发布时间】:2017-12-15 05:54:51
【问题描述】:

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

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

我关注了他们的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'
}

【问题讨论】:

  • 你能提供你工作的标签图吗?
  • @JonathanHuang 我在编辑中添加了我的标签映射
  • 谢谢,看起来不错。正如其他人所提到的那样,您可能需要更多数据,但我很困惑为什么您总是预测同一个类......也许您需要再次仔细检查 TFRecord 文件?
  • 我注意到标签以某种方式限制为 20..
  • @BanachTarski 干得好。您可以分享您从杂货数据集创建 tfrecord 的代码吗?

标签: python machine-learning tensorflow classification object-detection


【解决方案1】:

有一些参数需要配置:

train_input_reader {
  max_number_of_boxes: 1000
}

eval_input_reader {
  max_number_of_boxes: 1000
}

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

【讨论】:

    【解决方案2】:

    现在可能为时已晚,但如果将来有人遇到此问题,我想发布 cmets:

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

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

    相当讨厌的限制。

    【讨论】:

      【解决方案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 方面的出色工作 :) 现在每个人都可以训练对象检测模型了!

      【讨论】:

      • 嗨@Banach Tarski,您提到您缩小了图像。怎么处理注解的变化?
      • 注释应该相对于图像的大小而不是绝对坐标。这样,注释就不会随缩放而变化。
      • 非常感谢!你量化了缩小训练图像后mAP的改进吗?
      • 实际上我在推理过程中缩小了图像,因为我的测试集中的图像明显大于我训练模型的图像:) 但是是的,理论上你可以使用这种技术作为数据增强机制对于图像尺寸非常大的稀疏训练数据集,
      • 我有同样的问题。在 49000 步后,我用 3 个类训练了模型,1 个批量大小模型预测所有对象的 1 个类,但对象被完美地检测到只是错误的标签。后来我尝试提前停止,但发现模型从 3 个类中随机返回。我用一些教程数据集尝试了这个,它似乎预测了提前停止的两个以上的类。我应该通过数据集重新注释还是您有什么建议?
      【解决方案4】:

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

      做什么:

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

      【讨论】:

      • 我可以尝试这样做,但我不明白为什么它在大约 16000 个全局步骤后以 99% 的置信度标记对象。它现在不应该至少已经学会了区分品牌吗?
      【解决方案5】:

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

      PS:抱歉,我没有足够的声誉,无法发表评论

      【讨论】:

      • 数据集中有 300 张图片,每张图片包含每个类的多个实例。我估计每个品牌在 300 张图片中都有超过 1000 个该品牌的实例。另外,您的模型中的类标签是否正确?
      • 类标签与您发布的非常相似。甚至我的模型也开始充满信心地预测一切。我相信它从我提供的有限数据中学到了非常基本的功能。
      • 嗯.. 问题只是没有足够的数据还是我没有足够的训练?该死,这似乎很愚蠢。我将运行模型进行更多迭代,看看是否有任何改进
      • 我认为这不会有太大帮助,因为在某个点之后训练会收敛。由于您已经运行了 16000 步,因此运行更多的迭代将是多余的。我建议您尝试增加数据。如果您错过/错误标记了某些数据,您还可以重新检查您的注释吗?
      • 是的,我也增加了数据。最初,我只使用了三分之一的数据进行训练。将尝试完整的数据集和更多的迭代,看看情况是否有所改善。
      猜你喜欢
      • 2018-02-27
      • 2018-05-21
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多