博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度学习目标检测(object detection)系列(二) SPP-Net
阅读量:5898 次
发布时间:2019-06-19

本文共 2247 字,大约阅读时间需要 7 分钟。

SPP-Net简介

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

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

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

1.共享卷积计算
2.空间金字塔池化

在SPP-Net中同样由这几个部分组成:

ss算法
CNN网络
SVM分类器
bounding box

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

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

如何共享卷积计算

深度学习目标检测(object detection)系列(二) SPP-Net

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

坐标变换

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

(x,y)=(Sx’,Sy’)

其中S为所有层的步长的乘积。
而又由于卷积过程中的padding问题,Conv5上的特征会更靠近图像的中心,个人认为这也是为什么左上角的点要做像素加1,右下角的点做像素减1:
左上:x’=(x/S)+1
右下:x’=(x/S)-1

空间金字塔池化

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

深度学习目标检测(object detection)系列(二) SPP-Net

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

SPP-Net训练与测试

深度学习目标检测(object detection)系列(二) 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性能评价

深度学习目标检测(object detection)系列(二) 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一样,并为改进。

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

转载于:https://blog.51cto.com/13934153/2175507

你可能感兴趣的文章
mysql-mmm-2.2.1安装手册
查看>>
奥运主题游戏《阿翔 跨栏》已经发布成功
查看>>
bzoj 1070: [SCOI2007]修车
查看>>
搭建yum源服务器
查看>>
delphi使用ado导出excel
查看>>
分布式开放消息系统(RocketMQ)的原理与实践
查看>>
hdu5739Fantasia(多校第二场1006) 割点+逆元
查看>>
linux 命令详解 二十三
查看>>
escalation 限制Nagios报警次数
查看>>
IT职场人生系列之二:大学生活
查看>>
4.一对多关联映射
查看>>
十种贵人,四种朋友,遇到千万别放手!!
查看>>
Gitlab 6.3.1默认仓库路径修改
查看>>
php-fpm的max_chindren的一些误区
查看>>
libtool: install: error: cannot install `libaprutil-1.la' to a directory
查看>>
Sring a和String b的值相同,是不是指向同一个地址呢
查看>>
Linux命令-uptime
查看>>
笔记本电脑电池保养
查看>>
网页基础编程第二章
查看>>
oracle 删除外键约束 禁用约束 启用约束
查看>>