作者|Abhishek 編譯|Flin 來源|analyticsvidhya
第1部分
從在自定義數據集中訓練檢測器到使用TensorFlow 1.15在Jetson納米板或雲上進行推理的詳細步驟
完整代碼可在GitHub上獲得
-
TensorFlow對象檢測API V2的教程可作爲jupyter notebook使用
-
TensorFlow對象檢測API V1的教程可作爲jupyter notebook使用
一些常見的困難包括
-
使用對象檢測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進行對象檢測的舊博客
- 船檢測數據集:https://www.tejashwi.io/object-detection-with-fizyr-retinanet/
- 博客:https://www.tejashwi.io/object-detection-with-fizyr-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圖像的輸入圖像
- 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入門”頁面的更多詳細信息
過程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的所有工作到此結束
感謝閱讀!祝你編碼愉快!!
歡迎關注磐創AI博客站: http://panchuang.net/
sklearn機器學習中文官方文檔: http://sklearn123.com/
歡迎關注磐創博客資源彙總站: http://docs.panchuang.net/