轻量级网络 - PVANet SuffleNet
一. PVANet
论文:PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection 【点击下载】
Caffe代码:【Github】
设计了一种轻量级的网络,取名叫 PVANet,特点是 Channel少、Layer多,在 VOC2007 和 VOC2012 精确度分别达到了 84.9% 和 84.2%,但计算量不到采用 ResNet-101 网络的 10%。
论文的核心要点:
1)改进的 C.ReLU
前面几层 用到了 CReLU,Concatenated Rectified Linear Units。
CReLU 来源于在 AlexNet 上的一个有趣的实验(参考论文【CReLU】):低层的卷积层中的一些滤波器核存在着负相关程度很高的滤波器核,而层次越高的卷积层,这一现象越不明显。作者把这一现象称为 pairing phenomenon。
根据这种特性,通过 Negation 实现 Concatenation,在不损失精度的情况下可以减少一半计算量。
作者基于 CReLU 进行了改进,添加了 Scale/Bias 层(见下图左),允许每个channel(通道)的斜率和激活阈值与其相反的 Channel 不同。
2)使用 Inception Net
“Inception 没有广泛应用在现有网络中”,目前来看使用的确实也不少了,不纠结这个,Inception 的优点是通过不同尺度的卷积核 对应不同大小的感受野,从而适应不同大小的目标。
上图右侧是 Inception 的网络结构,作者用两个 3*3 的 Conv 替代 5*5 的 Conv,其中 1*1 的 Conv保留特征尺度,直接连接定义 残差。
3)深度网络训练
a)使用了 Residual Net 和 BN(Batch Norm),ResNet 与 Inception Layer 连接;
b)通过自定义策略 “Plateu” 动态调整学习率,如果 moving average of loss 在迭代周期内低于一个预设值,触发 “on-plateau”,将学习率动态减少一个常量。
从一般意义上来说,动态调整学习率 可以有效避免震荡,提高训练精度。
4)整体设计
以表的形式给出各层的 Detail:
5)Hyper-feature concatenation
多尺度的特征组合在很多文献中都有大量应用,文中用在目标检测上,能够对多尺度的目标进行有效检测。
如下图所示,采用了三个不同 Scale 进行 Feature 联合。
PVA 是个轻量级网络,基本能够达到实时(Titan X),对于实时系统应用的童鞋可以考虑。
【训练过程】
1)安装 Caffe 依赖库
必要的 caffe 依赖库:
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compilersudo apt-get install --no-install-recommends libboost-all-devsudo apt-get install libatlas-base-dev # sudo apt-get install libopenblas-devsudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
安装 CUDA 和 cuDNN (请参考其他教程,这里不再展开)
2)下载 PVANet
> 下载 Github 源码,直接下载或 命令行:
Git clone --recursive https://github.com/sanghoon/pva-faster-rcnn.git
> 根据自己的配置修改 Makefile.config 文件:
cd $pva-faster-rcnn/caffe-fast-rcnncp Makefile.config.example Makefile.config
需要修改的几个地方:
USE_CUDNN := 1CUSTOM_CXX := g++CUDA_ARCH := -gencode arch=compute_52,code=sm_52BLAS := atlasPYTHON_INCLUDE := /usr/include/python2.7 \/usr/lib/python2.7/dist-packages/numpy/core/includePYTHON_LIB := /usr/libWITH_PYTHON_LAYER := 1 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
MakeFile:
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
pva-faster-rcnn/lib/setup.py:
extra_compile_args={'gcc': ["-Wno-unused-function"],'nvcc': ['-arch=sm_52',
> 编译 Cython:
cd $pva-faster-rcnn/libmake
> 编译 caffe 和 pycaffe:
cd $pva-faster-rcnn/caffe-fast-rcnnmake –j8 & make pycaffe & make distribute
fatal error: caffe/proto/caffe.pb.h: No such file or directory
$ protoc src/caffe/proto/caffe.proto --cpp_out=.$ mkdir include/caffe/proto$ mv src/caffe/proto/caffe.pb.h include/caffe/proto
执行完后修改bashrc文件,添加python path
sudo gedit ~/.bashrcexport PYTHONPATH=${HOME}/caffe/distribute/python:$PYTHONPATHexport LD_LIBRARY_PATH=${HOME}/caffe/build/lib:$LD_LIBRARY_PATH
使得python能够找到caffe的依赖。
3)下载VOC数据
按照顺序执行下载及解压(否则解压不到一个文件夹)
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tarwget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tartar xvf VOCtrainval_06-Nov-2007.tartar xvf VOCtest_06-Nov-2007.tartar xvf VOCdevkit_08-Jun-2007.tar
将得到的 VOCdevkit,建立软链接(命名为 VOCdevkit2007),并Copy到 $pva-faster-rcnn/data/ 目录下。
4)测试预训练模型
进入根目录,按如下脚本测试:
# Download PVANet detection model for VOC2007. ./models/pvanet/download_voc2007.sh# Download PVANet detection model for VOC2012 (published model). ./models/pvanet/download_voc_best.sh# (Optional) Download all available models (including pre-trained and compressed models). ./models/pvanet/download_all_models.sh# (Optional) Download ILSVRC2012 (ImageNet) classification model. ./models/pvanet/download_imagenet_model.sh
测试 demo:
python ./tools/test_pvanet.py
5)自定义训练
> 修改训练 类别(num_classes)
打开文件 /models/pvanet/example_finetune/train.prototxt
修改 input、cls_score、bbox_pred、roi-data 中的 num_classes(如果只检测1类的话,改为2)
> 修改 lib/datasets/pascal_voc.py
self._classes = ('__background__', # always index 0
'people')(只有这一类)
> 修改 lib/datasets/imdb.py
在代码行 boxes[:, 2] = widths[i] - oldx1 - 1 下面加入代码:
for b in range(len(boxes)):if boxes[b][2]< boxes[b][0]:boxes[b][0] = 04)
> 编译修改脚本
进入 lib/datasets 目录,删除原来的 pascal_voc.pyc 和 imdb.pyc 文件(.pyc 是Python编译后的文件),重新编译:
python>>>import py_compile>>>py_compile.compile(r'pascal_voc.py')>>>py_compile.compile(r'imdb.py')
> 训练及测试数据
cd $pva-faster-rcnn./tools/train_net.py --gpu 0 --solver models/pvanet/example_finetune/solver.prototxt --weights models/pvanet/full/test.model --iters 100000 --cfg models/pvanet/cfgs/train.yml --imdb voc_2007_trainval
测试模型
./tools/test_net.py --gpu 0 --def models/pvanet/example_finetune/test.prototxt --net output/faster_rcnn_pavnet/voc_2007_trainval/pvanet_frcnn_iter_100000.caffemodel --cfg models/pvanet/cfgs/submit_160715.yml
6)类别设置
(cudaSuccess 8 vs. 0)一般情况下都是因为显卡的计算能力不同而导致的,修改 py-faster-rcnn/lib/setup.py 的第135行,将arch改为与你显卡相匹配的数值,(GTX1080,计算能力是6.1,就将sm_35改成了sm_61)然后删除utils/bbox.c,nms/cpu_nms.c ,nms/gpu_nms.cpp 重新编译即可.
二. SuffleNet
论文:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 【点击下载】
这篇文章出自 Face++ 的孙剑大神组,主要目的是通过减少网络计算量,达到在移动端应用的目的。文章比较 MobileNet (State-of-the-art),在同样计算量的情况下有 6.7% 的提升。
SuffleNet 是属于模型优化的范畴,对于模型优化有很多种方法,这里先大致列一下,后面会有专门的总结介绍。
> Efficient Model Designs(高效的模型设计)
这里主要强调两种加速计算的方法,Group Convolution 和 Depthwise Convolution,也正是本文所采用的模型优化设计思路。
Group Convolution 最早来自于 AlexNet,经典的拓扑图展示了把 Channel 划分到不同 Group 进行卷积,原文是为了在两个 GPU 计算,这是最早的通道拆分概念;
Depthwise Separable Convolution 将 标准的Conv操作 分解成一个 Depthwise Conv(独立通道) 和一个 PointWise Conv(1*1的卷积),以此减少计算量;
Depthwise 每个卷积核(Filter)只对一个 Channel 进行卷积计算,Pointwise Conv 执行通道合并,可以理解为:
Depthwise Separable Convolution = Depthwise Convolution + Pointwise Convolution
基于该思路设计的框架如 Xception,ResNeXt,我傻傻的分不太清, MobileNet 也是这个思路。
> Model Acceleration(模型加速)
Pruning(剪枝) 是最直观的一种加速方法,思路比较简单,即去除权值较小的 Connection,或者减少 Channel 数量,得到稀疏的网络连接。
Quantization(量化) 用于参数压缩,包括下面两个方向:
a)将 Float32 量化为 8bit 定点数或更少,减少模型计算量 和 参数存储大小(缺点是精度下降),同时借助 SIMD 等策略实现批量计算;二值化网络是参数量化的一个极端情况,比较典型的是 BinaryNet 和 Xnor-net。
b)权值共享 -通过对权值进行压缩来得到共享权值,共享信息一般通过聚类来得到。
Factorization(因式分解) 主要用于降低全连接层的计算。
Distilling(知识迁移)将大模型训练的知识 迁移到 小模型。可以看一下 Hinton 的蒸馏模型 - Distilling the knowledge in a neural network。
● Channel Shuffle
Shuffle 是本文的核心概念,引入 Shuffle 是为了解决 Group Convolution 的问题:
(a)只用 GConv 来做的话,卷积只在 Group Channel 内部计算,Group 之间(下图颜色区分)相互独立;
问题在于不同 Group 之间没有信息Flow,缺乏 inter 信息,模型精度会比较差。
(b)不同 Group 之间的 Channel 重新分配,增加 Group 之间的信息 Flow;
重新分配与 原始的 Conv 一样,都加入了 inter 信息,但计算量降低很多。
(c)作者加入的 Channel Shuffle,实现与(b)一样的功能;
专门提到通过 Shuffle 方式,两个 GConv(GConv1 & GConv2) 之间的 Group 是可以不同的。
● ShuffleNet Unit
ShuffleNet 单元引入了上面的 Shuffle 层,先来看图:
图(a)是原始的 Bottle Neck Units,引入了 3*3 的 DepthWise Conv(比较重要),这里 Depthwise 是指在每个独立的通道进行计算,通道之间不交叠,Depthwise Conv 最大层度上减少计算量。前面讲过,采用这总结构的网络包括:ResNet、Xception 和 MobileNet。
可以看到,图(a)中的 1x1 Conv 并未做优化,可以认为全部计算的(full connection),根据作者统计这部分计算量占比达到 93.4%,这个比例相当惊人,不优化不足以平民愤,于是该 Channel Shuffle 出场了,参考上图(b)来看作者的改进包括哪些:
1)通过 1x1 的 GConv+Shuffle 替代原来的 1x1部分,在不降低计算精度的情况下大大减少计算量;
2)去掉了 DWConv后面的 ReLU部分,这个可以自己看论证;
上图(c)给出了另一种结构:
1)在 ShortCut 添加了 Avg Pool 实现降采样,同时将 DWConv Stride 改为2,与之匹配;
2)用 Concat 替换原来的 Add,增加 Channel 数量;
● 网络架构
ShuffleNet 网络结构也比较清晰,如下图:
另外 Group 的 size 数量影响分类误差,对于固定计算量的情况,Group越多,对应的channel 通过也就越多,通常精度会提升,当然不会无限提升,在和 Filter 数量达到一定比例的情况下(可以理解为混淆比较均匀),精度最高。
作者通过 Scale 来控制 Filter 数量,Filter越少,计算量相应也就越少。
来看下图:
● 实验对比
采用ResNeXt 的方法进行训练,只做了两个小的改动:
1)将权值衰减从1e-4 减少为 4e-5;
2)只用了简单的 Scale 做数据增强;
这样做的依据是 小网络通常容易欠拟合 而不是过拟合,类似的 MobileNet 也采用了同样的策略进行训练。
Table3 对比了 Channel Shuffle 带来的作用:
下面给出了 ShuffleNet 与 经典网络、轻量级MobileNet 之间的对比:
与经典网络的复杂度比较(在同样准确度的情况下):
在 MS COCO 上测试 ShuffleNet 的泛化性能:
最后给出实测数据,相对于 AlexNet 有 13倍的提高:
轻量级网络 - PVANet SuffleNet相关推荐
- 轻量级网络--ShuffleNet论文解读
ShuffleNet ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 原文地址: ...
- 检测、分割用什么轻量级网络呢?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 由于深度学习的关系,计算机视觉领域发展迅速,各大榜单精度刷的很高, ...
- 14种轻量级网络综述 — 主干网络篇
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨VincentLee 来源丨晓飞的算法工程笔记 编辑丨极市平台 导读 早期的卷积神经很少考虑参数 ...
- 混合深度卷积,更少参数下的轻量级网络
作者:Tom Hardy Date:2020-01-08 来源:混合深度卷积,更少参数下的轻量级网络
- 基于Attention机制的轻量级网络架构以及代码实现
点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要10分钟 Follow小博主,每天更新前沿干货 导读 之前详细介绍了轻量级网络架构的开源项目,详情请看深度学习中的轻量级网络架构总结与代码实现 ...
- MobileNetV1/V2/V3简述 | 轻量级网络
MobileNet系列很重要的轻量级网络家族,出自谷歌,MobileNetV1使用深度可分离卷积来构建轻量级网络,MobileNetV2提出创新的inverted residual with line ...
- 大幅涨点!孙剑团队提出新激活层ACON和轻量级网络TFNet
知乎原文: https://zhuanlan.zhihu.com/p/363274457 论文链接: https://arxiv.org/pdf/2009.04759.pdf 代码: https:// ...
- nmap扫描ipv6端口_Flan Scan:Cloudflare开源的轻量级网络漏洞扫描程序
日前,Cloudflare宣布开源其内部的轻型网络漏洞扫描工具Flan Scan.Flan Scan是一款基于Nmap打包的Python漏洞扫描程序.基于Nmap的开源强大,灵活性,Cloudflar ...
- CVPR 2021 | 大幅涨点!新型动态激活函数和轻量级网络TFNet
点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:旷视研究院 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 ...
最新文章
- 苹果回应 XcodeGhost:暂未发现个人信息受影响
- HDU 2504 又见GCD
- 自己设计java流程审核_关于工作流引擎取回审批的设计方案与实现过程
- Intel Realsense 通过用户配置文件(profile)获取深度传感器(depth_sensor)超蛋疼的一幕 dir()
- Qt for Python Mac下使用 fbs 打包软件
- 重学深度学习系列-回归
- linux 音频驱动的流程,Intel平台下Linux音频驱动流程分析
- 我是如何使用git把本地代码上传到CODECHINA上的,值得借鉴
- 从坐标移动_ABB知识点13:工件坐标系定义
- java 日志接收服务器_Java SMTP 发信收不到, 日志显示服务器接收了
- 后代元素 span:first-child{...}
- 如何减少返工工作量?
- 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- html和css基础整理
- 【学术技巧】论文答辩,老师会仔细看论文内容吗?
- 【mcuclub】舵机-SG90
- java 什么意思_Java中的“ ”是什么意思?
- 分享一个简易的AT变速箱(TCU)换挡逻辑控制模型
- 小程序CMS动态处理数据之内容模型和内容集合的使用
- 阿里妈妈-网络广告位投资策略
热门文章
- 【Bug解决】curl: (7) Failed connect to 192.168.159.133:8888; No route to host
- Element-UI安装与使用
- PCB邮票孔的作用及详细设计指南
- 爱看小说手机网源码全站带3w数据带采集,ThinkPHP内核小说网站源码带听书等全部插件
- java license 验证方案_truelicense实现JAVA的license机制(包括license生成和验证)
- 龙芯+复旦微FPGA全国产VPX高速数据采集卡解决方案
- 国际商务英语学习[三]
- 解读WPF中的Binding
- 在线客服api是什么?
- 与 Hadoop 对比,如何看待 Spark 技术