NanoDet

又来了一个轻量级的检测 哈哈

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

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

NanoDet_第1张图片

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

NanoDet_第2张图片

​然而,随着工业的应用发展,要求也越来越严格,正常的检测框架已经无法满足现在的检测需求,所有现在的轻量级是备受大家的关注。深度学习目标检测方法还可划分为Anchor-base和Anchor-free两大类,今年又出现了将Transformer用于目标检测的尝试。

但是,在移动端目标检测算法上,Yolo系列Anchor-base的模型一直占据主导地位。

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

NanoDet_第3张图片

 真实使用NANODet框架,确实比YOLO-Fastest系列好用很多,比YOLOF都好用一些,不过我没试过啊 每个人都这么说自己的东西~~~ 

NanoDet_第4张图片

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

NanoDet_第5张图片

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

NanoDet_第6张图片

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

NanoDet_第7张图片

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

NanoDet_第8张图片

改论文地址:https://arxiv.org/pdf/2006.04388.pdf

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

NanoDet_第9张图片

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

NanoDet_第10张图片

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

NanoDet_第11张图片

主干网络

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

NanoDet_第12张图片

部署 

成部署文件

  • 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

 好像地平线用fcos模型~~ 嘿嘿 怎么都是.bin后缀哈哈 low了~~~ 自己

你可能感兴趣的:(人工智能,目标检测,人工智能,计算机视觉)