• 探索QCS6490目标检测AI应用开发(三):模型推理


    作为《探索QCS6490目标检测AI应用开发》文章,紧接上一期,我们介绍如何在应用程序中介绍如何使用解码后的视频帧结合Yolov8n模型推理。 高通 Qualcomm® AI Engine Direct 是一套能够针对高通AI应用加速的软件SDK,更多的内容可以访问:Qualcomm Documentation

    AI Engine Direct也称QNN,在本期文章的第一期中我们介绍了如何使用AI Engine Direct的工具链去转换ONNX模型,我们接下来讲介绍如何在应用中去推理转换好的Yolov8n模型

    1.前置条件

    1.1 环境搭建

    确报你已经完成了以下准备工作

    • 按照《探索QCS6490目标检测AI应用开发(一):Yolov8n模型转换及量化》中的指导,完成了Yolov8n模型的量化,得到序列化后的模型文件yolov8n_quant.bin
    • 准备一块QCS6490开发板
    • AI Engine Direct开发包已安装部署到QCS6490开发板

    1.2 下载AI Engine Direct Helper

    AI Engine Direct提供了丰富的API接口,可以非常接近硬件底层高效利用资源。为了简化模型推理过程,我们推荐使用AI Engine Direct Helper,它是在AI Engine Direct基础上封装的一个助手类,能够以极少的代码实现模型的推理。

    下载 AI Engine Direct Helper

    GitHub - quic/ai-engine-direct-helper

    QCS6490开发板上进行相应的编译工作,以生成可用的库文件。

    2. 模型推理

    在集成模型推理之前,请确保已经阅读并遵循了AI Engine Direct Helper User Guide中的环境设置指南。这包括设置必要的库文件路径、安装Python及其扩展等。

    利用AI Engine Direct Helper ,只需要几行代码就可以完成模型的推理

    https://github.com/quic/ai-engine-direct-helper/blob/main/Docs/User_Guide.md

    1. #include "LibQNNHelper.hpp"
    2. int main() {
    3. // 初始化日志级别
    4. SetLogLevel(2);
    5. // 创建LibQNNHelper实例
    6. LibQNNHelper libQNNHelper;
    7. // 定义输入输出缓冲区
    8. std::vector<uint8_t*> inputBuffers;
    9. std::vector<uint8_t*> outputBuffers;
    10. std::vector<size_t> outputSize;
    11. // 模型初始化
    12. std::string model_name = "yolov8n";
    13. std::string model_path = "/path/to/yolov8n_quant.bin";
    14. std::string backend_lib_path = "/path/to/libQnnHtp.so";
    15. std::string system_lib_path = "/path/to/libQnnSystem.so";
    16. if (!libQNNHelper.ModelInitialize(model_name, model_path, backend_lib_path, system_lib_path)) {
    17. QNN_ERR("ModelInitialize failed\n");
    18. return -1;
    19. }
    20. // 填充输入缓冲区
    21. // ... 此处应填充解码后的视频帧数据到inputBuffers ...
    22. // 执行模型推理
    23. if (!libQNNHelper.ModelInference(model_name, inputBuffers, outputBuffers, outputSize)) {
    24. QNN_ERR("ModelInference failed\n");
    25. // 清理资源
    26. libQNNHelper.ModelDestroy(model_name);
    27. return -1;
    28. }
    29. // 使用outputBuffers中的数据进行后处理,如绘制检测框等
    30. // 释放输出缓冲区内存
    31. for (int j = 0; j < outputBuffers.size(); j++) {
    32. free(outputBuffers[j]);
    33. }
    34. outputBuffers.clear();
    35. outputSize.clear();
    36. // 销毁模型并释放资源
    37. libQNNHelper.ModelDestroy(model_name);
    38. return 0;
    39. }

    作者:Ricky Li

  • 相关阅读:
    如何在处理链中执行一个选择性删除ADSO数据的程序 selective deletion
    15、用户web层服务(三)
    达梦数据库备份策略
    【数据结构复习】第五章树和二叉树
    Mysql 中的性能调优方法
    设计模式之解释器模式
    柔性制造物料抓取及加工系统设计
    Hygieia (Devops)开源-搭建步骤(一)
    从零开始用C语言实现图片解码播放器(有源码)
    无模型深度强化学习算法
  • 原文地址:https://blog.csdn.net/csdnsqst0050/article/details/139995647