作者:Edison_G
NanoDet总体而言没有特别多的创新点,是一个纯工程化的项目,主要的工作就是将目前学术界的一些优秀论文,落地到移动端的轻量级模型上。最后通过这些论文的组合,得到了一个兼顾精度、速度和体积的检测模型。
开源代码:https://github.com/RangiLyu/nanodet
1
前言&背景
图像选自于《https://www.cnblogs.com/azureology/p/14103685.html》
目标检测是现在最热门的研究课题,也一直是工业界重点研究的对象,最近几年内,也出现了各种各样的检测框架,所属于YOLO系列是最经典也是目前被大家认可使用的检测框架。
然而,随着工业的应用发展,要求也越来越严格,正常的检测框架已经无法满足现在的检测需求,所有现在的轻量级是备受大家的关注。深度学习目标检测方法还可划分为Anchor-base和Anchor-free两大类,今年又出现了将Transformer用于目标检测的尝试。
- CVPR21目标检测新框架:不再是YOLO,而是只需要一层特征(干货满满,建议收藏)
- 目标检测 | Anchor free的目标检测进阶版本
- ICCV2021:阿里达摩院将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
代码语言:javascript复制python -m onnxsim /nanodet/nanodet-main/tools/model_test.onnx nanodet_sim.onnx
4)转换成bin
cd /ncnn-master/build/tools/onnx
代码语言:javascript复制./onnx2ncnn /onnx-simplifier-master/nanodet_sim.onnx nanodet_m.param nanodet_m.bin
© THE END