Object Detection系列(二) SPP-Net

作者:张 旭

编辑:黄俊嘉

该内容是目标检测系列的第二篇,第一篇请移步:

Object Detection系列(一) R-CNN

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就一样了。

如何共享卷积计算

在上面这个图中,说明了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一样,并为改进。 由于是多阶段训练,过程中需要存储大量特征。

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-12-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法原理与实践

循环神经网络(RNN)模型与前向反向传播算法

    在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。今天我们就讨论另一类输...

923
来自专栏张俊红

EM算法

总第82篇 01|概念及原理: EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计,或极大后验概率估计。EM算法的每次迭代分两步完成:E步,求期...

2486
来自专栏机器学习算法全栈工程师

循环神经网络(RNN)模型与前向反向传播算法

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。今天我们就讨论另一类输出和模型...

992
来自专栏机器学习原理

机器学习(13)——adaboostAdaboost

前言:下面介绍另外一种集成算法思想—boosting,提升学习(Boosting)是一种机器学习技术,可以用于回归和分类的问题,它 每一步产生弱预测模型(如决策...

3216
来自专栏自然语言处理

一起走进条件随机场1(NLP重点理论)

线性链的条件随机场跟线性链的隐马尔科夫模型一样,一般推断用的都是维特比算法。这个算法是一个最简单的动态规划。

611
来自专栏人工智能头条

小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)

2748
来自专栏机器学习算法全栈工程师

机器学习中Bagging和Boosting的区别

Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类...

34312
来自专栏磐创AI技术团队的专栏

使用Keras进行深度学习:(三)使用text-CNN处理自然语言(下)

前言:在上一篇文章中,已经介绍了Keras对文本数据进行预处理的一般步骤。预处理完之后,就可以使用深度学习中的一些模型进行文本分类。在这篇文章中,将介绍text...

3124
来自专栏AI研习社

手把手教你训练 RNN

在之前的文章中,我们介绍了 RNN 的基本结构并将其按时间序列展开成 Cells 循环链,称为 RNN cells。下面,我们将揭示单个 RNN Cell 的内...

1834
来自专栏YoungGy

ML基石_10_LogisticRegression

logistic regression problem Y是概率的情况 相同数据不同目标函数 logis假设集 logistic regression erro...

2065

扫码关注云+社区