作为《探索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
#include "LibQNNHelper.hpp"
int main() {
// 初始化日志级别
SetLogLevel(2);
// 创建LibQNNHelper实例
LibQNNHelper libQNNHelper;
// 定义输入输出缓冲区
std::vector<uint8_t*> inputBuffers;
std::vector<uint8_t*> outputBuffers;
std::vector<size_t> outputSize;
// 模型初始化
std::string model_name = "yolov8n";
std::string model_path = "/path/to/yolov8n_quant.bin";
std::string backend_lib_path = "/path/to/libQnnHtp.so";
std::string system_lib_path = "/path/to/libQnnSystem.so";
if (!libQNNHelper.ModelInitialize(model_name, model_path, backend_lib_path, system_lib_path)) {
QNN_ERR("ModelInitialize failed\n");
return -1;
}
// 填充输入缓冲区
// ... 此处应填充解码后的视频帧数据到inputBuffers ...
// 执行模型推理
if (!libQNNHelper.ModelInference(model_name, inputBuffers, outputBuffers, outputSize)) {
QNN_ERR("ModelInference failed\n");
// 清理资源
libQNNHelper.ModelDestroy(model_name);
return -1;
}
// 使用outputBuffers中的数据进行后处理,如绘制检测框等
// 释放输出缓冲区内存
for (int j = 0; j < outputBuffers.size(); j++) {
free(outputBuffers[j]);
}
outputBuffers.clear();
outputSize.clear();
// 销毁模型并释放资源
libQNNHelper.ModelDestroy(model_name);
return 0;
}
作者:Ricky Li