使用迁移学习在 TensorFlow Mask-RCNN 对象检测框架中减少误报的最佳方法是什么?

机器算法验证 神经网络 张量流 物体检测
2022-03-28 11:23:51

我正在使用掩码 rcnn 训练单个对象检测器,并且尝试了几种减少误报的方法。我从几千个带有边界框的对象图像示例开始,并对其进行了训练,得到了不错的结果,但是当在不包含该对象的图像上运行时,通常会得到高置信度的错误匹配(有时是 0.99)。

我尝试的第一件事是在配置文件中添加硬示例矿工。我相信我这样做是正确的,因为我添加了一个打印语句来确保对象被创建。然而,更快的 rcnn 的配置中没有一个有困难的示例挖掘。所以我怀疑矿工只能在 ssd 上正常工作。我希望通过一个困难的示例矿工有明显的改进,但我没有看到

我尝试的第二件事是添加“背景”图像。我在困难示例矿工配置中将最小负数设置为非零值,并添加了大量以前在训练中得到错误检测的背景图像。我什至将这些图像添加到 tfrecords 文件中,以便它与确实具有对象的图像平衡。这种方法实际上让事情变得更糟——并且给了我更多的错误检测

我尝试的最后一件事是创建另一个类别,称为“对象背景”,并将所有错误匹配项分配给这个新类别。这种方法效果很好,但我认为它是一种 hack。

我想总结一下我的主要问题是 - 在当前 tensorflow 对象检测框架中减少误报的最佳方法是什么?SSD 会是更好的方法吗,因为它似乎在配置中默认内置了一个硬示例矿工?

谢谢

1个回答

我在网上看到的很多人都在使用 Tensorflow API 时遇到过同样的问题。我认为在家中使用带有自定义分类器的预训练模型的想法/过程存在一些固有问题。例如,人们希望使用 SSD Mobile 或 Faster RCNN Inception 来检测“带头盔的人”、“手枪”或“工具箱”等对象。一般过程是输入该对象的图像,但大多数那个时候,无论有多少图像...... 200 到 2000,当你在你的办公桌上实际运行它时,你仍然会得到误报。

当您在自己的上下文中显示对象时,对象分类器效果很好,但您最终会在卧室窗户、桌子、电脑显示器、键盘等日常物品上获得 99% 的匹配。人们提到了以下策略引入负面图像或柔和图像。我认为问题与大多数人使用的图像中的有限上下文有关。预训练模型在多种环境中使用十几个分类器进行训练,例如在一个示例中可能是街上的汽车。CNN 看到汽车,然后该图像中不是汽车的所有内容都是负面图像,包括街道、建筑物、天空等。在另一张图像中,它可以看到瓶子以及该图像中的所有内容,包括桌子,桌子、窗户等 我认为训练自定义分类器的问题在于它是一个负面图像问题。即使您有足够多的对象本身的图像,也没有足够的同一对象在不同上下文和背景中的数据。所以从某种意义上说,即使在概念上你不应该需要负面图像,也没有足够的负面图像。当您在家中运行该算法时,您会在各处发现误报,以识别您自己房间周围的物体。我认为以这种方式进行迁移学习的想法是有缺陷的。我们最终只是在网上看到了很多关于人们识别扑克牌、千年隼等的很棒的教程,但是这些模型都不能在现实世界中部署,因为当它看到任何东西之外的东西时,它们都会产生一堆误报它的图像池。最好的策略是使用多个分类器从头开始重新训练 CNN,并在其中添加所需的分类器。我建议使用 10-20 个预先存在的分类器重新引入 ImageNet 或 Pascal 的先前数据集,并添加您自己的分类器并重新训练它。