YOLOv3-model-pruning 人手检测开源项目

我要开发同款
匿名用户2019年07月08日
54阅读
开发技术Python
所属分类人工智能、计算机视觉库/人脸识别
授权协议MIT

作品详情

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

环境

Python3.6,Pytorch1.0及以上

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

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

数据集准备下载数据集,得到压缩文件将压缩文件解压到data目录,得到hand_dataset文件夹在data目录下执行converter.py,生成images、labels文件夹和train.txt、valid.txt文件。训练集中一共有4087张图片,测试集中一共有821张图片正常训练(Baseline)pythontrain.py--model_defconfig/yolov3-hand.cfg剪枝算法介绍

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

剪枝算法的步骤

进行稀疏化训练

pythontrain.py--model_defconfig/yolov3-hand.cfg-sr--s0.01

基于test_prune.py文件进行剪枝(通过设定合理的剪枝规则),得到剪枝后的模型

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

pythontrain.py--model_defconfig/prune_yolov3-hand.cfg-precheckpoints/prune_yolov3_ckpt.pth稀疏训练过程的可视化

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

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

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

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

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

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

剪枝前后的对比

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

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

剪枝前后指标对比:

 参数数量模型体积Flops前向推断耗时(2070TI)mAPBaseline(416)61.5M246.4MB32.8B15.0ms0.7692Prune(416)10.9M43.6MB9.6B7.7ms0.7722Finetune(416)同上同上同上同上0.7750

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

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论