基於深度學習框架PyTorch transforms 方法進行數據的預處理
作者:沈福利 北京工業大學碩士學位,高級算法專家。產品和技術負責人,專注於NLP、圖像、推薦系統
整個過程主要包括:縮放、裁剪、歸一化、標準化幾個基本步驟。
圖像歸一化是計算機視覺、模式識別等領域廣泛使用的一種技術。所謂圖像歸一化, 就是通過一系列變換, 將待處理的原始圖像轉換成相應的唯一標準形式(該標準形式圖像對平移、旋轉、縮放等仿射變換具有不變特性)
基於矩的圖像歸一化過程包括 4 個步驟 即座標中心化、x-shearing 歸一化、縮放歸一化和旋轉歸一化。
Pytorch:transforms方法
- 裁剪——Crop
中心裁剪:transforms.CenterCrop
隨機裁剪:transforms.RandomCrop
隨機長寬比裁剪:transforms.RandomResizedCrop
上下左右中心裁剪:transforms.FiveCrop
上下左右中心裁剪後翻轉,transforms.TenCrop
- 翻轉和旋轉——Flip and Rotation
依概率p水平翻轉:transforms.RandomHorizontalFlip(p=0.5)
依概率p垂直翻轉:transforms.RandomVerticalFlip(p=0.5)
隨機旋轉:transforms.RandomRotation
- 圖像變換
resize:transforms.Resize
標準化:transforms.Normalize
轉爲tensor,並歸一化至[0-1]:transforms.ToTensor
填充:transforms.Pad
修改亮度、對比度和飽和度:transforms.ColorJitter
轉灰度圖:transforms.Grayscale
線性變換:transforms.LinearTransformation()
仿射變換:transforms.RandomAffine
依概率p轉爲灰度圖:transforms.RandomGrayscale
將數據轉換爲PILImage:transforms.ToPILImage
transforms.Lambda:Apply a user-defined lambda as a transform.
- 對transforms操作,使數據增強更靈活
transforms.RandomChoice(transforms), 從給定的一系列transforms中選一個進行操作
transforms.RandomApply(transforms, p=0.5),給一個transform加上概率,依概率進行操作
transforms.RandomOrder,將transforms中的操作隨機打亂
導入庫
# 導入torch 包
import torch
import torch.nn as nn
from torchvision import transforms
加載圖片數據
file_name ='../images/dog.jpg'
from PIL import Image
input_image = Image.open(file_name)
print(input_image)
print(input_image.size) # 尺寸大小:長=1546,寬1213
# 數據處理後,我們看看處理後圖片
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示符號
plt.imshow(input_image)
圖片數據預處理
preprocess = transforms.Compose([
# 1. 圖像變換:重置圖像分辨率,圖片縮放256 * 256
transforms.Resize(256),
# 2. 裁剪: 中心裁剪 ,依據給定的size從中心裁剪
transforms.CenterCrop(224),
# 3. 將PIL Image或者 ndarray 轉換爲tensor,並且歸一化至[0-1].注意事項:歸一化至[0-1]是直接除以255
transforms.ToTensor(),
# 4. 對數據按通道進行標準化,即先減均值,再除以標準差
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),#圖片歸一化
])
# 原始數據預處理
input_tensor = preprocess(input_image)
print('input_tensor.shape = ',input_tensor.shape)
print('input_tensor = ',input_tensor)
input_tensor.shape = torch.Size([3, 224, 224])
input_tensor = tensor([[[-1.9295, -1.9295, -1.9124, ..., -2.0323, -1.9467, -1.9295],
[-1.9980, -1.8953, -1.9124, ..., -1.9638, -1.9295, -1.7754],
[-1.9980, -1.9467, -1.9124, ..., -2.0494, -1.9638, -1.8953],
...,
[-1.4843, -1.6042, -1.6213, ..., -0.8678, -1.1075, -1.0733],
[-1.5357, -1.6042, -1.6213, ..., -1.0390, -1.6213, -1.4500],
[-1.5528, -1.4843, -1.2445, ..., -0.9192, -1.2788, -1.2617]],
[[-1.8256, -1.8256, -1.8081, ..., -1.9832, -1.9132, -1.9132],
[-1.8256, -1.8431, -1.8431, ..., -1.9657, -1.9307, -1.8782],
[-1.8256, -1.8431, -1.8606, ..., -1.9657, -1.9482, -1.9132],
...,
[-0.9853, -0.9678, -0.9853, ..., -0.4601, -0.6352, -0.6702],
[-0.9853, -0.9853, -1.0028, ..., -0.5651, -1.1253, -0.8978],
[-0.9503, -0.9853, -0.8102, ..., -0.3901, -0.8102, -0.7402]],
[[-1.6127, -1.5953, -1.5604, ..., -1.7173, -1.6999, -1.7173],
[-1.6650, -1.6302, -1.6302, ..., -1.7173, -1.7173, -1.6476],
[-1.6476, -1.6650, -1.6476, ..., -1.7347, -1.6999, -1.6824],
...,
[-1.3164, -1.5081, -1.5953, ..., -0.8981, -1.1596, -1.0898],
[-1.2990, -1.5256, -1.6127, ..., -0.9504, -1.4907, -1.3861],
[-1.2816, -1.4210, -1.2293, ..., -0.7413, -1.1247, -1.2816]]])
數據預處理後的效果
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示符號
input_tensor = input_tensor.permute(1,2,0) #Changing from 3x224x224 to 224x224x3
print('input_tensor.matplotlib.shape = ',input_tensor.shape)
#clamp表示夾緊,夾住的意思,torch.clamp(input,min,max,out=None)-> Tensor
input_tensor = torch.clamp(input_tensor,0,1)
print('input_tensor.matplotlib.clamp.shape = ',input_tensor.shape)
plt.imshow(input_tensor)
更多精彩內容請參考: https://github.com/shenfuli/ai