zju-lishuang / yolov5_prune Goto Github PK
View Code? Open in Web Editor NEWyolov5 prune,Support V2, V3, V4 and V6 versions of yolov5
License: Apache License 2.0
yolov5 prune,Support V2, V3, V4 and V6 versions of yolov5
License: Apache License 2.0
command:
python prune_yolov5s.py --cfg cfg/yolov5s.cfg --data data/fangweisui.data --weights weights/yolov5s_prune0.pt --percent 0.8
code used:
[https://github.com/ZJU-lishuang/yolov5]
question:
+------------+----------+----------+
| Metric | Before | After |
+------------+----------+----------+
| mAP | 0.025648 | 0.000000 |
| Parameters | 7263185 | 1790052 |
| Inference | 0.0165 | 0.0172 |
+------------+----------+----------+
so when eval the ori model,what is the format of annos ?like normalized [classid,x_center,y_center,w,h] or coco format?
我在yolov5s源码里训练了一个classes=1的模型。训练过程没有转darknet模式。然后用你的剪枝脚本剪枝。测试效果显示转darknet成功了,但是测试将多余层参数置零时的mAP都为0
I cannot find the script of 'prune_finetune/py' to finetune pruned models.
copy_weight(modelyolov5, model) 是把yolov5网络结构转换成Darknet的网络结构吗?Darknet与yolov5的网络结构有什么差异?
1、使用prune_finetune.py微调训练,取某一轮训练好的模型,用这个脚本计算测试集的[email protected],与保存的results.txt是一致的
2、但是使用slim_prune_yolov5s.py脚本,取上面步骤的模型,计算测试集的[email protected],比前者低6个点
@ZJU-lishuang 你好,请教一个问题
我在step3进行剪枝的时候,除了readme里的剪枝策略一,其他剪枝方法都有使用过,我最开始使用八倍通道剪枝,运行slim_prune_yolov5s_8x.py,进行微调之后,模型的大小减少了,但推理时间并没有减少,甚至比没有剪枝的模型还要慢上一点点。之后我尝试了除了策略一的所有剪枝方案对稀疏化训练后得到的模型进行剪枝,但剪枝后的模型只是参数量有减少,而推理时间几乎没变化,想请教一下是什么原因。
是我稀疏化训练有问题?还是剪枝策略有问题?
下面是step2稀疏化训练的可视化结果
下面是我尝试的每一种剪枝策略的运行结果和参数设置
剪枝策略三,八倍通道剪枝,运行slim_prune_yolov5s_8x.py
剪枝策略三,运行slim_prune_yolov5s.py
剪枝策略四,层剪枝,运行layer_prune_yolov5s.py
剪枝策略二,对shortcut层也进行剪枝,运行shortcut_prune_yolov5s.py
你好,我用自己的数据在这个项目里剪枝后,打算在原yolov5的项目中test,但是报错; 然后我用你在tutorial 里给的8倍通道剪枝的model去跑,结果还是一样。报错如下:
Traceback (most recent call last):
File "test.py", line 309, in
test(opt.data,
File "test.py", line 55, in test
model = attempt_load(weights, map_location=device) # load FP32 model
File "/home/bai/Desktop/yolov5-v3-test/models/experimental.py", line 118, in attempt_load
model.append(torch.load(w, map_location=map_location)['model'].float().fuse().eval()) # load FP32 model
AttributeError: 'collections.OrderedDict' object has no attribute 'float'
请问是model 需要再转换一下格式么? 但是我看它已经是.pt格式了,实在不知道咋整。
您好,我按照您给出的教程完成了剪枝操作,剪枝前后map分别为0.74,0.72;接下来按照您给出的步骤,用ZJU-lishuang/yolov5-v4中的prune_finetune.py代码进行微调,但是微调训练过程中map值基本保持为0,您知道原因可能有哪些吗?
thanks for your works, it is wonderful,but May i know how do u get yolov5s.cfg from yaml and .pt? if i want prune yolov5x.pt,what should i do? forward your reply
在稀疏训练后gather bn weight的时候,会提示model中缺少modellist从而报错,请问作者大哥这个问题该如何解决呢,另外入坑加速方向的小弟求大哥联系方式QAQ
在精度和耗时方面yolov5做了一个权衡,https://github.com/ultralytics/yolov5/issues/304,这里Glenn Jocher并不是特别建议自己作剪枝,如果追求更改的精度,可以选用大模型,如果追求更快的速度,用yolov5_s,如果用大模型去做剪枝和yolov5_s作对比的话,速度和精度会有优势吗?有相关实验结论吗?(yolov3元模型比较大的,200M以上,才有了剪枝的必要,yolov5同样适用剪枝吗?另一个问题还没有关闭,https://github.com/ZJU-lishuang/yolov5_prune/issues/4,发现用yolov5_v2得到的模型还没有直接用yolov5s_v3得到的模型精度高,所以有此疑惑,望不嫌麻烦,给点建议,不胜感激)
按照作者的readme操作,下载的是官方v5的第四个版本的yolov5s,配置文件yolov5s.yaml是作者提供的,数据集yaml已修改。
在稀疏训练结束查看bn权重时候报错
Traceback (most recent call last):
File "train_sparsity.py", line 663, in
train(hyp, opt, device, tb_writer, wandb)
File "train_sparsity.py", line 530, in train
bn_weights = gather_bn_weights(model.module_list, [idx])
File "H:\Anaconda3\envs\yolov5-ss\lib\site-packages\torch\nn\modules\module.py", line 778, in getattr
raise ModuleAttributeError("'{}' object has no attribute '{}'".format(
torch.nn.modules.module.ModuleAttributeError: 'Model' object has no attribute 'module_list'
我的本地版本是
python 3.8.5 torch 1.7.1
我将模型打印输出,发现确实缺少了该部分,我参考了v3剪枝中的issue,但是没有解决。希望得到回复~
这个问题似乎不会对训练产生影响,但是想知道问题出在哪儿,
在yolov5_prune/modelsori.py下测试DarkNet,
if name =='main':
img_size = 608
cfg = 'cfg/yolov5s_v4_hand.cfg'
arc = 'default'
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 创建Darknet模型
model = Darknet(cfg, (img_size, img_size), arc=arc).to(device)
有警告:
WARNING: smart bias initialization failure.
WARNING: smart bias initialization failure.
WARNING: smart bias initialization failure.
pytorch版本:1.8.1
python版本:3.7
如果要对m,l,x的模型剪枝,要在哪些地方做调整?
打擾了
想問一下你有寫剪枝過後的testing script嗎
我在yolov5-v4那個repo只有看到detect script
run 你的testing script好像有bug
不確定是不是你沒寫這部分呢
执行export_prune_onnx.py 导出onnx时报错,在于attempt_load函数中fuse操作,去掉fuse操作可正常导出,这个fuse操作也将bn层的eps也fuse到卷积中了
加载自己预训练的yolov5s的best.pt进行稀疏训练报错?请问大佬是因为模型结构不一样吗?
稀疏训练后map大概掉了一个点(最后0.5左右)
但是使用这个里面的剪枝策略,无论哪个都显示剪枝前剪枝后的map为0
各种p,r指标也全都为0
我训练了5个类别,配置文件都没有问题
请问有什么解决方法吗?
你好
我尝试使用自己的数据集训练模型,按照readme的流程,在使用8倍通道剪枝的时候出现了问题。
Traceback (most recent call last):
File "slim_prune_yolov5s_8x.py", line 342, in
copy_weight_v4(modelyolov5, model)
File "slim_prune_yolov5s_8x.py", line 23, in copy_weight_v4
copy_conv(cspnet1.cv2, model.module_list[3])
File "slim_prune_yolov5s_8x.py", line 13, in copy_conv
conv_dst[0] = conv_src.conv
File "/home/cwy/.conda/envs/yolo/lib/python3.8/site-packages/torch/nn/modules/module.py", line 778, in getattr
raise ModuleAttributeError("'{}' object has no attribute '{}'".format(
torch.nn.modules.module.ModuleAttributeError: 'Conv2d' object has no attribute 'conv'
其中,cfg文件我是复制yolov5s_hand.cfg,修改了class,filters和anchors三个参数
data文件的内容如下:
classes= 10
train = /data/cwy/CardNumber/yolov5_random/train.txt
valid = /data/cwy/CardNumber/yolov5_random/test.txt
names = data/CardNumber.names
backup = /data/cwy/CardNumber/yolov5_random/
改了很久也没能改对,请问这个问题该如何解决
您好!请问一下剪枝后的速度提升有多少呢?
Hello,is there a yaml to cfg script?I'd like to try your yolov5s pruning operation, I'm sorry I didn't find the corresponding cfg file.
python prune_yolov5s.py --cfg cfg/yolov5s_v4.cfg --data data/myvoc.data --weights best.pt --percent 0.8
后出现以下错误:
Traceback (most recent call last):
File "prune_yolov5s.py", line 361, in
origin_model_metric = eval_model(model)
File "prune_yolov5s.py", line 348, in
eval_model = lambda model:test(opt.cfg, opt.data,
File "D:\Gitee\yolov5_prune-4\test.py", line 181, in test
inf_out, train_out = model(imgs) # inference and training outputs
File "C:\Users\TXY\anaconda3\envs\yolo_v5\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "D:\Gitee\yolov5_prune-4\modelsori.py", line 293, in forward
x = module(x, img_size)
File "C:\Users\TXY\anaconda3\envs\yolo_v5\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "D:\Gitee\yolov5_prune-4\modelsori.py", line 178, in forward
p = p.view(bs, self.na, self.nc + 5, self.ny, self.nx).permute(0, 1, 3, 4, 2).contiguous() # prediction
RuntimeError: shape '[16, 3, 85, 28, 52]' is invalid for input of size 489216
你是否遇到过该错误呢?
还有请问通道剪枝命令命令
python prune_yolov5s.py --cfg cfg/yolov5s.cfg --data data/fangweisui.data --weights weights/yolov5s_prune0.pt --percent 0.8
中,yolov5s.cfg和fangweisui.data文件是否做了修改呢?是否可以上传一下呢?
微调后得到的模型文件还是Darknet结构的吗?我尝试使用了yolov4转onnx和yolov5转onnx,两种方法都没有成果
请问最后这个prune_finetune.py 微调文件在哪呢,我没找到*……*
yolov5s_hand.yaml的内容是对模型结构的重新定义,是分拆的吧,与原版yolov5内容不一致,这样就得以你定义的yaml重新训练模型,在稀疏训练,再剪枝和微调。
能不能直接用原版yolov5.yaml预训练的模型,直接稀疏训练,再剪枝和微调呢?
loaded weights from weights/converted.weights
let's test the original model first:
Class Images Targets P R mAP F1: 0%| | 0/174 [00:00<?, ?it/s]
转换出来的.weights不能测试,这是为什么
你好,请问一下这个基础训练中的 data/coco_hand.yaml在哪里呢?我下载了这个数据集发现并不是coco格式的标注格式,想跑起来整个流程还是挺麻烦的,谢谢
楼主,我没有看到train.py文件,请问这个文件夹在哪个位置?
请教一下作者,现在剪枝有结构化剪枝和非结构化剪枝,应该只有结构化剪枝才能实现加速,非结构化剪枝需要硬件的支持,你这里使用的是结构化剪枝吗?结构化剪枝后的模型有把权重为0的filter删除掉吗? 谢谢
STEP4:微调finetune,使用蒸馏技术优化模型。torch.nn.modules.module.ModuleAttributeError: 'Darknet' object has no attribute 'copy',出现了这个错误。
你好,楼主,为何剪枝完map直接为0?
@ZJU-lishuang 你好,yolov5s.yaml和yolov5x.yaml只有width_multiple和depth_multiple两个参数不一样
如果要得到yolov5x.cfg对yolov5x进行剪枝,在yolov5s.cfg的基础上如何修改可以得到yolov5x.cfg?
刚接触这方面的大小不知道该如何入手
你好,我基于u版的yolo v5s训练出了自己的模型,用你的代码进行了稀疏训练。在使用剪枝策略1时代码报错了,信息如下:
(pytorch) D:\CNN\yolov5\zju_prune\yolov5_prune-4>python prune_yolov5s.py --cfg D:\CNN\yolov5\yolov5\models\yolov5s.yaml --data D:\CNN\yolov5\zju_prune\yolov5_prune-4\datasets_3_aug_yolo\data.yaml --weights D:\CNN\yolov5\zju_prune\yolov5-v4-main\runs\train\s_sparsity\weights\best.pt --percent 0.8 Namespace(cfg='D:\\CNN\\yolov5\\yolov5\\models\\yolov5s.yaml', data='D:\\CNN\\yolov5\\zju_prune\\yolov5_prune-4\\datasets_3_aug_yolo\\data.yaml', img_size=416, percent=0.8, weights='D:\\CNN\\yolov5\\zju_prune\\yolov5-v4-main\\runs\\train\\s_sparsity\\weights\\best.pt') Traceback (most recent call last): File "prune_yolov5s.py", line 338, in <module> model = Darknet(opt.cfg, (img_size, img_size)).to(device) File "D:\CNN\yolov5\zju_prune\yolov5_prune-4\modelsori.py", line 254, in __init__ self.module_defs = parse_model_cfg(cfg) File "D:\CNN\yolov5\zju_prune\yolov5_prune-4\utils\parse_config.py", line 18, in parse_model_cfg key, val = line.split("=") ValueError: not enough values to unpack (expected 2, got 1)
我看你使用了data data/fangweisui.data这个文件作为训练数据设置,我不知道你的.data文件格式是怎样的。我使用的是yaml文件,会不会是这里有影响呢?
我在自己的数据集上进行yolov5s的稀疏训练,s=0.001,然而map下降很多,差不多10个点,200个epoch之后精度也没返回到原来的水平,请问是s的选取不合适吗
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.