在一款基于JetsonNano的四轮车平台上,测试和验证常见的物体检测网络模型执行情况,主要测试其FPS指标,为后续该平台的相关项目提供技术参考. 同时也通过和常用笔记本之间的横向对比(主要FPS),更直观的体验常用物体检测网络的执行速率.
主要在三种硬件环境下测试验证,分别是:
* 基于笔记本CPU硬件:
酷睿i7-8565U 4.60GHz, 内存16G, NVIDIA GeForce MX250独显 with 2GB GDDR5高速显存, Win10
* 基于笔记本GPU硬件:
酷睿i7-8565U 4.60GHz, 内存16G, NVIDIA GeForce MX250独显 with 2GB GDDR5高速显存, Win10
* 基于Jetson Nano GPU硬件:
GPU: 128 Core Maxwell, 472 GFLOPs (FP16)
CPU: 4 core ARM A57 @1.43 GHz aarch64
Memory: 4GB 64bit LPDDR4 25.6 GB/s 无图形界面,基本全部用于GPU
System: Ubuntu 18.04 with JetPack4.3, ROS版本为Melodic, CUDA 10.2
三. Pytorch环境搭建及准备常用物体检测网络
在PC环境下安装和准备PyTorch等操作,按照PyTorch官方指导即可;
这里讲一下在基于Jetson Nano的Ubuntu上安装PyTorch注意事项:
1. 安装torch包
如果按照PyTorch官方指导给出的在linux系统安装命令是有问题的,比如如下命令:
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
这样虽然可以正确安装,按若要执行cuda设备支持时就会有问题的:
torch.cuda.is_available() 总是返回: False
我的方法是去Nvidia官网论坛找Nvidia方法推荐的torch支持包, 我安装是torch v1.10.0,
其名称及安装命令为:
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
这样安装的torch包,是支持cuda的: torch.cuda.is_available() 返回: True
2. 安装torchvision
由于torch的的安装是从Nvidia官方下载的, torchvision的安装更不能按照PyTorch官方提供命令直接安装, 即使你安装成功,运行时也会提示torch和torchvision版本不匹配.
正确的方法是去Nvidia找和torch版本匹配的torchvision安装包,两者版本一定到对应上,或者去
github下载torchvision源码(https://github.com/pytorch/vision),在已经安装torch的Jetson Nano
上现场编译,这样安装的torchvision才可以正常使用.
四. 选择测试指标
本次参与的测试的基于PyTouch的常用物体检测算法有:
yolo v1, yolo v2, yolo v3, yolo v4,yolo_tiny,yolo_nano,yolo v5,faster rcnn版本A,faster rcnn版本B,
fasterrcnn_mobilenet_v3, maskrcnn, ssd, retinanet.
由于这些物体检测网络的检测精度指标mAP,都是已知的且和硬件平台关系并不大. 而不同的硬件平台对各种网络的检测速度影响较大,因此本文主要针对以上各种网络的检测速度FPS进行纵向和横向对比.
本文进行的测试物体检测模型,网络骨架可以设为resnet-50的尽量设为resnet-50.
五. 基于PyTorch的常见物体检测网络运行FPS
测试基于VOC2007数据集,由于数据集图片数大两万多张, 全部测试完耗时太久,测试FPS也没有必要全量测试. 所以只是选取数据集中抽取了500张图片经行了测试. 测试结果如下:
网络名称/平均单次耗时 | 笔记CPU 酷睿i7-8565U 4.60GHz, 内存16G |
笔记本GPU NVIDIA GeForce MX250独显 with 2GB GDDR5 |
Jetson Nano GPU 128 Core Maxwell 4GB 64bit LPDDR4 |
YOLO v1 | 0.7323266506195069s | 0.16878824710845947s | 0.7456481599807739s |
YOLO v2 | 0.7306516885757446s | 0.16989627071455413s | 0.7521207952499389s |
YOLO v3 | 1.1423488712310792s | 0.2684824934192732s | 1.5701139783859253s |
YOLO v4 | 1.1154092073440551s | RuntimeError: CUDA out of memory. | 1.260795660018921s |
YOLO v5 | 0.25350298881530764s | 0.03408261299133301s | 0.1714746904373169s |
YOLO_tiny | 0.2873151540756226s | 0.057971739768981935s | 0.39568970203399656s |
YOLO_nano | 0.16197796821594238s | 0.03597952842712402s | 0.17376161098480225s |
faster rcnn 版本A | 11.51428273677826s | 0.5497232532501221s | 3.605269432067871s |
faster rcnn 版本B | 3.223970193862915s | 0.6257676362991333s | 3.673765683174133s |
fasterrcnn_mobilenet | 0.6391902494430542s | 0.15038349151611327s | 0.8255706644058227s |
maskrcnn | 3.1789819860458373s | 0.6734850406646729s 测试过程频现RuntimeError: CUDA out of memory. |
3.6487395763397217s |
ssd | 0.41620429992675784s | 0.16739777565002442s | 0.7007137489318848s |
retinanet | 3.2099594402313234s | 0.6970435571670532s | 4.283144249916076s |
由上表测试结果可知一下结论:
1. 基于Jetson Nano GPU with 4GB内存,从内存角度看足够执行所有物体检测网络,但从执行速度方面看,其执行速度仅达能达到基于笔记本CPU: 酷睿i7 4.6GHz同样的水平, 大部分检测算法的单帧耗时均在0.5s之上;
2. 基于笔记本GPU: NVIDIA GeForce MX250 with 2GB, 除了几个基于两阶的检测网路外,多数介于单阶的检测网络均可到达单帧0.5s以下, 两个轻量化的检测网络YOLO_tiny和YOLO_nano甚至达到单帧耗时0.05s水平,达到20 FPS. 但因为该款GPU的显存仅有2GB,限制了其检测能力和速度,部分检测算法无法正常执行.
3. 其中YOLO v5堪称优秀,在笔记本CPU和GPU上分别能达到3.9 fps和29 fps, 基本上和YOLO_tiny一个速度级别. 在Jetson nano上平均单张图片耗时0.1714746904373169s,能达到5.8 fps, 在Jetson nano上执行速度是最佳的.
4. 在已有的检测模型基础上, 在保证mAP情况下, 若要保证在Jetson Nano平台上满足需要的FPS, 进一步实施网络加速很有必要: 比如: 轻量化模型设计,BN层合并,网络剪枝,权重量化,张量分解等,以提高网络的前向速度.
Note: 因为各检测算法的源码实现方式不同,本测试仅供参考.