RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

2023-05-16

RKNN-Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估

文章目录

  • RKNN-Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估
    • 一、基本知识
    • 二、环境部署
      • 2.1环境准备
      • 2.2安装RKNN-Toolkit(以Python3.6为例)
      • 2.3注意事项:
    • 三、Tensorflow模型转换、推理及评估
      • 3.1在PC上仿真运行
      • 3.2在RV1126上运行(利用Rockchip NPU—神经网络处理器)

一、基本知识

在使用 RKNN SDK 之前,用户首先需要使用 RKNN-Toolkit 工具将用户的模型转换为 RKNN
模型,用户可以在 https://github.com/rockchip-linux/rknn-toolkit 获取工具的完整
安装包及使用文档。
成功转换生成 RKNN 模型之后,用户可以先通过 RKNN-Toolkit 连接 RK1808 等开发板进行联
机调试,确保模型的精度性能符合要求。
得到 RKNN 模型文件之后,用户可以选择使用 C 或 Python 接口在 RK1808 等平台开发应用

RKNN-Toolkit 是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推理和性能评估的 开发套件

  1. 模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、Darknet、Pytorch、MXNet和 Keras 模型转成 RKNN 模型,支持 RKNN 模型导入导出,后续能够在Rockchip NPU 平台上加载使用。从1.2.0版本开始支持多输入模型。从1.3.0版本开始支持Pytorch和MXNet。从 1.6.0 版本开始支持 Keras 框架模型,并支持 TensorFlow 2.0 导出的 H5 模型。
  2. 量化功能:支持将浮点模型转成量化模型,目前支持的量化方法有非对称量化( asymmetric_quantized-u8 ), 动 态 定 点 量 化 ( dynamic_fixed_point-8 和dynamic_fixed_point-16)。从 1.0.0 版本开始,RKNN-Toolkit 开始支持混合量化功能。
  3. 模型推理:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果;也可以将RKNN 模型分发到指定的 NPU 设备上进行推理。
  4. 性能评估:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型,并评估模型性能(包括总耗时和每一层的耗时);也可以将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能。
  5. 内存评估:评估模型运行时对系统和 NPU 内存的消耗情况。使用该功能时,必须将 RKNN模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息。从 0.9.9 版本开始支持该功能。
  6. 模型预编译:通过预编译技术生成的 RKNN 模型可以减少在硬件平台上的加载时间。对于部分模型,还可以减少模型尺寸。但是预编译后的 RKNN 模型只能在 NPU 设备上运行。目前只有 x86_64 Ubuntu 平台支持直接从原始模型生成预编译 RKNN 模型。RKNN-Toolkit从 0.9.5 版本开始支持模型预编译功能,并在 1.0.0 版本中对预编译方法进行了升级,升级后的预编译模型无法与旧驱动兼容。从1.4.0版本开始,也可以通过NPU设备将普通RKNN模型转成预编译 RKNN 模型,详情请参考接口 export_rknn_precompile_model 的使用说明。
  7. 模型分段:该功能用于多模型同时运行的场景下,可以将单个模型分成多段在 NPU 上执2行,借此来调节多个模型占用 NPU 的执行时间,避免因为一个模型占用太多执行时间,而使其他模型得不到及时执行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。目前,只有RK1806/RK1808/RV1109/RV1126 芯片支持该功能,且 NPU 驱动版本要大于 0.9.8。
  8. 自定义算子功能:如果模型含有 RKNN-Toolkit 不支持的算子(operator),那么在模型转换阶段就会失败。这时候可以使用自定义算子功能来添加不支持的算子,从而使模型能正常转换和运行。RKNN-Toolkit 从 1.2.0 版本开始支持该功能。自定义算子的使用和开发请参考《Rockchip_Developer_Guide_RKNN_Toolkit_Custom_OP_CN》文档。自定义算子目前只支持 TensorFlow 框架。
  9. 量化精度分析功能:该功能将给出模型量化前后每一层推理结果的欧氏距离或余弦距离,以分析量化误差是如何出现的,为提高量化模型的精度提供思路。该功能从 1.3.0 版本开始支持。1.4.0 版本增加逐层量化精度分析子功能,将每一层运行时的输入指定为正确的浮点值,以排除逐层误差积累,能够更准确的反映每一层自身受量化的影响。
  10. 可视化功能:该功能以图形界面的形式呈现 RKNN-Toolkit 的各项功能,简化用户操作步骤。用户可以通过填写表单、点击功能按钮的形式完成模型的转换和推理等功能,而不需要再去手动编写脚本。有关可视化功能的具体使用方法请参考《Rockchip_User_Guide_RKNN_Toolkit_Visualization_CN》文档。1.3.0 版本开始支持该功能。1.4.0 版本完善了对多输入模型的支持,并且支持 RK1806, RV1109, RV1126 等新的 RK NPU 设备。1.6.0 版本增加对 Keras 框架的支持。
  11. 模型优化等级功能:RKNN-Toolkit 在模型转换过程中会对模型进行优化,默认的优化选项可能会对模型精度产生一些影响。通过设置优化等级,可以关闭部分或全部优化选项。有关优化等级的具体使用方法请参考 config 接口中 optimization_level 参数的说明。该功能从 1.3.0 版本开始支持。
  12. 模型加密功能:RKNN-Toolkit 从 1.6.0 版本开始支持模型加密功能。

二、环境部署

2.1环境准备

本开发套件支持运行于 Ubuntu、Windows、MacOS、Debian 等操作系统。需要满足以下运行 环境要求:

操作系统版本Ubuntu16.04(x64)及以上 Windows 7(x64)及以上 Mac OS X 10.13.5(x64)及以上 Debian 9.8(aarch64)及以上
Python 版本3.5/3.6/3.7
Python 库依赖‘numpy == 1.16.3’
‘scipy == 1.3.0’
‘Pillow == 5.3.0’
‘h5py == 2.8.0’
‘lmdb == 0.93’
‘networkx == 1.11’
‘flatbuffers == 1.10’,
‘protobuf == 3.11.2’
‘onnx == 1.6.0’
‘onnx-tf == 1.2.1’
‘flask == 1.0.2’
‘tensorflow == 1.11.0’ or ‘tensorflow-gpu’
‘dill0.2.8.2’
‘ruamel.yaml == 0.15.81’
‘psutils == 5.6.2’
‘ply == 3.11’
‘requests == 2.22.0’
‘torch == 1.2.0’ or ‘torch == 1.5.1’ or
'torch
1.6.0’
‘mxnet == 1.5.0’

本文所采用环境为:Ubuntu18.04.6 (x64),Python3.6.9,RV1126 EVB板

亲测Ubuntu20.04.5不能使用,Python版本不要高过3.7,不要低于3.6

2.2安装RKNN-Toolkit(以Python3.6为例)

  • 安装Python3.6
sudo apt-get install python3.6
  • 安装pip3
sudo apt-get install python3-pip
  • 获取RKNN-Toolkit:rockchip-linux/rknn-toolkit at v1.6.0 (github.com)

  • 安装Python依赖

pip3 install -i http://pypi.douban.com/simple/ tensorflow==1.11.0
pip3 install -i http://pypi.douban.com/simple/ mxnet==1.5.0
pip3 install -i http://pypi.douban.com/simple/ torchvision==0.4.0
pip3 install -i http://pypi.douban.com/simple/ torch==1.5.1
pip3 install -i http://pypi.douban.com/simple/ opencv-python
pip3 install -i http://pypi.douban.com/simple/ gluoncv
  • 安装RKNN-Toolkit
sudo pip3 install -i http://pypi.douban.com/simple/ rknn_toolkit-1.6.0-cp36-cp36m-linux_x86_64.whl
  • 检查RKNN-Toolkit是否安装成功
rk@rk:~/rknn-toolkit-v1.6.0/package$ python3 
>>> from rknn.api import RKNN
>>> 

如果导入RKNN模块没有失败,说明安装成功

2.3注意事项:

  • 如果电脑中已经存在Python3的其他版本,自行查询版本共存方法,或者直接替换(可能出现问题,最直接的方法是重装Ubuntu)
  • 遇到版本不兼容现象,导致安装失败的,可以暂时不管,能导入模块即可,如果实在不行,就寻找版本号相差不大的替换
  • 如果你的Python3为Python3.7,则需在安装RKNN-Toolkit那一步中,将cp36替换成cp37即可
  • 对于没有想要的依赖版本,考虑更新pip和pip3的库

三、Tensorflow模型转换、推理及评估

3.1在PC上仿真运行

Linux x86_64 上的 RKNN-Toolkit 自带了一个 RK1808 的模拟器,可以用来仿真模型在 RK1808 上运行时的行为。

  • 进入模型目录
cd /home/wilson/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1
  • 执行test.py脚本
python3 test.py
  • 得到如下结果(包括创建RKNN对象;模型配置;加载TensorFlow模型;构建RKNN模型;导出RKNN模型;加载图片并推理;得到TOP5结果;评估模型性能;释放RKNN对象)
--> Loading model
W Use existed rule db file to convert tensorflow model.
done
--> Building model
W The target_platform is not set in config, using default target platform rk1808.
done
--> Init runtime environment
done
--> Running model
done
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
                               Performance                              
========================================================================
Layer ID    Name                                         Time(us)
57          openvx.tensor_transpose_3                    125
117         convolution.relu.pooling.layer2_2            204
115         convolution.relu.pooling.layer2_2            404
112         convolution.relu.pooling.layer2_2            416
110         convolution.relu.pooling.layer2_2            597
107         convolution.relu.pooling.layer2_2            245
105         convolution.relu.pooling.layer2_2            503
102         convolution.relu.pooling.layer2_2            326
100         convolution.relu.pooling.layer2_2            223
97          convolution.relu.pooling.layer2_2            166
95          convolution.relu.pooling.layer2_2            242
92          convolution.relu.pooling.layer2_2            291
90          convolution.relu.pooling.layer2_2            242
87          convolution.relu.pooling.layer2_2            162
85          convolution.relu.pooling.layer2_2            258
82          convolution.relu.pooling.layer2_2            316
80          convolution.relu.pooling.layer2_2            258
77          convolution.relu.pooling.layer2_2            316
75          convolution.relu.pooling.layer2_2            258
72          convolution.relu.pooling.layer2_2            316
70          convolution.relu.pooling.layer2_2            258
64          convolution.relu.pooling.layer2_2            316
60          convolution.relu.pooling.layer2_2            258
46          convolution.relu.pooling.layer2_2            316
28          convolution.relu.pooling.layer2_2            171
84          openvx.tensor_transpose_3                    48
34          convolution.relu.pooling.layer2_2            47
114         openvx.tensor_transpose_3                    6
69          convolution.relu.pooling.layer2_2            297
63          convolution.relu.pooling.layer2_2            234
59          convolution.relu.pooling.layer2_2            337
45          convolution.relu.pooling.layer2_2            484
27          convolution.relu.pooling.layer2_2            250
79          openvx.tensor_transpose_3                    29
33          convolution.relu.pooling.layer2_2            33
109         openvx.tensor_transpose_3                    5
56          convolution.relu.pooling.layer2_2            122
44          convolution.relu.pooling.layer2_2            490
26          convolution.relu.pooling.layer2_2            97
74          openvx.tensor_transpose_3                    10
32          convolution.relu.pooling.layer2_2            11
104         openvx.tensor_transpose_3                    5
55          convolution.relu.pooling.layer2_2            30
43          convolution.relu.pooling.layer2_2            147
25          convolution.relu.pooling.layer2_2            51
68          openvx.tensor_transpose_3                    6
31          convolution.relu.pooling.layer2_2            6
99          openvx.tensor_transpose_3                    4
54          convolution.relu.pooling.layer2_2            17
42          convolution.relu.pooling.layer2_2            147
24          convolution.relu.pooling.layer2_2            51
67          openvx.tensor_transpose_3                    5
30          convolution.relu.pooling.layer2_2            6
94          openvx.tensor_transpose_3                    4
53          convolution.relu.pooling.layer2_2            10
41          convolution.relu.pooling.layer2_2            21
23          fullyconnected.relu.layer_3                  13
29          fullyconnected.relu.layer_3                  8
Total Time(us): 10218
FPS(600MHz): 73.40
FPS(800MHz): 97.87
Note: Time of each layer is converted according to 800MHz!
========================================================================

3.2在RV1126上运行(利用Rockchip NPU—神经网络处理器)

  • 首先我们将rv1126USB-OTG与PC连接

  • 找到虚拟机右下角连接ADB设备

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qPxjFdD-1679360609223)(D:\OneDrive\文章\image-20230321085054793.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eKp2KY6-1679360609225)(D:\OneDrive\文章\image-20230321085126545.png)]

  • 查询ADB设备id

wilson@Ubuntu18:~/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1$ adb devices
List of devices attached
20230105RV1126FD2G0028	device
  • 打开test.py
vim test.py
  • 修改rknn.config目标平台
# Config for Model Input PreProcess
rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], reorder_channel='0 1 2')
#修改为
rknn.config(mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]], reorder_channel='0 1 2',target_platform=['rv1126'])
  • 修改rknn.init_runtime方法参数
# init runtime environment
print('--> Init runtime environment')
ret = rknn.init_runtime()
#修改为(device_id)
ret = rknn.init_runtime(target='rv1126',device_id='20230105RV1126FD2G0028') #device_id输入刚刚查询到的id
  • 保存并退出
  • 执行test.py脚本,得到如下结果
wilson@Ubuntu18:~/rknn-toolkit/examples/tensorflow/ssd_mobilenet_v1$ python3 test.py 
--> Loading model
W Use existed rule db file to convert tensorflow model.
done
--> Building model
done
--> Init runtime environment
I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:36)
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI:   API: 1.6.0 (79320de build: 2020-12-29 10:56:36)
D RKNNAPI:   DRV: 1.7.0 (7880361 build: 2021-08-16 14:05:08)
D RKNNAPI: ==============================================
done
--> Running model
done
W When performing performance evaluation, inputs can be set to None to use fake inputs.
========================================================================
                               Performance                              
========================================================================
Total Time(us): 8884
FPS: 112.56
========================================================================
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估 的相关文章

  • rockchip rk3568 openwrt修改根文件系统分区

    rk3568的openwrt根文件系统分区大小如何修改 xff1f 1 rootfs大小取决于rk356x config的配置 xff0c 默认CONFIG TARGET ROOTFS PARTSIZE 61 512 xff0c 如果需要修
  • CPU、GPU、NPU的区别

    CPU GPU NPU的区别 CPU CPU xff08 CentralProcessing Unit xff09 中央处理器 xff0c 是一块超大规模的集成电路 xff0c 主要逻辑架构包括控制单元Control xff0c 运算单元A
  • Rockchip HDMI-CEC软件说明

  • MSMG ToolKit v11.4 DL

    v11 4 43 Updated the Microsoft Windows PowerShell 7 Pack Windows 7 Windows 8 1 Windows 10 for MSMG ToolKit with PowerShe
  • [EdgeAI] NXP eIQ 机器学习Toolkit (二):模型篇

    NXP eIQ 机器学习Toolkit xff08 二 xff09 xff1a 模型篇 1 模型选择2 模型训练3 模型评估4 模型导出5 模型部署博主热门文章推荐 xff1a 书接上篇 xff1a EdgeAI NXP eIQ 机器学习T
  • 深度学习CPU,GPU,NPU,TPU以及其计算能力单位

    处理器运算能力单位 TOPS是Tera Operations Per Second的缩写 xff0c 1TOPS代表处理器每秒钟可进行一万亿次 xff08 10 12 xff09 操作 与此对应的还有GOPS xff08 Giga Oper
  • 52、人脸检测部署RK3399 PRO,完成RKNN的人脸检测

    基本思想 xff1a 帮助好友部署一个人脸检测模型 xff0c 也是自己业务需求 xff0c 部分代码来自好友陈同学 xff0c 自己改了改c 43 43 的代码可以部署rk3399pro上了 xff0c 其它资料见附录吧 xff0c 官方
  • RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

    RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估 文章目录 RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估一 基本知识二 环境部署2 1环境准
  • Hexagon GDB Debugger介绍(14)

    Hexagon GDB Debugger介绍 14 2 9 2 连续和单步调试 2 9 2 连续和单步调试 连续意味着恢复程序执行 直到程序正常完成 相比之下 单步调试意味着只执行程序的一个 step 其中 step 可能意味着一行源代码或
  • Android设备的序列号与ro.serialno

    Android设备的序列号是通过获取Property ro serialno 的值取得的 ro serialno 的值一般来源于内核启动参数中的 ro boot serialno 在rk3368 Android6 0中 uboot读取idb
  • Bazel install Tips

    Bazel Fast Correct Choose two Build and test software of any size quickly and reliably Speed up your builds and tests Ba
  • RK3568 Android12 RK628编译报错问题

    Platform RK3568 OS Android 12 Kernel v4 19 206 SDK Version android 12 0 mid rkr1 问题 在dts中配置rk628时遇到编译报错 提示找不到rk628的label
  • RK3308 Ubuntu16.04移植

    一 概述 本章将介绍Ubuntu在RK平台上的移植以及AP配网 常用的fs为buildroot编译出来的linux文件系统 而本次则是ubuntu文件系统 系统启动后需要手动对WIFI驱动进行加载并配网 二 配置Kernel 为了支持ubu
  • WPF 工具包 DataGrid 复选框问题

    我真的希望有人能在这里帮助我 我的程序中有一个 DataGrid 它有一个复选框列 DataGrid 的 ItemsSource 是以编程方式加载的 DataSet 当我在 DataGrid 中选择几个项目然后滚动它时 我得到了一些非常奇怪
  • 使用rknn-toolkit2将paddleseg模型导出rknn模型

    目录 安装paddle2onnx环境 将paddle模型导出onnx模型 安装rknn toolkits 转化rknn模型 安装paddle2onnx环境 首先创建一个python虚拟环境 conda create n paddle2onn
  • 自定义集合在编辑时使 DataGrid 崩溃

    我目前正在尝试将 DataGrid ItemsSource 绑定到自定义 RowCollection 它实现 IList 和 INotifyCollectionChanged Public Class RowCollection of T
  • 有没有类似于 Google Web Toolkit 的 PHP Web 工具包? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 Android 没有出现在 Eclipses 的首选项中?

    我已经按照以下方式安装了 Android 开发者工具官方说明 http developer android com sdk index html 为什么选项卡没有出现在Windows gt Preferences as 他们说 http d
  • Java垃圾收集和图形处理方法

    我正在创建一个游戏 蛇克隆 作为一种爱好 我正在查看 Java API 中 Graphics 类的 dispose 方法 当我注释掉 dispose 方法时 无论有没有它 我的动画都会以相同的方式工作 在 Java API 中 dispos
  • 如何让 Swing 应用程序感知屏幕尺寸变化?

    当我的 swing 应用程序运行时 我更改屏幕尺寸 例如从 1024x768 更改为 800x600 我可以收听任何活动以获得有关此事件的通知吗 或者 我可以每隔几秒检查一次屏幕尺寸 但 Toolkit getScreenSize 不断告诉

随机推荐

  • muduo源码学习(1):异步日志——日志消息的存储及输出

    目录 前言 日志存储的实现 日志输出的实现 总结 前言 muduo中的日志 xff0c 是诊断日志 用于将代码运行时的重要信息进行保存 xff0c 方便故障诊断和追踪 日志一般有两种 xff0c 一种是同步日志 xff0c 一种是异步日志
  • muduo源码学习(2):异步日志——异步日志的实现

    目录 什么是异步日志 异步日志的实现 前端与后端 前端与后端的交互 资源回收 后端与日志文件 滚动日志 自动flush缓冲区 开启异步日志功能 总结 在前文中分析了日志消息的存储和输出 xff0c 不过并没有涉及到异步日志 xff0c 下面
  • muduo异步日志——core dump后查找还未来得及写出的日志

    目录 前言 生成core文件 gdb调试Core文件 前言 通过异步日志的实现可以知道 xff0c 日志消息并不是生成后立刻就会写出 xff0c 而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中 xff0c
  • C++知识积累:成员函数运算符重载与非成员函数运算符重载

    运算符重载 xff0c 是C 43 43 多态的表现形式之一 xff0c 可以通过对运算符进行重载来实现运算符特定的功能 运算符重载一般具有以下原则 xff1a xff08 1 xff09 不可重载不存在的运算符 xff0c 如重载 来表示
  • (二叉树)二叉树的最近公共祖先

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 xff1a 对于有根树 T 的两个结点 p q xff0c 最近公共祖先表示为一个结点 x xff0c 满足 x 是 p q 的祖先且 x 的深
  • 有符号数、无符号数理解

    大家都知道 xff0c 在C C 43 43 中 xff0c 对于w位编译器 xff0c 其有符号数表示的数值范围为 2 w 1 2 w 1 1 xff0c 无符号数表示的数值范围为0 2 w 1 xff0c 举个例子 xff0c 在16位
  • ​PCB的 “ 黑科技 ” ,应该是这个。

    大家好 xff0c 我是张巧龙 xff0c 前段时间炒的很火的折叠屏手机不知道大家还记得不 xff1f 折叠屏手机之所以这么具有 34 韧性 34 xff0c 全靠背后的柔性电路板 FlexiblePrintedCircuit xff0c
  • 指针数组、数组指针——用指针访问数组方法总结

    目录 1 数组元素的访问 2 通过指针访问数组 2 1 通过指针访问一维数组 2 2 通过指针访问二维数组 2 2 1 指向元素的指针 2 2 2 指向每一行的指针 xff08 指针数组方式 xff09 2 2 3 指向整个数组的指针 xf
  • C++知识积累:如何获取虚函数表以及虚函数地址

    如果一个类中存在虚函数的话 xff0c 那么编译器就会为这个类生成一个虚函数表 xff0c 这个虚函数表中按照个虚函数的声明顺序存放了各个虚函数的地址 xff0c 需要注意的是 xff0c 这个虚函数表并不存在于类中 xff0c 而对于这个
  • C++多线程:互斥锁

    目录 1 前言 2 互斥锁 2 1 互斥锁的特点 2 2 互斥锁的使用 2 2 std lock guard 3 死锁 3 1 死锁的含义 3 2 死锁的例子 3 3 死锁的解决方法 1 前言 比如说我们现在以一个list容器来模仿一个消息
  • Linux下MySQL中文显示问号乱码问题解决

    本文主要针对于Linux下MySQL插入中文数据显示问号的问题 网上一种普遍使用的方法是修改 etc my cnf文件 xff08 我的这个文件位于 etc mysql my cnf xff09 xff0c 修改步骤如下 xff1a 1 在
  • Linux下更改文件权限

    目录 查看文件权限 修改文件权限 查看文件权限 查看文件权限可以通过ls l命令查看 xff0c 如下所示 xff1a 如果只想查看某一个文件的权限 xff0c 可以使用grep xff0c 如下所示 xff1a 可以发现 xff0c 每一
  • 【蓝桥杯算法提高VIP-开灯游戏(两种超易理懂解法:暴力/位操作(切换位))(纯正C语言代码)】

    蓝桥杯算法提高VIP 开灯游戏 题目描述 有9盏灯与9个开关 xff0c 编号都是1 9 每个开关能控制若干盏灯 xff0c 按下一次会改变其控制的灯的状态 亮的变成不亮 xff0c 不亮变成亮的 具体如下 xff1a 第一个开关控制第二
  • C语言二叉查找树(图文详解)(超详细)

    二叉查找树 本人在第一次学习二叉树的时候 感觉很懵懵懂懂 勉强知道了二叉树的结构和查找方式 但要我自己去动手写的时候 可是难上加难 所以这里我用干货 43 实际例子的方式让你上手二叉树 这个例子几乎可以套用到所有链式结构问题 我们开始吧 文
  • STM32F4中断(Interrupt)详解

    STM32F4中断 Interrupt 详解 文章目录 STM32F4中断 Interrupt 详解一 中断是什么 二 STM32的中断体系2 1 STM32的中断分类2 2 STM32中断优先级2 2 1 抢占优先级2 2 2 响应优先级
  • 基于RK3399&ESP8285自动售货柜项目—ESP8266(8285)程序编写与烧录

    基于RK3399 amp ESP8285自动售货柜项目 ESP8266 8285 程序编写与烧录 本系列文章讲详细讲解该基于RK3399及ESP8285自动售货柜的完整实现方法 xff0c 从硬件连接到网络通信再到软件实现 xff0c 本产
  • Windows10安装OpenCV4.1.0+opencv_contrib

    Windows10安装OpenCV4 1 0 43 opencv contrib 文章目录 Windows10安装OpenCV4 1 0 43 opencv contrib一 Visual Studio 2015安装二 下载和安装OpenC
  • 用MATLAB来做智能小车的建模与仿真

    两种智能小车的构造简介 在市面上常见的两种智能小车都是基于轮式的 xff0c 在某宝上面卖的最多的 xff0c 各位在学生时代拿来应付课程设计和毕业设计用的各种小车分为两种 1 后轮驱动 xff0c 前轮阿克曼转向的 xff0c 通常后轴通
  • Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)

    Qt编写网络调试助手 xff08 TCP客户端 43 TCP服务端 43 UDP服务端 xff09 终极版开源 飞扬青云 博客园
  • RKNN-Toolkit模型转换并在Rockchip NPU推理并进行性能评估

    RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估 文章目录 RKNN Toolkit转换Tensorflow模型至Rockchip NPU推理并进行性能评估一 基本知识二 环境部署2 1环境准