zoukankan      html  css  js  c++  java
  • 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
    ", 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实现相关功能的。

    代码测试

  • 相关阅读:
    (七)执行上下文和词法作用域&动态作用域案例分析
    (六)js的arguments
    (五)关于解构赋值
    (四)JavaScript深入之词法作用域和动态作用域
    jmeter获取token并请求失败Internal authentication failed 400
    jmeter造当前时间,未来时间,历史时间
    jmater分布式压力测试总结
    敏捷测试-基本流程
    致我测试之路的“七年之痒”
    jmeter解决登录token获取
  • 原文地址:https://www.cnblogs.com/TeeFirefly/p/12131831.html
Copyright © 2011-2022 走看看