一、为什么是灰度图

相较于 RGB 三通道图像,灰度图仅保留亮度信息(Y 分量),数据量减少 2/3,相比于常用的 NV12 图像,数据量减少 1/3,内存占用与计算负载显著降低。对于下游网络结构而言,单通道网络计算量/参数量也会更少,这对边缘设备的实时处理至关重要。

灰度图部署有一个问题:如何将视频流中的 NV12 数据高效转换为模型所需的灰度输入,并在工具链中实现标准化前处理流程。

视频通路传输的原始数据通常采用 NV12 格式,这是一种适用于 YUV 色彩空间的半平面格式:

  • 数据结构:NV12 包含一个平面的 Y 分量(亮度信息)和一个平面的 UV 分量(色度信息),其中 Y 分量分辨率为 W×H,UV 分量分辨率为 W×H/2。
  • 灰度图提取:对于灰度图部署,仅需使用 NV12 中的 Y 分量。以 1920×1080 分辨率为例,若 NV12 中 Y 与 UV 分量连续存储,Y 分量占据前 1920×1080 字节,后续部分为 UV 分量,可直接忽略或舍弃,若分开存储,使用起来更简单。

二、灰度图部署数据链路

视频通路过来的数据不能直接是灰度图,而是 nv12 数据,对于灰度图部署,可以只使用其中的 y 分量。

Description

2.1 手动插入前处理节点

在工具链提供的绝大部分材料中,前处理节点多是对于 3 通道网络、nv12 输入进行的,查看工具链用户手册《进阶内容->HBDK Tool API Reference》中几处 api 介绍,可以发现也是支持 gray 灰度图的,具体内容如下:

  • insert_image_convert(self, mode str = “nv12”)
Insert image_convert op. Change input parameter type.Args:* mode (str): Specify conversion mode, optional values are "nv12"(default) and "gray".Returns:List of newly inserted function arguments which is also the inputs of inserted image convert opRaises:ValueError when this argument is no longer validNote:To avoid the new insertion operator not running in some conversion passes, it is recommended to call the insert_xxx api before the convert stageExample:module = load("model.bc")func = module[0]res = func.inputs[0].insert_image_convert("nv12")

对于 batch 输入,均值、标准化、归一化等操作,可以在 insert_image_preprocess 中实现:

  • insert_image_preprocess( self, mode str, divisor int, mean List[float], std List[float], is_signed bool = True)
Insert image_convert op. Change input parameter type.Args:* mode (str): Specify conversion mode, optional values are "skip"(default, same as None), "yuvbt601full2rgb", "yuvbt601full2bgr", "yuvbt601video2rgb" and "yuvbt601video2bgr".Returns:List of newly inserted function arguments which is also the inputs of inserted image preprocess opRaises:ValueError when this argument is no longer validNote:To avoid the new insertion operator not running in some conversion passes, it is recommended to call the insert_xxx api before the convert stageExample:module = load("model.bc")func = module[0]res = func.inputs[0].insert_image_preprocess("yuvbt601full2rgb", 255, [0.485, 0.456, 0.406], [0.229, 0.224, 0.225], True)

手动插入前处理节点可参考:

mean = [0.485]
std = [0.229]
func = qat_bc[0]for input in func.flatten_inputs[::-1]:split_inputs = input.insert_split(dim=0)for split_input in reversed(split_inputs):node = split_input.insert_transpose([0, 3, 1, 2])node = node.insert_image_preprocess(mode="skip",divisor=255,mean=mean,std=std,is_signed=True)node.insert_image_convert(mode="gray")
  • mean = [0.485] 和 std = [0.229]:定义图像归一化时使用的均值和标准差
  • func = qat_bc[0]:获取量化感知训练 (QAT) 模型中的第一个函数 / 模块作为处理入口。
  • for input in func.flatten_inputs[::-1]:逆序遍历模型的所有扁平化输入节点。
  • split_inputs = input.insert_split(dim=0):将输入数据按批次维度 (dim=0) 分割,这是处理 batch 输入必须要做的。
  • node = split_input.insert_transpose([0, 3, 1, 2]):将数据维度从[B, H, W, C](NHWC 格式) 转换为[B, C, H, W](NCHW 格式),也是必须要做的。
  • node.insert_image_preprocess(…):执行图像预处理
  • node.insert_image_convert(mode=“gray”):插入单通道灰度图

三、全流程示例代码

import torch
import torch.nn as nn
import torch.nn.functional as F
from horizon_plugin_pytorch import set_march, March
set_march(March.NASH_M)
from horizon_plugin_pytorch.quantization import prepare, set_fake_quantize, FakeQuantState
from horizon_plugin_pytorch.quantization import QuantStub
from horizon_plugin_pytorch.quantization.hbdk4 import export
from horizon_plugin_pytorch.quantization.qconfig_template import calibration_8bit_weight_16bit_act_qconfig_setter, default_calibration_qconfig_setter
from horizon_plugin_pytorch.quantization.qconfig import get_qconfig, MSEObserver, MinMaxObserver
from horizon_plugin_pytorch.dtype import qint8, qint16
from torch.quantization import DeQuantStub
from hbdk4.compiler import statistics, save, load,visualize,compile,convert, hbm_perfclass SimpleConvNet(nn.Module):def __init__(self):super(SimpleConvNet, self).__init__()# 第一个节点:输入通道 1,输出通道 16,卷积核 3x3self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, stride=1, padding=1)# 后续添加一个池化层和一个全连接层self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.fc = nn.Linear(16 * 14 * 14, 10)  # 假设输入图像为 28x28self.quant = QuantStub()self.dequant = DeQuantStub()def forward(self, x):x = self.quant(x)x = self.conv1(x)      # 卷积层x = F.relu(x)          # 激活x = self.pool(x)       # 池化x = x.view(x.size(0), -1)  # Flattenx = self.fc(x)         # 全连接层输出x = self.dequant(x)return x# 构造模型
model = SimpleConvNet()# 构造一个假输入:batch_size=4,单通道,28x28 图像
example_input = torch.randn(4, 1, 28, 28)
output = model(example_input)print("输出 shape:", output.shape)  # torch.Size([4, 10])calib_model = prepare(model.eval(), example_input, qconfig_setter=(default_calibration_qconfig_setter,),)calib_model.eval()
set_fake_quantize(calib_model, FakeQuantState.CALIBRATION)
calib_model(example_input)calib_model.eval()                            
set_fake_quantize(calib_model, FakeQuantState.VALIDATION)
calib_out = calib_model(example_input)
print("calib输出数据:", calib_out)qat_bc = export(calib_model, example_input)
mean = [0.485]
std = [0.229]
func = qat_bc[0]for input in func.flatten_inputs[::-1]:split_inputs = input.insert_split(dim=0)for split_input in reversed(split_inputs):node = split_input.insert_transpose([0, 3, 1, 2])node = node.insert_image_preprocess(mode="skip",divisor=255,mean=mean,std=std,is_signed=True)node.insert_image_convert(mode="gray")quantized_bc = convert(qat_bc, "nash-m")
hbir_func = quantized_bc.functions[0]
hbir_func.remove_io_op(op_types = ["Dequantize","Quantize"])
visualize(quantized_bc, "model_result/quantized_batch4.onnx")
statistics(quantized_bc)
params = {'jobs': 64, 'balance': 100, 'progress_bar': True,'opt': 2,'debug': True, "advice": 0.0}
hbm_path="model_result/batch4-gray.hbm"
print("start to compile")
compile(quantized_bc, march="nash-m", path=hbm_path, **params)
print("end to compile")
ebug': True, "advice": 0.0}
hbm_path="model_result/batch4-gray.hbm"
print("start to compile")
compile(quantized_bc, march="nash-m", path=hbm_path, **params)
print("end to compile")

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

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

相关文章

计算机毕业设计 基于Hadoop的健康饮食推荐系统的设计与实现 Java 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python、大数据、人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇&…

基于海康SDK的C++实时视频流逐帧抓取存图小工具

目录 效果 项目 使用 代码 下载 效果 项目 使用 PlayDemo.exe <IP> <Port> <Username> <Password> 代码 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string> #include <iostream> #include <Windows.…

windows|引用账户被锁定 且暂时无法登录

问题描述尴了个尬&#xff0c;一直认为笔记本锁屏密码记得很牢靠&#xff0c;没想到因为少敲了一个点&#xff08;.&#xff09;&#xff0c;多次输入登陆失败&#xff0c;导致账户被锁定了&#xff0c;提示&#xff1a;引用账户被锁定 且暂时无法登录。然后用手机搜索了一下&a…

系统核心解析:深入操作系统内部机制——进程管理与控制指南(三)【进程优先级/切换/调度】

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

量子-resistant密码学研究

当亚马逊CloudFront在2025年9月宣布为所有TLS连接默认启用后量子加密支持时&#xff0c;这一举措标志着抗量子密码学从学术研究正式迈入大规模实用部署阶段。与此同时&#xff0c;密码学家们发出警告&#xff1a;一台拥有不到一百万噪声量子比特的计算机&#xff0c;可能在一周…

ARM 架构的存储器模型

ARM 架构的存储器模型 ARM 的存储器模型是一个相对复杂但设计精密的体系&#xff0c;它定义了处理器如何与内存进行交互&#xff0c;包括内存访问的顺序、可见性以及缓存行为等。这对于理解多核编程、并发控制和底层系统性能至关重要。 ARM 架构&#xff0c;特别是 ARMv8 及以后…

机器学习-多层感知机MLP

线性方法->多层感知机&#xff08;MLP&#xff09; 一个全连接&#xff08;线性、dense&#xff09;层有参数W∈Rm∗nW\in\R^{m*n}W∈Rm∗n,b∈Rmb\in\R^mb∈Rm&#xff0c;其用于计算输出yWxb∈RmyWxb\in\R^myWxb∈Rm 线性回归&#xff1a;全连接层有1个输出softmax 回归&a…

PostgreSQL——并行查询

这里写目录标题一、并行查询相关自己置参数二、并行扫描2.1、并行顺序扫描2.2、并行索引扫描2.3、并行index-only扫描2.4、并行bitmap heap扫描三、并行聚合四、多表关联4.1、Nested loop多表关联4.2、Merge join多表关联4.3、Hash join多表关联了解 Oracle 的朋友应该知道 Ora…

智能体赋能金融多模态报告自动化生成:技术原理与实现流程全解析

在金融领域&#xff0c;研报作为决策参考的核心载体&#xff0c;其生成过程往往涉及海量数据采集、多维度分析及专业内容整合&#xff0c;传统人工制作模式不仅耗时耗力&#xff0c;还难以满足实时性与标准化需求。随着人工智能技术的发展&#xff0c;“智能体赋能的金融多模态…

uniapp和vue3项目中引入echarts 、lime-echart(微信小程序、H5等)

目录标题1、获取 lime-echart插件2、安装 echarts3、相关代码4、在线定制5、效果截图1、获取 lime-echart插件 https://gitee.com/liangei/lime-echart 将其中组件和静态资源分别放入当前项目对应的文件夹中&#xff1a; 2、安装 echarts npm install echarts --save具体查…

ZYNQ7020+AD9361裸机驱动验证

1. 程序编译验证 a. 下载源代码 首先需要从GitHub下载相应的源码&#xff0c;打开git bash&#xff0c;然后在mingwin中使用以下命令下载源码。 git clone --recursive https://github.com/MicroPhase/antsdr_standalone.git 注意&#xff1a;在下载源码的时候&#xff0c;使…

Grafana配置连接时候证书与mongosqld启动证书的关系

目录 证书角色说明 1. BI Connector 端的证书 (--sslPEMKeyFile) 2. Grafana 端的证书 (TLS/SSL Client Certificate & Key) 它们之间的关系 配置建议 情况一&#xff1a;只需要服务器验证&#xff08;最常见&#xff09; 情况二&#xff1a;需要双向SSL认证&#x…

解决HTML/JS开发中的常见问题与实用资源

在前端开发过程中&#xff0c;即使是经验丰富的开发者也会遇到各种小问题。本文将聚焦于两个常见问题的解决方案&#xff0c;并推荐一些国内可访问的优质源码学习网站&#xff0c;帮助开发者提升效率。 一、字符编码与乱码问题解决 在HTML和JavaScript开发中&#xff0c;字符编…

SQLI-labs[Part 2]

本篇为SQLI-labs的Write-Up的第二部分包含Level 23- Level 27Level 23 过滤注释符 字符注入拼接语句发现注释符没有生效 应该是被过滤了那只能通过拼接语句来除去后面的影响拼接?id1 or 11?id1%27%20or%20%271%27%271源码中最后的导致语句闭合 Level 24 字符二次注入成功登录…

宋红康 JVM 笔记 Day17|垃圾回收器

一、今日视频区间 P169-P203 二、一句话总结 GC分类与性能指标&#xff1b;不同的垃圾回收器概述&#xff1b;Serial回收器&#xff1a;串行回收&#xff1b;ParNew回收器&#xff1a;并行回收&#xff1b;Parallel回收器&#xff1a;吞吐量优先&#xff1b;CMS回收器&#xff…

[硬件电路-194]:NPN三极管、MOS-N, IGBT比较

NPN三极管、MOS-N&#xff08;N沟道MOS管&#xff09;和IGBT&#xff08;绝缘栅双极型晶体管&#xff09;在电子电路设计中各有其独特的应用场景和优势&#xff0c;以下从工作原理、特性、应用领域三个维度进行比较&#xff1a;工作原理NPN三极管&#xff1a;结构&#xff1a;由…

【代码随想录day 25】 力扣 46. 全排列

视频讲解&#xff1a;https://www.bilibili.com/video/BV19v4y1S79W/?vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解&#xff1a;https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html#%E6%80%9D%E8%B7%AF 力扣题目&#xff1a;https://leetcode.cn/prob…

指针(五)后半

1、 qsort 函数1.1、qsort 函数排列结构体在这里&#xff0c;我们创建结构体类型的数组&#xff0c;用于 qsort 函数的传参。#include<stdio.h> #include<stdlib.h> #include<string.h>struct Stu//创建结构体变量 {char name[30];int age; };struct Stu arr…

TDengine 特殊选择函数 MODE() 用户手册

MODE 函数用户手册 函数定义 MODE(expr)功能说明 MODE() 函数返回指定列中出现频率最高的值&#xff08;众数&#xff09;。如果有多个值具有相同的最高频率&#xff0c;系统会返回其中一个值。该函数会忽略 NULL 值。 算法原理 MODE 函数的计算过程如下&#xff1a; 数据…

智能外骨骼技术应用场景及价格可接受区间分析

一、引言 智能外骨骼机器人融合机械、人工智能和传感器技术,增强或恢复人体运动能力。2025年,该技术在医疗康复、工业生产、军事应用和消费市场快速普及。本文分析其应用场景、市场需求、典型产品、价格可接受区间及相关来源,探讨普及的关键因素。 二、主要应用场景及产品…