アイキャッチ画像

ChainerCVで使える画像のデータ拡張

ChainerCVで画像データのデータ拡張(Data Augmentation)を試してみました。

目次

  1. データ拡張とは
  2. フリップ
  3. ランダムフリップ
  4. センタークロップ
  5. ランダムクロップ
  6. ランダムサイズクロップ
  7. 回転
  8. ランダム回転
  9. 拡大縮小
  10. 拡大縮小(サイズ指定)
  11. 拡大縮小(拡張)
  12. ランダム拡張
  13. 10パターンクロップ
  14. PCA color augmentation

データ拡張とは

ディープラーニングでネットワークに画像を学習させる際に、画像データにあれこれ加工を加えた物を与えることで学習データを水増しするとか過学習を抑制するとかいうものです。

ChainerCVにはこのツールがいくつかありますので、試してみました。

Chainerではデータはndarrayなので自分で自由にいじれますが、最初から備わっている機能があればそれを使うのが楽だったりしますからね。

ChainerCVのバージョンは0.13です。

試した画像は、 プロ生ちゃん です。Ixyさんのイラストから、正方形にクロップして256x256にリサイズしたものです。

フリップ

左右、上下の反転をします。

result = chainercv.transforms.flip(img, [y_flip], [x_flip], [copy])

変数

内容

img

ndarray

変換する画像データ

y_flip

bool

既定値はFalse。上下方向に反転するか。

x_flip

bool

既定値はFalse。左右方向に反転するか。

copy

bool

既定値はFalse。

result

ndarray

反転後の画像データ。

元画像

元画像 flip

反転結果

flip縦 flip横 flip両方

ランダムフリップ

ランダムにフリップします。

result = chainercv.transforms.random_flip(img, [y_random], [x_random], [return_param], [copy])

変数

内容

img

ndarray

変換する画像データ

y_random

bool

既定値はFalse。上下方向に反転するか。

x_random

bool

既定値はFalse。左右方向に反転するか。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

copy

bool

既定値はFalse。

result

ndarray, tuple

反転後の画像データ。

元画像

元画像 random flip

反転結果

ランダム反転

センタークロップ

中央部分を切り抜きます。トリミングとも呼びますね。

result = chainercv.transforms.center_crop(img, size, [return_param], [copy])

変数

内容

img

ndarray

変換する画像データ

size

tuple

クロップするサイズ。(高さ、幅)で指定。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

copy

bool

既定値はFalse。

result

ndarray, tuple

クロップ後の画像データ。

元画像

元画像 center crop

クロップ結果

センタークロップ

ランダムクロップ

一定の大きさで、位置を変えてクロップします。

result = chainercv.transforms.random_crop(img, size, [return_param], [copy])

変数

内容

img

ndarray

変換する画像データ

size

tuple

クロップするサイズ。(高さ、幅)で指定。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

copy

bool

既定値はFalse。

result

ndarray, tuple

クロップ後の画像データ。

元画像

元画像 random crop

クロップ結果

ランダムクロップ

ランダムサイズクロップ

ランダムなサイズとアスペクト比でクロップします。

result = chainercv.transforms.random_sized_crop(img, [scale_ratio_range], [aspect_ratio_range], [return_param], [copy])

変数

内容

img

ndarray

変換する画像データ

size

tuple

クロップするサイズ。(高さ、幅)で指定。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

copy

bool

既定値はFalse。

result

ndarray, tuple

クロップ後の画像データ。

元画像

元画像 random crop

クロップ結果

ランダムサイズクロップ1 ランダムサイズクロップ2 ランダムサイズクロップ3 ランダムサイズクロップ4 ランダムサイズクロップ5 ランダムサイズクロップ6 ランダムサイズクロップ7 ランダムサイズクロップ8 ランダムサイズクロップ9

回転

画像を任意の角度に回転します。

result = chainercv.transforms.rotate(img, angle, [expand], [fill], [interpolation])

変数

内容

img

ndarray

変換する画像データ

angle

float

回転の角度。

expand

bool

既定値はTrue。キャンバスを大きくするか。

fill

float

既定値は0。回転により生じた隙間を埋める色。

interpolation

int

既定値は2。補間方法。

result

ndarray

回転後の画像データ。

元画像

元画像 rotate

45度回転(expand = True)

回転して拡張

45度回転(expand = False)

回転して維持

ランダム回転

90度、180度、270度、360度のいずれかにランダムに回転します。角度が決まっていることに注意。

result = chainercv.transforms.random_rotate(img, [return_param])

変数

内容

img

ndarray

変換する画像データ

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

result

ndarray

回転後の画像データ。

元画像

元画像 random rotate

回転

ランダム回転

拡大縮小

画像の一辺の長さを指定してリサイズします。

result = chainercv.transforms.scale(img, size, [fit_short], [interpolation])

変数

内容

img

ndarray

変換する画像データ

size

int

リサイズ後の辺のドット数。

fit_short

bool

既定値はTrue。短辺をsizeに合わせるか。

interpolation

int

既定値は2。補間方法。

result

ndarray

リサイズ後の画像データ。

短辺をsizeに合わせる場合はfit_shortをTrue、長辺をsizeに合わせる場合はfit_shortをFalseです。この方法ではアスペクト比が維持されるわけですね。

元画像

元画像 scale

リサイズ(size = 128)

リサイズ scale

拡大縮小(サイズ指定)

大きさを指定してリサイズします。

result = chainercv.transforms.resize(img, size, [interpolation])

変数

内容

img

ndarray

変換する画像データ

size

tuple

リサイズ後の画像サイズ。(高さ、幅)

interpolation

int

既定値は2。補間方法。

result

ndarray

リサイズ後の画像データ。

元画像

元画像 resize

リサイズ(size = (100, 200))

リサイズ resize

拡大縮小(拡張)

アスペクト比を維持しながら、指定のサイズにリサイズします。

result = chainercv.transforms.resize_contain(img, size, [fill], [interpolation], [return_param])

変数

内容

img

ndarray

変換する画像データ

size

tuple

リサイズ後の画像サイズ。(高さ、幅)

fill

float

既定値は0。隙間を埋める色。

interpolation

int

既定値は2。補間方法。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

result

ndarray, tuple

リサイズ後の画像データ。

元画像

元画像 resize contain

リサイズ(size = (100, 200), fill = 0 )

リサイズ resize contain

ランダム拡張

キャンバスをランダムに拡張して画像を配置します。

result = chainercv.transforms.random_expand(img, [max_ratio], [fill], [return_param])

変数

内容

img

ndarray

変換する画像データ

max_ratio

float

既定値は4。最大拡大率。

fill

float

既定値は0。隙間を埋める色。

return_param

bool

既定値はFalse。パラメーターを返すかどうか。

result

ndarray, tuple

拡張後の画像データ。

元画像

元画像 random expand

ランダム拡張(max_ratio = 1.5, fill = 0 )

ランダム拡張1 ランダム拡張2 ランダム拡張3 ランダム拡張4 ランダム拡張5 ランダム拡張6 ランダム拡張7 ランダム拡張8 ランダム拡張9

10パターンクロップ

画像を10パターンにクロップします。

result = chainercv.transforms.ten_crop(img, size)

変数

内容

img

ndarray

変換する画像データ

size

tuple

リサイズ後の画像サイズ。(高さ、幅)

result

ndarray, tuple

クロップ後の画像データ。

1枚の画像から、10パターンのクロップ画像を作成します。指定したサイズで元画像の4隅をクロップした画像4枚と中央部のクロップを1枚と、それぞれの水平方向のフリップ画像です。

元画像

元画像 10

10パターンクロップ(size = (200, 200))

10パターン0 10パターン1 10パターン2 10パターン3 10パターン4 10パターン5 10パターン6 10パターン7 10パターン8 10パターン9

PCA color augmentation

画像のRGBの強さに応じて拡張する(色合いを変える)手法ということなのですが、具体的には理解できていません。使い方だけ。

result = chainercv.transforms.pca_lighting(img, sigma, [eigen_value], [eigen_vector])

変数

内容

img

ndarray

変換する画像データ

sigma

float

固有値にかける乱数の標準偏差。

eigen_value

ndarray

既定値はNone。各カラーの固有値。

eigen_vector

ndarray

既定値はNone。各カラーの固有ベクトル。

result

ndarray, tuple

変換後の画像データ。

eigen_valueとeigen_vectorがNoneのときは、それぞれImageNetの値が流用されます。

元画像

元画像 pca

変換後(sigma = 25.5)

PCA

標準偏差の設定がおかしいのか、ImageNetの固有値がイラストに合わないのか、よくわからないです。

公開日

広告