本文將介紹如何使用Vitis-AI加速YOLOX模型實現視頻中的目標檢測,并對相關源碼進行解讀。由于演示的示例程序源碼是Vitis-AI開源項目提供的,本文演示之前會介紹所需要的準備工作。演示之后會對關鍵源碼進行解析。
一、Vitis AI Library簡介
上一篇帖子中,我們了解了Vitis統一軟件平臺和Vitis AI,并體驗了Vitis AI Runtime的Resnet50圖像分類示例程序。本篇文章我們將會介紹Vitis AI Library,并體驗基于Vitis AI Library的YOLOX視頻目標檢測示例程序。
Vitis AI User Guide中的一張圖可以很好的理解Vitis AI Library和Vitis AI Runtime的關系:
簡單來說,Vitis AI Library是在Vitis AI Runtime之上構建出來的。
二、YOLOX視頻目標檢測示例體驗
參考此前的帖子:【KV260視覺入門套件試用體驗】部署DPU鏡像并運行Vitis AI圖像分類示例程序
首先需要部署DPU鏡像,DPU鏡像系統啟動過程中會加載DPU IP到FPGA側,并且系統本身已經集成了Vitis AI所需的各種庫文件。
2.1 準備測試所需視頻文件
賽靈思官方文檔里面提供了測試視頻資源
在開發板上下載、解壓的命令為:
# 跳轉到HOME目錄 cd ~ # 下載 tar.gz 文件 TGZ=[vitis_ai_library_r3.0.0_video.tar.gz](https://china.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_video.tar.gz) wget -O $TGZ "[https://china.xilinx.com/bin/public/openDownload?filename=](https://china.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_video.tar.gz)$TGZ" # 解壓 tar.gz 文件 DIR=[vitis_ai_library_r3.0.0_video](https://china.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_video.tar.gz) mkdir $DIR tar -C $DIR -xvf $TGZ
(左右移動查看全部內容)
2.2 準備KV260套件和DPU鏡像SD卡
和上一篇帖子一樣,使用Vitis-AI之前需要先準備好KV260套件和寫入DPU鏡像的SD卡,具體可以參考上一篇帖子中的第二章“部署DPU鏡像到KV260”:【KV260視覺入門套件試用體驗】部署DPU鏡像并運行Vitis AI圖像分類示例程序
2.3 編譯YOLOX視頻目標檢測示例程序
KV260使用DPU鏡像的SD卡啟動后,跳轉到Vitis-AI/目錄下,可以看到如下文件及目錄:
其中,藍色的為目錄,綠色的為可執行文件,白色的為沒有執行權限的文件。
執行build.sh腳本,可以重新編譯文件(可以嘗試將可執行文件刪除掉再重新執行build.sh腳本)。
該腳本文件內的代碼為:
重新編譯后,可以看到時間戳全部更新了:
2.4 運行YOLOX視頻目標檢測示例程序
接下來,運行YOLOX視頻目標檢測程序——test_video_yolox,命令為:
VIDEO_PATH=~/vitis_ai_library_r3.0.0_video/apps/seg_and_pose_detect/seg_960_540.avi MODEL_NAME=yolox_nano_pt ./test_video_yolovx $MODEL_NAME $VIDEO_PATH
(左右移動查看全部內容)
可以看到,畫面中的目標被框起來了。
三、YOLOX視頻目標檢測原理解析
YOLOX視頻目標檢測示例程序源碼非常簡短(test_video_yolovx.cpp文件):
這段代碼中:
model是模型名稱;
vitis::create(model) 用于創建模型;
3.1 main_for_video_demo 源碼分析
main_for_video_demo 核心代碼如下:
其中,關鍵代碼行如下:
parse_opt 用于解析命令行參數,包括線程數(例如-t 4指定4個線程)和視頻文件名
decode_queue 是解碼隊列,用于傳遞已經解碼的圖像;
decode_thread 是解碼任務線程,讀取視頻文件,并解碼每一幀畫面,放入解碼隊列;
dpu_thread 是DPU任務線程,從解碼隊列取出圖像,如果-t 參數指定的大于1,會創建多個DPU線程(不指定-t參數,默認為1個DPU線程);
gui_thread 是圖形用戶界面(GUI)線程,調用cv::imshow顯示每一幀結果畫面;
gui_queue 是結果圖像隊列,GUI線程會從這個隊列取出圖像再顯示出來;
sorting_thread 是排序線程,用于確保傳遞給gui_queue的圖像和視頻中出現的順序一致,從而保證視頻顯示的畫面正常。
這段代碼搭建了一個多線程的視頻處理流水線,流水線結構如下圖所示:
3.2 DecodeThread 源碼分析
DecodeThread的構造函數:
構造函數中調用open_stream,open_stream創建了OpenCV的VideoCapture對象指針,用于后續視頻文件讀取操作。
DecodeThread::run函數:
DecodeThread::run函數的關鍵代碼為:
cap >> image 實現了從視頻讀取畫面,
queue_->push(…) 實現了給幀畫面編號,并將其放入隊列。
3.3 SortingThread 源碼分析
SortingThread::run函數關鍵代碼如下:
SortingThread::run中的關鍵代碼為:
queue_in_->pop(…) 等待特定frame_id的圖像到來;
queue_out_->push(…) 再將其放入輸出隊列(gui_queue)。
3.4 GuiThread 源碼分析
GuiThread::run函數源碼:
其中關鍵的代碼為:
調用queue_->pop()從隊列取出一幀畫面;
調用cv::imshow顯示圖像畫面。
3.5 DpuThread 源碼解析
DpuThread::run函數源碼:
其中關鍵代碼為:
調用queue_in_->pop(frame)取出畫面;
調用filter_->run(frame.mat)處理畫面;
調用queue_out_->push(frame)傳出畫面;
要解讀filter到底是什么,還需要看DpuThread構造函數的聲明:
以及DpuThread類型實例化的代碼:
以及main函數:
這里可以看到:
factory_method是一個C++11的lamba表達式,
其中調用了vitis::create(model);
vitis::create的具體實現代碼較多,感興趣的可以自行查閱Vitis-AI源碼,它主要實現了模型加載,以及調用Vitis-AI-Runtime接口執行推理,這里不再解讀。
process_result函數定義:
可以看到,process_result的作用主要是畫出方框,以及打印日志。
審核編輯:湯梓紅
-
AI
+關注
關注
87文章
28818瀏覽量
266157 -
DPU
+關注
關注
0文章
341瀏覽量
24044 -
模型
+關注
關注
1文章
3029瀏覽量
48343 -
目標檢測
+關注
關注
0文章
196瀏覽量
15564 -
Vitis
+關注
關注
0文章
145瀏覽量
7310
原文標題:【試用報告】Vitis-AI加速的YOLOX視頻目標檢測示例體驗和原理解析
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論