瑞芯微Rockchip开发者社区
直播中

李晓鹏

7年用户 1260经验值
私信 关注
[问答]

怎样配置rk3568 RKNN呢

怎样配置rk3568 RKNN呢?有哪些配置步骤?

回帖(1)

武妹

2022-3-2 17:41:38
  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;
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分