介绍
这个项目是自己在暑期学习模型剪枝和YOLOv5写的,其中存在许多不足的之处还待继续完善
本项目涉及的算法如下:
-
YOLOv5的GITHUB地址:https://github.com/ultralytics/yolov5.git
-
SFP的Paper地址:https://arxiv.org/abs/1808.07471
-
Network Slimming的Paper地址:https://arxiv.org/abs/1708.06519
本仓库包含一下内容:
- 如何安装使用YOLOv5 Pruning
- 如何使用SFP进行剪枝
- 如何使用Network Slimming进行剪枝
创建虚拟环境
$ create -n yolov5 python=3.7 -y
克隆仓库
$ git clone https://github.com/DDGRCF/yolov5_Chinese.git
cd yolov5_Chinese
安装依赖
$ pip install -r requirements.txt
在该目录下创建一个datasets
文件夹,该文件夹用来存放各种数据集(你可以创建一个数据集的软链接)
本项目由于条件限制,只使用火焰数据集(fire
),其配置文件在data\fire.yaml
。该数据集已上传网盘。
$ python train.py --epochs 220 --weights weights/yolov5l.pt --hyp hyp.finetune.yaml --cfg models/yolov5l.yaml --data data/fire.yaml --batch-size 16 --workers 8 --device 3 --use-pruning --layer-rate 0.4 --layer-gap 0,321,3 --skip-downsample --pruning-method SFP --skip-list 0 3
:<<!
其中use-pruning代表进行剪枝,layer-rate代表剪枝率(1为不剪枝),skip-list代表不需要剪枝的层(只能是0 3 6..., pruning-method代表使用剪枝的方法)
!
$ python get_small_model.py --weights runs/train/exp*/weights/best_pruning.pt --cfg models/yolov5l.yaml --data data/fire.yaml --device 0
这个目前有点问题,原始算法的脚本和一些YOLOv3的剪枝脚本,BN scale仅需1.0e-5~1.0e-2
左右,但我这里在不加载预训练模型,且把模型的BN初始化为0.5
时,BN scale需要差不多10~100
其BN weights才进行明显的稀疏,而加载预训练模型后则需要差不多100~1000
才能进行明显的稀疏。(其中)
$ python train.py --epochs 300 --cfg models/yolov5l.yaml --data data/fire.yaml --batch-size 16 --device 0 --use-pruning --skip-list 0 3 --pruning-method Network_Slimming \
--s 1 --print-sparse-frequency 2 --s_span 10 100 --warm_up_epoch 66
:<<!
其中 pring-sparse-frequency代表进行多少次epoch输出稀疏度直方图,直方图在`runs\train\exp*\weights\histogram`中,warm_up_epoch是我为了进行快速稀疏而对前n个epoch的scale进行方法,s代表scale
!
$ python get_sparse_model.py --weights runs/train/exp*/weights/best_sparse.pt --data data/fire.yaml --device 0 --ratio 0.70
:<<!
其中ratio代表裁剪率
!
python detect.py --weights runs/train/exp*/weights/pruning_*.pt --source data/images/fire --use-pruning