作者 | Quantum
來源 | Data Driven Investor
編輯 | 代碼醫生團隊
近年來,嵌入式系統在AI領域開始普及。因為人工智慧和深度學習革命從軟體領域轉向硬體領域。插件卡上的嵌入式系統,帶有處理器,內存,電源和外部接口。由於嵌入式系統專用於特定任務,因此設計工程師可以對其進行優化,以減小產品的尺寸和成本,並提高可靠性和性能。它們通常用於消費者,烹飪,工業,汽車,醫療,商業和軍事應用中。
NVIDIA Jetson TX2
NVIDIA Jetson TX2是該領域最有趣的設備之一。這是第二代NVIDIA嵌入式設備。Jetson TX2是一款嵌入式模塊化系統(SoM),採用雙核NVIDIA Denver2 +四核ARM Cortex-A57,8GB 128位LPDDR4和集成的256核Pascal GPU。Jetson TX2可用於部署計算機視覺和深度學習,可運行Linux,在低於7.5瓦的功率下提供超過1 TFLOPS的FP16計算性能。
Jetson的技術規範
在本文中,演示並評估了使用在NVIDIA Jetson TX2上運行的SSD Lite MobileNet V2對象檢測算法執行實時對象檢測的方法。
安裝Jetpack
首先,安裝NVIDIA JetPack。NVIDIA JetPack SDK是構建AI應用程式的最全面的解決方案。使用JetPack安裝程序使用最新的作業系統映像刷新Jetson Developer Kit,為主機PC和Developer Kit安裝開發人員工具,並安裝快速啟動開發環境所需的庫和API,示例和文檔。撰寫本文時的最新版本是JetPack 4.1.1。
在大多數情況下,安裝很容易。從Ubuntu 16.04或Ubuntu 18.04 PC主機,只需從NVIDIA JetPack 網頁下載JetPack (您必須使用您的開發者帳戶登錄才能下載JetPack)並按照設置指南中的說明進行操作。
https://docs.nvidia.com/jetpack-l4t/2_2/content/developertools/mobile/jetpack/l4t/2.2/jetpack_l4t_install.htm
安裝TensorFlow,TensoRT和OpenCV
TensorFlow是當今最流行的深度學習框架之一。NVIDIA®TensorRT™是一款深度學習平臺,可優化神經網絡模型,加快數據中心,嵌入式和汽車設備中運行的各種GPU加速平臺的推理速度。TensorFlow與TensorRT很好地集成,這似乎很自然,特別是當NVIDIA提供非常適合加速TensorFlow的平臺時。這使得TensorFlow用戶在使用TensorRT時具有極高的推理性能和近乎透明的工作流程。
將TensorRT添加到TensorFlow推理工作流程涉及一個額外的步驟,如圖3所示。在此步驟(以綠色突出顯示)中,TensorRT根據凍結的TensorFlow圖構建優化的推理圖。
在本文中,將使用python 3+讓我們在設備上安裝TensorFlow和TensorRT。可以在Jetson 存儲庫的 NVIDIA TensorFlow / TensorRT模型中找到很好的說明。但首先應該安裝python3-dev和libfreetype6-dev軟體包。它們可以解決matplotlib安裝的一些問題:
https://github.com/NVIDIA-AI-IOT/tf_trt_models
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libfreetype6-dev python3-dev
另外,建議安裝最新版本的TensorFlow。
安裝TensorRT後,遇到了jupyter示例的問題。由於該示例使用ssd_inception_v2模型嘗試分配大量GPU內存,因此會話運行進程被系統殺死。為解決此問題,將模型從TensorFlow Model ZOO 更改為SSD Lite MobileNet v2 。Model ZOO是Google的預訓練對象檢測模型集合,具有不同級別的處理速度和準確性。
https://github.com/NVIDIA-AI-IOT/tf_trt_models/blob/master/examples/detection/detection.ipynb
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
儘管該模型運行得更快,但它的精確度較低。下載SSDLite-MobileNet模型並解壓縮並在jupyter筆記本中設置模型文件的路徑。
Model ZOO
現在構建並安裝openCV。為此更好地使用此存儲庫。但是在安裝之後你應該再做一步。Adrian Rosebrock在他的博客中描述了這一點:
https://github.com/jetsonhacks/buildOpenCVTX2
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/
OpenCV + Python綁定應該安裝在/usr/local/lib/python3.5/site-packages中。但是在為Python 3+編譯OpenCV 3綁定時要小心,輸出.so文件有時被命名為cv2.cpython-35m-arm-linux-gnueabihf.so(或類似的東西)而不是cv2.so(就像在Python 2.7中一樣)綁定。也許這是CMake腳本中的一個錯誤。如果發生這種情況,只需將文件重命名為cv2.so.
這是一個簡單的解決方案。需要做的就是:
cd /usr/local/lib/python3.5/site-packages/
sudo mv cv2.cpython-35m-arm-linux-gnueabihf.so cv2.so
運行Tensorflow圖
以下所有代碼均可在GitHub上獲得。
https://github.com/QuantuMobileSoftware/mobile_detector
首先,為對象檢測器定義一個抽象類:
https://github.com/QuantuMobileSoftware/mobile_detector/blob/jetson-tx2/object_detector.py
from abc import ABC, abstractmethod
class ObjectDetector(ABC):
@abstractmethod
def detect(self, frame, threshold=0.0):
Pass
接下來,實現TensorFlow模型的接口,使用來自對象檢測API的代碼。
https://github.com/QuantuMobileSoftware/mobile_detector/blob/jetson-tx2/object_detector_detection_api.py
現在實現jetson板載攝像頭的視頻流功能:
def open_cam_onboard(width, height):
gst_str = ('nvcamerasrc ! '
'video/x-raw(memory:NVMM), '
'width=(int)2592, height=(int)1458, '
'format=(string)I420, framerate=(fraction)30/1 ! '
'nvvidconv ! '
'video/x-raw, width=(int){}, height=(int){}, '
'format=(string)BGRx ! '
'videoconvert ! appsink').format(width, height)
return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)
並使用它:
predictor = ObjectDetector(args.graph_path)
cap = open_cam_onboard(640, 480)
while (cap.isOpened()):
ret, frame = cap.read()
result = predictor.detect(frame)
因此,使用SSD Lite TensorFlow模型,有大約4.2 FPS。
SSD MobileNet v2 Lite結果
運行TensorFlow Lite優化圖
TensorFlow Lite是在移動和嵌入式設備上運行機器學習模型的官方解決方案。它可以在Android,iOS等上實現具有低延遲和小二進位大小的設備上機器學習推理.TensorFlow Lite使用許多技術,例如允許更小和更快(定點數學)模型的量化內核。
如何使用TensorFlow Lite設置環境和轉換圖形,可以從此處下載lite圖表(detect.tflite)。
https://www.dropbox.com/s/3i1hop5wm61jd5n/mobile_detector.tar.gz
需要創建另一個檢測類來使用優化的圖形。代碼可在此處獲得。
https://github.com/QuantuMobileSoftware/mobile_detector/blob/jetson-tx2/object_detector_detection_api_lite.py
採用TensorFlow Lite優化的SSD Lite模型平均具有4.7 FPS。
運行TensorRT優化圖
也可以跳過此部分,因為已經在這裡提供了預先訓練的模型。
(ssdlite_inception_v2_coco_trt.pb)
考慮一個更詳細的例子。
https://www.dropbox.com/s/3i1hop5wm61jd5n/mobile_detector.tar.gz
已經下載了預先訓練的SSD Lite模型。應該建立一個凍結圖:
from tf_trt_models.detection import build_detection_graph
frozen_graph, input_names, output_names = build_detection_graph(
config=config_path,
checkpoint=checkpoint_path,
score_threshold=0.3,
batch_size=1
)
接下來,構建TensorRT / Jetson兼容圖並保存:
import tensorflow.contrib.tensorrt as trt
trt_graph = trt.create_inference_graph(
input_graph_def=frozen_graph,
outputs=output_names,
max_batch_size=1,
max_workspace_size_bytes=1 << 25,
precision_mode='FP16',
minimum_segment_size=50
)
with open('./data/ssd_inception_v2_coco_trt.pb', 'wb') as f:
f.write(trt_graph.SerializeToString())
可以像標準的凍結圖一樣使用這個優化的圖形。
在TensorRT優化之後,有11.5 FPS
TensorRT結果
摘要
測試運行後,得到以下性能結果:
模型的比較
如您所見,TensorRT優化幾乎使模型的性能提高了三倍。如果可以批量處理圖像,性能可能會更高。似乎TensorFlow Lite優化對Jetson的影響很小,這可能是因為它沒有針對GPU使用進行優化。TensorRT只有一個騙局:並非所有型號都可以用它進行優化。
總而言之,NVIDIA Jetson TX2 + TensorRT是一款相對便宜,緊湊且高效的機器,可用於實時物體檢測。
《深度學習之TensorFlow:入門、原理與進階實戰》和《Python帶我起飛——入門、進階、商業實戰》兩本圖書是代碼醫生團隊精心編著的 AI入門與提高的精品圖書。配套資源豐富:配套視頻、QQ讀者群、實例源碼、 配套論壇:http://bbs.aianaconda.com 。更多請見:aianaconda.com
點擊「閱讀原文」配套圖書資源