一、SPP-net原理理解

针对卷积神经网络重复运算问题,2015年微软研究院的何恺明等提出一种SPP-Net算法,通过在卷积层和全连接层之间加入空间金字塔池化结构(Spatial Pyramid Pooling)代替R-CNN算法在输入卷积神经网络前对各个候选区域进行剪裁、缩放操作使其图像子块尺寸一致的做法。

利用空间金字塔池化结构有效避免了R-CNN算法对图像区域剪裁、缩放操作导致的图像物体剪裁不全以及形状扭曲等问题,更重要的是解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。

算法流程:

1)区域提名:用Selective Search从原图中生成2000个左右的候选窗口,这一步和R-CNN一样;
2)区域大小缩放:SPP-net不再做区域大小归一化,而是缩放到min(w, h)=s,即统一长宽的最短边长度,s选自{480,576,688,864,1200}中的一个,选择的标准是使得缩放后的候选框大小与224×224最接近;
3)特征提取:利用SPP-net网络结构提取特征:把整张待检测的图片,输入CNN中进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量;
4)分类与回归:类似R-CNN,利用SVM基于上面的特征训练分类器模型,用边框回归来微调候选框的位置。
创新点:

1)利用空间金字塔池化结构;
2)对整张图片只进行了一次特征提取,加快运算速度。

金字塔池化结构

金字塔池化就是把原来的特征图分别分成4x4=16块,2x2=4块,1x1=1块(不变),总共21块,取每块的最大值作为代表,即每张特征图就有21维的参数,总共卷积出来256个特征图,则送入全连接层的维度就是21256。这样就解决了输入数据大小任意的问题。

这样就把一张任意大小的图片转换成了一个固定大小的21维特征(当然也可以设计其它维数的输出,增加金字塔的层数,或者改变划分网格的大小)。上面的三种不同刻度的划分,每一种刻度我们称之为:金字塔的一层,每一个图片块大小我们称之为:windows size。

SPP-net公式:

设输入数据大小是(c, hin ,win),分别表示通道数,高度,宽度;
池化数量:(n,n);

则:
Kh表示核的高度
Sh表示高度方向的步长
Ph表示高度方向的填充数量,需要乘以2

注意核和步长的计算公式都使用的是ceil(),即向上取整,而padding使用的是floor(),即向下取整。

小结:

SPP-net解决了R-CNN区域提名时crop/warp带来的偏差问题,提出了SPP层,使得输入的候选框可大可小,速度也有了一定的提升。但其他方面依然和R-CNN一样,因而依然存在不少问题,如它的训练要经过多个阶段,特征也要存在磁盘中,这就有了后面的Fast R-CNN。

二、代码实现(Python)

采用PyTorch深度学习框架,构建了一个SPP层,代码如下:

#coding=utf-8
import math
import torch
import torch.nn.functional as F# 构建SPP层(空间金字塔池化层)
class SPPLayer(torch.nn.Module):def __init__(self, num_levels, pool_type='max_pool'):super(SPPLayer, self).__init__()self.num_levels = num_levelsself.pool_type = pool_typedef forward(self, x):num, c, h, w = x.size() # num:样本数量 c:通道数 h:高 w:宽for i in range(self.num_levels):level = i+1kernel_size = (math.ceil(h / level), math.ceil(w / level))stride = (math.ceil(h / level), math.ceil(w / level))pooling = (math.floor((kernel_size[0]*level-h+1)/2), math.floor((kernel_size[1]*level-w+1)/2))# 选择池化方式 if self.pool_type == 'max_pool':tensor = F.max_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)else:tensor = F.avg_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)# 展开、拼接if (i == 0):x_flatten = tensor.view(num, -1)else:x_flatten = torch.cat((x_flatten, tensor.view(num, -1)), 1)return x_flatten

因为本人目前是小白阶段学习,主要参考了论文原文及一些网络博客,在此表示感谢。如果有写的不对的地方,欢迎批评指正。

SPP-net学习总结及Python实现相关推荐

  1. 深度学习入门 基于Python的理论与实现

    作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现

  2. python学习一(python与pip工具下载与安装)

    python学习一(python与pip工具下载与安装)  一 Python下载  二 安装Python  三 安装 pip   3.1 采用cd命令进入到Scripts 目录下面   3.2 输入命 ...

  3. Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习

    Python学习教程(Python学习视频_Python学些路线):总结和练习 练习清单 寻找"水仙花数". 寻找"完美数". "百钱百鸡" ...

  4. Python学习教程(Python学习路线):Python面试100题(二)

    Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...

  5. Python学习之解决python下载第三方依赖速度慢的问题

    Python学习之解决python下载第三方依赖速度慢的问题 参考文章: (1)Python学习之解决python下载第三方依赖速度慢的问题 (2)https://www.cnblogs.com/su ...

  6. python源码学习_【Python学习】Python源码阅读(一)

    最近想读读Python源码,任何东西学习方法基本都是一样的,先从总体框架进行了解,再从自己侧重的方面逐步深入. 1. Python总体架构 左边是Python提供的大量的模块.库以及用户自定义的模块. ...

  7. 零基础是学java还是python-零基础更适合学习Java还是python?

    原标题:零基础更适合学习Java还是python? 最近有小伙伴向云和数据小编咨询,说想学习一门编程语言,但是没有任何基础,问是学习Java好还是学python更合适?对于这位小伙伴的问题,小编觉得有 ...

  8. 前端学python有什么用-学习和使用python的13个理由

    如果您希望转向网站开发或软件开发,成为程序员中的一员,那么学习HTML,CSS和JavaScript的基础三重奏就不会出错.但要真正在拥挤的应用领域中脱颖而出,您还是需要学习其他编程语言. 有很的编程 ...

  9. 我在学python-我在大学毕业后学习Linux、python的一些经验

    我在大学毕业后学习Linux.python的一些经验 掐指一算,自己已经毕业快半年了,这半年莫名其妙进外包圈子溜达了一圈,有幸退的早还是正常干一些事情吧,外包终究不是太适合刚入社会的毕业生,今天想把自 ...

  10. python爬虫正则表达式实例-python爬虫学习三:python正则表达式

    python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...

最新文章

  1. 给博客增加了一个主题Nautica02Liquid
  2. JSP大作业数据库_本地MySQL【种种问题】
  3. WPF 之 调用线程必须为 STA,因为许多 UI 组件都需要
  4. CCS初学调试以及RTDX
  5. 1.5 编程基础之循环控制 29 数字反转
  6. java jersey client,如何在Jersey-Client Java中实现重试机制
  7. NXP S32K RTC模块手册中文
  8. vc listview 大图标间距设置
  9. 如何用php代码实现人脸识别,PHP实现人脸识别技术
  10. 分库分表之MyCat应用
  11. Audio AudioFocus流程
  12. C语言 - 计算n的阶乘(n!)
  13. java 使用Apache PDFBox 对 PDF 文件进行剪裁
  14. Java导出数据到Word模板中
  15. ajax 代码 查询股票联想,互联网金融爬虫怎么写-第三课 雪球网股票爬虫(ajax分析)...
  16. Spring Boot的简单实现
  17. 人工智能建立本体库_基于人工智能重构易经八卦
  18. Windows系统下如何截屏
  19. 智能化转型战略的成功及强大的运营绩效带动联想18/19财年营业额创历史新高
  20. PPT:国内WMS厂家分析

热门文章

  1. HTML meta 标签总结
  2. HNU 12894 Keys dfs
  3. ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: YES)
  4. .net生成缩略图,支持等比例缩放,加水印
  5. 在基于数据库的任务派发系统中利用SQL Server 2005 中新的查询提示来提高系统的效率...
  6. MQ(消息队列)常见的应用场景解析
  7. hibernate组件映射
  8. eclipse中导入maven项目时pom文件报错
  9. Postman 安装与使用
  10. 2018.09.17 atcoder Digit Sum(数论)