Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。在Github上提供了源码

之所以提出Fast R-CNN,主要是因为R-CNN存在以下几个问题:

  • 训练分多步。通过上一篇博文我们知道R-CNN的训练先要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding-box进行回归,另外region proposal也要单独用selective search的方式获得,步骤比较繁琐。
  • 时间和内存消耗比较大。在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上再读入的时间消耗还是比较大的。
  • 测试的时候也比较慢,每张图片的每个region proposal都要做卷积,重复操作太多。

虽然在Fast RCNN之前有提出过SPPnet算法来解决RCNN中重复卷积的问题,但是SPPnet依然存在和RCNN一样的一些缺点比如:训练步骤过多,需要训练SVM分类器,需要额外的回归器,特征也是保存在磁盘上。因此Fast RCNN相当于全面改进了原有的这两个算法,不仅训练步骤减少了,也不需要额外将特征保存在磁盘上。

基于VGG16的Fast RCNN算法在训练速度上比RCNN快了将近9倍,比SPPnet快大概3倍;测试速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。

一 Fast R-CNN思想

Fast RCNN方法解决了RCNN方法三个问题:

问题一:测试时速度慢

RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。 
本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。

问题二:训练时速度慢

原因同上。 
在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。

问题三:训练所需空间大

RCNN中独立的分类器和回归器需要大量特征作为训练样本。 
本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

二 算法简述

算法的主网络是VGG16

以下是训练的步骤:

  • 输入是224*224,经过5个卷积层和2个降采样层(这两个降采样层分别跟在第一和第二个卷积层后面)
  • 进入RoI Pooling层,该层的输入是conv5层的输出和P个候选区域region proposal。
  • 然后再经过两个都是output是4096的全连接层。
  • 最后分别经过output个数是21和84的两个全连接层(这两个全连接层是并列的,不是前后关系),前者是分类的输出,代表每个region proposal属于每个类别(21类)的得分,后者是回归的输出,代表每个region proposal的四个坐标。
  • 最后是两个损失层,分类的是softmaxWithLoss,输入是label和分类层输出的得分;回归的是SmoothL1Loss,输入是回归层的输出和target坐标及weight。

测试的过程: 
与训练基本相同,最后两个loss层要改成一个softmax层,输入是分类的score,输出概率。最后对每个类别采用NMS(non-maximun suppression)。

三 算法详解

Fast R-CNN的流程图如下,这个网络的输入是原始图片和候选区域,输出是分类类别和bbox回归值。对于原始图片中的候选框区域,和SPPNet中做法一样,都是将它映射到卷积特征的对应区域(即图中的RoI projection),然后输入到RoI pooling layer,可以得到一个固定大小的特征图。将这个特征图经过2个全连接层以后得到RoI的特征,然后将特征经过全连接层,使用softmax得到分类,使用回归得到边框回归。CNN的主体结构可以来自于AlexNet,也可以来自于VGGNet。

1、ROI池化层

这里唯一需要解释的就是RoI pooling layer。如果特征图(feature map)上的RoI 大小是h∗w(这里忽略了通道数),将这个特征图划分为h/H∗w/W个网格,每个网格大小为H*W,对每个网格做max pooling,这样得到pooling以后的大小就是H∗W(在文章中,VGG16网络使用H=W=7的参数,上图中绘制的是6x6的)。无论原始的RoI多大,最后都转化为7*7大小的特征图。本文将RoI池化为7*7的输出,其实这一层就是SPP的特例,SPP金字塔只有一层就是这样的。

因此可以看出Fast RCNN主要有3个改进:

  • 卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。
  • 原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。用ROI pooling进行特征的尺寸变换,因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。
  • 将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。

2、训练

网络的训练需要从下面几个方向考虑:1、训练样本是什么;2、损失函数是什么;3、如果提出了新的网络结构,网络结构的反向传播怎么做。此外,还可以关注一下超参数的选取方法,看看作者在超参数选取上有什么好的思路可以借鉴。

3、训练样本

从网络的前向传播可以看到,网络需要的输入是图片和region proposal,输出是类别和bbox,那么训练的图片每个候选区需要提前标注好类别和bbox。

作者使用层次抽样来选取训练图片。对应每个mini-batch而言,大小为128个region proposal(或者叫RoI)。先从训练图片中选取2张图片,每个图片的RoI中选取64个RoI,形成这128个RoI。这样网络前面的卷积计算是可以共享的,降低了训练的复杂度。64个RoI中,25%是有类别的(IoU>0.5,u≥1),剩下75%是背景(IoU∈[0.1,0.5),u=0)。数据增强使用了水平翻转。测试的时候则每张图像大约2000个RoI。

4、损失函数

将分类的loss和回归的loss整合在一起,其中分类采用log loss,即对真实分类(下图中的pu)的概率取负log,而回归的loss和R-CNN基本一样。分类层输出K+1维,表示K个类和1个背景类。

这是回归的loss,其中tu表示预测的结果,u表示类别。v表示真实的结果,即bounding box regression target。

参考文章

[1]目标检测:Fast R-CNN

[2]Fast RCNN算法详解

[3]Fast RCNN算法详解

[4]目标检测:SPP-net

[5]Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

[6]基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(强烈推荐)

[7]目标检测(3)-SPPNet

[8]目标检测(4)-Fast R-CNN

第三十节,目标检测算法之Fast R-CNN算法详解的更多相关文章

  1. [转]CNN目标检测(一):Faster RCNN详解

    https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgi ...

  2. Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)

    1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...

  3. python接口自动化(三十四)-封装与调用--函数和参数化(详解)

    简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...

  4. 【目标检测】SSD+Tensorflow 300&512 配置详解

    SSD_300_vgg和SSD_512_vgg weights下载链接[需要科学上网~]: Model Training data Testing data mAP FPS SSD-300 VGG-b ...

  5. Android项目实战(三十九):Android集成Unity3D项目(图文详解)

    需求: Unity3D 一般用于做游戏 而且是跨平台的.原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作. ...

  6. Jmeter(三十五) - 从入门到精通进阶篇 - 关联(详解教程)

    1.简介 上一篇中介绍了如果想要同时发送多条请求,那么怎样才能让每条数据某些请求参数改变呢.这就用到了jMeter参数化.在实际测试场景中,我们往往还有这样的需求,登录后服务器响应的token作为下次 ...

  7. python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)

    简介 上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件.发送带附件的需要导入另外一个模块 ...

  8. 风炫安全web安全学习第三十节课 命令执行&代码执行基础

    风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...

  9. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  10. centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课

    centos  DNS服务搭建  DNS原理  使用bind搭建DNS服务器 配置DNS转发 配置主从  安装dig工具  DHCP  dhclient  各种域名解析记录  mydns DNS动态更 ...

随机推荐

  1. Mapper动态代理方式

    开发规范 Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法. Mapper接 ...

  2. 18个Python高效编程技巧,Mark!

    初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...

  3. macOS & USB stick

    macOS & USB stick why macOS can only read USB stick, can not write files to USB stick macos 无法写文 ...

  4. 在Hmtl页面中只让其中单独的一个div隐藏滚动条但是仍可滚动浏览下边的内容

    <style> .box ::-webkit-scrollbar {width: 0px;} </style> <div class="box"> ...

  5. python3高级编程

    1. SMTP发送邮件 internet相关协议: http:网页访问相关,httplib,urllib,xmlrpclib ftp:文件传输相关, ftplib, urllib nntp:新闻和帖子 ...

  6. import、export 和export default區別

    https://www.cnblogs.com/xiaotanke/p/7448383.html

  7. Nginx 完整安装篇

    第一步安装各种编译库如c++编译库等 yum install -y gcc //安装GCC ...安装过程省略 yum install -y gcc-c++ //安装C++库用来编译c++ ...安装 ...

  8. shiro注解和标签

    Controller中注解: @RequiresAuthentication @RequiresGuest @RequiresPermissions("account:create" ...

  9. Android app下载并安装

    1  下载功能 //下载apk private void downloadApk(String apkUrl) throws PackageManager.NameNotFoundException ...

  10. Semi-prime H-numbers POJ - 3292 打表(算复杂度)

    题意:参考https://blog.csdn.net/lyy289065406/article/details/6648537 一个H-number是所有的模四余一的数. 如果一个H-number是H ...