【超便利】Python でImage Augmentation(画像の水増し、データ拡張)しようよ!

当ページのリンクには広告が含まれています。

ディープラーニングを用いた画像認識の場合、通常、膨大な量の学習用画像を用意する必要があります。しかし、現実的には多くの学習用画像を収集することは困難です。

そこで、わずか数枚から数百枚の画像を元に、さまざまな画像処理手法を組み合わせて数万から数十万の学習用画像を生成するアプローチが一般的に用いられます。

今回は、PythonとOpenCVを使用して手軽に実行できるImage Augmentation(画像データの水増し、データ拡張)に関する方法を、サンプルソースコードを交えて紹介したいと考えています。

目次

代表的な Image Augmentation の関数

OpenCVで代表的な Image Augmentation には、次のものがあります。

処理名概要関数名
回転画像を指定した角度だけ回転させるcv2.getRotationMatrix2D()
反転画像を反転させるcv2.flip()
平行移動上下左右に平行移動させるcv2.warpAffine()
変形(台形)画像を台形に変形させるcv2.getPerspectiveTransform()
変形(魚眼)画像に魚眼レンズを適用するcv2.rema()
変形(正弦波)画像に正弦波歪を適用するcv2.rema()
クロップ画像の一部を切り取る-
リサイズ画像のサイズを変更cv2.resize()
コントラストと明るさ画像のコントラストと明るさを変更cv2.convertScaleAbs()
彩度画像の彩度を変更cv2.cvtColor()
拡散(ディフューザー効果)画像にディフューザを適用-
レンズフレア画像にレンズフレアを適用-
画像に影を追加-
ノイズ追加(ガウシアン)画像にガウシアンノイズを追加-
ノイズ追加(塩・胡椒)画像に塩・胡椒ノイズを追加-
ぼかし(ガウシアン)画像にガウシアンぼかしを適用cv2.GaussianBlur()
ぼかし(メディアン)画像にメディアンぼかしを適用cv2.medianBlur()
手振れ(モーションブラー)画像にモーションブラーを適用-
画像に霧の効果を適用-
雨(雨粒)画像に雨粒の効果を適用-

関数の意味と使い方サンプル

ここでは、処理ごとのサンプルプログラムを紹介します。関数として作っていますので、必要なものをコピペしてお使い頂けます。

今回評価に使ったのは以下の画像です。

処理前画像のサンプル

サンプルプログラム実行時の注意点

各サンプルプログラムは画像の読み込みと保存の処理を記述していますが、共にOドライブ直下に画像ファイルがあり、結果をそこに保存するようになっています。

具体的には "O:\input_image.jpg" を読み込み、"O:\output_image.jpg" に 保存しています。パスやファイル名は、皆さんの環境に適宜合わせて下さい。

また、動作に必要なライブラリ(Cv2や numpy)のimport を記述していません。実行する場合は、下記2つのimport 文を先頭に記述しておいてください。

画像の回転

オリジナル

回転処理前の写真

画像処理後

回転処理後の写真

与えられた画像データを指定した角度だけ回転させて新しい画像データを生成します。

反転

オリジナル

反転処理前の写真

画像処理後

反転処理後の写真

与えられた画像データを水平方向または垂直方向に反転させて新しい画像データを生成します。

平行移動

オリジナル

平行移動処理前の写真

画像処理後

平行移動処理後の写真

与えられた画像データを水平方向または垂直方向に平行移動させて新しい画像データを生成します。

変形(台形)

オリジナル

画像変形(台形)処理前の写真

画像処理後

画像変形(台形)処理後の写真

与えられた画像データを指定して割合で台形に変形し、新しい画像データを生成します。

変形(魚眼)

オリジナル

画像変形(魚眼)処理前の写真

画像処理後

画像変形(魚眼)処理後の写真

与えられた画像データをに魚眼レンズの歪を適用し、新しい画像データを生成します。

変形(正弦波)

オリジナル

画像変形(正弦波)の処理前の写真

画像処理後

画像変形(正弦波)処理後の写真

与えられた画像データに正弦波歪を適用し、新しい画像データを生成します。

クロップ

オリジナル

クロップ処理前の写真

画像処理後

クロップ処理後の写真

画像の一部を切り取って新しい画像を生成します。

リサイズ

オリジナル

リサイズ処理前の写真

画像処理後

リサイズ処理後の写真

与えられた画像データを指定したサイズにリサイズし、新しい画像データを生成します。

コントラストと明るさ

オリジナル

コントラストと明るさ処理前写真

画像処理後

コントラストと明るさ処理後の写真

与えられた画像のコントラストと明るさを調整し、新しい画像データを生成します。

彩度

オリジナル

彩度処理前の写真

画像処理後

彩度処理後の写真

与えられた画像の彩度を調整し、新しい画像データを生成します。

拡散(ディフューザー効果)

オリジナル

拡散処理前の写真

画像処理後

拡散処理後の写真

与えられた画像に拡散(ディフューザー効果)を適用し、新しい画像データを生成します。ディフューザー効果とは、光の散乱や拡散をシミュレーションすることによって、画像に柔らかさやぼかしを加えることです。

レンズフレア

オリジナル

レンズフレア処理前の写真

画像処理後

レンズフレア処理後の写真

与えられた画像にレンズフレアを追加し、新しい画像データを生成します。レンズフレアは、太陽やライトなどの強い光がレンズに入ることで発生する、レンズのコーティングによって反射や散乱されて生じる現象です。

オリジナル

影処理前の写真

画像処理後

影処理後の写真

与えられた画像に指定したサイズと数の影を追加し、新しい画像データを生成します。

ノイズ追加(ガウシアン)

オリジナル

ガウシアンノイズ追加処理前の写真

画像処理後

ガウシアンノイズ追加処理後の写真

与えられた画像にガウシアンノイズを追加し、新しい画像データを生成します。

ノイズ追加(塩・胡椒=ソルト・ペッパーノイズ)

オリジナル

ルト・ペッパーノイズ追加処理前の写真

画像処理後

ルト・ペッパーノイズ追加処理後の写真

与えられた画像に塩・胡椒ノイズを追加し、新しい画像データを生成します。

ぼかし(ガウシアン)

オリジナル

ガウシアンぼかし処理前の写真

画像処理後

ガウシアンぼかし処理後の写真

与えられた画像データにガウシアンぼかしを適用し、新しい画像データを生成します。

ぼかし(メディアン)

オリジナル

メディアんぼかし処理前の写真

画像処理後

メディアんぼかし処理後の写真

与えられた画像データにメディアンぼかしを適用し、新しい画像データを生成します。

手振れ(モーションブラー)

オリジナル

手振れ処理前の写真

画像処理後

手振れ処理後の写真

与えられた画像に、手振れや物体の運動によって生じるぼけを適用し新しい画像データを生成します。ます。画像のサイズによってカーネルサイズを調整する必要がります。カーネルサイズが大きすぎると、真っ黒になったり真っ白になることがあります。

画像が小さいため、モーションブラーが掛かっているか分かり難いので、拡大してみました。

手振れ処理前後の拡大写真

オリジナル

霧処理前の写真

画像処理後

霧処理後の写真

与えられた画像データに霧の効果を適用し、新しい画像データを生成します。

雨(雨粒)

オリジナル

雨処理前の写真

画像処理後

雨処理後の写真

与えられた画像データに雨粒の効果を適用し、新しい画像データを生成します。

データ拡張のサンプル

参考までに、簡易的なデータ拡張のサンプルを紹介しておきます。このプログラムは人がカメラで撮影した場合を想定した画像処理を行っています。

具体的には、朝、昼、夕方の明るさ調整、曇り空のノイズ追加、カメラの角度と手振れのシミュレーション、高感度撮影時のノイズを組み合わせて生成しています。

現在のパラメータで生成される画像は画質が荒いので、必要に応じて各機能の有効/無効、パラメータを調整をお願いします。

実行した結果は以下の通りです。今回は生成枚数に10を指定したので、出力フォルダには10枚の写真が生成されています。

まとめ

今回は、Image Augmentation(画像の水増し、データ拡張)に使える OpenCV の画像処理について、代表的なものを一通り紹介しました。

それぞれ関数化していますので、コピペしてすぐにお使いいただけると思います。

実際にImage Augmentationを行うには、元の画像データに対して今回紹介した画像処理をランダムに適宜し、結果を指定フォルダに保存するプログラムを作る必要がありますが、簡易版のサンプルソースも紹介させて頂きました。

ディープラーニングで画像データの水増し(データ拡張)が必要な場合は、是非この記事を参考にして下さい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次