【ATU Book-S32V系列】 APEX 實際應用車道偏移偵測

一.   概述

前文回顧,從上一篇 APEX-CV 實際應用車道偏移偵測,介紹如何運用原廠現有的 APEX-CV 資源,來提升算法上運行速度。也說明並非使用 APEX 就能達到加速,這是需要依處理的資料量而定,衡量是否符合運算成本效益。接下來,將自行建置 APEX Kernel ,並貫徹 「進階使用方法」 的系列之方法,來更進一步優化算法運算效益 。如同下圖 “APEX 技術指南-文章架構示意圖” 所示,此次介紹章節為 “ APEX 進階實際應用車道偏移偵測“


APEX  技術指南 - 文章架構示意圖
 

若是對於 APEX 相關技術與知識尚未理解者,該篇文章難度略深,請從另一個系列的文章 “ APEX 基礎架構 ” 閱覽起。 

 

二.   APEX 硬體架構之進階探討

此章節,將使用進階方式 「建置 APEX Kernel」 來改良上篇文章所介紹的 「車道偏移偵測演算法」。而此章節最主要目的是展現如何建置 APEX Kernel ,而非指導如何建置車道偏移偵測算法。接下來,預計結合 二值化細線化 兩算法,以原廠所提供的 APEX-CV 之 Binary 算法來添加細線化的概念。如下圖所示,改良概念就是將紅框內的兩算法結合成 APEX Kernel


車道偏移偵測 LDW 演算法流程圖

 

如同 APEX 進階使用方法,依序從 APU Kernel、ACF Graph、APEX Kernel 建立起,最後放回車道偏移偵測算法作應用。

 (1) 建置 APU Kernel

->  移動至此路徑 :  ... /VisionSDK_S32V2_RTM_1_3_0_HF1/s32v234_sdk/kernels/apu
->  複製任一資料夾: 這裡以 資料夾apexcv_base_arithmetic 作範例

 

->   修改該 資料夾src 內的 C / C++ 程式碼 : 

如 arithmetic_acf.cpp & arithmetic_apu.cpp & arithmetic_acf.h & arithmetic_apu.h 共四檔案。
如下圖所示,因欲改良 apu_binary_threshold 這個函數,故修改時僅留下此函數,並將其餘非必要之函數刪除。




 

->  更改檔案、函式名稱、BUILD 檔案 : 

關於 arithmetic 與 binary_threshold 相關名稱改成自行定義的名稱,如 binary_thing。
所有相關檔案名稱修正完畢後,請至 資料夾build-apu-nxp-sa-d ,開啟終端機輸入 make -j4 allsub 生成連結檔(.a)。
代表建置成功 “APU kernel”!!

 

->  再次,修改 資料夾src 內之 *_apu.cpp 代碼 : 

透過上一步,已確認是可以成功建置 APU Kernel , 這裡將添加 細線化的概念,重新編譯代碼!! 建置成功 !!

 

(2) 建置 ACF Graph

->  移動至此路徑 : ... /VisionSDK_S32V2_RTM_1_3_0_HF1/s32v234_sdk/libs/
->  複製任一資料夾: 這裡以 資料夾arithmetic 作範例


->  修改該 資料夾arithmetic(副本) 內之檔案名稱 : 

 

->  修改該 資料夾graphs內之程式碼 : 

如下圖所示,因欲改良 threshold_08u_graph.hpp 與 threshold_08u_apu_process_desc.hpp 代碼,故將此兩個檔案保留且其餘的 .hpp 檔皆刪除。

 

->  修改該 資料夾graphs 內 程式碼檔名 與 BUILD 檔案 : 

例如 : APU GRAPHS = 對應至 資料夾graphs 的 binarythinning_08u_apu_process_desc.hpp 檔案
          APU GRAPHS_LIBS = 對應至 apex_binary_thinning.a 檔案 (應用 ACF 檔案)

 

->  修改該 資料夾graphs 內程式碼 : 

將所有關於 threshold 名稱皆改成 binarythinning 名稱,如下…

binarythinning_08u_graph.hpp

 

binarythinning_08u_apu_process_desc.hpp


 

 all_binarythinning_graph_registrations.h

 

->   在 資料夾build-apu-nxp-d 內編譯代碼  :

若生成以下資料與代碼時,即建置完成 ACF Graph !!

 

(3) 建置 APEX Kernel

->  移動至此路徑 : ... /VisionSDK_S32V2_RTM_1_3_0_HF1/s32v234_sdk/libs/apexcv_base/binarythinning/src

->  修改 arithmetic.cpp 檔案之內容與檔名

將非 threshold_08U 相關代碼移除,如下圖所示。
(為了表示縮排,故使用 VS Code 開啟代碼)

 

並將與 threshold 以 binarythinning 取代,將原始 threshold_08U 代碼移除

 

->  移動至此路徑 : ... /VisionSDK_S32V2_RTM_1_3_0_HF1/s32v234_sdk/libs/apexcv_base/binarythinning/include

->  修改 apexcv_base_binarythinning.h 檔案之內容與檔名

留下 threshold 相關代碼,並名稱改成 BinaryThinning 

 

->  修改 apexcv_binarythinning_in.h 檔案檔名

 

->   移動至此路徑 :  ... /libs/apexcv_base/binarythinning/apu-nxp/build-v234ce-gnu-linux-o
->   在 資料夾build-v234ce-gnu-linux-* 內編譯代碼   

開啟終端機,輸入 make allsub。當生成 連結檔(.a) 時,代表 APEX Kernel 編譯完成 !!

 

三.   車道偏移偵測演算法之進階改良效能

應用 APEX Kernel

應用方式與使用 APEX-CV 相同,僅需要宣告 apexcv::BinaryThinning 後,執行初始化與動作即可。 如下圖所示…

 

接下來,在原本的 車道偏移偵測之 Demo APP 內,將原本的二值化算法替換成 BinaryThinning 算法。 如下圖所示…

 

最後,重新編譯 APP 代碼,執行結果如下圖所示….

 
從實驗結果得知,可觀察上圖整合前與整合後的結果。雖然結果有些許不相同,但仍符合減少資料量並保有線段特性之目的,故勉強算是成功。其原因是因為 APEX 設計概念與描述方式問題,而這個問題就留給各位好好思考,感興趣的夥伴歡迎討論。回到主軸,這裡將呈現運算速度的提升,比較上述結果可以發現執行速度上有明顯提升 (執行時間從 1.512 ms 縮減至 0.686 ms) !! 其原因就是將原本的兩件事情的方式,結合成一件事情,這可以省去部分運算時間,更能省去 APEX 拆分資料時所耗費的時間。而拆分資料的時間也就是運算量小時, APEX 會輸給 OpenCV 的主要原因 !! 而 APEX 使用方法已全數介紹完畢,剩下的就是撰寫上的細節。還請各位多多琢磨一番!! 歡迎聯繫 互相討論 !! 謝謝支持 !!
 
 

四.  參考文件

[1] NXP Official website : https://www.nxp.com/
[2] VisionSDK_ProgrammingExamples.pdf
[3] VisionSDK_UserGuide.pdf
[4] VisionSDK_SUMat_UMat.pdf
[5] UG-10328-01-09_APEX-CV_Base_Library .pdf
[6] UG-10328-02-11_APEX-CV_Pro_Library.pdf
[7] UG-10267-03-14-ACF_User_Guide.pdf
[8] UG-10301-00-06_APU-2_C_Programmer_Guide pdf
[9] Chong-Wei Li , Jui-Cheng Yen and Hun-Chen Chen, "Safe Driving Monitoring System", June. 2014.

如有任何相關 APEX 技術問題,歡迎至博文底下留言提問 !!
接下來還會分享更多 APEX 的技術文章 !!敬請期待 【 ATU Book-S32V系列 】 !!

 


 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論