簡介
Rock-X SDK 是基於 RK3399Pro/RK1808 平臺的一套 AI 組件庫。開發者經過 Rock-X SDK提供的 API 接口可以快速構建 AI 應用。
Rock-X下載地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取碼:ji14
Rock-X SDK 主要功能 html
類別 | 功能 |
目標檢測 | 人頭檢測、人車物檢測 |
人臉 | 人臉關鍵點、人臉屬性分析、人臉識別 |
車牌 | 車牌檢測、車牌識別 |
人體關鍵點 | 人體骨骼關鍵點、手指關鍵點 |
本篇是使用Rock-X SDK進行車牌識別快速開發的過程,使用自定義或其它的模型的請使用rknn-toolkit和rknn-api進行開發(連接: http://wiki.t-firefly.com/zh_CN/3399pro_npu/)。
性能指標
車牌識別性能java
數據集 | 性能指標 |
CCPD | 83.31%(8331/10000) |
注:
1. CCPD(Chinese City Parking Dataset)是國內車牌數據集,從中隨機抽取 10000 張進行測試。
2. 支持識別國內藍色、綠色和黃色車牌。
3. 可識別的車牌字符以下表所示。 android
字符類別 | 可識別字符 |
省份中文字符 | 京 滬 津 渝 冀 晉 蒙 遼 吉 黑 蘇 浙 皖 閩 贛 魯 豫 鄂 湘 粵 桂 瓊 川 貴 雲 藏 陝 甘 青 寧 新 |
數字和字母 | 0 1 2 3 4 5 6 7 8 9 A B C D E F G H J K L M N P Q R S T U V W X Y Z |
車牌用途中文字符 | 港 學 使 警 澳 掛 軍 北 南 廣 沈 蘭 成 濟 海 民 航 空 |
調用過程api
硬件準備
AIO-3399ProC + 攝像頭數據結構
相關代碼
如下爲Android的相關代碼,完整代碼在/RockX_SDK_V1.1.0_20191115/demo/rk3399pro_android_demo/rockx-android-demo-carplate_recognition.zip。
此demo功能是從攝像頭獲取圖像數據,檢測圖像中的車牌,而後進行車牌對齊和識別,最後顯示識別的結果。
詳細的函數定義和相關數據結構請參考:/RockX_SDK_V1.1.0_20191115/doc/rockx_api_doc/html/index.html
1. 初始化ide
public void create() { mModelPath = installRockxData(mContext); mRockXPlateDetectionModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_DETECTION); mRockXCarplateOnetModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_ALIGN); mRockXCarplateRecogModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_RECOG); }
程序會調用如上實現的RockX.create()方法建立車牌檢測、車牌矯正對齊和車牌識別模塊。其中RockX.native_create_rockx_module()實現爲Java_com_rockchip_gpadc_demo_rockx_RockX_native_1create_1rockx_1module(),其調用Rock-X的API rockx_create()生成對應模塊的實例。
2. 檢測車牌
程序在java層調用RockX.detectCarplate()進行檢測車牌,RockX.detectCarplate()實際是RockX.native_plate_detect()的封裝,實際是RockX.native_plate_detect()部分實現以下:函數
extern "C" JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1plate_1detect (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt, jobject detectObjectList) { .. // 省略部分代碼 rockx_ret_t ret = rockx_carplate_detect((rockx_handle_t)handle, &input_image, &object_array, nullptr); if (ret != ROCKX_RET_SUCCESS) { LOGE("rockx_face_detect error %d\n", ret); return -1; } object_array_c2j(env, &object_array, detectObjectList, inWidth, inHeight); env->ReleaseByteArrayElements(inData, in_data, JNI_ABORT); return 0; }
程序調用的是Rock-X的API rockx_carplate_detect()進行檢測車牌,省略的部分是數據結構的初始化和填充,返回的結果爲object_array,經過object_array_c2j()賦值給detectObjectList傳回java層。
3. 車牌對齊和識別
車牌對齊和識別分別調用的是Rock-X的rockx_carplate_align()和rockx_carplate_recognize()進行的。 在java層,程序調用RockX.recogCarplate()將檢測到的車牌進行對齊和識別。 RockX.recogCarplate()的部分實現:性能
public Map<String,Float> recogCarplate(byte[] inData, int width, int height, int inPixelFmt, int left, int right, int top, int bottom , byte[] recog_result , float trans_alignconfidence, float a_t, float a_num, float r_t, float r_num) { ... // 省略部分代碼 starttime = System.currentTimeMillis(); alignconfidence = native_get_aligned_plate(mRockXCarplateOnetModule, inData,width, height, inPixelFmt, x1, x2, y1, y2, alignconfidence , alignimg); endtime = System.currentTimeMillis(); a_t+=(endtime-starttime)/1000F; a_num++; System.gc(); Map<String,Float> result=new HashMap<>(); if (alignconfidence < 0) { alignimg = null; System.gc(); result.put("alignconfidence",alignconfidence); return result; } if(alignconfidence>0.5) { //filter the case of single character starttime = System.currentTimeMillis(); float ret = native_get_recog_result(mRockXCarplateRecogModule, alignimg, inPixelFmt, recog_result); endtime = System.currentTimeMillis(); r_t+=(endtime-starttime)/1000F; r_num++; Log.d(TAG, "current_ average recog time = " + r_t/r_num); if (ret < 0) { alignimg = null; System.gc(); result.put("alignconfidence",alignconfidence); return result; } } ... // 省略部分代碼 }
能夠看到車牌對齊調用的是RockX.native_get_aligned_plate(),車牌識別調用的是RockX.native_get_recog_result()這兩個都是native函數,其實現其它的native函數實現形式差很少,都是經過調用Rock-X的API實現相關功能的。測試
代碼測試spa