小小甜菜yolov3剪枝爬坑记

小小甜菜yolov3剪枝爬坑记

前言

在菠菜大佬的安利下,萌新的我开始研究模型剪枝,这个领域比较陌生,我会慢慢更新。这里感谢菠菜,松菇和漂大佬们对我的教导。

初始模型训练

在这里为使用的是菠菜推荐的AlexeyAB版本的darknet训练框架,推荐理由是模型map训练精度高,emmm大佬说啥就是啥吧,以后我会测试下其它版本的效果。

安装

git clone https://github.com/AlexeyAB/darknet
sudo apt-get install libopencv-dev
#安自己设备修改Makefile
mkdir build-release
cd build-release
cmake ..
make
make install

数据集制作

我使用的是coco2017数据集,通过提取其person类作为模型数据集

使用

# 测试图片
./darknet detector test /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person.cfg backup/yolov3-spp-person_6000.weights /home/xs/xs_train/data/coco/JPEGImages/000000391895.jpg
# 训练模型
./darknet detector train /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person.cfg weights/darknet53.conv.74 -map
# 重训练模型
./darknet detector train /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person.cfg backup/yolov3-spp-person_10000.weights
# 测试模型
./darknet detector map /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person.cfg backup/yolov3-spp-person_10000.weights

调试结论

我训练了30000轮,得到map 0.71的模型精度。

模型剪枝

使用的是漂大佬的开源项目,yolov3-channel-and-layer-pruning

使用

#测试原始模型
python3 test.py --cfg /home/xs/xs_train/data/coco/yolov3-spp-person.cfg --data /home/xs/xs_train/data/coco/voc.data --weights weights/yolov3-spp-person.weights
#初始训练稀疏模型
python3 train.py --cfg /home/xs/xs_train/data/coco/yolov3-spp-person.cfg --data /home/xs/xs_train/data/coco/voc.data --weights weights/yolov3-spp-person.weights --epochs 300 --batch-size 32 -sr --s 0.001 --prune 1
#重训练稀疏模型
python3 train.py --cfg /home/xs/xs_train/data/coco/yolov3-spp-person.cfg --data /home/xs/xs_train/data/coco/voc.data --weights weights/last.pt --epoch 70 --batch-size 16 -sr --s 0.001 --prune 1
#剪枝
python3 layer_channel_prune.py --cfg /home/xs/xs_train/data/coco/yolov3-spp-person.cfg --data /home/xs/xs_train/data/coco/voc.data --weights weights/last.pt --shortcuts 16 --global_percent 0.93 --layer_keep 0.01
#微调
python3 train.py --cfg /home/xs/xs_train/data/coco/yolov3-spp-person-prune.cfg --data /home/xs/xs_train/data/coco/voc.data --weights weights/prune_0.93_keep_0.01_16_shortcut_last.weights --epochs 70 --batch-size 32

调试

首先进行模型稀疏化
我使用的都是默认值进行,这部分最为关键,整个效果好坏与其息息相关,当map在经历下降,回升,平稳后差不多就可以了。
第一次我使用的是默认的300轮,当我训练到43轮时,如下图所示loss与map趋于稳定,权重也相对归一化,我选择减小轮次以使用更小的学习率。
在这里插入图片描述
在这里插入图片描述
当我改为70批次训练,得到了较好的结果map: 64.2(原始65.9)。
在这里插入图片描述
其次是剪枝
我由于数据集和作者一样只有一个类,我选择了相同的剪枝策略,具体可以自由搭配
在这里插入图片描述
最后是微调
由于我数据集相较作者的非常大,warm up我调整为1,最后精度在62.4map
在这里插入图片描述

模型使用

模型使用的推理工程是著名的ultralytics
模型在实际使用时从0.06一帧提高到0.02一帧,显卡占用率从1091M减少到743M。
通过u版的模型转换工具将模型转为weight格式,我在AB版继续训练10000轮
微调前精度54.64map,在AB版微调后达到69.1map,和原始相比下降2map。
在这里插入图片描述
这是剪枝后u版微调结果

原版
这是原版结果
在这里插入图片描述
这是剪枝后AB版微调结果
总结:置信度下降严重,还在查找原因

#模型转为darknet权重
python3  -c "from models import *; convert('cfg/yolov3-spp-person-prune.cfg', 'weights/yolov3-spp-person-prune.pt')"
#darknet框架测试图片和模型
./darknet detector test ./cfg/person.data ./cfg/yolov3-spp-person-prune.cfg ./weights/yolov3-spp-person-prune.weights
./darknet detector map /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person-prune.cfg weights/yolov3-spp-person-prune.weights
#AB框架下模型再训练
./darknet detector train /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person-prune.cfg weights/yolov3-spp-person-prune.weights  -map
#进一步调试,启用GIOU,修改anchors
./darknet detector calc_anchors /home/xs/xs_train/data/coco/voc.data -num_of_clusters 9 -width 608 -height 608
[yolo]
mask=6,7,8
anchors=12, 29,  33, 74,  55,152, 135,163,  84,298, 159,388, 418,181, 270,462, 487,505
classes=1
num=9
jitter=.3
ignore_thresh=.7
truth_thresh=1
random=1
iou_normalizer=0.25  #启用GIOU
cls_normalizer=1.0     #启用GIOU
iou_loss=giou               #启用GIOU
./darknet detector train /home/xs/xs_train/data/coco/voc.data /home/xs/xs_train/data/coco/yolov3-spp-person-prune-giou.cfg weights/yolov3-spp-person-prune.weights  -map

量化

关于模型量化有两种方案,一个是使用平台自带的量化方法,如tensorrt,openvino,pytorch等等,它们大多是基于模型统一量化,优势在于简便,但是和平台绑定,可操作性少。另外一种量化方案是我YOLOv3-complete-pruning,他是通过修改层,根据不同层选择不同的量化方案,通过测试可以取舍达到满意效果。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值