
示例工程人工智能嵌入式邊緣計(jì)算計(jì)算機(jī)視覺模型優(yōu)化【免費(fèi)下載鏈接】rknn_model_zoo項(xiàng)目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo點(diǎn)擊查看免費(fèi)下載導(dǎo)讀RGARaster Graphic Acceleration Unit是 Rockchip 平臺上一顆獨(dú)立的 2D 硬件加速器可承擔(dān)點(diǎn)/線繪制、圖像縮放、旋轉(zhuǎn)、bitBlt、alpha 混合等常見 2D 圖形操作將 CPU 從高頻的圖像搬運(yùn)與變換中解放出來。本倉庫在3rdparty/librga目錄下內(nèi)置了 librga —— RGA 的用戶空間驅(qū)動庫及其 2D 圖形操作 API當(dāng)前版本 v1.10.0并針對 Android 與 Linux 提供了多種 CPU 架構(gòu)的預(yù)編譯產(chǎn)物。閱讀本文后你將掌握 librga 的目錄結(jié)構(gòu)、im2d API 分層、核心數(shù)據(jù)結(jié)構(gòu)與狀態(tài)碼語義能夠在自己的 C/C 應(yīng)用中完成縮放、裁剪、格式轉(zhuǎn)換、旋轉(zhuǎn)、混合、填充等硬件加速操作并了解它在本倉庫utils/image_utils.c中的真實(shí)調(diào)用方式。librga 在倉庫中的定位根據(jù) 3rdparty/librga/README.md 的說明librga 實(shí)現(xiàn)了 RGA 的用戶空間驅(qū)動并提供一系列 2D 圖形操作 API其上游來源是 airockchip 維護(hù)的 librga 開源項(xiàng)目當(dāng)前倉庫內(nèi)置版本為 v1.10.0。該版本號與頭文件 im2d_version.h 中的版本定義完全一致RGA_API_MAJOR_VERSION 1、RGA_API_MINOR_VERSION 10、RGA_API_REVISION_VERSION 0并可通過RGA_API_FULL_VERSION宏在運(yùn)行時(shí)打印完整版本字符串。在 rknn_model_zoo 的整體架構(gòu)中l(wèi)ibrga 屬于3rdparty第三方依賴庫與 fftw、jpeg_turbo、opencv、rknpu2 等并列為上層圖像預(yù)處理鏈路如模型輸入圖像的縮放、格式轉(zhuǎn)換提供 2D 硬件加速選項(xiàng)。目錄結(jié)構(gòu)與預(yù)編譯產(chǎn)物librga 目錄的核心布局如下include/全部公共頭文件包括 im2d 系列 API 頭文件與底層 rga.hLinux/Linux 平臺預(yù)編譯庫按aarch64、armhf、armhf_uclibc架構(gòu)劃分每種架構(gòu)同時(shí)提供librga.a靜態(tài)庫與librga.so動態(tài)庫Android/Android 平臺預(yù)編譯庫提供arm64-v8a與armeabi-v7a兩套 ABI 的librga.a/librga.soREADME.md來源與版本說明。實(shí)際開發(fā)中可直接鏈接對應(yīng)架構(gòu)的庫文件也可以自行從上游源碼構(gòu)建后替換使用方式與 OpenCV 等第三方庫一致。頭文件體系im2d API 的分層結(jié)構(gòu)include目錄下最核心的入口是 im2d.h它通過簡單的 include 組合將整套 API 暴露給使用者#include im2d_version.h #include im2d_type.h #include im2d_common.h #include im2d_buffer.h #include im2d_single.h #include im2d_task.h #include im2d_mpi.h各頭文件分工明確可以按功能邊界將其劃分為五層頭文件職責(zé)im2d_version.hAPI 版本宏用于運(yùn)行時(shí)校驗(yàn)頭文件與庫的版本匹配im2d_type.h核心類型緩沖區(qū)描述rga_buffer_t、矩形im_rect、選項(xiàng)im_opt_t、枚舉IM_USAGE/IM_STATUS等im2d_buffer.h緩沖區(qū)導(dǎo)入importbuffer 系列與包裝wrapbuffer 系列im2d_single.h單任務(wù)模式 APIcopy/resize/crop/rotate/flip/blend/fill 等im2d_task.h多任務(wù)隊(duì)列模式 APIimbeginJob / imendJob 與各類 xxxTaskim2d_common.h通用工具querystring、imStrError、imcheck、imsync、imconfigim2d_mpi.h面向 rockit-ko 的上下文ctx接口如 improcess_ctxim2d_expand.hAndroid 擴(kuò)展GraphicBuffer / AHardwareBuffer 的導(dǎo)入與包裝另外 rga.h 屬于底層頭文件定義了RK_FORMAT_*像素格式枚舉im2d_type.h 會依賴它RockchipRga.h 則提供較早期的面向?qū)ο蠓庋bRga 類適合舊代碼兼容場景。核心數(shù)據(jù)結(jié)構(gòu)與枚舉1. 像素格式RK_FORMAT_*RGA 支持 RGB 與 YUV 兩大類格式定義在 rga.h 中格式值統(tǒng)一左移 8 位以與 Android 的 HAL_PIXEL_FORMAT_* 區(qū)分。常用格式包括RGB 類RK_FORMAT_RGBA_8888、RK_FORMAT_RGBX_8888、RK_FORMAT_RGB_888、RK_FORMAT_BGRA_8888、RK_FORMAT_RGB_565、RK_FORMAT_BGR_888YUV 半平面/平面類RK_FORMAT_YCbCr_420_SPNV12 風(fēng)格、RK_FORMAT_YCrCb_420_SPNV21 風(fēng)格、RK_FORMAT_YCbCr_420_P、RK_FORMAT_YCbCr_422_SP等10 bit 類RK_FORMAT_YCbCr_420_SP_10B、RK_FORMAT_YCrCb_420_SP_10B、RK_FORMAT_YCbCr_422_SP_10B等打包格式RK_FORMAT_YUYV_422、RK_FORMAT_UYVY_422等。2. 緩沖區(qū)描述rga_buffer_t所有 im2d 函數(shù)都通過rga_buffer_t描述一塊圖像緩沖區(qū)其定義位于 im2d_type.htypedef struct { void* vir_addr; /* 虛擬地址 */ void* phy_addr; /* 物理地址 */ int fd; /* dma-buf 共享 fd */ int width; /* 圖像寬度 */ int height; /* 圖像高度 */ int wstride; /* 寬度方向的像素 stride */ int hstride; /* 高度方向的像素 stride */ int format; /* 像素格式取自 RK_FORMAT_* */ int color_space_mode; /* 色彩空間模式 */ int global_alpha; /* 全局 alpha 值 */ int rd_mode; /* 讀取模式raster/fbc/tile */ int color; /* 顏色填充時(shí)使用的顏色 */ im_colorkey_range colorkey_range; im_nn_t nn; int rop_code; rga_buffer_handle_t handle; /* RGA 驅(qū)動中的緩沖區(qū)句柄 */ } rga_buffer_t;注意wstride/hstride與width/height的區(qū)別前者是緩沖區(qū)在內(nèi)存中實(shí)際的對齊 stride后者是參與運(yùn)算的可視區(qū)域尺寸。對齊不滿足硬件要求時(shí)通常需要設(shè)置 stride 大于 width。3. 矩形與選項(xiàng)im_rect描述圖像上的操作區(qū)域含x、y、width、height四個(gè)字段im_opt_t單次任務(wù)的完整配置項(xiàng)包含顏色填充值color、colorkey 范圍、NN 量化參數(shù)nn、ROP 碼、調(diào)度優(yōu)先級priority、核心選擇core、馬賽克模式mosaic_mode、OSD 配置osd_config、中斷配置intr_config以及預(yù)留字段reserve[128]結(jié)構(gòu)體第一個(gè)成員version默認(rèn)取RGA_CURRENT_API_HEADER_VERSION用于版本校驗(yàn)。4. 狀態(tài)碼IM_STATUS任何 blit 類函數(shù)的返回值都取自IM_STATUS其語義定義清晰狀態(tài)碼值含義IM_STATUS_NOERROR2無錯(cuò)誤IM_STATUS_SUCCESS1執(zhí)行成功IM_STATUS_FAILED0執(zhí)行失敗IM_STATUS_NOT_SUPPORTED-1不支持該操作/格式組合IM_STATUS_OUT_OF_MEMORY-2內(nèi)存不足IM_STATUS_INVALID_PARAM-3參數(shù)無效IM_STATUS_ILLEGAL_PARAM-4參數(shù)非法IM_STATUS_ERROR_VERSION-5頭文件與庫版本不匹配配合imStrError(status)宏定義于 im2d_common.h可將狀態(tài)碼轉(zhuǎn)換為可讀的錯(cuò)誤描述字符串便于調(diào)試。5. 操作位圖IM_USAGEIM_USAGE以位圖方式描述一次任務(wù)要啟用的硬件能力im2d_type.h幾何變換IM_HAL_TRANSFORM_ROT_90/180/270、IM_HAL_TRANSFORM_FLIP_H/V混合模式IM_ALPHA_BLEND_SRC_OVER默認(rèn) Porter-Duff SRC over DST、IM_ALPHA_BLEND_SRC、IM_ALPHA_BLEND_DST、IM_ALPHA_BLEND_SRC_IN、IM_ALPHA_BLEND_DST_IN、IM_ALPHA_BLEND_XOR等高級特性IM_ALPHA_COLORKEY_NORMAL/INVERTED顏色鍵控、IM_SYNC/IM_ASYNC同步/異步、IM_COLOR_FILL、IM_COLOR_PALETTE、IM_NN_QUANTIZE、IM_ROP、IM_ALPHA_BLEND_PRE_MUL、IM_MOSAIC、IM_OSD等。此外還有調(diào)度核心枚舉IM_SCHEDULER_CORE可指定 RGA3 Core0/Core1 或 RGA2 Core0與縮放插值枚舉IM_SCALE_MODEINTER_NEAREST / INTER_LINEAR / INTER_CUBIC。單任務(wù) API一次調(diào)用完成一項(xiàng)操作單任務(wù)模式是最常用的編程方式每個(gè) API 的典型簽名為「輸入緩沖 輸出緩沖 操作參數(shù) 同步標(biāo)志默認(rèn)同步執(zhí)行」全部聲明在 im2d_single.h 中。C 下使用默認(rèn)參數(shù)即可C 環(huán)境下則通過宏自動展開為_t后綴函數(shù)并填充默認(rèn)值。常用 API 一覽API功能關(guān)鍵參數(shù)imcopy圖像拷貝src、dst、syncimresize縮放src、dst、fx/fy 縮放因子、interpolationimcrop裁剪src、dst、im_rect源圖像上的裁剪區(qū)域imtranslate平移src、dst、目標(biāo)起始坐標(biāo) x/yimcvtcolor色彩空間/格式轉(zhuǎn)換src、dst、sfmt、dfmt、modeBT601/BT709 等imrotate旋轉(zhuǎn)src、dst、IM_HAL_TRANSFORM_ROT_90/180/270imflip鏡像翻轉(zhuǎn)src、dst、IM_HAL_TRANSFORM_FLIP_H/Vimblend雙通道混合前景背景→背景fg、bg、Porter-Duff modeimcomposite三通道混合SRCASRCB→DSTsrcA、srcB、dst、modeimcolorkey顏色鍵控src、dst、im_colorkey_range、modeimquantizeNN 量化src、dst、im_nn_t各通道 scale/offsetimfill / imfillArray顏色填充dst、im_rect、colorimrectangle畫矩形框dst、rect、color、thickness負(fù)值實(shí)心immosaic馬賽克image、rect、IM_MOSAIC_8/16/32/64/128impalette調(diào)色板/LUT 映射src、dst、lutimprocess通用單任務(wù)處理src/dst/pat 三通道 三個(gè)矩形 im_opt_t usageimmakeBorder擴(kuò)邊src、dst、top/bottom/left/right、border_type、value以縮放入口為例C 接口簽名為IM_API IM_STATUS imresize(const rga_buffer_t src, rga_buffer_t dst, double fx 0, double fy 0, int interpolation 0, int sync 1, int *release_fence_fd NULL);當(dāng)sync 1時(shí)函數(shù)阻塞等待任務(wù)完成并直接返回狀態(tài)碼當(dāng)sync 0時(shí)異步提交通過release_fence_fd輸出用于查詢?nèi)蝿?wù)狀態(tài)的 fence fd之后可配合imsync(release_fence_fd)等待完成適合流水線并行場景。任務(wù)隊(duì)列 API一次提交多個(gè)操作當(dāng)需要對同一批圖像連續(xù)執(zhí)行多個(gè)操作如先裁剪再縮放再格式轉(zhuǎn)換時(shí)可以使用任務(wù)模式im2d_task.h將多個(gè) task 打包成一個(gè) RGA job 一次性提交減少用戶態(tài)與內(nèi)核態(tài)的往返開銷。基本流程為im_job_handle_t job imbeginJob(); // 創(chuàng)建 job imcropTask(job, src, tmp, rect); // 加入裁剪任務(wù) imresizeTask(job, tmp, dst, 0, 0, INTER_LINEAR); // 加入縮放任務(wù) imcvtcolorTask(job, tmp, dst, sfmt, dfmt); // 加入格式轉(zhuǎn)換任務(wù) IM_STATUS ret imendJob(job); // 提交并執(zhí)行默認(rèn) IM_SYNC核心接口包括imbeginJob(uint64_t flags 0)創(chuàng)建 job返回im_job_handle_t句柄imendJob(job, sync_mode IM_SYNC, acquire_fence_fd 0, int *release_fence_fd NULL)提交 job支持同步/異步兩種運(yùn)行模式imcancelJob(job)取消并銷毀 job各類imxxxTask(job, ...)向 job 追加任務(wù)包括 imcopyTask、imresizeTask、imcropTask、imrotateTask、imflipTask、imblendTask、imcompositeTask、imfillTask、immosaicTask、impaletteTask、improcessTask 等與單任務(wù) API 一一對應(yīng)。任務(wù)模式的任務(wù)全部在硬件端串行/流水執(zhí)行可避免中間結(jié)果的多次內(nèi)存搬運(yùn)適合對性能敏感的預(yù)處理鏈路。緩沖區(qū)管理importbuffer 與 wrapbufferRGA 硬件不能直接訪問普通 malloc 內(nèi)存因此 im2d 提供了兩套緩沖區(qū)接口im2d_buffer.h導(dǎo)入importbuffer——把外部分配的緩沖區(qū)注冊到 RGA 驅(qū)動返回rga_buffer_handle_t句柄importbuffer_fd(int fd, ...)傳入 dma-buf 的 fd推薦方式drm 分配importbuffer_virtualaddr(void *va, ...)傳入虛擬地址需映射為連續(xù)物理內(nèi)存場景importbuffer_physicaladdr(uint64_t pa, ...)傳入物理地址releasebuffer_handle(handle)任務(wù)結(jié)束后釋放句柄。導(dǎo)入接口存在三組重載僅傳size、傳width/height/format、或傳im_handle_param_t結(jié)構(gòu)體內(nèi)含 width、height、format 三字段。包裝wrapbuffer——把已導(dǎo)入的句柄或內(nèi)存描述包裝成rga_buffer_twrapbuffer_handle(handle, width, height, format, ...)基于句柄包裝wrapbuffer_virtualaddr / wrapbuffer_physicaladdr / wrapbuffer_fd基于地址/fd 直接包裝此時(shí)無需先 importbuffer可選的第 4、5 個(gè)參數(shù)為wstride、hstride省略時(shí)默認(rèn)wstride width、hstride height。典型使用模式rga_buffer_handle_t hnd importbuffer_fd(dma_fd, width, height, fmt); rga_buffer_t src wrapbuffer_handle(hnd, width, height, fmt, wstride, hstride); // ... 執(zhí)行 im2d 操作 ... releasebuffer_handle(hnd);在 Android 平臺上im2d_expand.h 還提供了importbuffer_GraphicBuffer、wrapbuffer_AHardwareBuffer等擴(kuò)展接口可直接對接 Android 圖形緩沖區(qū)。通用工具能力查詢與參數(shù)校驗(yàn)im2d_common.h 提供一組與具體操作無關(guān)的輔助接口querystring(RGA_VENDOR / RGA_VERSION / RGA_MAX_INPUT / RGA_MAX_OUTPUT / RGA_INPUT_FORMAT / RGA_OUTPUT_FORMAT / RGA_EXPECTED / RGA_ALL)查詢 RGA 硬件的基本信息、支持的最大分辨率與格式集合返回描述字符串imStrError(IM_STATUS)將狀態(tài)碼轉(zhuǎn)為錯(cuò)誤信息字符串imcheckHeader()校驗(yàn)頭文件版本與庫版本是否一致避免因 API 不匹配導(dǎo)致未定義行為imcheck(src, dst, src_rect, dst_rect, mode_usage)在提交任務(wù)前檢查輸入輸出緩沖、區(qū)域與 usage 是否被當(dāng)前硬件支持返回IM_STATUS_NOERROR表示可執(zhí)行imconfig(IM_CONFIG_NAME, value)配置調(diào)度核心、優(yōu)先級等全局行為imsync(int release_fence_fd)阻塞等待指定 fence fd 對應(yīng)的任務(wù)完成。建議在正式業(yè)務(wù)代碼前先調(diào)用imcheckHeader()并在每次任務(wù)后檢查返回值這是 librga 編程中保證穩(wěn)定性的基本實(shí)踐。在 rknn_model_zoo 中的真實(shí)應(yīng)用本倉庫的 utils/image_utils.c 在實(shí)現(xiàn)圖像預(yù)處理/后處理時(shí)提供了基于 librga 的加速路徑文件第 7 行直接#include im2d.h隨后根據(jù)緩沖區(qū)來源物理地址 / dma fd / 虛擬地址分別調(diào)用importbuffer_physicaladdr、importbuffer_fd、importbuffer_virtualaddr導(dǎo)入源/目標(biāo)緩沖區(qū)源碼第 585-613 行再通過wrapbuffer_handle/wrapbuffer_physicaladdr/wrapbuffer_fd/wrapbuffer_virtualaddr包裝出rga_buffer_t參與后續(xù)處理源碼第 596-627 行。這一實(shí)現(xiàn)是 librga 接口在真實(shí)工程中的典型范例展示了「導(dǎo)入 → 包裝 → 執(zhí)行 → 釋放」的完整調(diào)用鏈可作為開發(fā)者將 RGA 加速引入自研預(yù)處理管線的參考模板。平臺適配與集成建議根據(jù)預(yù)編譯產(chǎn)物目錄librga 覆蓋的部署環(huán)境包括Linuxaarch64、armhf、armhf_uclibc靜態(tài)庫與動態(tài)庫Androidarm64-v8a、armeabi-v7a。集成時(shí)需注意三點(diǎn)其一RGA 是 Rockchip SoC 上的硬件單元librga 只能運(yùn)行于具備 RGA 硬件如 RK356x/RK3588 等系列的目標(biāo)板上x86 宿主機(jī)無法直接使用其二使用前確認(rèn)內(nèi)核已加載 rga 驅(qū)動節(jié)點(diǎn)其三頭文件版本與庫版本需保持一致可使用imcheckHeader()或RGA_API_FULL_VERSION宏在運(yùn)行時(shí)校驗(yàn)。對于本倉庫的模型推理場景當(dāng)輸入圖像尺寸與模型輸入不一致、或需要將相機(jī)幀通常為 YUV轉(zhuǎn)換為模型所需的 RGB 布局時(shí)都可以借助 imresize imcvtcolor 的組合把預(yù)處理卸載到 RGA 上降低 CPU 占用與整體延遲。小結(jié)librga 通過一套分層清晰的 im2d API把 Rockchip RGA 2D 硬件加速器的能力以「緩沖區(qū) 單任務(wù)/任務(wù)隊(duì)列」兩種模式暴露給應(yīng)用層rga_buffer_t描述圖像IM_USAGE聲明能力IM_STATUS匯報(bào)結(jié)果importbuffer/wrapbuffer 負(fù)責(zé)內(nèi)存對接。結(jié)合本倉庫 3rdparty/librga 內(nèi)置的 v1.10.0 頭文件與多架構(gòu)預(yù)編譯庫以及 utils/image_utils.c 的實(shí)踐范例開發(fā)者可以快速在 Rockchip 平臺上構(gòu)建出高性能的圖像縮放、格式轉(zhuǎn)換、旋轉(zhuǎn)與混合流水線。贊分享示例工程人工智能嵌入式邊緣計(jì)算計(jì)算機(jī)視覺模型優(yōu)化【免費(fèi)下載鏈接】rknn_model_zoo項(xiàng)目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo點(diǎn)擊查看免費(fèi)下載相關(guān)推薦終極指南5步掌握librga硬件加速圖像處理技術(shù)終極指南5步掌握librga硬件加速圖像處理技術(shù) 在當(dāng)今多媒體應(yīng)用爆炸式增長的時(shí)代圖像處理性能已成為決定應(yīng)用成敗的關(guān)鍵因素。面對高分辨率視頻實(shí)時(shí)處理、游戲圖圖像處理圖形學(xué)驅(qū)動開發(fā)嵌入式上一篇Mikage中斷處理機(jī)制從硬件異常到模擬器事件調(diào)度下一篇HsMod插件終極指南5分鐘安裝解鎖32倍速和200皮膚定制創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考