---
# System prepended metadata

title: Ubuntu18.04 yolov3 tiny 轉 onnx  使用 Python 3.6.9
tags: [Python]

---

#  Ubuntu18.04 yolov3 tiny 轉 onnx  使用 Python 3.6.9
###### tags: `Python`
## 資料參考

* [jkjung-avt/tensorrt_demos](https://github.com/jkjung-avt/tensorrt_demos#demo-5-yolov4)
* [Ubuntu18.04安装CUDA10.2+cuDNN8](https://zhuanlan.zhihu.com/p/210268160)(已備份到 archive.is 跟 web.archive.org 上)
* [在Ubuntu18.04上编译和测试TensorRT](https://zhuanlan.zhihu.com/p/181274475)(已備份到 archive.is 跟 web.archive.org 上)

## 環境準備

* Ubuntu 18.04
* Python 3.6.9
* CUDA-10.2
* GNU Make 4.1
* cuDNN-8.0.3
* TensorRT 7.1.3.4
* pycuda 2019.1.2
* Python 套件：onnx 1.4.1

### Ubuntu18.04 安装CUDA10.2+cuDNN8.0.3

參考：[Ubuntu18.04安装CUDA10.2+cuDNN8](https://zhuanlan.zhihu.com/p/210268160)

通常Nvidia 會要求登入。

#### 安裝 CUDA 10.2

下载地址：[CUDA Toolkit 10.2 Download](https://developer.nvidia.com/cuda-10.2-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=deblocal)

也可以直接執行下面的命令，不用登入。

```shell=
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1804-10-2-local-10.2.89-440.33.01_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-2-local-10.2.89-440.33.01/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda-10-2
```

#### 安裝 cuDNN8.0.3

下载地址：[cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive)

下載時必須要登入。

如下圖：

![](https://i.imgur.com/g9EK0zY.png)

也可以去鏡像站下載會比較快：[Index of /nvidia-machine-learning/ubuntu1804/x86_64/](https://mirrors.cloud.tencent.com/nvidia-machine-learning/ubuntu1804/x86_64/)

如下圖：
![](https://i.imgur.com/10Hub2C.png)


下載完成後一次安裝這兩個文件就可以了（先安裝runtime library，再安裝developer library）。

指令如下：
```
sudo dpkg -i libcudnn8_8.0.3.33-1+cuda10.2_amd64.deb
sudo dpkg -i libcudnn8-dev_8.0.3.33-1+cuda10.2_amd64.deb
```

安裝完CUDA10.2和cuDNN8後，需要將cuda目錄下的bin目錄加入到PATH環境變量中。

```
vim ~/.bashrc
```

在最後一行，加入：
```
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

然後輸入指令：`source ~/.bashrc`

在正確的設置了PATH變量後，在命令行中執行 nvcc --version 有應該類似下面的輸出

```
>> nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89
```



至此，CUDA10.2+cuDNN8就成功的在Ubuntu18.04上安裝成功了。


### Ubuntu 18.04 安装配置TensorRT 7.1

參考：[在Ubuntu18.04上编译和测试TensorRT](https://zhuanlan.zhihu.com/p/181274475)

下載地址：[NVIDIA TensorRT 7.x Download](https://developer.nvidia.com/nvidia-tensorrt-7x-download#)

選擇 TensorRT 7.1.3.4 for Ubuntu 18.04 and CUDA 10.2 TAR package ，如下圖：

![](https://i.imgur.com/7ifAt8P.png)

下載結束後解壓：

```
sudo tar -xvzf TensorRT-7.1.3.4.Ubuntu-18.04.x86_64-gnu.cuda-10.2.cudnn8.0.tar.gz
```

安装pip：
```
sudo apt-get install python3-dev python3-pip
```

切換到 TensorRT 的 python 目錄下，安裝對應 Python 版本的 python 套件，因為是 python 3.6 選 cp36的那個：
```
cd TensorRT-7.1.3.4/python/
sudo pip3 install tensorrt-7.1.3.4-cp36-none-linux_x86_64.whl
```

加入環境變數(這邊要看你的 TensorRT 放在哪)：

```
vim ~/.bashrc
export LD_LIBRARY_PATH="/mnt/c/Users/p2330/Desktop/yolov3_onnx/TensorRT-7.1.3.4/targets/x86_64-linux-gnu/lib:$LD_LIBRARY_PATH"
source ~/.bashrc
```

驗證 TensorRT 的 python 套件安裝，如下圖：

![](https://i.imgur.com/1aFz9f2.png)

安裝 uff：
```
cd ../uff
sudo pip3 install uff-0.6.9-py2.py3-none-any.whl
```

安裝 graphsurgeon：
```
cd ../graphsurgeon/
sudo pip3 install graphsurgeon-0.4.5-py2.py3-none-any.whl
```

### 安裝 pycuda 2019.1.2 & onnx 1.4.1

參考：[tensorrt_demos](https://github.com/jkjung-avt/tensorrt_demos#demo-5-yolov4)

如下圖，雖然 tensorrt_demos 專案中有提供作者自己寫的 pycuda 安裝腳本，但執行之後，報出了奇怪的錯誤，所以這裡會用 pip 安裝。
![](https://i.imgur.com/HsFGU2d.png)


(因為 pycuda 安裝時，會需要用到 cuda 和 TensorRT，所以才需要安裝前面那些，不然安裝過程會報錯)
安裝 pycuda 2019.1.2：

```
sudo pip3 install pycuda==2019.1.2
```

安裝 onnx 1.4.1：
```
sudo pip3 install onnx==1.4.1
```

## yolov3 tiny 轉 onnx

參考：[tensorrt_demos Demo #5: YOLOv4](https://github.com/jkjung-avt/tensorrt_demos#demo-5-yolov4)

取得 tensorrt_demos 專案：
```
git clone https://github.com/jkjung-avt/tensorrt_demos.git
```

切換到 tensorrt_demos/plugins 目錄下，修改 Makefile 中的TENSORRT_INCS 跟
TENSORRT_LIBS 的路徑(用 vim 或 nano 皆可)，如下圖：

![](https://i.imgur.com/86kwvRD.png)

修改為 TensorRT-7.1.3.4 所在位置，如下圖(我放在了一個神奇的位置，不要在意)：
![](https://i.imgur.com/FiStpIt.png)

然後執行 make：

![](https://i.imgur.com/oa3tU7c.png)

會多出兩個檔案(會噴一堆警告，不用管它)：
![](https://i.imgur.com/CgsfhUP.png)

切換到 tensorrt_demos/yolo/ 目錄下，執行作者寫的 yolo 下載腳本，指令如下：

```
cd ../yolo/
./download_yolo.sh
```

### 執行 yolo_to_onnx.py

yolov3 tiny 轉 onnx ：
```
python3 yolo_to_onnx.py -m yolov3-tiny-416
```

除了 yolov3 tiny ，還支援很多 model ，如下圖：

![](https://i.imgur.com/nID8Oh8.png)

可參考：[tensorrt_demos Demo #5: YOLOv4](https://github.com/jkjung-avt/tensorrt_demos#demo-5-yolov4)