十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型

一. 本文目的

        在一款基于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:  因为各检测算法的源码实现方式不同,本测试仅供参考.

你可能感兴趣的:(深度学习,PyTorch,机器视觉,人工智能,深度学习,神经网络,pytorch,视觉检测)