1. 程式人生 > 實用技巧 >如何用百度大腦FZ3深度學習卡+Paddle模型建立你的應用?

如何用百度大腦FZ3深度學習卡+Paddle模型建立你的應用?

前言:米爾科技的FZ3是與百度緊密合作推出的一款基於XilinxZynq Ultrascale CZU3EG晶片打造的深度學習計算卡,晶片內部集成了4核ARMA53處理器+GPU+FPGA的架構,具有多核心處理能力、FPGA可程式設計能能力以及視訊流硬體解碼能力等特點。

同時內建了基於Linux作業系統+百度深度學習平臺-飛槳(Paddle)定製的深度學習軟核,深度相容百度大腦模型資源與工具平臺(EasyDL/AIStudio),可高效、快速的實現模型的訓練-部署-推理等一系列流程,極大降低了開發驗證、產品整合、科研教學、專案部署的門檻。

軟核簡介

FZ3 計算卡內部搭載Linux系統,開發者可以基於Linux系統進行應用程式進行開發。 主要呼叫流程: ->1.應用程式獲取視訊輸入 ->2.呼叫預測庫載入模型 ->3.排程模型和底層驅動加速模組進行計算 ->4.獲得執行結果

如何用Paddle模型開發應用?

1.模型獲得

目前Paddle-Mobile僅支援Paddle訓練的模型。如果你手中的模型是不同種類的模型,需要進行模型轉換才可以執行。驗證過的網路包含resnet、Inception、ssd、mobilenet等。

訓練模型:
如果您沒有模型,可以使用sample中的模型,或自己訓練模型。
1.通過PaddlePaddle開源深度學習框架自己訓練模型;
2.通過AI Studio平臺訓練模型;
3.可以在EasyDL等平臺上傳標註資料,訓練模型;
轉換模型:
1.如果您已有caffe模型,我們提供了相應的轉換工具,幫助轉為Paddle模型。
2.如果您已有Tensorflow模型,我們提供了相應的轉換工具,幫助轉為Paddle模型。

2.連線視訊資料來源

FZ3提供多種視訊輸入硬體介面,支援多種協議輸入影象資料作為資料來源。包括bt1120、usb、mipi、GIGE
等協議。
1.usb協議視訊資料輸入:
可以選擇uvc usb攝像頭作為視訊源。插入usb攝像頭到FZ3 的usb介面
2.bt1120協議視訊資料輸入:
可以選擇海思具有bt1120視訊資料輸出的網路攝像頭,通過fpc排線連線FZ3的BT1120介面,具體針腳的定義可參考硬體說明。
3.mipi協議視訊資料輸入:
可以選擇適配好的mipi攝像頭作為視訊源,通過fpc連線FZ3的mipi介面。
4.GIGE協議視訊資料輸入:
可以選擇支援linux系統的GIGE相機,並聯系我司進行相機官方sdk的適配,硬體連線FZ3的網口。

3.載入驅動

使用FZ3的加速功能,預測庫會把計算量大的op通過驅動呼叫fpga進行運算。執行自己的應用前需要載入驅動,編譯好的驅動位於/home/root/workspace/driver目錄,提供無日誌輸出和有日誌輸出兩個版本。
載入驅動

insmod /home/root/workspace/driver/fpgadrv.ko 


解除安裝驅動(正常情況您不需要解除安裝驅動,若需要載入有日誌輸出的版本,可以通過如下命令解除安裝後,再載入該版本)

rmmod /home/root/workspace/driver/fpgadrv.ko 

設定驅動自動載入

1.在系統中新增自啟動指令碼

// 開啟啟動目錄 
cd /etc/init.d/ 
// 新建啟動指令碼並編輯,名稱可以自定義 
vim eb.sh 
指令碼內容 
chmod +x /home/root/workspace/driver/fpgadrv.ko insmod /home/root/workspace/driver/fpgadrv.ko

2.建立軟連結

cd /etc/rc5.d/ 
ln -s /etc/init.d/eb.sh S99eb

3.更改指令碼許可權

chmod +x /etc/init.d/eb.sh reboot 

四、使用預測庫
FZ3支援Paddle-Moblie預測庫,編譯好的預測庫,位於/home/root/workspace/paddle-mobile。具體使用 把預測庫的標頭檔案和動態庫拷貝到自己應用中即可。另外可以參考我們提供的sample。Paddle-Moblie原始碼可以參考https://github.com/PaddlePaddle/paddle-mobile
五、建立應用
1.新增預測庫
拷貝/home/root/workspace/paddle-mobilie/下面的動態庫和標頭檔案到您的工程中。在CmakeLists.txt新增paddle- mobile庫的引用

set(PADDLE_LIB_DIR "${PROJECT_SOURCE_DIR}/lib" ) 
set(PADDLE_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/include/paddle-mobile/" )

include_directories(${PADDLE_INCLUDE_DIR}) LINK_DIRECTORIES(${PADDLE_LIB_DIR}) 
... 
target_link_libraries(${APP_NAME} paddle-mobile)

2.新增模型
拷貝自己訓練的模型到您的工程中
3.新增預測資料來源
可以選擇圖片,攝像頭資料作為預測資料來源,使用攝像頭需要插入相應的攝像頭。

USB攝像頭
1)插入攝像頭後,通過ls /dev/video* 檢視裝置接入情況。通過會顯示如下:

/dev/video0 /dev/video1 /dev/video2
/dev/video2為usb攝像頭v4l2輸出yuv資料,當應用提示找不到裝置時,可以修改src/video_classify.cpp或者 
src/video_detection.cpp。 通過/home/root/workspace/tools下video工具檢測攝像頭聯通性 
// src/video_classify.cpp 169行config.dev_name = "/dev/video2";

2)另外可以修改攝像頭解析度

// src/video_classify.cpp 170行 
config.width = 1280; 
config.height = 720;

3)執行video工具

//讀取usb攝像頭,採集一張圖片儲存到本地 
cd /home/root/workspace/tools/video 
./v4l2demo -i /dev/video2 -j -n 1 
//如有疑問,檢視幫助 
./v4l2demo -h

執行程式後在build目錄下會生成jpg檔案,可以檢視圖片否正確。如果沒有生成圖片,檢測是否識別到USB裝置。
bt1120 ipc攝像頭
FZ3通過bt1120協議接收原始資料進行推理後,可以把結果通過串列埠或spi傳回ipc(bt1120、串列埠、spi
介面定義參考硬體說明)。可以在圖片幀的畫素資料中攜帶幀編號。
插入攝像頭後,通過/home/root/workspace/tools下video工具檢測攝像頭聯通性

1)檢視裝置,正常情況下裝置為/dev/vide01

ls /dev/video* 
/dev/video0	/dev/video1 

2)配置攝像頭引數

media-ctl -v --set-format '"a0010000.v_tpg":0 [RBG24 1920x1080 field:none]'

3)執行video工具

//讀取BT1120攝像頭,採集一張圖片儲存到本地cd /home/root/workspace/tools/video 
./v4l2demo -i /dev/video1 -j -n 1 
//如有疑問,檢視幫助 
./v4l2demo -h

執行程式後在build目錄下會生成jpg檔案,可以檢視圖片否正確。如果沒有生成圖片,檢測bt1120連線線是否正確。
4.呼叫預測庫載入模型和使用預測資料
初始化模型

Predictor _predictor_handle = new Predictor(); 
_predictor_handle->init(model, {batchNum, channel, input_height, input_width}, output_names);

準備資料
1.縮放圖片到指定的大小。如果網路只能固定大小輸入,需要縮放到網路輸入大小。
2.圖片預處理(減均值、轉浮點、歸一化等).
3.產出資料,由於FZ3使用的NHWC格式,通常視訊過來的資料就是NHWC格式,就不需要NHWC->NCHW轉換。預測資料
呼叫API的predict介面,傳輸處理好的資料,獲取預測結果

bool predict(const float* inputs, vector<float*> &outputs,vector<vector > &output_shapes);

更多說明請點選瞭解:
http://www.myir-tech.com/product/mys-czu3eg.htm
看到這裡,你是否已經掌握了用米爾FZ3深度學習卡+百度飛槳(Paddle)模型來打造你的各種應用?
實際應用場景參考: