Toybrick

基于C语言 RKNN多线程框架

troy

版主

积分
560
发表于 2019-5-10 17:05:18    查看: 1550|回复: 9 | [复制链接]    打印 | 显示全部楼层
本帖最后由 troy 于 2019-5-24 09:56 编辑

  最近整理了一个C语言版本多线程的框架,封装了rknn操作接口,图像获取与处理,以及多线程细节,用户只需要关注模型的后处理,即可快速完成多线程图像demo的开发评估工作。
代码链接:https://pan.baidu.com/s/1wz0y8bSY98rKu7M1yFlbEQ 提取码:xifd

说明:最近很多人反映在1.0.0上无法运行的情况,在此做下说明,代码里面自带的.rknn是基于0.9.9的ToolKit转换的,因此在1.0.0运行会有兼容性的问题。
因此在ssd_trans,目录下放置了rknn转换代码和pb模型问题,用户需要自己在PC机上进行模型转换,再拷贝转换后的.rknn模型到models/ssd/目录进行运行。

说明文档:[url=]SSD_DEMO USER MUNUAL.pdf[/url]

框架运行时,会创建3个线程,分别用于图像获取,RKNN推理,图像后处理。
用户只需要将自己的后处理实现回调设置到rknn_test框架,即可自动完成图像获取->resize->推理->后处理->结果显示等操作。

1.代码结构如下:
.
├── CMakeLists.txt
├── common                             //多线程框架主体部分,模型无关
│   ├── rknn.cpp                        //封装rknn-api相关操作,包括模型的加载,推理,结果获取
│   ├── rknn.h
│   ├── rknn_test.cpp                 //多线程测试框架
│   ├── rknn_test.h
│   ├── rknn_thread.cpp             //多线程相关处理
│   └── rknn_thread.h
├── models                               //模型文件
│   └── ssd                                //SSD模型相关文件
│       ├── box_priors.txt  
│       ├── coco_labels_list.txt
│       ├── labels.txt
│       └── mobilenet_ssd.rknn
├── ReadMe.txt
└── ssd_demo.cpp                      //SSD模型测试


2.ssd_demo.cpp代码解析
rknn_test.h提供以下几个接口:
  1.   rknn_test(const char *test_name);          /* 构造函数,需要提供一个test_name作为输出的窗口名称 */
  2.         ~rknn_test();                        /* 析构函数 */
  3.         int load_model(const char *path);    /* 加载rknn模型 */
  4.         int set_input_info(int width, int height, int channels);    /* 设置模型的输入大小,rknn_test会自动完成resize功能 */
  5.         int run(int video_node,   /* video节点号,为0时,打开video0节点获取摄像头图像作为输入 */
  6.                    /* func 为后处理回调函数*/
  7.                    int (*func) (void *data /* in 用户数据指针 */, cv::Mat & img /* in 图像数据,可以在上面绘制结果 */, float fps /* in 帧率 */, struct rknn_out_data * out_data<font color="#008000"> /* in rknn推理结果 */</font>),
  8.                    void *data /* 用户数据指针,提供给func使用 */);

  9.         /* 同上,支持视频文件作为输入 */
  10.         int run(const char *video_name,
  11.                 int (*func) (void *data, cv::Mat & img, float fps,
  12.                              struct rknn_out_data * out_data), void *data);
复制代码



ssd_demo.cpp
  1. int main(void)
  2. {
  3.         int ret;
  4.         /* 自定义数据,用于post_process函数使用 */
  5.         struct ssd_data data;
  6.         /* load label and boxPriors */
  7.         loadLabelName(LABEL_PATH, data.labels);
  8.         loadCoderOptions(BOX_PRIO_PATH, data.boxPriors);

  9.         /* 创建一个测试实例 */
  10.         class rknn_test test(WIN_NAME);

  11.         /* 加载模型 */
  12.         ret = test.load_model(MODEL_PATH);
  13.         if (ret < 0) {
  14.                 printf("load_model error!!!\n");
  15.                 return ret;
  16.         }

  17.         /* 设置输入图像的属性 */
  18.         ret = test.set_input_info(INPUT_WIDTH, INPUT_HEIGHT, INPUT_CHANNEL);
  19.         if (ret < 0) {
  20.                 printf("set_input_info error!!!\n");
  21.                 return ret;
  22.         }

  23.         /* 开始运行,支持摄像头和视频文件方式 */
  24.         /* 使用摄像头时,VIDEO_NODE可以设置为0,表示从video 0节点获取图像数据 */
  25.         /* 使用视频时,VIDEO_NODE可以设置为文件路径,如"xxx.mp4",表示从视频文件获取图像数据 */
  26.         /* post_process为自定义的后处理函数,RKNN相关操作已封装,只需完成后处理即可 */
  27.         ret = test.run(VIDEO_NODE, post_process, &data);

  28.         return ret;
  29. }
复制代码


3.编译步骤:
1. sudo dnf install -y cmake gcc gcc-c++ opencv opencv-devel rknn-api
2. mkdir build
3. cd build
4. cmake ..
5. make
6. ./ssd_demo


4.再开发步骤:
1.  编写自己的模型demo文件,如xxx_demo.cpp
2. 修改CMakeLists.txt第26行,add_executable(ssd_demo  ssd_demo.cpp ${common_file}) 修改为add_executable(xxx_demo  xxx_demo.cpp ${common_file})
3. cd build
4. cmake ..
5. make
6. 执行./xxx_demo





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

xiaqing10

注册会员

积分
151
发表于 2019-5-21 18:23:48 | 显示全部楼层
验证码错误
回复

使用道具 举报

linuxsky

注册会员

积分
133
发表于 2019-5-23 19:18:28 | 显示全部楼层
提取码错误
回复

使用道具 举报

lappaport

注册会员

积分
164
发表于 2019-5-23 20:32:29 | 显示全部楼层
百度云盘提取码错误
回复

使用道具 举报

troy

版主

积分
560
 楼主| 发表于 2019-5-24 09:56:54 | 显示全部楼层

已修改
回复

使用道具 举报

troy

版主

积分
560
 楼主| 发表于 2019-5-24 09:57:03 | 显示全部楼层
lappaport 发表于 2019-5-23 20:32
百度云盘提取码错误

已修改
回复

使用道具 举报

troy

版主

积分
560
 楼主| 发表于 2019-5-24 09:57:15 | 显示全部楼层

已修改
回复

使用道具 举报

protossw512

中级会员

积分
223
发表于 2019-6-15 01:48:54 | 显示全部楼层
可以放到github上面吗?
回复

使用道具 举报

troy

版主

积分
560
 楼主| 发表于 2019-6-17 09:06:49 | 显示全部楼层
protossw512 发表于 2019-6-15 01:48
可以放到github上面吗?

后续会考虑一下
回复

使用道具 举报

little.zhang

新手上路

积分
32
发表于 2019-7-30 11:54:14 | 显示全部楼层
本帖最后由 little.zhang 于 2019-7-31 19:03 编辑

谢谢分享
回复

使用道具 举报

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

本版积分规则

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


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