yolov5s模型剪枝详细过程(v6.0)

本文参考github上大神的开源剪枝项目进行学习与分享,具体链接放在文后,希望与大家多多交流!

一、原模型训练

在官方源码上训练yolov5模型,支持v6.0分支的n/s/m/l模型,我这里使用的是v5s,得到后将项目clone到本机上

git clone https://github.com/midasklr/yolov5prune.git

cd进入文件夹后,新建runs文件夹,将训练好的模型放入runs/your_train/weights/xxx.pt,我的原模型map0.5:0.95为0.84左右,模型与data.yaml设置好后可以进行稀疏化训练了。

二、稀疏化训练

python train_sparity.py --st --sr 0.0002 --weights yolov5s.pt --data data/your_data.yaml --epochs 100 --imgsz 512 --adam ...

注意:1、若原模型训练时未使用adam,则这里也不要使用adam。2:data.yaml文件改成自己的数据集文件。3:这里sr参数为稀疏化系数,具体值为多少根据不同的数据集和模型,一般设置不一样,需要自己多试试,比如我的是单类别目标检测,设置为0.0002时几乎不变化(如下图)。

这里我们cd到runs文件夹路径,然后输入tensorboard实时监看训练过程,logdir也指向runs文件夹即可,然后打开网页输入你的ip,端口号一般为6006,比如192.168.xx.xx:6006就可以监看。

tensorboard --logdir=/home/user2/yinjiacheng/pytorch-ssd/pytorch-ssd/runs --host=0.0.0.0

这个直方图的纵轴代表训练次数(从上往下训练次数增加),横轴的峰值应随着训练次数不断逼近0轴,代表着大多数bn已经变得稀疏,而出现下图这个情况或者稀疏过慢(逼近0轴的过程缓慢)时,代表sr值应该适量增大。

所以我调整了sr为0.02,但此时bn收敛过快,且mAP下降严重,如下图所示,表示sr值调的过大了,需要适当减少,直至直方图逼近0轴的同时,mAP与原模型相差不大。

然后我将sr值调整为0.01,此时的bn直方图与mAP0.5曲线如下图所示:

可以看出bn直方图往0轴逼近的速度不是太快也不是太慢(好像在说废话),而mAP虽然有掉点但还是可以接受,最后可以finetune回来一些,所以可以选择这一稀疏化模型进行下一步的剪枝。

三、剪枝

python prune.py --percent 0.5 --weights runs/train/exp/weights/last.pt --data data/your_data.yaml --cfg models/yolov5s.yaml

这里percent参数是剪枝比例,weights选择刚刚训练好的稀疏化模型,cfg选择你使用的yaml即可,剪枝完成后主文件夹下会出现pruned_model.pt文件,这就是剪枝后的模型,但会发现怎么模型大小下降的不多,因为它还是FP32精度的,而我们yolov5训练完成后的模型为FP16精度,所以其实大小还是下降挺多的(最后我微调后得到的是5.8M,而原模型为13.6M)。

四、微调

python finetune_pruned.py --weights pruned_model.pt --data data/your_data.yaml --epochs 150 --imgsz 320 --adam

这里还是一样,若前面没有使用adam则这里也不要用,imgsz调成自己的输出尺寸,200个epoch还是finetune回来不少的。

最后我获得的模型为5.48M,参数量Param为2.74M,输入尺寸为320*320时FLOPs为2.17G,比原模型大小13.6M,FLOPs为3.9G明显减小。

五、detect

该项目中的detect.py和detectpruned.py代码有些问题,大家可以把微调后的pt模型放到官方项目中去detect,但有几点需要改。

  1. 现在我们是两个项目,一个是剪枝的yolov5_prune,一个是官方的yolov5,将yolov5_prune/model/pruned_common.py文件复制到官方yolov5/model/ 中去。

  1. 将pruned_common.py中第26行的

from utils.plots import Annotator, colors, save_one_box

save_one_box删掉,再在25行最后加上,因为在官方文件中save_one_box这个def是在utils下的general中定义的。

from utils.general import (LOGGER, check_requirements, check_suffix, check_version, colorstr, increment_path,make_divisible, non_max_suppression, scale_coords, xywh2xyxy, xyxy2xywh,save_one_box)
  1. 打开官方yolov5/utils/general.py,在第43行后,也就是声明第一个class前加上以下代码

def set_logging(name=None, verbose=True):# Sets level and returns loggerfor h in logging.root.handlers:logging.root.removeHandler(h)  # remove all handlers associated with the root logger objectrank = int(os.getenv('RANK', -1))  # rank in world for Multi-GPU trainingslogging.basicConfig(format="%(message)s", level=logging.INFO if (verbose and rank in (-1, 0)) else logging.WARNING)return logging.getLogger(name)LOGGER = set_logging(__name__)  # define globally (used in train.py, val.py, detect.py, etc.)

  1. 最后根据设置运行detect.py即可,我在detect中加了将漏报和误报图片分别放在不同文件夹的功能,最后在5000张val集中分别多了几十张吧,还算可以接受。

python detect.py --weights runs/train/yolo5s_face_prune/weights/last.pt --conf 0.5 --img-size 320 --source data/your_data/images/val --save-txt

参考链接:midasklr/yolov5prune at v6.0 (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/213120.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我去图书馆微信公众号抢座【Python版本】

更新记录 介于大部分是小白这里就重新整理一下思路 直接跳第十次更新!第一次更新 抓包抢座2023-4-28日第二次更新(更新了指定时间抢座 加了时间戳)2023-5-9日第三次更新(更新了延迟时间 测试成功案例)2023-5-31日第四次…

如何将本地websocket发布至公网并实现远程访问?

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

2023年第十六届中国系统架构师大会(SACC2023)-核心PPT资料下载

一、峰会简介 本届大会以“数字转型 架构演进”为主题, 涵盖多个热门领域,如多云多活、海量分布式存储、容器、云成本、AIGC大数据等,同时还关注系统架构在各个行业中的应用,如金融、制造业、互联网、教育等。 与往届相比&#…

15.Python 异常处理和程序调试

1. 异常处理 异常就是在程序执行过程中发生的超出预期的事件。一般情况下,当程序无法正常执行时,都会抛出异常。 在开发过程中,由于疏忽或考虑不周,出现的设计错误。因此,在后期程序调试中应该根据错误信息&#xff…

2022版 的IDEA创建一个maven项目(超详细)

一.设置idea中指定的maven的位置以及本地存储仓库 开发中一般我们使用自己下载的maven,不使用IDEA工具自带的,这就需要将我们下载的maven配置到IDEA工具中,配置如下图所示: 或者直接 快捷键 CtrlAltS 直接进入设置 maven home pa…

经营现金流转正,宝尊电商解构内容电商3.0时代长期价值

在过去的“黄金十年”里,货架电商、直播电商鱼贯而出,接力式地推动品牌增长。彼时,价格换市场、“以快打快”的打法足以满足品牌发展所需。 然而,随着流量红利消退,消费者愈发理性,品牌增长集体“失速”。…

案例023:基于微信小程序的童装商城的设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

C/C++内存管理(2):`new`和`delete`的实现原理

new和delete操作自定义类型 class Stack { public:Stack(int capacity 3):_top(0), _capacity(capacity){cout << "Stack(int capacity 3)" << endl;_a new int[capacity];}~Stack(){cout << "~Stack()" << endl;delete _a;_to…

vue+SpringBoot的图片上传

前端VUE的代码实现 直接粘贴过来element-UI的组件实现 <el-uploadclass"avatar-uploader"action"/uploadAvatar" //这个action的值是服务端的路径&#xff0c;其他不用改:show-file-list"false":on-success"handleAvatarSuccess"…

分享5款工作和学习中,经常用到的软件

​ 如今&#xff0c;工作和学习都离不开电脑&#xff0c;所以电脑里的软件自然也是必不可少的&#xff0c;但是电脑软件那么多&#xff0c;不可能每个都装上吧&#xff0c;所以我们要装好用的、实用的&#xff0c;下面给大家分享5款好用到爆的软件&#xff0c;很多懂电脑的人都…

链表的回文结构

题目描述 题目链接&#xff1a;链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们的思路是&#xff1a; 找到中间结点逆置后半段比对 我们可以简单画个图来表示一下&#xff1a; ‘ 奇数和偶数都是可以的 找中间结点 我们可以用快慢指针来找中&#xff1a;l…

ESP32测试DHT11温湿度

ESP32测试DHT11温湿度 arduino导入dht库 2.arduion里 DHT11 代码 #include <DHT.h> #define DHTPIN 4 //修改数据引脚 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() {Serial.begin(9600);dht.begin(); }void loop() { float h dht.readHum…