
データ拡張に必須のライブラリ【imgaug】を使ってみよう!【機械学習】
2021.12.20
imgaugライブラリとは?
「imgaug」は、機械学習において、Pythonでの「データ拡張(Data Augumentation)」を簡単に行うための ライブラリです。
機械学習の流れ
機械学習では、収集した学習データに対してデータクレンジングやアノテーションを行います。
さらに、そのデータに対し、学習時に「データ拡張」を行うのが一般的です。
「データ拡張」は、画像や音声、グラフ構造などの、様々なデータに対して適用されます。
例えば画像であれば、画像を回転したり、拡大・縮小など行うことで「データの水増し」を行うといった感じです。
データ拡張の難しさ
実際に「データ拡張」を行う際には、OpenCV や Pillow などの汎用的な画像処理ライブラリを用いてイチから実装するかと思います。
または、特定の深層学習フレームワークである「Tensorlflow」、「PyTorch」、「Keras」等の関数を利用するのが一般的です。
しかし、これらは「実装が大変」「柔軟性が十分で無い」「フレームワーク間の移植が困難」等の問題があります。
imgaugを活用!
これらの問題を良い具合に解決してくれるのが、「imgaug」ライブラリです。
「imgaug」ライブラリは、データ拡張のために設計されているので、次のようなメリットがあります。
- 楽に実装ができる
- 柔軟性が高い
- 特定のフレームワークに依存しない
使い勝手の良いライブラリである「imgaug」を使って、楽に「データ拡張」を行う手順を確認してみましょう!
imgaugライブラリの使い方
まず、「imgaug」ライブラリを使う上での前提条件と使い方について説明します。
前提条件
Python で 「imgaug」ライブラリをサポートしている Version は以下のとおりです。
系統 | Version |
---|---|
2系 | 2.7 |
3系 | 3.4、 3.5、 3.6、 3.7、 3.8 |
imgaugのインストール方法
「imgaug」のインストールには、「Anacondaを経由」、「pipコマンドを経由」の2通りの方法があります。
それらのコマンドは、それぞれ次のようになります。
Anacondaを経由する場合
1 2 | # conda config --add channels conda-forge # conda install imgaug |
pipコマンドを経由する場合
1 | # pip install imgaug |
簡単な使い方
ここから、「imgaug」の簡単な使い方を説明します。
今回は、画像に対する「データ拡張」処理をランダムな順番で適用する場合を例とします。
画像に対して実施するデータ拡張処理
今回の説明の中で、画像に対して実施するデータ拡張処理は以下のとおりです。
- ランダム左右反転
- ランダムクロップ (マージン幅は画像の10%)
- たまにガウスぼかし(2枚に1枚だけ適用、すべてはぼかさない)
- ガウスノイズの付加(標準偏差12くらい)
- ランダム拡大縮小 (0.9〜1.1倍)
- ランダム平行移動 (マージン幅は10%)
- ランダム回転 (−15度〜15度)
- ランダムシアー変換(変換係数:−3〜3)
サンプルコード
上記の「データ拡張」を実現するコードは、以下のとおりです。
(※特定のフレームワークに依存しそうな箇所はカットしてあります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # imgaug 関連のパッケージをインポート import imgaug as ia import imgaug.augmenters as iaa # 画像の読み込みやフレームワークのセットアップなど ・・・・・・・・・・ # データ拡張処理を定義する。 augseq = iaa.Sequential([ iaa.Fliplr(0.5), iaa.Crop(percent=(0, 0.1)), iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.1))), iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5), iaa.Affine( scale={"x": (0.9, 1.1), "y": (0.9, 1.1)}, translate_percent={"x": (-0.1, 0.1), "y": (-0.1, 0.1)}, rotate=(-15, 15), shear=(-3, 3) ), ], random_order=True) ・・・・・・・・・・ # 学習開始 for epoxh in range(MAX_EPOCH): .... # エポックごとにオリジナルの画像 x_train に対してデータ拡張を適用する。 x_train_aug = augseq(images = x_train) .... |
ご覧のとおり、「imgaug」ライブラリを使うと簡単に実装できることがわかると思います。
ライブラリを使わずに、全て自分でイチから実装するのが馬鹿らしくなりますよね。
実装面での補足
実装上の注意点ですが、処理の順序をランダムではなく固定にしたい場合には、 random_order=False としてください。
また、サンプルではエポックごとに全学習画像を変換しましたが、バッチごとに変換することも可能です。
今回は基本的なデータ拡張手法だけを使用しましたが、Random Erase (Crop and Pad) や AugMix などの、やや高度なデータ拡張を実装することも可能です。
アノテーションデータについて
今回の例では、クラス分類問題を対象としますので、アノテーションデータに手を加える必要はありません。
ただし、物体検出やランドマーク検出の場合は、データ拡張と同時にアノテーションの加工も必要になります。
もちろん「imgaug」ライブラリは、そういったケースにも対応しています。
imgaug使用時の性能確認
では、「imgaug」ライブラリを使用したデータ拡張で、どの程度の性能アップを見込むことができるのでしょうか。
「CIFAR-10」の画像データセットを用いた実験で確認してみましょう!
テスト精度の比較
「CIFAR-10」を用いて、データ拡張を実施した場合と、実施しなかった場合のテスト精度を比較しました。
実験結果のグラフ

解説
「青線:Data augmentation」がデータ拡張をした場合で、「赤線:Vanilla」がデータ拡張しなかった場合のテスト精度です。
図から分かるように、「7 epoch」を超えたところで、「データ拡張」を適用した場合の方が精度が高くなりました。
最終的なテスト精度は、データ拡張を適用した場合が 67.86%、データ拡張を適用しなかった場合が 63.08% となりました。
学習データに対する精度の比較
念のため、学習データに対する精度も比較してみましょう!
実験結果のグラフ

解説
「赤線:データ拡張を使用していない場合」は過学習気味であったものが、「青線:データ拡張を適用した場合」は過学習を抑えることができていることがわかります。
「7 epoch」までは、「imgaug」を使用しない方が、テストデータの精度は高い傾向にありました。
一方、「8 epoch」以降は、「imgaug」を使用する場合の方が、テストデータにおける精度は高くなりました。
さいごに
データ拡張は工数のかかる作業です。
しかし、「imgaug」ライブラリを使用することで、容易に「データ拡張」を実装することができます。
ぜひ、皆さんも試してみてはいかがでしょうか!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン