圖像處理(1):PyTorch垃圾分類 數據預處理

基於深度學習框架PyTorch transforms 方法進行數據的預處理

作者:沈福利 北京工業大學碩士學位,高級算法專家。產品和技術負責人,專注於NLP、圖像、推薦系統

整個過程主要包括:縮放、裁剪、歸一化、標準化幾個基本步驟。

圖像歸一化是計算機視覺、模式識別等領域廣泛使用的一種技術。所謂圖像歸一化, 就是通過一系列變換, 將待處理的原始圖像轉換成相應的唯一標準形式(該標準形式圖像對平移、旋轉、縮放等仿射變換具有不變特性)

基於矩的圖像歸一化過程包括 4 個步驟 即座標中心化、x-shearing 歸一化、縮放歸一化和旋轉歸一化。

Pytorch:transforms方法

  1. 裁剪——Crop

中心裁剪:transforms.CenterCrop
隨機裁剪:transforms.RandomCrop
隨機長寬比裁剪:transforms.RandomResizedCrop
上下左右中心裁剪:transforms.FiveCrop
上下左右中心裁剪後翻轉,transforms.TenCrop

  1. 翻轉和旋轉——Flip and Rotation

依概率p水平翻轉:transforms.RandomHorizontalFlip(p=0.5)
依概率p垂直翻轉:transforms.RandomVerticalFlip(p=0.5)
隨機旋轉:transforms.RandomRotation

  1. 圖像變換

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.

  1. 對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

發佈了267 篇原創文章 · 獲贊 66 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章