作者|Abhishek
編譯|Flin
來源|analyticsvidhya
第1部分
從在自定義資料集中訓練檢測器到使用TensorFlow 1.15在Jetson納米板或云上進行推理的詳細步驟
完整代碼可在GitHub上獲得
-
TensorFlow物件檢測API V2的教程可作為jupyter notebook使用
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb
-
TensorFlow物件檢測API V1的教程可作為jupyter notebook使用
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/12_tf_obj_1/Train_Infer_Optimize_Deploy.ipynb
一些常見的困難包括
-
使用物件檢測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站點上的教程指定的方式進行安排,
- 站點:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_training_and_evaluation.md

-
重新安排后,可以開始訓練,同樣,針對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,請查看以下詳細教程
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/tree/master/example_notebooks/12_tf_obj_1
在這個例子中,船檢測資料集取自一個關于使用retinanet進行物件檢測的舊博客
- 船檢測資料集:https://www.tejashwi.io/object-detection-with-fizyr-retinanet/
- 博客:https://www.tejashwi.io/object-detection-with-fizyr-retinanet/
在這個jupyter notebook中提到了使用這些資料的步驟
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb
程序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的完整代碼
從谷歌驅動器下載所有預先訓練的權重
- https://drive.google.com/file/d/1gtBp6G4Gix-b9epmUzd5kQtT1aY-iwXk/view?usp=sharing
第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,請查看以下詳細教程
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/tree/master/example_notebooks/13_tf_obj_2
在此示例中,船檢測資料集是從一篇物件檢測的舊博客中獲取的
- https://www.tejashwi.io/object-detection-with-fizyr-retinanet/
此jupyter notebook中提到了使用資料的步驟
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb
程序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影像的輸入影像
- SSD MobileNet V2:https://resources.wolframcloud.com/NeuralNetRepository/resources/SSD-MobileNet-V2-Trained-on-MS-COCO-Data
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入門”頁面的更多詳細資訊
- https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit
程序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的完整代碼
- https://github.com/Tessellate-Imaging/Monk_Object_Detection/blob/master/example_notebooks/13_tf_obj_2/Train_Infer_Optimize_Deploy.ipynb
從谷歌驅動器下載所有預先訓練的權重
- https://drive.google.com/file/d/12iOSeYHut_ZxB9Z8_dO7ZdUBI7of-GMd/view?usp=sharing
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/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/214423.html
標籤:其他
