关于ss、rcnn的细节
前言
今天复习了一遍 R-CNN,Faster-RCNN,有一定的新收获,记录关于ss、rcnn的新的理解
(End-to-End、RPN、SVM…)
行人检测有两种方向,传统算法和基于深度学习算法。传统算法的典型代表有Haar特征+Adaboost算法,Hog特征+Svm算法,DPM算法。而基于深度学习的行人检测典型代表有RCNN系列,YOLO系列和SSD系列。其中RCNN系列算法是现在使用的最广泛的基于深度学习的行人检测算法。
在说行人检测之前不得不说一下目标检测。行人检测是目标检测下的一个分支,其检测的标签是行人。我理解的目标检测是准确地找到给定图片中对象的位置,并标出对象的类别。目标检测所要解决的问题是目标在哪里以及其状态的问题。但是,这个问题并不是很容易解决。姿势不合理,对象出现的区域不确定,更不用说对象也可以是多个类别。基于传统算法的目标检测有 Haar特征+ Adaboost算法,Hog特征+ Svm算法和 DPM算法,此类由于效率不高或效果不好,它现在没有被广泛使用。用的比较多的主要是RCNN,spp- net,fast- rcnn,faster- rcnn;YOLO系列,如YOLO和YOLO9000;除此之外还有SSD,ResNet等
目标检测,那么就要检测出种类,同时还要检测出它在图像中的位置,在RCNN中,分类和定位是分开来进行的。
一、Selective search
对于候选框的位置确定问题,简单粗暴的方法就是穷举或者说滑动窗口法,但是这必然是不科学的,因为时间和计算成本太高,直观的优化就是假设同一种物体其在图像邻域内有比较近似的特征(例如颜色、纹理等等)。
由此提出使用比较广泛的Selective search算法
Selective search算法(以下简称ss算法):首先通过以及简单的聚类生成区域集合;然后根据定义的相似度不断合并相邻区域构成新的候选框。本质上是一种基于在原始聚类后的区域集合上,依照邻域的相似度,从小到大的进行滑动窗口。
具体算法实现步骤如下:
step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R(新集的产生方式是bbox,即取外接矩形)
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空、
区域相似度:颜色、纹理、尺寸、交叠。
最终生成1~2k个候选区域
需要注意的是:ss算法没有训练可言,它只是简单的图像处理
二、RCNN的过程分析
RCNN(Region with CNN feature)是卷积神经网络应用于目标检测问题的一个里程碑的飞跃。CNN具有良好的特征提取和分类性能,采用RegionProposal方法实现目标检测问题。
算法可以分为三步
(1)候选区域选择。
(2)CNN特征提取。
(3)分类与边界回归。
上图:
接下来详细介绍一下每一个过程是怎么实现的。
(1)候选区域选择:区域建议Region Proposal是一种传统的区域提取方法,基于启发式的区域提取方法,用的方法是ss,查看现有的小区域,合并两个最有可能的区域,重复此步骤,直到图像合并为一个区域,最后输出候选区域。然后将根据建议提取的目标图像标准化,作为CNN的标准输入可以看作窗口通过滑动获得潜在的目标图像,在RCNN中一般Candidate选项为1k~ 2k个即可,即可理解为将图片划分成1k~2k个网格,resize成一样大小(使得能送进CNN进行特征提取),之后再对每个网格进行特征提取或卷积操作,这根据RCNN类算法下的分支来决定。然后基于就建议提取的目标图像将其标准化为CNN的标准输入。
(2)CNN特征提取:标准卷积神经网络根据输入执行诸如卷积或池化的操作以获得固定维度输出。在进行特征提取之后,特征映射被卷积核汇集以获得输出。
(3)分类与边界回归:实际上有两个子步骤,一个是对输出向量进行分类(分类器需要根据特征进行训练); 第二种是通过边界回归框回归(缩写为bbox)获得精确的区域信息。其目的是准确定位和合并完成分类的预期目标,并避免多重检测。在分类器的选择中有支持向量机SVM,Softmax等等;边界回归有bbox回归,多任务损失函数边框回归等 。
(其实这个图比论文中的图更加准确,CNN特征提取后,是先对框内的物体进行分类,当确定了proposal里面确实有要检测的物体后再进行Bbox Regression)
在整个RCNN中,候选区域选择以及CNN特征提取都是无法通过最终检测结果的反馈来进行学习优化的,只有SVM能够进行学习优化。
SVM本质是做二分类的,而RCNN中是做多分类,那就把多分类改成多个二分类即可。(对应流程图中的SVMs)
RCNN并不是一个端到端的网络,进一步说他不属于DNN,它还是属于传统的机器学习算法。