SPP-net学习总结及Python实现
一、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实现相关推荐
- 深度学习入门 基于Python的理论与实现
作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现
- python学习一(python与pip工具下载与安装)
python学习一(python与pip工具下载与安装) 一 Python下载 二 安装Python 三 安装 pip 3.1 采用cd命令进入到Scripts 目录下面 3.2 输入命 ...
- Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习
Python学习教程(Python学习视频_Python学些路线):总结和练习 练习清单 寻找"水仙花数". 寻找"完美数". "百钱百鸡" ...
- Python学习教程(Python学习路线):Python面试100题(二)
Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...
- Python学习之解决python下载第三方依赖速度慢的问题
Python学习之解决python下载第三方依赖速度慢的问题 参考文章: (1)Python学习之解决python下载第三方依赖速度慢的问题 (2)https://www.cnblogs.com/su ...
- python源码学习_【Python学习】Python源码阅读(一)
最近想读读Python源码,任何东西学习方法基本都是一样的,先从总体框架进行了解,再从自己侧重的方面逐步深入. 1. Python总体架构 左边是Python提供的大量的模块.库以及用户自定义的模块. ...
- 零基础是学java还是python-零基础更适合学习Java还是python?
原标题:零基础更适合学习Java还是python? 最近有小伙伴向云和数据小编咨询,说想学习一门编程语言,但是没有任何基础,问是学习Java好还是学python更合适?对于这位小伙伴的问题,小编觉得有 ...
- 前端学python有什么用-学习和使用python的13个理由
如果您希望转向网站开发或软件开发,成为程序员中的一员,那么学习HTML,CSS和JavaScript的基础三重奏就不会出错.但要真正在拥挤的应用领域中脱颖而出,您还是需要学习其他编程语言. 有很的编程 ...
- 我在学python-我在大学毕业后学习Linux、python的一些经验
我在大学毕业后学习Linux.python的一些经验 掐指一算,自己已经毕业快半年了,这半年莫名其妙进外包圈子溜达了一圈,有幸退的早还是正常干一些事情吧,外包终究不是太适合刚入社会的毕业生,今天想把自 ...
- python爬虫正则表达式实例-python爬虫学习三:python正则表达式
python爬虫学习三:python正则表达式 1.正则表达式基础 a.正则表达式的大致匹配过程: 1.依次拿出表达式和文本中的字符比较 2.如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符 ...
最新文章
- 给博客增加了一个主题Nautica02Liquid
- JSP大作业数据库_本地MySQL【种种问题】
- WPF 之 调用线程必须为 STA,因为许多 UI 组件都需要
- CCS初学调试以及RTDX
- 1.5 编程基础之循环控制 29 数字反转
- java jersey client,如何在Jersey-Client Java中实现重试机制
- NXP S32K RTC模块手册中文
- vc listview 大图标间距设置
- 如何用php代码实现人脸识别,PHP实现人脸识别技术
- 分库分表之MyCat应用
- Audio AudioFocus流程
- C语言 - 计算n的阶乘(n!)
- java 使用Apache PDFBox 对 PDF 文件进行剪裁
- Java导出数据到Word模板中
- ajax 代码 查询股票联想,互联网金融爬虫怎么写-第三课 雪球网股票爬虫(ajax分析)...
- Spring Boot的简单实现
- 人工智能建立本体库_基于人工智能重构易经八卦
- Windows系统下如何截屏
- 智能化转型战略的成功及强大的运营绩效带动联想18/19财年营业额创历史新高
- PPT:国内WMS厂家分析
热门文章
- HTML meta 标签总结
- HNU 12894 Keys dfs
- ERROR 1045 (28000): Access denied for user 'username'@'localhost' (using password: YES)
- .net生成缩略图,支持等比例缩放,加水印
- 在基于数据库的任务派发系统中利用SQL Server 2005 中新的查询提示来提高系统的效率...
- MQ(消息队列)常见的应用场景解析
- hibernate组件映射
- eclipse中导入maven项目时pom文件报错
- Postman 安装与使用
- 2018.09.17 atcoder Digit Sum(数论)