Firefly开源社区

标题: RK3399 PRO快速开发 - 车牌识别 [打印本页]

作者: rany    时间: 2019-12-6 11:12
标题: 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/)。

性能指标
车牌识别性能
数据集
性能指标
CCPD83.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. 初始化
  1. public void create() {
  2.     mModelPath = installRockxData(mContext);
  3.     mRockXPlateDetectionModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_DETECTION);
  4.     mRockXCarplateOnetModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_ALIGN);
  5.     mRockXCarplateRecogModule = native_create_rockx_module(mModelPath, ROCKX_MODULE_CARPLATE_RECOG);
  6. }
复制代码
程序会调用如上实现的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()部分实现如下:
  1. extern "C"
  2. JNIEXPORT jint JNICALL Java_com_rockchip_gpadc_demo_rockx_RockX_native_1plate_1detect
  3.         (JNIEnv *env, jobject obj, jlong handle, jbyteArray inData, jint inWidth, jint inHeight, jint inPixelFmt,
  4.          jobject detectObjectList) {

  5.     .. // 省略部分代码
  6.     rockx_ret_t ret = rockx_carplate_detect((rockx_handle_t)handle, &input_image, &object_array, nullptr);
  7.     if (ret != ROCKX_RET_SUCCESS) {
  8.         LOGE("rockx_face_detect error %d\n", ret);
  9.         return -1;
  10.     }

  11.     object_array_c2j(env, &object_array, detectObjectList, inWidth, inHeight);

  12.     env->ReleaseByteArrayElements(inData, in_data, JNI_ABORT);

  13.     return 0;
  14. }
复制代码
程序调用的是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()的部分实现:
  1. public Map<String,Float> recogCarplate(byte[] inData, int width, int height, int inPixelFmt,
  2.                                            int left, int right, int top, int bottom ,
  3.                                            byte[] recog_result  , float trans_alignconfidence, float a_t, float a_num, float r_t, float r_num) {

  4.         ... // 省略部分代码

  5.         starttime = System.currentTimeMillis();
  6.         alignconfidence = native_get_aligned_plate(mRockXCarplateOnetModule, inData,width, height, inPixelFmt,
  7.                 x1, x2, y1, y2, alignconfidence , alignimg);
  8.         endtime = System.currentTimeMillis();
  9.         a_t+=(endtime-starttime)/1000F;
  10.         a_num++;

  11.         System.gc();

  12.         Map<String,Float> result=new HashMap<>();
  13.         if (alignconfidence < 0) {
  14.             alignimg = null;
  15.             System.gc();
  16.             result.put("alignconfidence",alignconfidence);
  17.             return result;
  18.         }

  19.         if(alignconfidence>0.5) {       //filter the case of single character
  20.             starttime = System.currentTimeMillis();
  21.             float ret = native_get_recog_result(mRockXCarplateRecogModule, alignimg, inPixelFmt, recog_result);
  22.             endtime = System.currentTimeMillis();
  23.             r_t+=(endtime-starttime)/1000F;
  24.             r_num++;
  25.             Log.d(TAG, "current_ average recog time = " + r_t/r_num);

  26.             if (ret < 0) {
  27.                 alignimg = null;
  28.                 System.gc();
  29.                 result.put("alignconfidence",alignconfidence);
  30.                 return result;
  31.             }
  32.         }

  33.         ... // 省略部分代码
  34.     }
复制代码
可以看到车牌对齐调用的是RockX.native_get_aligned_plate(),车牌识别调用的是RockX.native_get_recog_result()这两个都是native函数,其实现其它的native函数实现形式差不多,都是通过调用Rock-X的API实现相关功能的。

代码测试







作者: 鍒樻灄    时间: 2020-2-15 23:24
学习
作者: ls90    时间: 2020-3-24 13:19
学习大牛
作者: 654850695    时间: 2020-4-1 12:39
厉害厉害
作者: KingQueenWong    时间: 2020-4-28 20:43
AI真是未来大趋势,要努力学习AI
作者: alvin427    时间: 2020-4-30 22:50
Good Study
作者: alvin427    时间: 2020-4-30 23:05
Good Study
作者: fireflynew    时间: 2020-6-1 15:54
赞一个
作者: maxwell2020    时间: 2020-6-7 15:32
666666
作者: cz6618    时间: 2020-6-28 15:59
有没有debian的声卡驱动
作者: LinyuHsieh    时间: 2020-7-23 16:09
牛逼支持一下
作者: zhaohu1218    时间: 2020-9-24 17:37
大牛,学习了。
作者: 德德IU    时间: 2020-10-14 12:23
而钛合金
作者: frank0610    时间: 2020-10-17 02:32
AI是大势所趋
作者: muchen    时间: 2020-10-20 09:57
老厉害了
作者: RobinXu    时间: 2021-1-4 21:40
摄像头是什么接口的啊?
作者: 15310907795    时间: 2021-6-2 17:21
不错不错
作者: gongfu    时间: 2021-6-7 15:55
百度云链接过期了
作者: cff    时间: 2021-7-12 21:23
努力学习AI
作者: maozheng110    时间: 2021-9-7 22:02
学习了,谢谢
作者: hdb5151    时间: 2021-11-25 09:50

赞一个
作者: hq1978    时间: 2021-11-27 12:08
用AI Builder 好像更方便,可以自己标注数据训练,导出3399的SDK使用
下载链接: https://pan.baidu.com/s/1YdrpShvt_r53u-alxldFlw 提取码:8888
作者: clinkz    时间: 2021-11-29 17:23
学习
作者: epwynner    时间: 2021-12-17 11:00
非常好的资源,多谢
作者: 阿晋    时间: 2021-12-26 23:39

作者: lxj    时间: 2022-1-18 09:15
太好啦
作者: 豆豆    时间: 2022-8-12 17:19
赞一个
作者: 一路彩虹    时间: 2022-10-1 13:14
学习一个
作者: 五渡    时间: 2022-11-21 12:10
我想咨询一下,用普通的监控摄像头是否可以。还是一定要用你们制定的摄像头
作者: hzjiangon    时间: 2023-3-14 08:00
链接失效了
作者: KevinWu    时间: 2023-4-10 17:35
您好!请问一下你这边有基于ubuntu20.04来做目标检测开发吗?我打算用Rock-X/RockX_SDK_V1.4.4_20210623/demo/command_line_demo/rockx_object_track_demo/rockx_object_track.cpp+相机作物体追踪检测,但是我研究了一下官方的代码,我想闻问一下他们的算法检测模型是不是调用lib的库里面的模型?我一张图片推理检测没问题,想接入深度相机尝试实时跟踪

作者: lele430    时间: 2023-4-16 18:20
学习下,感谢分享
作者: myfriend6042    时间: 2023-11-8 13:12
学习
作者: wx__hYeQdd    时间: 2024-3-19 15:44
谢谢,大神




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1