目标检测
今天我们来聊一聊目标检测,那么首先什么是目标检测?其实目标检测是由两个任务组成的,一个是识别,就是将图片中出现物体所属类别识别出来,另一个是检测,就是在确定物品所属种类后将物体所在位置检测出来。
主要说两种目标检测,区域神经网目标检测和单发多框目标检测,会分享一些有关这些目标检测主流的实现。
-
区域神经网络目标检测
- R-CNN
- Fast R-CNN
- Faster R-CNN
- Mask R-CNN
-
单发多框目标检测
- SSD
- YOLO
我们是将图像以像素的形式保存输入给计算机,具体来说 x 和 y 表示每一个像素位置信息。这样一来计算机得到图像信息就很少,需要自己通过读解图像以获得更多的信息。
- 分类任务: 将图像结构化为某一类别的信息,用事先定好的类别来描述图片。这个任务相对比较简单,也是深度学习最先突破实现的任务。在深度学习中是通过卷积和池化层不断将空间上的信息压缩到具有类别维度的类别空间上来实现对图像的分类,具体应用如人脸识别和场景识别等。现在更多情况是作为其他任务的基础任务来使用。
- 目标检测: 在分类任务中,通常图片中出现目标单一或者主题单一,所以分类任务关心是图像的整体,只要给出图片内容描述即可。而目标检测相对于分类就要复杂得多。对目标描述不仅限于类别还需要给出位置信息。而且目标也不再单一,可能是一系列感兴趣的目标列表。
- 分割: 分割做的事情和目标检测做的事情差不多,不同的是分割不是用方框将目标位置表示处理,而是用多边形线将物体的边缘表示出来。分割分为语义分割(semantic segmentation)和实例分割(instance segmentation)两种,分割是对每一个像素所属类别进行打标签,所以在分割任务上数据集准备要相对大一些。
目标检测
首先目标检测输入一张图片,然后输出是一个列表,列表中每一条数据包括目标两个方面信息:类别和位置。好首先明确这些我们就去找算法如何将他们之间关系。其实就是回答目标是什么,目标在哪这两个问题。目标是什么属于分类问题,目标在哪就难了,需要通过坐标表示出来其位置,说到数值问题,大家可能自然会想到回归问题。
这里用一些简单话来把这件事说一下,我们就是将图片切分成许多大小不同区域,然后观察这个区域是否有我们想要找的目标。如果是,那么也就是说明这个图像区域置信度高,然后就是分类问题来识别这个区域是什么东西,接下来通过调整区域大小,缩小一些或者扩大一些来合适框住我们想要物体。其实看起来很简单,但是目标识别就是基于这个做法来进行目标识别,只是关于图片区域的选取做的越来越巧妙,越来越抽象而已。
根据找候选区域和进行识别是先后来做还是一起来做可以将目标检测分为 SSD 单发检测模型和 two-stage 检测模型两种。
在开始之前我们先明确一些概念,对于概念这里只需要简单了解一下即可,随着随后深入学习大家可能会了解更多
- 候选框(region proposals)
- 锚框 (anchor box)
- 边界框 bounding box: bounding box 是框住物体边框
基于区域卷积神经网
这一次我们并不是把整张图片输入到神经网络,而是将图片切分为一个区域和一个区域逐一输入到神经网络,这样做好处是我们可以得到目标位置信息。那么如果我们根据位置和大小来遍历一张图片,这样显然是行不通,因为这样计算量太大。所以有关区域选择是有技巧,可以借助类似聚类这样算法来启发式进行区域生产。然后我们卷积需要输入一个长宽固定大小正方形的图片,所以有了候选框我们还需进行 resize 处理。最后再输入神经网进行分类。好接下来基于区域卷积神经网络都是遵循这些步骤进行的,只是具体实现这些步骤方式不同而已。
R-CNN(Region CNN)
早在 R-CNN 出现之前人们都是在使用 HOG 技术来进行简单目标识别,HOG 能够识别任务比较简单,局限性也很大,对于输入图像具有一定要求。R-CNN 早出现 2014 年,虽然今天在目标检测任务时,已经几乎没有人再去选择 R-CNN 来完成目标检测任务,但是在当下流行的模型中看到其身影,因为他给我们留下如何去做目标检测这件事的大概思路。
在 R-CNN 中,候选框提取是用 CNN 卷积,之前如果已经了解过了 fine-tuning ,那么就不难理解如何使用 CNN 来提取候选框。fine-tuning 技术适用一些小样本,也就是样本数量不多情况时。我们将一些基于 imageNet 这样大规模数据集训练出的经典网络的最后一层去掉,保留之前所有层来获取特征层,这些特征层可以看作一个一个区域。现在损失函数不仅单单考虑分类正确性还需要考虑候选框的位置的损失值。
r_cnn_bbox_002.jpg我们可以思考一下,这里对于分类问题为什么不用 softmax 而是用 SVM 去做单分类。
r_cnn.png在 R-CNN 中的,在 RCNN 中候选框的选择使用的方法是 selective search。selective search 生产的候选框方案是根据相邻像素颜色或 pattern 进行聚类选择候选框,然后将候选框压缩为方形(warped region)。然后选择分类器 SVM 进行分类。SVM 是一个单分类 SVM 对于所有分类都需要进行一次分类任务。如果我们有 10 分类,那么对于每一个候选框就需要跑 10 次 SVM。
r_cnn_001.pngFAST R-CNN
每张图片要生产大概 2000 个区域,然后对每一个区域进行一次预测。那么也就是在 R-CNN 要进行几乎 2000 次的 forward,这也是 R-CNN 慢的问题,在 R-CNN 也就是先由 selective Search 从图片生产大概 2000 个候选框,然后对每一个候选区域进行 CNN。所以在 2015 年出现了 FAST R-CNN ,FAST R-CNN 是在 R-CNN 基础上变得更简单更快。主要优化工作是先对图片进行 CNN 然后在 CNN 上进行 selective Search 进行生产候选框,再去做分类和bbox回归工作。
我们之前候选框进入 CNN 之前进行一次 resize 再进入 CNN,但是在 FAST R-CNN 是先做卷积然后在生产候选框,这样就带来问题,因为在卷积中做 resize 是没有求导的,所以引入 RoI Pooling ,作用
R-CNN 的耗时原因是 CNN 是在每张图片的每一个 proposal 上单独进行的,没有共享计算,便提出将基础网络在图片整体上运行完毕后,再传入 R-CNN 子网络,共享了大部分计算,故有 Fast 之名。
fast_r_cnn_roi_001.pngRoI
我们现在简单解释一下 RoI pooling 作用,我们是将 selective research 提取出的候选框在输入 CNN 前进行一次大小调整,将这些区域 resize 为长宽等长的方形后再输入 CNN,现在我们是在 CNN 中直接做 selective research 了,所以如何对这些候选框进行调整尺寸呢?因为在卷积中进行 resize 后我们就没有办法对卷积求导了,所以这里使用了一种类似 max pooling 技术,就是通过 max pooling 在对区域进行缩放时保留该区域的最大值作为其值,下面图掩饰 RoI pooling 的整个过程。
fast_r_cnn_roi_003.gif最近的项目涉及到目标检测,有关目标检测我们还需要进一步探讨研究,经过一段紧张和学习也沉淀下来一些关于目标检测的一些知识。准备先给出一些概念然后给大家一些代码实现,实现主要基于 pytorch 来实现目标检测。
FASTER R-CNN
Faster R-CNN 的改进的点就是用 RPN(Region Proposal Network) 的技术来取代了 selective Research 生产候选框。这是因为 selective Research 对于我们基本属于黑盒,因为其中技术过于复杂,复杂就可能影响到生产候选框的速度,所以有必要对其进行简化。那么有什么好的办法能够代替 selective research 来生产候选框呢?也就是我们 RPN 来取代 selective research 技术生产候选框。
faster_r_cnn_anchor_box.png(如图)具体做法是,我们以每一个像素为中心来生产一系列不同尺寸,不同长宽比例的锚框(anchor box),这里叫锚框原因可能是这些框是从一点生产出来的,所以叫做锚框。将这些生产的框到 CNN 层投入 softmax 和 bbox reg,softmax 是用于判定该框是否属于背景,是一个二分类器,而 bbox reg 是对锚框进行回归。得到 2k scores 也就是 2k 候选框的置信度,也就是表示候选框是否为背景,4k 表示我们给 2k 框每一个框两个坐标点,得到候选框同样会输入到 RoI 进行调整候选框的大小。
网友评论