TorchVision
- torchvision 包由流行的數據集、模型架構以及用于計算機視覺的通用圖片轉換工具組成
TorchVision 包構成
- 圖像變換和增強
- TVTensors
- 模型和預訓練的權重
- 數據集
- 工具
- 操作
- 圖像和視頻的編/解碼
- 用于模型檢測的特征提取
圖像變換和增強
- torchvision支持通用的計算機視覺變換;
- 變換可用于數據增強、訓練和推理;
- 用于圖片分類,探測,分割,視頻分類等;
- 大部分變換接收PIL圖像和張量格式的輸入;
- 基于性能的考慮推薦以張量的型式輸入;
- 張量圖像的期望形狀為:(C,H,W);
- 大部分變換支持批量的張量輸入;
- 批量張量圖像的形狀為(N,C,H,W),N為批量數目;
- V2變換接收任意數值作為前導維度(...,C,H,W),可以批量處理圖像或視頻;
- CPU和CUDA張量都給與支持;
數據類型和期望的范圍
- 張量圖像的值范圍被張量dtype隱式的定義;
- 具有float類型的張量圖像的值范圍期望為【0,1】;
- 具有integer類型的張量圖像的值范圍期望為【0,max_dtype】;
- 典型的torch.uint8類型的圖像期望的值范圍為【0,255】;
V1 or V2?
- 推薦使用V2;
- V2更快,功能更為豐富;
- V2的特點:
- 可以變換圖像、邊界框、掩膜或者視頻;
- 對圖像分類之外的任務提供支持:檢測、分割、視頻分類;
- 支持更多的變換,比如:CutMix和MixUp;
- 更快;
- 支持任意的輸入結構(字典、列表,元組等);
- 后續只對V2的進行功能更新;
- 完全向后兼容V1;
考慮性能
- 推薦使用V2:torchvision.transforms.v2
- 使用張量輸入而不是PIL圖像;
- 使用torch.uint8數據類型,尤其是對于resizing操作;
- resize操作推薦使用bilinear或者bicubic;
典型的變換流水線
from torchvision.transforms import v2
transforms=v2.Compose([v2.ToImage(),#Convert to tensor,only needed if you had a PIL imagev2.ToDtype(torch.uint8,scale=True),#optional,most input are already uint8 at this pointv2.RandomResizeCrop(size=(224,224),antialias=True),#Or Resize(antialias=True)v2.ToDtype(torch.float32,scale=True),#Normalize expects float inputv2.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])])
- 在num_workers>0的torch.utils.data.DataLoader的模塊作用下,上述代碼將給出典型訓練環境中的最好性能;
- 變換對輸入步長、內存格式敏感;
- 一些變換對于通道在前的圖像具有更快的性能;
- 另一些對通道在后的圖像具有更快的性能;
- 變換對于tensor的操作,將保持輸入的格式,但根據具體情況,這也不總是期望的;
- 如果追求更快的性能,可能需要自己去嘗試;
- 單個變換使用torch.compile()可幫助分解內存格式變量;
- 類似于Resize和RandomResizedCrop的變換,傾向于通道最后的輸入,且torch.compile()沒有任何優勢;
變換類、函數和內核
- 像Resize這樣的變化可以作為類來使用;
- 同時對于torchvision.transforms.v2.functional中的resize()函數也可作為類來使用;
- 以上兩種情況類似于torch.nn包,同時定義了類和功能等效的函數在torch.nn.functional中;
- 函數的功能支持PIL圖像,純張量格式的輸入或者TVTensors;
- resize(imgae_tensor)和resize(boxes)都是有效的;
- 像RandomCrop這樣的隨機變換當每次被調用時會隨機采樣參數;
- 但是他們的函數等效(crop())不做任何隨機采樣,因此具有稍有不同參數;
- 當使用函數API時,get_params()變換類方法被用于執行參數采樣;
- torchvision.transforms.v2.functional命名空間也包含稱為kernel的對象;
- 這些是低級別的函數實現核心的功能用于特定的類型,比如:resize_bounding_boxes和resized_crop_mask;
- 雖然沒有記錄,但他們是公開的;
- 如果你要想獲得torchscipt support用于bounding box 或mask類型的話,kernel是十分有用的;
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_trtansforms=torch.jit.script(transforms)