PPLcnet和YOLO的碰撞,真的能在cpu上快到起飞?
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
作者丨陈TEL
来源丨GiantPandaCV
【导语】这是一篇论证博客,前几天,baidu发布了PPLcnet,这是一款专门为cpu设计的网络,在看完论文后,果断进行了PPLcnet-yolo的复现,一来是想验证下这个网络在cpu上的性能,二来如果验证效果work,这套实验可以合并到自己的仓库。
一、PPLcnet性能:
在看论文时,对我诱惑最大的是下面这张benckmark的比较。
其实在之前,有尝试过使用mobilenetv2、mobilenetv3进行实验,但是效果并没有让我感到理想,原因也简单,在arm架构上,mb系列被shuffle系列一骑绝尘,这种优势并不是体现在精度上,事实上,它们的精度两两比较不会超过3个百分点。但是我认为侧端落地,速度和内存占用才是最关键的两个因素(前提是精度在可接受范围内),因此毫不犹豫使用shufflenetv2来做主干。
当然,并不能拿来主义,需要分析一些利弊后做取舍,比如对于yolov5s的head,如果直接嫁接,会造成部分通道冗余,这不仅仅体现在模型参数上,在多个方面都可以看到。
使用模型剪枝的方式去逼近channel最大的承载量,开展实验去验证效果,这种也算是一种半暴力解法,可以节省很多无效时间。
另一方面,shufflenetv2-yolov5模型的两个branch分支使用了大量了bn层,在部署时进行fuse,速度可以再提升15%(这个代码会在学位论文答辩后合并上去)。
在GPU架构上,Repvgg-yolov5也是如此,头变得更厚更窄,主要还是为了缩小参数和产生的计算量(C3结构的功劳),主干换成了repvgg,在训练时采取多分支特征提取,部署时又重参化成直筒网络,可以加速20%。参数和计算量分别减少了35%和10%,在精度上,Repvgg-yolov5的map@0.5提升了1.1,map@.5:0.95提升了2.2,但代价是向前推理比原先的yolov5s要多耗费1ms(测试显卡为2080Ti)。
综上,大家请叫我为调参调包外加debug狂魔,毫无创新点,但都是对于工业部署很实用的模型。
在cpu架构上,之前以及做过mbv2、mbv3的实验,精度其实和shufflev2相差不大,但结果相对于yolov5s,input size=352*352,yolov5s的精度还略高于魔改后的模型,在速度上也并没有很大的优势。
再后来PPLcnet出现,有着很强烈的欲望想试一下这个网络是否能帮助yolo在cpu上加速。
模型的结构大致如下:
最主要的组成部分时深度可分离卷积,从第一层的CBH开始(conv+bn+hardswish),中间包含了13层dw,而后面的GAP是指7*7的Global Average Pooling,GAP后面再加point conv+FC+hardswish组件,最后是输出为1000的FC层,想要了解更详细的可以查看论文:
https://arxiv.org/pdf/2109.15099.pdf
整篇论文可以归纳关于PPLcnet的四个重要结论:
H-Swish与大卷积核可以提升模型性能且不会造成较大的推理损耗(下看Table9);
在网络的下层添加少量的SE模块可以更进一步提升模型性能且不会产生过多的损耗(实际上Lcnet仅仅这是在最后两层添加注意力,但是提升效果明显);
GAP后采用更大FC层可以极大提升模型性能(但也会让模型参数和计算量暴涨);
dropout技术可以进一步提升了模型的精度
在这里插入图片描述
二、PPLcnet-yolo:
下图是融合了PPLcnet的YOLOv5,与原先的Lcnet不同的是,此处的层数有所改变,不仅如此,YOLOv5s head中的3*3卷积也替换成了Lc_Block,并且使用了SE module,我们进行逐层分析:
1. 层数改变
如上图,CBH通道数翻倍,抽掉了两个channel为256的DSC 33卷积层,替换成两个DSC 55层(无SE Module),并且最后的四个DSC层都含有SE模块,总的层数仅增加了3层,SE Module由原来的2层变成了4层(后4层),但是精度提升巨大,这点借鉴shufflev2的【2,4,8,4】偶数倍层数,有兴趣可以看下这篇论文,很有工程意义。
2. Dense Layer
Dense Layer本质还是GAP+FC,实验发现,添加FC层精度能提升4个点左右,但会导致模型参数的暴涨,影响推理速度,故剔除掉了所有的FC层,仅留下point conv和dropout:
class Dense(nn.Module):def __init__(self, c1, c2, filter_size, dropout_prob=0.2):super().__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.dense_conv = nn.Conv2d(in_channels=c1,out_channels=c2,kernel_size=filter_size,stride=1,padding=0,bias=False)self.hardswish = nn.Hardswish()self.dropout = nn.Dropout(p=dropout_prob)self.flatten = nn.Flatten(start_dim=1, end_dim=-1)self.fc = nn.Linear(num_filters, num_filters)def forward(self, x):x = self.avg_pool(x)b, _, w, h = x.shapex = self.dense_conv(x)x = self.hardswish(x)x = self.dropout(x)x = self.flatten(x)x = self.fc(x)x = x.reshape(b, self.c2, w, h)return x
3. headPPLcnet已经验证了在末端替换少量55卷积可以起到涨点的作用,因此也将原yolov5s head的33卷积换成Lc Block,但因为Lc Block本质还是深度可分离卷积,即使使用了55的卷积核,融合了SE module,参数量依旧比原先的33卷积少一半,实验发现可以涨点,产生的参数量也很少,个人觉得性价比特别高
# YOLOv5s head:
Model Summary: 297 layers, 4982390 parameters, 4982390 gradients, 9.4 GFLOPS
# YOLOv5s head with Lc_Block:
Model Summary: 307 layers, 4376531 parameters, 4376531 gradients, 8.6 GFLOPS
# YOLOv5s head with Lc_Block and SE Module:
Model Summary: 319 layers, 4378838 parameters, 4378838 gradients, 8.6 GFLOPS
还要一些小组件的改动,比如SE module的Hard sigmoid替换成Silu,能涨点还能提速(这点跟着v5大神走),另外一个是避免onnx没有h-sigmoid这个算子,需要重构算子(这个重构会造成精度些许下降,所以替换激活函数是最省心的工作)。
4. 性能
模型复现后性能如下:
在map@0.5和map@0.5:0.95上都比原yolov5s少三个点左右,参数量和计算量少了一倍左右。
然而,上面的都不是重点,我认为最重要的还是性能,于是使用PPLcnet和yolov5s在openvino进行评测,测试硬件为Inter Core @i5-10210。
首先提取onnx模型:
$ python models/export.py --weights PPLcnet.pt --img 640 --batch 1
$ python -m onnxsim PPLcnet.onnx PPLcnet-sim.onnx
接着将PPLcnet-sim.onnx转化为IR模型:
$ python mo.py --input_model PPLcnet-yolo.onnx -s 255 --data_type FP16 --reverse_input_channels --output Conv_462,Conv_478,Conv_494
同理,yolov5s也是一样
$ python models/export.py --weights yolov5s.pt --img 640 --batch 1
$ python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
$ python mo.py --input_model PPLcnet-yolo.onnx -s 255 --data_type FP16 --reverse_input_channels --output Conv_245,Conv_261,Conv_277
此时,我们可以得到四个模型:
模型对比:
而后进行测试,总50张图片,For循环进行1000次向前推理,计算每张图片平均耗时:
通过测试可以看到,input size=640*640,PPLcnet的一次先前推理比原yolov5s快3倍左右,部分样例视图.
PPLcnet-yolo Forward Example:
YOLOv5s Forward Example:
留言:
后续会将复现的实验及代码合并到主分支:
https://github.com/ppogg/YOLOv5-Lite
欢迎大家白嫖,有问题可以提issue,会尽快解决。
另外,这个是为cpu设计的模型,请使用openvino或者其他cpu向前推理框架进行部署和评测!!!
YOLOv5 6.0版本来了
重头戏来了,昨天看到YOLOv5发布了第六版:
模型性能有所改观:
依旧是没有创新点,但是工程价值有突破,体现在计算资源和推理耗时方面。
另外,我觉得最主要的亮点有三个,YOLOv5-Nano对移动设备的适配,Focus层的变化,SPP的改动:
1. YOLOv5-Nano的性能:
之前在侧端设备上测试了带有focus层的量化版yolov5s模型,发现这玩意很容易崩,对于小模型的话,v5大神是直接替换掉,可能是出于稳定性的考虑,毕竟conv3*3卷积在不同框架上的优化已经非常成熟了,对于大部分小模型,本身模型的参数和运行时产生的计算量并不多,使用focus也很难起到降参降计算量的作用,量化时还能更稳定一些。
2. Focus层的改变:
3. SPP→SPPF:
By the way!!!v4大牛,v5大神,还要Scale Yolov4的作者,三人在社区上被称为commit狂魔,有段时间天天看到他们几个在update,这种匠人精神着实令人佩服。
本文仅做学术分享,如有侵权,请联系删文。
3D视觉精品课程推荐:
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
PPLcnet和YOLO的碰撞,真的能在cpu上快到起飞?相关推荐
- Yolo:实时目标检测实战(上)
Yolo:实时目标检测实战(上) YOLO:Real-Time Object Detection 你只看一次(YOLO)是一个最先进的实时物体检测系统.在帕斯卡泰坦X上,它以每秒30帧的速度处理图像, ...
- java linkedlist 查找_Java中LinkedList真的是查找慢增删快
测试结果 废话不多说,先上测试结果.作者分别在ArrayList和LinkedList的头部.尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果 (感谢@Hosa ...
- 无锁队列真的比有锁队列快吗【c++ linux后台开发】
无锁队列真的比有锁队列快吗[c++ linux后台开发]|解决内存频繁分配问题|无锁队列没数据可读时怎么休眠|无锁队列到底是不是终极解决方案 专注后台服务器开发,包括C/C++,Linux,Nginx ...
- 手机和工业计算机运算能力对比,你真的了解手机CPU与电脑CPU的差别吗?!
原标题:你真的了解手机CPU与电脑CPU的差别吗?! 现在已经是手机电脑"泛滥"的时代,工作中我们面对电脑,回家的路上手机成为我们的伴侣,日复一日的面对这两件必不可少的东西,试问作 ...
- 经验分享:创业本无捷径,但是选对路真的能让你更快赚到钱
大家好,我是新一 很多人说创业根本就没有什么捷径可走,只有踏踏实实的才能赚到钱. 当然,这话说得没有错. 但是创业又不同于打工,也不是你踏踏实实就一定能赚到钱的. 有的时候看似不起眼的选择,其实就代表 ...
- 多线程真的会使用CPU所有的内核吗?
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:http://h5ip.cn/2SGY 学习多线程的时候,我们都知道如果多个线程分配到C ...
- LinkedList 真的是查找慢增删快?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:juejin.im/post/5c00987de5 ...
- yolo人脸检测数据集_自定义数据集上的Yolo-V5对象检测
yolo人脸检测数据集 计算机视觉 (Computer Vision) Step by step instructions to train Yolo-v5 & do Inference(fr ...
- ios keychain 不被清理_清理垃圾,恢复出厂设置真的能让手机变快吗?
支付宝每天领红包 打开支付宝首页, 搜索 "9479339",领取支付宝红包,最高99元 搜索"体验金71127639"领百万体验金,收益归你 搜索" ...
最新文章
- 重磅!AMD350亿美金收购赛灵思,「苏妈」终于出手啦!
- 测试你的开源 IQ 答案
- Ubuntu18.04安装rabbitmq
- MODBUS通讯:libmodbus库使用方法
- 【BZOJ3598】【SCOI2014】方伯伯的商场之旅(数位dp)
- Mac电脑下配置maven环境变量
- ArcEngine中打开各种数据源(WorkSpace)的连接(转)
- 计算机图形学——Bresenham画线算法
- 关于色域与BT.2020相关学习心得笔记
- 基于四叉树的图像压缩问题
- linux系统改键盘系统,Linux 修改键盘设置
- CHARACTERISTIC DEFINITION
- 分布式动态路由的实现
- 液压缸移动负载分析(液压系统基础)
- TBTOOLS的使用:用TBTOOLS实现多序列比对
- [SV]SystemVerilog Constraints(1)
- JavaB试题 基础练习 Fibonacci数列
- 什么是keep-alive
- iPhone语音拍照怎么用?
- 极客Go云监工 --- 开源前序