我应该包含 Tensorflow 对象检测 API 的负面示例吗?

Posted

技术标签:

【中文标题】我应该包含 Tensorflow 对象检测 API 的负面示例吗?【英文标题】:Should I include negative examples for Tensorflow object detection API? 【发布时间】:2018-03-17 07:53:34 【问题描述】:

我正在使用Tensorflow's object detection API 构建一个 RCNN 检测网络。

我的目标是检测户外视频中动物的边界框。大多数框架没有动物,只是动态背景。

大多数教程都侧重于训练自定义标签,但没有提到负训练样本。这类检测器如何处理不包含感兴趣对象的图像?它只是输出低概率,还是会强制尝试在图像内绘制边界框?

我目前的计划是在 opencv 中使用传统的背景减法来生成潜在的帧并将它们传递给经过训练的网络。我是否还应该包含一类“背景”边界框作为“负数据”?

最后的选择是使用 opencv 进行背景减法,使用 RCNN 生成边界框,然后使用作物分类模型来识别动物与背景。

【问题讨论】:

【参考方案1】:

如果您希望您的模型能够区分“找到数字”和“没有数字”,那么您几乎肯定需要在负样本上对其进行训练。将这些标记为“无图像”。在“无图像”的情况下,是的,使用整个图像作为边界框;不要建议模型识别任何更小的东西。

在“无图像”的情况下,您可能得到一个较小的边界框,但这没关系:在推理中,您将简单地忽略为“无图像”返回的任何框。

当然,这里的关键问题是尝试一下,看看它对你的效果如何。

【讨论】:

不要认为这种策略是有利的。正如 Jonathon 提到的,标记照片的背景被用作反面例子。如果您只是将整张照片标记为一个类别,这将是对计算能力的低效使用,并提供不必要的检测和结果。此外,您可以简单地编辑对象检测运行器,将检测到的图像输出到一个文件夹,将未检测到的图像输出到另一个文件夹,从而解决问题。【参考方案2】:

一般来说,没有必要明确包含“负面图像”。在这些检测模型中发生的情况是,它们将图像中不属于注释对象的部分用作底片。

【讨论】:

感谢您的想法(以及 API 上的出色工作),只是为了清楚一点,当面对没有目标对象的图像时,单个类检测器的预期行为是什么?概率分数低?覆盖整个框架的边界框? 希望在这种情况下不会退回任何盒子:) 在我的情况下,添加负图像至关重要,因为我训练的对象与未注释的相似对象具有相似性。它将高置信度 FP 的数量减少到零。 ***.com/questions/45666499/…【参考方案3】:

我通过扫描基本事实、复制框区域和边距,然后将这些框区域的平铺粘贴到新的背景图像(保证没有对象)上,并使用框类别断言创建相应的 XML 文件,找到了成功.

我将非对象收集为“未分类”框 - 通常来自我最新模型输出中的故障。这些是平铺的(就像“is-objects”一样),但不会在 XML 文件中更新。

我制作各种规模的平铺来构建每个新的训练集。

这里有进一步的解释和示例 python 代码: https://github.com/brentcroft/ground-truth-productions

【讨论】:

以上是关于我应该包含 Tensorflow 对象检测 API 的负面示例吗?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow 对象检测 api:如何使用 imgaug 进行增强?

TensorFlow 对象检测 API 中未检测到任何内容

Tensorflow 对象检测 API 中的过拟合

Tensorflow 对象检测 API - 验证丢失行为

Tensorflow的对象分离api不工作。

在 TensorFlow 对象检测 API 中打印类名和分数