一、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项目
第一次写代码阅读笔记,只是把自己关注的地方记下来,尚且存在很多不足之处!