人手检测 YOLOv3-model-pruning

MIT
Python
跨平台
2019-07-08
红薯

用 YOLOv3 模型在一个开源的人手检测数据集 oxford hand 上做人手检测,并在此基础上做模型剪枝。对于该数据集,对 YOLOv3 进行 channel pruning 之后,模型的参数量、模型大小减少 80% ,FLOPs 降低 70%,前向推断的速度可以达到原来的 200%,同时可以保持 mAP 基本不变(这个效果只是针对该数据集的,不一定能保证在其他数据集上也有同样的效果,之后有时间的话会在其他数据集上进行测试)。

环境

Python3.6, Pytorch 1.0及以上

YOLOv3 的实现参考了 eriklindernoren 的 PyTorch-YOLOv3 ,因此代码的依赖环境也可以参考其 repo

目前部分代码(如prune_utils.py文件)还在修改和完善,最近比较忙,待整理好再发出来

数据集准备

  1. 下载数据集,得到压缩文件
  2. 将压缩文件解压到 data 目录,得到 hand_dataset 文件夹
  3. 在 data 目录下执行 converter.py,生成 images、labels 文件夹和 train.txt、valid.txt 文件。训练集中一共有 4087 张图 片,测试集中一共有 821 张图片

正常训练(Baseline)

python train.py --model_def config/yolov3-hand.cfg

剪枝算法介绍

本代码基于论文 Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017) 进行改进实现的 channel pruning算法,类似的代码实现还有这个 yolov3-network-slimming。原始论文中的算法是针对分类模型的,基于 BN 层的 gamma 系数进行剪枝的。本项目用到的剪枝算法不限于 YOLOv3 模型,稍作改进理论上也是可以移植到其他目标检测模型的。

剪枝算法的步骤

  1. 进行稀疏化训练

    python train.py --model_def config/yolov3-hand.cfg -sr --s 0.01
  2. 基于 test_prune.py 文件进行剪枝(通过设定合理的剪枝规则),得到剪枝后的模型

  3. 对剪枝后的模型进行微调(本项目对原算法进行了改进,实验过程中发现即使不经过微调也能达到较高的 mAP)

    python train.py --model_def config/prune_yolov3-hand.cfg -pre checkpoints/prune_yolov3_ckpt.pth

稀疏训练过程的可视化

  1. 所有 BN 的 gamma 系数的五个五分位点随时间的变化图:

    经过 10 次迭代后,60%的 gamma 系数已趋向于 0,40 次迭代后 80% 的 gamma 系数已趋向于 0

  2. YOLOv3中第一个 BN 层的 gamma 系数随迭代次数的变化情况:

    随着模型的更新,部分 gamma 系数逐步趋向于 0(表明其重要性逐渐削弱),而部分 gamma 系数能够保持其权重(表明其对网络的输出有一定的重要性)

  3. 所有 BN 的 gamma 系数的分布随迭代次数的变化:

    分布的重心逐渐向 0 靠近,但并没有全部衰减为 0,表明 gamma 系数逐渐变得稀疏

剪枝前后的对比

  1. 下图为对部分卷积层进行剪枝前后通道数的变化:

    部分卷积层的通道数大幅度减少

  2. 剪枝前后指标对比:

      参数数量 模型体积 Flops 前向推断耗时(2070 TI) mAP
    Baseline (416) 61.5M 246.4MB 32.8B 15.0 ms 0.7692
    Prune (416) 10.9M 43.6MB 9.6B 7.7 ms 0.7722
    Finetune (416) 同上 同上 同上 同上 0.7750

    加入稀疏正则项之后,mAP 反而更高了(在实验过程中发现,其实 mAP上下波动 0.02 是正常现象),因此可以认为稀疏训练得到的 mAP 与正常训练几乎一致。将 prune 后得到的模型进行 finetune 并没有明显的提升,因此剪枝三步可以直接简化成两步。剪枝前后模型的参数量、模型大小降为原来的 1/6 ,FLOPs 降为原来的 1/3,前向推断的速度可以达到原来的 2 倍,同时可以保持 mAP 基本不变。需要明确的是,上面表格中剪枝的效果是只是针对该数据集的,不一定能保证在其他数据集上也有同样的效果

的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

WEKA,classify,J48

简介 生成pruned或unpruned的C4.5决策树。 选项 binarySplits-是否对nominal attributes使用bianry splits。 confidenceFactor-值越小删除越多instance debug-如果设置为true,则输出另外的信...

2012/09/09 09:34
970
0
YOLO初学,主要对YOLO代码进行理解

相关知识点: IOU:https://blog.csdn.net/iamoldpan/article/details/78799857 YOLO1:https://blog.csdn.net/m0_37192554/article/details/81092514 YOLO2:https://blog.csdn.net/lwplwf/...

05/28 10:38
0
0
Applying decision trees

1: The Dataset In the past two missions, we learned about how decision trees are constructed. We used a modified version of ID3, which is a bit simpler than the most common tree...

2016/09/29 07:58
7
0
ImageAI v2.03 各种模型介绍

对象检测objectdetection - RetinaNet (Size = 145 mb, high performance and accuracy, with longer detection time) - YOLOv3 (Size = 237 mb, moderate performance and accuracy, with a...

07/04 17:01
1
0
YoLov3训练自己的数据集

1.标注自己的数据集。用labelimg进行标注,保存后会生成与所标注图片文件名相同的xml文件,如图。我们标注的是各种表,名称就简单的按外观大小分了s、m、l、xl、xxl共5类标签名 2.下载yolov...

2018/09/27 14:36
2.2K
1
Hive 基于成本的优化器

Introducing Cost Based Optimizer to Apache Hive John Pullokkaran Hortonworks 10/08/2013 Abstract Apache Hadoop is a framework for the distributed processing of large data sets u...

2015/01/06 00:27
120
0
Lucene 3.6 contrib 学习总结

analyzers : 各种分词器 以国家、语言、功能进行分类 grouping : 分组统计 ,可以对各Field进行几个级别的搜索结果中field值的统计 highlighter : 高亮,搜索结果Document中的空间向量文本...

2012/04/20 23:09
534
0
Weka开发[6]-参数设置

这一次介绍的非常简单,会用传命令行参数的人就不用浪费时间看这一篇了,这一篇介绍weka中一些类参数传递的问题。 首先要传递参数当然要知道参数有哪些,有什么作用,要知道这些,建议用Wek...

2015/10/17 22:38
150
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部