本文跟着数据流动,从每一步分析Faster RCNN的原理。
看完可能要花上10分钟.
---------------------------------------------------------
原理:是技术实现的逻辑抽象。
-
数据输入的resize
-
卷积层的特征计算(卷积操作、padding~补0)
-
再到RPN(anchor、分类、回归)
-
ROI-Pooling
-
全连接层(flatten)
-
最终回归、分类
-
Loss计算
-
梯度传播
-
SGD
以上9点用能明白数据流动过程中的变化,就说明逻辑已经能抽象出来,每一个都能解释通。下面一点点来分析数据流动、变换。
1、对输入数据的处理
输入数据是一个batch,在代码上是一个Blob块。faser首先计算:设置最小边/短边=scale。然后计算:长边*scalle。如果小于max_size=1000,就采用这个scale,对图像进行等比缩放,把短边放到600,长边等比例缩小一点。如果大于max_size=1000,则重新计算scale=max_size/长边。同样进行等比缩放。这是对每一个图像的处理。最后batch个图像组成blob块,作为网络的输入。对于Blob,不够补0(黑边)
以上。
2、卷积层计算
【卷积核 】blob大小每一个Batch可能是不一样的。因为图像resize后的大小不一样。所以feature大小不一样,神经元个数也不一样,连接总数也不一样。但是,因为cnn是权重共享的,使得他可以接受任意尺寸的输入,每一个feature不管大小怎么变,都是由一个固定大小的神经元模板计算得到,这个模板就是卷积核。不管是40*40还是20*20的feature,每一个神经元的连接都是同一个卷积核的参数。这说明2点:卷积层可以接受不同大小的输入以处理而不报错;卷积层的权重,是卷积核里的参数。问题:梯度到这里怎么更新的?
ceil (H = ( 长 - 卷积核大小+1) / 步长)
ceil( W = ( 宽 -卷积核大小+1) / 步长 )
【特征图计算】25*25的计算和25*27的计算方式一样,都是按单边算,然后相乘。当输入不能够被卷积核与步长完美的走一遍,就会有padding问题:假设走到了边上,但只有一列数据,卷积核是两列的,那么就会无法计算,如果不用padding,就停止,不往下计算了,如果用Padding就补0,使得剩下的部分被计算,feature则会大一点。加入了padding之后,feature map大小计算公式修正如下:
ceil H=(长+2*pad-卷积核大小)/步长
ceil W=(宽+2*pad-<