項目 | 顏色通道順序 | 長寬通道順序 | 數據類型 | 取值范圍 |
---|---|---|---|---|
PIL | RGB | HWC | ndarray | 0-255 (byte) |
OpenCV | BGR | HWC | ndarray | 0-255 (byte) |
PyTorch | RGB/BGR (取決于如何讀取) | (N)CHW | tensor | 0-1 (float, 標準化后); 0-255 (int, 未標準化) |
注意以下幾點:
-
顏色通道順序:PIL默認使用RGB順序,而OpenCV使用BGR順序。PyTorch不直接指定顏色通道順序,它取決于你如何將圖像數據加載到tensor中。如果你直接從PIL或OpenCV加載圖像到PyTorch tensor,那么顏色通道順序將保持不變(除非你進行了額外的轉換)。
-
長寬通道順序:PIL和OpenCV都使用HWC(高度、寬度、通道)順序。PyTorch在處理圖像數據時,通常期望的輸入是CHW(通道、高度、寬度)順序,特別是當使用卷積神經網絡等模型時。但是,PyTorch的
torchvision.transforms
模塊提供了ToTensor()
等轉換函數,可以自動將HWC順序的PIL圖像或NumPy數組轉換為CHW順序的tensor。此外,PyTorch還允許使用額外的維度N(批量大小)來擴展CHW到NCHW,這在處理批量圖像時很常見。 -
數據類型:PIL和OpenCV都使用NumPy數組來存儲圖像數據,而PyTorch使用tensor。
-
取值范圍:PIL和OpenCV中的圖像數據通常以字節(byte)形式存儲,取值范圍為0-255。PyTorch中的tensor可以存儲浮點數或整數,具體取決于你的設置。在大多數情況下,PyTorch期望輸入圖像的像素值被標準化到0-1的浮點數范圍內,這是通過除以255來實現的。但是,如果你在處理分類任務等場景時,可能需要將圖像數據保持為0-255的整數范圍,并在模型中進行相應的調整。
-
(N)HWC vs. (N)CHW:我在PyTorch的“長寬通道順序”列中添加了(N)來表示可能存在的批量大小維度。在PyTorch中,處理單個圖像時通常使用CHW順序,但在處理批量圖像時,則使用NCHW順序。然而,需要注意的是,這種約定主要適用于CUDA操作和某些特定的PyTorch層/函數(如
torch.nn.Conv2d
)。在大多數情況下,當你使用torchvision.transforms
將PIL圖像或NumPy數組轉換為tensor時,你得到的是一個CHW順序的tensor(除非你使用了特定的轉換函數來改變這個順序)。然后,如果你需要將tensor輸入到支持批量處理的模型中,你可能需要手動添加一個額外的維度(即批量大小N)來形成NCHW順序的tensor。但是,這通常是由PyTorch的數據加載器(如torch.utils.data.DataLoader
)自動完成的。