• トップ
  • ブログ一覧
  • データ拡張に必須のライブラリ【imgaug】を使ってみよう!【機械学習】
  • データ拡張に必須のライブラリ【imgaug】を使ってみよう!【機械学習】

    広告メディア事業部広告メディア事業部
    2020.08.06

    IT技術

    imgaugライブラリとは?

    imgaug」は、機械学習において、Pythonでの「データ拡張(Data Augumentation)」を簡単に行うための ライブラリです。

    機械学習の流れ

    機械学習では、収集した学習データに対してデータクレンジングアノテーションを行います。

    さらに、そのデータに対し、学習時に「データ拡張」を行うのが一般的です。

    「データ拡張」は、画像や音声、グラフ構造などの、様々なデータに対して適用されます。

    例えば画像であれば、画像を回転したり、拡大・縮小など行うことで「データの水増し」を行うといった感じです。

    データ拡張の難しさ

    実際に「データ拡張」を行う際には、OpenCVPillow などの汎用的な画像処理ライブラリを用いてイチから実装するかと思います。

    または、特定の深層学習フレームワークである「Tensorlflow」、「PyTorch」、「Keras」等の関数を利用するのが一般的です。

    しかし、これらは「実装が大変」「柔軟性が十分で無い」「フレームワーク間の移植が困難」等の問題があります。

    imgaugを活用!

    これらの問題を良い具合に解決してくれるのが、「imgaug」ライブラリです。

    「imgaug」ライブラリは、データ拡張のために設計されているので、次のようなメリットがあります。

    1. 楽に実装ができる
    2. 柔軟性が高い
    3. 特定のフレームワークに依存しない

    使い勝手の良いライブラリである「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# conda config --add channels conda-forge
    2# conda install imgaug

    pipコマンドを経由する場合

    1# pip install imgaug

    簡単な使い方

    ここから、「imgaug」の簡単な使い方を説明します。

    今回は、画像に対する「データ拡張」処理をランダムな順番で適用する場合を例とします。

    画像に対して実施するデータ拡張処理

    今回の説明の中で、画像に対して実施するデータ拡張処理は以下のとおりです。

    1. ランダム左右反転
    2. ランダムクロップ (マージン幅は画像の10%)
    3. たまにガウスぼかし(2枚に1枚だけ適用、すべてはぼかさない)
    4. ガウスノイズの付加(標準偏差12くらい)
    5. ランダム拡大縮小 (0.9〜1.1倍)
    6. ランダム平行移動 (マージン幅は10%)
    7. ランダム回転   (−15度〜15度)
    8. ランダムシアー変換(変換係数:−3〜3)

    サンプルコード

    上記の「データ拡張」を実現するコードは、以下のとおりです。

    (※特定のフレームワークに依存しそうな箇所はカットしてあります)

    1# imgaug 関連のパッケージをインポート
    2import imgaug as ia
    3import imgaug.augmenters as iaa
    4
    5# 画像の読み込みやフレームワークのセットアップなど
    6・・・・・・・・・・
    7
    8# データ拡張処理を定義する。
    9augseq = iaa.Sequential([
    10iaa.Fliplr(0.5),
    11iaa.Crop(percent=(0, 0.1)),
    12iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.1))),
    13iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
    14iaa.Affine(
    15scale={"x": (0.9, 1.1), "y": (0.9, 1.1)},
    16translate_percent={"x": (-0.1, 0.1), "y": (-0.1, 0.1)},
    17rotate=(-15, 15),
    18shear=(-3, 3)
    19),
    20], random_order=True)
    21
    22・・・・・・・・・・
    23
    24# 学習開始
    25for epoxh in range(MAX_EPOCH):
    26
    27....
    28
    29# エポックごとにオリジナルの画像 x_train に対してデータ拡張を適用する。
    30x_train_aug = augseq(images = x_train)
    31
    32....

    ご覧のとおり、「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」ライブラリを使用することで、容易に「データ拡張」を実装することができます。

    ぜひ、皆さんも試してみてはいかがでしょうか!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事

    GitHubActionsのランナーに触れてみた

    こやまん(エンジニア)

    こやまん(エンジニア)

    2024.03.28

    IT技術

    Azure Data FactoryでSlackへ通知をしてみる

    たかやん(エンジニア)

    たかやん(エンジニア)

    2024.03.28

    IT技術

    GCP Secret Managerを使ってみた

    たなゆー(エンジニア)

    たなゆー(エンジニア)

    2024.03.21

    IT技術

    Bitriseのパイプラインと環境変数

    加納(エンジニア)

    加納(エンジニア)

    2024.03.11

    IT技術