1,最好在Conda下新建一个虚拟环境进行安装。
Anaconda 官网下载地址:https://www.anaconda.com/download/
配置conda环境变量:
控制面板\系统和安全\系统\高级系统设置\环境变量\用户变量\PATH
中添加 **anaconda的安装目录的Scripts文件夹**,
比如我的路径是D:\rjaz\anaconda\az\Scripts, 看个人安装路径不同需要自己调整
2,配置conda源
https://www.cnblogs.com/tianbushengfuziwanguruchangye/p/15667415.html
激活conda
https://blog.csdn.net/hejp_123/article/details/92151293
3,配置基础Python环境为Python3.6
在虚拟环境下使用以下命令新建一个RKNN环境,如下:
conda create --name=rkmd python=3.6.8
4,执行以下命令进入虚拟环境:
conda activate rkmd
进入虚拟环境后,再执行以下命令安装深度学习框架,如Tensorflow,Pytorch,Keras等。
pip install tensorflow==1.14.0
pip install torch==1.9.0+cpu torchvision==0.10.0+cpu -f https://download.pytorch.org/whl/torch_stable.html --user
pip install mxnet==1.5.0
pip install opencv-python
pip install gluoncv
pip install lmdb==0.95
下载rknn安装包rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl,cd 转到安装包目录位置下,执行以下命令进行安装。
pip install rknn_toolkit-1.6.0-cp36-cp36m-win_amd64.whl
4,检测rknn是否安装成功,输入以下命令:
python
from rknn.api import RKNN
若无报错则安装RKNN成功
5,案例使用,模型转换:
使用的模型出自以下:https://github.com/bubbliiiing/mobilenet-ssd-keras/releases/download/v1.0/mobilenet_ssd_weights.h5 权重进一步训练生成的模型。训练环境为tf1.13+keras2.1.5
注意,在保存权重时需要将网络与权重参数一起保存,在保存函数中将save_weights_only设置为False即可,如下所示。
后面首先需要对于Keras训练出的H5权重进行转换生成pb文件,代码如下:
from nets.ssd_training import MultiboxLoss, get_lr_scheduler
from keras.models import load_model
import tensorflow as tf
import os
from keras import backend as K
from tensorflow.python.framework import graph_util, graph_io
from tensorflow.python.platform import gfile
#h5topb
def h5_to_pb(h5_weight_path, output_dir, out_prefix="output_", log_tensorboard=True):
if not os.path.exists(output_dir):
os.mkdir(output_dir)
h5_model = load_model(h5_weight_path,custom_objects={'compute_loss':MultiboxLoss(num_classes=9, neg_pos_ratio=3.0).compute_loss})
out_nodes = []
for i in range(len(h5_model.outputs)):
out_nodes.append(out_prefix + str(i + 1))
tf.identity(h5_model.output[i], out_prefix + str(i + 1))
model_name = os.path.splitext(os.path.split(h5_weight_path)[-1])[0] + '.pb'
sess = K.get_session()
init_graph = sess.graph.as_graph_def()
main_graph = graph_util.convert_variables_to_constants(sess, init_graph, out_nodes)
graph_io.write_graph(main_graph, output_dir, name=model_name, as_text=False)
def read_pb(GRAPH_PB_PATH):
with tf.Session() as sess:
print("load graph!!!")
with gfile.FastGFile(GRAPH_PB_PATH, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
for i, n in enumerate(graph_def.node):
print("Name of the node - %s" % n.name)
h5_to_pb(h5_weight_path='./testrknn.h5', output_dir='./')
read_pb('./testrknn.pb')
在终端中将打印生成的pb文件模型的各个节点的名称,部分如下所示,非常重要,在模型转换时需要用到。
之后进入rknn的虚拟环境,输入以下指令进入可视化转换界面,如下所示::
python -m rknn.bin.visualization
查看模型结构:https://netron.app/
本文只记录,避免以后复现找不到资料。