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

同样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC 2007上的准确率相差无几,约在66%-67%之间.

思想

基础:RCNN

简单来说,RCNN使用以下四步实现目标检测:
a. 在图像中确定约1000-2000个候选框
b. 对于每个候选框内图像块,使用深度网络提取特征
c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
d. 对于属于某一特征的候选框,用回归器进一步调整其位置

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

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

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

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

特征提取网络

基本结构

图像归一化为224×224直接送入网络。

前五阶段是基础的conv+relu+pooling形式,在第五阶段结尾,输入P个候选区域(图像序号×1+几何位置×4,序号用于训练)

注:文中给出了大中小三种网络,此处示出最大的一种。三种网络基本结构相似,仅conv+relu层数有差别,或者增删了norm层。

roi_pool层的测试(forward)

roi_pool层将每个候选区域均匀分成M×N块,对每块进行max pooling。将特征图上大小不一的候选区域转变为大小统一的数据,送入下一层

roi_pool层的训练(backward)

首先考虑普通max pooling层。设xi 为输入层的节点,yj 为输出层的节点。

∂L∂xi={0∂L∂yjδ(i,j)=falseδ(i,j)=true

其中判决函数δ(i,j)

表示i节点是否被j节点选为最大值输出。不被选中有两种可能:xi

不在yj

范围内,或者xi

不是最大值。

对于roi max pooling,一个输入节点可能和多个输出节点相连。设xi

为输入层的节点,yrj

为第r

个候选区域的第j

个输出节点。

∂L∂xi=Σr,jδ(i,r,j)∂L∂yrj

判决函数δ(i,r,j)

表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于xi

的梯度等于所有相关的后一层梯度之和。

网络参数训练

参数初始化

网络除去末尾部分如下图,在ImageNet上训练1000类分类器。结果参数作为相应层的初始化参数。

其余参数随机初始化。

分层数据

在调优训练时,每一个mini-batch中首先加入N张完整图片,而后加入从N张图片中选取的R个候选框。这R个候选框可以复用N张图片前5个阶段的网络特征。
实际选择N=2, R=128。

训练数据构成

N张完整图片以50%概率水平翻转。
R个候选框的构成方式如下:

类别 比例 方式
前景 25% 与某个真值重叠在[0.5,1]的候选框
背景 75% 与真值重叠的最大值在[0.1,0.5)的候选框

分类与位置调整

数据结构

第五阶段的特征输入到两个并行的全连层中(称为multi-task)。

cls_score层用于分类,输出K+1维数组p

,表示属于K类和背景的概率。
bbox_prdict层用于调整候选区域位置,输出4*K维数组t

,表示分别属于K类时,应该平移缩放的参数。

代价函数

loss_cls层评估分类代价。由真实分类u

对应的概率决定:

Lcls=−logpu

loss_bbox评估检测框定位代价。比较真实分类对应的预测参数tu

和真实平移缩放参数为v

的差别:

Lloc=Σ4i=1g(tui−vi)

g为Smooth L1误差,对outlier不敏感:

g(x)={0.5x2|x|−0.5|x|<1otherwise

总代价为两者加权和,如果分类为背景则不考虑定位代价:

L={Lcls+λLlocLclsu为前景u为背景

源码中bbox_loss_weights用于标记每一个bbox是否属于某一个类

全连接层提速

分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为x

后一级为y

,全连接层参数为W

,尺寸u×v

。一次前向传播(forward)即为:

y=Wx

计算复杂度为u×v

将W

进行SVD分解,并用前t个特征值近似:

W=UΣVT≈U(:,1:t)⋅Σ(1:t,1:t)⋅V(:,1:t)T

原来的前向传播分解成两步:

y=Wx=U⋅(Σ⋅VT)⋅x=U⋅z

计算复杂度变为u×t+v×t


在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。

在github的源码中,这部分似乎没有实现。

实验与结论

实验过程不再详述,只记录结论
- 网络末端同步训练的分类和位置调整,提升准确度
- 使用多尺度的图像金字塔,性能几乎没有提高
- 倍增训练数据,能够有2%-3%的准确度提升
- 网络直接输出各类概率(softmax),比SVM分类器性能略好
- 更多候选窗不能提升性能

RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) Fast RCNN 算法详解的更多相关文章

  1. 第三十一节,目标检测算法之 Faster R-CNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  2. 第三十节,目标检测算法之Fast R-CNN算法详解

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

  3. 【目标检测】Faster RCNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  4. 第二十九节,目标检测算法之R-CNN算法详解

    Girshick, Ross, et al. “Rich feature hierarchies for accurate object detection and semantic segmenta ...

  5. Java NIO 的前生今世 之四 NIO Selector 详解

    Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...

  6. 揭秘 BPF map 前生今世

    揭秘 BPF map 前生今世 本文地址:https://www.ebpf.top/post/map_internal 1. 前言 众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向 ...

  7. 前后端分离,简单JWT登录详解

    前后端分离,简单JWT登录详解 目录 前后端分离,简单JWT登录详解 JWT登录流程 1. 用户认证处理 2. 前端登录 3. 前端请求处理 4. 后端请求处理 5. 前端页面跳转处理 6. 退出登录 ...

  8. RCNN,Fast RCNN,Faster RCNN 的前生今世:(2) R- CNN (3,2,1)

    3.三次IOU  2.2次model run  1,一次深度神经网络 rcnn主要作用就是用于物体检测,就是首先通过selective search 选择2000个候选区域,这些区域中有我们需要的所对 ...

  9. RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net

    SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...

  10. 目标检测算法之Faster R-CNN算法详解

    Fast R-CNN存在的问题:选择性搜索,非常耗时. 解决:加入一个提取边缘的神经网络,将候选框的选取交给神经网络. 在Fast R-CNN中引入Region Proposal Network(RP ...

随机推荐

  1. 大型web项目构建之负载均衡

    日常开发和学习中经常会听到或者会看到“负载均衡”这个词汇,但是对于很多初级每天只面对增删改代码的开发人员来说,这个词汇好像离我们很遥远又很接近,很多人多多少少都有点一知半解 我结合以前在开发中遇到的场 ...

  2. Apache ZooKeeper在Kafka中的角色 - 监控和配置

    1.目标 今天,我们将看到Zookeeper在Kafka中的角色.本文包含Kafka中需要ZooKeeper的原因.我们可以说,ZooKeeper是Apache Kafka不可分割的一部分.在了解Zo ...

  3. Django组件之cookie、session

    一.cookie 1.1 产生背景 HTTP协议是无状态的,对服务器来说,每次的请求都是独立的.状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留.会话中产生的数据 ...

  4. 17 IO流(十四)——Print流

    PrintStream流 PrintStream作为一个包装流,它可以包装字节流,甚至可以使用指定的文件创建一个打印流.它的构造函数很丰富,建议打开API看一下. 它常用的方法是print方法与pri ...

  5. centos7编译安装memcached

    1.libevent 源码地址:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent ...

  6. OSGI.NET插件方式开发你的应用

    之前一直从事C# WEB开发.基本都是业务开发,性能优化. 体力活占比90%吧.模块真的很多很多,每次部署经常出先各种问题.发布经常加班. 今年开始接触winform 开发.发现C# 的事件  委托 ...

  7. golan切片

  8. @Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题

    先说下我遇到的问题,有一个接口 CompensationService, 有两个实现类 MusicCompensationStrategyImpl  和  TakeDeliveryCompensati ...

  9. mysql删除字符串的前后的空格

    update table set field = replace(replace(replace(field,char(9),''),char(10),''),char(13),'');

  10. 在 WPF 中获取一个依赖对象的所有依赖项属性

    原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...