查看原文
其他

不再只有Yolo,现在轻量级检测网络层出不穷(框架解析及部署实践)

Edison_G 计算机视觉研究院 2022-12-03

计算机视觉研究院专栏

作者:Edison_G

NanoDet总体而言没有特别多的创新点,是一个纯工程化的项目,主要的工作就是将目前学术界的一些优秀论文,落地到移动端的轻量级模型上。最后通过这些论文的组合,得到了一个兼顾精度、速度和体积的检测模型。


公众号ID|ComputerVisionGzq
学习群|扫码在主页获取加入方式


开源代码:https://github.com/RangiLyu/nanodet
1

前言&背景


图像选自于《https://www.cnblogs.com/azureology/p/14103685.html》

目标检测是现在最热门的研究课题,也一直是工业界重点研究的对象,最近几年内,也出现了各种各样的检测框架,所属于YOLO系列是最经典也是目前被大家认可使用的检测框架。

然而,随着工业的应用发展,要求也越来越严格,正常的检测框架已经无法满足现在的检测需求,所有现在的轻量级是备受大家的关注。深度学习目标检测方法还可划分为Anchor-base和Anchor-free两大类,今年又出现了将Transformer用于目标检测的尝试。
但是,在移动端目标检测算法上,Yolo系列Anchor-base的模型一直占据主导地位。但是今天“计算机视觉研究院”介绍的是Anchor-free的NANODet框架以及部署应用。

2

框架介绍


Super fast and lightweight anchor-free object detection model. Real-time on mobile devices.

真实使用NANODet框架,确实比YOLO-Fastest系列好用很多,比YOLOF都好用一些,下一期,我们“计算进视觉研究院”计划给大家一起来详细说说YOLO-Fastest系列。

现在Github提供的整体,都已在安卓运行,华为P30上用NCNN移植跑benchmark,每帧仅需10.23毫秒,比yolov4-tiny快3倍,参数量小6倍,COCO mAP(0.5:0.95)能够达到20.6 。而且模型权重文件只有1.8mb。


我们现在先说下NANODet的具体创新。首先是检测头,需要对移动端进行优化的就是检测头:FCOS系列使用了共享权重的检测头,即对FPN出来的多尺度Feature Map使用同一组卷积预测检测框,然后每一层使用一个可学习的Scale值作为系数,对预测出来的框进行缩放。

图片来自于:

https://openaccess.thecvf.com/content_ICCV_2019/papers/Tian_FCOS_Fully_Convolutional_One-Stage_Object_Detection_ICCV_2019_paper.pdf

这么做的好处是能够将检测头的参数量降低为不共享权重状态下的 1/5。这对于光是检测头就拥有数百通道卷积的大模型来说非常有用,但是对于轻量化模型来说,共享权重检测头并没有很大的意义。由于移动端模型推理由 CPU 执行计算,共享权重并不会带来推理过程的加速,而且在检测头非常轻量的情况下,共享权重使其检测能力进一步下降,因此项目作者认为选择对每一层特征使用一组卷积比较合适。

其次,是对损失函数做了一些改变。将FCOS轻量化处理时,由于FCOS的centerness分支在轻量级的模型上很难收敛,模型效果不如预期。最终,NanoDet使用了李翔等人提出的Generalized Focal Loss损失函数。该函数能够去掉FCOS的Centerness分支,省去这一分支上的大量卷积,从而减少检测头的计算开销,非常适合移动端的轻量化部署。

改论文地址:https://arxiv.org/pdf/2006.04388.pdf
最后,项目作者借鉴了Yolo系列的做法,将边框回归和分类使用同一组卷积进行计算,然后 split 成两份。最终得到的轻量化检测头如下图所示:

FPN 层改进

摘自于《机器之心》

目前针对 FPN 的改进有许多,如EfficientDet使用了BiFPN,YOLO v4和v5使用了PAN,除此之外还有BalancedFPN等等。BiFPN虽然性能强大,但是堆叠的特征融合操作会导致运行速度降低,而PAN只有自上而下和自下而上两条通路,非常简洁,是轻量级模型特征融合的好选择。

原版的PAN和YOLO系列中的PAN都使用了stride=2的卷积进行大尺度Feature Map到小尺度的缩放。而该项目出于轻量化的考虑,选择完全去掉 PAN 中的所有卷积,只保留从骨干网络特征提取后的1x1卷积来进行特征通道维度的对齐,上采样和下采样均使用插值来完成。与YOLO使用的concatenate操作不同,项目作者选择将多尺度的Feature Map直接相加,使整个特征融合模块的计算量变得非常小最终得到的极小版 PAN结构非常简单:


图片源自于《https://zhuanlan.zhihu.com/p/306530300

主干网络

项目作者选择使用ShuffleNetV2 1.0x作为主干网络,他去掉了该网络的最后一层卷积,并且抽取8、16、32倍下采样的特征输入到PAN中做多尺度的特征融合。整个主干模型使用了Torchvision提供的代码,能够直接加载Torchvision上提供的imagenet预训练权重,对加快模型收敛起到很大帮助。

3

部署

生成部署文件

  • pth 转化为ONNX

python tools/export.py --cfg_path /config/EfficientNet-Lite/nanodet-EfficientNet-Lite1_416.yml --model_path /model_best/model_best.pth --out_path model_test.onnx --input_shape 416,416
  • ONNX转化NCNN

1)编译ncnn

参考   https://blog.csdn.net/weixin_40970506/article/details/105148061

2)安装onnx==1.8.1

3)cd onnx-simplifier-master

python -m onnxsim  /nanodet/nanodet-main/tools/model_test.onnx nanodet_sim.onnx

4)转换成bin

cd  /ncnn-master/build/tools/onnx

./onnx2ncnn /onnx-simplifier-master/nanodet_sim.onnx nanodet_m.param nanodet_m.bin


© THE END 

转载请联系本公众号获得授权


计算机视觉研究院学习群等你加入!


计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

扫码关注

计算机视觉研究院

公众号ID|ComputerVisionGzq

学习群|扫码在主页获取加入方式

 往期推荐 

🔗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存