点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

毕设的一部分,前段时间,在yolov5上进行一系列的消融实验,让他更轻(Flops更小,内存占用更低,参数更少),更快(加入shuffle channel,yolov5 head进行通道裁剪,在320的input_size至少能在树莓派4B上一秒推理10帧),更易部署(摘除Focus层和四次slice操作,让模型量化精度下降在可接受范围内)。

一、消融实验结果比对

ID Model Input_size Flops Params Size(M)
001 yolo-faster 320×320 0.25G 0.35M 1.4 24.4 -
002 nanodet-m 320×320 0.72G 0.95M 1.8 - 20.6
003 shufflev2-yolov5 320×320 1.43G 1.62M 3.3 35.5 -
004 nanodet-m 416×416 1.2G 0.95M 1.8 - 23.5
005 shufflev2-yolov5 416×416 2.42G 1.62M 3.3 40.5 23.5
006 yolov4-tiny 416×416 5.62G 8.86M 33.7 40.2 21.7
007 yolov3-tiny 416×416 6.96G 6.06M 23.0 33.1 16.6
008 yolov5s 640×640 17.0G 7.3M 14.2 55.4 36.7
注:yolov5原FLOPS计算脚本有bug,请使用thop库进行计算:
input = torch.randn(1, 3, 416, 416)
flops, params = thop.profile(model, inputs=(input,))
print('flops:', flops / 900000000*2)
print('params:', params)

二、检测效果

三、Relect Work

shufflev2-yolov5的网络结构实际上非常简单,backbone主要使用的是含shuffle channel的shuffle block,头依旧用的是yolov5 head,但用的是阉割版的yolov5 head

shuffle block:

https://pic2.zhimg.com/80/v2-829162b46f3195d1fbb179b86fc61529_720w.jpg

yolov5 head:

yolov5 backbone:

在原先U版的yolov5 backbone中,作者在特征提取的上层结构中采用了四次slice操作组成了Focus层

对于Focus层,在一个正方形中每 4 个相邻像素,并生成一个具有 4 倍通道数的feature map,类似与对上级图层进行了四次下采样操作,再将结果concat到一起,最主要的功能还是在不降低模型特征提取能力的前提下,对模型进行降参和加速。

1.7.0+cu101 cuda _CudaDeviceProperties(name='Tesla T4', major=7, minor=5, total_memory=15079MB, multi_processor_count=40)Params       FLOPS    forward (ms)   backward (ms)                   input                  output7040       23.07           62.89           87.79       (16, 3, 640, 640)      (16, 64, 320, 320)7040       23.07           15.52           48.69       (16, 3, 640, 640)      (16, 64, 320, 320)
1.7.0+cu101 cuda _CudaDeviceProperties(name='Tesla T4', major=7, minor=5, total_memory=15079MB, multi_processor_count=40)Params       FLOPS    forward (ms)   backward (ms)                   input                  output7040       23.07           11.61           79.72       (16, 3, 640, 640)      (16, 64, 320, 320)7040       23.07           12.54           42.94       (16, 3, 640, 640)      (16, 64, 320, 320)

从上图可以看出,Focus层确实在参数降低的情况下,对模型实现了加速。

但!这个加速是有前提的,必须在GPU的使用下才可以体现这一优势,对于云端部署这种处理方式,GPU不太需要考虑缓存的占用,即取即处理的方式让Focus层在GPU设备上十分work。

对于的芯片,特别是不含GPU、NPU加速的芯片,频繁的slice操作只会让缓存占用严重,加重计算处理的负担。同时,在芯片部署的时候,Focus层的转化对新手极度不友好。

四、轻量化的理念

shufflenetv2的设计理念,在资源紧缺的芯片端,有着许多参考意义,它提出模型轻量化的四条准则:

(G1)同等通道大小可以最小化内存访问量 (G2)过量使用组卷积会增加MAC (G3)网络过于碎片化(特别是多路)会降低并行度 (G4)不能忽略元素级操作(比如shortcut和Add)

shufflev2-yolov5

设计理念:(G1)摘除Focus层,避免多次采用slice操作

(G2)避免多次使用C3 Leyer以及高通道的C3 Layer

C3 Leyer是YOLOv5作者提出的CSPBottleneck改进版本,它更简单、更快、更轻,在近乎相似的损耗上能取得更好的结果。但C3 Layer采用多路分离卷积,测试证明,频繁使用C3 Layer以及通道数较高的C3 Layer,占用较多的缓存空间,减低运行速度。

(为什么通道数越高的C3 Layer会对cpu不太友好,主要还是因为shufflenetv2的G1准则,通道数越高,hidden channels与c1、c2的阶跃差距更大,来个不是很恰当的比喻,想象下跳一个台阶和十个台阶,虽然跳十个台阶可以一次到达,但是你需要助跑,调整,蓄力才能跳上,可能花费的时间更久)

class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper(C3, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1) self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])# self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

(G3)对yolov5 head进行通道剪枝,剪枝细则参考G1

(G4)摘除shufflenetv2 backbone的1024 conv 和 5×5 pooling

这是为imagenet打榜而设计的模块,在实际业务场景并没有这么多类的情况下,可以适当摘除,精度不会有太大影响,但对于速度是个大提升,在消融实验中也证实了这点。

五、What can be used for?

(G1)训练

这不废话吗。。。确实有点废话了,shufflev2-yolov5基于yolov5第五版(也就是最新版)上进行的消融实验,所以你可以无需修改直接延续第五版的所有功能,比如:

导出热力图:

导出混淆矩阵进行数据分析:

导出PR曲线:

(G2)导出onnx后无需其他修改(针对部署而言)

(G3)DNN或ort调用不再需要额外对Focus层进行拼接(之前玩yolov5在这里卡了很久,虽然能调用但精度也下降挺多):

(G4)ncnn进行int8量化可保证精度的延续(在下篇会讲)

(G5)在0.1T算力的树莓派上玩yolov5也能实时

以前在树莓派上跑yolov5,是一件想都不敢想的事,单单检测一帧画面就需要1000ms左右,就连160*120输入下都需要200ms左右,实在是啃不动。

但现在shufflev2-yolov5做到了,毕设的检测场景在类似电梯轿厢和楼道拐角处等空间,实际检测距离只需保证3m即可,分辨率调整为160*120的情况下,shufflev2-yolov5最高可达18帧,加上后处理基本也能稳定在15帧左右。

除去前三次预热,设备温度稳定在45°以上,向前推理框架为ncnn,记录两次benchmark对比:

# 第四次
pi@raspberrypi:~/Downloads/ncnn/build/benchmark $ ./benchncnn 8 4 0
loop_count = 8
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1shufflev2-yolov5  min =   90.86  max =   93.53  avg =   91.56
shufflev2-yolov5-int8  min =   83.15  max =   84.17  avg =   83.65
shufflev2-yolov5-416  min =  154.51  max =  155.59  avg =  155.09yolov4-tiny  min =  298.94  max =  302.47  avg =  300.69nanodet_m  min =   86.19  max =  142.79  avg =   99.61squeezenet  min =   59.89  max =   60.75  avg =   60.41squeezenet_int8  min =   50.26  max =   51.31  avg =   50.75mobilenet  min =   73.52  max =   74.75  avg =   74.05mobilenet_int8  min =   40.48  max =   40.73  avg =   40.63mobilenet_v2  min =   72.87  max =   73.95  avg =   73.31mobilenet_v3  min =   57.90  max =   58.74  avg =   58.34shufflenet  min =   40.67  max =   41.53  avg =   41.15shufflenet_v2  min =   30.52  max =   31.29  avg =   30.88mnasnet  min =   62.37  max =   62.76  avg =   62.56proxylessnasnet  min =   62.83  max =   64.70  avg =   63.90efficientnet_b0  min =   94.83  max =   95.86  avg =   95.35efficientnetv2_b0  min =  103.83  max =  105.30  avg =  104.74regnety_400m  min =   76.88  max =   78.28  avg =   77.46blazeface  min =   13.99  max =   21.03  avg =   15.37googlenet  min =  144.73  max =  145.86  avg =  145.19googlenet_int8  min =  123.08  max =  124.83  avg =  123.96resnet18  min =  181.74  max =  183.07  avg =  182.37resnet18_int8  min =  103.28  max =  105.02  avg =  104.17alexnet  min =  162.79  max =  164.04  avg =  163.29vgg16  min =  867.76  max =  911.79  avg =  889.88vgg16_int8  min =  466.74  max =  469.51  avg =  468.15resnet50  min =  333.28  max =  338.97  avg =  335.71resnet50_int8  min =  239.71  max =  243.73  avg =  242.54squeezenet_ssd  min =  179.55  max =  181.33  avg =  180.74squeezenet_ssd_int8  min =  131.71  max =  133.34  avg =  132.54mobilenet_ssd  min =  151.74  max =  152.67  avg =  152.32mobilenet_ssd_int8  min =   85.51  max =   86.19  avg =   85.77mobilenet_yolo  min =  327.67  max =  332.85  avg =  330.36mobilenetv2_yolov3  min =  221.17  max =  224.84  avg =  222.60# 第八次pi@raspberrypi:~/Downloads/ncnn/build/benchmark $ ./benchncnn 8 4 0
loop_count = 8
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1nanodet_m  min =   84.03  max =   87.68  avg =   86.32nanodet_m-416  min =  143.89  max =  145.06  avg =  144.67shufflev2-yolov5  min =   84.30  max =   86.34  avg =   85.79
shufflev2-yolov5-int8  min =   80.98  max =   82.80  avg =   81.25
shufflev2-yolov5-416  min =  142.75  max =  146.10  avg =  144.34yolov4-tiny  min =  276.09  max =  289.83  avg =  285.99nanodet_m  min =   81.15  max =   81.71  avg =   81.33squeezenet  min =   59.37  max =   61.19  avg =   60.35squeezenet_int8  min =   49.30  max =   49.66  avg =   49.43mobilenet  min =   72.40  max =   74.13  avg =   73.37mobilenet_int8  min =   39.92  max =   40.23  avg =   40.07mobilenet_v2  min =   71.57  max =   73.07  avg =   72.29mobilenet_v3  min =   54.75  max =   56.00  avg =   55.40shufflenet  min =   40.07  max =   41.13  avg =   40.58shufflenet_v2  min =   29.39  max =   30.25  avg =   29.86mnasnet  min =   59.54  max =   60.18  avg =   59.96proxylessnasnet  min =   61.06  max =   62.63  avg =   61.75efficientnet_b0  min =   91.86  max =   95.01  avg =   92.84efficientnetv2_b0  min =  101.03  max =  102.61  avg =  101.71regnety_400m  min =   76.75  max =   78.58  avg =   77.60blazeface  min =   13.18  max =   14.67  avg =   13.79googlenet  min =  136.56  max =  138.05  avg =  137.14googlenet_int8  min =  118.30  max =  120.17  avg =  119.23resnet18  min =  164.78  max =  166.80  avg =  165.70resnet18_int8  min =   98.58  max =   99.23  avg =   98.96alexnet  min =  155.06  max =  156.28  avg =  155.56vgg16  min =  817.64  max =  832.21  avg =  827.37vgg16_int8  min =  457.04  max =  465.19  avg =  460.64resnet50  min =  318.57  max =  323.19  avg =  320.06resnet50_int8  min =  237.46  max =  238.73  avg =  238.06squeezenet_ssd  min =  171.61  max =  173.21  avg =  172.10squeezenet_ssd_int8  min =  128.01  max =  129.58  avg =  128.84mobilenet_ssd  min =  145.60  max =  149.44  avg =  147.39mobilenet_ssd_int8  min =   82.86  max =   83.59  avg =   83.22mobilenet_yolo  min =  311.95  max =  374.33  avg =  330.15mobilenetv2_yolov3  min =  211.89  max =  286.28  avg =  228.01

(G6)shufflev2-yolov5与yolov5s的对比

注:随机抽取一百张图片进行推理,四舍五入计算每张平均耗时。

六、后语

之前使用自己的数据集跑过yolov3-tiny,yolov4-tiny,nanodet,efficientnet-lite等轻量级网络,但效果都没有达到预期,反而使用yolov5取得了超过自己预想的效果,但也确实,yolov5并不在轻量级网络设计理念内,于是萌生了对yolov5修改的idea,希望能在它强大的数据增强和正负anchor机制下能取得满意的效果。总的来说,shufflev2-yolov5在基于yolov5的平台进行训练,对少样本数据集还是很work的。

没有太多复杂的穿插并行结构,尽最大限度保证网络模型的简洁,shufflev2-yolov5纯粹为了工业落地而设计,更适配Arm架构的处理器,但你用这东西跑GPU,性价比贼低。

那么!!!

shufflev2-yolov5在速度与精度均衡下超过nanodet了吗?并没有,在320×320@.5:0.95的条件下逊于nanodet。

shufflev2-yolov5在速度上超过yolo-fastest了吗,也没有,被yolo-fastest按在地上摩擦。

对于上个月刚出的yolox,那更是被吊起来锤。

优化这玩意,一部分基于情怀,毕竟前期很多工作是基于yolov5开展的,一部分也确实这玩意对于我个人的数据集十分work(确切的说,应该是对于极度匮乏数据集资源的我来说,yolov5的各种机制对于少样本数据集确实鲁棒)。

项目地址:https://github.com/ppogg/shufflev2-yolov5

另外,会持续更新和迭代此项目,欢迎star和fork!

最后插个题外话,其实一直都在关注YOLOv5的动态,最近U版大神更新的频率快了许多,估计很快YOLOv5会迎来第六版~

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

下载2

在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

下载3

在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

ShuffleNetV2-Yolov5 更轻更快易于部署的yolov5相关推荐

  1. YOLOv5-Lite:更轻更快易于部署的YOLOv5

    QQ交流群:993965802 本文版权属于GiantPandaCV,未经允许请勿转载 前言: 毕设的一部分,前段时间,在yolov5上进行一系列的消融实验,让他更轻(Flops更小,内存占用更低,参 ...

  2. 「NLP」ALBERT:更轻更快的NLP预训练模型

    目前在NLP领域,出彩的预训练模型的新工作,几乎都是基于BERT的改进,前面我们就介绍了XLNET.今天我来介绍一个更新的工作,相比于BERT,它更轻量,效果也要好. 作者 | 小Dream哥 编辑 ...

  3. 【NLP】ALBERT:更轻更快的NLP预训练模型

    目前在NLP领域,出彩的预训练模型的新工作,几乎都是基于BERT的改进,前面我们就介绍了XLNET.今天我来介绍一个更新的工作,相比于BERT,它更轻量,效果也要好. 作者&编辑 | 小Dre ...

  4. 超越MobileNetV3!Facebook提出更轻更快的FBNetV2

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:dwilimeth 知乎链接:https://zhuanlan.zhihu. ...

  5. 金升阳 | 更轻更小的R3系列金属导轨电源 ——LI75/120-23BxxR3

    金升阳通过技术方案革新.技术平台升级,推出了性价比更高.体积更小.功能更完善的升级版R3金属导轨电源LI75/120-23BxxR3.该系列满足UL61010认证要求,实现关键物料国产化,支持305V ...

  6. ps3slim安装linux,更轻更薄更有型 索尼PS3 Superslim评测

    直到目前,似乎有关PlayStation 3的介绍已经言无不尽.2006年以来,这款来自索尼的游戏主机发布了至少有400个不同款式:包括不同的硬盘容量.不同的功能.不同的机箱外形,当然了价格也不尽相同 ...

  7. 更轻更好用的蓝牙耳机,日常佩戴更舒适,QCY Crossky Link体验

    平时为了方便接打电话,我经常会戴上一副蓝牙耳机,不过戴久了入耳式的耳机,总感觉不舒服,上个月我看到一款设计很新颖的开放式耳机,来自我之前用过的一个国产品牌,最近到手后试了试,感觉质量不错,适合日常工作 ...

  8. 中小企业信息化,“轻”和“快”是方向

    中小企业有着自身的特殊性,在观念改变和专业服务产品到位后,中小企业轻装上阵,实现高效办公.快捷管理.快速发展的愿望并不遥远. 时间刚过早上七点,韩信吃完早餐,便坐到沙发上看起了新闻,查看手机日历也是这 ...

  9. YOLO-FastestV2:更快,更轻!移动端高达300 FPS!参数量仅250k

    作者丨qiuqiuqiu@知乎 来源丨https://zhuanlan.zhihu.com/p/400474142 编辑丨CVer YOLO-FastestV2项目链接: https://github ...

最新文章

  1. Xilinx SDK中分配变量的存储地址
  2. linux 把命令行结果赋值给变量;linux if语句 ; command log
  3. 去除cpp中注释的小程序
  4. mysql主从配置 windows_windows实现mysql主从配置
  5. 更新部分字段 NHibernate
  6. SAP Spartacus 里的 .release-it.json 文件
  7. Django-认证系统
  8. php redis.dll php5.6,在Windows 64位下为PHP5.6.14安装redis扩展
  9. How to Avoid Producing Legacy Code at the Speed of Typing
  10. RQNOJ PID379 / 约会计划 -并查集
  11. Android 图片压缩器
  12. Git工作笔记004---torisegit使用时Updates were rejected because the tip of your current branch i
  13. c语言指针交换字符串组,c语言 指针交换两个字符串
  14. Beta阶段第1周/共2周 Scrum立会报告+燃尽图 06
  15. Android8.1展讯平台之audio_policy_configuration.xml(四十二)
  16. PADS 不同单位之间的切换
  17. 民间计算机网络高手,高手在民间!牛人用Excel创作的惊人画作
  18. 网利友联迈入敏捷开发新时代
  19. Python练习实战股票网页数据
  20. python调整dicom窗宽窗位_【基础篇】kaggle || RSNA脑溢血金牌案例技术分享!如何使用dicom格式的数据的?...

热门文章

  1. docker 存储驱动之overlay2
  2. 创建Mac的shell命令文件(xxx.sh)
  3. V8引擎如何回收内存以及如何优化
  4. 什么是 Scrum 中的 Timeboxing? 1
  5. qs计算机专业排名2017,2017qs世界大学学科专业排名top10完整版
  6. 沉默的羔羊--电影影评
  7. java8 steam流在当前数据对象上的操作。判断list中的属性值是否符合条件或者不为空,后赋值另一个属性的操作
  8. 青春三宝:书籍、时间和健康
  9. ThingsBoard GateWay网关安装
  10. Java图形化界面编程超详细知识点(9)——Swing_树