Toybrick

标题: 人工智能开发系列(1) 中文手势识别例程 [打印本页]

作者: troy    时间: 2019-1-10 17:51
标题: 人工智能开发系列(1) 中文手势识别例程
[attach]96[/attach]

本教程视频直播回看:
[attach]308[/attach]


1.快速上手


Project地址:https://github.com/tz28/Chinese-number-gestures-recognition
CSDN博客地址:https://blog.csdn.net/u012328159/article/details/81123018

运行结果如下:
[attach]49[/attach]


2.概述
一个简单的AI开发sample

Github开源的数字手势识别CNN模型,识别数字0-10十一种手势

类LeNet-5,两个卷积层,两个池化层,一个全连接层,一个Softmax输出层
[attach]48[/attach]



识别结果
[attach]50[/attach]



3.RKNN使用解析
Rknn运行相关的源码集中在rknn_test下,目录结构如下所示:

rknn_test/
├── digital_gesture.rknn        //转换之后的rknn模型
├── rknn_camera.py        //使用rknn模型进行对camera数据进行推理运算
├── rknn_picture.py        //使用rknn模型进行对图片数据进行推理运算
└── rknn_transfer.py        //用于将TensorFlow的pb模型转换为rknn模型

3.1 rknn_transfer.py
  1. from rknn.api import RKNN        

  2. INPUT_SIZE = 64

  3. if __name__ == '__main__':
  4.         # 创建RKNN执行对象
  5.         rknn = RKNN()

  6.         #初始化RKNN运行环境,指定host=’rk3399pro’,后续的操作将会运行在NPU上
  7.         print('--> Init runtime environment')
  8.         ret = rknn.init_runtime(host='rk3399pro')
  9.         if ret != 0:
  10.                 print('Init runtime environment failed')
  11.                 exit(ret)
  12.                 print('done')

  13.         # 配置模型输入,用于NPU对数据输入的预处理
  14.         # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
  15.         # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
  16.         # reorder_channel=’0 1 2’用于指定是否调整RBG顺序,设置成0 1 2即按输入的RGB顺序不做调整
  17.         # reorder_channel=’2 1 0’表示交换0和2通道,如果输入是RGB,将会被调整为BGR。如果是BGR将会被
  18.         # 调整为RGB
  19.         rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2')

  20.         # 加载TensorFlow模型
  21.         # tf_pb='../digital_gesture_recognition/model_2500/digital_gesture.pb'指定待转换的TensorFlow模型
  22.         # inputs指定模型中的输入节点
  23.         # outputs指定模型中输出节点
  24.         # input_size_list指定模型输入的大小
  25.         print('--> Loading model')
  26.         rknn.load_tensorflow(tf_pb='../digital_gesture_recognition/model_2500/digital_gesture.pb',
  27.                                 inputs=['input_x'],
  28.                                 outputs=['probability'],
  29.                                 input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])
  30.         print('done')

  31.         # 创建解析pb模型
  32.         # do_quantization=False指定不进行量化
  33.         # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
  34.         print('--> Building model')
  35.         rknn.build(do_quantization=False)
  36.         print('done')

  37.         # 导出保存rknn模型文件
  38.         rknn.export_rknn('./digital_gesture.rknn')

  39.         # Release RKNN Context
  40.         rknn.release()
复制代码


3.2 rknn_picture.py
  1. import numpy as np
  2. from PIL import Image
  3. from rknn.api import RKNN

  4. # 解析模型的输出,获得概率最大的手势和对应的概率
  5. def get_predict(probability):
  6.         data = probability[0][0]
  7.         data = data.tolist()
  8.         max_prob = max(data)

  9. return data.index(max_prob), max_prob;

  10. def load_model():
  11.         # 创建RKNN对象
  12.         rknn = RKNN()

  13.         # 载入RKNN模型
  14.         print('-->loading model')
  15.         rknn.load_rknn('./digital_gesture.rknn')
  16.         print('loading model done')

  17.         # 初始化RKNN运行环境
  18.         print('--> Init runtime environment')
  19.         ret = rknn.init_runtime(host='rk3399pro')
  20.         if ret != 0:
  21.                 print('Init runtime environment failed')
  22.                 exit(ret)

  23.         print('done')

  24.         return rknn

  25. def predict(rknn):
  26.         im = Image.open("../picture/6_7.jpg")        # 加载图片
  27.         im = im.resize((64, 64),Image.ANTIALIAS)  # 图像缩放到64x64
  28.         mat = np.asarray(im.convert('RGB'))           # 转换成RGB格式
  29.         outputs = rknn.inference(inputs=[mat])      # 运行推理,得到推理结果
  30.         pred, prob = get_predict(outputs)               # 将推理结果转化为可视信息

  31.         print(prob)
  32.         print(pred)

  33. if __name__=="__main__":
  34.         rknn = load_model()
  35.         predict(rknn)
复制代码


3.3 TensorFlow迁移到RKNN
3.3.1 模型的加载
  1. # tensorflow 模型加载,加载的是pb模型,并且获得pb对应的graph进行使用。
  2. def load_model():
  3.         with tf.gfile.GFile('./digital_gesture_recognition/model_2500/digital_gesture.pb', "rb") as f:  #读取模型数据
  4.                 graph_def = tf.GraphDef()
  5.                 graph_def.ParseFromString(f.read())                   #得到模型中的计算图和数据
  6.                 with tf.Graph().as_default() as graph:                 # 这里的Graph()要有括号,不然会报TypeError
  7.                         tf.import_graph_def(graph_def, name="")   # 导入模型中的图到现在这个新的计算图中
  8.                         return graph
复制代码
  1. #RKNN模型加载,需要加载的是pb转换后的rknn模型,并且设置RKNN运行环境即可使用
  2. def load_model():
  3.         # 创建RKNN对象
  4.         rknn = RKNN()

  5.         # 载入RKNN模型
  6.         print('-->loading model')
  7.         rknn.load_rknn('./digital_gesture.rknn')
  8.         print('loading model done')

  9.         # 初始化RKNN运行环境
  10.         print('--> Init runtime  environment')
  11.         ret = rknn.init_runtime(host='rk3399pro')
  12.         if ret != 0:
  13.                 print('Init runtime environment failed')
  14.                 exit(ret)
  15.         print('done')

  16.         return rknn
复制代码


3.3.2. 图像的预处理
  1. # 对于TensorFlow,输入图像数据必须为float32类型,且归一化的(1,64,64,3)形状的矩阵
  2. im = Image.open("dataset//new_pic//test6.jpg")
  3. im = im.resize((64, 64),Image.ANTIALIAS)        # 图像缩放到64x64
  4. mat = np.asarray(im.convert('RGB'))                 # 转成RGB格式,此时数据类型为UINT8
  5. mat = mat.reshape(1,64,64,3)                         # TensorFlow需要的是(1,64,64,3)的float32类型数据
  6. mat = mat / 255.                                            # 数据归一化
复制代码
  1. # 对于RKNN,图像的归一化和转float32,已经在模型转换时设置好,推理时会自动完成
  2. im = Image.open("dataset//new_pic//test6.jpg")
  3. im = im.resize((64, 64),Image.ANTIALIAS)        # 图像缩放到64x64
  4. mat = np.asarray(im.convert('RGB'))                 # 转成RGB格式,此时数据类型为UINT8
复制代码


3.3.3. 模型输入与输出
  1. # TensorFlow:需要输入(1,64,64,3)且进行归一后之后的float32类型矩阵
  2. mat = img_to_mat("./picture/0_10.jpg")
  3. x = graph.get_tensor_by_name("input_x:0")                # 输入节点,RKNN转换模型时,input为"input_x"
  4. outlayer = graph.get_tensor_by_name("outlayer:0")     # 输出节点,RKNN转换模型时,output为"outlayer"
  5. prob = graph.get_tensor_by_name("probability:0")       # 输出节点,RKNN转换模型时,output为"probability"
  6. predict = graph.get_tensor_by_name("predict:0")         # 输出节点,RKNN转换模型时,output为"predict"
复制代码
  1. # RKNN:需要的输入为(64, 64, 3)的UINT8类型矩阵,归一化和转float在模型转换时已定义好
  2. # 转换模型时,inputs和outputs列表可以tensor名得到,目前我们output只关心'probability',因此,outputs只设置成 outputs=['probability']
  3. rknn.load_tensorflow(tf_pb='../digital_gesture_recognition/model_2500/digital_gesture.pb',
  4.                                inputs=['input_x'],
  5.                                outputs=['probability'],
  6.                                input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])
复制代码


3.3.4. 模型的推理
  1. # Tensorflow使用run进行推理
  2. with tf.Session(graph=graph) as sess:
  3.         np.set_printoptions(suppress=True)
  4.         out, prob, pred = sess.run([outlayer, prob,predict],feed_dict={x:mat})

  5.         print(out)
  6.         print(prob)
  7.         print(pred)
复制代码
  1. # RKNN使用inference进行推理
  2. outputs = rknn.inference(inputs=[image])
复制代码




作者: onepiece    时间: 2019-1-11 15:29
写的很详细!!!
作者: andornot    时间: 2019-1-11 16:12
我是流氓我怕谁 发表于 2019-1-11 15:39
adsfafdasdfFDSFDaf


作者: user_one    时间: 2019-1-16 09:23
andornot 发表于 2019-1-11 16:12

很棒很棒很棒很棒很棒很棒很棒很棒很棒很棒
作者: 123456    时间: 2019-1-25 08:54
user_one 发表于 2019-1-16 09:23
很棒很棒很棒很棒很棒很棒很棒很棒很棒很棒

加一+1+1+1+1+1+1
作者: administer    时间: 2019-1-26 17:13
学习学习
作者: duckduckgo    时间: 2019-2-11 01:49
很详细,辛苦了。
作者: linuxsky    时间: 2019-2-16 09:06
请问下这个能做到 几帧呢? 整个任务处理时间
作者: someone9388    时间: 2019-2-21 11:53
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr/lib64/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
--> Init runtime environment
Traceback (most recent call last):
  File "rknn_transfer.py", line 12, in <module>
    ret = rknn.init_runtime(host='rk3399pro')
TypeError: init_runtime() got an unexpected keyword argument 'host'

遇到一个错误

作者: someone9388    时间: 2019-2-21 12:01
你好 遇到一个错误, 没有HOST 参数名:
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr/lib64/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
--> Init runtime environment
Traceback (most recent call last):
  File "rknn_transfer.py", line 12, in <module>
    ret = rknn.init_runtime(host='rk3399pro')
TypeError: init_runtime() got an unexpected keyword argument 'host'
麻烦指导解决一下
作者: someone9388    时间: 2019-2-21 12:06
someone9388 发表于 2019-2-21 12:01
你好 遇到一个错误, 没有HOST 参数名:
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr ...

安装的是
rknn_toolkit-0.9.8-cp36-cp36m-linux_aarch64.whl
作者: engin    时间: 2019-2-21 22:59
someone9388 发表于 2019-2-21 12:06
安装的是
rknn_toolkit-0.9.8-cp36-cp36m-linux_aarch64.whl

遇到同样的问题,0.9.8版本已经改为了自动识别host类型,删掉后正常;推测是修改功能时调整的参数接口。
可以直接删掉这个参数进行使用
作者: troy    时间: 2019-2-26 16:40
someone9388 发表于 2019-2-21 12:01
你好 遇到一个错误, 没有HOST 参数名:
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr ...

RKNN版本问题,最新的RKNN已经取消host参数,直接删除host参数即可
作者: troy    时间: 2019-2-26 16:42
linuxsky 发表于 2019-2-16 09:06
请问下这个能做到 几帧呢? 整个任务处理时间

这个demo比较简单,不怎么考虑性能,仅做演示使用。目前rknn的python推理接口存在耗时久的问题,后续会发布版本修复python推理慢的问题。
追求性能后续可以考虑多线程处理,或者直接使用C 的rknn进行开发。
作者: troy    时间: 2019-2-26 17:26
someone9388 发表于 2019-2-21 12:01
你好 遇到一个错误, 没有HOST 参数名:
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr ...

新版rknn取消host参数,直接删除host参数即可
作者: 15875649641    时间: 2019-5-28 13:45
您好 请问能提供
tensorflow-1.8.0-cp36-cp36m-linux_aarch64.whl
rknn-toolkit-0.9.7-cp36-cp36m-linux_aarch64.whl
这两个的资源吗
网上没找着
作者: troy    时间: 2019-5-28 17:26
15875649641 发表于 2019-5-28 13:45
您好 请问能提供
tensorflow-1.8.0-cp36-cp36m-linux_aarch64.whl
rknn-toolkit-0.9.7-cp36-cp36m-linux_aa ...

wiki上面有安装流程,而且最新发布的固件在帖子上有发布,现在最新的已经是rknn-toolkit 1.0.0了
作者: 15875649641    时间: 2019-5-28 22:06
troy 发表于 2019-5-28 17:26
wiki上面有安装流程,而且最新发布的固件在帖子上有发布,现在最新的已经是rknn-toolkit 1.0.0了 ...

OK 蟹蟹~
作者: 15875649641    时间: 2019-5-30 00:15
您好 在跑例程的时候出现
RKNN INIT FAILED  error code RKNN_ERR_DEVICE_UNAVAILABLE
Init runtime environment failed
请问这个应该如何解决

图片链接如下:

作者: gwill    时间: 2019-6-14 22:09
请问有百度云的下载链接吗?github下载一直失败!
作者: troy    时间: 2019-6-17 09:05
gwill 发表于 2019-6-14 22:09
请问有百度云的下载链接吗?github下载一直失败!

这个demo的主体是在GitHub上的,我们百度云只有自己部分代码的链接。
作者: TryYourBest    时间: 2019-6-26 14:01
本帖最后由 TryYourBest 于 2019-6-26 14:21 编辑
someone9388 发表于 2019-2-21 12:01
你好 遇到一个错误, 没有HOST 参数名:
[toybrick@localhost rknn_test]$ python3 rknn_transfer.py
/usr ...

你好,我在测试过程中也遇到了同样的问题(File "rknn_camera.py", line 22, in load_model    ret = rknn.init_runtime(host='rk3399pro')
TypeError: init_runtime() got an unexpected keyword argument 'host'

请问你的问题解决了么,如已解决,望请指教,谢谢

作者: 1074292224    时间: 2019-6-28 11:36
运行rknn_transfer.py时报错:
--> Init runtime environment
E Model is not loaded yet, this interface should be called after build or load_rknn!
Init runtime environment failed
请问大神,这个是什么原因呢?

作者: 瓜瓜瓜    时间: 2019-7-12 15:20
运行python3 rknn_transfer.py 报错,请问怎么解决?

[root@localhost rknn_test]# python3 rknn_transfer.py
/usr/lib64/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
--> Init runtime environment
E Model is not loaded yet, this interface should be called after build or load_rknn!
Init runtime environment failed

作者: 瓜瓜瓜    时间: 2019-7-12 17:29
请问跑手势识别的demo的时候,预测标签一直是0,然后概率一直是-65504.0,请问是怎么回事?
作者: troy    时间: 2019-7-14 14:42
瓜瓜瓜 发表于 2019-7-12 15:20
运行python3 rknn_transfer.py 报错,请问怎么解决?

[root@localhost rknn_test]# python3 rknn_transfer ...

rknn已经有比较大的更新,需要自己对照文档修改代码适配下新的rknn-ToolKit
作者: shajiayu    时间: 2019-7-27 00:01
瓜瓜瓜 发表于 2019-7-12 17:29
请问跑手势识别的demo的时候,预测标签一直是0,然后概率一直是-65504.0,请问是怎么回事? ...

我跟你的现象一样啊,你的问题解决了吗?
作者: lihh    时间: 2019-8-1 12:48
1074292224 发表于 2019-6-28 11:36
运行rknn_transfer.py时报错:
--> Init runtime environment
E Model is not loaded yet, this interface  ...

请问你解决了吗   我也遇到同样的问题   
作者: lihh    时间: 2019-8-1 12:49
瓜瓜瓜 发表于 2019-7-12 15:20
运行python3 rknn_transfer.py 报错,请问怎么解决?

[root@localhost rknn_test]# python3 rknn_transfer ...

和23楼一样么
作者: hisping    时间: 2019-8-1 15:54
lihh 发表于 2019-8-1 12:49
和23楼一样么

rknn_test.zip已更新,可以在rknn-toolkit 1.0.0运行
作者: lihh    时间: 2019-8-1 16:01
hisping 发表于 2019-8-1 15:54
rknn_test.zip已更新,可以在rknn-toolkit 1.0.0运行

五分钟之前更新的吗   哈哈哈  
是不是有太多想复制这个demo的人问这个问题
感谢版主帮忙解决这个问题
谢谢
作者: lyc202019    时间: 2019-8-13 10:55
C:\Users\Administrator\Desktop\微信图片_20190813105303.png
作者: lyc202019    时间: 2019-8-13 11:12
no module named 'rknn'.
这个错误怎么解决?
作者: troy    时间: 2019-8-13 14:43
lyc202019 发表于 2019-8-13 11:12
no module named 'rknn'.
这个错误怎么解决?

按照wiki,安装下开发环境
作者: lyc202019    时间: 2019-8-13 16:24
Could not connect to any X display
这个问题怎么解决?
作者: lyc202019    时间: 2019-8-13 16:27
troy 发表于 2019-8-13 14:43
按照wiki,安装下开发环境

谢谢,找到了,安装rknn-api,rknn_took,
作者: troy    时间: 2019-8-13 17:15
lyc202019 发表于 2019-8-13 16:24
Could not connect to any X display
这个问题怎么解决?

必须要在界面下才能显示,命令行登录是不能显示的,就会报错。
作者: lyc202019    时间: 2019-8-13 17:32
troy 发表于 2019-8-13 17:15
必须要在界面下才能显示,命令行登录是不能显示的,就会报错。

我安装了xrdp,使用远程桌面登录的。是有界面的




欢迎光临 Toybrick (http://t.rock-chips.com/) Powered by Discuz! X3.3