RKNN_SSD Demo的学习笔记

这篇笔记详细介绍了在RK3399Pro Linux环境下,使用RKNN库实现SSD物体检测的Demo。主要流程包括:加载RKNN模型、初始化、输入设置、推理、输出获取、释放资源。在MainActivity中初始化GLsurfaceView,通过CameraSurfaceRender进行相机启动和跟踪。OnDrawFrame方法处理每一帧数据,进行推理并显示结果。Demo源码可在Toybrick社区找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该demo是在Toybrick社区下载的,开发环境是 RK3399Pro Linux,实现了简单的物体检测!
RKNN API调用流程:
通过该API去调用NPU(神经网络计算单元),在JNI文件里面. input包括相片和一些数据,output则是ssd nms处理的目标.
1.读取rknn模型文件(使用RKNN模型工具生成的.rknn文件,打在res/raw/ssd.rknn)到内存
2.使用rknn_init进行context初始化,加载rknn模型
3.使用rknn_query获取input,output的属性
4.使用rknn_input_set对inputs进行设置
5.使用rknn_run进行单次推理操作
6.使用rknn_outputs_get获取outputs
7.使用rknn_output-release释放已获取的output
8.返回到第4步骤可进行多次推理
9.程序退出则调用rknn_destroy销毁context卸载rknn模型

demo基本流程:
1.在MainActivity中对GLsurfaceView进行初始化,定义渲染器Render(class CameraSurfaceRender),以及开辟线程用于fps的显示(type=0)和绘制显示default box(type=1).

2.在CameraSurfaceRender的onSurfaceCreate方法中进行startCamera()和startTrack()操作;
startCamera是打开摄像头以及配置相机参数;
startTrack()是创建图像缓冲队列(ImageBufferQueue),同时生成纹理(create_direct_texture)并将纹理保存到帧缓冲区中(重写finalize()方法,在垃圾回收器准备释放资源时会先调用finalize,在该方法中进行释放帧缓冲区和删除纹理操作delete_direct_texture),根据纹理id

### 如何启动 `rknn_server` 及其常见问题解决方案 #### 启动方法 要成功启动 `rknn_server`,通常需要按照以下方式操作: 1. **确认环境准备** 确保已正确安装 RKNN 工具链及相关依赖库。例如,对于 Python 版本的要求以及工具包的安装步骤可以参考相关内容[^3]。 2. **执行启动命令** 在终端中运行如下命令来启动服务器: ```bash rknn_server start ``` 如果该命令未被识别,则可能是路径配置错误或者工具未完全安装。此时应检查是否已经将 RKNN 工具的相关二进制文件加入系统的 PATH 中。 3. **验证服务状态** 使用以下命令查看 `rknn_server` 的当前状态: ```bash rknn_server status ``` 若显示正常运行,则说明启动无误;反之则需排查具体原因。 4. **停止服务(必要时)** 当不再需要使用此服务时可以通过下面指令安全关闭它: ```bash rknn_server stop ``` --- #### 常见问题及其解决办法 ##### 问题一:无法加载指定的 RKNN 模型 当尝试初始化模型实例化对象时可能会报错提示“Invalid RKNN model version”。这表明所使用的 `.rknn` 文件版本不兼容于现有 SDK 。解决措施包括但不限于更新至最新版 SDK 并重新转换目标模型[^2]。 ##### 问题二:缺少必要的动态链接库 (Dynamic Link Library) 如果系统报告找不到某些共享库比如 librknn.so ,那么应该把它们复制到标准位置如 /usr/lib 下面去或者是调整 LD_LIBRARY_PATH 让程序能找到这些资源。 ```bash export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/rknn/libs/ ``` 此处 `/path/to/rknn/libs/` 应替换为你实际存放相关 so 文件的位置[^1]。 ##### 问题三:硬件驱动异常 有时即使软件层面一切就绪仍会遭遇诸如 “load model failed!” 类似的信息反馈出来。这种情况下往往涉及到底层驱动存在问题所致。因此有必要参照官方资料进一步核查对应芯片组的支持情况并及时升级固件版本号以便获得更好的稳定性表现。 ##### 问题四:Python API 调用失败 假设采用的是基于 python 编写的脚本来调用 rknn api 实现功能的话,除了前述提到过的关于 sdk 和 runtime library 方面需要注意外,还有一点很重要即确保选用恰当的目标平台参数设置给 config 方法以及 init_runtime 函数传入正确的 target 参数值匹配真实的物理设备类型[^4]。 --- ### 示例代码片段展示如何利用 rknn toolkit 构建项目框架结构 以下是简化后的例子演示整个工作流的一部分环节: ```python from rknn.api import RKNN def main(): # 创建 RKNN 对象 rknn = RKNN() try: # 设置模型配置选项 rknn.config(target_platform='rv1126', mean_values=[[127.5, 127.5, 127.5]], std_values=[[127.5, 127.5, 127.5]]) # 导入 ONNX 格式的预训练模型 ret = rknn.load_onnx('ssd_inception_v2.onnx') if ret != 0: raise Exception("Failed to load ONNX model.") # 执行量化与构建过程 rknn.build(do_quantization=True, dataset='./dataset/calibration.txt') # 初始化运行时环境并与远程开发板建立通信连接 ret = rknn.init_runtime(device_id="usb://<your_device_identifier>") if ret != 0: raise Exception("Runtime initialization failure.") print("Model successfully deployed and ready for inference!") finally: # 清理释放所有分配好的资源 rknn.release() if __name__ == '__main__': main() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值