PyTorch圖像預處理全解析(transforms)

1. 引言

在深度學習計算機視覺任務中,數據預處理和數據增強是模型訓練的關鍵步驟,直接影響模型的泛化能力和最終性能表現。PyTorch 提供的 torchvision.transforms 模塊,封裝了豐富的圖像變換方法,能夠高效地完成圖像標準化、裁剪、翻轉等操作。該模塊支持兩種主要的使用方式:單步變換(Single Transform)和組合變換(Compose),可以靈活應對不同場景下的圖像處理需求。

本文將詳細解析 transforms 的核心 API、參數含義,并通過完整代碼示例演示其使用方法。主要內容包括:

  1. 基礎變換操作

    • 尺寸調整:Resize(target_size)
    • 隨機裁剪:RandomCrop(size, padding=None, pad_if_needed=False)
    • 中心裁剪:CenterCrop(size)
    • 隨機水平/垂直翻轉:RandomHorizontalFlip(p=0.5), RandomVerticalFlip(p=0.5)
  2. 顏色空間變換

    • 顏色抖動:ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
    • 隨機灰度化:RandomGrayscale(p=0.1)
    • 高斯模糊:GaussianBlur(kernel_size, sigma=(0.1, 2.0))
  3. 數據標準化

    • 歸一化:Normalize(mean, std)
    • 張量轉換:ToTensor()
  4. 實用組合方法

    • 變換鏈:Compose([transforms1, transforms2,...])
    • 隨機選擇:RandomApply(transforms, p=0.5)
    • 隨機排序:RandomOrder(transforms)

以圖像分類任務為例,一個典型的數據增強流程可能如下:

from torchvision import transformstrain_transform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])val_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])

其中,訓練集使用更豐富的增強策略以提高模型魯棒性,而驗證集則采用較簡單的預處理保持數據原始分布。通過合理配置這些變換參數,可以顯著提升模型在各種視覺任務(如圖像分類、目標檢測、語義分割等)中的表現。


2. transforms 概述

transforms 是 PyTorch 生態系統中 torchvision 庫的核心模塊之一,專門用于計算機視覺任務中的圖像數據處理。它提供了豐富的圖像變換方法,主要分為三大類功能:

  1. 圖像預處理

    • 尺寸調整:transforms.Resize() 可將圖像統一縮放到指定尺寸(如 256x256)
    • 歸一化:transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 使用 ImageNet 的均值和標準差進行標準化
    • 中心裁剪:transforms.CenterCrop(224) 從圖像中心裁剪出指定大小的區域
  2. 數據增強(常用于訓練階段防止過擬合):

    • 隨機裁剪:transforms.RandomCrop(224) 在隨機位置裁剪
    • 顏色變換:transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1)
    • 隨機水平翻轉:transforms.RandomHorizontalFlip(p=0.5)
    • 隨機旋轉:transforms.RandomRotation(degrees=15)
  3. 格式轉換

    • PIL圖像轉張量:transforms.ToTensor() 將圖像轉換為 PyTorch 張量(并自動將像素值歸一化到 [0,1])
    • 張量轉PIL圖像:transforms.ToPILImage()

組合使用示例

from torchvision import transforms# 訓練階段的變換流水線
train_transform = transforms.Compose([transforms.Resize(256),              # 縮放至256x256transforms.RandomCrop(224),          # 隨機裁剪224x224transforms.RandomHorizontalFlip(),   # 隨機水平翻轉transforms.ToTensor(),               # 轉為張量transforms.Normalize(mean=[0.485, 0.456, 0.406],  # 標準化std=[0.229, 0.224, 0.225])
])# 驗證階段的變換流水線(通常不包含隨機增強)
val_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

在實際應用中,這些變換可以顯著提升模型的泛化能力,特別是在數據量有限的情況下。對于不同的計算機視覺任務(如圖像分類、目標檢測等),可以根據具體需求組合不同的變換操作。


3. 核心 API 詳解

3.1 基礎變換

(1)?Resize(size)
  • 功能:調整圖像尺寸。

  • 參數

    • size?(int or tuple):目標尺寸。如果是?int,短邊縮放至該值,長邊按比例調整;如果是?(h, w),則強制縮放到指定大小。

  • 示例

transform = transforms.Resize(256)  # 短邊縮放到256,長邊按比例調整
transform = transforms.Resize((224, 224))  # 強制縮放到224x224
(2)?CenterCrop(size)
  • 功能:從圖像中心裁剪指定大小的區域。

  • 參數

    • size?(int or tuple):裁剪尺寸(int?表示正方形,(h, w)?表示矩形)。

  • 示例

transform = transforms.CenterCrop(224)  # 裁剪224x224的正方形
(3)?RandomCrop(size)
  • 功能:隨機位置裁剪圖像。

  • 參數

    • size?(int or tuple):裁剪尺寸。

    • padding?(int or tuple, optional):填充邊緣(防止裁剪過小)。

  • 示例

transform = transforms.RandomCrop(224, padding=10)  # 隨機裁剪224x224,邊緣填充10像素
(4)?RandomHorizontalFlip(p=0.5)
  • 功能:以概率?p?水平翻轉圖像(默認?p=0.5)。

  • 示例

transform = transforms.RandomHorizontalFlip(p=0.7)  # 70%概率水平翻轉
(5)?RandomRotation(degrees)
  • 功能:隨機旋轉圖像。

  • 參數

    • degrees?(float or tuple):旋轉角度范圍(如?30?表示?[-30°, 30°](10, 30)?表示?[10°, 30°])。

  • 示例

transform = transforms.RandomRotation(30)  # 隨機旋轉 ±30°

3.2 張量轉換 & 標準化

(1)?ToTensor()
  • 功能

    • 將?PIL.Image?或?numpy.ndarray?轉換為?torch.Tensor[C, H, W]?格式)。

    • 像素值從?[0, 255]?縮放到?[0.0, 1.0]

  • 示例

transform = transforms.ToTensor()  # 轉換為張量
(2)?Normalize(mean, std)
  • 功能:對張量進行標準化(逐通道計算:(x - mean) / std)。

  • 參數

    • mean?(list):各通道均值(如 ImageNet 的?[0.485, 0.456, 0.406])。

    • std?(list):各通道標準差(如 ImageNet 的?[0.229, 0.224, 0.225])。

  • 示例

transform = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
)

3.3 顏色變換

(1)?ColorJitter
  • 功能:隨機調整亮度、對比度、飽和度和色相。

  • 參數說明:

  • brightness (float 或 tuple):亮度調整范圍

    • 當輸入為單個浮點數時(如 0.2),表示亮度調整范圍為 [1-0.2, 1+0.2] = [0.8, 1.2]
    • 當輸入為元組時(如 (0.7, 1.3)),表示直接指定亮度調整范圍
    • 示例:brightness=0.5 表示圖片亮度將在原始值的50%-150%之間隨機調整
  • contrast (float 或 tuple):對比度調整范圍

    • 調節方式與brightness相同
    • 示例:contrast=(0.8, 1.5) 表示對比度將在原始值的80%-150%之間隨機調整
    • 應用場景:

    • 這些參數常用于圖像增強和數據增強任務
    • 在訓練深度學習模型時,隨機調整這些參數可以增加訓練數據的多樣性
    • 每個參數的調整都是在指定范圍內隨機取值,而不是固定值
    • saturation (float 或 tuple):飽和度調整范圍

      • 調節方式與brightness相同
      • 示例:saturation=0.3 表示飽和度將在原始值的70%-130%之間隨機調整
    • hue (float 或 tuple):色相調整范圍

      • 當輸入為單個浮點數時(如 0.1),表示色相調整范圍為 [-0.1, 0.1]
      • 當輸入為元組時(如 (-0.2, 0.3)),表示直接指定色相調整范圍
      • 注意:色相值通常以弧度表示,范圍一般為[-0.5, 0.5]
      • 示例:hue=0.05 表示色相將在[-0.05, 0.05]范圍內隨機調整
  • 示例

transform = transforms.ColorJitter(brightness=0.2,contrast=0.2,saturation=0.2,hue=0.1
)
(2)?Grayscale(num_output_channels=1)
  • 功能:將圖像轉為灰度圖。

  • 參數

    • num_output_channels:輸出通道數(1 或 3)。

  • 示例

transform = transforms.Grayscale(num_output_channels=3)  # 轉為3通道灰度圖

4. 完整代碼示例

4.1 定義訓練和測試的變換

from torchvision import transforms# 訓練集變換(含數據增強)
train_transform = transforms.Compose([transforms.RandomResizedCrop(224),      # 隨機縮放裁剪至224x224transforms.RandomHorizontalFlip(),      # 50%概率水平翻轉transforms.ColorJitter(                 # 隨機顏色調整brightness=0.2, contrast=0.2, saturation=0.2),transforms.ToTensor(),                 # 轉為張量 [C, H, W], 值范圍[0, 1]transforms.Normalize(                  # 標準化(ImageNet參數)mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 測試集變換(僅預處理)
test_transform = transforms.Compose([transforms.Resize(256),                # 短邊縮放到256transforms.CenterCrop(224),            # 中心裁剪224x224transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

4.2 應用到數據集?

from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader# 加載CIFAR10數據集(應用變換)
train_dataset = CIFAR10(root='./data', train=True, transform=train_transform,  # 應用訓練變換download=True
)test_dataset = CIFAR10(root='./data', train=False, transform=test_transform,   # 應用測試變換download=True
)# 創建DataLoader
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

5. 總結

使用 Compose 可以方便地組合多個變換操作,這些變換會按照添加順序依次執行。例如:

transforms.Compose([transforms.Resize(256),          # 調整圖像大小transforms.RandomCrop(224),      # 隨機裁剪transforms.ToTensor(),           # 轉換為張量transforms.Normalize(            # 標準化mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])
])

在實際應用中,訓練和測試階段通常采用不同的轉換策略:

標準化(Normalize)是一個關鍵步驟,它能:

當使用預訓練模型時,應該采用該模型訓練時使用的均值和標準差(常見的是 ImageNet 的統計值:mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])。如果不使用預訓練模型,可以計算自己數據集的統計值進行標準化。

  • PyTorch 中的 transforms 模塊是計算機視覺任務中圖像處理的核心工具,它提供了一系列用于圖像預處理、數據增強和數據類型轉換的功能。這些轉換操作可以高效地將原始圖像數據轉換為適合深度學習模型訓練的格式。

    主要功能包括:

  • 預處理:如圖像大小調整(Resize)、中心裁剪(CenterCrop)、轉換為張量(ToTensor)等基礎操作
  • 數據增強:訓練時增加數據多樣性的隨機變換,如隨機水平翻轉(RandomHorizontalFlip)、隨機旋轉(RandomRotation)
  • 張量轉換:將 PIL 圖像或 numpy 數組轉換為 PyTorch 張量,并進行數值歸一化等操作
  • 訓練階段:建議使用數據增強來提升模型泛化能力,常用增強方法包括:
    • RandomCrop:隨機裁剪圖像
    • ColorJitter:隨機調整亮度、對比度、飽和度
    • RandomHorizontalFlip:隨機水平翻轉
    • RandomRotation:隨機旋轉
  • 測試階段:通常只需基礎預處理,如固定大小的裁剪和標準化
  • 將輸入數據縮放到相近的數值范圍
  • 加速模型收斂過程
  • 提高訓練穩定性

掌握?transforms?的使用,可以顯著提升計算機視覺任務的效率和模型性能!?

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

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

相關文章

slam中的eskf觀測矩陣推導

在之前的《slam中的eskf推導》一文中,沒有寫觀測矩陣 H 矩陣的過程,現在補上這部分。前置列舉幾個等下推導需要用到的一些點:平面特征點構造觀測矩陣例如在 fastlio 中,是利用平面特征點到擬合平面的距離來構造觀測方程&#xff0…

Python_2

邏輯判斷 首先得首先&#xff0c;我們想判斷一個邏輯的正確與否&#xff0c;一定是需要一個能夠表現出邏輯的詞 如果我只說一個1 2&#xff0c;那么大家都不知道我在說什么但是如果我說1<2,那么大家就能判斷這個語句的正確與否了 下面是幾個常用的邏輯詞 < 小于>大于&…

Liunx-Lvs配置項目練習

1.實驗環境配置Lvs調度器有兩塊網卡 一塊僅主機和一塊nat網卡&#xff0c;客戶端nat模式&#xff0c;兩臺服務器為僅主機模式2.集群和分布式簡介集群與分布式系統簡介集群 (Cluster)集群是指將多臺計算機(通常為同構的)通過高速網絡連接起來&#xff0c;作為一個整體對外提供服…

T5(Text-to-Text Transfer Transformer) 模型

下面是對 T5&#xff08;Text-to-Text Transfer Transformer&#xff09; 模型的詳細介紹&#xff0c;包括其原理、架構、訓練方式、優勢與局限&#xff0c;以及與其他模型&#xff08;如 BERT、GPT&#xff09;的對比。一、T5 是什么&#xff1f;T5&#xff08;Text-to-Text T…

PostgreSQL技術大講堂 - 第97講:PG數據庫編碼和區域(locale)答疑解惑

PostgreSQL從入門到精通系列課程&#xff0c;近100節PG技術講解&#xff0c;讓你從小白一步步成長為獨當一面的PG專業人員&#xff0c;點擊這里查看章節內容。 PostgreSQL從入門到精通課程&#xff0c;持續更新&#xff0c;歡迎加入。第97講&#xff1a;PostgreSQL 數據庫編碼…

【IEEE獨立出版 】第六屆機器學習與計算機應用國際學術會議(ICMLCA 2025)

第六屆機器學習與計算機應用國際學術會議&#xff08;ICMLCA 2025&#xff09; 大會簡介 第六屆機器學習與計算機應用國際學術會議(ICMLCA 2025)定于2025年10月17-19日在中國深圳隆重舉行。本屆會議將主要關注機器學習和計算機應用面臨的新的挑戰問題和研究方向&#xff0c;著力…

對于編碼電機-520直流減速電機

編碼電機的介紹 編碼器是一種將角位移或者直線位移轉換成一連串電數字脈沖的一種傳感器。我們可以通過編碼器測量電機轉動的位移或者速度信息。 編碼器按照工作原理&#xff0c;可以分為增量式編碼器和絕對式編碼器&#xff0c;絕對式編碼器的每一個位置對應一個確定的數字碼&a…

Rust入門之并發編程基礎(三)

Rust入門之并發編程基礎&#xff08;三&#xff09; 題記&#xff1a;6月底7月初&#xff0c;結束北京的工作生活回到二線省會城市發展了&#xff0c;鴿了較久了&#xff0c;要繼續堅持學習Rust&#xff0c;堅持寫博客。 背景 我們平時使用計算機完成某項工作的時候&#xf…

一文讀懂循環神經網絡—深度循環神經網絡(DRNN)

目錄 一、從 RNN 到 DRNN&#xff1a;為什么需要 “深度”&#xff1f; 二、DRNN 的核心結構 1. 時間維度&#xff1a;循環傳遞 2. 空間維度&#xff1a;多層隱藏層 3. 雙向 DRNN&#xff08;Bidirectional DRNN&#xff09; 三、DRNN 的關鍵挑戰與優化 1. 梯度消失 / 爆…

磁懸浮軸承系統中由不平衡力引發的惡性循環機制深度解析

磁懸浮軸承系統中由不平衡力引發的 “振動-激勵-更大振動”惡性循環 是一個典型的 正反饋失控過程,其核心在于 傳感器信號的污染 與 控制器對真實位移的誤判。以下是其逐步演進的原理詳解: 惡性循環的觸發與演進 1:不平衡力的產生(根源) 轉子存在質量偏心,質心(CM)偏離…

優迅股份IPO隱憂:毛利水平“兩連降”,研發費用率不及行業均值

撰稿|行星來源|貝多財經近日&#xff0c;廈門優迅芯片股份有限公司&#xff08;下稱“優迅股份”&#xff09;的科創板IPO審核狀態變更為“已問詢”&#xff0c;中信證券為其保薦機構。天眼查App信息顯示&#xff0c;優迅股份成立于2003年2月&#xff0c;是中國首批專業從事光通…

Linux探秘坊-------15.線程概念與控制

1.線程概念 1.什么是線程2.線程 vs 進程不同的操作系統有不同的實現方式&#xff1a; linux &#xff1a;直接使用pcb的功能來模擬線程&#xff0c;不創建新的數據結構windows&#xff1a; 使用新的數據結構TCB&#xff0c;來進行實現&#xff0c;一個PCB里有很多個TCB 3.資源劃…

Github庫鏡像到本地私有Gitlab服務器

上一節我們看了如何架設自己的Gitlab服務器&#xff0c;今天我們看怎么把Github庫轉移到自己的Gitlab上。 首先登錄github&#xff0c;進入自己的庫復制地址。 克隆鏡像庫 在本地新建一個文件夾 在文件夾執行CMD指令 git clone --mirror gitgithub.com:thinbug/A.git–mirror參…

【C++】——類和對象(中)——默認成員函數

一、類的默認成員函數默認成員函數就是用戶沒有顯示實現&#xff0c;不過編譯器會自動生成的成員函數&#xff0c;稱為默認成員函數。一個類默認成員函數一共有6個&#xff0c;在我們不寫的情況下&#xff0c;編譯器就會自動生成這6個成員函數&#xff0c;不過我們重點要學習的…

MATLAB知識點總結

1.將A圖與B圖相同范圍內歸一化顯示在同一個figure上&#xff1a; figure, plot(A(150:450,500)/max(A(150:450,500))) hold on plot(D(150:450,500)/max(D(150:450,500)),‘R’) 將兩幅圖像的一定范圍顯示在同一圖像上。 figure,plot(A(350,100:450)) hold on plot(G(350,100:4…

易天光通信10G SFP+ 1550nm 120KM 雙纖光模塊:遠距離傳輸的實力擔當

目錄 前言 一、10G SFP雙纖光模塊概述 二、易天10G SFP 120KM 雙纖光模塊核心優勢與應用 核心優勢&#xff1a; 主要關鍵應用如下&#xff1a; 三、易天10G SFP 120KM 雙纖光模塊客戶優勢 總結 關于易天 前言 在構建高效穩定的網絡架構時&#xff0c;10G SFP 光模塊 12…

【深度學習】神經網絡 批量標準化-part6

九、批量標準化是一種廣泛使用的神經網絡正則化技術&#xff0c;對每一層的輸入進行標準化&#xff0c;進行縮放和平移&#xff0c;目的是加速訓練&#xff0c;提高模型穩定性和泛化能力&#xff0c;通常在全連接層或是卷積層之和&#xff0c;激活函數之前使用核心思想對每一批…

【數據可視化-67】基于pyecharts的航空安全深度剖析:墜毀航班數據集可視化分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【科研繪圖系列】R語言繪制分組箱線圖

文章目錄 介紹 加載R包 數據下載 導入數據 畫圖1 畫圖2 合并圖 系統信息 參考 介紹 【科研繪圖系列】R語言繪制分組箱線圖 加載R包 library(ggplot2) library(patchwork)rm(list = ls()) options(stringsAsFactors = F)

基于Android的旅游計劃App

項目介紹系統打開進入登錄頁面&#xff0c;如果沒有注冊過賬號&#xff0c;點擊注冊按鈕輸入賬號、密碼、郵箱即可注冊&#xff0c;注冊后可登錄進入系統&#xff0c;系統分為首頁、預訂、我的三大模塊&#xff0c;下面具體詳細說說三大模塊功能說明。1.首頁顯示旅游備忘或旅游…