剪枝原理
参考<<Learning Efficient Convolutional Networks through Network Slimming>>
训练时的损失函数,将BN的系数作为正则项,使用L1,这种训练称之为稀疏训练:
训练的结果,使得值趋向于0,从而可以去除相应的通道。
代码运行
参考代码:https://github.com/tanluren/yolov3-channel-and-layer-pruning
1、darknet模型转换成代码使用的格式
python3 -c "from models import *; convert('cfg/yolov3.cfg', 'weights/last.pt')"
2、正常训练(可做为baseline,与稀疏训练进行对比)
python3 train.py --cfg cfg/my_cfg.cfg --data data/my_data.data --weights weights/yolov3.weights --epochs 100 --batch-size 32
3、稀疏训练
python3 train.py --cfg cfg/my_cfg.cfg --data data/my_data.data --weights weights/last.weights --epochs 300 --batch-size 32 -sr --s 0.001 --prune 1
4、通道剪枝(考虑需不需对shortcut层进行剪枝;层剪枝,在通道剪枝上衍生而来,需要计算各层平均值)
python3 prune.py --cfg cfg/my_cfg.cfg --data data/my_data.data --weights weights/last.pt --percent 0.85
5、微调
python3 train.py --cfg cfg/prune_0.85_my_cfg.cfg --data data/my_data.data --weights weights/prune_0.85_last.weights --epochs 100 --batch-size 32
6、查看指标
python3 test.py --data data/voc_yolov3.data --cfg cfg/yolov3.cfg --weights converted.pt
Class | Images | Targets | P | R | mAP | F1 |
---|---|---|---|---|---|---|
all | 5.93e+03 | 1.39e+04 | 0.959 | 0.949 | 0.943 | 0.953 |
7、图片,文件夹,视频,相机等测试
python3 detect.py --data data/voc_yolov3.data --cfg cfg/yolov3.cfg --weights converted.pt
--source {
0 # webcam
file.jpg # image
file.mp4 # video
path/ # directory
path/*.jpg # glob
rtsp://170.93.143.139/rtplive/470011e600ef003a004ee33696235daa # rtsp stream
rtmp://192.168.1.105/live/test # rtmp stream
http://112.50.243.8/PLTV/88888888/224/3221225900/1.m3u8 # http stream
}
--output output/ --conf 0.5
8、tensorboard
使用tensorboard可视化
tensorboard --logdir=runs/ --port=40110
在xshell里面设置
然后可以在本地输入网址 127.0.0.1:40110 访问