探索QCS6490目标检测AI应用开发(一):Yolov8n模型转换及量化

目标检测(Object Detection)是计算机视觉领域的核心任务之一,它旨在识别图像中的物体并确定其位置,在本期的文章中,我们用一个端到端的目标检测AI应用为例子。介绍如何在QCS6490 Ubuntu系统上实现一个目标检测应用开发,我们选择Yolov8n模型作为目标检测的模型,以摄像头的实时预览的视频流为输入,最终将检测到结果会更新到视频画面帧并且显示出来。对于这样一个任务,涉及到几个关键的流程:

  1. Yolov8n模型的转换和量化
  2. 摄像头视频的拉取和解码,结果的实时显示
  3. Yolov8n模型的推理

本期的系列文章将会针对这3个步骤展开,在这个例子中,我们选择C++作为开发语言,但是文章的重点更多是关注在整体的流程和操作部署,而避免陷入太多的代码实现中。

1. Yolov8n模型的转换及量化

YOLOv8n 是 YOLOv8 系列的一个变体,它是由 Ultralytics 开发的最新一代目标检测模型,在精度和速度都有不错的表现。

1.1 前置环境要求

Ubuntu 20.04 x64 机器

QCS6490 开发板

  1. 在Ubuntu 20.04 x64上安装 Qualcomm AI Engine Direct SDK

软件包的安装说明和下载地址可以在以下链接获得

https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk

2.QCS6490 开发板安装的是Ubuntu 20.04 arch64的系统镜像

1.2 导出onnx模型

下载Yolov8n的预训练模型

https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt

使用下面的python脚本把模型转换成onnx模型

from ultralytics import YOLO

model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)
path = model.export(format="onnx")  # export the model to ONNX format
print(path)

1.3 准备模型量化的数据

Qualcomm AI Engine Direct SDK提供了工具能够非常的完成模型的转换和量化工作。但是在模型量化之前,需要准备2个实际输入的测试数据

由于Yolov8n预训练的权重文件输入shape是 [1,640,640,3] NHWC的张量,所以我们也需要准备一些准备640x640大小的图片,并且把图片转换成float类型的张量,参考下面的python代码片段

Src是输入图片的路径

Dst是输出的目录

def convert_img_to_raw(src, dst, size,resize_type):
   
    img=cv2.imread(src)   
    cv2.imwrite(dst,img)
    
    input_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    input_img = input_img / 255.0
    raw_np = input_img[np.newaxis, :, :, :].astype(np.float32)
    #
     
    img_filepath = os.path.abspath(dst)
    filename, ext = os.path.splitext(dst)
    raw_filename = filename
    raw_filename += '.raw'
    raw_np.tofile(raw_filename)
    print("save raw file to:",raw_filename)

    return 0

例如 把输入src 为 "/data/test01.jpg" dst 路径为 "/data/raw" 最后得到 /data//raw/test01.raw

创建文本yolov8n_raw_list.txt

内容为

/data/raw/test01.raw

1.4 把Yolov8n的onnx模型转换为高通QNN格式

请确认步骤1.1中的环境已经安装完成,执行模型转换命令

参考文档 Qualcomm Documentation

先使用qnn-onnx-converter工具把onnx模型转换为量化并转换为QNN的中间文件

$QNN_SDK_ROOT/bin/x86_64-linux-clang/qnn-onnx-converter \
  --input_network ./yolov8n.onnx \
  --input_list yolov8n_raw_list.txt \
  --output_path ./qnn/yolov8n_quant.cpp \
  --quantization_overrides act.encodings

act.encodings 是一个json格式的文本文件,内容如下

{
	"activation_encodings": {
		"/model.22/Sigmoid_output_0": [
			{
				"bitwidth": 16,
				"dtype": "int",
				"is_symmetric": "False",
				"max": 0.996093750000,
				"min": 0.0,
				"offset": 0,
				"scale": 0.00001519941634
			}
		],
		"output0":[
			{
				"bitwidth": 16,
				"dtype": "int",
				"is_symmetric": "False",
				"max": 643.878662109375,
				"min": 0.0,
				"offset": 0,
				"scale": 0.00982495860394255
			}
		]
	},
	"param_encodings": {
		
	}
}

1.5 编译QNN生成的代码

使用 qnn-model-lib-generator 工具编译QNN生成的cpp代码

$QNN_SDK_ROOT/bin/x86_64-linux-clang/qnn-model-lib-generator  -c ./qnn/yolov8n_quant.cpp  -b ./qnn/yolov8n_quant.bin \
 -o ./qnn_libs -t aarch64-ubuntu-gcc9.4

最后在./qnn_libs/aarch64-ubuntu-gcc9.4文件夹下面得到libyolov8n_quant.so 文件到这一步我们完成了把Yolov8的模型文件转换成QNN格式的libyolov8n_quant.so文件

1.6 拷贝so文件到QCS6490的开发板

我们把++++1.5++++ ++++编译++++ ++++QNN++++ ++++生成的代码++++ 中生成的libyolov8n_quant.so文件拷贝的QCS6490的开发板上,同样的QCS6490也需要安装Qualcomm AI Engine Direct SDK

接下来我们做个图预编译的动作,把libyolov8n_quant.so序列化 为yolov8n_quant.bin文件

$QNN_SDK_ROOT/bin/aarch64-ubuntu-gcc9.4/qnn-context-binary-generator \
--model ./libyolov8n_quant.so \
--backend libQnnHtp.so  --binary_file yolov8n_quant

最后得到yolov8n_quant.bin 整个模型转换步骤完成

作者:Ricky Li

相关推荐
孤独且没人爱的纸鹤31 分钟前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
老艾的AI世界12 小时前
AI翻唱神器,一键用你喜欢的歌手翻唱他人的曲目(附下载链接)
人工智能·深度学习·神经网络·机器学习·ai·ai翻唱·ai唱歌·ai歌曲
飞起来fly呀1 天前
AI驱动电商新未来:提升销售效率与用户体验的创新实践
人工智能·ai
Jing_jing_X1 天前
心情追忆-首页“毒“鸡汤AI自动化
java·前端·后端·ai·产品经理·流量运营
刘悦的技术博客2 天前
MagicQuill,AI动态图像元素修改,AI绘图,需要40G的本地硬盘空间,12G显存可玩,Win11本地部署
ai·aigc·python3.11
探索云原生2 天前
大模型推理指南:使用 vLLM 实现高效推理
ai·云原生·kubernetes·gpu·vllm
Elastic 中国社区官方博客2 天前
Elasticsearch:如何部署文本嵌入模型并将其用于语义搜索
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
guanpinkeji2 天前
AI数字人视频小程序:引领未来互动新潮流
人工智能·ai·小程序·软件开发·小程序开发·ai数字人小程序
Elastic 中国社区官方博客3 天前
使用 Elasticsearch 构建食谱搜索(二)
大数据·人工智能·python·elasticsearch·搜索引擎·ai
良少3 天前
使用合适的Prompt充分利用ChatGPT的能力
人工智能·ai·chatgpt·prompt