[Intensive Reading]目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享

2022-05-09 14:31:08 浏览数 (1)

目标检测系列:

目标检测(object detection)系列(一) R-CNN:CNN目标检测的开山之作

目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享

目标检测(object detection)系列(三) Fast R-CNN:end-to-end的愉快训练

目标检测(object detection)系列(四) Faster R-CNN:有RPN的Fast R-CNN

目标检测(object detection)系列(五) YOLO:目标检测的另一种打开方式

目标检测(object detection)系列(六) SSD:兼顾效率和准确性

目标检测(object detection)系列(七) R-FCN:位置敏感的Faster R-CNN

目标检测(object detection)系列(八) YOLOv2:更好,更快,更强

目标检测(object detection)系列(九) YOLOv3:取百家所长成一家之言

目标检测(object detection)系列(十) FPN:用特征金字塔引入多尺度

目标检测(object detection)系列(十一) RetinaNet:one-stage检测器巅峰之作

目标检测(object detection)系列(十二) CornerNet:anchor free的开端

目标检测(object detection)系列(十三) CenterNet:no Anchor,no NMS

目标检测(object detection)系列(十四)FCOS:用图像分割处理目标检测

目标检测扩展系列:

目标检测(object detection)扩展系列(一) Selective Search:选择性搜索算法

目标检测(object detection)扩展系列(二) OHEM:在线难例挖掘

目标检测(object detection)扩展系列(三) Faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3在损失函数上的区别

简介: 让卷积计算可以共享

在上一篇R-CNN的文章中,详细介绍了R-CNN算法,同时也说明了R-CNN的致命缺陷,超长的训练时间(84h)和测试时间(47s),造成这个问题的主要原因就是重复性的卷积计算,在R-CNN中,输入到CNN网络中的图片是ss算法提取到的区域,每一张待检测图都会产生1000-2000个区域,这也就意味着卷积计算要重复1000-2000次,但是由于ss算法提取到的区域本身就有很多重叠,所以这种重复计算是非常没有必要的。

那么能不能只通过一次卷积计算就完成整张图像的特征提取工作呢?这就是SPP-Net的主要贡献,也是在R-CNN之后的很多网络结构的统一目标——如何共享卷积计算。SPP-Net的论文是《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》。

SPP-Net原理

设计思路

SPP-Net主要改进有下面两个:

  • 共享卷积计算
  • 空间金字塔池化 在SPP-Net中同样由这几个部分组成: 1.ss算法 2.CNN网络 3.SVM分类器 4.bounding box回归

ss算法的区域建议框同样在原图上生成,但是却在Conv5上提取,当然由于尺寸的变化,在Conv5层上提取时要经过尺度变换,这是它R-CNN最大的不同,也是SPP-Net能够大幅缩短时长的原因。因为它充分利用了卷积计算,也就是每张图片只卷积一次,但是这种改进带来了一个新的问题,由于ss算法生成的推荐框尺度是不一致的,所以在cov5上提取到的特征尺度也是不一致的,这样是没有办法做全尺寸卷积的(Alexnet)。

所以SPP-Net需要一种算法,这种算法能够把不一致的输入产生统一的输出,这就SPP,即空间金字塔池化,由它替换R-CNN中的pooling层,除此之外,它和R-CNN就一样了。

如何共享卷积计算

在上面这个图中,说明了R-CNN与SPP-Net的区别,R-CNN的卷积神经网络的输入是ss生成的建议区域(经过尺寸的归一化),而SPP-Net的中的卷积神经网络的输入是整幅图,经过卷积特征提取后,在Conv5上做建议区域的提取。这里有一个问题是一张图经过卷积之后图像的尺寸会发生变化,那么在原图上生成的ss区域,没有办法直接扣在Conv5层上,所以需要做一下坐标变换,使之适应Conv5层的宽高尺寸。

坐标变换

在CNN中特征的宽和高发生变化是因为步长的选取,当步长选择为2时,图像的宽高尺寸会变为原来的一半,那么对于在建议区域内的一个点(x,y),对应的Conv5层上的位置(x’,y’),应该满足如下关系:

(x,y)=(S_x’,S_y’)

其中S为所有层的步长的乘积。

而又由于卷积过程中的padding问题,Conv5上的特征会更靠近图像的中心,个人认为这也是为什么左上角的点要做像素加1,右下角的点做像素减1:

左上:x’=(x/S) 1

右下:x’=(x/S)-1

空间金字塔池化

经过坐标变化之后,在原图上生成的区域建议框就可以映射在Conv5上,但是这样一来就有出现了新的问题,提取到的特征由于尺寸不一致,没办法送到全连接层,解决方法在上面就提到了—SPP:

上面这张图解释了SPP的原理,那么对于任意尺寸的输入,SPP可以将输入特征平均分为16份,4份和1份,并在每一份(Bin)上做Max pooling,同时特征的厚度保持不变,最后将这些特征串接作为全连接层的输入,如上图所示,假设特征的厚度为256,那么SPP后的特征长度(一维特征)就是(16 4 1)*256,于是维度就统一了。

SPP-Net训练与测试

SPP-Net的训练过程:

首先拿到在ImageNet预训练的AlexNet模型,用AlexNet计算Conv5层特征,根据ss生成的区域建议,从Conv5上提取到对应的SPP特征,用提取到的特征finetune全连接层(把AlexNet当做分类模型来训练)。

AlexNet训练好之后,用fc7层的特征训练SVM分类器,用SPP特征训练bounding box(这里和R-CNN一样了)。

SPP-Net的测试过程:

首先在一张图片上用训练好的AlexNet网络提取整张图片的Conv5和fc7层特征,同时在图片上用ss算法生成1000-2000个区域建议,将区域建议框坐标变换之后在Conv5上提取SPP特征,fc7层特征送入SVM做类别的预测,SPP特征送入bounding box做边界框的修正。

SPP-Net性能评价

上面这张图说明了下SPP-Net与R-CNN的性能对比,其中训练时间SPP-Net需要25个小时,而R-CNN需要84小时;单张图片的测试时间SPP-Net只需要2.3s,而R-NN需要47s,这就是共享卷积计算带来的速度上的提升,也是SPP-Net最重要的贡献;最后一个指标,SPP-Net的mAP相比R-CNN反而更低了,这是因为SPP-Net的结构无法fintune卷积层。

SPP-Net的问题

最后,通过上面的性能评价可以看到,SPP-Net在速度上有大幅的提升,其所提出的共享卷积计算的思想在后续的Fast R-CNN与Faster R-CNN中都在沿用,但是从SPP-Net的训练过程可以看出,它是无法finetune卷积层的,这个问题在Fast RCNN中通过多任务损失函数与Roi Pooling提出得以解决。

SPP-Net的训练过程依然是一个多阶段的训练,这一点和R-CNN一样,并没有改进。

由于是多阶段训练,过程中需要存储大量特征。

0 人点赞