rk3568 RKNN依赖配置
PC : Ubuntu 18.0+
rknn平台:RK3568
Python版本:3.6.x
安装rknn-toolkit2
1、下载RKNN_SDK或RK3568源码SDK,cd进入rknn-toolkit2目录
2、运行pip安装库:pip3 install - r doc/requirement.txt
3、pip安装轮子(.whl):pip3 install rknn_toolkit2-*-cp36-cp36m-linux_x86_64.whl
4、前两步完成后,运行python3,在python shell里输入from rknn.api import RKNN
安装成功则导入。否则就是安装失败
-出现-可能遇到的问题
requirement.txt
1、如果不是python3.6.x版本的话,可能会成功安装numpy.1.13.3安装问题,尝试使用python3.安装失败。 6.x版本,可以避免大量的问题。
2、pip3 install onnxoptimizer==0.1.0
报错:
命令 “/usr/bin/python3 -u -c ”import setuptools, tokenize;__file__=‘/tmp/pip-build-0mfmov8a/onnx/setup.py’;f=getattr(tokenize, ‘open’, open)( __file__);code=f.read().replace(‘rn’, ‘n’);f.close();exec(compile(code, __file__, ‘exec’))“ install --record /tmp/pip-fmzr5hzv-record/install-record.txt --single-version-externally-managed --compile --user --prefix=” 失败,错误代码 1 在 /tmp/pip-build-0mfmov8a/onnx /
解决方案:
试用安装依赖解决=》sudo apt-get install -y libprotobuf-dev protobuf-compiler python3-scipy
sudo apt-get install libssl-dev libffi-dev python-dev build-essential libxml2-dev libxslt1-
dev完成后,卸载(卸载)之前安装的库。
然后再重新安装:sudo pip3 install onnxoptimizer==0.1。0
3、p库提示错误没有解决方案(能安装,但安装能刷新):破解版本限制。
4、opencv-
ip3:报错:
回溯(最后一次调用):
文件“《string》”,第 1 行,在 《module》
文件“/tmp/pip-build-ey0xc_0y/opencv-python/setup.py”,第 9 行,在 《module》 中
导入skbuild
ModuleNotFoundError: No module named ‘skbuild’
Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-ey0xc_0y/opencv-python/
解决:这里的skbuild全名为scikit_build,先安装这个库。
rknnkit2-*-cp36-cp36m-linux_x86_64.whl
安装,检查pip版本,否则可能没有版本。
pip3 --version
低(9或10)
升级pip
pip3 install --upgrade pip
查看pip版本:pip 21.3.1
可以开始安装.whl文件了
安装完成requirement.txt和rknn_toolkit2-*-cp36-cp36m-linux_x86_64.whl之后,进入python shell测试
root@root:/$ 蟒蛇3
Python 3.6.9(默认,2021 年 12 月 8 日,21:08:43)
Linux 上的 [GCC 8.4.0]
键入“帮助”、“版权”、“信用”或“许可证”以获取更多信息。
》》》 from rknn.api import RKNN
==》报错:
ModuleNotFoundError: No module named ‘numpy.core._multiarray_umath’
ImportError: numpy.core.multiarray failed to import
以上异常是以下异常的直接原因:
Traceback (最近一次调用最后):
文件“《frozen importlib._bootstrap》”,第 968 行,在 _find_and_load
SystemError:《class ‘_frozen_importlib._ModuleLockManager’》 返回了带有错误集
RuntimeError 的结果:
ImportError: numpy.core.umath 无法导入
ImportError: numpy.core.umath 无法导入
2021-12-17 09:13:32.275457: F tensorflow/python/lib/core/bfloat16.cc:675] 检查失败:PyBfloat16_Type .tp_base=nullptr
已放弃(核心已转储)
=》解决:这是numpy版本与rknn当前不=检查,numpy版本
pip3 freeze | grep
numpy1.16.6,则卸载重装
pip3 uninstall numpy
pip3 install numpy==1.16.6
再次尝试用python导入rknn,应该就可以了。如果
在与PC相关的AIO-3568J NPU平台上测试
运行、部署AIO-3568J 环境:更新librknnrt.so及运行rknn_server
--Linux PC端:
adb push RKNN_SDK/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
adb push RKNN_SDK/Linux/librknn_api/aarch64 /librknnrt.so /usr/lib/
adb push RKNNSDK/Linux/librknnapi/aarch64/librknn_api.so /usr/lib/
#板子的终端终端运行rknn_server
chmod +x /usr/bin/rknn_server
/usr/bin/rknn_server
2、然后在PC上修改examples/ tflite/mobilenet_v1/test.py文件,在其中添加目标平台
|+++++++++++++++++++++++++++++++++++|
diff --git a/test.py b/test.py
index 61ad668..51a01e2 100644
--- a/test.py
+++ b/test.py
@@ -62,7 +62,7 @@ if __name__ == ‘__main__’:
|+++++++++++++++++++++++++++++++++++++|
# 初始化运行环境
print(‘--》 初始化运行环境’)
- ret = rknn.init_runtime()
+ ret = rknn.init_runtime(target=‘rk3568’)
if ret != 0:
print(‘初始化运行环境失败’ )
exit(ret)
3、PC端运行test.py (venv) firefly@T-chip:~/rknn-toolkit2-1.1.0b0/examples/tflite/mobilenet_v1$ python3 test.py
运行test.py会出现一些问题
1 、
Q:E build: ImportError: libprotobuf.so.10: cannot open shared object file: No such file or directory
A:动态依赖库不存在,在/usr/lib/下找不到对应的依赖文件(.so)如果文件实际存在/lib/下,则如果自己添加usr/local/软连接到/lib/下即可,这样的文件实际不存在,可以自行安装
最新版本:
、编译安装解压、开始编译sudo apt install autoconf 。/autogen.sh 。/configure--prefix=/usrprotobuf #为了便于
进入目录管理二# -j4多核编译魔梯速度sudo make install三、建立软连接完成之后,动态库的安装位置在/usr/local/protobuf/lib/
sudo ln -s /usr/local/protobuf/lib/libprotobuf.so.30.0.1 /usr/lib/libprotobuf.so.30
2、
Q:E build: ImportError: /home/raysees/anaconda3/envs/rktool/ lib/python3.lib6/site-packages/rknn/api/lib/hardware/DOLPHIN/linux-x86_64/cp36/librknnc.so: undefined symbol: _ZNK6google8protobuf7Message9SpaceUsedEv
A:(Ubuntu 20)暂时
可以解决问题
A:(Ubuntu 18)重装1系统后就没有出现问题,因为18自带的python环境是rknn-toolkit2/2系/这个的python3.6。
部署R模型到rk3566进行推演
自定义
脚本通过rknnSDK的程序编译脚本实现编译,可以通过各种模型的编译。以onnx下的YOLO模型
1、示例先修改这个文件:
build- linux.sh:将把GCC_COMPILER修改为合适的交叉编译器,这里rk3568为aarch64-linux-gnu
#for aarch64
GCC_COMPILER=aarch64-linux-gnu
‘rknn_yolov3_demo’可以替换为任意名称,这是编译后进行的程序名称。对,这只是一个名字,特别是这个字符串。
add_executable(rknn_yolov3_demo
src/main.cc
)
target_link_libraries(rknn_yolov3_demo “-Wl,--allow-shlib-Bundefined”
${RKNN_API_}
${OpenCV_LIBS}
)
#和库
集(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/rknn_yolov3_demo_${CMAKE_SYSTEM_NAME})
install(TARGETS rknn_yolov3_demo DESTINATION 。/)
install(DIRECTORY model DESTINATION 。/)
install(PROGRAMS ${RKNN_API_LIB} DESTINATION lib)
install(PROGRAMS ${RKNN_RT_LIB } DESTINATION lib)
2、编写主程序main.cc
这是运行推演程序的入口,我们利用这个cpp文件来完成导入、导入模型、输入、输出、模型推演、以及演演结果数据处理等工作。
通用main.cc找到推演,提示opencv未完成。请将rknnSDK下的Linux放在build-linux.sh的。../。../路径下,即上两层目录父。
//includes
#include 《stdio.h》
#include 《stdint.h》
#include 《stdlib .h》
#include 《fstream》
#include 《iostream》
#include 《sys/time.h》
#include 《string.h》
#include “opencv2/core/core.hpp”
#include “opencv2/imgproc.hpp”
# include “opencv2/imgcodecs.hpp”
#include “rknn_api.h”
#include 《chrono》
using namespace std;
使用命名空间简历;
使用命名空间计时;
printf(“index=%d name=%s n_dims=%d dims=[%d %d %d %d] n_elems=%d size=%d fmt=%d type=%d qnt_type=%d fl=% d zp=%d scale=%fn”,
attr-》index,attr-》name,attr-》n_dims,attr-》dims[0],attr-》dims[1],attr-》dims[ 2],attr-》dims[3],
attr-》n_elems,attr-》size,0,attr-》type,attr-》qnt_type,attr-》fl,attr-》zp,attr-》scale);
}
//加载模型rknn
static unsigned char* load_model(const char*filename,int* model_size){
FILE* fp = fopen(filename,“rb”);
if(fp==nullptr){
printf(“foen %s fail n”,filename);
返回空值;
}
fseek(fp,0,SEEK_END);
int model_len = ftell(fp);
无符号字符 * 模型 = (无符号字符 *)malloc(model_len);
fseek(fp,0,SEEK_SET);
if(model_len != fread(model,1,model_len,fp)){
printf(“fread %s failed n”,filename);
免费(模型);
返回空值;
}
*model_size = model_len;
如果(fp){
fclose(fp);
}
返回模型;
}
int main(int argc, char** argv){
printf(“hello rknn”);
常量 int MODEL_IN_WIDTH = 640;
常量 int MODEL_IN_HEIGHT = 640;
常量 int MODEL_IN_CHANNELS = 3;
rknn_context ctx;//rknn时间结构体,可以使用rknn模型的运行输出
诠释;// 记录API的运行结果,使用异常处理等
int model_len = 0;
无符号字符 * 模型;
// 从需要处理外部图片nn的图片模型文件和。
constcharv* model_path = [1]
const char * img_path = argv[2];
//载入图片文件
cv::Mat orig_img = imread(img_path , cv::IMREAD_COLOR);
if(orig_img.empty()){
printf(“cv::imread %s failedn”,img_path);
返回-1;
}
cv::Mat img = orig_img.clone();
if(orig_img.cols != MODEL_IN_WIDTH || orig_img.rows != MODEL_IN_HEIGHT){
printf(“resize %d %d to %d %dn”,orig_img.cols,orig_img.rows,MODEL_IN_WIDTH,MODEL_IN_HEIGHT);
cv::resize(orig_img,img,cv::Size(MODEL_IN_WIDTH,MODEL_IN_HEIGHT),(0,0),(0,0),cv::INTER_LINEAR);
}
//载入RKNN模型
model = load_model(model_path,&model_len);
ret = rknn_init(&ctx,model,model_len,0&RKNN_FLAG_COLLECT_PERF_MASK,NULL);
if(ret 《 0){
printf(“rknn_init failed !ret code:%dn”,ret);
返回-1;
}
//获取输入、输出信息
rknn_input_output_num io_num;
ret = rknn_query(ctx,RKNN_QUERY_IN_OUT_NUM,&io_num,sizeof(io_num));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in_out_num failed, ret code=%dn”,ret);
返回-1;
}
printf(“模型输入数量: %d, 输出数量: %d n”,io_num.n_input,io_num.n_output);
// 获取输入张量, 》》 网络结构
printf(“输入张量:n”);
rknn_tensor_attr input_attrs[io_num.n_input];
memset(input_attrs,0,sizeof(input_attrs));
for(int i = 0 ; i 《 io_num .n_input ; i++){
input_attrs .index = i;
ret = rknn_query(ctx,RKNN_QUERY_INPUT_ATTR,&(input_attrs ),sizeof(rknn_tensor_attr));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in failed !ret code : %dn”,ret);
返回-1;
}
printRKNNTensor(&(input_attrs));
}
//获取输出tensor, 》》网络结构
printf(“output tensors:n”);
rknn_tensor_attr output_attrs[io_num.n_output];
memset(output_attrs,0,sizeof(output_attrs));
for(int i = 0 ; i 《 io_num .n_output ; i++){
output_attrs.index = i;
ret = rknn_query(ctx,RKNN_QUERY_OUTPUT_ATTR,&(output_attrs),sizeof(rknn_tensor_attr));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in failed ! ret code : %dn”,ret);
return -1;
}
printRKNNTensor(&(output_attrs));
}
//设置输入值
rknn_input inputs[1];
memset(inputs,0,sizeof(inputs));
inputs[0].index = 0;
inputs[0].type = RKNN_TENSOR_UINT8;
inputs[0].size = img.cols * img.rows * img.channels();
inputs[0].fmt = RKNN_TENSOR_NHWC;
inputs[0].buf = img.data;
ret = rknn_inputs_set(ctx,io_num.n_input,inputs);
if(ret 《 0){
printf(“rknn_input_set failed ! ret code:%dn”,ret);
return -1;
}
//运行模型,跑模型
printf(“rknn run n”);
ret = rknn_run(ctx,nullptr);
if(ret 《 0){
printf(“rknn run failed ! ret code:%dn”,ret);
return -1;
}
//模型跑完后,(计算完之后)
//获取模型输出,tensor等
rknn_output outputs[1];
memset(outputs,0,sizeof(outputs));
outputs[0].want_float = 1;
ret = rknn_outputs_get(ctx,1,outputs,NULL);
if(ret 《0 ){
printf(“rknn_outputs_get failed! ret code=%dn”,ret);
return -1;
}
printf(“######out : size:%d”,outputs[0].size);
//统计模型运行时间
//释放rknn outputs
rknn_outputs_release(ctx,1,outputs);
//释放模型
if(ctx 》= 0){
rknn_destroy(ctx);
}
如果(模型){
免费(模型);
}
返回 0;
}
rk3568 RKNN依赖配置
PC : Ubuntu 18.0+
rknn平台:RK3568
Python版本:3.6.x
安装rknn-toolkit2
1、下载RKNN_SDK或RK3568源码SDK,cd进入rknn-toolkit2目录
2、运行pip安装库:pip3 install - r doc/requirement.txt
3、pip安装轮子(.whl):pip3 install rknn_toolkit2-*-cp36-cp36m-linux_x86_64.whl
4、前两步完成后,运行python3,在python shell里输入from rknn.api import RKNN
安装成功则导入。否则就是安装失败
-出现-可能遇到的问题
requirement.txt
1、如果不是python3.6.x版本的话,可能会成功安装numpy.1.13.3安装问题,尝试使用python3.安装失败。 6.x版本,可以避免大量的问题。
2、pip3 install onnxoptimizer==0.1.0
报错:
命令 “/usr/bin/python3 -u -c ”import setuptools, tokenize;__file__=‘/tmp/pip-build-0mfmov8a/onnx/setup.py’;f=getattr(tokenize, ‘open’, open)( __file__);code=f.read().replace(‘rn’, ‘n’);f.close();exec(compile(code, __file__, ‘exec’))“ install --record /tmp/pip-fmzr5hzv-record/install-record.txt --single-version-externally-managed --compile --user --prefix=” 失败,错误代码 1 在 /tmp/pip-build-0mfmov8a/onnx /
解决方案:
试用安装依赖解决=》sudo apt-get install -y libprotobuf-dev protobuf-compiler python3-scipy
sudo apt-get install libssl-dev libffi-dev python-dev build-essential libxml2-dev libxslt1-
dev完成后,卸载(卸载)之前安装的库。
然后再重新安装:sudo pip3 install onnxoptimizer==0.1。0
3、p库提示错误没有解决方案(能安装,但安装能刷新):破解版本限制。
4、opencv-
ip3:报错:
回溯(最后一次调用):
文件“《string》”,第 1 行,在 《module》
文件“/tmp/pip-build-ey0xc_0y/opencv-python/setup.py”,第 9 行,在 《module》 中
导入skbuild
ModuleNotFoundError: No module named ‘skbuild’
Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-ey0xc_0y/opencv-python/
解决:这里的skbuild全名为scikit_build,先安装这个库。
rknnkit2-*-cp36-cp36m-linux_x86_64.whl
安装,检查pip版本,否则可能没有版本。
pip3 --version
低(9或10)
升级pip
pip3 install --upgrade pip
查看pip版本:pip 21.3.1
可以开始安装.whl文件了
安装完成requirement.txt和rknn_toolkit2-*-cp36-cp36m-linux_x86_64.whl之后,进入python shell测试
root@root:/$ 蟒蛇3
Python 3.6.9(默认,2021 年 12 月 8 日,21:08:43)
Linux 上的 [GCC 8.4.0]
键入“帮助”、“版权”、“信用”或“许可证”以获取更多信息。
》》》 from rknn.api import RKNN
==》报错:
ModuleNotFoundError: No module named ‘numpy.core._multiarray_umath’
ImportError: numpy.core.multiarray failed to import
以上异常是以下异常的直接原因:
Traceback (最近一次调用最后):
文件“《frozen importlib._bootstrap》”,第 968 行,在 _find_and_load
SystemError:《class ‘_frozen_importlib._ModuleLockManager’》 返回了带有错误集
RuntimeError 的结果:
ImportError: numpy.core.umath 无法导入
ImportError: numpy.core.umath 无法导入
2021-12-17 09:13:32.275457: F tensorflow/python/lib/core/bfloat16.cc:675] 检查失败:PyBfloat16_Type .tp_base=nullptr
已放弃(核心已转储)
=》解决:这是numpy版本与rknn当前不=检查,numpy版本
pip3 freeze | grep
numpy1.16.6,则卸载重装
pip3 uninstall numpy
pip3 install numpy==1.16.6
再次尝试用python导入rknn,应该就可以了。如果
在与PC相关的AIO-3568J NPU平台上测试
运行、部署AIO-3568J 环境:更新librknnrt.so及运行rknn_server
--Linux PC端:
adb push RKNN_SDK/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
adb push RKNN_SDK/Linux/librknn_api/aarch64 /librknnrt.so /usr/lib/
adb push RKNNSDK/Linux/librknnapi/aarch64/librknn_api.so /usr/lib/
#板子的终端终端运行rknn_server
chmod +x /usr/bin/rknn_server
/usr/bin/rknn_server
2、然后在PC上修改examples/ tflite/mobilenet_v1/test.py文件,在其中添加目标平台
|+++++++++++++++++++++++++++++++++++|
diff --git a/test.py b/test.py
index 61ad668..51a01e2 100644
--- a/test.py
+++ b/test.py
@@ -62,7 +62,7 @@ if __name__ == ‘__main__’:
|+++++++++++++++++++++++++++++++++++++|
# 初始化运行环境
print(‘--》 初始化运行环境’)
- ret = rknn.init_runtime()
+ ret = rknn.init_runtime(target=‘rk3568’)
if ret != 0:
print(‘初始化运行环境失败’ )
exit(ret)
3、PC端运行test.py (venv) firefly@T-chip:~/rknn-toolkit2-1.1.0b0/examples/tflite/mobilenet_v1$ python3 test.py
运行test.py会出现一些问题
1 、
Q:E build: ImportError: libprotobuf.so.10: cannot open shared object file: No such file or directory
A:动态依赖库不存在,在/usr/lib/下找不到对应的依赖文件(.so)如果文件实际存在/lib/下,则如果自己添加usr/local/软连接到/lib/下即可,这样的文件实际不存在,可以自行安装
最新版本:
、编译安装解压、开始编译sudo apt install autoconf 。/autogen.sh 。/configure--prefix=/usrprotobuf #为了便于
进入目录管理二# -j4多核编译魔梯速度sudo make install三、建立软连接完成之后,动态库的安装位置在/usr/local/protobuf/lib/
sudo ln -s /usr/local/protobuf/lib/libprotobuf.so.30.0.1 /usr/lib/libprotobuf.so.30
2、
Q:E build: ImportError: /home/raysees/anaconda3/envs/rktool/ lib/python3.lib6/site-packages/rknn/api/lib/hardware/DOLPHIN/linux-x86_64/cp36/librknnc.so: undefined symbol: _ZNK6google8protobuf7Message9SpaceUsedEv
A:(Ubuntu 20)暂时
可以解决问题
A:(Ubuntu 18)重装1系统后就没有出现问题,因为18自带的python环境是rknn-toolkit2/2系/这个的python3.6。
部署R模型到rk3566进行推演
自定义
脚本通过rknnSDK的程序编译脚本实现编译,可以通过各种模型的编译。以onnx下的YOLO模型
1、示例先修改这个文件:
build- linux.sh:将把GCC_COMPILER修改为合适的交叉编译器,这里rk3568为aarch64-linux-gnu
#for aarch64
GCC_COMPILER=aarch64-linux-gnu
‘rknn_yolov3_demo’可以替换为任意名称,这是编译后进行的程序名称。对,这只是一个名字,特别是这个字符串。
add_executable(rknn_yolov3_demo
src/main.cc
)
target_link_libraries(rknn_yolov3_demo “-Wl,--allow-shlib-Bundefined”
${RKNN_API_}
${OpenCV_LIBS}
)
#和库
集(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/rknn_yolov3_demo_${CMAKE_SYSTEM_NAME})
install(TARGETS rknn_yolov3_demo DESTINATION 。/)
install(DIRECTORY model DESTINATION 。/)
install(PROGRAMS ${RKNN_API_LIB} DESTINATION lib)
install(PROGRAMS ${RKNN_RT_LIB } DESTINATION lib)
2、编写主程序main.cc
这是运行推演程序的入口,我们利用这个cpp文件来完成导入、导入模型、输入、输出、模型推演、以及演演结果数据处理等工作。
通用main.cc找到推演,提示opencv未完成。请将rknnSDK下的Linux放在build-linux.sh的。../。../路径下,即上两层目录父。
//includes
#include 《stdio.h》
#include 《stdint.h》
#include 《stdlib .h》
#include 《fstream》
#include 《iostream》
#include 《sys/time.h》
#include 《string.h》
#include “opencv2/core/core.hpp”
#include “opencv2/imgproc.hpp”
# include “opencv2/imgcodecs.hpp”
#include “rknn_api.h”
#include 《chrono》
using namespace std;
使用命名空间简历;
使用命名空间计时;
printf(“index=%d name=%s n_dims=%d dims=[%d %d %d %d] n_elems=%d size=%d fmt=%d type=%d qnt_type=%d fl=% d zp=%d scale=%fn”,
attr-》index,attr-》name,attr-》n_dims,attr-》dims[0],attr-》dims[1],attr-》dims[ 2],attr-》dims[3],
attr-》n_elems,attr-》size,0,attr-》type,attr-》qnt_type,attr-》fl,attr-》zp,attr-》scale);
}
//加载模型rknn
static unsigned char* load_model(const char*filename,int* model_size){
FILE* fp = fopen(filename,“rb”);
if(fp==nullptr){
printf(“foen %s fail n”,filename);
返回空值;
}
fseek(fp,0,SEEK_END);
int model_len = ftell(fp);
无符号字符 * 模型 = (无符号字符 *)malloc(model_len);
fseek(fp,0,SEEK_SET);
if(model_len != fread(model,1,model_len,fp)){
printf(“fread %s failed n”,filename);
免费(模型);
返回空值;
}
*model_size = model_len;
如果(fp){
fclose(fp);
}
返回模型;
}
int main(int argc, char** argv){
printf(“hello rknn”);
常量 int MODEL_IN_WIDTH = 640;
常量 int MODEL_IN_HEIGHT = 640;
常量 int MODEL_IN_CHANNELS = 3;
rknn_context ctx;//rknn时间结构体,可以使用rknn模型的运行输出
诠释;// 记录API的运行结果,使用异常处理等
int model_len = 0;
无符号字符 * 模型;
// 从需要处理外部图片nn的图片模型文件和。
constcharv* model_path = [1]
const char * img_path = argv[2];
//载入图片文件
cv::Mat orig_img = imread(img_path , cv::IMREAD_COLOR);
if(orig_img.empty()){
printf(“cv::imread %s failedn”,img_path);
返回-1;
}
cv::Mat img = orig_img.clone();
if(orig_img.cols != MODEL_IN_WIDTH || orig_img.rows != MODEL_IN_HEIGHT){
printf(“resize %d %d to %d %dn”,orig_img.cols,orig_img.rows,MODEL_IN_WIDTH,MODEL_IN_HEIGHT);
cv::resize(orig_img,img,cv::Size(MODEL_IN_WIDTH,MODEL_IN_HEIGHT),(0,0),(0,0),cv::INTER_LINEAR);
}
//载入RKNN模型
model = load_model(model_path,&model_len);
ret = rknn_init(&ctx,model,model_len,0&RKNN_FLAG_COLLECT_PERF_MASK,NULL);
if(ret 《 0){
printf(“rknn_init failed !ret code:%dn”,ret);
返回-1;
}
//获取输入、输出信息
rknn_input_output_num io_num;
ret = rknn_query(ctx,RKNN_QUERY_IN_OUT_NUM,&io_num,sizeof(io_num));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in_out_num failed, ret code=%dn”,ret);
返回-1;
}
printf(“模型输入数量: %d, 输出数量: %d n”,io_num.n_input,io_num.n_output);
// 获取输入张量, 》》 网络结构
printf(“输入张量:n”);
rknn_tensor_attr input_attrs[io_num.n_input];
memset(input_attrs,0,sizeof(input_attrs));
for(int i = 0 ; i 《 io_num .n_input ; i++){
input_attrs .index = i;
ret = rknn_query(ctx,RKNN_QUERY_INPUT_ATTR,&(input_attrs ),sizeof(rknn_tensor_attr));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in failed !ret code : %dn”,ret);
返回-1;
}
printRKNNTensor(&(input_attrs));
}
//获取输出tensor, 》》网络结构
printf(“output tensors:n”);
rknn_tensor_attr output_attrs[io_num.n_output];
memset(output_attrs,0,sizeof(output_attrs));
for(int i = 0 ; i 《 io_num .n_output ; i++){
output_attrs.index = i;
ret = rknn_query(ctx,RKNN_QUERY_OUTPUT_ATTR,&(output_attrs),sizeof(rknn_tensor_attr));
if(ret != RKNN_SUCC){
printf(“rknn_query get_in failed ! ret code : %dn”,ret);
return -1;
}
printRKNNTensor(&(output_attrs));
}
//设置输入值
rknn_input inputs[1];
memset(inputs,0,sizeof(inputs));
inputs[0].index = 0;
inputs[0].type = RKNN_TENSOR_UINT8;
inputs[0].size = img.cols * img.rows * img.channels();
inputs[0].fmt = RKNN_TENSOR_NHWC;
inputs[0].buf = img.data;
ret = rknn_inputs_set(ctx,io_num.n_input,inputs);
if(ret 《 0){
printf(“rknn_input_set failed ! ret code:%dn”,ret);
return -1;
}
//运行模型,跑模型
printf(“rknn run n”);
ret = rknn_run(ctx,nullptr);
if(ret 《 0){
printf(“rknn run failed ! ret code:%dn”,ret);
return -1;
}
//模型跑完后,(计算完之后)
//获取模型输出,tensor等
rknn_output outputs[1];
memset(outputs,0,sizeof(outputs));
outputs[0].want_float = 1;
ret = rknn_outputs_get(ctx,1,outputs,NULL);
if(ret 《0 ){
printf(“rknn_outputs_get failed! ret code=%dn”,ret);
return -1;
}
printf(“######out : size:%d”,outputs[0].size);
//统计模型运行时间
//释放rknn outputs
rknn_outputs_release(ctx,1,outputs);
//释放模型
if(ctx 》= 0){
rknn_destroy(ctx);
}
如果(模型){
免费(模型);
}
返回 0;
}
举报