【Pruning系列:二】Learning Efficient Convolutional Networks through Network Slimming|YOLOv3实践 |Pytorch 总结

几个基于YOLO的剪枝pytorch项目

  • YOLOv3-model-pruning
      • Introduction
      • 剪枝算法步骤
  • YOLOv3-complete-pruning
      • Introduction
      • 剪枝方式
      • 特点
  • yolov3-channel-and-layer-pruning
      • Introduction
      • 基本工作流程
      • Residual
      • code
    • SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications
  • 做剪枝的朋友可以加qq群

YOLOv3-model-pruning

https://github.com/Lam1360/YOLOv3-model-pruning

YOLOv3模型剪枝,瘦身80%,提速100%,精度基本不变

Introduction

  • 以 eriklindernoren/PyTorch-YOLOv3(https://github.com/eriklindernoren/PyTorch-YOLOv3)为YOLOv3的Pytorch实现

  • 参考论文 Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017)
    【论文解析这个链接】Learning Efficient Convolutional Networks through Network Slimming
    进行改进实现的 channel pruning算法

  • 人手检测数据集 oxford hand 上做人手检测

剪枝算法步骤

以下只是算法的大概步骤,具体实现过程中还要做 s 参数的尝试或者需要进行迭代式剪枝等。

  • 进行稀疏化训练
  • 基于 test_prune.py 文件进行剪枝,得到剪枝后的模型
  • 对剪枝后的模型进行微调

Results

- 参数数量 模型体积 Flops 前向推断耗时(2070 TI) mAP
Baseline (416) 61.5M 246.4MB 32.8B 15.0 ms 0.7692
Prune (416) 10.9M 43.6MB 9.6B 7.7 ms 0.7722
Finetune (416) 同上 同上 同上 同上 0.7750

YOLOv3-complete-pruning

https://github.com/coldlarry/YOLOv3-complete-pruning

YOLOv3剪枝再升级!

Introduction

  • 以 ultralytics/yolov3(https://github.com/ultralytics/yolov3)为YOLOv3的Pytorch实现
  • 在 YOLOv3-model-pruning(https://github.com/Lam1360/YOLOv3-model-pruning)剪枝的基础上,推出了4个YOLO-v3剪枝版本
  • 人手检测数据集 oxford hand 上做人手检测

剪枝方式

剪枝方式 优点 缺点
正常剪枝 不对shortcut剪枝,拥有可观且稳定的压缩率,无需微调。 压缩率达不到极致。
极限剪枝 极高的压缩率。 需要微调。
规整剪枝 专为硬件部署设计,剪枝后filter个数均为8的倍数,无需微调。 为规整牺牲了部分压缩率。
Tiny剪枝 稳定的压缩率。 由于Tiny本来已很小,压缩率中规中矩。

特点

  • 采用的YOLO-v3实现较为准确,mAP相对较高

  • 提供对YOLOv3及Tiny的多种剪枝版本,以适应不同的需求。

  • 剪枝后保存为.weights格式,可在任何框架下继续训练、推理,或以图像视频展示。

  • 目前支持情况

功能 单卡 多卡
正常训练
稀疏化
正常剪枝
规整剪枝
极限剪枝(shortcut)
Tiny剪枝

yolov3-channel-and-layer-pruning

https://github.com/tanluren/yolov3-channel-and-layer-pruning

YOLOv3通道+层剪枝,参数压缩98%,砍掉48个层,提速2倍!

Introduction

  • 参考论文 Learning Efficient Convolutional Networks Through Network Slimming (ICCV 2017) 原理基于bn层Gmma系数进行通道剪枝

  • 引用了几种不同的通道剪枝策略,并对原策略进行了改进,提高了剪枝率和精度

  • 在这些工作基础上,又衍生出了层剪枝,本身通道剪枝已经大大减小了模型参数和计算量,降低了模型对资源的占用,而层剪枝可以进一步减小了计算量,并大大提高了模型推理速度
    通过层剪枝和通道剪枝结合,可以压缩模型的深度和宽度,某种意义上实现了针对不同数据集的小模型搜索。

基本工作流程

  • 使用yolov3训练自己数据集,达到理想精度

  • 进行稀疏训练
    稀疏训练是重中之重,对需要剪枝的层对应的bn gamma系数进行大幅压缩,理想的压缩情况如下图
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NSZLYZxp-1587285735437)(https://leanote.com/api/file/getImage?fileId=5de5b52aab644153da001135)]

  • 然后就可以对不重要的通道或者层进行剪枝

  • 剪枝后可以对模型进行微调恢复精度

Residual

【Pruning系列:二】Learning Efficient Convolutional Networks through Network Slimming|YOLOv3实践 |Pytorch 总结_第1张图片

本质是 A\C\F 得一样

策略一:

只剪 B E

code

【Pruning系列:二】Learning Efficient Convolutional Networks through Network Slimming|YOLOv3实践 |Pytorch 总结_第2张图片

下一个CBL有bn的就把偏移值传给bn的running mean,没有bn的就传给conv的bias。这个偏移值是由上层的beta激活输出和下层的卷积核weight做矩阵乘法得到,对2,3维度求和是因为bn本就是spatial层面的操作,求和后conv weight变成二阶矩阵,和传入的activation做矩阵乘法得到最终的和下层outchannel对应的一阶矩阵 偏移值

SlimYOLOv3: Narrower, Faster and Better for Real-Time UAV Applications

https://arxiv.org/abs/1907.11093

https://github.com/PengyiZhang/SlimYOLOv3

做剪枝的朋友可以加qq群

【Pruning系列:二】Learning Efficient Convolutional Networks through Network Slimming|YOLOv3实践 |Pytorch 总结_第3张图片

你可能感兴趣的:(模型压缩,pruning,network,ns,yolo,yolov3)