本文介绍 yolov3增强版TensorRT加速MX250下28fps!JetsonNano必备

yolov3增强版TensorRT加速MX250下28fps!JetsonNano必备

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

Yolo系列是一个很经典的目标检测算法,如果你的问题不是遮挡非常严重情况下的目标检测问题,使用yolo可以让你以最快的速度获得一个很高的精度,尤其是现在很多网络模型压缩,剪枝大多在yolo上进行,这使得人们对它的研究比其他的更多。事实上,yolov3也同样没有令人失望。

我们花了一点时间,将ASFF应用于yolov3,并修改了mobilenetv2作为backbone,来探索一个从训练到部署的统一化集成方案。通过在一些数据集上的训练我们发现,加上了ASFF的yolov3不仅仅在速度上依旧可以保持轻量高速,同时在精度上也很高。

借用一张原论文的图:

对比目标检测的杠靶子RetinaNet,你可以明显看到yolov3+asff相比于它是多么的强,不仅仅精度碾压,同时速度更是快,并且从某种意义上来说,它的精度甚至好于CenterNet。虽然比不上NasFPN,但至少可以与之媲美,不过毫无疑问,如果你想要一个跑的足够快但同时精度又足够高的算法,那么肯定它值得一尝试。

实际的训练出来的模型效果也表明了它在这一方面的强大能力,对于小目标的检测能力,以及看起来不可见的物体的洞察能力确实强于一般的目标检测算法:

也难怪,人家可以在几块的速度下,达到最高43.9的mAP!

当然我们今天要介绍的不仅仅是它多牛逼,而是如何应用于现实的生产环境。简单来说,我们主要做了两个事情:

  • 将yolov3+asff的代码导出为了onnx;
  • 对onnx模型进行优化,并使用TensorRT进行了加速;
  • 整个推理可以纯C++实现。

具体速度上我们可以对比:

System test-dev mAP Time (V100) Time (2080ti) Time (1070) Time (1070 Trt) Time (MX250 Trt)
YOLOv3 608 33.0 20ms 26ms 30ms/33ps 21ms/47fps
YOLOv3 608+ BoFs 37.0 20ms 26ms
YOLOv3 608 (our baseline) 38.8 20ms 26ms
YOLOv3 608+ ASFF 40.6 22ms 30ms
YOLOv3 608+ ASFF* 42.4 22ms 30ms
YOLOv3 800+ ASFF* 43.9 34ms 38ms
YOLOv3 MobileNetV1 416 + BoFs 28.6 - 22 ms
YOLOv3 MobileNetV2 416 (our baseline) 29.0 - 22 ms
YOLOv3 MobileNetV2 416 +ASFF 30.6 - 24 ms 28ms/35fps 17ms/59fps 35ms/28fps

从上面的表格可以看到通过TensorRT的加速,可以在一个不是那么decent的卡上获得60fps的速度,想对于的输入尺寸是544,这不能说是很小的尺寸了,根据我们的经验,输入尺寸越大,越能保证模型的检出率。表中显卡MX250是一款笔记本显卡,你可以认为使用这个模型(yolov3 mobilenet asff)可以使得你的模型在你的笔记本上跑到realtime,当然前提是你安装了一款足够入门级的显卡。确实,28fps已经足够实时了。

ASFF的原理

套用论文中的一张图,asff其实有点像FPN,就如同它的名字一样,adaptively spatial feature fusion, 它学习到的特征不仅仅是多尺度的,而且是不同的纹理特征,这对于赋予网络识别不同的类别至关重要。事实上,在实验中,我们发现,添加asff之后,其对应的类别的置信度会得到增强。

相比与一些anchor free的算法,它在检测出物体的同时,对应的probability通常是更高的。

Talk is chip, show me the code

说起来容易,让大家知道我们实现了一个同时兼顾精度和速度的算法,同时可以使用tensorrt, MNN等库来进行部署侧加速,但是没有代码又如何让大家来尝试呢。

关于本文设计到的所有代码,大家可以在这个平台获取,事实上Github也有很多实现,只不过他们不是一个完整的体系,同时也没有那么注重工程化,连能完整的导出onnx的代码都比较少。

http://manaai.cn/aicodes_detail3.html?id=51

最后,由于TensorRT的加速代码写起来很费劲,我们也不想让大家变成伸手党,毕竟你动手去获取的东西才有价值,不然也不会觉得它多宝贵,感兴趣的朋友可以添加下面的QQ群交流,获取源码,同时在QQ群我们会定期分享一些有价值的算法和论文。敲门砖:神力人工智能。