RK3399 PRO快速開發 - 車牌識別

簡介
Rock-X SDK 是基於 RK3399Pro/RK1808 平臺的一套 AI 組件庫。開發者通過 Rock-X SDK提供的 API 接口能夠快速構建 AI 應用。
Rock-X下載地址:https://pan.baidu.com/s/1brKNqxBYDmElm-A56DLu4Q 提取碼:ji14  

Rock-X SDK 主要功能 

類別 功能
目標檢測 人頭檢測、人車物檢測
人臉 人臉關鍵點、人臉屬性分析、人臉識別
車牌 車牌檢測、車牌識別
人體關鍵點 人體骨骼關鍵點、手指關鍵點

本篇是使用Rock-X SDK進行車牌識別快速開發的過程,使用自定義或其它的模型的請使用rknn-toolkit和rknn-api進行開發(鏈接: http://wiki.t-firefly.com/zh_CN/3399pro_npu/)。
 

性能指標
車牌識別性能

數據集 性能指標
CCPD 83.31%(8331/10000)

注:  
1. CCPD(Chinese City Parking Dataset)是國內車牌數據集,從中隨機抽取 10000 張進行測試。  
2. 支持識別國內藍色、綠色和黃色車牌。  
3. 可識別的車牌字符如下表所示。 

字符類別 可識別字符
省份中文字符 京 滬 津 渝 冀 晉 蒙 遼 吉 黑 蘇 浙 皖 
閩 贛 魯 豫 鄂 湘 粵 桂 瓊 川 貴 雲 藏 陝 甘 青 寧 新
數字和字母 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
車牌用途中文字符 港 學 使 警 澳 掛 軍 北 南 廣 沈 蘭 成 濟 海 民 航 空

調用過程

硬件準備
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. 初始化

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實現相關功能的。

代碼測試

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章