轉換影像、影片、邊界框等¶
Torchvision 在 torchvision.transforms.v2 模組中支援常見的計算機視覺轉換。轉換可用於轉換和增強訓練或推理的資料。支援以下物件:
純張量影像、
Image或 PIL 影像影片,作為
Video軸對齊和旋轉的邊界框,作為
BoundingBoxes分割和檢測掩碼,作為
Mask關鍵點,作為
KeyPoints。
# Image Classification
import torch
from torchvision.transforms import v2
H, W = 32, 32
img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8)
transforms = v2.Compose([
v2.RandomResizedCrop(size=(224, 224), antialias=True),
v2.RandomHorizontalFlip(p=0.5),
v2.ToDtype(torch.float32, scale=True),
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
img = transforms(img)
# Detection (re-using imports and transforms from above)
from torchvision import tv_tensors
img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8)
boxes = torch.randint(0, H // 2, size=(3, 4))
boxes[:, 2:] += boxes[:, :2]
boxes = tv_tensors.BoundingBoxes(boxes, format="XYXY", canvas_size=(H, W))
# The same transforms can be used!
img, boxes = transforms(img, boxes)
# And you can pass arbitrary input structures
output_dict = transforms({"image": img, "boxes": boxes})
轉換通常作為 Datasets 的 transform 或 transforms 引數傳遞。
從這裡開始¶
無論您是 Torchvision 轉換的新手,還是已經熟練使用它們,我們都鼓勵您從 開始使用 v2 轉換 入手,以瞭解有關新 v2 轉換功能的更多資訊。
然後,瀏覽本頁面下方的各部分,獲取一般資訊和效能提示。可用的轉換和函式列在 API 參考 中。
更多資訊和教程也可以在我們的 示例庫 中找到,例如 Torchvision 轉換 v2:端到端目標檢測/分割示例 或 如何編寫自己的 v2 轉換。
支援的輸入型別和約定¶
大多數轉換都接受 PIL 影像和張量輸入。CPU 和 CUDA 張量都支援。兩種後端(PIL 或張量)的結果應該非常接近。一般來說,我們建議 為了效能 依賴張量後端。 轉換轉換 可用於在 PIL 影像之間轉換,或用於轉換資料型別和範圍。
張量影像的形狀應為 (C, H, W),其中 C 是通道數,H 和 W 分別表示高度和寬度。大多數轉換都支援批次張量輸入。張量影像的批次是形狀為 (N, C, H, W) 的張量,其中 N 是批次中的影像數量。v2 轉換(v2)通常接受任意數量的前導維度 (..., C, H, W),並且可以處理批次影像或批次影片。
資料型別和預期值範圍¶
張量影像值的預期範圍由張量資料型別隱式定義。具有浮點資料型別的張量影像應具有 [0, 1] 中的值。具有整數資料型別的張量影像應具有 [0, MAX_DTYPE] 中的值,其中 MAX_DTYPE 是該資料型別可表示的最大值。通常,資料型別為 torch.uint8 的影像應具有 [0, 255] 中的值。
使用 ToDtype 來轉換輸入的資料型別和範圍。
V1 還是 V2?應該使用哪個?¶
簡而言之:我們建議使用 torchvision.transforms.v2 轉換而不是 torchvision.transforms 中的轉換。它們更快,功能也更多。只需更改匯入即可。將來,新功能和改進將僅為 v2 轉換進行考慮。
在 Torchvision 0.15(2023 年 3 月)中,我們在 torchvision.transforms.v2 名稱空間中釋出了一組新的轉換。與 v1 轉換(在 torchvision.transforms 中)相比,這些轉換具有許多優點:
它們可以轉換影像以及邊界框、掩碼、影片和關鍵點。這為影像分類以外的任務提供了支援:檢測、分割、影片分類、姿態估計等。請參閱 開始使用 v2 轉換 和 Torchvision 轉換 v2:端到端目標檢測/分割示例。
它們支援更多轉換,如
CutMix和MixUp。請參閱 如何使用 CutMix 和 MixUp 瞭解詳細資訊。它們更快。
它們支援任意輸入結構(字典、列表、元組等)。
未來的改進和功能將僅新增到 v2 轉換中。
這些轉換完全向後相容 v1 轉換,因此如果您已經在使用 torchvision.transforms 中的轉換,您只需將匯入更新為 torchvision.transforms.v2。在輸出方面,由於實現差異,可能存在微小的差異。
效能注意事項¶
為了從轉換中獲得最佳效能,我們建議遵循以下指南:
依賴
torchvision.transforms.v2中的 v2 轉換使用張量而不是 PIL 影像
使用
torch.uint8資料型別,尤其是在調整大小時使用雙線性或雙三次模式進行 resize
典型的轉換流水線可能如下所示:
from torchvision.transforms import v2
transforms = v2.Compose([
v2.ToImage(), # Convert to tensor, only needed if you had a PIL image
v2.ToDtype(torch.uint8, scale=True), # optional, most input are already uint8 at this point
# ...
v2.RandomResizedCrop(size=(224, 224), antialias=True), # Or Resize(antialias=True)
# ...
v2.ToDtype(torch.float32, scale=True), # Normalize expects float input
v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
以上應該能在典型的訓練環境中為您提供最佳效能,該環境依賴於具有 num_workers > 0 的 torch.utils.data.DataLoader。
轉換往往對輸入步幅/記憶體格式敏感。某些轉換在通道優先影像上會更快,而另一些則更喜歡通道最後。像 torch 運算子一樣,大多數轉換會保留輸入的記憶體格式,但這可能由於實現細節而並非總是得到遵守。如果您追求最佳效能,您可能需要做一些實驗。對單個轉換使用 torch.compile() 可能也有助於消除記憶體格式變數(例如,在 Normalize 上)。請注意,我們討論的是記憶體格式,而不是 張量形狀。
請注意,像 Resize 和 RandomResizedCrop 這樣的 resize 轉換通常更喜歡通道最後的輸入,並且目前不會從 torch.compile() 中受益。
轉換類、函式和核心¶
轉換以類的形式提供,例如 Resize,也以函式的形式提供,例如 torchvision.transforms.v2.functional 名稱空間中的 resize()。這非常類似於 torch.nn 包,該包在 torch.nn.functional 中同時定義了類和函式等價物。
函式支援 PIL 影像、純張量或 TVTensors,例如 resize(image_tensor) 和 resize(boxes) 都是有效的。
注意
隨機轉換(如 RandomCrop)每次呼叫時都會隨機取樣一個引數。它們的函式對應項(crop())不進行任何隨機取樣,因此引數略有不同。轉換類的 get_params() 類方法可用於在使用函式式 API 時執行引數取樣。
此外,torchvision.transforms.v2.functional 名稱空間還包含我們稱之為“核心”的內容。這些是實現特定型別核心功能的低階函式,例如 resize_bounding_boxes 或 resized_crop_mask。它們是公共的,但未被記錄。請檢視 程式碼 以檢視哪些可用(請注意,以_開頭的是不公開的!)。核心僅在您想要torchscript 支援以用於邊界框或掩碼等型別時才真正有用。
Torchscript 支援¶
大多數轉換類和函式都支援 torchscript。要組合轉換,請使用 torch.nn.Sequential 而不是 Compose。
transforms = torch.nn.Sequential(
CenterCrop(10),
Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
)
scripted_transforms = torch.jit.script(transforms)
警告
v2 轉換支援 torchscript,但如果您對 v2 **類**轉換呼叫 torch.jit.script(),您將實際上得到其(scripted)v1 等價物。由於 v1 和 v2 之間的實現差異,這可能導致指令碼執行和即時執行之間的結果略有不同。
如果您確實需要 v2 轉換的 torchscript 支援,我們建議對 torchvision.transforms.v2.functional 名稱空間中的函式進行指令碼化,以避免意外。
另請注意,函式僅支援純張量(始終被視為影像)的 torchscript。如果您需要對邊界框或掩碼等其他型別的 torchscript 支援,您可以依賴底層核心。
要與 torch.jit.script 一起使用的任何自定義轉換,應從 torch.nn.Module 派生。
另請參閱:Torchscript 支援。
V2 API 參考 - 推薦¶
幾何¶
調整大小¶
|
將輸入調整到給定大小。 |
|
根據 “Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation” 對輸入執行大尺度抖動。 |
|
隨機調整輸入大小。 |
|
隨機調整輸入大小。 |
函式
|
有關詳細資訊,請參閱 |
裁剪¶
|
從隨機位置裁剪輸入。 |
|
隨機裁剪輸入的一部分並將其調整為給定大小。 |
|
來自 “SSD: Single Shot MultiBox Detector” 的隨機 IoU 裁剪轉換。 |
|
從中心裁剪輸入。 |
|
將影像或影片裁剪為四個角和中心裁剪。 |
|
將影像或影片裁剪為四個角和中心裁剪,外加這些的翻轉版本(預設使用水平翻轉)。 |
函式
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
其他¶
以給定的機率水平翻轉輸入。 |
|
以給定的機率垂直翻轉輸入。 |
|
|
在所有邊上用給定的“填充”值填充輸入。 |
|
來自 “SSD: Single Shot MultiBox Detector” 的“Zoom out”轉換。 |
|
按角度旋轉輸入。 |
|
保持中心不變的隨機仿射變換輸入。 |
|
以給定的機率執行輸入的隨機透視變換。 |
|
使用彈性變換轉換輸入。 |
函式
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
顏色¶
|
隨機改變影像或影片的亮度、對比度、飽和度和色調。 |
隨機排列影像或影片的通道 |
|
|
隨機扭曲影像或影片,如 SSD: Single Shot MultiBox Detector 中所述。 |
|
將影像或影片轉換為灰度。 |
|
將影像或影片轉換為 RGB(如果它們本身不是 RGB)。 |
|
以給定的機率(預設為 0.1)隨機將影像或影片轉換為灰度。 |
|
使用隨機選擇的高斯模糊核模糊影像。 |
|
向影像或影片新增高斯噪聲。 |
|
以給定的機率反轉給定影像或影片的顏色。 |
|
透過減少每個顏色通道的位數,以給定的機率對影像或影片進行鑲嵌化處理。 |
|
透過反轉高於閾值的所有畫素值,以給定的機率對影像或影片進行曝光過度處理。 |
|
以給定的機率調整影像或影片的清晰度。 |
以給定的機率自動對比影像或影片的畫素。 |
|
|
以給定的機率均衡影像或影片的直方圖。 |
函式
|
根據給定的排列順序重新排列輸入的通道。 |
|
有關詳細資訊,請參閱 |
有關詳細資訊,請參閱 |
|
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
請參閱 |
|
請參閱 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
|
有關詳細資訊,請參閱 |
|
|
|
|
有關詳細資訊,請參閱 |
|
調整亮度。 |
|
調整飽和度。 |
|
調整色調 |
|
調整伽馬。 |
組合¶
|
將多個轉換組合在一起。 |
|
以給定的機率隨機應用一系列變換。 |
|
隨機從列表中選擇一個轉換並應用。 |
|
以隨機順序應用一系列轉換。 |
雜項¶
使用平方變換矩陣和離線計算的均值向量轉換張量影像或影片。 |
|
|
使用均值和標準差對張量影像或影片進行歸一化。 |
|
隨機選擇輸入影像或影片中的一個矩形區域並擦除其畫素。 |
|
將使用者定義的函式作為轉換應用。 |
|
刪除退化/無效的邊界框及其相應的標籤和掩碼。 |
|
移除影像區域外的關鍵點及其相應的標籤(如果有)。 |
|
將邊界框限制在其對應的影像尺寸內。 |
將關鍵點限制在其對應的影像尺寸內。 |
|
|
從影片的時間維度均勻地抽取 |
|
對給定的影像應用 JPEG 壓縮和解壓縮。 |
函式
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
|
刪除退化/無效的邊界框並返回相應的索引掩碼。 |
|
移除影像區域外的關鍵點及其相應的標籤(如果有)。 |
|
有關詳細資訊,請參閱 |
|
有關詳細資訊,請參閱 |
有關詳細資訊,請參閱 |
|
|
有關詳細資訊,請參閱 |
轉換¶
注意
請注意,以下某些轉換轉換會縮放值,而另一些可能不會進行任何縮放。縮放是指例如 uint8 -> float32 會將 [0, 255] 範圍對映到 [0, 1](反之亦然)。請參閱 資料型別和預期值範圍。
將張量、ndarray 或 PIL Image 轉換為 |
|
將所有 TVTensor 轉換為純張量,移除關聯的元資料(如果有)。 |
|
將 PIL Image 轉換為相同型別的張量 - 此操作不縮放值。 |
|
|
將張量或 ndarray 轉換為 PIL 影像 |
|
將輸入轉換為指定的資料型別,並可以選擇為影像或影片縮放值。 |
|
將邊界框座標轉換為給定的 |
函式
|
有關詳細資訊,請參閱 |
將 PIL 影像轉換為相同型別的張量。 |
|
|
將張量或 ndarray 轉換為 PIL Image。 |
|
有關詳細資訊,請參閱 |
有關詳細資訊,請參閱 |
已棄用
[已棄用] 請使用 |
|
|
[已棄用] 請使用 to_image() 和 to_dtype() 代替。 |
|
[已棄用] 請使用 |
|
[已棄用] 請使用 to_dtype() 代替。 |
自動增強¶
AutoAugment 是一種常見的資料增強技術,可以提高影像分類模型的準確性。儘管資料增強策略與其訓練資料集直接相關,但經驗研究表明,ImageNet 策略在應用於其他資料集時可以帶來顯著的改進。在 TorchVision 中,我們實現了三個在以下資料集上學習到的策略:ImageNet、CIFAR10 和 SVHN。新的轉換可以單獨使用,也可以與現有轉換混合搭配。
|
基於 “AutoAugment: Learning Augmentation Strategies from Data” 的 AutoAugment 資料增強方法。 |
|
基於 “RandAugment: Practical automated data augmentation with a reduced search space” 的 RandAugment 資料增強方法。 |
|
獨立於資料集的資料增強,採用 TrivialAugment Wide,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 所述。 |
|
基於 “AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty” 的 AugMix 資料增強方法。 |
CutMix - MixUp¶
CutMix 和 MixUp 是特殊的轉換,用於處理批次而不是單個影像,因為它們會組合成對的影像。這些可以在資料載入器之後(一旦樣本被批處理),或者作為 collate 函式的一部分使用。有關詳細用法示例,請參閱 如何使用 CutMix 和 MixUp。
|
將 CutMix 應用於提供的影像和標籤批次。 |
|
將 MixUp 應用於提供的影像和標籤批次。 |
開發者工具¶
實現您自己的 v2 轉換的基類。 |
|
裝飾一個核心,將其註冊到一個函式和一個(自定義)tv_tensor 型別。 |
|
返回高度和寬度。 |
|
返回通道、高度和寬度。 |
|
返回輸入中的邊界框。 |
|
返回輸入中的關鍵點。 |
V1 API 參考¶
幾何¶
|
將輸入影像調整為給定大小。 |
|
從隨機位置裁剪給定影像。 |
|
隨機裁剪影像的一部分並將其調整為給定大小。 |
|
從中心裁剪給定影像。 |
|
將給定影像裁剪為四個角和中心裁剪。 |
|
將給定影像裁剪為四個角和中心裁剪,外加這些的翻轉版本(預設使用水平翻轉)。 |
|
在所有邊上用給定的“填充”值填充給定影像。 |
|
按角度旋轉影像。 |
|
保持中心不變的影像隨機仿射變換。 |
|
以給定的機率對給定影像執行隨機透視變換。 |
|
使用彈性變換轉換張量影像。 |
|
以給定的機率隨機水平翻轉給定影像。 |
|
以給定的機率隨機垂直翻轉給定影像。 |
顏色¶
|
隨機改變影像的亮度、對比度、飽和度和色調。 |
|
將影像轉換為灰度。 |
|
以給定的機率(預設為 0.1)隨機將影像轉換為灰度。 |
|
使用隨機選擇的高斯模糊模糊影像。 |
|
以給定的機率隨機反轉給定影像的顏色。 |
|
透過在給定機率下隨機地減少每個顏色通道的位元數來實現影像的色調分離。 |
|
透過在給定機率下隨機地反轉高於閾值的所有畫素值來對影像進行曝光處理。 |
|
透過在給定機率下隨機地調整影像的銳度。 |
|
透過在給定機率下隨機地自動調整給定影像的畫素對比度。 |
|
透過在給定機率下隨機地均衡給定影像的直方圖。 |
組合¶
|
將多個轉換組合在一起。 |
|
以給定的機率隨機應用一系列變換。 |
|
隨機從列表中選擇一個轉換並應用。 |
|
以隨機順序應用一系列轉換。 |
雜項¶
|
使用離線計算的方陣變換矩陣和均值向量轉換張量影像。 |
|
使用均值和標準差對張量影像進行歸一化。 |
|
隨機選擇torch.Tensor影像中的一個矩形區域並擦除其畫素。 |
|
將使用者定義的lambda函式作為變換應用。 |
轉換¶
注意
請注意,以下某些轉換轉換會縮放值,而另一些可能不會進行任何縮放。縮放是指例如 uint8 -> float32 會將 [0, 255] 範圍對映到 [0, 1](反之亦然)。請參閱 資料型別和預期值範圍。
|
將張量或 ndarray 轉換為 PIL 影像 |
|
將 PIL 影像或 ndarray 轉換為張量並相應地縮放值。 |
將 PIL Image 轉換為相同型別的張量 - 此操作不縮放值。 |
|
|
將張量影像轉換為指定的 |
自動增強¶
AutoAugment 是一種常見的資料增強技術,可以提高影像分類模型的準確性。儘管資料增強策略與其訓練資料集直接相關,但經驗研究表明,ImageNet 策略在應用於其他資料集時可以帶來顯著的改進。在 TorchVision 中,我們實現了三個在以下資料集上學習到的策略:ImageNet、CIFAR10 和 SVHN。新的轉換可以單獨使用,也可以與現有轉換混合搭配。
|
在不同資料集上學習到的AutoAugment策略。 |
|
基於 “AutoAugment: Learning Augmentation Strategies from Data” 的 AutoAugment 資料增強方法。 |
|
基於 “RandAugment: Practical automated data augmentation with a reduced search space” 的 RandAugment 資料增強方法。 |
|
獨立於資料集的資料增強,採用 TrivialAugment Wide,如 “TrivialAugment: Tuning-free Yet State-of-the-Art Data Augmentation” 所述。 |
|
基於 “AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty” 的 AugMix 資料增強方法。 |
函式式變換¶
|
調整影像的亮度。 |
|
調整影像的對比度。 |
|
對影像執行伽馬校正。 |
|
調整影像的色相。 |
|
調整影像的色彩飽和度。 |
|
調整影像的銳度。 |
|
對影像應用仿射變換,保持影像中心不變。 |
|
透過重新對映每個通道的畫素來最大化影像對比度,使最低值變為黑色,最高值變為白色。 |
|
從中心裁剪給定影像。 |
|
將張量影像轉換為指定的 |
|
在指定位置和輸出大小處裁剪給定影像。 |
|
透過對輸入應用非線性對映來均衡影像的直方圖,以便在輸出中建立均勻分佈的灰度值。 |
|
使用給定值擦除輸入張量影像。 |
|
將給定影像裁剪為四個角和中心裁剪。 |
|
使用給定核對影像執行高斯模糊。 |
|
以[通道數, 高度, 寬度]的格式返回影像的尺寸。 |
返回影像的通道數。 |
|
|
以[寬度, 高度]的格式返回影像的大小。 |
|
水平翻轉給定影像。 |
|
反轉RGB/灰度影像的顏色。 |
|
使用均值和標準差對浮點張量影像進行歸一化。 |
|
在所有邊上用給定的“填充”值填充給定影像。 |
|
對給定影像執行透視變換。 |
|
將 PIL 影像轉換為相同型別的張量。 |
|
透過減少每個顏色通道的位元數來使影像的色調分離。 |
|
將輸入影像調整為給定大小。 |
|
裁剪給定影像並將其調整為所需大小。 |
|
將RGB影像轉換為灰度版本。 |
|
按角度旋轉影像。 |
|
透過反轉高於閾值的所有畫素值來對RGB/灰度影像進行曝光處理。 |
|
從給定影像生成十個裁剪後的影像。 |
|
將任何模式(RGB, HSV, LAB等)的PIL影像轉換為灰度版本。 |
|
將張量或 ndarray 轉換為 PIL Image。 |
|
將 |
|
垂直翻轉給定影像。 |