跳到主要內容區塊

ntuccepaper2019

技術論壇

在嵌入式系統中使用MATLAB實現深度學習辨識
  • 卷期:v0047
  • 出版日期:2018-12-20

作者: 劉方傑 / 鈦思科技股份有限公司/應用工程師


如何使用MATLAB來快速的建構深度學習,並且實現在硬體上進行影像辨識呢?本文會介紹如何透過MATLAB將深度學習的模型架構建置在Jetson TX1上,透過GPU Coder(MATLAB-GPU轉碼器)將MATLAB程式碼轉成CUDA 程式碼,將硬體加速且在硬體上實現深度學習,外接上網路攝影機後,進行即時影像辨識的各種應用。

 

前言

在人工智慧與深度學習領域中需要大量的計算效能,因此若非投入大量資源,傳統CPU在運算效能上較無法負荷,因此主流多是採用GPU進行加速,嵌入式系統能將應用生活化,有GPU的嵌入式系統則擁有更大的潛力,可利用在車用電子、無人機、機器人…等不同領域,因此本文將使用NVIDIA Jetson TX1為範例,使用MATLAB完成深度學習的實現。

 

就算您不是資料科學專家,只要使用正確的工具,便能透過幾行程式碼就能使用深奧複雜的深度學習,您可從零開始設計深度學習的網路架構,或套用多種知名的現有模型,像是AlexNet,,輕鬆地辨識一千種物品,也可以使用遷移學習(Transfer learning) 方法將預訓練完成模型,如GoogLeNet、VGG,導入自己深度模型架構中訓練一個新的深度學習模型,來加速實現影像辨識的應用,接著透過GPU Coder(MATLAB-GPU轉碼器)進一步的將原先的MATLAB 程式碼轉成CUDA 程式碼,使得MATLAB演算法能夠實現在硬體上,並且透過硬體加速,將應用呈現於各種即時系統之中。

 

GPU Coder (MATLAB-GPU轉碼器)

GPU Coder可以將MATLAB Code轉成CUDA Code並應用於深度學習,嵌入式視覺與自主系統等,透過NVDIA CUDA的函式庫來最佳化化程式碼,包含cuDNN, cuSolver, cuBLAS等,可以做為原始碼,轉出lib,dll與exe直接運用在各類項目上,也能實現在NVDIA Tesla與NVDIA Tegra中。

  

在2018a新版本中,擴充支援NVDIA的TensorRT函式庫,且不只侷限於NVIDIA的GPU卡,更支援了Intel的MKL-DNN函式庫,與ARM Compute函式庫,使得在MATLAB上的深度學習架構能夠應用在更廣泛的硬體端上。

  

在MATLAB中使用轉換後的CUDA Code來進行運算上的加速,或是將傳統的CUDA Code與原本MATLAB的演算法整合,下面這張圖是整個GPU Coder的流程與支援的類型。當有一個想法,將想法透過預訓練模型(Pre Trained Model)訓練出模型後進行參數的調整,重新設計出一個符合需求的深度模型,接著就是透過GPU Coder進行轉碼,進而實現到各種函式庫與硬體上。

 


Figure.1 MATLAB開發深度學習流程及支援的函式庫與硬體架構

 

在R2016a推出了深度學習SeriesNetwork架構,包含知名的AlexNet,VGG等模型,在R2017b推出了DAGNetwork(有向非循環圖)中的多種深度學習的模型(GoogleNet , ResNet 50)與LSTM Network(長短期記憶模型),新增了GPU Coder可以將深度學習的模型轉成CUDA Code,並且能實現到TX1,TX2上,在R2018a中則能將DAGNetwork(有向非循環圖)的模型轉換成CUDA Code。

 


Figure.2  MATLAB目前支援之各種深度學習架構與模型

 

GPU Coder(MATLAB-GPU轉碼器)操作流程

透過GPU Coder我們可以將MATLAB上的演算法轉成.mex與.lib的形式(MEX檔為MATLAB可呼叫的C函數可執行檔),使用.mex可以在有MATLAB的電腦上進行驗證與執行,測試使用CUDA的狀況和使用GPU進行運算的速度等,進行單元測試,而轉換成.lib就是直接用C++進行CUDA的呼叫,以在沒有安裝MATLAB的電腦上直接使用,最後將.lib實作在嵌入式系統上,進行即時的應用。

 


Figure.3 GPU Coder(MATLAB-GPU轉碼器)所支援的轉碼型態

 

有兩種方式可以來使用GPU Coder來進行轉碼,第一種是使用GPU Coder的內建APP(MATLAB應用程式),第二種為使用程式碼的方式呼叫GPU Coder,以下先介紹第一種方式。

 

 1.使用GPU Coder APP:

1-1.在功能表單上找到APP的頁籤,點選Figure.4中紅框開啟下拉選單搜尋GPU Coder。


Figure.4 功能表單點選下拉選單開啟GPU Coder

 

1-2點選GPU Coder App 後,將出現以下轉碼首頁畫面(Figure 5),選擇要進行轉碼的函式


Figure.5 GPU Coder 轉碼首頁

 

1-3進入GPU Coder轉碼設定畫面後,依需要設定接口端的變數型態與大小。


Figure.6 GPU Coder轉碼設定畫面

 

1-4:設定完成後會看到轉碼設定畫面,可在Build type中調整要轉碼的形式,包含Source Code、MEX、Static Library(.lib)、Dynamic Library(.dll)、Executable(.exe),並選擇要轉換的語言,與可以在Toolchain中選擇VC++的版本,如果需要更多設定,請點選More Settings,可讓您調整記憶體,速度等,確認所有條件後,點下Generate後便完成。


Figure.7 轉碼設定畫面

 

2. 使用程式碼呼叫GPU Coder:

接下來本段將以兩個範例進行說明使用程式碼呼叫 GPU Coder(MATLAB-GPU轉碼器)的流程,藉由一步一步的實作讓您輕易上手。

 

2-1在嵌入式系統中實現車道線偵測

要將MATLAB實現在嵌入式系統上,首先要先建立好軟硬體兩邊的使用環境,電腦端上需要安裝LINUX系統的MATLAB與TX1上相關的軟體驅動,並在Jetson TX1上也要設定好相關的環境,相關的Path也要設定完成,詳細設定資訊請參考GPU Coder相關說明文件。


Figure.8  系統相關環境設定

 

在虛擬機(或是原本電腦就是LINUX系統)中執行MATLAB,進行實作深度學習的車道線偵測範例(Lane Detection Optimized With GPU Coder),範例中我們已經事先訓練好了關於車道線偵測的深度學習模型,可以輸入

disp(laneNet.Layers)指令來觀看。


Figure.9. laneNet的各層架構

 

並創建一個新的.m檔,並輸入以下的程式,就會將原本範例資料夾內的MATLAB Code與上面的CNN模型轉換成C++語言形式的lib檔。

 

cfg = coder.gpuConfig('lib');

cfg.GenerateReport = true;

cfg.GenCodeOnly = true;

cfg.TargetLang = 'C++';

cfg.Toolchain ='NVIDIA CUDA for Jetson Tegra X1 v7.0 | gmake (64-bit Linux)';

codegen -args {ones(227,227,3,'single'),ones(1,6,'double'),ones(1,6,'double')} -config cfg detect_lane

dir(codegendir)

 

接著將轉好的程式檔案,使用網路線對接的方式或隨身碟進行傳輸,將檔案傳入TX1後,在TX1開啟Terminal執行以下兩段指令來Make兩個Makefile:

Make -f detect_lane_rtw.mk; Make -f Makefile.mk,透過兩段指令開始編譯與製造出執行檔。

 


Figure10. 輸出執行的畫面

 

2-2在嵌入式系統中實現LOGO辨識

當原始的程式碼是透過C++與OpenCV所撰寫的,但又想嵌入深度學習的模型,這時候該怎麼做呢?

 

我們也可以將MATLAB內的深度學習的模型,來跟C++和OpenCV做結合,只需要將已經訓練好的深度學習模型進行轉檔,再透過已經撰寫好C++的main function,寫好些連接相機,截圖與顯示的內容,然後在Linux的環境下使用MATLAB,將用MATLAB Code寫好的LOGO辨識深度學習模型,透過以下程式碼 並使用GPU Coder進行轉碼,就能讓C++來呼叫這個模型進行使用。

 

getLogonet();

load('LogoNet.mat');

disp(convnet.Layers);

type('logonet_predict.m')

cnncodegen(convnet, 'targetarch', 'tx1', 'codegenonly', 1);

dir('codegen');

 

copyfile('create_exe.mk', fullfile('codegen', 'create_exe.mk'));

copyfile('synsetWords.txt', fullfile('codegen', 'synsetWords.txt'));

copyfile('main_webcam.cpp', fullfile('codegen', 'main_webcam.cpp'));

copyfile('maxperf.sh', fullfile('codegen', 'maxperf.sh'))

 

接著把轉好的檔案都轉至TX1,並在TX1開啟Terminal執行底下的兩段指令Make兩個Makefile,並開始編譯檔案與轉執行檔。

make -f cnnbuild_rtw.mk

make _f create_exe.mk


Figure.11 使用畫面上完整LOGO測試辨識結果

 


Figure.12使用實體物件LOGO測試辨識結果

 

結語

在MATLAB上,能夠完整的將深度學習從開發到應用於嵌入式系統之中,從建立深度學習模型、訓練與調整模型、轉換成CUDA C加速,到應用於嵌入式系統中,複雜的開發流程變得比較平易近人些,使得新踏入此領域的開發者,能夠更加容易的上手,並了解整體的架構與開發模式,開發的時程也能夠更加的迅速。

 

更多MATLAB深度學習&GPU Coder學習資源

1.          Generating CUDA Code from MATLAB Code

2.          Deploying a Deep Learning Network on NVIDIA Jetson Using GPU Coder

3.          NVIDIA GPU Support from GPU Coder

4.          NVIDIA Tesla from GPU Coder

5.          NVIDIA Tegra Support from GPU Coder

6.          GPU Coder

7.          Deep Learning:New Tools for Algorithm Design and Validation

8.          Lane Detection Optimized With GPU Coder(車道線偵測)

9.          Multi_Platform Deep Learning Targeting(LOGO辨識)