Toybrick
标题: 人工智能开发系列(2) 车牌识别开发与实现 [打印本页]
作者: troy 时间: 2019-2-13 16:43
标题: 人工智能开发系列(2) 车牌识别开发与实现
[attach]97[/attach]
本教程视频直播回看:
1 快速上手Ø 准备3399pro开发板一块,键盘,鼠标,显示屏
Ø 下载[attach]81[/attach],在CarLicense打入补丁
Ø 下载附件[attach]400[/attach]到CarLicense目录
Ø unzip rknn_test.zip解压文件
Ø python3 train-license-digits.py train训练生成用于数字和字母识别的pb文件
Ø python3 train-license-province.py train训练生成用于省份识别的pb文件
Ø pb模型训练完成之后,进入rknn_test目录,执行python3 rknn_transfer.py转换成rknn模型
Ø 安装matplotlib
- sudo dnf install freetype-devel pkg-config libpng-devel pkg-config
- pip3 install --user matplotlib
Ø 执行python3 rknn_picture.py进行车牌识别测试
识别结果如下:
2 概述一个简单的AI开发sample
Ø Github开源的车牌识别,CNN模型,6个省份,10个数字, 24个字母(I和O不属于车牌)
Ø 类LeNet-5,两个卷积层,两个池化层,一个全连接层,一个Softmax输出层
3 车牌定位和分割原理
3.1 HSV颜色空间介绍
3.2 原始图像
3.3 边缘提取将图像自适应阈值进行二值化处理
- if blur > 0:
- img = cv2.GaussianBlur(img, (blur, blur), 0)#图片分辨率调整
- oldimg = img
- img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- kernel = np.ones((20, 20), np.uint8)
- img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
- img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0);
- ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
使用canny算子进行边缘提取
- img_edge = cv2.Canny(img_thresh, 100, 200)
3.4 轮廓查找进行闭操作,去除字符间的空洞
进行开操作,去除多余的干扰点
- kernel = np.ones((morphologyr, morphologyc), np.uint8)
- img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)
- img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel)
3.5 颜色识别- 统计各种颜色点的数量
- H, S, V = cv2.split(card_img_hsv)
- #筛选对应颜色的图像数据,并进行二值化
- yellow_area = np.where((H > 11) & (H <= 34) & (S > 34), 1, 0)
- green_area = np.where((H > 35) & (H <= 99) & (S > 34), 1, 0)
- blue_area = np.where((H > 99) & (H <= 124) & (S > 34), 1, 0)
- black_area = np.where((H > 0) & (H <= 180) & (S > 0) & (S < 255) & (V > 0) & (V < 46), 1, 0)
- white_area = np.where((H > 0) & (H <= 180) & (S > 0) & (S < 43) & (V > 221) & (V < 225), 1, 0)
-
- #对二值化的数据进行求和,得到点的个数
- yellow = np.sum(yellow_area)
- green = np.sum(green_area)
- blue = np.sum(blue_area)
- black = np.sum(black_area)
- white = np.sum(white_area)
3.6 精确定位精确定位使用的是线扫的方式,统计行和列上对应颜色的数量,数量过少则相应的行或列进行丢弃
3.7 字符分割
4 RKNN使用解析
Rknn运行相关的源码集中在rknn_test下,目录结构如下所示:
rknn_test/
|-- lpr_digits_predict.rknn //转换之后用于数字和字母预测的rknn模型
|-- lpr_locate.py //车牌定位分割算法
|-- lpr_province_predict.rknn //转换之后用于省份预测的rknn模型
|-- predict-lpr-pb.py //使用TensorFlow和pb模型进行车牌识别
|-- rknn_picture.py //使用RKNN和rknn模型进行车牌识别
|-- rknn_transfer.py //将pb模型转换成rknn模型
`-- 京Q73Y60.jpg //测试用的图片
RKNN使用部分可以参考中文手势识别的帖子和查看源码,都有比较详细的注释,这里不再赘述。
作者: qiaoqiang126 时间: 2019-2-14 15:25
整个系统在UBUNTU上可以跑通,但是在3399pro Linux下面模型可以转换成.rknn 运行rknn_picture 报错
OSError: /usr/local/lib64/python3.6/site-packages/rknn/api/lib/simulator/librknn_runtime.so: cannot open shared object file: No such file or directory
so文件是存在的,这是怎么回事?
作者: troy 时间: 2019-2-14 17:04
可以在init_runtime里面加入参数init_runtime(host='rk3399pro'),你的ToolKit版本应该是0.9.7.0,需要指定host为rk3399pro才会运行在npu之上。UBUNTU可以,是因为运行在ToolKit的模拟器上。
我的ToolKit版本是0.9.7.1 init_runtime已经取消了host参数,会自动判断。
作者: qiaoqiang126 时间: 2019-2-15 09:28
3399pro上面怎么安装matplotlib呢?rknn_picture里面有matplotlib
作者: chuyee 时间: 2019-2-15 09:48
pip3 install
作者: chuyee 时间: 2019-2-15 10:49
Tested. The demo works great on TB-rk3300pro board with Linux rknn-toolkit-v0.9.8.
作者: qiaoqiang126 时间: 2019-2-15 11:42
pip3 install matplotlib 的时候
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-iqeppldw/matplotlib/
作者: chuyee 时间: 2019-2-15 15:24
what's the exact error? If it's related to memory, I'd suggest to create a swap file.
作者: 15875649641 时间: 2019-5-24 08:31
版主,请问有没有测试过识别一张图片大概需要多长时间呢?
我这边有个需求是对多路高清摄像头进行RKNN识别,不知道实时性能做到多少?
作者: 15875649641 时间: 2019-5-24 08:32
版主,请问有没有测试过识别一张图片大概需要多长时间呢?
我这边有个需求是对多路高清摄像头进行RKNN识别,不知道实时性能做到多少?
作者: troy 时间: 2019-5-24 10:18
这个demo只是用来演示调用过程的,精度和实时度并没有做优化
作者: yxtest 时间: 2019-6-14 14:34
本帖最后由 yxtest 于 2019-6-14 15:58 编辑
通过你们提供的 predict-lpr-pb.py 可运行且可识别出来结果。为什么 执行了rknn_transfer.py和rknn_predict.py后一直没有结果返回呢。
作者: troy 时间: 2019-6-17 09:03
demo编写的时候,rknntoolkit还处于早期版本,当前RknnToolKit稳定版本跟之前相比,接口还有其他方面变化较大,适配性可能不是很好。
作者: Ryan_zdst 时间: 2019-10-17 17:55
RockX中的车牌识别和这个demo是一样的嘛
作者: troy 时间: 2019-10-17 18:13
不一样,rockx的识别准确率高很多
作者: pogeba 时间: 2019-10-18 15:30
版主你好,请问from rknn.api import RKNN怎么导入?需要安装什么包吗?
作者: troy 时间: 2019-10-18 15:45
需要安装我们的rknn-toolkit,wiki里面有详细说明,建议先看下wiki。
作者: xindongzhang 时间: 2020-7-20 14:17
版主好,rockx采用的是end2end的方式做的车牌识别吗?还是采用车牌摆正、字符分割、字符识别的流程呢?
作者: troy 时间: 2020-7-23 08:44
你可以看一下车牌的识别代码,从代码中可以看到,创建了三个模型,车牌检测,车牌矫正,车牌识别,一共进行了三个流程。
作者: diaw 时间: 2020-7-28 19:56
楼主你整个跑过去花了多长时间呢
作者: diaw 时间: 2020-7-28 20:13
训练了400多次 一直停留在98-99%
作者: troy 时间: 2020-7-29 08:48
你是指哪个过程,训练还是推理。你说的训练卡在98%的情况我没遇到过,这个训练是github上别人写的仓库,已经两年没更新过了,因此有可能是TensorFlow版本兼容性的问题,可以看一下这方面。
如果你想只是想学习训练的过程,使用我们开发系列1的中文手势识别也是可以的。
作者: diaw 时间: 2020-7-30 09:51
系列1 有经常更新是吧
作者: diaw 时间: 2020-7-30 09:51
系列1 有经常更新是吧,我以为系列2会更新一些
作者: diaw 时间: 2020-7-30 15:13
../digital_gesture_recognition/model_2500/digital_gesture.pb
这个路径也是找不到的
作者: shaojia 时间: 2021-1-7 10:56
我也遇到这个问题 请问你解决了吗
作者: troy 时间: 2021-1-8 15:13
该demo仅用于演示,现在已经没有维护了,最新的rknn接口也发生很大变化,没有去做适配。
作者: greg 时间: 2021-5-27 11:50
在执行python3 rknn_transfer.py转换模型的时候报错
inputs = self.rknn_base.net.get_input_layers()
AttributeError: 'NoneType' object has no attribute 'get_input_layers'
可能是什么原因呢?
作者: ai开发者 时间: 2021-11-6 10:27
E Traceback (most recent call last):
E File "rknn\base\RKNNlib\converter\convert_tf.py", line 1179, in rknn.base.RKNNlib.converter.convert_tf.convert_tf.match_paragraph_and_param
E File "rknn\base\RKNNlib\RKNNnet.py", line 214, in rknn.base.RKNNlib.RKNNnet.RKNNNet.new_layer
E File "rknn\api\rknn_log.py", line 312, in rknn.api.rknn_log.RKNNLog.e
E ValueError: Unknow layer "randomuniform"
E During handling of the above exception, another exception occurred:
E Traceback (most recent call last):
E File "rknn\api\rknn_base.py", line 231, in rknn.api.rknn_base.RKNNBase.load_tensorflow
E File "rknn\base\RKNNlib\RK_nn.py", line 51, in rknn.base.RKNNlib.RK_nn.RKnn.load_tensorflow
E File "rknn\base\RKNNlib\app\importer\import_tensorflow.py", line 205, in rknn.base.RKNNlib.app.importer.import_tensorflow.Importensorflow.run
E File "rknn\base\RKNNlib\converter\convert_tf.py", line 1278, in rknn.base.RKNNlib.converter.convert_tf.convert_tf.match_paragraph_and_param
E File "rknn\api\rknn_log.py", line 312, in rknn.api.rknn_log.RKNNLog.e
E ValueError: Try match RandomUniform dropout/random_uniform/RandomUniform failed, catch exception!
Traceback (most recent call last):
File "G:/git_projects/CarLicense/rknn_test/rknn_transfer.py", line 33, in <module>
transfer('../train-saver/digits/lpr_predict.pb', './lpr_digits_predict.rknn')
File "G:/git_projects/CarLicense/rknn_test/rknn_transfer.py", line 23, in transfer
rknn.build(do_quantization=False)
File "D:\anaconda3\envs\tensorflow\lib\site-packages\rknn\api\rknn.py", line 241, in build
inputs = self.rknn_base.net.get_input_layers()
AttributeError: 'NoneType' object has no attribute 'get_input_layers'
请问能指导解决一下吗
作者: Jimbob 时间: 2021-11-11 14:45
您好,请问有这个可以在rk3568上面运行吗?有没有rk3568相关的的项目外放呢?谢谢!
作者: troy 时间: 2021-11-15 08:40
这个demo时间已经比较久,可能不适配当前的RKNN版本了。项目在RKNN的SDK里面都有带,有Python的也有C语言的。如果想快速上手,还有RockX的库可以用,封装了一些常用的项目,调用非常简单。
欢迎光临 Toybrick (https://t.rock-chips.com/) |
Powered by Discuz! X3.3 |