取之于CSDN,还之于CSDN。话不多说,目标检测入门,搞起!
提到目标检测,不得不说的就是CNN系列,从R-cnn 到Fast R-cnn 再到Faster R-cnn。越来越完善,越来越优秀。
下面我们介绍目标检测入门第一弹---RCNN
目标检测任务:从一幅图像中,判断是否含有待检测目标,若是有返回其位置。(例:从图一中,检测这个缸体是否存在)
图一 缸体 (大小为100*100)
解决办法:1.一个简单的想法就是:建立一个神经网络模型,把整张图片传进去作为输入层,把输出层设为两类0/1。1代表是缸体,0代表不是缸体。 要是定位缸体位置的话,就将输出层设为缸体的左上角、右下角坐标。很简单,很轻松。
图二 多个缸体
那么问题来了,要是图片中待检测目标的数量不确定,不在是一个了(如图二)。有可能一个,有可能两个,有可能多个。这时神经网络可能我们就无法使用了。为什么不适用了呢?因为我们无法确定网络的输出,输出四个,还是八个,还是十六个?
大家注意,通过神经网络,我们能解决的是什么问题呢?当一幅图片中只存在一个待检测目标的时候,我们能够解决。那么我们可不可以将一幅图片分成不同的块,我们管它叫候选区域。我们对每一个候选区域,进行检测,是否就能够得到我们想要的结果了呢。答案是肯定的,如图三。我们将图片人为的划分成两部分,我们对每一个候选区域进行处理,分别使用神经网络,就能够得到我们想要的结果了。
图三 将一幅图片分成两部分
小伙伴可能会有疑惑,这个候选区域是怎么划分的呢,是如何生成的呢?那么下面,我们就来回答这个问题。
候选区域生成:最开始的候选区域,是通过滑动窗口的这种方式来进行生成。设置不同的滑动窗口尺寸,从左到右,从上到下生成候选框,这种生成候选框的方法是最全的,但是效率也是最低的。效率低不难理解,当有100个候选区域,就要启动100个神经网络。有1000个滑动窗口,就要启动1000个神经网络。为了检测效果好,我们希望候选框与目标尽量接近,大小接近,位置接近,所有我们会生成数以万计的候选框,效率自然底下。那么有没有什么办法,可以改进呢?
由此引出了,目标检测第一弹--RCNN的问世!
RCNN是如何解决这个问题的呢?RCNN没有采用滑动窗口生成候选框的方式,因为实在是太慢了。它采用了ss算法来进行候选框的生成。ss算法--Selective Search的缩写。通过图片的纹理特征,来进行候选框的生成。
摘取网上的一幅图片,从图片4中,我们可以看到通过纹理特征,得到的图片。这个根据不同的颜色信息,生成候选框。
图四 ss后得到图片
这样,比之采用滑动窗口的方式生成候选框,数量大大减少,且准确率也没有降低。当我们取得候选框后,RCNN针对每一个提取的候选框,通过卷积进行特征提取,最后采用svm分类,来完成目标检测任务。
RCNN 整体流程示意:
1.输入待检测图片
2.通过ss算法生成候选框
3.卷积提取特征,SVM分类
示意图:
1.输出图片
2.候选框
3.卷积提取特征、SVM分类