【深度学习】嘿马深度学习目标检测教程第3篇:目标检测算法原理,3.3 SPPNet【附代码文档】

62 阅读1分钟

教程总体简介:获取训练的OP以及摘要OP、pre-trained模型路径.、开始训练、image_pre为图片处理结果、bbox_img为、定义SSD模型、修改网络当中输出score时候、9类(商品数据集8 + 1)、获取每一层的default boxes、加载已经训练模型、方便在Notebook使用的交互式会话、初始化变量、创建saver加载模型、通过 predictions 与 select_threshold 筛选bbox、bbox边框不能超过原图片 默认原图的相对于bbox大小比例 [0, 0, 1, 1]、根据 scores 从大到小排序、并改变classes rbboxes的顺序、使用nms算法筛选bbox、项目实现、4.9 Web Server + TensorFlow Serving Client、商品目标检测课程要求、目标、1.1 项目演示、1.1 图像识别背景、1.2 什么是目标检测、1.3 目标检测应用场景、1.4 开发环境搭建、目标检测概述、3.1 目标检测任务描述、目标检测算法原理、3.2 R-CNN、3.3 SPPNet、3.4 Fast R-CNN、3.5 Faster R-CNN、3.6 YOLO(You only look once)、3.7 SSD(Single Shot MultiBox Detector)、3.8 TensorFlowSSD接口、总结、作业、数据集处理、2.2 目标数据集标记、2.3 数据集格式转换、2.4 slim库介绍、4.1 项目结构介绍、4.2 数据模块接口、4.4 预处理、Set up DeploymentConfig、主函数训练逻辑、一、选择设备初始配置初始部署设备信息、C

项目完整code和文档,小伙伴们---->git仓库


全套教程部分目录:

目标检测算法原理

了解目标检测算法分类
知道目标检测的常见指标IoU
了解目标定位的简单实现方式
了解Overfeat模型的移动窗口方法
说明R-CNN的完整结构过程
了解选择性搜索
了解Crop+Warp的作用
知道NMS的过程以及作用
了解候选区域修正过程
说明R-CNN的训练过程
说明R-CNN的缺点
说明SPPNet的特点
说明SPP层的作用
了解Fast R-CNN的结构特点
说明RoI的特点
了解多任务损失
了解Faster R-CNN的特点
知道RPN的原理以及作用
知道YOLO的网络结构
知道单元格的意义
知道YOLO的损失
知道SSD的结构
说明Detector & classifier的作用
说明SSD的优点
知道TensorFlow的SSD接口意义

3.3 SPPNet

学习目标

  • 目标

    • 说明SPPNet的特点
    • 说明SPP层的作用
  • 应用

R-CNN的速度慢在哪?

每个候选区域都进行了卷积操作提取特征。

3.3.1 SPPNet

SPPNet主要存在两点改进地方,提出了SPP层

  • 减少卷积计算
  • 防止图片内容变形

R-CNN模型SPPNet模型
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2、固定大小的图像塞给CNN 传给后面的层做训练回归分类操作1、SPPNet把全图塞给CNN得到全图的feature map 2、让候选区域与feature map直接映射,得到候选区域的映射特征向量 3、映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层
3.3.1.1 映射

原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量。映射过程图参考如下:

整个映射过程有具体的公式,如下

假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:(x,y)=(S∗x′,S∗y′),即

  • 左上角的点:

    • x′=[x/S]+1
  • 右下角的点:

    • x′=[x/S]−1

其中 SS 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16

拓展:如果关注这个公式怎么计算出来,请参考:[

3.3.1.2 spatial pyramid pooling

通过spatial pyramid pooling 将任意大小的特征图转换成固定大小的特征向量

示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:

3.3.2 SPPNet总结

来看下SPPNet的完整结构

  • 优点

    • SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发
  • 缺点

    • 训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)

    • 分阶段训练网络:选取候选区域、训练CNN、训练SVM、训练bbox回归器, SPP-Net在fine-tuning阶段无法使用反向传播微调SPP-Net前面的Conv层

3.3.3 总结

  • 掌握SPP的池化作用

  • 掌握SPP的优缺点

3.3.4 问题?

1、SPPNet的映射过程描述?公式?

2、spatial pyramid pooling的过程?

3、SPPNet相对于R-CNN的改进地方?

3.4 Fast R-CNN

学习目标

  • 目标

    • 了解Fast R-CNN的结构特点
    • 说明RoI pooling的特点
    • 了解多任务损失
  • 应用

SPPNet的性能已经得到很大的改善,但是由于网络之间不统一训练,造成很大的麻烦,所以接下来的Fast R-CNN就是为了解决这样的问题

3.4.1 Fast R-CNN

改进的地方:

  • 提出一个RoI pooling,然后整合整个模型,把CNN、SPP变换层、分类器、bbox回归几个模块一起训练

  • 步骤

    • 首先将整个图片输入到一个基础卷积网络,得到整张图的feature map
    • 将region proposal(RoI)映射到feature map中
    • RoI pooling layer提取一个固定长度的特征向量,每个特征会输入到一系列全连接层,得到一个RoI特征向量**(此步骤是对每一个候选区域都会进行同样的操作)**
      • 其中一个是传统softmax层进行分类,输出类别有K个类别加上”背景”类

      • 另一个是bounding box regressor

3.4.1.1 RoI pooling

首先RoI pooling只是一个简单版本的SPP,目的是为了减少计算时间并且得出固定长度的向量。

  • RoI池层使用最大池化将任何有效的RoI区域内的特征转换成具有H×W的固定空间范围的小feature map,其中H和W是超参数 它们独立于任何特定的RoI。

例如:VGG16 的第一个 FC 层的输入是 7 x 7 x 512,其中 512 表示 feature map 的层数。在经过 pooling 操作后,其特征输出维度满足 H x W。假设输出的结果与FC层要求大小不一致,对原本 max pooling 的单位网格进行调整,使得 pooling 的每个网格大小动态调整为 h/H,w/W, 最终得到的特征维度都是 HxWxD。

它要求 Pooling 后的特征为 7 x 7 x512,如果碰巧 ROI 区域只有 6 x 6 大小怎么办?每个网格的大小取 6/7=0.85 , 6/7=0.85,以长宽为例,按照这样的间隔取网格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95],取整后,每个网格对应的起始坐标为:[0,1,2,3,3,4,5]

![](p1-juejin.byteimg.com/tos-cn-i-k3