在两年前,我曾经分享过利用GhostNet对PFLD进行优化的文章——《人脸关键点检测算法PFLD的优化实战记录》,那里面介绍了经过各种奇技淫巧,GhostNet确实能够提升PFLD的速度和精度,暂且称呼这个方法为PFLD-GhostNet,而且分享到GitHub:FaceLandmark_PFLD_UltraLight后获得六十多颗星,也算老怀安慰了。
  两年后,在机缘巧合下接触到Apple大佬的MobileOne,灵机一触觉得MobileOne可能对PFLD-GhostNet还会有进一步的提升,决定尝试一下,便有了今天这篇文章。这次主要记录将GhostNet模块与MobileOne模块进行结合,对PFLD进行进一步优化的实战经验,为需要优化人脸关键点检测算法的小伙伴们提供参考,新的方法我将它叫做PFLD-GhostOne。这个PFLD-GhostOne模型比Slim版本的PFLD-GhostNet精度提升了近3.75%,相比原始PFLD更是提升了4.25%,NCNN推理速度比Slim版本的PFLD-GhostNet提升了超过11%,比原始版本的PFLD提升超过55%。

  • MobileOne简介
  • PFLD-GhostOne优化过程
  • 优化结果

开源代码在以下GitHub链接,欢迎大家多多点星收藏:)
GitHub:PFLD_GhostOne

MobileOne简介

  有关GhostNet和PFLD的介绍可以参考我两年前分享的文章《人脸关键点检测算法PFLD的优化实战记录》,这里主要介绍一下MobileOne。
  MobileOne是2022年Apple大佬提出来的用于移动设备的网络结构,利用重参数化可以有效提高轻量级网络的性能,当然重参数化是RepVGG最先提出来,有兴趣的童鞋可以去膜拜一下,MobileOne只是站在RepVGG巨人的肩膀上提出来的模型结构。如下图所示,MobileOne的基础模块在训练时是多分支的卷积结构,由于卷积和BN都是线性操作,经过重参数化后这个多分支结构可以合并成一个卷积和BN操作,因此在推理阶段,这个多分支结构就可以等效为单通路结构,可以大大减少推理阶段的运算量。在下面的性能表格中可以看到最轻量级的MobileOne-S0比ShuffleNetV2-x1.0的精度已经有一个较大的提升,推理速度两者也相当。

↑ 图1 MobileOne Block结构

↑ 图2 MobileOne性能表

PFLD-GhostOne优化过程

在这次优化PFLD模型的过程中,最最最重要的部分就是将MobileOne的重参数化技术引入到GhostNet中,我将这个结合体称为GhostOne,正因为这个GhostOne模块,可以大大提升PFLD模型的性能。

GhostOne模块

在介绍GhostOne之前,我们先重温一下GhostNet的基础结构。
GhostNet的基础结构Ghost Module如图3所示:

↑ 图3 Ghost Module

通过堆叠Ghost Module形成的Ghost Bottleneck如图4所示:

↑ 图4 Ghost Bottleneck

现在进入正题,介绍今天的主角GhostOne。
GhostOne Module的整体结构如图5所示:

↑ 图5 GhostOne Module

  可以看到GhostOne Module其实和Ghost Module的整体结构非常相像,两者的最大区别就是GhostOne Module利用MobileOne中的多分支卷积结构代替了Ghost Module中单一的卷积操作。在训练过程中两者的结构可能差异比较大,一旦经过重参数化后,在推理过程中两者的结构理论上是一模一样的,计算量和参数量也都是一样的,因此GhostOne Module对比原始的Ghost Module,在推理速度上是一样的。

通过堆叠GhostOne Module形成的GhostOne Bottleneck如图6所示:

↑ 图6 GhostOne Bottleneck

  通过对比Ghost Bottleneck可以看出,GhostOne Bottleneck缺少了Skip Connection,这里参考的是YoloV7的做法,YoloV7的作者发现,当两个重参数化模块串联时,这个Skip Connection会破坏模型的特征表达能力,最终便有了上面的GhostOne Bottleneck结构。
  最终的PFLD-GhostOne模型结构,就是在PFLD-GhostNet的基础上,直接将上述的GhostOne Bottleneck替换掉原始的Ghost Bottleneck,同时把一般的卷积操作也替换成MobileOne Block,在模型精度有比较大的提升的同时,推理速度也有了一个质的提升。PFLD-GhostOne结构如表1:

Input Operator t c n s
112x112x3 MobileOneBlock 3×3 - 64 1 2
56x56x64 DW-MobileOneBlock 3×3 - 64 1 1
56x56x64 GhostOne Bottleneck 1.5 80 3 2
28x28x80 GhostOne Bottleneck 2.5 96 3 2
14x14x96 GhostOne Bottleneck 3.5 144 4 2
7x7x144 GhostOne Bottleneck 1.5 16 1 1
7x7x16 MobileOneBlock 3×3 - 32 1 1
7x7x32 Conv7×7 - 128 1 1
(S1) 56x56x64
(S2) 28x28x80
(S3) 14x14x96
(S4)  7x7x144
(S5)  1x1x128
AvgPool
AvgPool
AvgPool
AvgPool
-
-
-
-
-
-
64
80
96
144
128
1
1
1
1
-
-
-
-
-
-
S1,S2,S3,S4,S5 Concat+Full Connection - 136 1 -

↑ 表1 PFLD-GhostOne结构

说明:t代表GhostOne Bottleneck中间通道的拓展倍数,c代表GhostOne Bottleneck的输出通道数目,n代表GhostOne Bottleneck的串联个数,s代表stride,模型所有的MobileOne Block中的分支数目都是6。

优化结果

WFLW测试结果
模型输入大小为112x112

Model NME OpenVino Latency(ms) NCNN Latency(ms) ONNX Model Size(MB)
PFLD 0.05438 1.65(CPU) 2.78(GPU) 5.4(CPU) 5.1(GPU) 4.66
PFLD-GhostNet 0.05347 1.79(CPU) 2.55(GPU) 2.9(CPU) 5.3(GPU) 3.09
PFLD-GhostNet-Slim 0.05410 2.11(CPU) 2.54(GPU) 2.7(CPU) 5.2(GPU) 2.83
PFLD-GhostOne 0.05207 1.79(CPU) 2.18(GPU) 2.4(CPU) 5.0(GPU) 2.71

说明:OpenVino和NCNN的推理时间均在11th Gen Intel® Core™ i5-11500下进行统计。

作者 @Anthony Github
2022 年 10月

PFLD+GhostNet+MobileOne=PFLD_GhostOne,重参数化让PFLD重生,精度提升超过4%,速度提升超过55%,代码已开源相关推荐

  1. 清华开源ResRep:剪枝SOTA!用结构重参数化实现CNN无损压缩 | ICCV 2021

    分享一篇我去年突发奇想做的剪枝paper,已被ICCV-2021接受. 效果是相当SOTA的:ImageNet top1-acc为76.15%的标准ResNet-50(torchvision标准模型) ...

  2. 轻量级CNN模块!RepGhost:重参数化实现硬件高效的Ghost模块

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 转载自:极市平台  作者丨科技猛兽 导读 本文作者希望通过结构重新 ...

  3. 【论文学习】RepVGG: Making VGG-style ConvNets Great Again及网络重参数化的用途及效果分析

      本文学习了RepVGG以及同作者在网络重参数化领域的几篇文章,总结其主要原理,试验重参数化方法的效果并分析其价值意义.   RepVGG是CVPR2021收录的一篇论文,作者是清华大学的丁霄汉博士 ...

  4. 结构重参数化技术【为了模型压缩】:进可暴力提性能,退可无损做压缩

    训练时: 训练资源一般是相对丰富的,我们更在意推理时的开销和性能,因此我们想要训练时的结构较大,具备好的某种性质(更高的精度或其他有用的性质,如稀疏性[节省空间]), 推理时: 转换得到的推理时结构较 ...

  5. 46FPS+1080Px2超分+手机NPU,arm提出一种基于重参数化思想的超高效图像超分方案

    编辑:Happy 首发:AIWalker 本文是ARM的研究员在大分辨率图像超分方面的一次探索,它将重参数化思想嵌入到图像超分结构中,并结合手机NPU硬件性能对现有超分的性能进行的对比分析.在Arm ...

  6. YOLOv5/v7 引入 RepVGG 重参数化模块

    本篇博文代码出自YOLOv5-lite ,YOLOv5-lite的作者在CSDN的账号是 pogg_ ,大家可以关注一下,这也是一位在开源项目上做了很多工作的博主. RepVGG的原理和融合推导过程可 ...

  7. 【重参数化】《Diverse Branch Block: Building a Convolution as an Inception-like Unit》 2021

    摘要:我们提出一种通用的卷积网络构造块用来在不增加任何推理时间的前提下提升卷积网络的性能.我们将这个块命名为分离分支块(Diverse Branch Block).通过结合不同尺寸和复杂度的分离分支( ...

  8. VAE中重参数化技巧

    谈起重参数化技巧,不得不提变分自编码器(VAE):在VAE中,我们知道需要对编码器的输出.进行采样,从而可以将采样输入到编码器网络,能够得到输入样本的重构,以这种方式对模型进行训练.而VAE并没有这么 ...

  9. 清华大学丁霄汉:深度网络重参数化——让你的模型更快更强

    不到现场,照样看最干货的学术报告! 嗨,大家好.这里是学术报告专栏,读芯术小编不定期挑选并亲自跑会,为大家奉献科技领域最优秀的学术报告,为同学们记录报告干货,并想方设法搞到一手的PPT和现场视频--足 ...

最新文章

  1. NLP语义标注模型数据准备及实战
  2. 偏差是什么?一文读懂偏差
  3. 超越Swin,Transformer屠榜三大视觉任务!微软推出新作:Focal Self-Attention
  4. docker 安装kafka_laradock 中如何安装 Laravel Dusk
  5. Java 方法使用总结(重载、数组输出、enum和switch、foreach和迭代器、可变长度参数、重载中使用可变长度参数)
  6. js禁用按钮_探索js让你的网页“自己开口说话”
  7. hdfs 多租户_Hadoop多租户架构配置
  8. 分析Linux内核创建一个新进程的过程
  9. 数字图像处理复习记录(一)图像平滑、图像锐化、间隔检测
  10. LAMMPS实例教程—In文件详解
  11. Chango的数学Shader世界(十六)RayTrace三维分形(一)—— ue4中最简单的RayMarch
  12. qcap 教程_给winpe添加explorer教程(续):文件列表
  13. 视觉SLAM十四讲笔记-第四讲 李群与李代数
  14. JavaScript:在一个JS文件中引入另外的一个JS文件
  15. requests使用ip代理时单ip和多ip设置方式,智联招聘小爬虫封装
  16. jstack定位CPU占用率高的线程代码
  17. 【码上实战】【立体匹配系列】经典AD-Census: (3)代价计算
  18. Iso中查看Windows版本
  19. 基于SDN的DDoS攻击检测与防御
  20. 课程设计-多种排序方式

热门文章

  1. 014:vue+openlayers添加比例尺 (代码示例)
  2. win10如何查看显卡CUDA的版本号以及显卡驱动程序版本号
  3. 众达说两化融合管理体系A015C=数字化转型框架五个过程方法
  4. php中去除特殊符号
  5. 编程思想之多线程与多进程——从操作系统的角度述说线程与进程
  6. 电子商务网络营销怎么做
  7. MySQL设置主键从那个位置开始自增
  8. 如何检测统计工具是否正常运行
  9. 手把手教你怎么做计网综合实验
  10. iro机器人地区选多少人_2019年第二十一届IRO国际机器人奥林匹克大赛总决赛在津举行...