YOLOX模型导出笔记

YOLOX应该是对新手比较友好的的了,甚至他都把模型导出好了,可以直接参照他的部署demo直接应用。
github链接

YOLOX导出ONNX模型

  1. 进入你的YOLOX目录,首先验证一下YOLOX是否能正常运行。
    python setup.py develop
    
    运行:其中-n指模型名称;也可以-f指定,但我不懂,其实他教程中的-f-n都指向了同一个文件,应该是需要自定义模型是才需要
    python tools/demo.py image -n yolox-s -c ./weights/yolox_s.pth --path assets/dog.jpg --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu]
    
    或者是视频验证
    python tools/demo.py video -n yolox-s ./weights/yolox_s.pth --path /path/to/your/video --conf 0.25 --nms 0.45 --tsize 640 --save_result --device [cpu/gpu]
    

导出cpu模型

直接用他默认的导出的就是cpu模型

  1. 导出onnx模型。这里的-n和上边的含义一样。导出完成后就能看到导出的后缀为.onnx模型啦
    python tools/export_onnx.py --output-name yolox_s.onnx -n yolox-s -c yolox_s.pth
    
  2. 验证一下模型输出是否正确,他的demo中直接提供了推理模型。
    python ./demo/ONNXRuntime/onnx_inference.py -m ./weights/yolox_s.onnx -i ./assets/dog.jpg -o ./YOLOX_outputs -s 0.3 --input_shape 640,640
    

导出GPU模型

目前还未成功,后续再更新

  1. 上面导出的是cpu模型,运行时显存没有出现任何波动。这是因为他默认安装的是onnxruntime,如果要使用gpu,需要使用onnxruntime-gpu这里有解决方案
    可以使用如下进行验证,我的环境下只输出了“CPU”。

    import onnxruntime
    print(onnxruntime.get_device())
    
  2. 于是我又创建了一个新的conda环境验证这一点,环境中安装了onnx的gpu环境

    pip install onnxruntime-gpu
    

    然后

    ort_session = onnxruntime.InferenceSession("path/model/model_name.onnx",providers=['CUDAExecutionProvider'])
    print(ort_session.get_providers())
    

    使用上边的验证时出现了下边的错误

    [W:onnxruntime:Default, onnxruntime_pybind_state.cc:552 CreateExecutionProviderInstance] Failed to create CUDAExecutionProvider. Please reference https://onnxruntime.ai/docs/reference/execution-providers/CUDA-ExecutionProvider.html#requirements to ensure all dependencies are met.
    

    然后看他给的链接,发现是cuda和onnx版本不对应导致的。我的cuda版本是10.2,cudnn版本是7.6.5,表格中没有找到相应的,对应的应该是onnx-gpu1.5或1.6,但我却默认安装了最新版的1.11,那么重新安装

    pip uninstall onnxruntime-gpu
    pip install onnxruntime-gpu==1.5.1
    

导出OpenVINO模型

教程中说了,如果需要导出OpenVINO模型,那么需要把导出的ONNX模型的optset设置为10(我也不知道为啥),那么让我们再重新来导出一次ONNX吧,还是使用cpu模型

Python安装

  1. 导出opset为10的onnx模型
    python tools/export_onnx.py --output-name ./weights/yolox_s_cuda.onnx -n yolox-s -c ./weights/yolox_s.pth --opset 1
    
  2. 安装OpenVINO-dev,使用pip安装即可(如果是Python,只需要安装开发环境就行,他会自动帮你安装runtime;但是如果是C++开发,那么需要先用apt安装runtime,然后才能安装dev。从2022版之后只支持pypi安装dev,没懂是什么意思)
    pip install openvino-dev[pytorch,onnx]
    
    验证安装是否成功
    mo -h
    

C++版本安装

  1. 安装OpenVINO runtime 2021.4,在Ubuntu18上安装OpenVINO,官网在此

    wget https://apt.repos.intel.com/openvino/2021/GPG-PUB-KEY-INTEL-OPENVINO-2021
    sudo apt-key add GPG-PUB-KEY-INTEL-OPENVINO-2021
    sudo apt-key list
    echo "deb https://apt.repos.intel.com/openvino/2021 all main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2021.list
    echo "deb https://apt.repos.intel.com/openvino/2022 bionic main" | sudo tee /etc/apt/sources.list.d/intel-openvino-2022.list
    sudo apt update
    sudo apt-cache search intel-openvino-runtime-ubuntu18
    

    此时如果出现了一大堆openvino相关的库,那么就可以开始安装了,默认安装路径为/opt/intel/openvino_<VERSION>.<UPDATE>.<PATCH>
    安装指定版本

    sudo apt install intel-openvino-runtime-ubuntu18-2021.4.582
    

    查看版本

    apt list --installed | grep openvino
    

    卸载

    sudo apt autoremove intel-openvino-<PACKAGE_TYPE>-ubuntu<OS_VERSION>-<VERSION>.<UPDATE>.<BUILD_NUM>
    

    后边还有一些步骤,我就不再写了,因为我也不知道有啥用,到这里OpenVINO就安装完成了。
    然后似乎还要下边这个命令,但是运行时它自动给我安上了。

    pip install openvino
    
  2. 设置环境,直接加.bashrc吧,这路径太长记不住啊。
    我安装的是与教程一样的2021,

    一开始装的是OpenVINO2022.1.0.643后来发现他大改版,与之前完全不同了,只能装回2021。2022相比之下精简了很多东西,需要自己去安装

    激活临时环境

    source /opt/intel/openvino_2021/bin/setupvars.sh
    

    或者直接加.bashrc中

    vim ~/.bashrc 
    source /opt/intel/openvino_2021/bin/setupvars.sh
    source ~/.bashrc
    
  3. 然后安装dev包

    sudo apt install intel-openvino-dev-ubuntu18-2021.4.582
    
  4. 模型转换

    cd /opt/intel/openvino_2021/deployment_tools/model_optimizer/install_prerequisites
    

    安装依赖

    sudo ./install_prerequisites_onnx.sh
    

    它里边的命令是source install_prerequisites.sh onnx,所以你直接去调用应该也可以

    开始转换

    cd ..
    转换命令
    python mo.py --input_model <ONNX_MODEL> --input_shape <INPUT_SHAPE> [--data_type FP16]
    例如:这里一定要确定宽高和C++的输入一样
    python mo.py --input_model yolox_tiny.onnx --input_shape [1,3,416,416] --data_type FP16
    python mo.py --input_model ~/working/YOLOX/weights/yolox_s_10.onnx --input_shape [1,3,416,416] --data_type FP16 --output_dir ~/working/YOLOX/weights/
    

    然后IR(Intermediate Representation)就被写入输出文件夹了。一共三个文件,bin,mapping和xml。其中bin文件就是生成的训练模型文件
    再然后就正常去他的YOLOX/demo/OpenVINO/cpp/目录下去cmake那一套就行了。
    最后运行,一定要注意CPU全大写。

    ./demo/OpenVINO/cpp/build/yolox_openvino ./weights/yolox_s_openvino/yolox_s_10.xml ./assets/dog.jpg CPU
    

    运行结果发现准确度确实有波动,比onnx波动要大

使用Intel GPU进行推理加速

如果你的CPU能能够正常运行,那么接下来可以试试用Intel GPU加速了!
首先安装gpu相关驱动,只有最新版的,但是2021.4和他的安装方式一样:官网。第二步因为网络原因可能会很慢,可能需要多次尝试。。。

cd <INSTALL_DIR>/install_dependencies/
sudo -E ./install_NEO_OCL_driver.sh

装完之后直接把设备改成GPU就可以了,模型加载时间非常非常长~~


版权声明:本文为qq_35699473原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。