论文:https://www.arxiv.org/pdf/1608.08021v3.pdf
code:https://github.com/sanghoon/pva-faster-rcnn
细看:
摘要
1.实现了高精确度的多类目标检测任务同时通过调整和结合最近的技术创新达到最小化计算cost的目标
2.使用" CNN feature extraction + region proposal + RoI classification"的结构,主要对feature extraction(特征提取)进行重新设计。因为,region proposal部分计算量不太大而且classification部分可以使用通用的技术(例如:truncated SVD)进行有效的压缩。
3.设计原则:less channels with more layers 和 采用一些building blocks(包括:串级的ReLU、Inception和HyperNet)
训练。
5.结果:VOC2007——83.8%mAP;VOC2012——82.5%mAP,46ms/image在NVIDIA Titan X GPU;计算量是ResNet-101的12.3%(理论上)
1 介绍
准确率很高的检测算法有heavy computational cost,现在压缩和量化技术的发展对减小网络的计算量很重要。这篇文章展示了我们用于目标检测的一个轻量级的特征提取的网络结构——PVANET,它达到了实时的目标检测性能而没有损失准确率(与现在先进的系统比较):
- Computational cost:输入1065*640大小的图像在特征提取时需要7.9GMAC(ResNet-101:80.5GMAC)
- Runtime performance:750ms/image (1.3FPS) 在 Intel i7-6700K CPU (单核);46ms/image (21.7FPS) on NVIDIA Titan X GPU
- Accuracy: 83.8% mAP on VOC-2007; 82.5% mAP on VOC-2012 (2nd place)
设计的关键:less channels with more layers 和 采用一些building blocks(其中有的未证实对检测任务有效)
Concatenated rectified linear unit)被用在我们的CNNs的初期阶段来减少一半的计算数量而不损失精度。
Inception modules可以比线性链式的CNNs更有效的捕捉大范围的大小变化的目标。
multi-scale representation的思想(像HyperNet中)结合多个中间的输出,所以,这使得可以同时考虑多个level的细节和非线性。
有效地训练
网络的简单的描述——2;PVANET的细节总结——3;实验,训练和测试的细节——4
2 网络设计的细节
2.1 C.ReLU:Earlier building blocks in feature generation
C.ReLU是在ICML2016一篇文章提出。文章发现,CNN的初期阶段,神经元的激活值正好相反。C.ReLU把卷积输出的通道数减半,将输出与其负向输出级联,在没有损失正确率的情况下,获得两倍的加速。
C.ReLU来源于CNNs中间激活模式引发的。输出节点倾向于是"配对的",一个节点激活是另一个节点的相反面。根据这个观察,C.ReLU减少一半输出通道(output channels)的数量,通过简单的连接相同的输出和negation使其变成双倍,即达到原来输出的数量,这使得2倍的速度提升而没有损失精度。
C.ReLU的实现:
与原始的C.ReLU相比,我们增加了scaling and shifting(缩放和移动)在concatenation(串联)之后,这允许每个channel(通道)的斜率和激活阈值与其相反的channel不同。
2.2 Inception:Remaining building blocks in feature generation
Inception是GoogleNet的重要组成模块,却还没用在检测任务上。Inception中的1x1卷积核不仅能够增加网络的非线性,同时能够保持前一层的感受野,因此对小物体的检测有很好的作用。文中还把原来5x5的卷积核换成两个3x3的卷积核,减少参数,增加网络非线性和模块感受野。
小目标和大目标的最具有cost-effective(成本效益)的building blocks之一。为了学习 捕获大目标的视觉模式,CNNs的输出特征应该对应于足够大的感受野,这可以很容易的通过叠加 3*3或者更大的核(kernel)卷积实现。在另外一方面,为了捕获小尺寸的物体,输出特征应该对应于足够小的感受野来精确定位小的感兴趣region。
上面所示的Inception可满足以上需求。最后面的1*1的conv扮演了关键的角色,它可以保留上一层的感受野(receptive field)。只是增加输入模式的非线性,它减慢了一些输出特征的感受野的增长,使得可以精确地捕获小尺寸的目标。
上图说明了实现的Inception。5*5的conv用2个顺序的3*3的conv代替。
2.3 HyperNet:Concatenation of multi-scale intermediate outputs(连接多尺度的中间输出)
多尺度表示和它们的结合在许多dl任务中被证明是有效的。细粒度细节与高度概括的语义信息的结合有助于随后的region proposal网络和分类网络检测不同尺度的目标。然而,因为直接连接所有的abstraction layers也许产生有很多计算需要求的冗余信息(redundant information),我们需要仔细设计不同 abstraction layers和layers的数量。如果选择的层对于object proposal和分类太早的话,当我们考虑增加计算复杂度的话帮助很小。
我们的设计选择不同于ION和HyperNet。We choose the middle-sized layer as a reference scale (= 2x), and concatenate the 4x-scaled layer and the last layer with down-scaling (pooling) and up-scaling (linear interpolation), respectively.
2.4 深度网络训练
文章用了residual connections 和batch normalization加速网络收敛。BN层加在ReLU层后面,学习率根据plateau detection自动调整。
RPN用了25个anchor(5 scales(3,6,9,16,25),5 aspect ratios(0.5,0.557,1.0,1.5,2.0))。最后的全连接层使用了简单的SVD分解,map有部分降低,检测速度加快。
随着网络深度的增加,训练会更加的麻烦。我们采用residual structures解决此问题。
与原residual不同,
将residual连接到Inception layers以稳定网络框架的后半部分,
在所有的ReLU 激活层(activation layers)前添加Batch normalization layers。mini-batch样本统计用于pre-training阶段,并且随后moving-averaged统计作为固定的尺度和移动的参数。
基于plateau detection动态地控制学习率。我们采用移动平均数(moving average)损失并且如果在某次的迭代周期期间其改进低于一个阀值,则将其确定为on-plateau(高原)。无论何时plateau被检测到,学习率减少一个常数因子。在实验中,我们的学习率策略对准确率有一个显著的结果。
3 Faster R-CNN with our feature extraction network
表一显示了PVANET的整个结构。在初期(conv1_1,...,conv3_4),C.ReLU用在卷积层来减少一半K*K conv的计算消耗。1*1conv layers添加在K*K conv的前面和后面,目的是减少输入的大小然后分别表示的能力。
三个中间输出conv3_4(with down-scaling)、conv4_4和conv5_4(with up-scaling)结合到512-channel多尺度输出特征(convf),之后被送到Faster R-CNN模型:
•计算的有效性。仅convf的前128通道被送到the region proposal network(RPN)。我们的RPN是一系列"3*3conv(384channels- 1x1 conv(25x(2+4) = 150 channels)"层来生成regions of interest(RoIs)。
•R-CNN采用convf中的全部512 channels。对于每一个RoI,RoI pooling 生成 6*6*512 tensor(张量),之后通过一系列的"4096-4096-(21+84)"的输出节点的FC layers。
4 Experimental results
4.1 Training and testing
PVANET 用1000类别的 ILSVRC2012 训练图像进行预训练。所有的图像被调整到256*256大小,之后随机裁剪成192*192的patches被作为网络的输入。学习率的初值设为0.1,之后只要检测到plateau时就以因子
减少。若学习率小于1e-4就终止预训练,这个过程大约需要2M次迭代。
之后,PVANET在联合的数据集(MS COCO trainval,VOC2007 trainval 和 VOC2012 trainval)训练。之后用VOC2007 trainval 和 VOC2012 trainval进行fine-tuning(微调)也是需要的,因为在MS COCO和VOC竞赛的类别定义是稍有不同。训练数据被随机的调整大小,图像较短的边的长度在416和864之间。
对于PASCAL VOC评价,每个输入图像调整大小使其短的一边为640。所有有关Faster R-CNN的参数被设置在原始的work中,除了在极大值抑制(NMS:non-maximum suppression)(=12000)前的proposal boxes的数量和NMS的阈值(=0.4)。所有的评估在单核的Intel i7-6700K CPU和 NVIDIA Titan X GPU 上完成。
4.2 VOC2007
Table2展示了我们的模型在不同配置下的准确率。由于Inception和多尺度feature,我们的RPN产生的initial proposals非常的准确。因为结果表示超过200个proposals没有对检测的准确率起到显著的帮助,我们在剩下的实验中把proposals 的数量固定在200个。我们也测量了当迭代回归不使用时用带有bounding-box voting的性能。
Faster R-CNN包含的FC layer,它容易压缩并且准确率没有显著的下降。我们通过the truncated singular value decomposition (SVD)把"4096-4096"的FC layer压缩成"512-4096-412-4096",之后进行一些微调。这个压缩的网络达到了82.9%mAP(-0.9%)而且运行达到了31.3FPS(+9.6FPS)
4.3 VOC2012
Table3总结了PVANET+和一些先进的网络在PASCAL VOC2012排行榜上的比较。我们PVANET+达到了82.5%mAP,位列排行榜的第二名,超过其他竞争者除了"Faster R-CNN + ResNet-101"。然而第一名使用的ResNet-101比PVANET大很多同时一些耗时的技术,例如global contexts(全局上下文)和多尺度测试,导致至少比我们慢40倍。在Table3,won,我们也比较computation cost。在所有超过80%mAP的网络中,PVANET是唯一一个运行时间小于50ms的。考虑精度和计算cost,PVANET+是排行榜中最有效的网络。
参考文章:
问题汇总:
- inplace:
- 如修改一个文件等对象时,
- inplace=True,不创建新的对象,直接在原始对象上尽心修改;
- inplace=False,在对原始对象进行修改,而会创建新的对象;
- vanity url:虚拟地址空间,表示某平台下,个人申请的不会出现重名的唯一域名空间;
1. vanilla
Vanilla often refers to pure or plain.在计算机编程的范畴中,通常表示不使用第三方库或任何相关的框架平台等。
2. compiling、linking、building
What is the difference between compile code and executable code?
- compiling:source code ⇒ object code
- linking: 将相关的库链接到目标码中
- building:组合了编译和链接的过程,也可能包含其他的一些操作(such as installer creation)
3. delegate:委托代理
- 他们选派他作他们的代表。
- 然后可以单独调用每个委托。
- 我应该把这个任务委托给别人,还是直接拒绝?
4. delegate vs. proxy
proxy :译为代理, 被代理方(B)与代理方(A)的接口完全一致。 主要使用场景(语义)应该是:为简化编程(或无法操作B),不直接把请求交给被代理方(B),而把请求交给代码方(A),由代理方与被代理方进行通信,以完成请求。
delegete : 译为委托,主要语义是:一件事情(或一个请求)对象本身不知道怎样处理,对象把请求交给其它对象来做;
命令语法:
rm [OPTION]... FILE...
命令参数:
参数 | 长参数 | 描叙 |
-f | --force | 强制删除,忽略不存在的文件,从不给出提示。 |
-i | --interactive | 交互模式删除文件,删除文件前给出提示。 |
-r | --recursive | 递归的删除目录下面文件以及子目录下文件。 |
-R | --recursive | 递归的删除目录下面文件以及子目录下文件。 |
-v | --verbose | 显示运行时详细信息 |
| --help | 显示命令在线帮助 |
| --version | 显示命令版本信息 |
NVCC compile:
1.指定编译阶段
主要指定编译的阶段以及要编译的输入文件。
-cuda -cubin -fatbin -ptx -gpu -E
-c :最常使用,编译每个.c/.cc/.cpp/.cxx/.cu输入文件为object文件
-dc -dw -dlink -link
-dc编译选项可参考: https://devblogs.nvidia.com/parallelforall/separate-compilation-linking-cuda-device-code/
-rdc: relocatable device code
参考CUDA C Programming Guide D.3.3.2
如使用cuda dynamic parallelism时,可编译程序:
nvcc -arch=sm_35 -I ../../common/inc/ -lcudadevrt -rdc=true cdpSimpleQuicksort.cu -o cdpSimpleQuicksort
lcudadevrt指链接static cuda library: device runtime library
-lib :编译所有的输入文件为object文件,并且把结果添加到指定的library输出文件
-run
2.文件和路径配置
-o :指定输出文件的位置和名称
-include :指定预处理和编译时预先需要包含的头文件
-l :指定链接时需要的库文件
-D :指定预处理和编译时需要的宏
-U :取消宏定义
-I :指定包含文件的搜索路径
-isystem :指定系统包含的引用文件的搜索路径
-L :指定库文件的搜索路径
-odir :指定输出文件的目录
-ccbin :指定host编译器所在路径
-cudart :指定CUDA runtime library使用类型(none,shared,static),默认为static
-ldir :指定包含libdevice库文件目录
3.指定编译器、连接器的行为
-pg
-g :产生可调式代码,调试模式下必须的
-G :产生可调式的设备代码
-lineinfo :为设备代码产生行number信息
-O :产生优化代码 ,包括O0,O1,O2,O3,用于产生不同的指令集
-ftemplate-backtrace-limit -shared -x -std -nohdinitlist -nohdmoveforward -expt-relaxed-constexpr
-m :指定平台结构32 vs 64
4.编译工具内部选项
-Xcompiler -Xlinker -Xarchive -Xptxas -Xnvlink
-Xptxas -v:显示代码生成的统计结果
-Xptxas -dlcm=cg:关闭L1cache
-Xptxas -dlcm=ca:将L1cache增加到48KB(默认为16KB,和shared memory一共64KB)
5.编译驱动引导选项
-noprof -dryrun
-v :列出nvcc产生的编译命令,不影响其执行
-keep :保留各步骤产生的中间文件,用于调试
-keep-dir -save-temps
-clean :逆转nvcc的行为
-run-args -idp -ddp -dp -MT -nodlink
6.CUDA编译方式选项
-default-stream
7.驾驭GPU代码生成选项
-arch :指定GPU架构
-code -gencode -rdc -e
-maxrregcount :指定GPU函数可使用的最大寄存器数量
-use_fast_math -ftz -prec-div -prec-sqrt -fmad
8.ptxas选项
-allow-expensive-optimizations -c -dlcm -dscm -g -disable-optimizer-consts -e -fmad -flcm -fscm -lineinfo -arch -h -m -maxrregcount -O -optf -o -preserve-relocs -sp-bound-check -v -V -Werror -warn-double-usage -warn-spills