第三十节,目标检测算法之Fast R-CNN算法详解
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。
参考文章
[4]目标检测:SPP-net
[6]基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(强烈推荐)
[8]目标检测(4)-Fast R-CNN
第三十节,目标检测算法之Fast R-CNN算法详解的更多相关文章
- [转]CNN目标检测(一):Faster RCNN详解
https://blog.csdn.net/a8039974/article/details/77592389 Faster RCNN github : https://github.com/rbgi ...
- Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)
1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...
- python接口自动化(三十四)-封装与调用--函数和参数化(详解)
简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...
- 【目标检测】SSD+Tensorflow 300&512 配置详解
SSD_300_vgg和SSD_512_vgg weights下载链接[需要科学上网~]: Model Training data Testing data mAP FPS SSD-300 VGG-b ...
- Android项目实战(三十九):Android集成Unity3D项目(图文详解)
需求: Unity3D 一般用于做游戏 而且是跨平台的.原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作. ...
- Jmeter(三十五) - 从入门到精通进阶篇 - 关联(详解教程)
1.简介 上一篇中介绍了如果想要同时发送多条请求,那么怎样才能让每条数据某些请求参数改变呢.这就用到了jMeter参数化.在实际测试场景中,我们往往还有这样的需求,登录后服务器响应的token作为下次 ...
- python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)
简介 上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件.发送带附件的需要导入另外一个模块 ...
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...
- 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...
- centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更新 第三十节课
centos DNS服务搭建 DNS原理 使用bind搭建DNS服务器 配置DNS转发 配置主从 安装dig工具 DHCP dhclient 各种域名解析记录 mydns DNS动态更 ...
随机推荐
- B站弹幕姬(🐔)分析与开发(上篇)
辞职之后 休息了一段时间,最近准备开始恢复去工作的状态了,所以搞点事情来练练手.由于沉迷b站女妆大佬想做个收集弹幕的然后根据弹幕自动回复一些弹幕的东西.网上搜了一下有个c#的版本,感觉还做得不错,于是 ...
- Python——FTP上传和下载
一.FTP对象方法说明 login(user='anonymous',passwd='', acct='') 登录 FTP 服务器,所有参数都是可选的 pwd() 获得当前工作目录 cwd(path) ...
- vue 使用技巧总结 19.01
组件中箭头函数的使用 不要使用箭头来定义任意生命周期钩子函数: 不要使用箭头来定义一个 methods 函数: 不要使用箭头来定义 computed 里的函数: 不要使用箭头定义 watch 里的函数 ...
- poj2186(tarjan缩点)
题意:有n头奶牛,假如奶牛A觉得奶牛B很厉害,那么就有一条由A指向B的边,然后有个传递关系,if(A→B,B→C,那么A→C),让你求出被除了自己以外所有的奶牛都认为厉害的的奶牛个数: 解题思路:看到 ...
- POJ 2823 滑动窗口 单调队列
https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...
- Centos 7安装和配置 ElasticSearch入门小白
实验环境: 操作系统:Centos 7.5 服务器ip:192.168.1.198 运行用户:root 网络环境:Internet 在企业生产环境有很多服务器的时候.很多业务模块的日志的时候运维人员需 ...
- nodejs eggjs框架 爬虫 readhub.me
最近做了一款 高仿ReadHub小程序 微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈 https://gitee.com/richard1015/News 具体代码已被开源, ...
- 使用java代码批量删除新浪微博
首先开骂,新浪微博@#@!,不经我同意就转发各种微博,制造垃圾,还不提供微博批量删除功能,摆明了的流氓行为,可耻可恨,遭人唾弃! SSLClient.java import org.apache.ht ...
- Edge Deletion CodeForces - 1076D(水最短路)
题意: 设从1到每个点的最短距离为d,求删除几条边后仍然使1到每个点的距离为d,使得剩下的边最多为k 解析: 先求来一遍spfa,然后bfs遍历每条路,如果d[v] == d[u] + Node[i] ...
- 【XSY2190】Alice and Bob VI 树形DP 树剖
题目描述 Alice和Bob正在一棵树上玩游戏.这棵树有\(n\)个结点,编号由\(1\)到\(n\).他们一共玩\(q\)盘游戏. 在第\(i\)局游戏中,Alice从结点\(a_i\)出发,Bob ...