做者|Abhishek
編譯|Flin
來源|analyticsvidhyajava
從在自定義數據集中訓練檢測器到使用TensorFlow 1.15在Jetson納米板或雲上進行推理的詳細步驟python
完整代碼可在GitHub上得到linux
TensorFlow對象檢測API V2的教程可做爲jupyter notebook使用git
TensorFlow對象檢測API V1的教程可做爲jupyter notebook使用github
使用對象檢測API庫查找兼容的TensorFlow(和相關的cuda)版本redis
將自定義數據轉換爲tf記錄格式shell
混淆了tf1.0和tf2.0的流程ubuntu
手動更新模型配置文件以進行訓練api
運行訓練過程並解決配置文件中的問題bash
將模型從一種格式導出到另外一種格式以進行推理
混合了不一樣的模型格式類型——檢查點、凍結圖、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版本的對象檢測庫的區別
要使用對象檢測 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轉換仍然存在某些錯誤(將在之後的博客中討論)
TensorFlow提供數據集工具以將數據轉換爲可接受的TF記錄格式
可是這些示例僅適用於最經常使用的數據集,例如COCO,Pascal VOC,OpenImages,Pets-Dataset等。用戶須要根據選擇的示例筆記本,按照COCO、VOC、OID等格式從新格式化和排列數據集
另外一種方法是更新示例代碼以便提取自定義數據集,這自己就是一個艱難的過程
爲了使自定義數據集的加載變得容易,咱們修改了示例並添加了進一步的解析器以支持多種數據註釋類型,並將其直接轉換爲TF-Records。
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的包裝程序相同。
兩種對象檢測API均以檢查點 (「.ckpt」) 格式提供訓練有素的模型。
爲了在TF 1.0中進行推理,一般使用凍結圖形格式。
爲了在TF 2.0中進行推理,一般使用保存的模型格式。
特別是對於初學者來講,轉換模型的過程在兩個API中都不相同,一般很難弄清楚
爲了簡化流程,咱們添加了解析器,以使外部包裝器格式保持相同,這意味着咱們能同時使用TF 1.0 API和TF 2.0 API。
導出的模型最終使用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納米板)上運行。
此博客經過訓練和優化對象檢測模型澄清了全部疑問
讓咱們從版本1.0開始,每次使用一個對象檢測API模塊。
將要安裝的庫
先決條件: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
Monk對象檢測解析器要求數據集採用COCO或Pascal VOC格式。對於本教程,讓咱們堅持使用Pascal VOC格式
要將數據集從任何格式轉換爲Pascal VOC,請查看如下詳細教程
在這個例子中,船檢測數據集取自一個關於使用retinanet進行對象檢測的舊博客
在這個jupyter notebook中提到了使用這些數據的步驟
加載訓練引擎
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
導出訓練有素的檢查點模型
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
優化導出模型
優化函數運行一個執行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
加載推理機
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
步驟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
將優化的權重文件夾複製/下載到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的完整代碼
從谷歌驅動器下載全部預先訓練的權重
從在自定義數據集上訓練檢測器到在Jetson納米板或雲上使用TensorFlow 2.3進行推理的詳細步驟
要安裝的庫
前提條件: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
這與第1部分中的相同。Monk對象檢測解析器要求數據集採用COCO或Pascal VOC格式。對於本教程,讓咱們堅持使用Pascal VOC格式
要將你的數據集從任何格式轉換爲Pascal VOC,請查看如下詳細教程
在此示例中,船檢測數據集是從一篇對象檢測的舊博客中獲取的
此jupyter notebook中提到了使用數據的步驟
加載訓練引擎
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
導出訓練有素的檢查點模型
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
安裝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
加載推理機
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
步驟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入門」頁面的更多詳細信息
步驟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
將優化的權重文件夾複製/下載到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/