TensorFlow對象檢測-1.0和2.0:訓練,導出,優化(TensorRT),推斷(Jetson Nano)

作者|Abhishek 編譯|Flin 來源|analyticsvidhya

第1部分

從在自定義數據集中訓練檢測器到使用TensorFlow 1.15在Jetson納米板或雲上進行推理的詳細步驟

完整代碼可在GitHub上獲得

一些常見的困難包括

  • 使用對象檢測API庫查找兼容的TensorFlow(和相關的cuda)版本

  • 將自定義數據轉換爲tf記錄格式

  • 混淆了tf1.0和tf2.0的流程

  • 手動更新模型配置文件以進行訓練

  • 運行訓練過程並解決配置文件中的問題

  • 將模型從一種格式導出到另一種格式以進行推理

  • 混合了不同的模型格式類型——檢查點、凍結圖、saved_model (" .pb ")、tensorRT推斷圖等等

  • 在訓練模型上運行推理

  • 將訓練後的模型轉換爲量化格式,以便部署在諸如Jetson Nano的板上

  • 構建引擎和部署引擎之間的tensorRT版本和cuda計算能力不匹配

這個清單永無止境……

爲克服上述一些問題,我們在Monk Object Detection Toolkit中的Tensorflow 對象檢測 API的兩個版本上添加了一個低代碼的pythonic包裝器

使用它,開發人員和研究人員可以輕鬆地

  • 使用TF推送定製訓練數據集

  • 使用pythonic API配置所有參數的模型文件

  • 根據使用的網絡和cuda版本的可用性,在TF1.0和TF2.0之間進行選擇

  • 根據自己的數據集訓練、導出、優化、推斷

  • 使用TensorRT優化模型並導出到雲服務器或Jetson Nano等嵌入式板

傳統流程概述

下面提到的是使用TF訓練和部署定製探測器的過程。在描述過程流程的同時,還強調了一個人在使一切正常工作時所面臨的問題;還提到了tf1.0和2.0版本的對象檢測庫的區別

過程A:TensorFlow與目標檢測裝置的兼容性

  • 要使用對象檢測 2.0,請使用TensorFlow 2.3.0。版本2.0.0和2.1.0通常會導致“ tensorflow_core.keras.utils”. 2.2.0版在使用“CollectiveAllReduceExtended”模塊進行訓練時會導致錯誤。

  • 使用TensorFlow 2.3.0時,需要Cuda 10.1。

  • 要使用對象檢測 1.0,請使用TensorFlow版本1.15.0或1.15.2。

  • 使用TensorFlow 1.15時,需要Cuda 10.0。

  • TFLite轉換仍然存在某些錯誤(將在以後的博客中討論)

過程B:設置數據集

  • TensorFlow提供數據集工具以將數據轉換爲可接受的TF記錄格式

  • 但是這些示例僅適用於最常用的數據集,例如COCO,Pascal VOC,OpenImages,Pets-Dataset等。用戶需要根據選擇的示例筆記本,按照COCO、VOC、OID等格式重新格式化和排列數據集

  • 另一種方法是更新示例代碼以便提取自定義數據集,這本身就是一個艱難的過程

  • 爲了使自定義數據集的加載變得容易,我們修改了示例並添加了進一步的解析器以支持多種數據註釋類型,並將其直接轉換爲TF-Records。

過程C:更新配置並開始訓練過程

  • Monk的對象檢測API 1.0包裝器支持大約23個模型,對象檢測API 2.0支持大約26個模型

  • 一旦選擇了模型並下載了權重,就必須手動更新配置文件。

  • API 1.0和2.0的配置文件格式不同,需要以稍微不同的方式進行手動更改

  • tf1.0中的某些配置存在基本特徵提取參數的問題。

  • 在對配置文件應用更新後,整個工作區必須按照TF Obj github site站點上的教程指定的方式進行安排。

  • 重新安排後,可以開始訓練。同樣,針對TF 1.0和TF 2.0模型的訓練是不同的。

  • 通過“Monk對象檢測”,我們添加了pythonic函數來更新配置文件,並且不再需要爲工作空間使用嚴格的文件夾結構。兩種TF版本的訓練過程幾乎都與Monk的包裝程序相同。

過程D:導出經過訓練的模型以進行推理

  • 兩種對象檢測API均以檢查點 (“.ckpt”) 格式提供訓練有素的模型。

  • 爲了在TF 1.0中進行推理,通常使用凍結圖形格式。

  • 爲了在TF 2.0中進行推理,通常使用保存的模型格式。

  • 特別是對於初學者來說,轉換模型的過程在兩個API中都不相同,通常很難弄清楚

  • 爲了簡化流程,我們添加了解析器,以使外部包裝器格式保持相同,這意味着我們能同時使用TF 1.0 API和TF 2.0 API。

過程E:TensorRT推論的模型優化

  • 導出的模型最終使用TensorRT轉換爲優化版本。

  • 支持的優化包括浮點32位和16位(FP32,FP16)和整數8位(INT8)量化。

  • 從tf1.0和tf2.0轉換導出模型的量化過程是完全不同的。

  • TensorRT的版本存在其他問題。這意味着,使用TensorRT版本5.1.5優化的模型無法在使用TensorRT版本5.1.6的部署計算機上運行。一個非常具體的問題是使用TensorFlow 1.15.0的對象檢測1.0。這個TensorFlow帶有tensorRT 5.1.5,而Jetpacks中沒有這樣的版本。

  • TensorRT的另一個問題是cuda計算功能。意思是,除非採取適當措施,否則在具有7.0版計算能力的GPU(V100 Nvidia GPU)上優化的模型不能在具有5.3版計算能力的GPU(Jetson納米板)上運行。

  • 此博客通過訓練和優化對象檢測模型澄清了所有疑問

過程F:在Jetson Nano板上設置所有東西

  • 由於兩個API都需要不同的TensorFlow版本,因此安裝過程有所不同,Jetpack版本,CUDA版本以及TF 1.0在涉及tensorRT版本時都需要進一步注意。

讓我們從版本1.0開始,每次使用一個對象檢測API模塊。

TF對象檢測API 1.0

過程A:在開發機器上安裝

將要安裝的庫

  • 先決條件:numpy,scipy,pandas,pillow,OpenCV-python

  • 帶TensorRT 5.1.5的TensorFlow-GPU V1.15.0;如果在Nano板上部署則不需要

  • 帶TensorRT 6.0.1的TensorFlow-GPU V1.15.2;如果在Nano板上進行部署,則需要

  • 使用Monk Object Detection Toolkit的TF 對象檢測 API 1.0

(確保CUDA 10.0和CUDNN 7隨系統一起安裝了NVidia驅動程序)

當模型要部署在Jetson Nano板上時,請按照以下說明配置你的開發(訓練)機器

安裝必備的Python庫

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10_tensorrt6_part1.sh && ./install_cuda10_tensorrt6_part1.sh

安裝TensorRT 6.0.1

# Go to https://developer.nvidia.com/tensorrt
# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu16.04)

# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt6.0.1.5-ga-20190913_1-1_amd64.deb
$ sudo apt-key add <key value will be mentioned as the output of previous command>
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

安裝Bazel 0.26.1並從GitHub克隆TensorFlow

# Install bazel version 0.26.1
# Download bazel deb package from https://github.com/bazelbuild/bazel/releases/tag/0.26.1

$ sudo dpkg -i bazel_0.26.1-linux-x86_64.deb

# Clone Tensorflow and switch to tensorflow 1.15.2

$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
$ git checkout v1.15.2

配置TensorFlow

# Configure tensorflow

$ ./configure

    - Do you wish to build TensorFlow with XLA JIT support? [Y/n]: Y

    - Do you wish to build TensorFlow with OpenCL SYCL support? [y/N]: N

    - Do you wish to build TensorFlow with ROCm support? [y/N]: N

    - Do you wish to build TensorFlow with CUDA support? [y/N]: Y      

    - Do you wish to build TensorFlow with TensorRT support? [y/N]: Y

    - And press enter (set default) for all other config questions asked by the setup

構建並安裝TensorFlow(在AWS P3.2x實例上大約需要5個小時)

# Build tensorflow using bazel

$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package


# Once built create a wheel file for python installation and run pip installer

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package tensorflow_pkg

$ cd tensorflow_pkg && pip install tensorflow*.whl

最後構建對象檢測API 1.0

# Compile Object Detection API v1

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10_tensorrt6_part2.sh && ./install_cuda10_tensorrt6_part2.sh

當不打算在Jetson Nano Board上部署模型時,請按照以下說明配置你的開發(訓練)機器

安裝所有必需的庫並編譯對象檢測API 1.0

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation

$ chmod +x install_cuda10.sh && ./install_cuda10.sh

安裝TensorRT 5.1.5作爲預構建的TensorFlow 1.15.0支持

# Go to https://developer.nvidia.com/tensorrt
# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb(For Ubuntu16.04)

# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb
$ sudo apt-key add <key value will be mentioned as the output of previous command>
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

使用google colab時,請遵循以下說明(TensorRT在colab上可能無法正常運行)

# Switch to TF 1.0 version (Run the following line)
$ %tensorflow_version 1.x
# Now reset the runetime if prompted by colab

# Run the following commands
$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git
$ cd Monk_Object_Detection/12_tf_obj_1/installation
$ chmod +x install_colab.sh && ./install_colab.sh

過程B:建立數據集

Monk對象檢測解析器要求數據集採用COCO或Pascal VOC格式。對於本教程,讓我們堅持使用Pascal VOC格式

要將數據集從任何格式轉換爲Pascal VOC,請查看以下詳細教程

在這個例子中,船檢測數據集取自一個關於使用retinanet進行對象檢測的舊博客

在這個jupyter notebook中提到了使用這些數據的步驟

過程C:更新配置並啓動訓練過程

加載訓練引擎

from train_detector import Detector

gtf = Detector();

在TF 1.15模型庫中加載所有可用模型

目前,它支持24種不同型號的SSD和Faster RCNN

加載訓練驗證數據集

將註釋轉換爲VOC格式後加載數據集

根據可用的GPU設置批次大小。在本教程中,使用了帶v100gpu(16gbvram)的AWS ec2p3.2x計算機,批次大小爲24非常適合。

train_img_dir = "ship/images/Train";
train_anno_dir = "ship/voc/";
class_list_file = "ship/classes.txt";

gtf.set_train_dataset(train_img_dir, train_anno_dir, class_list_file, batch_size=24)

運行解析器將數據集轉換爲tfrecords

Tf Record文件將存儲在data_tfrecord文件夾中

gtf.create_tfrecord(data_output_dir="data_tfrecord")

選擇並加載模型

下載模型後,Monk會根據所選參數自動更新配置文件

在本教程中,我們使用了SSD MobileNet V1,它可以接收形狀爲320x320x3 RGB圖像的輸入圖像

gtf.set_model_params(model_name="ssd_mobilenet_v1")

設置其他訓練和優化器參數

set_hyper_params(num_train_steps=10000,
lr=0.004,
lr_decay_rate=0.945,
output_dir="output_dir/",
sample_1_of_n_eval_examples=1,
sample_1_of_n_eval_on_train_examples=5,
checkpoint_dir=False,
run_once=False,
max_eval_retries=0,
num_workers=4,
checkpoint_after_every=500)

設置存儲導出參數的目錄

gtf.export_params(output_directory="export_dir");

設置tensorRT優化參數

TensorRT優化器創建一個計劃,然後構建它。構建計劃是爲了優化它正在構建的GPU的模型。

如前所述,在具有不同cuda計算能力的GPU上優化的模型無法在jetson nano上運行,因此Monk庫確保該計劃在開發機(雲或colab)上編譯,而該計劃則在運行時在部署機(jetson nano)上構建

使用INT8優化時,無法執行此功能,計劃的編制和構建都必須在同一臺機器上,並且Jetson納米板與8位整數運算不太兼容

gtf.TensorRT_Optimization_Params(conversion_type="FP16", trt_dir="trt_fp16_dir")

訓練探測器

檢測器訓練運行一個執行sys.exit()函數的會話,因此在其上運行的包裝程序將關閉python系統。

爲了解決此問題,提供了一個名爲train.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據參數設置,訓練好的模型將保存在名爲“ output_dir”的文件夾中。

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/train.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/train.py

過程D:導出經過訓練的模型以進行推理

導出訓練有素的檢查點模型

export函數運行一個執行sys.exit()函數的會話,因此在其上運行的包裝器將關閉python系統。

爲了解決此問題,提供了一個名爲export.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據參數設置,導出的模型將保存在名爲“ export_dir”的文件夾中。

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/export.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/export.py

過程E:TensorRT推論的模型優化

優化導出模型

優化函數運行一個執行sys.exit()函數的會話,因此在其上運行的包裝程序將關閉python系統。

爲了解決此問題,提供了一個名爲optimize.py的腳本,該腳本可以在jupyter notebook電腦或終端命令上運行

根據參數設置,優化的模型將保存在名爲“ trt_fp16_dir”的文件夾中。

# Run in a terminal
$ python Monk_Object_Detection/12_tf_obj_1/lib/optimize.py

# or run this command on a jupyter notebook
%run Monk_Object_Detection/12_tf_obj_1/lib/optimize.py

過程F-1:在開發機器上運行推理

加載推理機

from infer_detector import Infer
gtf = Infer();

載入模型

首先加載導出的模型並運行步驟,然後通過加載優化的模型重複相同的步驟(步驟保持不變)

# To load exported model
gtf.set_model_params('export_dir/frozen_inference_graph.pb', "ship/classes.txt")

# To load optimized model
gtf.set_model_params('trt_fp16_dir/trt_graph.pb', "ship/classes.txt")

對單個圖像進行推斷

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

使用兩個模型運行速度測試分析

gtf.benchmark_for_speed('ship/test/img1.jpg')

在AWS P3.2x V100 GPU上使用導出的模型(未優化)進行分析

Average Image loading time : 0.0091 sec
Average Inference time     : 0.0103 sec
Result extraction time     : 0.0801 sec
total_repetitions          : 100
total_time                 : 1.0321 sec
images_per_sec             : 96
latency_mean               : 10.3218 ms
latency_median             : 10.3234 ms
latency_min                : 9.4773 ms

在AWS P3.2x V100 GPU上使用優化模型進行分析

處理後優化使速度提高約2.5倍

Average Image loading time : 0.0092 sec
Average Inference time     : 0.0042 sec
Result extraction time     : 0.0807 sec
total_repetitions          : 100
total_time                 : 0.4241 sec
images_per_sec             : 235
latency_mean               : 4.2412 ms
latency_median             : 4.2438 ms
latency_min                : 4.0156 ms

過程F-3:在Jetson Nano板上安裝步驟

步驟1:更新Apt

$ sudo apt-get update
$ sudo apt-get upgrade

步驟2:安裝系統庫

$ sudo apt-get install nano git cmake libatlas-base-dev gfortran libhdf5-serial-dev hdf5-tools nano locate libfreetype6-dev python3-setuptools protobuf-compiler libprotobuf-dev openssl libssl-dev libcurl4-openssl-dev cython3 libxml2-dev libxslt1-dev python3-pip

$ sudo apt-get install libopenblas-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev

$ sudo pip3 install virtualenv virtualenvwrapper

步驟3:更新bashrc文件

將這些行添加到〜/ .bashrc文件

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

運行以下命令

$ source ~/.bashrc

步驟4:創建虛擬環境並安裝所有必需的python庫,安裝numpy大約需要15分鐘

$ mkvirtualenv -p /usr/bin/python3.6 tf2

$ pip install numpy==1.19.1

安裝scipy大約需要40分鐘

$ pip install scipy==1.5.1

安裝Jetson Nano TensorFlow-1.15。再花15分鐘

$ pip install scikit-build protobuf cython -vvvv

$ pip install grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta -vvvv

$ pip install https://developer.download.nvidia.com/compute/redist/jp/v43/tensorflow-gpu/tensorflow_gpu-1.15.0+nv19.12-cp36-cp36m-linux_aarch64.whl -vvvv

安裝OpenCV需要1.5個小時

$ mkdir opencv && cd opencv
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ unzip opencv.zip
$ mv opencv-4.1.2 opencv
$ cd opencv && mkdir build && cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUDA=OFF -D WITH_CUBLAS=OFF -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_java=OFF -D WITH_GSTREAMER=ON -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=OFF ..

$ make -j3
$ sudo make install

$ cd ~/.virtualenvs/tf2/lib/python3.6/site-packages
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so

最後克隆Monk對象檢測庫並安裝TF對象檢測API

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

$ cd Monk_Object_Detection/12_tf_obj_1/installation/

$ chmod +x install_nano.sh && ./install_nano.sh

過程F-4:關於Jetson Nano的推論

將優化的權重文件夾複製/下載到jetson nano工作目錄(克隆Monk庫)

從Monk_Object_Detection庫複製示例圖像

$ cp -r Monk_Object_Detection/example_notebooks/sample_dataset/ship .

加載推理引擎和模型(此步驟大約需要4到5分鐘)

from infer_detector import Infer

gtf = Infer();

gtf.set_model_params('trt_fp16_dir/trt_graph.pb', "ship/classes.txt")

現在,如前所述,TensorRT負責計劃並在運行時構建(優化)計劃,因此第一次運行大約需要3-4分鐘

scores, bboxes, labels = gtf.infer_on_image('ship/test/img5.jpg', thresh=0.5, img_size=300);

突出顯示的區域顯示了Jetson Nano的TesnorRT建立(優化)計劃(模型)(作者擁有的圖像)

再次運行它不會花費太多時間。

Benchmark板基準分析

gtf.benchmark_for_speed('ship/test/img1.jpg')
# With Jetson Nano power mode - 5W ModeAverage Image loading time : 0.0275 sec
Average Inference time     : 0.0621 sec
total_repetitions          : 100
total_time                 : 6.2172sec
images_per_sec             : 16
latency_mean               : 67.1722 ms
latency_median             : 60.7875 ms
latency_min                : 57.4391 ms
# With Jetson Nano power mode - MAXN ModeAverage Image loading time : 0.0173 sec
Average Inference time     : 0.0426 sec
total_repetitions          : 100
total_time                 : 4.2624 sec
images_per_sec             : 23
latency_mean               : 42.6243 ms
latency_median             : 41.9758 ms
latency_min                : 40.9001 ms

jupyter notebook提供TensorFlow對象檢測API 1.0的完整代碼

從谷歌驅動器下載所有預先訓練的權重

第2部分

從在自定義數據集上訓練檢測器到在Jetson納米板或雲上使用TensorFlow 2.3進行推理的詳細步驟

TF對象檢測API 2.0

過程A:在開發機器上安裝

要安裝的庫

前提條件:numpy,scipy,pandas,pandas,pillow,OpenCV-python

帶TensorRT 6.0.1的TensorFlow-GPU V2.3.0

使用Monk Object Detection Toolkit的TF Object Detection API 2.0

將進行TensorRT安裝

後續部分(確保CUDA 10.0和CUDNN 7隨系統一起安裝了NVidia驅動程序)

在開發(訓練)機器中運行以下步驟

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

#For Cuda 10 systems
$ cd Monk_Object_Detection/13_tf_obj_1/installation && chmod +x install_cuda10.sh && ./install_cuda10.sh

#For Google colab
$ cd Monk_Object_Detection/13_tf_obj_1/installation && chmod +x install_colab.sh && ./install_colab.sh

過程B:建立數據集

這與第1部分中的相同。Monk對象檢測解析器要求數據集採用COCO或Pascal VOC格式。對於本教程,讓我們堅持使用Pascal VOC格式

要將你的數據集從任何格式轉換爲Pascal VOC,請查看以下詳細教程

在此示例中,船檢測數據集是從一篇對象檢測的舊博客中獲取的

此jupyter notebook中提到了使用數據的步驟

過程C:更新配置並開始訓練過程

加載訓練引擎

from train_detector import Detector

gtf = Detector();

在TF 2.0 Model Zoo中加載所有可用的模型

目前,它支持26種SSD,Faster RCNN和EfficientDet不同的型號

即將添加對Centernet模型的支持,原始管道在訓練中有錯誤

加載訓練和驗證數據集

將註釋轉換爲VOC格式後加載數據集

根據可用的GPU設置批處理大小。在本教程中,使用了具有V100 GPU(16 GB VRAM)的AWS EC2 P3.2x計算機,批次大小爲24非常適合。

train_img_dir = "ship/images/Train";
train_anno_dir = "ship/voc/";
class_list_file = "ship/classes.txt";

gtf.set_train_dataset(train_img_dir, train_anno_dir, class_list_file, batch_size=24)

運行解析器將數據集轉換爲tfrecords

Tf Record文件將存儲在data_tfrecord文件夾中

gtf.create_tfrecord(data_output_dir="data_tfrecord")

選擇並加載模型

下載模型後,Monk會根據所選參數自動更新配置文件

在本教程中,我們使用了SSD MobileNet V2,它可以接收形狀爲320x320x3 RGB圖像的輸入圖像

gtf.set_model_params(model_name="ssd_mobilenet_v2_320")

設置其他訓練和優化器參數

set_hyper_params(num_train_steps=10000,
lr=0.004,
lr_decay_rate=0.945,
output_dir="output_dir/",
sample_1_of_n_eval_examples=1,
sample_1_of_n_eval_on_train_examples=5,
checkpoint_dir=False,
run_once=False,
max_eval_retries=0,
num_workers=4,
checkpoint_after_every=500)

設置目錄,將存儲導出的參數

gtf.export_params(output_directory="export_dir");

設置tensorRT優化參數

TensorRT優化器創建一個計劃,然後構建它。構建計劃是爲了優化它正在構建的GPU的模型。

如前所述,在具有不同cuda計算能力的GPU上優化的模型無法在jetson nano上運行,因此Monk庫確保該計劃在開發機(雲或colab)上編譯,而該計劃則在運行時在部署機(jetson nano)上構建

使用INT8優化時,無法執行此功能,計劃的編制和構建都必須在同一臺機器上,並且Jetson納米板與8位整數運算不太兼容

gtf.TensorRT_Optimization_Params(conversion_type="FP16", trt_dir="trt_fp16_dir")

訓練探測器

檢測器訓練運行一個執行sys.exit()函數的會話,因此在其上運行的包裝程序將關閉python系統。

爲了解決此問題,提供了一個名爲train.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據參數設置,訓練好的模型將保存在名爲“ output_dir”的文件夾中。

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/train.py

# For jupyter notebook or colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/train.py

過程D:導出經過訓練的模型以進行推理

導出訓練有素的檢查點模型

export函數運行一個執行sys.exit()函數的會話,因此在其上運行的包裝器將關閉python系統。

爲了解決此問題,提供了一個名爲export.py的腳本,該腳本可以在jupyter notebook或終端命令上運行

根據參數設置,導出的模型將保存在名爲“ export_dir”的文件夾中。

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/export.py

# For jupyter notebook and colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/export.py

過程E:TensorRT推論的模型優化

安裝TensorRT版本6.0.1

轉到Nvidia TensorRT頁面並下載基於OS和CUDA的TRT6軟件包。

下面提到的是適用於Ubuntu OS和Cuda 10.1的步驟

# Optimizing For TensorRT - Feature Not tested on colab
# This requires TensorRT 6.0.1 to be installed
# Go to https://developer.nvidia.com/tensorrt

# Download 
# - nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu18.04)
# - nv-tensorrt-repo-ubuntu1604-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb (For Ubuntu16.04)
# Run the following commands to install trt (in a terminal)

$ sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb
$ sudo apt-key add /var/nv-tensorrt-repo-cuda10.1-trt6.0.1.5-ga-20190913/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install tensorrt
$ sudo apt-get install uff-converter-tf
$ sudo apt-get install python3-libnvinfer-dev

優化導出模型

優化函數運行一個執行sys.exit()函數的會話,因此在其上運行的包裝程序將關閉python系統。

爲了解決此問題,提供了一個名爲optimize.py的腳本,該腳本可以在jupyter notebook電腦或終端命令上運行

根據參數設置,優化的模型將保存在名爲“ trt_fp16_dir”的文件夾中。

# For terminal users
$ python Monk_Object_Detection/13_tf_obj_2/lib/optimize.py

# For jupyter notebook and colab users
%run Monk_Object_Detection/13_tf_obj_2/lib/optimize.py

過程F-1:在開發機器上運行推理

加載推理機

from infer_detector import Infer

gtf = Infer();

載入模型

首先加載導出的模型並運行步驟;稍後通過加載優化的模型重複相同的步驟(步驟保持不變)

# To load exported model
gtf.set_model_params(exported_model_dir = 'export_dir')

# To load optimized model
gtf.set_model_params(exported_model_dir = 'trt_fp16_dir')

對單個圖像進行推斷

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

樣本推斷結果

使用兩個模型運行速度測試分析

gtf.benchmark_for_speed('ship/test/img1.jpg')

在AWS P3.2x V100 GPU上使用導出的模型(未優化)進行分析

Average Image loading time : 0.0110 sec
Average Inference time     : 0.0097 sec
Result extraction time     : 0.0352 sec
total_repetitions          : 100
total_time                 : 0.9794 sec
images_per_sec             : 102
latency_mean               : 9.7949 ms
latency_median             : 9.7095 ms
latency_min                : 9.1238 ms

在AWS P3.2x V100 GPU上使用優化模型進行分析

約1.5倍的速度加快處理後期優化

Average Image loading time : 0.0108 sec
Average Inference time     : 0.0062 sec
Result extraction time     : 0.0350 sec
total_repetitions          : 100
total_time                 : 0.6241 sec
images_per_sec             : 160
latency_mean               : 6.2422 ms
latency_median             : 6.2302 ms
latency_min                : 5.9401 ms  

過程F-2:在Jetson Nano板上設置所有東西

步驟1:下載Jetpack 4.3 SD卡映像 https://developer.nvidia.com/jetpack-43-archive

步驟2:將此圖片寫入SD卡。你可以使用 https://www.balena.io/etcher/

步驟3:將你的SD卡插入Nano板並啓動系統,然後完成安裝步驟

獲取有關Nvidia的“ Jetson Nano入門”頁面的更多詳細信息

過程F-3:在Jetson Nano板上安裝步驟

步驟1:更新Apt

$ sudo apt-get update
$ sudo apt-get upgrade

步驟2:安裝系統庫

$ sudo apt-get install nano git cmake libatlas-base-dev gfortran libhdf5-serial-dev hdf5-tools nano locate libfreetype6-dev python3-setuptools protobuf-compiler libprotobuf-dev openssl libssl-dev libcurl4-openssl-dev cython3 libxml2-dev libxslt1-dev python3-pip

$ sudo apt-get install libopenblas-dev libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev

$ sudo pip3 install virtualenv virtualenvwrapper

步驟3:更新bashrc文件

將這些行添加到〜/ .bashrc文件

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

export PATH=/usr/local/cuda-10.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64\
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

運行以下命令

$ source ~/.bashrc

步驟4:創建虛擬環境並安裝所有必需的python庫

安裝numpy大約需要15分鐘

$ mkvirtualenv -p /usr/bin/python3.6 tf2

$ pip install numpy==1.19.1

安裝scipy大約需要40分鐘

$ pip install scipy==1.5.1

安裝Jetson Nano TensorFlow-2.0.0需再花費15分鐘

$ pip install scikit-build protobuf cython -vvvv

$ pip install grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta -vvvv

$ pip install https://developer.download.nvidia.com/compute/redist/jp/v43/tensorflow-gpu/tensorflow_gpu-2.0.0+nv19.12-cp36-cp36m-linux_aarch64.whl -vvvv

安裝OpenCV需要1.5個小時

$ mkdir opencv && cd opencv
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.2.zip
$ unzip opencv.zip
$ mv opencv-4.1.2 opencv
$ cd opencv && mkdir build && cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUDA=OFF -D WITH_CUBLAS=OFF -D WITH_LIBV4L=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_java=OFF -D WITH_GSTREAMER=ON -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=OFF ..

$ make -j3
$ sudo make install

$ cd ~/.virtualenvs/tf2/lib/python3.6/site-packages
$ ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-aarch64-linux-gnu.so cv2.so

最後克隆Monk Object Detection庫

注意:不要像在開發機器中那樣運行13_tf_obj_2的安裝。用tf2.0安裝tf對象檢測有一些問題。推理代碼不需要對象檢測API工具。

$ git clone https://github.com/Tessellate-Imaging/Monk_Object_Detection.git

過程F-4:關於Jetson Nano的推論

將優化的權重文件夾複製/下載到jetson nano工作目錄(Monk庫爲克隆目錄)

從Monk_Object_Detection庫複製示例圖像

$ cp -r Monk_Object_Detection/example_notebooks/sample_dataset/ship .

加載推理引擎和模型(此步驟大約需要4到5分鐘)

from infer_detector_nano import Infer
gtf = Infer();

gtf.set_model_params(exported_model_dir = 'trt_fp16_dir')

現在,如前所述,TensorRT採用計劃並在運行時構建(優化)它,因此第一次運行大約需要3-4分鐘

scores, bboxes, labels = gtf.infer_on_image('ship/test/img1.jpg', thresh=0.1);

# Oputput will be saved as output.jpg
gtf.draw_on_image(self, bbox_thickness=3, text_size=1, text_thickness=2)

突出顯示的區域顯示了Jetson Nano的TesnorRT建立(優化)計劃(模型)(作者擁有的圖像)

再次運行它不會花費太多時間。

Benchmark板基準分析

gtf.benchmark_for_speed('ship/test/img1.jpg')
# With Jetson Nano power mode - 5W ModeAverage Image loading time : 0.0486 sec
Average Inference time     : 0.1182 sec
total_repetitions          : 100
total_time                 : 11.8244 sec
images_per_sec             : 8
latency_mean               : 118.2443 ms
latency_median             : 117.8019 ms
latency_min                : 111.0002 ms
# With Jetson Nano power mode - MAXN ModeAverage Image loading time : 0.0319 sec
Average Inference time     : 0.0785 sec
total_repetitions          : 100
total_time                 : 7.853 sec
images_per_sec             : 12
latency_mean               : 78.5399 ms
latency_median             : 78.1973 ms
latency_min                : 76.2658 ms

jupyter notebook提供TensorFlow對象檢測API 2.0的完整代碼

從谷歌驅動器下載所有預先訓練的權重

TensorFlow對象檢測API V 2.0的所有工作到此結束

感謝閱讀!祝你編碼愉快!!

原文鏈接:https://www.analyticsvidhya.com/blog/2020/09/tensorflow-object-detection-1-0-2-0-train-export-optimize-tensorrt-infer-jetson-nano/

歡迎關注磐創AI博客站: http://panchuang.net/

sklearn機器學習中文官方文檔: http://sklearn123.com/

歡迎關注磐創博客資源彙總站: http://docs.panchuang.net/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章