通过卷积神经网络从图像中提取前景对象到 运行

Extracting foreground objects from an image to run through convolution neural net

我是计算机视觉和图像识别的新手。对于我的第一个 CV 项目,我正在开发一种工具来检测图像中的苹果(水果)。

我目前有: 我在 Python 中使用 tensorflow 开发了一个卷积神经网络来确定某物是否是苹果。缺点是我的 CNN 仅适用于苹果是图像中唯一对象的图像。我的训练数据集类似于:

我想要实现的目标:我希望能够检测图像中的苹果并在其周围放置边框。然而,这些图像会充满其他物体,就像这张野餐图像中的那样:

可能的方法:

  1. 滑动Window:我会将我的照片分解成更小的图像。我将从左上角的大尺寸 window 开始,然后向右移动一个步长。当我到达图像的右边界时,我会向下移动一定数量的像素并重复。这实际上是一个滑动 window,这些较小的图像中的每一个都将 运行 通过我的 CNN。 window 大小会越来越小,直到找到一个苹果。这样做的缺点是,我会 运行 通过我的 CNN 处理数百张较小的图像,这需要很长时间才能检测到一个苹果。此外,如果图像中没有苹果,就会白白浪费很多时间。

  2. 提取前景对象:另一种方法可能是从图像中提取所有前景元素(也许使用 OpenCV?),然后 运行通过我的 CNN 处理这些对象。
    与滑动 window 方法相比,我会 运行 通过我的 CNN 使用少量图像而不是数百张图像。

这是我能想到的两种方法,但我想知道在速度方面是否有更好的方法。滑动 window 方法最终会奏效,但是要获得苹果的边框 window 需要很长时间。

如果有人能给我一些指导(也许我完全走错路了?),link 阅读 material 或一些提取代码示例,我将不胜感激前景元素。谢谢!

更好的方法是使用 Single Shot Multibox detector (SSD), or "You Only Look Once" (YOLO)。在设计这种方法之前,通常按照您在问题中建议的方式检测对象。

有一个 python SSD 实现是 here。 YOLO 实现中使用了 OpenCV。您可以为 Apple 重新训练网络,以防当前版本无法检测到它们,或者您的项目需要您从头开始构建系统。