This project mainly include three parts.
1.Provides training methods for multiple mainstream object detection datasets(coco2017, coco2014, BDD100k, Visdrone, Hand)
2.Provides a mainstream model compression algorithm including pruning, quantization, and knowledge distillation.
3.Provides multiple backbone for yolov3 including Darknet-YOLOv3,Tiny-YOLOv3,Mobilenetv3-YOLOv3
本项目包含三部分内容:
1、提供多个主流目标检测数据集的预处理后文件及训练方法。
2、提供包括剪植,量化,知识蒸馏的主流模型压缩算法实现。
3、提供多backbone训练目前包括Darknet-YOLOv3,Tiny-YOLOv3,Mobilenetv3-YOLOv3。
其中:
源码使用Pytorch实现,以ultralytics/yolov3为YOLOv3源码仓库。基于BN层的剪植方法由coldlarry/YOLOv3-complete-pruning提供,感谢学长在模型压缩领域的探索。
2020年1月4日 提供Visdrone数据集剪裁后的下载链接和训练方法。
2020年1月19日 提供Dior,Bdd100k,visdrone训练完成,并完成转化的.weights文件。
2020年3月1日 实现基于mobilenetv3 backbone的YOLOv3。
2020年4月7日 实现基于mobilenetv3的两种backbone模型,YOLOv3-mobilenet和YOLOv3tiny-mobilene-small ,提供预训练模型,将正常剪植算法扩展到基于mobilenet的两个模型和YOLOv3tiny模型,删除tiny剪植。
2020年4月27日 更新mobilenetv3的模型预训练,添加了层剪植方法,方法来自于tanluren/yolov3-channel-and-layer-pruning/yolov3, 感谢大佬的分享。
2020年5月22日 更新了ultralytics/yolov3为YOLOv3源码仓库的最新优化,更新YOLOv4网络结构和权重文件。
2020年5月22日 更新了8位定点量化方法,修复一些bug。
1.由于采用ultralytics/yolov3的YOLO实现,环境搭建详见ultralytics/yolov3。这里简要说明:
numpy
torch >= 1.1.0
opencv-python
tqdm
可直接pip3 install -U -r requirements.txt
搭建环境,或根据该.txt文件使用conda搭建。
功能 | |
---|---|
训练 | |
正常训练 | √ |
tiny训练 | √ |
mobilenetv3训练 | √ |
mobilenetv3-small训练 | √ |
多数据集 | |
Dior数据集训练 | √ |
bdd100k数据集训练 | √ |
visdrone数据集训练 | √ |
剪植 | |
稀疏化训练 | √ |
正常剪枝 | √ |
规整剪枝 | √ |
极限剪枝(shortcut) | √ |
层剪植 | √ |
量化 | |
BNN量化 | √ |
BWN量化 | √ |
stage-wise 逐层量化 | √ |
知识蒸馏 | √ |
python3 train.py --data ... --cfg ...
为训练模型指令,使用coco预训练模型时需要-pt指令。
python3 test.py --data ... --cfg ...
为mAP测试指令。
python3 detect.py --data ... --cfg ... --source ...
为推理检测指令,source默认地址为data/samples,输出结果保存在output文件中,检测资源可以为图片,视频等。
本项目提供针对YOLOv3仓库的预处理数据集,配置文件(.cfg),数据集索引文件(.data),数据集类别文件(.names)以及使用k-means算法重新聚类的anchor box尺寸(包含用于yolov3的9框和tiny-yolov3的6框)。
mAP统计
数据集 | YOLOv3-640 | YOLOv4-640 | YOLOv3-mobilenet-640 |
---|---|---|---|
Dior遥感数据集 | 0.749 | ||
bdd100k自动驾驶数据集 | 0.543 | ||
visdrone无人机航拍数据集 | 0.311 | 0.383 | 0.348 |
下载地址如下,下载并解压后将文件夹拷贝至data目录下即可使用。
训练指令
python3 train.py --data data/coco2017.data --batch-size ... --weights weights/yolov3-608.weights -pt --cfg cfg/yolov3/yolov3.cfg --img-size ... --epochs ...
训练指令
python3 train.py --data data/dior.data --batch-size ... --weights weights/yolov3-608.weights -pt --cfg cfg/yolov3/yolov3-onDIOR.cfg --img-size ... --epochs ...
-
提取码:8duw
-
提取码:xeqo
训练指令
python3 train.py --data data/bdd100k.data --batch-size ... --weights weights/yolov3-608.weights -pt --cfg cfg/yolov3/yolov3-bdd100k.cfg --img-size ... --epochs ...
-
提取码:dy4c
-
提取码:87lf
-
提取码:xblu
提取码:fb6y
训练指令
python train.py --data data/visdrone.data --batch-size ... --weights weights/yolov3-608.weights -pt --cfg cfg/yolov3/yolov3-visdrone.cfg --img-size ... --epochs ...
-
提取码:3du4
训练指令
python train.py --data data/oxfordhand.data --batch-size ... --weights weights/yolov3-608.weights -pt --cfg cfg/yolov3/yolov3-visdrone.cfg --img-size ... --epochs ...
DIRO数据集是地球观测社区中最大、最多样化和公开可用的目标检测数据集之一。其中船舶和车辆的实例数较高,在小型实例和大型实例之间实现了良好的平衡。图片采集自Google Earth。
bdd100是一个大规模、多样化的驾驶视频数据集,共包含十万个视频。每个视频大约40秒长,研究者为所有10万个关键帧中常出现在道路上的对象标记了边界框。数据集涵盖了不同的天气条件,包括晴天、阴天和雨天、以及白天和晚上的不同时间。
VisDrone2019数据集由**天津大学机器学习和数据挖掘实验室的AISKYEYE团队收集。基准数据集包含288个视频片段,由261,908个帧和10,209个帧组成静态图像,由各种安装在无人机上的摄像头捕获,涵盖了广泛的方面,包括位置(从**相距数千公里的14个不同城市中拍摄),环境(城市和乡村),物体(行人,车辆,自行车等)和密度(稀疏和拥挤的场景)。该数据集是在各种情况下以及在各种天气和光照条件下使用各种无人机平台(即具有不同模型的无人机)收集的。这些框架使用超过260 万个边界框手动标注,这些边界框是人们经常感兴趣的目标,例如行人,汽车,自行车和三轮车。还提供了一些重要属性,包括场景可见性,对象类别和遮挡,以提高数据利用率.
在mobilenetv3基础上设计了两种网络结构
结构名称 | backbone | 后处理 | 总参数 | GFLOPS | mAP0.5 | mAP0.5:0.95 | speed(inference/NMS/total) | FPS |
---|---|---|---|---|---|---|---|---|
YOLOv3 | 38.74M | 20.39M | 59.13M | 117.3 | 0.580 | 0.340 | 12.3/1.7/14.0 ms | 71.4fps |
YOLOv3tiny | 6.00M | 2.45M | 8.45M | 9.9 | 0.347 | 0.168 | 3.5/1.8/5.3 ms | 188.7fps |
YOLOv3-mobilenetv3 | 2.84M | 20.25M | 23.09M | 32.2 | 0.547 | 0.346 | 7.9/1.8/9.7 ms | 103.1fps |
YOLOv3tiny-mobilenetv3-small | 0.92M | 2.00M | 2.92M | 2.9 | 0.379 | 0.214 | 5.2/1.9/7.1 ms | 140.8fps |
YOLOv4 | - | - | 61.35M | 107.1 | 0.650 | 0.438 | 13.5/1.8/15.3 ms | 65.4fps |
注:
1、YOLOv3,YOLOv3tiny和YOLOv4是在coco2014上训练和测试的,YOLOv3-mobilenetv3和YOLOv3tiny-mobilenetv3-small是在coco2017上训练和测试的。
2、推理速度在GTX2080ti*4上测试,输入图片尺寸608。
3、训练测试集与训练集应当相匹配,不匹配会造成map虚高的问题。原因参照issue
1、YOLOv3
python3 train.py --data data/... --batch-size ... -pt --weights weights/yolov3-608.weights --cfg cfg/yolov3/yolov3.cfg --img_size ...
权重文件下载
-
提取码:k8ms
2、YOLOv3tiny
python3 train.py --data data/... --batch-size ... -pt --weights weights/yolov3tiny.weights --cfg cfg/yolov3tiny/yolov3-tiny.cfg --img_size ...
-
提取码:udfe
3、YOLOv3tiny-mobilenet-small
python3 train.py --data data/... --batch-size ... -pt --weights weights/yolov3tiny-mobilenet-small.weights --cfg cfg/yolov3tiny-mobilenet-small/yolov3tiny-mobilenet-small-coco.cfg --img_size ...
-
提取码:pxz4
4、YOLOv3-mobilenet
python3 train.py --data data/... --batch-size ... -pt --weights weights/yolov3-mobilenet.weights --cfg cfg/yolov3-mobilenet/yolov3-mobilenet-coco.cfg --img_size ...
-
提取码:3vm8
5、YOLOv4
python3 train.py --data data/... --batch-size ... -pt --weights weights/yolov4.weights --cfg cfg/yolov4/yolov4.cfg --img_size ...
-
提取码:njdg
剪枝方案 | 优点 | 缺点 |
---|---|---|
正常剪枝 | 不对shortcut剪枝,拥有可观且稳定的压缩率,无需微调。 | 压缩率达不到极致。 |
极限剪枝 | 极高的压缩率。 | 需要微调。 |
极限剪枝2 | 采用shortcut融合的方法提升剪植精度。 | 针对shortcut最优的方法。 |
规整剪枝 | 专为硬件部署设计,剪枝后filter个数均为8的倍数,无需微调。 | 为规整牺牲了部分压缩率。 |
层剪枝 | 以ResBlock为基本单位剪植,利于硬件部署。 | 但是只能剪backbone,剪植率有限。 |
层通道剪植 | 先进行通道剪植再进行层剪植,剪植率非常高。 | 可能会影响精度。 |
1.正常训练
python3 train.py --data ... -pt --batch-size ... --weights ... --cfg ...
2.稀疏化训练
-sr
开启稀疏化,--s
指定稀疏因子大小,--prune
指定稀疏类型。
其中:
--prune 0
为正常剪枝和规整剪枝的稀疏化
--prune 1
为极限剪枝的稀疏化
--prune 2
为层剪植稀疏化
指令范例:
python3 train.py --data ... -pt --batch-size 32 --weights ... --cfg ... -sr --s 0.001 --prune 0
3.模型剪枝
- 正常剪枝
python3 normal_prune.py --cfg ... --data ... --weights ... --percent ...
- 规整剪枝
python3 regular_prune.py --cfg ... --data ... --weights ... --percent ...
- 极限剪枝
python3 shortcut_prune.py --cfg ... --data ... --weights ... --percent ...
- 极限剪枝2
python3 slim_prune.py --cfg ... --data ... --weights ... --percent ...
- 层剪植
python3 layer_prune.py --cfg ... --data ... --weights ... --shortcut ...
- 层剪植+通道剪植
python3 layer_channel_prune.py --cfg ... --data ... --weights ... --shortcut ... --percent ...
需要注意的是,这里需要在.py文件内,将opt内的cfg和weights变量指向第2步稀疏化后生成的cfg文件和weights文件。 此外,可通过增大代码中percent的值来获得更大的压缩率。(若稀疏化不到位,且percent值过大,程序会报错。)
1、正常剪植 oxfordhand数据集,img_size = 608,在GTX2080Ti*4上计算推理时间
模型 | 剪植前参数量 | 剪植前mAP | 剪植前推理时间 | 剪植率 | 剪植后参数量 | 剪植后mAP | 剪植后推理时间 |
---|---|---|---|---|---|---|---|
yolov3(不微调) | 58.67M | 0.806 | 0.1139s | 0.8 | 10.32M | 0.802 | 0.0844s |
yolov3-mobilenet(微调) | 22.75M | 0.812 | 0.0345s | 0.97 | 2.72M | 0.795 | 0.0211s |
yolov3tiny(微调) | 8.27M | 0.708 | 0.0144s | 0.5 | 1.13M | 0.641 | 0.0116s |
2、规则剪植 oxfordhand数据集,img_size = 608,在GTX2080Ti*4上计算推理时间
模型 | 剪植前参数量 | 剪植前mAP | 剪植前推理时间 | 剪植率 | 剪植后参数量 | 剪植后mAP | 剪植后推理时间 |
---|---|---|---|---|---|---|---|
yolov3(不微调) | 58.67M | 0.806 | 0.1139s | 0.8 | 12.15M | 0.805 | 0.0874s |
yolov3-mobilenet(微调) | 22.75M | 0.812 | 0.0345s | 0.97 | 2.75M | 0.803 | 0.0208s |
yolov3tiny(微调) | 8.27M | 0.708 | 0.0144s | 0.5 | 1.82M | 0.703 | 0.0122s |
--quantized
表示选取量化方法,默认值为-1,表示不采用任何量化方法。
--quantized 0
使用BNN量化方法。
BinaryNet: Training Deep Neural Networks withWeights and Activations Constrained to +1 or -1 参考论文
--quantized 1
使用BWN量化方法
XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks 参考论文
--qlayers
可以用于选取Darknet中的量化区间,默认为自深层到浅层, 默认值为-1表示无量化层,有效范围为0-74,取0时表示量化所有层,取74时表示无量化层,大于74则无意义。
--qlayers 63
表示量化Darknet主体网络中最后四个重复的残差块。
--qlayers 38
表示量化Darknet主体网络中从倒数第二八个重复的残差块开始,量化到Darknet主体网络结束。
以此类推,量化时可根据具体情况选择何是的量化层数,以及量化进度,推荐--qlayers
值自74逐渐下降。
量化指令范例:
python train.py --data ... --batch-size ... --weights ... --cfg ... --img-size ... --epochs ... --quantized 1 --qlayers 72
--quantized 3
使用8位定点量化方法
python train.py --data ... --batch-size ... --weights ... --cfg ... --img-size ... --epochs ... --quantized 3
蒸馏方法采用基于Hinton于2015年提出的基本蒸馏方法,并结合检测网络做了部分改进。
Distilling the Knowledge in a Neural Network 参考论文
--t_cfg --t_weights --KDstr
在命令中加入这两个选项即可以开始蒸馏训练。
其中:
--t_cfg
表示教师网络配置文件。
--t_weights
表示教师网络权重文件。
--KDstr
表示使用的蒸馏策略。
`--KDstr 1` 直接在tencher网络的输出和student网络的输出求KLloss并加入到整体的loss中
`--KDstr 2` 对boxloss和classloss有所区分
蒸馏指令范例:
python train.py --data ... --batch-size ... --weights ... --cfg ... --img-size ... --epochs ... --quantized 1 --qlayers 72 --t_cfg ... --t_weights ...
该指令将量化与蒸馏相结合,通过未量化的教师网络提升量化的学生网络,提高学生网络的mAP。