Toybrick

RKNN_SSD Demo的学习笔记

sfs

新手上路

积分
35
楼主
发表于 2019-8-9 14:51:48    查看: 11785|回复: 1 | [复制链接]    打印 | 只看该作者
该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创建surfaceViewTexture.监听surfaceViewTexture的每帧数据(调用OnDrawFrame方法).开辟子线程计算fps,读取ssd.rknn文件,对rknn进行初始化(rknn_init)获取OnDrawFrame方法的模型输入,进行推理run(),将推理结果outputs拷贝到输出缓冲区;更新线程type=0;最后卸载模型释放资源deinit();

在OnDrawFrame方法中根据纹理id取出纹理,1是将纹理转为二维纹理作为模型输入,2是将纹理转为二维纹理,更新surfaceViewTexture.updateTexImage()获取最新二维纹理进行预览(Camera.startPreview).更新线程type=1,在MainActivity线程中根据输出缓冲区的数据进行default boxes的筛选(class PostProcess中的SSD阈值筛选和NMS算法),绘制显示default box(ImageView.setImageBitmap(Bitmap)).

**帧缓冲区**是指服务器(显存)中存储像素相关信息(颜色、深度等)的存储空间。系统提供的帧缓冲区对象包括多个缓冲区,有颜色缓冲区、深度缓冲区、模版缓冲区等。
**OpenGL**    https://blog.csdn.net/sunyFS/article/details/98521532


结合代码更容易理解!
Demo:https://github.com/sunfusong/RKNN_SSD
Toybrick:http://t.rock-chips.com/wiki.php?mod=view&id=36


回复

使用道具 举报

zehao

注册会员

积分
166
沙发
发表于 2021-7-2 22:48:14 | 只看该作者
create_direct_texture的使用和camera的硬件参数有关系吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表