YOLObile:面向移动设备的「实时目标检测」算法

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

干货第一时间送达

分享一篇AAAI 2021录用论文:YOLObile: Real-Time Object Detection on Mobile Devices via Compression-Compilation Co-Design作者来自于美国东北大学、匹兹堡大学和William & Mary。

作者提出了一种通过从压缩、编译两个角度,在保证模型准确率的基础上,减小模型的大小,并提升模型在移动设备端的运行速度。

通过所提出的YOLObile framework,将YOLOv4压缩了14倍,准确率保持在49.0mAP,在Samsung Galaxy S20上使用GPU,推理速度为17FPS;使用所提出的CPU-GPU合作机制,推理速度可以提升至19FPS,是原始的YOLOv4的5倍。目前代码已经开源。

1. DNN model pruning

这篇文章主要的工作是模型裁剪和推理加速策略,所以在介绍这篇文章的工作之前,先介绍目前主流的三种剪枝策略:Unstructured pruning,Structured pruning和Pattern-based pruning。

1.1 Unstructured pruning

所谓非结构性剪枝允许在权重矩阵的任意位置进行裁剪。其优点主要有:

  • 在搜寻最优的剪枝结构上有更好的灵活性

  • 可以达到很高的模型压缩率和极低的精度丢失

如下图所示:

可以看出,Unstructured pruning方法得到的权重分布很不规则,所以在计算前向的时候,通常需要额外的非零权值的索引。这对于那些可以并行运算的设备(GPU)很不友好,所以不太适合用于DNN推理加速,甚至有可能导致速度下降。

1.2 Structured pruning

结构性剪枝如上图(b)所示,主要从卷积核个数(filters)和通道数(channels)上进行剪枝,因而得到的权重矩阵仍然是规则的。这对于支持并行运算的硬件非常友好,有助于提升推理速度。

但是由于这种裁剪方式过于粗糙(直接剪掉一个或者多个卷积核或者减去所有卷积核中同一个或多个位置的通道的权重),所以精度丢失非常严重。

1.3 Pattern-based pruning

Pattern-based pruning可以看作是一种fine-grained结构性剪枝,比结构性剪枝更加灵活。如下图所示:

主要包括两个部分:kennel pattern prune和connectivity prune。这里为了方便说明,定义一个卷积层参数为 ,每个卷积核(kernel)大小为 ,卷积核个数为 。kennel pattern prune指的是对于每一个卷积核,裁去每个通道(channel)上固定位置的参数,如上图黄色背景框内灰色的部分;

每个卷积核可以采用不同的裁剪模式(pattern),但是要保证剩余的每个通道的参数数量是固定的,如上图的剩余的红色、黄色、绿色和紫色方块数量都是4。

而connectivity prune指的是直接裁去整个卷积核。这样做的好处是可以保证裁剪后的参数分布都是规则的,也比structured pruning更加灵活,精度丢失的也会相对少一些。

但是kennel pattern prune只针对3x3卷积核,限制了pattern-based pruning的应用场景。

2. Motivation

基于目前SOTA的目标检测算法,精度高的,模型比较大,在移动设备上会有很高的时延;而那些在移动设备端可以快速运行的轻量级算法又牺牲了算法精度。

三种主流的剪枝算法Unstructured pruning可以保证精度,但是不能保证速度,Structured pruning可以保证速度,但是无法保证精度;Pattern-based pruning可以一定程度上同时保证速度和精度,但是应用场景有限。

基于此,这篇文章的主要工作可以总结为以下两点:

  • 提出一种剪枝策略,可以同时保证速度和精度,并且可以推广到任意layer(pattern-based pruning只能应用在3x3卷积层)

  • 提出一种更高效的计算加速策略

3. Method

3.1 Block-punched pruning

Block-punched pruning是这篇文章提出的一种以同时保证速度和精度,并且可以推广到任意layer的剪枝策略。主要内容如下图所示:

将一个layer的参数(以卷积层为例 )分成参数相等的blocks,每个block包含m个连续的filter和n个连续的channel。对block中的所有channel,裁剪去相同位置的参数。

与pattern-based pruning不同的地方在于,pattern-based pruning对于整个filter进行相同模式的裁剪,而Block-punched pruning对于一个block进行相同模式的裁剪,比pattern-based pruning更加精细,而且可以推广到任意layer(不局限于3x3layer)。

Block-punched pruning特点是:block size会极大的影响模型的精度和在硬件上的运行速度

  • block size越小,精度丢失越少,但是推理速度也会变慢

  • block size越大,精度丢失越严重,但是推理速度变快

所以选择一个合理的block size非常重要。这里作者给出了两个建议:

  • 对于block中channel的数量:与设备中CPU/GPU的vector registers的长度一致

  • 对于block中的filter的数量:在保证目标推理速度的前提下,选择最少的filter数量

3.2 Reweight regularization pruning algorithm

这里讲的是如何具体的实现剪枝。这篇文章采用了一种reweighted group Lasso^[1]^方法,其基本原理是:**减小大权重的惩罚项,增大小权重的惩罚项。**假设 是i-th卷积层的参数,于是该问题可以有以下的目标函数来解决:

从公式可以看出,利用参数F范数(Lasso一般采用L1范数)的平方的倒数作为加权值,权值越大,惩罚项的加权值越小。最后需要剪去的参数是那些逼近于0 的参数。

3.3 CPU-GPU合作机制

这里提出了一种更高效的计算加速策略,可以综合利用GPU和CPU。目前的一些推理加速框架如TFLite和MNN只能支持在移动GPU或CPU上顺序执行DNN推理,这可能造成计算资源的浪费。

一些网络如YOLOv4有分不同的分支,如果这些分支可以同时分别运行在GPU和CPU上,就可以提高推理效率和速度。

所以剩下的问题就是确定哪些分支需要执行在GPU上,哪些分支需要执行在CPU上。通常GPU比较适合处理一些高并行的数据,如有大量的卷积层。还是以YOLOv4的cross-stage partial为例子:

定义branch1和branch2在GPU上的耗时为 ,在CPU上的耗时分别 ,branch1卷积层多适合GPU运算,如果采用GPU和CPU并行运算,那么最终的处理时间取决于最大耗时,定义数据拷贝到CPU上的耗时为 ,则GPU和CPU并行运算耗时为:

如果只采用GPU进行串行运算,即先计算branch1,再计算branch2,则耗时为两者之和:

通过 可以确定branch2在哪个设备上运行。因为每个branch的执行是独立的,所以可以通过Greedy Algorithm(贪心算法)来确定网络中每一个分支的执行的位置(GPU or CPU)。

对于那些低计算密度的操作如pixel-wise add和pixel-wise multiply操作,移动设备上CPU和GPU的运算效率差不多。所以对于non-convolution的分支,在CPU还是在GPU上运算,取决于总耗时。

如上图(b)所示,三个YOLO head的运算都是non-convolution的,所以三个分支运算在哪个分支的可能性有8种,假设前两个运行在CPU上,最后一个分支运行在GPU上,那么总的运行时间为:

采用上述的方案分别确定每个conv branch和non-conv branch运行的位置,最小化总的推理时间。

YOLObile提供了每一层的CPU和GPU代码,为实现上述的计算提供了可行性。

4. Results

最终的实验结果表明,文章所提出的压缩剪枝和加速方案可以在提升推理速度的同时,还能保持较高的准确率。

参考文献

[1] EJ Candès, Wakin M B , Boyd S P . Enhancing Sparsity by Reweighted 1 Minimization[J]. Journal of Fourier Analysis & Applications, 2008, 14(5-6):877-905.

[2] 论文原文:https://arxiv.org/abs/2009.05697

[3] 代码:https://github.com/nightsnack/YOLObile

END

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

下载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视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:

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

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

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

3D视觉工坊 CSDN认证博客专家 算法 3D视觉
个人公众号:3D视觉工坊。公众号特邀嘉宾及合伙人,先后就职于国内知名研究机构、自动驾驶公司、海康研究院,主要研究方向为深度学习、目标检测、语义分割、图像处理、自动驾驶感知算法等,CSDN博客专家。博主先后任职于国内知名研究院、知名大厂,致力于3D视觉算法、VLAM算法开发,涉及相机标定、手眼标定、结构光、点云后处理、三维重建等相关领域的研究,同时也是CSDN博客专家。3D视觉工坊坚持原创,近一年来输出了非常多的高质量文章,获得了粉丝的一致好评,我们将始终坚持走原创路线,打造一个铁杆粉丝的聚集区。
已标记关键词 清除标记
<span style="color:#E53333;"><span style="color:#000000;"> </span></span> <p style="font-size:16px;"> <span style="color:#3A4151;">课程演示环境:Ubuntu </span> </p> <p style="font-size:16px;"> </p><p> <span><span style="color:#0070C0;">需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》</span></span> </p> <p> <span><span style="color:#0070C0;">课程链接:https://edu.csdn.net/course/detail/29123</span></span>  </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;">当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是最新的强悍的目标检测技术。本课程使用</span><strong><span style="color:#C00000;">YOLOv4实现实时的人脸口罩佩戴检测</span></strong><span style="background-color:#FFFFFF;">。课程提供</span><strong><span style="color:#C00000;">超万张已标注人脸口罩数据集</span></strong><span style="background-color:#FFFFFF;">。训练后的YOLOv4可对真实场景下人脸口罩佩戴进行</span><span style="background-color:#FFFFFF;">高精度地</span><span style="background-color:#FFFFFF;">实时检测。</span> </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;"><br /></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><span style="font-size:16px;">本课程会讲述本项目超万张人脸口罩数据集的制作方法,包括使用labelImg标注工具标注以及如何使用Python代码对第三方数据集进行修复和清洗。</span><br /></span></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><br /></span></span> </p> <p style="font-size:16px;"> 本课程的YOLOv4使用AlexyAB/darknet,在Ubuntu系统上做项目演示。具体项目过程包括:安装YOLOv4、训练集和测试集自动划分、修改配置文件、训练网络模型、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类分析。  </p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200601524939.jpg" alt="" /></p> <p style="font-size:16px;"> <strong>YOLOv4人脸口罩佩戴检测效果</strong> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200603052758.jpg" alt="" /></p> <p style="font-size:16px;"> <br /></p> <span style="color:#000000;"></span>
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付 49.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值