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


    一、main函数思路

     

    二、值得学习的地方

    1、关注yolov5检测流程

    2、其中几个重要的结构体

    1. typedef struct
    2. {
    3. int left;
    4. int right;
    5. int top;
    6. int bottom;
    7. } YOLOV5_BOX_RECT; // box坐标信息
    8. typedef struct
    9. {
    10. char name[YOLOV5_NAME_MAX_SIZE];
    11. int class_index;
    12. YOLOV5_BOX_RECT box;
    13. float prop;
    14. } yolov5_detect_result_t; // 一个目标的检测结果
    15. typedef struct
    16. {
    17. int id;
    18. int count;
    19. yolov5_detect_result_t results[YOLOV5_NUMB_MAX_SIZE];
    20. } yolov5_detect_result_group_t; // 多个目标的检测结果
    21. typedef struct{
    22. yolov5_detect_result_group_t result_group;
    23. int number;
    24. }Result_t; // 新定义一个结构体,给检测线程使用

    3、互斥量机制的使用

    识别线程

    1. // 识别线程
    2. void *detect_thread_entry(void *para)
    3. {
    4. int ret;
    5. Result_t *pResult = (Result_t *)para; // 类型转换:将参数转为Result_t指针
    6. // 模型初始化
    7. rknn_context ctx;
    8. yolov5_detect_init(&ctx, "/userdata/yolov5_coco_rv1126_pre.rknn");
    9. Mat image;
    10. while(1)
    11. {
    12. // 等待全局变量
    13. if(algorithm_image.empty()) {
    14. usleep(5);
    15. continue;
    16. }
    17. auto start = std::chrono::system_clock::now();
    18. // 从共享资源copy数据,copy 操作完成之前,algorithm_image 一直被锁
    19. pthread_mutex_lock(&img_lock); // 对互斥量进行加锁
    20. image = algorithm_image.clone(); // 从全局变量 clone 数据
    21. pthread_mutex_unlock(&img_lock); // 对互斥量进行解锁
    22. // 推理及后处理
    23. ret = yolov5_detect_run(ctx, image, &pResult->result_group);
    24. pResult->number = pResult->result_group.count;
    25. // 打印每帧检测耗时
    26. auto end = std::chrono::system_clock::now();
    27. auto duration = std::chrono::duration_cast(end - start);
    28. string text = "yolov5n detect time use: " + std::to_string(duration.count()) + "ms";
    29. printf("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
    30. cout << text + "\n" + "\n" << endl;
    31. printf("number : %d\n", pResult->number);
    32. // 没有检测到目标,忽略其1ms其他线程产生的algorithm_image
    33. if(pResult->number <= 0){
    34. usleep(1000);
    35. continue;
    36. }
    37. usleep(16*1000);
    38. }
    39. /* 检测模型释放 */
    40. yolov5_detect_release(ctx);
    41. return NULL;
    42. }

    main函数中创建识别线程

    1. pthread_t mTid; // 用于存储线程标识符
    2. Result_t Result; // 用于存储检测结果
    3. // 创建识别线程
    4. pthread_mutex_init(&img_lock, NULL); // 对互斥锁进行初始化
    5. Result.number = 0;
    6. // CreateNormalThread(detect_thread_entry, &Result, &mTid);
    7. pthread_create(&mTid, NULL, detect_thread_entry,(void*)&Result);

    三、其他

    项目任务:yolov5 rknn模型检测获得结果

    项目评价:

    1、yolov5 rknn 模型推理及后处理部分,是可以直接拿来用的

    2、互斥量机制也可以借鉴学习

    3、要自己设计接口,毕竟这只是一份demo项目

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

  • 相关阅读:
    跟 AI 学 StarRocks:简介
    web网页设计—— 指环王:护戒使者(13页) 电影网页设计 在线电影制作 个人设计web前端大作业
    在线虚拟机安装-云原生边缘计算KubeEdge安装配置(使用负载均衡器LoadBalancer)
    java 容器
    “我“眼中的测试/开发程序员,预想与现实的碰撞......
    实战模拟│企业微信机器人实时报错预警
    Spring使用的注解大全和解释
    qsort()数组排序函数的回调函数怎么写?
    node环境的搭建
    Java 定时器
  • 原文地址:https://blog.csdn.net/weixin_45824067/article/details/133547625