【代码阅读笔记】yolov5 rknn模型部署

一、main函数思路

二、值得学习的地方

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<std::chrono::milliseconds>(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项目

第一次写代码阅读笔记,只是把自己关注的地方记下来,尚且存在很多不足之处!

猜你喜欢

转载自blog.csdn.net/weixin_45824067/article/details/133547625