ChainerCVで使える画像のデータ拡張
ChainerCVで画像データのデータ拡張(Data Augmentation)を試してみました。
目次
- データ拡張とは
- フリップ
- ランダムフリップ
- センタークロップ
- ランダムクロップ
- ランダムサイズクロップ
- 回転
- ランダム回転
- 拡大縮小
- 拡大縮小(サイズ指定)
- 拡大縮小(拡張)
- ランダム拡張
- 10パターンクロップ
- 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 |
反転後の画像データ。 |
元画像
反転結果
ランダムフリップ
ランダムにフリップします。
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 |
反転後の画像データ。 |
元画像
反転結果
センタークロップ
中央部分を切り抜きます。トリミングとも呼びますね。
result = chainercv.transforms.center_crop(img, size, [return_param], [copy])
変数 |
型 |
内容 |
---|---|---|
img |
ndarray |
変換する画像データ |
size |
tuple |
クロップするサイズ。(高さ、幅)で指定。 |
return_param |
bool |
既定値はFalse。パラメーターを返すかどうか。 |
copy |
bool |
既定値はFalse。 |
result |
ndarray, tuple |
クロップ後の画像データ。 |
元画像
クロップ結果
ランダムクロップ
一定の大きさで、位置を変えてクロップします。
result = chainercv.transforms.random_crop(img, size, [return_param], [copy])
変数 |
型 |
内容 |
---|---|---|
img |
ndarray |
変換する画像データ |
size |
tuple |
クロップするサイズ。(高さ、幅)で指定。 |
return_param |
bool |
既定値はFalse。パラメーターを返すかどうか。 |
copy |
bool |
既定値はFalse。 |
result |
ndarray, tuple |
クロップ後の画像データ。 |
元画像
クロップ結果
ランダムサイズクロップ
ランダムなサイズとアスペクト比でクロップします。
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 |
クロップ後の画像データ。 |
元画像
クロップ結果
回転
画像を任意の角度に回転します。
result = chainercv.transforms.rotate(img, angle, [expand], [fill], [interpolation])
変数 |
型 |
内容 |
---|---|---|
img |
ndarray |
変換する画像データ |
angle |
float |
回転の角度。 |
expand |
bool |
既定値はTrue。キャンバスを大きくするか。 |
fill |
float |
既定値は0。回転により生じた隙間を埋める色。 |
interpolation |
int |
既定値は2。補間方法。 |
result |
ndarray |
回転後の画像データ。 |
元画像
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 |
回転後の画像データ。 |
元画像
回転
拡大縮小
画像の一辺の長さを指定してリサイズします。
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です。この方法ではアスペクト比が維持されるわけですね。
元画像
リサイズ(size = 128)
拡大縮小(サイズ指定)
大きさを指定してリサイズします。
result = chainercv.transforms.resize(img, size, [interpolation])
変数 |
型 |
内容 |
---|---|---|
img |
ndarray |
変換する画像データ |
size |
tuple |
リサイズ後の画像サイズ。(高さ、幅) |
interpolation |
int |
既定値は2。補間方法。 |
result |
ndarray |
リサイズ後の画像データ。 |
元画像
リサイズ(size = (100, 200))
拡大縮小(拡張)
アスペクト比を維持しながら、指定のサイズにリサイズします。
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 |
リサイズ後の画像データ。 |
元画像
リサイズ(size = (100, 200), fill = 0 )
ランダム拡張
キャンバスをランダムに拡張して画像を配置します。
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 |
拡張後の画像データ。 |
元画像
ランダム拡張(max_ratio = 1.5, fill = 0 )
10パターンクロップ
画像を10パターンにクロップします。
result = chainercv.transforms.ten_crop(img, size)
変数 |
型 |
内容 |
---|---|---|
img |
ndarray |
変換する画像データ |
size |
tuple |
リサイズ後の画像サイズ。(高さ、幅) |
result |
ndarray, tuple |
クロップ後の画像データ。 |
1枚の画像から、10パターンのクロップ画像を作成します。指定したサイズで元画像の4隅をクロップした画像4枚と中央部のクロップを1枚と、それぞれの水平方向のフリップ画像です。
元画像
10パターンクロップ(size = (200, 200))
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の値が流用されます。
元画像
変換後(sigma = 25.5)
標準偏差の設定がおかしいのか、ImageNetの固有値がイラストに合わないのか、よくわからないです。
公開日
広告
Chainerカテゴリの投稿
- ChainerCVで使える画像のデータ拡張
- ChainerCVで画像を出力する方法
- ChainerCVのResNetを使う
- ChainerCVのSSDに学習させてみた
- ChainerCVのデモンストレーションプログラムを読んでみた
- ChainerCVのデモンストレーションプログラムを読んでみた(推論編)
- Chainerが出力するネットワーク構造図をGraphvizで見る
- Chainerで数字を分類してみた
- ChainerのSSDのデモで物体検出をしてみる
- Chainerのチュートリアルを試してみた
- Chainerのチュートリアルを試してみた(ChainerCVでデータ拡張編)
- Chainerのチュートリアルを試してみた(データ拡張編)
- Chainerのチュートリアルを試してみた(トレーナー編)
- Chainerのチュートリアルを試してみた(畳み込みを深くする編)
- Chainerのチュートリアルを試してみた(畳み込み編)
- Chainerのデータセットの作り方(ラベル付き画像編)
- VoTTのPascal VOC出力をChainerCVのデータセットとして読み込んでみた