Yolo-v3 Slim
Yolo-v3模型精简化原因
最近一直在海思芯片3519A芯片基础架构上使用Yolo-v3作为检测网络进行目标检测研究,但即便使用NNIE进行硬件矩阵加速单元运算,也很难做到实时性。当Yolo-v3有80个类别需要进行检测时需要140ms(三层Yolo层和53层卷积层运算所耗时几乎相等)。虽然Yolo-v3-Tiny或Moblie-SSD速度较快(32ms和18ms),但对于小物体检测漏检率和误报率还是较高。所以只能从Yolo-v3层剪枝,通道剪枝,知识蒸馏等三方面入手压缩模型减少检测时间。其参考的文献和代码如下所示:
文章
- SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications
- Learning Efficient Convolutional Networks Through Network Slimming
- Learning Efficient Object Detection Models with Knowledge Distillation
- Distilling the Knowledge in a Neural Network
Github
- https://github.com/PengyiZhang/SlimYOLOv3
- https://github.com/tanluren/yolov3-channel-and-layer-pruning
Yolo-v3模型Prune
压缩模型最常见的三种手段是:层剪枝,通道剪枝,知识蒸馏。层剪枝和通道剪枝原理基于bn层Gmma系数进行通道剪枝。知识蒸馏具体介绍:https://www.cnblogs.com/shixiangwan/p/9015010.html。今天主要讲解
前者使用层剪枝和通道剪纸对模型进行压缩。其大致流程如下所述:首先在Yolo-v3网络中训练自己数据集达到理想精度,然后再进行稀疏训练(重中之重),其次对需要剪枝的层使用对应的BN gamma系数进行大幅压缩,对不重要的通道或者层进行剪枝,最后如果当剪枝后模型精度降低过多,可进行微调恢复精度。
使用自己数据集训练到理想精度的过程,就不再详细描述。详细可见DarkNetAB的Github仓,此作者已经进行详细描述。而博主只是将自己将自己在稀疏化训练过程中碰到的问题及解决方法进行大概简述,方便以后碰上这种问题有迹可寻。
1.Run Python Train 的过程中出现:
UnboundLocalError: Caught UnboundLocalError in DataLoader worker process 0.
Original Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
data = fetcher.fetch(index)
File "/usr/local/lib/python3.6/dist-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch
data = [self.dataset[idx] for idx in possibly_batched_inde