自定义对象检测实际上是如何工作的?

How does custom object detection actually work?

我目前正在使用 Tensorflow API 测试自定义对象检测。但我似乎不太了解其背后的理论。 因此,例如,如果我下载一个版本的 MobileNet 并使用它来训练,比方说,红色和绿色的苹果。它会忘记所有已经接受过训练的东西吗?如果是这样,为什么使用 MobileNet 比从头开始构建 CNN 更有利。

感谢您的回答!

对象检测背后的主要概念是它将输入图像划分为 N 个块的网格,然后对于每个块,它生成一组具有不同纵横比的子块,假设它生成 M 个矩形子补丁。总共需要对 MxN 个图像进行分类。

一般来说,想法是分析每个补丁中的每个子补丁。您将子补丁传递给模型中的分类器,根据模型训练,它会将其分类为包含绿色 apple/red apple/nothing。如果被分类为红苹果,那么这个子patch就是检测到的物体的bounding box。

所以实际上,您感兴趣的有两个部分:

  1. 生成尽可能多的子补丁以覆盖尽可能多的图像部分(当然,子补丁越多,你的模型就越慢)并且,
  2. 分类器。分类器通常是一个已经存在的网络(MobileNeet、VGG、ResNet……)。这部分常用作“backbone”,它会提取输入图像的特征。使用分类器,您可以选择“从零开始”训练它,因此您的权重将根据您的特定问题进行调整,或者,您可以从其他已知问题加载权重并将它们用于您的问题,这样您就不需要花时间训练他们。在这种情况下,他们还将对分类器训练的对象进行分类。

看看the Mask-RCNN implementation。我发现他们如何解释这个过程非常有趣。在此架构中,您不仅会生成边界框,还会分割感兴趣的对象。

Does it forget all the things that is has already been trained on?

是的,如果您使用包含较少 类 的新数据库重新训练之前在大型数据库上训练的 CNN,它将“忘记”旧的 类。然而,旧的预训练可以帮助学习新的类,这是一种称为“微调”的“转移学习”的训练策略,具体取决于具体方法。

根据经验,从头开始创建新的网络架构通常不是一个好主意,因为更好的网络可能已经存在。如果出现以下情况,您可能希望实施自定义架构:

  • 您正在学习 CNN 和深度学习
  • 您有特定需求,并且证明其他架构不适合或性能不佳

通常,人们会采用现有的预训练网络并使用迁移学习将其专门用于特定任务。

如果您想学习,可以在线免费获得大量科学文献。检测网络可以从Yolo系列和R-CNN、Fast-RCNN和Faster-RCNN入手。