文章目录

  • 1.RCNN
  • 2.SPPNet
  • 3.Fast RCNN
  • 4.Faster RCNN
  • 5.Feature Pyramid Networks(FPN)
  • 6.其他的变种

参考综述文章:
论文笔记-2019-Object Detection in 20 Years: A Survey
基于深度学习的目标检测算法综述(一)
基于深度学习的目标检测算法综述(二)
基于深度学习的目标检测算法综述(三)

优秀的GitHub仓库:
deep learning object detection
Awesome Object Detection

比较全面的整理:
我这两年的目标检测
最全目标检测相关资料整理
我这两年收藏的目标检测好文分享

1.RCNN

RCNN的思想:

  • 首先通过选择性搜索提取一组对象建议(对象候选框)。
  • 然后将每个提案重新调整成一个固定大小的图像,并输入到一个在 ImageNet 上训练得到的CNN模型来提取特征。
  • 最后,利用线性SVM分类器对每个区域内的目标进行预测,识别目标类别。

2.SPPNet

SPPNet的结构如下图:

SPPNet的特点是在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。

金字塔池化:以下图为例,黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4x4,2x2,1x1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)

综上所述,SPPNet的训练过程如下:

  • 首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
  • 特征提取阶段:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升
  • 最后一步和R-CNN一样,采用SVM算法进行特征向量分类识别。

空间金字塔池化层代码实现:

#coding=utf-8import 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)

3.Fast RCNN

Fast RCNN总体结构;

Fast RCNN相比于RCNN的改进之处主要有三点:

  • RoIPooling:对于每一个虚线窗口内的特征图,,SPP Layer采用多个尺度的池化层进行池化操作;而RoI pooling层则采用一种尺度的池化层进行下采样,将每个RoI区域的卷积特征分成4*4个bin,然后对每个bin内采用max pooling,这样就得到一共16维的特征向量。如下图所示:

  • 多任务损失函数(Multi-task Loss):Fast R-CNN统一了类别输出任务和候选框回归任务,有两个损失函数:分类损失和回归损失。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。softmax由于引入了类间竞争,所以分类效果优于SVM,SVM在R-CNN中用于二分类。回归损失输出的是4*N(类别),4表示的是(x,y,w,h分别表示候选框的中心坐标和宽、高)。

  • SVD对全连接层进行分解:由于一张图像约产生2000个RoI,将近一半多的时间用在全连接层计算,为了提高运算速度,可以用SVD(奇异值分解)对全连接层进行变换来提高运算速度。一个大的矩阵可以近似分解为三个小矩阵的乘积,分解后的矩阵的元素数目远小于原始矩阵的元素数目,从而达到减少计算量的目的。通过对全连接层的权值矩阵进行SVD分解,使得处理一张图像的速度明显提升。

综上所述,Fast RCNN的主要流程如下:

  • 首先提取候选区域:利用Selective Search算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;
  • 区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;
  • 分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。

4.Faster RCNN

参考文章:
睿智的目标检测27——Pytorch搭建Faster R-CNN目标检测平台
捋一捋pytorch官方FasterRCNN代码

Faster RCNN的总体结构如下;

相比于Fast RCNN,Faster RCNN主要的改进有两点:

  • 产生建议窗口的CNN和目标检测的CNN共享
  • 使用RPN(Region Proposal Network)代替原来的Selective Search方法产生建议窗口;

RPN(Region Proposal Network):RPN可以理解为一种全卷积网络,最终目的是前景背景分类 + 框位置的回归。之前得到的特征图有两个应用,一个是和ROIPooling结合使用、另一个是进行一次3x3的卷积后,进行一个18通道的1x1卷积,还有一个36通道的1x1卷积。

在Faster RCNN中,Anchor先验框的数量就是9,所以两个1x1卷积的结果实际上也就是:

  • 9 x 4的卷积 用于预测用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h
  • 9 x 2的卷积 用于预测proposal每一个网格点上每一个预测框内部是否包含了物体

    RPN层代码实现:
class RegionProposalNetwork(nn.Module):def __init__(self, in_channels=512, mid_channels=512, ratios=[0.5, 1, 2],anchor_scales=[8, 16, 32], feat_stride=16,mode = "training",):super(RegionProposalNetwork, self).__init__()self.anchor_base = generate_anchor_base(anchor_scales=anchor_scales, ratios=ratios)# 步长,压缩的倍数self.feat_stride = feat_strideself.proposal_layer = ProposalCreator(mode)# 每一个网格上默认先验框的数量n_anchor = self.anchor_base.shape[0]# 先进行一个3x3的卷积self.conv1 = nn.Conv2d(in_channels, mid_channels, 3, 1, 1)# 分类预测先验框内部是否包含物体self.score = nn.Conv2d(mid_channels, n_anchor * 2, 1, 1, 0)# 回归预测对先验框进行调整self.loc = nn.Conv2d(mid_channels, n_anchor * 4, 1, 1, 0)normal_init(self.conv1, 0, 0.01)normal_init(self.score, 0, 0.01)normal_init(self.loc, 0, 0.01)def forward(self, x, img_size, scale=1.):n, _, hh, ww = x.shape# 对共享特征层进行一个3x3的卷积h = F.relu(self.conv1(x))# 回归预测rpn_locs = self.loc(h)rpn_locs = rpn_locs.permute(0, 2, 3, 1).contiguous().view(n, -1, 4)# 分类预测rpn_scores = self.score(h)rpn_scores = rpn_scores.permute(0, 2, 3, 1).contiguous().view(n, -1, 2)# 进行softmaxrpn_softmax_scores = F.softmax(rpn_scores, dim=-1)rpn_fg_scores = rpn_softmax_scores[:, :, 1].contiguous()rpn_fg_scores = rpn_fg_scores.view(n, -1)rpn_scores = rpn_scores.view(n, -1, 2)

综上所述,Fast RCNN的步骤如下:

  1. 输入测试图像;
  2. 将整张图片输入CNN,进行特征提取;
  3. 用RPN先生成一堆Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)
  4. 把建议窗口映射到CNN的最后一层卷积feature map上;
  5. 通过RoI pooling层使每个RoI生成固定尺寸的feature map;
  6. 利用Softmax Loss(探测分类概率) 和Smooth L1 Loss(探测边框回归)对分类概率和边框回归(Bounding box regression)联合训练

5.Feature Pyramid Networks(FPN)

下图展示了4种利用特征的形式:

  • 图像金字塔,即将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。这种方法的缺点在于增加了时间成本。有些算法会在测试时候采用图像金字塔。
  • 单一特征图:像SPP net,Fast RCNN,Faster RCNN是采用这种方式,即仅采用网络最后一层的特征。
  • 多尺度特征融合:像SSD(Single Shot Detector)采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3)
  • 本文作者是采用这种方式,顶层特征通过上采样和低层特征做融合,而且每层都是独立预测的。

FPN算法大致结构如下图:一个自底向上的线路,一个自顶向下的线路,横向连接(lateral connection)。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。

综上所述,FPN算法的主要流程如下:

  1. 将预处理过的图片送入预训练的特征网络中(ResNet),生成下采样网络(左侧三层);
  2. 采用上采样(upsampling)方法,而横向连接则是将上采样的结果和之前下采样对应的结果进行融合(merge)。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积
  3. 分别在右面的三层上面分别进行RPN操作(即一个3x3的卷积后面连接两个1x1的卷积分别用来分类和回归);将获得的候选ROI分别输入到4、5、6层分别进行ROI池化操作(即固定为7x7的特征);
  4. 连接两个1024层的全连接网络层,分别连接对应的分类层和回归层;

6.其他的变种

目标检测综述——两阶段检测器相关推荐

  1. 目标检测综述——单阶段检测器

    文章目录 一.SSD((Single Shot MultiBox Detector)) 1.Default box 2.训练过程 3.数据增强 4.其他变体 (1)DSSD (2)DSOD (3)FS ...

  2. 基于深度学习的目标检测综述(单阶段、多阶段、FPN变体、旋转目标检测等)

    随着深度学习的发展,基于深度学习的目标检测方法因其优异的性能已经得到广泛的使用.目前经典的目标检测方法主要包括单阶段(YOLO.SSD.RetinaNet,还有基于关键点的检测方法等)和多阶段方法(F ...

  3. 目标检测之两阶段算法--Fast R-CNN详解

    论文题目:<Fast R-CNN> 论文地址:Fast R-CNN 1. 概述 之所以提出Fast R-CNN,主要是因为R-CNN存在以下几个问题:1.训练分多步.通过上一篇博文我们知道 ...

  4. Deep Learning for Generic Object Detection: A Survey -- 目标检测综述总结

      最近,中国国防科技大学.芬兰奥卢大学.澳大利亚悉尼大学.中国香港中文大学和加拿大滑铁卢大学等人推出一篇最新目标检测综述,详细阐述了当前目标检测最新成就和关键技术.文章最后总结了未来8个比较有前景的 ...

  5. 后 R-CNN时代, Faster R-CNN、SSD、YOLO 各类变体统治下的目标检测综述:Faster R-CNN系列胜了吗?,(知乎ChenJoya大佬,讲的挺好的,记录一下)

    我们检测到你可能使用了 AdBlock 或 Adblock Plus,它的部分策略可能会影响到正常功能的使用(如关注). 你可以设定特殊规则或将知乎加入白名单,以便我们更好地提供服务. (为什么?) ...

  6. 2020年最全目标检测综述(完结篇)

    点击蓝字关注我们 computerVision 计算机视觉战队 ● 扫码关注,回复:目标检测 ● 获取目标检测相关下载链接 今天我们的目标检测综述最后一章,也是这个系列的完结,希望有兴趣的同学可以从中 ...

  7. 基于深度学习的目标检测综述(一):简介及骨干网络

    这篇文献的主要结构如下: 第1节,简单介绍目标检测的发展及两类目标检测算法. 第 2 节中讨论了骨干网络,目标检测器需要强大的骨干网络来提取丰富的特征.众所周知,特定领域图像检测器的典型管道是任务的基 ...

  8. 2022目标检测综述

    目录 0.引言 1.背景 1.1.问题描述 1.2.目标检测的核心问题 1.3.目标检测中的关键挑战 2.关于损失函数 3.关于IOU 4.数据集以及评价指标 4.1.评价指标 4.2.数据集 5.目 ...

  9. 【百度飞浆】目标检测综述

    目标检测综述 什么是目标检测 应用场景 商品检测 智慧交通 巡检:安全生产 巡检:输电通道本体及缺陷识别 存在的挑战 垂类细分领域 算法进展 传统目标检测算法 深度学习的优势 两阶段之RCNN:深度学 ...

最新文章

  1. ganglia metric 默认监控项翻译
  2. wiquery ManipulatingHelper
  3. 智能布线系统,“智”在何方
  4. P8实战(二):分布式锁前置技能 etcd 集群搭建
  5. 分布式云越来越火,它凭什么能够成为云计算未来的趋势?
  6. 教你实现图片的惰性加载
  7. 返回一个数组的连续子数组和的最大值
  8. 在android下使用i2c tools
  9. WinRunner:强大的企业级自动化测试工具
  10. html学校图标的代码,学校查询网代码查询_小学学校的代码如何查询?
  11. 闲谈安全测试之IAST
  12. 高通WLAN框架学习(22)-- WPA3
  13. 反病毒引擎设计(一):绪论 本文来自:剑盟反病毒技术门户(www.janmeng.com)
  14. zabbix报警 High swap space usage ( less than 50% free) 解决方案
  15. 投身数字化,助力智能化
  16. JS获取json子项/数组的个数/长度
  17. Vista上StarForce驱动的卸载
  18. 独石电容、瓷片电容、陶瓷电容有什么区别啊?
  19. Android4.4以后第三方应用无法删除短信的解决方案
  20. c语言 截止频率6低通滤波器,如何用c语言实现截止频率为200hz的巴特沃斯低通滤波器...

热门文章

  1. RIP路由协议基本配置
  2. 加密解密技术基础、PKI及创建私有私有CA
  3. AJAX编写用户注册实例及技术小结
  4. 华为机试HJ105:记负均正II
  5. jdbc中mySQL语句单双引号_JDBC: 执行MySQL语句时,bit类型的数值在java代码中应该怎么表示?...
  6. mysql row 日志格式_mysql row日志格式下 查看binlog sql语句
  7. 王者为什么有些服务器在维护,王者荣耀服务器正在维护中怎么回事 进不去怎么办...
  8. python怎么打开excel文件并处理_Python利用openpyxl处理Excel文件(Excel文件基本操作)...
  9. 高性能数据库集群:分库分表
  10. elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..