征程 6 灰度圖部署鏈路介紹

一、為什么是灰度圖

相較于 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年,該技術在醫療康復、工業生產、軍事應用和消費市場快速普及。本文分析其應用場景、市場需求、典型產品、價格可接受區間及相關來源,探討普及的關鍵因素。 二、主要應用場景及產品…