对抗网络之目标检测应用:A-Fast-RCNN
对抗网络之目标检测应用:A-Fast-RCNN
论文:A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection 【点击下载】
Caffe代码:【Github】
一. 深度学习正确的打开方式
深度学习的根基在于样本,大量的样本决定了深度网络的精确度和收敛性,针对样本的挖掘是深度学习的一个重要研究方向,这里我们先回顾两个概念 Easy Example 和 Hard Example :
Easy Example:
直观上来讲,太易于识别的样本对于训练来讲意义并不太大,有一部分就够了,因为太明显了嘛,傻子都认识;
Hard Example:
比较难以区别的样本,比如目标在 变形、遮挡、逆光 等情况下的 Performance,别人不说你都不认识那种。
样本挖掘 通常是找出样本中的 Hard Examples,用来提高网络对于目标的判别能力,讲到这里,可能大多数人都会 Refer 到经典的 OHEM -online hard example mining 。
论文:Training Region-based Object Detectors with Online Hard Example Mining【点击下载】
Caffe代码:【Github】
二. OHEM
传统机器学习中训练 SVM 的时候,通过初始的分类器进行分类(检测)测试,得到的误报即称为 Hard Example,将其加入到训练样本中,重新训练分类器,这种方法称为 Bootstrap(自举)。
OHEM 就是 BootStrap 方法在深度卷积网络中的应用。
先来看网络架构图:
这是基于 Fast RCNN 的结构进行改造的,卷积网络的上半部分是 Fast RCNN 的网络。修改加工的地方在于:
1)添加了一个 Hard ROI Sampler,用于挖掘 Loss 比较大的 Proposal;
2)为了加快速度,复制了一个 ROINet,两个子网络-图中 (a)和(b)共享参数;
(a) 只做正向传播 forward,标注为 Read-only;
(b) 根据 Sampler 传回的结果(hard examples),同时进行正反向传播 - 红色部分。
与原网络的差异在于 通过 Sampler 对 Loss 结果进行排序,将Loss最大的 k个作为 Hard Examples,进行误差回传,这样做的意义在于充分利用了 Hard Examples,增加了网络的辨识度。
三. 对抗网络引入
当下生成式对抗网络(GAN)大热,而 GAN 的最核心的作用就是造假,造的假的越来越接近真的,逼迫 “Detector” 不断突破自我来进行判别。
GAN在最后生成的这些 Example 就可以称为 Hard Example。
将对抗学习和Fast R-CNN结合,来增加遮挡和姿态变化的物体的数量,这种做法可行性在于:
1)实际样本中可能这种情况比较少;
2)现实搜集的样本仅包含部分场景,很难 cover 多数的遮挡和变形情况;
作者提到一个长尾效应,20%的场景在80%的情况下不会出现,来看下图:
因此,通过自动生成的方式来获得这些样本将变得很有意义,可以通过这些样本来 Teach 网络什么是“遮挡”和“变形”,区别于传统的直接生成样本图片的方法,作者采用的是在特征图上进行“某些”变换:
a)通过添加 Mask来实现实现特征的部分遮挡;
b)通过操纵特征响应来实现特征的部分变形;
> Adversarial Spatial Dropout Network
处理遮挡的对抗网络,通过 Mask(Dropout)来实现,网络结构:
网络结构基础是 Fast RCNN 网络,在阴影部分做了一些处理:
1)添加了一个 Mask层,作为遮挡掩码,并通过前面两个FC层来生成 Mask,共同构成对抗网络部分;
2)根据 Loss 选择 Mask;
Occlusion Mask 是二值掩码(值为0或1),大小与传入的 Feature 一致,假设ASDN的输入特征图是d×d×c(AlexNet中,d=6,c=256),对应 Mask 尺寸也是 d×d。对应像素 Mij 值为1时,drop 所有特征通道对应的特征。
训练过程:
1)模型预训练:首先屏蔽掉 ASDN 部分,单独训练 Fast RCNN 网络 10k 次;
2)ASDN 网络初始化:
通过 d/3×d/3 的滑动窗口(原特征图的1/9)进行遮挡测试,每个特征图会得到10种不同的遮挡情况(包括完全不遮挡,如下图),生成的新特征图通过 Fast RCNN 判别,选择损失值最高的那个为最优(因为它最能骗过分类器)。
将选择的 Grid 最优的样本和对应 Mask组成训练样本{(X1,M1), (X2,M2), ……,(Xn, Mn)},Loss 函数描述为:
其中 Aij 表示对应特征图 Xp 在 i,j 位置对应的输出。
ASDN 单独训练 10k 次。
3)阈值采样
通过上面的训练过程,我们得到一个连续的热度图(不再是二维掩码),或者叫灰度图,作者选择其中影响最大的1/3来生成mask(不是固定阈值),这里采用了一个 Trcik,先选择最大的 1/2 ,再从里面选取 2/3 set to 0,这个不重要。
4)联合训练
将 Fast RCNN 与 ASDN 进行联合训练(joint training)。
受强化学习的启发,只采用 hard examples mask 来训练 ASDN。
> Adversarial Spatial Transformer Network
处理形变的对抗网络,通过在特征图上产生形变,让检测器难以判别。
STN回顾:
包含三个部分:定位网络(localisation network)、网格生成器(grid generator)和采样器(sampler)。
定位网络 估计形变参数(如旋转、平移距离和缩放因子),网格生成器 和 采样器 会用到这些参数来产生形变后的特征图。
STN 的贡献在于生成的网络是可微的,这样定位网络的参数可以通过分类目标的残差回传得到,具体内容参考论文:Spatial Transformer Networks 。
Aversarial STN:
这里只关注旋转特征,其中定位网络由3个全连接层构成,前两层是由fc6和fc7初始化得到。
与 ASDN 类似,ASTN 和 Fast R-CNN 也需要联合训练,如果ASTN的变换让检测器将前景误判为背景,那么这种空间变换就是最优的。与 ASDN 不同的是,由于 ASTN 是可微的,我们可以直接通过分类误差反向传播,fine-tune 定位网络的参数。
执行细节:
首先旋转角度不能太大(太大了肯定识别不出,没什么意义),文中把旋转角度限制在(-10,10),同时,按照特征图维度将Channels 划分为 4个 parts(对应4种不同的旋转方向),这样可以增加旋转操作的复杂性,避免 Trivial 变形。
对抗网络融合:
ASDN 和 ASTN 提供了两种不同的变化,通过将这两种变形相结合(ASDN 输出作为 ASTN 的输入),检测器可以训练的更加鲁棒。
> 实验结果
在 VOC2017 上的测试结果(可以对比一下单独的 ASDN 和 ASTN 的网络,以及两者都采用的 mAP):
作者分别进行了 遮挡 和 变形方法的对比:
1)Table2 是针对 4种丢弃策略进行对比,得到最好的效果是 ASDN联合训练 的结果;
2)ASTN 和 随机抖动(random jittering)做了对比,发现使用AlexNet,mAP分别是58.1%h和57.3%,使用VGG16,mAP分别是69.9%和68.6%,ASTN 的表现都比比随机抖动效果好。
作者对不同类别进行了分析:
可以看到,有一些种类的 AP 是下降的,有好也有坏,但功大于过。好的原因在于测试样本中可能出现了比较多的遮挡和形变情况;降低的原因在于对于正常目标的特征抽象能力下降。
定性分析:某些遮挡样本 可能会导致错分的情况(这是一把双刃剑啊),也就是说,过尤不及,当你想对目标特征的兼容性太强的时候,走向了另一个极端。
另外,作者给出了在 VOC2012 和 MS COCO 下的测试结果,都较原来有显著提高。
与 OHEM 对比:
本方法和 OHEM(Online Hard Example Mining)有些类似,都属于对 Hard Example 的挖掘,区别在于本方法是创建并不存在的Hard Positive 样本,而 OHEM 则是挖掘利用现有的 所有 Hard 样本,现实意义更高。
测试结果:在VOC 2007数据集上,本文方法略好(71.4% vs. 69.9%),而在VOC 2012数据集上,OHEM更好(69.0% vs. 69.8%)。作者又做了实验,VOC 2012数据集下,our approach+OHEM(71.7%),two OHEM(71.2),two our approach(70.2%),发现两个 OHEM 和 两个 our models 效果都不如混合效果好,说明这两种方法可以有效互补。
Conclusion:
将对抗网络引入目标检测,确实开了先河,估计以后还会有人在此基础上进一步改进。
从改善效果上来讲,并不比 OHEM 有多好的效果,也许是仿造的数据和真实性还存在差距,也许是真实世界的长尾并没有太多的影响,anyway,也许像大家说的一样,“学术意义大于工程意义”,就看接下来的童鞋如何 Follow 和改进了。
对抗网络之目标检测应用:A-Fast-RCNN的更多相关文章
- 第三十节,目标检测算法之Fast R-CNN算法详解
Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2 ...
- (四)目标检测算法之Fast R-CNN
系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
- 目标检测算法之Fast R-CNN和Faster R-CNN原理
一.Fast R-CNN原理 在SPPNet中,实际上特征提取和区域分类两个步骤还是分离的.只是使用ROI池化层提取了每个区域的特征,在对这些区域分类时,还是使用传统的SVM作为分类器.Fast R- ...
- 【目标检测】用Fast R-CNN训练自己的数据集超详细全过程
目录: 一.环境准备 二.训练步骤 三.测试过程 四.计算mAP 寒假在家下载了Fast R-CNN的源码进行学习,于是使用自己的数据集对这个算法进行实验,下面介绍训练的全过程. 一.环境准备 我这里 ...
- 目标检测算法之Fast R-CNN算法详解
在介绍Fast R-CNN之前我们先介绍一下SPP Net 一.SPP Net SPP:Spatial Pyramid Pooling(空间金字塔池化) 众所周知,CNN一般都含有卷积部分和全连接部分 ...
- (五)目标检测算法之Faster R-CNN
系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
- 【深度学习】目标检测算法总结(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)
目标检测是很多计算机视觉任务的基础,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息.本文对目标检测进行了整体回顾,第一部分从RCNN开始介绍基于候选区域的目标检测器,包括F ...
- 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN,Faster R-CNN
基于深度学习的目标检测技术演进:R-CNN.Fast R-CNN,Faster R-CNN object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.obj ...
- 目标检测方法总结(R-CNN系列)
目标检测方法系列--R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD 目录 相关背景 从传统方法到R-CNN 从R-CNN到SPP Fast R-CNN ...
随机推荐
- for循环,定时器,闭包混合一块的那点事。
1,对于一个基本的for循环,顺序输出变量值. for(var i = 1; i < 4; i++){ console.log(i);//结果不多说了吧 } 2,如果for循环中有定时器,如下代 ...
- MongoDB(课时15 数据排序)
3.4.2.10 数据排序 在MongoDB里数据排序操作使用“sort()”函数,在进行排序的时候可以有两个顺序:升序(1),降序(-1). 范例:排序 db.students.find().sor ...
- MongoDB(课时9 范围运算)
3.2.2.4 范围查询 只要是数据库,必须存在有“$in”(在范围之中).“$nin”(不在范围之中). 范例:查询姓名是“张三”,“李四”,“王五” db.students.find({" ...
- js 几个重要的特性
背景: 语法借鉴 java 函数借鉴 scheme 原型继承借鉴 self 正则表达式借鉴 Perl 1.动态语言 函数的定义和调用 形参与实参不需要一致 形参可由 argu ...
- Codeforces 556D - Case of Fugitive
556D - Case of Fugitive 思路:将桥长度放进二叉搜索树中(multiset),相邻两岛距离按上限排序,然后二分查找桥长度匹配并删除. 代码: #include<bits/s ...
- SQLSERVER 对于非dbo的表增加注释
平时我们创建表的时候总是dbo.imsi_collect_state,但是有时候为了方便管理我们可能会创建架构wifi,那么表名就是wifi.imsi_collect_state 原来增加注释的方式是 ...
- 周立功USBCAN-II 上位机开发(MFC)
使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件.例程和API文档等材料,可以参考. 1.库函数的调用 首先,把库函数文件都放在工作目录下.库函数文件总 ...
- 12月17日周日 form_for的部分理解。belongs_to的部分理解
1.lean guide:helper method query ,✅
- homestead 暴露接口到外网
laravel 官方推荐的运行环境是homestead,但homestead是个虚拟机,你自己访问没问题,给别人联调怎么办? 一个大型项目肯定不止一个人开发,这个时候就需要将你虚拟机上的接口暴露给外网 ...
- BST(二叉排序树)的插入与删除
值得一说的是删除操作,删除操作我们分为三种情况: 1.要删的节点有两个孩子: 找到左子树中的最大值或者右子树中的最小值所对应的节点,记为node,并把node的值赋给要删除的节点del,然后删除nod ...