アイキャッチ画像

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の固有値がイラストに合わないのか、よくわからないです。

広告

Chainerカテゴリの投稿