bc 与 hbm 一致性比对

01 引言

使用地平线 征程 6 算法工具链时,算法侧在验证 quantized.bc 精度符合预期后,软件侧反馈 hbm 精度不符合预期,此时应该怎么做呢?(“打一架!”)

对于熟悉地平线算法工具链的用户而言,可能会立刻想到,使用 hb_verifier 工具比对 bc 与 hbm 的一致性即可,so easy!

但对于不太熟悉的同学,可能会遇到如下问题:

  1. hb_verifier 工具怎么用?
  2. 输入数据怎么准备?准备几个输入?准备什么 shape?什么 type?

为了结合用户的疑问详细介绍该过程,本文会举个非常详细的例子来介绍。有没有比 hb_verifier 更“优雅”的比对方式?当然是有的,欢迎往下看。

02 模型定义

quantized.bc 与 hbm 可以分为以下几类:

  • convert 后什么都不做的:quantized_stage1.bc,对应 quantized_stage1.hbm

  • 在 stage1 的基础上,插入前处理 nv12 节点的:quantized_nv12_stage2.bc,对应 quantized_nv12_stage2.hbm

  • 在 stage2 的基础上,删除尾部反量化节点的:quantized_nv12_remove_stage3.bc,对应 quantized_nv12_remove_stage3.hbm

理论上,大家直接比对 stage3.bc 与 stage3.hbm 的一致性即可,而这一步,也是最复杂的。

03 hb_verifier 简介

hb_verifier 比对 bc 与 hbm 一致性时,需要关注的信息如下:

bc 与 hbm 一致性比对时,输出信息如下:

本文的例子中,命令如下:

hb_verifier -m quantized_nv12_remove_stage3.bc,quantized_nv12_remove_stage3.hbm -i y_data.npy,uv_data.npy

04 输入数据准备

在地平线 docker 中,可以使用 hb_model_info 查看 bc 以及 hbm 的输入信息,或在 docker/开发板上使用 hrt_model_exec 工具查看模型输入信息,然后根据终端打印的模型输入数量、输入类型来准备输入数据,以 quantized_nv12_remove_stage3.bc/quantized_nv12_remove_stage3.hbm 为例,来准备输入数据。

hb_model_info quantized_nv12_remove_stage3.bc
hb_model_info quantized_nv12_remove_stage3.hbm

输入数据准备的代码如下:

from PIL import Image
import numpy as npdef generate_nv12(img):w,h = img.size# Convert images to YUV formatyuv_img = img.convert('YCbCr')y_data, u_data, v_data = yuv_img.split()# Convert Y, U, and V channel data to byte streamsy_data_bytes = y_data.tobytes()u_data_bytes = u_data.resize((u_data.width // 2, u_data.height // 2)).tobytes()v_data_bytes = v_data.resize((v_data.width // 2, v_data.height // 2)).tobytes()# Arrange the UV data in the form of UVUVUVUV... uvuvuv_data = bytearray()for u_byte, v_byte in zip(u_data_bytes, v_data_bytes):uvuvuv_data.extend([u_byte, v_byte])# Input for the hbir modely = np.frombuffer(y_data_bytes, dtype=np.uint8).reshape(1, h, w, 1).astype(np.uint8)np.save("y_data.npy", y)uv = np.frombuffer(uvuvuv_data, dtype=np.uint8).reshape(1, h//2, w//2, 2).astype(np.uint8)np.save("uv_data.npy", uv)return y, uvif __name__ == "__main__":# Create a random image with the shape (1, 512, 960, 3)# Generate random RGB values in the range 0-255image_data = np.random.randint(0, 256, (512, 960, 3), dtype=np.uint8)# Convert the numpy array to a PIL imageimg = Image.fromarray(image_data)y, uv = generate_nv12(img)

述代码只介绍了 NV12 输入时,如何准备输入数据,对于 int8、int16、bool 等类型如何准备输入数据呢?

import numpy as np
# 定义所有输入数据的形状和数据类型
data_dict = {'A_input': {'shape': (1, 32, 16), 'dtype': np.int8},'B_input': {'shape': (1, 1, 320, 4), 'dtype': np.int16},'C_input': {'shape': (32, 10, 10), 'dtype': np.bool_},
}# 生成数据并保存为 .npy 文件
for idx, (name, info) in enumerate(data_dict.items()):shape = info['shape']dtype = info['dtype']# 生成随机数据data = np.random.randint(0, 100, size=shape, dtype=dtype) if dtype == np.int16 else np.random.choice([True, False], size=shape)# 保存为 .npy 文件,文件名前加上编号np.save(f"{idx}_{name}.npy", data)print(f"Saved {idx}_{name}.npy")

05 hb_verfier 比对 bc 与 hbm 一致性

此时有模型:quantized_nv12_remove_stage3.bc,quantized_nv12_remove_stage3.hbm,有输入数据:y_data.npy,uv_data.npy。

在地平线征程 6 工具链提供的 docker 中,运行如下命令:

hb_verifier -m quantized_nv12_remove_stage3.bc,quantized_nv12_remove_stage3.hbm -i y_data.npy,uv_data.npy

结果如下:

可以发现,二者输出一致。

06 优雅的方案

使用一套数据,在 docker 中推理 bc 与 hbm,并比对一致性的 python 代码如下:

from hbdk4.compiler import load, Hbm
import numpy as np
from PIL import Imagedef generate_nv12(img):w,h = img.size# Convert images to YUV formatyuv_img = img.convert('YCbCr')y_data, u_data, v_data = yuv_img.split()# Convert Y, U, and V channel data to byte streamsy_data_bytes = y_data.tobytes()u_data_bytes = u_data.resize((u_data.width // 2, u_data.height // 2)).tobytes()v_data_bytes = v_data.resize((v_data.width // 2, v_data.height // 2)).tobytes()# Arrange the UV data in the form of UVUVUVUV... uvuvuv_data = bytearray()for u_byte, v_byte in zip(u_data_bytes, v_data_bytes):uvuvuv_data.extend([u_byte, v_byte])# Input for the hbir modely = np.frombuffer(y_data_bytes, dtype=np.uint8).reshape(1, h, w, 1).astype(np.uint8)# np.save("y_data.npy", y)uv = np.frombuffer(uvuvuv_data, dtype=np.uint8).reshape(1, h//2, w//2, 2).astype(np.uint8)# np.save("uv_data.npy", uv)return y, uvdef compare_arrays(array1, array2, decimal_places=2):"""Compare two arrays for consistency up to a specified number of decimal places.Parameters:- array1: First numpy array.- array2: Second numpy array.- decimal_places: Number of decimal places to consider for alignment.Returns:- are_equal: True if arrays are consistent up to the specified decimal places, False otherwise.- max_difference: Maximum difference (absolute value) if arrays are not consistent, else 0."""# Round the arrays to the specified decimal placesrounded1 = np.round(array1, decimals=decimal_places)rounded2 = np.round(array2, decimals=decimal_places)# Check equalityare_equal = np.array_equal(rounded1, rounded2)# Calculate maximum difference if not equalmax_difference = 0if not are_equal:max_difference = np.max(np.abs(array1 - array2))return are_equal, max_differencehbir = load("./quantized_nv12_remove_stage3.bc")
hbm = Hbm("./quantized_nv12_remove_stage3.hbm")# Create a random image with the shape (1, 512, 960, 3)
# Generate random RGB values in the range 0-255
image_data = np.random.randint(0, 256, (512, 960, 3), dtype=np.uint8)
# Convert the numpy array to a PIL image
img = Image.fromarray(image_data)
y, uv = generate_nv12(img)inputs = {"input_0_y": y, "input_0_uv": uv}# 分别进行hbir和Hbm推理
hbir_outputs = hbir[0].feed(inputs)
# print("hbir_outputs:", hbir_outputs)
hbm_x86_outputs = hbm[0].feed(inputs)
# print("hbm_x86_outputs:", hbm_x86_outputs)# 比较Hbir和hbm输出
for idx, v in enumerate(hbir[0].outputs):hbir_data = hbir_outputs[v.name]hbm_x86_data = hbm_x86_outputs[v.name]# Compare arraysare_equal, max_difference = compare_arrays(hbir_data, hbm_arrch64_data, decimal_places=4)if not are_equal:print("Maximum difference:", max_difference)else:print(f"outputs[{idx}] is equal!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853331.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3虚拟机和对象

2024年最推荐的python3版本为3.11 python虚拟机和对象 Python对象和虚拟机_v4.pdf Python虚拟机的原理 • 字节码生成 • 虚拟机运行 Python对象的实现 • 数据结构 • 类型系统 • 内存管理 Python虚拟机字节码和机器码有什么区别 字节码和机器码是计算机程序执行的两种不同形…

Buffer

Buffer(缓冲器)1. 概念 Buffer 是一个类似于数组的 对象 ,用于表示固定长度的字节序列 Buffer 本质是一段内存空间,专门用来处理 二进制数据 。2. 特点 1. Buffer 大小固定且无法调整 2. Buffer 性能较好,可以直接对计算机内存进行操作 3. 每个元素的大小为 1 字节(byte)…

夜莺监控V6版本如何升级到V7

升级目的 为了使用新版本的一些功能特性,故此进行升级。 注意事项 软件升级通常关键三个点:二进制替换 配置文件按照最新的格式调整 数据库表结构所以,在做升级之前,一定要先做好备份,备份的内容对应变更的内容,即:二进制、配置文件、数据库。 升级过程这里演示以二进制…

数据采集与融合综合实践

综合设计——多源异构数据采集与融合应用综合实践这个项目属于哪个课程 2024数据采集与融合技术实践组名 数据"融合炖" 异构 "大杂绘"队项目简介 项目名称:味谱魔法 项目logo: 项目介绍:智能购物菜谱助手是一款结合AI技术的智能化应用,旨在为用户提供…

交易系统:退款单模型设计详解

大家好,我是汤师爷~ 和退款单作为整个交易逆向系统的核心,支撑着售后管理环节。 售后域核心概念模型1、退款单 退款单是记录和跟踪退款处理过程的核心业务单据,包含以下关键信息:租户ID:标识所属商户或组织 退款单ID:退款单的唯一标识 原订单ID:关联的原始订单 业务类型…

DDPM论文解读

Denoising Diffusion Probabilistic Models论文解读DDPM(Denoising Diffusion Probabilistic Models) 论文研究背景扩散概率模型(Denoising Diffusion Probabilistic Models, 简称DDPM)是近年来生成建模领域的重要发展之一。 生成模型的目标是学习数据分布并能够从中采样,…

AtCoder Beginner Contest 384 Solution

AtCoder Beginner Contest 384 (A-E) 题解A - aaaadaa (abc384 A) 题目大意 给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。 解题思路 一个循环判断一下就行了。 代码 #include<bits/stdc++.h> using namespace std; int main() {int n…

vs编译cpp时设置排除项

cpp编译排除 一个c++文件不需要被编译但还保留在工程中(阅读),可使用ExcludedFromBuild,有两种方法实现:图形化操作 改vs的项目配置文件图形化操作 在vs的资源管理器选中文件 - 右键 - 属性 - 切到当前的编译配置项(debug/release),有个选项【从生成中排除】,选择为是…

纪念程云大侠

与程云兄的缘份,起始于Delphi大富翁论坛,因 “程云的一堆SQL”而结缘,在论坛发起的第二次(玉渊潭)和第三次(香山)大富翁聚会中逐渐相熟。自2002年5月3日那场坛友初聚起,加上中间各种小聚,至近年来的4年多共事时光,不经意间,二十余载岁月已悄然流逝,往昔匆匆,仿若弹…

css第三天案例练习

案例一:新闻详情 字体颜色:color 字体大小:font-size 段落开头空两行:font-indent:2em 水平居中:图片(出错点)/文字text-align:center 字体粗细:font-weight:400(取消加粗)案例二:css简介 超链接设置格式

DVR4 pg walkthrough Intermediate window

nmap ┌──(root㉿kali)-[~/lab] └─# nmap -p- -A -sS 192.168.219.179 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-15 04:22 UTC Stats: 0:00:22 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan SYN Stealth Scan Timing: About 34.76% d…

计算机网络课程笔记

计算机网络课程 该笔记于 2024年12月15日15:14:02 编写 常用命令以及简写完整命令 简写形式 解释configure terminal conf t 进入全局配置模式enable en enableexit ex 退出当前模式hostname host 重启设备interface int 进入接口配置模式shutdown shut 禁用接口no shutdown no…