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