pytorchを使用していて、画像のオーグメンテーションによく使用されるものをまとめました
「画像の一部を消したいけど、それするやつの名前を忘れた・・・。」みたいな時に、参考にして下さい。
また、ここに出しているのは一部です。より詳細に知りたい方は、本家のPyTorchのtransformsのドキュメントを見て下さい。
準備
最初に、必要なライブラリのインポートと、今回扱うCIFAR10のデータセットのダウンロードをします。
また、画像を可視化する関数を準備しました。
# モジュールのimport
import torch
from torchvision import transforms, datasets
import matplotlib.pyplot as plt
# CIFAR10データセットのダウンロードする関数
def load_cifar10(transform):
cifar10_dataset = datasets.CIFAR10(
root='./',
transform=transform,
download=True)
return cifar10_dataset
# CIFAR10の画像を可視化する関数
def show_img(dataset):
plt.figure(figsize=(15, 3))
for i in range(5):
image, label = dataset[i]
image = image.permute(1, 2, 0)
plt.subplot(1, 5, i+1)
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.tick_params(bottom=False, left=False, right=False, top=False)
plt.imshow(image)
plt.savefig('a.png')
CIFAR10データセット
CIFAR10のデータセットを実際に見てみる。CIFAR10は、(32, 32)サイズで、5万枚のtrain画像・1万枚のtest画像からなります。
labelの種類は10クラスです。airplane (飛行機), automobile (自動車), bird (鳥), cat (猫), deer (鹿), dog (犬), frog (カエル), horse (馬), ship (船), truck (トラック)です。
# 画像の加工、pytorchではテンソル型にする。
transform = transforms.Compose([
transforms.ToTensor()
])
# CIFAR10のダウンロードと画像の可視化
cifar10_dataset = load_cifar10(transform)
show_img(cifar10_dataset)
Risize
画像の解像度を変更します。
CIFAR10のオリジナルのサイズは、(32, 32)です。今回は、画像のサイズを(16, 16)に解像度を落としています。
transform = transforms.Compose([
transforms.Resize(16),
transforms.ToTensor()
])
cifar10_dataset = load_cifar10(transform)
show_img(cifar10_dataset)
CenterCrop
中心部分を切り出します。
CIFAR10のオリジナルのサイズは、(32, 32)です。今回は、(24, 24)サイズで、中心部分を切り出しています。testデータに適用されることが多いです。
(また、冗長になるため、今回から可視化のコードは省略します。コード自体は上のものと同じです。)
transform = transforms.Compose([
transforms.CenterCrop(24),
transforms.ToTensor()
])
RandomCrop
こちらは、ランダムに(24, 24)サイズで、切り出しています。
CenterCropでは、必ず中心部分を取り出していたのに対して、RandomCropでは、中心部分かもしれないし、左上に寄った部分かもしれないし、右下に寄った部分かもしれません。訓練画像に適用されることが多いです。
transform = transforms.Compose([
transforms.RandomCrop(24),
transforms.ToTensor()
])
RandomHorizontalFlip
与えられた確率(p)でランダムに水平反転させます。
pのデフォルト値は0.5なので、pの値を設定しなければ、半分の確率で水平反転させます。
今回は、1枚目・2枚目・3枚目が水平反転されています。
transform = transforms.Compose([
transforms.RandomHorizontalFlip(p=0.5),
transforms.ToTensor()
])
RandomVerticalFlip
与えられた確率(p)でランダムに垂直反転させます。
pのデフォルト値は0.5なので、pの値を設定しなければ、半分の確率で垂直反転させます。
今回は、1枚目・4枚目・5枚目が垂直反転されています。
transform = transforms.Compose([
transforms.RandomVerticalFlip(p=0.5),
transforms.ToTensor()
])
RandomRotation
与えられた角度(degrees)の範囲で、ランダムに回転します。
今回はdegrees=30としたので、-30度から+30度までの範囲をランダムに取ります。
回転軸のcenterの値(デフォルトは中心)や、回転することで現れる部分の値(デフォルトは真っ黒)を変更することも出来ます。
transform = transforms.Compose([
transforms.RandomRotation(degrees=30),
transforms.ToTensor()
])
RandomErasing
p: Erasingされる確率。
scale: Erasingされる面積を全体の面積で割った数。デフォルト値では、全体の1/50から、1/3までErasingされる可能性があります。
ratio: Erasingされる長方形の縦横のアスペクト比。横長の長方形から、縦長の長方形まであります。
value: Erasingした範囲に適応する値です。デフォルト値では1が設定され、真っ黒になります。
transform = transforms.Compose([
transforms.RandomErasing(p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0),
transforms.ToTensor()
])
Normalize
テンソル画像を平均と標準偏差で正規化します。n 個のチャンネルについて mean. (M1,...,Mn) と標準偏差: (S1,...,Sn) が n 個のチャンネルに対して与えらます。
一般的なRGBのカラー画像だと、3チャンネルあるので、mean, stdそれぞれ3つずつ指定しています。
今回用いた値は、CIFAR10データセットで有効的な値を引っ張ってきています。
(注) Normalizeは、これまでのものと異なり、Tendor型に変更してから、適応します。
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
])
Grayscale
グレー画像に変換します。num_output_channelsで、出力画像を1チャンネルか3チャンネルかを選べます。
3チャンネルにした場合、それぞれのピクセルの3チャンネルには同じ値が入ります。
transform = transforms.Compose([
transforms.Grayscale(num_output_channels=3)
transforms.ToTensor()
])
RandomApply
transformを適用する確率を設定します。
例として、上記のGrayscaleを、0.5の確率で適応します。
今回は、1枚目・2枚目・5枚目がグレイスケールに変換されています。
transform = transforms.Compose([
transforms.RandomApply([transforms.Grayscale(num_output_channels=3)], p=0.5),
transforms.ToTensor()
])
#終わりに
pytorchを触り始めて経験が浅いですので、間違いがあれば教えて下さい。
自分は良く、transformsの名前を忘れるので、日本語でまとめた一覧があれば良いなと思い、記事にまとめました。
一人でも役立つ方が居れば、嬉しいです!!
気になったことがあれば、コメント下さい!