計算機視覺——Opencv blobFromImage與torchvision實現數據標準化

1.blobFromImage

blobFromImage 是 OpenCV 的深度神經網絡(DNN)模塊中的一個函數,它用于將圖像轉換為深度學習模型所需的輸入格式,主要是對傳入的圖像進行的轉換包括圖像尺寸調整、均值減法、縮放等預處理步驟,以便圖像數據能夠適配深度學習模型的輸入要求。

以下是 blobFromImage 函數的一些關鍵點:

  • 圖像尺寸調整:函數可以根據需要調整圖像的尺寸,以匹配神經網絡的輸入尺寸。
  • 均值減法:可以指定一個均值(mean),該函數會從圖像的每個通道中減去這個均值。這通常用于數據中心化,以提高模型的訓練和推理性能。
  • 縮放:通過 scalefactor 參數,可以對圖像數據進行縮放,通常用于數據歸一化。
  • 通道交換:如果 swapRB 參數設置為 true,則會交換圖像的紅色(R)和藍色(B)通道,因為 OpenCV 默認使用 BGR 格式,而某些神經網絡框架使用 RGB 格式。
  • 裁剪:如果 crop 參數設置為 true,則在調整圖像大小時進行中心裁剪,以確保輸出尺寸與指定的尺寸精確匹配。
  • 數據類型:通過 ddepth 參數可以指定輸出 blob 的深度,通常選擇 CV_32F(32位浮點數)。
  • 批量處理:還有一個對應的函數 blobFromImages,用于將一系列圖像轉換為一個批量的 blob,這在處理圖像批次時更為高效。
    這個函數是 OpenCV DNN 模塊中進行圖像預處理的關鍵步驟,它使得 OpenCV 能夠與多種深度學習框架無縫集成,進行圖像分類、目標檢測、語義分割等任務。
    例如,在進行圖像分類時,可以使用 blobFromImage 對輸入圖像進行預處理,然后通過神經網絡模型進行推理,得到預測結果。在 OpenCV 的示例和相關博客文章中,提供了如何使用這個函數的詳細說明和示例代碼。

函數原型

Mat cv::dnn::blobFromImage	(	InputArray 	image,double 	scalefactor = 1.0,const Size & 	size = Size(),const Scalar & 	mean = Scalar(),bool 	swapRB = false,bool 	crop = false,int 	ddepth = CV_32F 
)

OpenCV中的DNN模塊包含blobFromImage方法對輸入神經網絡的圖像進行處理,blobFromImage函數執行的操作及順序為:

  • 先相對于原圖像中心resize,crop
  • 再減均值
  • 像素值縮放0-255 -> 0-1
  • 圖像數據通道轉換,RGB->BGR
  • 返回一個NCHW 數組

2.torchvision

torchvision庫中,transforms模塊提供了一系列用于數據增強和預處理的函數,這些函數可以在數據加載后、模型訓練前對圖像數據進行操作,以適配深度學習模型的輸入要求。ToTensorNormalize是兩個常用的轉換方法,它們通常聯合使用來實現圖像數據的標準化。

ToTensor轉換的作用是將圖像數據轉換為PyTorch模型可以接受的格式。具體來說,它執行以下操作:

  1. 轉換數據類型:將輸入圖像的數據類型從uint8轉換為浮點數(通常是float32)。
  2. 維度變換:將圖像的維度從HWC(高度、寬度、通道數)變換為CHW(通道數、高度、寬度)。這是因為PyTorch模型通常期望輸入數據遵循這種維度順序。
  3. 縮放像素值:將像素值從范圍0-255線性縮放到0-1。這是通過將每個像素值除以255來實現的。

Normalize

Normalize轉換用于對圖像數據進行標準化處理,通常在ToTensor之后使用。它主要執行以下操作:

  1. 減去均值:從圖像的每個通道中減去指定的均值。均值通常是根據整個數據集的每個通道的像素值計算得到的。
  2. 除以標準差:將減去均值后的圖像數據除以對應通道的標準差。這有助于進一步規范化數據,使其具有單位方差。

標準化公式是: x ? mean std \frac{x - \text{mean}}{\text{std}} stdx?mean?,其中x是原始像素值,mean是像素值的均值,std是標準差。

這兩個轉換方法的聯合使用可以有效地對輸入圖像進行預處理,使其格式和數值范圍適應深度學習模型的需要。這樣做不僅有助于模型的訓練過程,還可以提高模型的泛化能力。在實際應用中,這些轉換通常被組合在一起作為一個預處理管道,可以方便地應用于數據集中的每個圖像。

3.示例

通過一段簡單的程序介紹cv2.dnn.blobFromImage執行的操作與torchvision中的ToTensor+Normalize效果等同

import cv2
import torch
import torchvision
from torchvision import transforms
import numpy as np
from PIL import Image# 生成一個隨機顏色的4x4圖像,形狀為 (高度, 寬度, 通道數)
dd = np.random.randint(0, 255, (5, 5, 3), dtype=np.uint8)
print(f"原始圖像 dd: {dd}")print("===>>> 使用 PyTorch 的 torchvision 進行預處理")# 將 NumPy 數組轉換為 PyTorch 張量
tt = torch.tensor(dd)
print(f"轉換后的張量 tt: {tt}")# 將 NumPy 數組轉換為 PIL 圖像
tp = Image.fromarray(dd)# 使用 torchvision 的 Compose 來串聯多個轉換操作
trans = transforms.Compose([transforms.ToTensor(),  # 將 PIL 圖像轉換為張量,執行 HWC 到 CHW 的維度變換,并將像素值從 0-255 轉換為 0-1transforms.Normalize((.5, .5, .5), (1., 1., 1.))  # 標準化張量,減去均值 (.5, .5, .5) 并除以標準差 (1., 1., 1.)
])# 應用轉換操作
trans_tt = trans(tp)
print(trans_tt)
print(f"轉換后的張量形狀 trans_tt.shape: {trans_tt.shape}")print("===>>> 使用 OpenCV 的 cv2.dnn.blobFromImage 進行預處理")# 使用 OpenCV 的 blobFromImage 函數進行預處理
# 參數說明:
# dd: 輸入圖像
# 1/255: 縮放比例,將像素值從 0-255 轉換為 0-1
# (4, 4): 目標圖像尺寸,由于輸入圖像已經是 4x4,所以這里不執行尺寸變換
# (127.5, 127.5, 127.5): 用于減去的均值
# False, False: 分別表示不交換 R 和 B 通道,不進行裁剪
blob = cv2.dnn.blobFromImage(dd, 1/255, (5, 5), (127.5, 127.5, 127.5), False, False)
print(f"OpenCV blobFromImage 輸出的 blob: {blob}")
print(f"blob 的形狀 blog.shape: {blob.shape}")

上述代碼的輸出為:

原始圖像 dd: [[[ 24  53  15][  4 172 202][133  72  98][128  19 201][174 141  57]][[ 71 176 174][242 166 134][139 157 153][160 104 222][208  71 191]][[ 21 104 241][173 199 116][222  97  19][ 76 222 237][220  41  78]][[175 254  71][106  44  23][  1 142 205][157 236 211][214 235 128]][[246 104 169][186 112 187][176 181 251][108 232 173][203  25  55]]]
===>>> 使用 PyTorch 的 torchvision 進行預處理
轉換后的張量 tt: tensor([[[ 24,  53,  15],[  4, 172, 202],[133,  72,  98],[128,  19, 201],[174, 141,  57]],[[ 71, 176, 174],[242, 166, 134],[139, 157, 153],[160, 104, 222],[208,  71, 191]],[[ 21, 104, 241],[173, 199, 116],[222,  97,  19],[ 76, 222, 237],[220,  41,  78]],[[175, 254,  71],[106,  44,  23],[  1, 142, 205],[157, 236, 211],[214, 235, 128]],[[246, 104, 169],[186, 112, 187],[176, 181, 251],[108, 232, 173],[203,  25,  55]]], dtype=torch.uint8)
tensor([[[-0.4059, -0.4843,  0.0216,  0.0020,  0.1824],[-0.2216,  0.4490,  0.0451,  0.1275,  0.3157],[-0.4176,  0.1784,  0.3706, -0.2020,  0.3627],[ 0.1863, -0.0843, -0.4961,  0.1157,  0.3392],[ 0.4647,  0.2294,  0.1902, -0.0765,  0.2961]],[[-0.2922,  0.1745, -0.2176, -0.4255,  0.0529],[ 0.1902,  0.1510,  0.1157, -0.0922, -0.2216],[-0.0922,  0.2804, -0.1196,  0.3706, -0.3392],[ 0.4961, -0.3275,  0.0569,  0.4255,  0.4216],[-0.0922, -0.0608,  0.2098,  0.4098, -0.4020]],[[-0.4412,  0.2922, -0.1157,  0.2882, -0.2765],[ 0.1824,  0.0255,  0.1000,  0.3706,  0.2490],[ 0.4451, -0.0451, -0.4255,  0.4294, -0.1941],[-0.2216, -0.4098,  0.3039,  0.3275,  0.0020],[ 0.1627,  0.2333,  0.4843,  0.1784, -0.2843]]])
轉換后的張量形狀 trans_tt.shape: torch.Size([3, 5, 5])
===>>> 使用 OpenCV 的 cv2.dnn.blobFromImage 進行預處理
OpenCV blobFromImage 輸出的 blob: [[[[-0.40588236 -0.48431373  0.02156863  0.00196078  0.18235295][-0.22156863  0.4490196   0.04509804  0.12745099  0.3156863 ][-0.41764706  0.17843138  0.37058824 -0.20196079  0.3627451 ][ 0.18627451 -0.08431373 -0.49607843  0.11568628  0.3392157 ][ 0.46470588  0.22941177  0.19019608 -0.07647059  0.29607844]][[-0.29215688  0.17450981 -0.21764706 -0.4254902   0.05294118][ 0.19019608  0.1509804   0.11568628 -0.09215686 -0.22156863][-0.09215686  0.28039217 -0.11960784  0.37058824 -0.3392157 ][ 0.49607843 -0.327451    0.05686275  0.4254902   0.42156863][-0.09215686 -0.06078431  0.20980392  0.40980393 -0.4019608 ]][[-0.44117647  0.29215688 -0.11568628  0.2882353  -0.2764706 ][ 0.18235295  0.0254902   0.1         0.37058824  0.24901961][ 0.44509804 -0.04509804 -0.4254902   0.42941177 -0.19411765][-0.22156863 -0.40980393  0.30392158  0.327451    0.00196078][ 0.1627451   0.23333333  0.48431373  0.17843138 -0.28431374]]]]
blob 的形狀 blog.shape: (1, 3, 5, 5)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11177.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

架構設計之學新而知故

緣由 因為一些特殊的機緣,接觸到洋蔥架構等一些新架構設計概念。 嘗試理解了一段時間,就想簡單梳理下對它們的理解,以達到學新而知故 😃 信息增益 以前計算機專業并不設置通信領域的信息論的專業課程,但是&#xf…

輸出指定日期區間內的所有天、周、月

hutool獲取指定時間周幾 Slf4j public class DateWeekUtil {public static List<String> getDateWeek(String startDateString, String endDateString, List<Integer> codeList) {List<String> dateInfoList new ArrayList<>();List<Integer> v…

工作隨機:linux 掛載LVM管理模式的磁盤

文章目錄 前言一、創建一個分區二、創建PV三、創建VG四、創建LV五、格式化并掛載目錄 前言 在數據庫管理中&#xff0c;常有比較頭疼的問題&#xff0c;就是一段時間發展后我的磁盤空間不夠了&#xff0c;想要擴容原有的目錄很是頭疼&#xff0c;那么LVM管理的優勢就體現出來了…

JAVA學習-練習試用Java實現改寫字符串

問題&#xff1a; 鍵盤錄入一個字符串&#xff0c;將字符串中的大寫改成小寫&#xff0c;小寫改成大寫&#xff0c;數字改成。例如heLLO123,輸出后為HEllo** 解答思路&#xff1a; import java.util.Scanner;public class StringConversion {public static void main(String…

單元測試之JUnit5知識點總結及代碼示例

單元測試是軟件開發過程中的一種驗證手段&#xff0c;它針對最小的可測試部分&#xff08;通常是函數或方法&#xff09;進行檢查和驗證。其實單元測試還是挺重要的&#xff0c;不過國內很多公司的項目其實并沒有做好單元測試&#xff0c;或者根本就沒做單元測試&#xff0c;原…

英語復習之英語形近詞總結(四)

英語形近詞總結復習第四部分&#xff1a; 單詞 釋義例句 genuine 英 /?d?enju?n/ 美 /?d?enju?n/ adj.真實的&#xff0c;真正的&#xff1b;誠懇的 1.Only genuine refugees can apply for asylum. 只有真正的難民才能申請政治避難。 《牛津詞典》 2.This isnt a genui…

C++筆試強訓day19

目錄 1.小易的升級之路 2.禮物的最大價值 3.對稱之美 1.小易的升級之路 鏈接 模擬就行&#xff0c;唯一可能是難點得就是gcd&#xff08;最大公約數&#xff09; #include <iostream> using namespace std; #define int long long const int N 1e5 10; int arr[N];…

兒童懸吊訓練系統如何進行制動肌的動力訓練

兒童懸吊訓練系統進行制動肌的動力訓練&#xff0c;可以按照以下步驟進行&#xff1a; 評估&#xff1a;首先&#xff0c;治療師需要對兒童的制動肌進行評估&#xff0c;確定其穩定性和力量水平&#xff0c;從而制定合適的訓練計劃。 選擇訓練方式&#xff1a;根據評估結果&am…

利用IP地址查詢解決被“薅羊毛”的方法

在互聯網時代&#xff0c;隨著各種網絡詐騙手段的不斷更新和演變&#xff0c;“薅羊毛”成為了一種常見的網絡犯罪行為。其中&#xff0c;利用查詢IP地址進行欺詐活動已經成為一種普遍的手段。當個人或組織的IP地址被不法分子查詢后&#xff0c;可能會面臨虛假注冊、盜取個人信…

Python中的絕對路徑與相對路徑詳解

對路徑與相對路徑 Python中的絕對路徑與相對路徑詳解什么是路徑&#xff1f;絕對路徑優點&#xff1a;缺點&#xff1a;示例&#xff1a; 相對路徑優點&#xff1a;缺點&#xff1a;示例&#xff1a; Python中如何使用**重點內容**&#xff1a;**在Python中&#xff0c;建議使用…

AVL Cruise與Simulink聯合仿真(通過MATLAB DLL方式)

最近畢業設計需要用到AVL Cruise與Simulink進行聯合仿真&#xff0c;分析汽車模型的經濟性。下面介紹一下我所知的AVL Cruise與Simulink聯合仿真的幾種方式&#xff0c;它們各自的優缺點&#xff0c;以及DLL方式聯合仿真的具體配置過程。我這里用的MATLAB軟件版本是2021a&#…

有邊數限制的最短路

文章目錄 題目 有邊數限制的最短路算法分析1、問題&#xff1a;為什么Dijkstra不能使用在含負權的圖中&#xff1f;dijkstra詳細步驟2、什么是bellman - ford算法&#xff1f;3、bellman - ford算法的具體步驟4、在下面代碼中&#xff0c;是否能到達n號點的判斷中需要進行if(di…

水準網間接平差

目錄 一、原理概述二、案例分析三、代碼實現 一、原理概述 間接平差的函數模型和隨機模型為&#xff1a; L ^ B X ^ d D σ 0 2 Q σ 0 2 P ? 1 \hat{L}B\hat{X}d\\ D\sigma_0^2Q\sigma_0^2P^{-1} L^BX^dDσ02?Qσ02?P?1 誤差方程為&#xff1a; V B x ^ ? l VB\ha…

信息系統項目管理師0104:詳細可行性研究(7項目立項管理—7.2項目可行性研究—7.2.3詳細可行性研究)

點擊查看專欄目錄 文章目錄 7.2.3詳細可行性研究1.詳細可行性研究的依據2.詳細可行性研究的原則3.詳細可行性研究的方法4.詳細可行性研究的內容5.詳細可行性研究報告記憶要點總結7.2.3詳細可行性研究 詳細可行性研究是在項目決策前對與項目有關的技術、經濟、

智慧公廁:打造智能、安全、舒適的公共廁所新時代

隨著智慧城市建設的不斷推進&#xff0c;公共設施的智能化也已成為一種必然趨勢。在這一背景下&#xff0c;智慧公廁作為城市管理的一個重要方面&#xff0c;正逐漸走進人們的視野。通過對所在轄區內所有公共廁所的全域感知、全網協同、全業務融合以及全場景智慧的賦能&#xf…

如何訓練一個大模型:LoRA篇

目錄 寫在前面 一、LoRA算法原理 1.設計思想 2.具體實現 二、peft庫 三、完整的訓練代碼 四、總結 寫在前面 現在有很多開源的大模型&#xff0c;他們一般都是通用的&#xff0c;這就意味著這些開源大模型在特定任務上可能力不從心。為了適應我們的下游任務&#xff0c;…

使用Python構建一個簡單的圖書管理系統

Python是一種強大而靈活的編程語言&#xff0c;它可以用于構建各種類型的應用程序&#xff0c;包括圖書管理系統。在這篇文章中&#xff0c;我們將學習如何使用Python和一些常見的庫來創建一個簡單的圖書管理系統。 1. 設計數據庫模型 首先&#xff0c;我們需要設計數據庫模型…

【退役之重學 Java】初步認識 AQS

一、AQS 是什么 Abstract Queued Synchronizer &#xff0c;翻譯過來就是“抽象的排好隊的同步器”。 AQS 是一個用來構建鎖和同步器的框架。是用來構建鎖或者其他同步器組件的重量級基礎框架及整個JUC體系的基石&#xff0c;通過內置的FIFO隊列來完成線程獲取資源的排隊工作&…

centos7時間同步教程

針對問題&#xff1a;在我們使用虛擬機配置好centos7后&#xff0c;發現服務器時間和當前時間對不上 通過命令查看時間不同步 date 或者 date -R修改/etc/sysconfig/clock文件如下內容&#xff0c;保存 vi /etc/sysconfig/clockZONE“Asia/Shanghai” UTCtrue ARCfalse重寫/e…

251 基于matlab的動態粒子群算法

基于matlab的動態粒子群算法。普通粒子群算法無法感知外界環境的變化&#xff0c;在外界環境發生改變時無法實時進行響應&#xff0c;因而缺乏動態環境尋優能力。在普通粒子群算法基本上通過增加敏感粒子得到一種動態粒子群算法&#xff0c;該算法通過實時計算敏感粒子的適應度…