|
本帖最后由 troy 于 2019-9-9 15:35 编辑
最近整理了一个C语言版本多线程的框架,封装了rknn操作接口,图像获取与处理,以及多线程细节,用户只需要关注模型的后处理,即可快速完成多线程图像demo的开发评估工作。
代码链接:https://pan.baidu.com/s/1wz0y8bSY98rKu7M1yFlbEQ 提取码:xifd
github仓库:https://github.com/troyseed/toybrick_ssd_multithread.git
说明:最近很多人反映在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提供以下几个接口:- rknn_test(const char *test_name); /* 构造函数,需要提供一个test_name作为输出的窗口名称 */
- ~rknn_test(); /* 析构函数 */
- int load_model(const char *path); /* 加载rknn模型 */
- int set_input_info(int width, int height, int channels); /* 设置模型的输入大小,rknn_test会自动完成resize功能 */
- int run(int video_node, /* video节点号,为0时,打开video0节点获取摄像头图像作为输入 */
- /* func 为后处理回调函数*/
- int (*func) (void *data /* in 用户数据指针 */, cv::Mat & img /* in 图像数据,可以在上面绘制结果 */, float fps /* in 帧率 */, struct rknn_out_data * out_data<font color="#008000"> /* in rknn推理结果 */</font>),
- void *data /* 用户数据指针,提供给func使用 */);
- /* 同上,支持视频文件作为输入 */
- int run(const char *video_name,
- int (*func) (void *data, cv::Mat & img, float fps,
- struct rknn_out_data * out_data), void *data);
ssd_demo.cpp
- int main(void)
- {
- int ret;
- /* 自定义数据,用于post_process函数使用 */
- struct ssd_data data;
- /* load label and boxPriors */
- loadLabelName(LABEL_PATH, data.labels);
- loadCoderOptions(BOX_PRIO_PATH, data.boxPriors);
- /* 创建一个测试实例 */
- class rknn_test test(WIN_NAME);
- /* 加载模型 */
- ret = test.load_model(MODEL_PATH);
- if (ret < 0) {
- printf("load_model error!!!\n");
- return ret;
- }
- /* 设置输入图像的属性 */
- ret = test.set_input_info(INPUT_WIDTH, INPUT_HEIGHT, INPUT_CHANNEL);
- if (ret < 0) {
- printf("set_input_info error!!!\n");
- return ret;
- }
- /* 开始运行,支持摄像头和视频文件方式 */
- /* 使用摄像头时,VIDEO_NODE可以设置为0,表示从video 0节点获取图像数据 */
- /* 使用视频时,VIDEO_NODE可以设置为文件路径,如"xxx.mp4",表示从视频文件获取图像数据 */
- /* post_process为自定义的后处理函数,RKNN相关操作已封装,只需完成后处理即可 */
- ret = test.run(VIDEO_NODE, post_process, &data);
- return ret;
- }
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
|