RKNN_SSD Demo的学习笔记

该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

你可能感兴趣的:(RKNN,SSD,OpenGL)