这篇文章的内容总结翻译自 A Step-by-Step Introduction to the Basic Object Detection Algorithms (Part 1) ,文中有加入自己的理解。
当你想要在杂乱的桌子上面寻找钥匙的时候,是不是有想过要是有种东西可以直接告诉我钥匙放在哪里就好了?如果一个算法可以在几毫秒之内就帮我们找到钥匙,那就好了。
目标检测算法就像这样的一个「超人」。目标检测被运用到了越来越多的场景上,从日夜不停工作的监视器到智能城市的实时车辆检测。这就是深度学习的强大之处。
在这篇文章里面,我们会看看各种可以用来做目标检测的算法。我们从 RCNN 系列开始,从 RCNN、Fast RCNN 到 Faster RCNN。(在随后的文章里面可能会讲到 YOLO、SSD 之类的)
原文作者附上了一篇关于「目标检测」的文章,感兴趣的朋友可以前往看看,现在就让我们开始来看看 RCNN 的「家族史」吧!
1. 解决目标检测任务的简单方式
下面的图展示了目标检测任务是怎么工作的。在图中的每一个物体,从人到风筝都会被定位和识别,并且会给我们一个置信度,即计算机认为的所识别到的物体的可能性。
先来看看被使用最广的最简单的目标检测深度学习算法 —— 卷积神经网络,CNNs。
下图告诉了我们 CNN 在内部是如何工作的。
我们给网络一张图片,然后它会被传送到许多卷积层和池化层上。最后给我们一个所识别到的物体的类别。
每输入一张图片,我们就会得到一个相对应的类别作为输出。那么我们可以用这样的方法来检测一张图片中的多个目标吗?当然可以啦。来看看怎么使用 CNN 解决一个普通的目标检测问题:
- 首先,把一张图片作为输入:
- 然后把图片分成几个区域:
- 这样一来就可以把每个区域都当作是一个独立的图片;
- 然后你知道的,就是这些独立的区域放进 CNN 里面,对它们进行分类;
- 当所有的区域都分类好了,我们就可以把它们合起来,得到带有检测目标的原始图片:
这样做怎么看都是有问题的是吧,你看上图的框实在太大了,我们看不出它框出了什么出来。直接把图片分成几个简单的区域太粗暴了。我们知道图片中的物体大小和位置都是不一样的,直接分肯定会出现框不全的情况。
物体的大小位置和形状都是多变的。如果我们想要框更加适合,就要适当地增加框的数量,也就是把图片分成更多更小的部分,而不是 4 个大区域。但是这样会导致计算时间成倍地增加。为此我们需要一个更好的方法,那就是基于区域的 CNN(Region-based CNN, RCNN)。基于区域就是使用生成区域建议的方式来选择区域。区域建议又是什么?再接下来看看吧。
2. 理解基于区域的卷积神经网络(RCNN)
RCNN 算法可以为一张图片提供较少的选框,然后检查这些框中有没有包含物体。选框的方式是根据选择性搜索(selective search)来进行的,这些选框就叫做区域,也叫做 regions.
先来看看什么叫做选择性搜索,以及它是如何去识别不同的区域的。基本上一个物体中会包含四种信息:不同的尺度、颜色、纹理和边界。选择性搜索的方法就是识别这些模式,然后提出不同的区域。来看看它的过程:
首先当然就是先输入图片了:
然后,先生成最初的子分割,看起来像下面这样子。因为一开始分割得很细,整张图片感觉面目全非了,很复杂,那接下来的任务就是化小为大了。
把小块区域合并成大块的区域依据的方法就是,按照颜色相似度、文理相似度、大小相似度和形状兼容性来完成的。其实就是上面说的物体的四个特性:
最后生成的区域就是物体在图片中的定位了,也就是所说的感兴趣区域(Region of Interest).
那下面来看看一个 RCNN 检测时的步骤有哪些:
- 首先准备一个预训练的卷积神经网络;
- 然后再重新训练这个模型,但是只训练最后的层,也就是微调(fine tune),训练的类别就是我们想要检测的类别;
- 第三步,得到每一张图片的感兴趣区域,把所有的区域都改变成同样的大小,可以输入到 CNN 中;
- 得到区域后,训练 SVM 来分类物体和背景(在目标检测当中需要对一个 ROI 判断其属于目标还是背景)。对于每一个类别,我们都会训练一个二分类 SVM;
- 最后,为了使得生成的框更加精确,会训练一个线性回归模型让生成的 Bounding Boxes 更加贴近物体。
来看看图片的过程,更加有助于理解!
这就是第一步,输入图片:
使用一些区域建议方法来得到 ROI,选择性搜索是区域建议方法的其中一个:
然后这些区域就会被 reshape 成 CNN 输入的大小:
CNN 就提取每一个区域的特征值,然后 SVM 就来对这些区域进行分类:
最后,边界框回归(Bounding box) 就预测生成的框:
RCNN 就这样来检测目标的。
3. RCNN 的不足
到目标为止讲的 RCNN 确实可以检测目标了,但是却存在很大的问题:
- 首先它对于每一张图片都会生成 2000 个 ROI;
- 对每一张图片都进行一次区域建议,如果有 N 张图片,那就是 N*2000 个了;
- 整个过程用了三个模型:用于特征提取的 CNN、识别物体的线性 SVM 和调整边界框的回归模型。
这些过程使得 RCNN 变得非常的慢,预测一张图片就花去了 40 到 50 秒的时间,这个时间确实等不起,如果遇到更加大的数据量时,网络就根本处理不来,所以一开始的 RCNN 是很慢的,但是在接下来的 Fast RCNN 和 Faster RCNN 里面,改进了很多,我会在下一篇文章为大家讲讲这两个表现更好的网络。
更多精彩:
1. 目标检测技术演进:Fast R-CNN、Faster R-CNN
2. 胶囊网络的简单介绍
3. Apple 新产品中的机器学习算法
如果你想了解更多关于人工智能的资讯,欢迎扫码关注微信公众号以及知乎专栏 「译智社」,我们为大家提供优质的人工智能文章、国外优质博客和论文等资讯哟!