一. 概述
前文回顧,從上一篇 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 代碼,執行結果如下圖所示….
四. 參考文件
[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系列 】 !!
評論