1、关注yolov5检测流程
2、其中几个重要的结构体
- typedef struct
- {
- int left;
- int right;
- int top;
- int bottom;
- } YOLOV5_BOX_RECT; // box坐标信息
-
- typedef struct
- {
- char name[YOLOV5_NAME_MAX_SIZE];
- int class_index;
- YOLOV5_BOX_RECT box;
- float prop;
- } yolov5_detect_result_t; // 一个目标的检测结果
-
- typedef struct
- {
- int id;
- int count;
- yolov5_detect_result_t results[YOLOV5_NUMB_MAX_SIZE];
- } yolov5_detect_result_group_t; // 多个目标的检测结果
-
- typedef struct{
- yolov5_detect_result_group_t result_group;
- int number;
- }Result_t; // 新定义一个结构体,给检测线程使用
3、互斥量机制的使用
识别线程
- // 识别线程
- void *detect_thread_entry(void *para)
- {
- int ret;
- Result_t *pResult = (Result_t *)para; // 类型转换:将参数转为Result_t指针
-
- // 模型初始化
- rknn_context ctx;
- yolov5_detect_init(&ctx, "/userdata/yolov5_coco_rv1126_pre.rknn");
-
- Mat image;
- while(1)
- {
- // 等待全局变量
- if(algorithm_image.empty()) {
- usleep(5);
- continue;
- }
-
- auto start = std::chrono::system_clock::now();
-
- // 从共享资源copy数据,copy 操作完成之前,algorithm_image 一直被锁
- pthread_mutex_lock(&img_lock); // 对互斥量进行加锁
- image = algorithm_image.clone(); // 从全局变量 clone 数据
- pthread_mutex_unlock(&img_lock); // 对互斥量进行解锁
-
- // 推理及后处理
- ret = yolov5_detect_run(ctx, image, &pResult->result_group);
- pResult->number = pResult->result_group.count;
-
- // 打印每帧检测耗时
- auto end = std::chrono::system_clock::now();
- auto duration = std::chrono::duration_cast
(end - start); - string text = "yolov5n detect time use: " + std::to_string(duration.count()) + "ms";
- printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
- cout << text + "\n" + "\n" << endl;
- printf("number : %d\n", pResult->number);
-
- // 没有检测到目标,忽略其1ms其他线程产生的algorithm_image
- if(pResult->number <= 0){
- usleep(1000);
- continue;
- }
-
-
-
- usleep(16*1000);
- }
- /* 检测模型释放 */
- yolov5_detect_release(ctx);
- return NULL;
- }
main函数中创建识别线程
- pthread_t mTid; // 用于存储线程标识符
- Result_t Result; // 用于存储检测结果
-
-
- // 创建识别线程
- pthread_mutex_init(&img_lock, NULL); // 对互斥锁进行初始化
- Result.number = 0;
- // CreateNormalThread(detect_thread_entry, &Result, &mTid);
- pthread_create(&mTid, NULL, detect_thread_entry,(void*)&Result);
项目任务:yolov5 rknn模型检测获得结果
项目评价:
1、yolov5 rknn 模型推理及后处理部分,是可以直接拿来用的
2、互斥量机制也可以借鉴学习
3、要自己设计接口,毕竟这只是一份demo项目
第一次写代码阅读笔记,只是把自己关注的地方记下来,尚且存在很多不足之处!