小小甜菜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
    评论
YOLOv8剪枝流程是指对YOLOv8模型进行剪枝的过程。剪枝是一种模型优化技术,旨在减少模型的参数量和计算量,从而提高模型的推理速度和效率。 YOLOv8剪枝流程主要包括以下几个步骤: 1. 模型分析:首先,需要对YOLOv8模型进行分析,了解模型的结构和参数分布情况。可以通过查看模型的网络结构和权重参数来获取这些信息。 2. 重要性评估:接下来,需要对模型中的各个参数进行重要性评估。常用的评估方法包括敏感度分析、梯度信息等。通过评估参数的重要性,可以确定哪些参数对模型性能的影响较小,可以被剪枝掉。 3. 剪枝策略选择:根据参数的重要性评估结果,选择合适的剪枝策略。常见的剪枝策略包括按比例剪枝、按阈值剪枝、通道剪枝等。不同的剪枝策略适用于不同的模型和任务。 4. 剪枝操作:根据选择的剪枝策略,对YOLOv8模型进行剪枝操作。剪枝操作可以通过将参数置零、删除参数等方式实现。剪枝后,模型的参数量和计算量会减少。 5. 微调和压缩:剪枝后的模型可能会出现性能下降的情况,因此需要进行微调和压缩操作。微调是指在剪枝后的模型进行进一步的训练,以恢复模型的性能。压缩是指对剪枝后的模型进行进一步的压缩,以减小模型的存储空间和计算量。 6. 性能评估:最后,需要对剪枝后的YOLOv8模型进行性能评估,包括模型的推理速度、精度等指标。通过评估剪枝模型的性能,可以判断剪枝效果的好坏。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值