(1)输入图像预处理;
1、图像(三通道),每个像素点减去一个均值像素,默认为(102.9801,
115.9465, 122.7717);
2、缩放;根据插值法进行图像缩放,规则为:首先将图像最短边固定为600个像素点,最长边根据这个缩放比例进行相应调整,如果此时最长边大于1000个像素点,则将最长边固定为1000个像素,最短边根据长边的缩放比例进行相应的调整;(保证都不大于1000,也即长宽比<5:3)
(2)网络前向计算;
Faster
RCNN的检测过程,主要分为三部分(如下图):第一部分利用VGG网络结构进行基础的特征提取;第二部分是RPN网络,负责计算可能存在目标的区域(proposals)的坐标以及判断是前景/背景以及利用RPN网络得到的目标区域再经过ROIPooling层得到相同长度的特征向量;第三部分,最后经过两个全连接层接入softmax实现具体分类和更精确的回归坐标。整体结构如下图所示:
1、基础的特征提取网络结构(vgg16):
(我们需要处理的图像长宽比基本符合小于5:3,因此缩放后输入网络的大小通常为:(800,600,3))
2、RPN网络:
产生anchor
box
conv5_3对应的特征图大小为50×38,每个位置将产生9个不同尺度和长宽比的anchor
box,用于目标区域位置的计算。9个boxes的坐标为:array([
[ -83., -39., 100., 56.],
[-175.,-87., 192., 104.],
[-359.,-183., 376., 200.],
[-55., -55., 72., 72.],
[-119.,-119., 136., 136.],
[-247.,-247., 264., 264.],
[-35., -79., 52., 96.],
[-79., -167., 96., 184.],
[-167.,-343., 184., 360.]])
计算这些boxes在原图像上的实际坐标(从原图像到conv5_3的映射,其实就是缩小了16倍),保证conv5_3每个特征点位置对应原图像上9个boxes,如下图所示,在实际图像中包含的boxes个数为50×38×9。
rpn网络结构:
proposal(Python)层操作:rpn_bbox_pred得到四个数值,并不是实际的坐标值,而是4个修改量(boundingbox
regression),再根据上面计算的anchor
boxes对应在原图像中的坐标,就可以计算回归得到的实际坐标(bounding boxes):
得到实际坐标之后,会存在一些坐标超出图像边界,此时删除这类boxes.
接着根据余下的bounding
boxes对应的rpn_bbox_pred(是前景的概率)进行降序排序,根据设定的参数,提取概率较大的6000个box;然后根据nms(非极大值抑制,阈值设为0.7)再一次减小boxes的个数;最后再次根据前面的排序结果只留下300个box,用于后续的具体分类。
roi_pool5层:将proposal层产生的实际坐标值映射到relu5_3(conv5_3)层,在feature
map上产生不同区域大小的boxes,再经过ROIPooling操作得到固定长度的特征向量,我们这里固定为7*7,所以每个roi经过该层,都会得到数据大小为(channels(512),7,7),整体的数据格式为(num_rois,512,7,7)。
3、全连接网络结构:
从PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了2个操作:
1. 通过全连接和softmax对proposals进行分类,这实际上是深度学习的识别范畴了。
2. 再次对proposals进行bounding box regression,获取更高精度的rectbox。
网友评论