(菜鸡一枚,记录一些学习的体会,并记录了学习时提出的问题,便于自己再次查阅,若有错误之处,希望大佬们指正,谢谢。)
R-CNN简介:
时间:2014年;地点:CVPR ;进步性:(1)选择了新的特征提取方式:CNN(AlexNet 2012年提出),之前一般使用人工选取的特征,这次是里程碑的把CNN成功运用起来;(2)图像分割与候选框的选取,采用SS算法(selective search),而不是采用以前暴力的滑窗形式。
R-CNN工作的三大步骤:
一、 selective search 提取出候选区域
目标:提取出2000个候选区域
图像分割一般有两种方法:Exhaustive Search 与 Region Proposal两种方式,R-CNN采用的是 Region Proposal中的selective search。
selective search的步骤:1、基于图的图像分割:采用贪心原则,对图像进行像素点合并,合并原则类似于KNN的方式,寻找最近的点或者是小区域合并,直到图像区域大于X(设定)的像素点。存储在集合S{ x1 x2 x3........xn}中 。(S{}是一个dist的类型,记录了每一个元素的lables,rect, pixel size ) 2、自底向上,选择相似度最高(尺寸、颜色、纹理等)的两个元素合并,并记录到R[t]中(作为一个候选区域),再从S{}中除去新合并的子集 3 、再执行step1,直到S变为一个空集合。 最后方得到建议的区域。
二、CNN 特征抽取
目标: 提取出2000个候选区域的特征
采用Alexnet结构,每个候选区域可提取4096维特征向量。
Alexnet的特点:五个卷积层+三个池化层+ 三个全连接层
注意:SS算法输出的候选框的大小不一,而R-CNN的做法则是直接将候选框暴力的“拉扯”为224*224的像素大小,然后输入到CNN当中,这样会损失图像的信息,在后来的Faster R-CNN通过其他方法可以解决这一问题。
三、SVM 支持向量机 + 回归器修正
使用21个SVM分类器,对2000个预选框(每个proposal region 有4096维特征)的特征向量进行分类,(寻找出每一类的超平面)。选取得分较高的RP进行非极大值抑制(Iou),剔除掉重复的框,再将剩余的20类别的RP送到回归器修正(定位精度得到提高),最后得到修正后的BBOX。
20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
回归器:形象的来讲,当我们去识别一个人的时候,首先回去看他的头,然后在将我们的视野扩大,将他的整个人放入视野之中,回归框的作用就是进行视野的平移和缩放。比如对人进行识别定位,我们并不知道算法时怎么识别一个人的,也许是一个头,也许是双脚,若判断出人的RP只是人的上半身,那这个PR的框显然是不够精确的,那么我们可以根据上半身的长宽来推断整个框应该在生么位置,也就是一个线性变化。回归框的训练就是要找到这个线性变化的参数。
学习途中的问题详解:
Q1:
selective search 是如何合并得到2000个图像的?为什么最后没有合并为一个整体的图,而是一个一个的小块?
SS算法在每一次合并都会讲合并的块保存下来,作为一个RP(候选区域)(最后一个RP便是整张图像),所以它相当于是一种分层提取,可以将图像中的层次信息(遮掩关系)读取出来。
Q2:
激活函数是如何接入到CNN中的,具体起到了什么样的作用?不同的激活函数的作用与区别是什么?
sigmoid 是由贝叶斯公式演变而来(根据不同的值来反推出概率),一般情况下:sigmoid会接在卷积结构的后面,把每个结果变成相应的概率
RELU:只用激活函数,是因为可以使整个模型非线性化,若没有它,就会变回Perceptron,sigmoid有一定的缺点,比如: 1、计算量上,计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。 2、训练:sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。
Q3:
卷积核的通道数如何理解,怎么进行计算?
前一层的卷积核的数量,决定了下一层feature map的通道数。