ディープラーニングにおける画像認識では大量の画像が必要になる場合が多いです。しかし、実際の開発現場ではセキュリティや著作権などの観点から十分な画像を集めることが難しいです。そのような場合、データオーグメンテーションは非常に役立ちます。データオーグメンテーションは、限られたデータセットをもとに、さまざまな手法で新しい画像データを生成することができます。例えば、画像の回転、反転、トリミング、色の変換などがあります。これにより、データセットの多様性を増やし、モデルの汎化性能を向上させることができます。さらに、データオーグメンテーションは過学習を防ぐ効果もあります。データオーグメンテーションを活用することで、少ない画像データでも高性能なモデルを構築することが可能になります。
様々なデータオーグメンテーション
データオーグメンテーションには多くの変換があり、その実装にはtorchvision transformsやAlbumentationsなどのライブラリを利用することができます。ここでは、Albumentationsを使用し、代表的な変換とその実装例を紹介します。
まず必要なライブラリをインポートし、元画像を読み込みます。
1 2 3 4 |
import cv2 import albumentations as A img = cv2.imread('avinton.png') # ご自身の手元にある画像に変更してください |
回転
1 |
conv_img = A.Rotate(p=1)(image=img)['image'] |
補足:
回転すると余白が生じてしまいます。その場合、余白をどのように埋めるかをborder_modeオプションで指定することが可能です。
アノテーション付きの物体検出やセグメンテーションタスクにおいてはこの点を考慮した変換を行う必要があります。
フリップ
1 2 3 4 5 |
# 水平方向のフリップ conv_img = A.HorizontalFlip(p=1)(image=img)['image'] # 垂直方向のフリップ conv_img = A.VerticalFlip(p=1)(image=img)['image'] |
明るさ調整
1 2 3 4 5 6 7 8 |
# CLAHE conv_img = A.CLAHE(p=1)(image=img)['image'] # 輝度 conv_img = A.RandomBrightnessContrast(p=1)(image=img)['image'] # ガンマ補正 conv_img = A.RandomGamma(p=1)(image=img)['image'] |
色調整
1 2 3 4 5 6 7 8 |
# グレースケール conv_img = A.ToGray(p=1)(image=img)['image'] # HueSaturation conv_img = A.HueSaturationValue(p=1)(image=img)['image'] # チャンネルシャッフル conv_img = A.ChannelShuffle(p=1)(image=img)['image'] |
ノイズ
1 2 3 4 5 |
# ガウシアンノイズ conv_img = A.GaussNoise(p=1)(image=img)['image'] # ドロップアウト conv_img = A.CoarseDropout(p=1)(image=img)['image'] |
補足:
画像の解像度が高い場合、肉眼で見ると変化が見られないようなケースもあります。その場合は、本願環境に近い画像を再現するよう度合いを調整するとよいでしょう。
ブラー
1 2 3 4 5 6 7 8 |
# ブラー conv_img = A.Blur(p=1)(image=img)['image'] # ガウシアンブラー conv_img = A.GaussianBlur(p=1)(image=img)['image'] # モーションブラー conv_img = A.MotionBlur(p=1)(image=img)['image'] |
天候エフェクト
1 2 3 4 5 6 7 8 |
# 雪 conv_img = A.RandomSnow(p=1)(image=img)['image'] # 雨 conv_img = A.RandomRain(p=1)(image=img)['image'] # 霧 conv_img = A.RandomFog(p=1)(image=img)['image'] |
テクスチャーエフェクト
1 2 3 4 5 |
# Perspective conv_img = A.Emboss(p=1)(image=img)['image'] # Sharpen conv_img = A.Sharpen(p=1)(image=img)['image'] |
変形
1 2 3 4 5 6 7 8 |
# Perspective conv_img = A.Perspective(p=1)(image=img)['image'] # アフィン conv_img = A.Affine(p=1)(image=img)['image'] # OpticalDistortion conv_img = A.OpticalDistortion(p=1)(image=img)['image'] |
これらの変換を組み合わせて複合的なデータオーグメンテーションを行うことも可能です。たとえば、以下のように異なる変換をランダムに適用する関数を定義できます。
組み合わせ
以下はtranformに含まれる複数の変換をp=0.5、つまり50%の確率でそれぞれ適用させる関数です。
このとき、transformに含まれる順番に乱数で適用されるため、変換の順番も考慮するとなおよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def augmentation(p=0.5): tranform = [ A.OpticalDistortion(p=p), A.Perspective(p=p), A.Emboss(p=p), A.HorizontalFlip(p=p), A.VerticalFlip(p=p), A.ShiftScaleRotate(p=p), A.Affine(p=p), A.Blur(p=p), A.Sharpen(p=p), A.GaussNoise(p=p), A.CoarseDropout(p=p), A.Perspective(p=p), A.ToGray(p=p), A.CLAHE(p=p), A.RandomBrightnessContrast(p=p), A.RandomGamma(p=p), A.HueSaturationValue(p=p), ] return A.Compose(tranform) conv_img = augmentation()(image=img)['image'] |
データオーグメンテーションは、モデルの性能向上に貢献する一方で、タスクやデータセットの特性に応じて適切に選択・調整する必要があります。
そのため、実際の開発現場で適切なデータオーグメンテーションを行うためには、実験や評価が欠かせません。
まとめ
データオーグメンテーションは、限られたデータセットをもとに新しい画像データを生成する手法です。この手法は、ディープラーニングにおける画像認識タスクにおいて特に有用であり、モデルの汎化性能を向上させることができます。さらに、過学習を防ぐ効果もあります。データオーグメンテーションは、画像の回転、反転、色の変換などさまざまな手法を組み合わせることで実現されます。この手法を活用することで、少ない画像データでも高性能なモデルを構築することが可能です。データオーグメンテーションの実装には、Albumentationsなどのライブラリが利用されます。さまざまな変換を組み合わせることで、複合的なデータオーグメンテーションを行うことも可能です。ただし、タスクやデータセットの特性に応じて適切な変換を選択・調整する必要があります。
Avintonでは、ITエンジニアリングトレーニングとチームメンバーの継続的な教育に特に重点を置いています。この分野でのスキルの活用、最先端のテクノロジーへの取り組み、国際的なクライアントへのソリューション提供に興味がある場合は、採用情報のページをご覧ください。ご連絡をお待ちしております!