JA EN

機械学習向けデータ拡張の実践 - 画像 Augmentation で精度を高める手法

· 約 9 分で読めます

データ拡張とは - なぜ学習データを水増しするのか

データ拡張 (Data Augmentation) は、既存の学習データに変換を加えて新たなサンプルを生成し、訓練データセットを実質的に拡大する手法です。深層学習モデルは大量のデータを必要としますが、ラベル付きデータの収集にはコストがかかります。データ拡張により、限られたデータから多様な学習サンプルを生成し、モデルの汎化性能を向上させます。

過学習の抑制:

訓練データが少ない場合、モデルは訓練データに過度に適合し、未知のデータに対する予測精度が低下します。データ拡張は訓練データの多様性を増やすことで、モデルが特定のパターンに依存しすぎることを防ぎます。例えば画像分類で猫の画像が全て正面向きだった場合、横向きの猫を認識できません。回転や反転の拡張を加えることで、向きに依存しない特徴を学習できます。

データ拡張の効果:

オンライン拡張とオフライン拡張:

オンライン拡張は訓練ループ内でバッチごとにランダムな変換を適用する方式で、エポックごとに異なるバリエーションが生成されます。オフライン拡張は事前に拡張済みデータを保存する方式です。現代のフレームワーク (PyTorch、TensorFlow) ではオンライン拡張が標準的に採用されています。

幾何変換系の拡張手法 - 位置と形状を変える

幾何変換は画像のピクセル位置を変更する拡張手法で、最も基本的かつ効果的なカテゴリです。物体の位置、向き、スケールに対するモデルの不変性を獲得するために使用されます。

水平反転 (Horizontal Flip):

最も単純で効果的な拡張の一つです。画像を左右反転させるだけで、データ量を実質 2 倍にできます。自然画像の多くは左右対称性を持つため、ほぼすべてのタスクで有効です。ただし文字認識や左右に意味がある医療画像では使用を避けます。PyTorch では transforms.RandomHorizontalFlip(p=0.5) で適用できます。

回転 (Rotation):

画像を指定角度範囲でランダムに回転させます。一般的には -15 度から +15 度の範囲が使用されますが、衛星画像や病理画像では全方向回転が有効です。回転により生じる黒い領域は反射パディングまたはクロップで処理します。Albumentations では A.Rotate(limit=15, border_mode=cv2.BORDER_REFLECT) で設定します。

ランダムクロップ:

画像からランダムな位置で部分領域を切り出します。ResNet の訓練では 224 × 224のランダムクロップが標準的に使用されます。物体検出ではクロップによりバウンディングボックスが切れる場合の処理が必要です。

アフィン変換:

回転、スケーリング、せん断、平行移動を組み合わせた変換です。A.Affine(scale=(0.8, 1.2), shear=(-10, 10)) のように複数の変換を同時に適用できます。

弾性変形 (Elastic Deformation):

ランダムな変位場を生成し、画像をゴムのように局所的に歪ませる変換です。手書き文字認識で特に効果的で、医療画像のセグメンテーションでも臓器の形状バリエーションをシミュレートするために広く使用されています。

色変換・ピクセル操作系の拡張 - 見た目を変える

色変換系の拡張は、画像の色調、明るさ、コントラストなどを変更する手法です。照明条件やカメラ設定の違いに対するロバスト性を獲得するために使用されます。幾何変換と組み合わせることで、より多様なバリエーションを生成できます。

明るさ・コントラスト調整:

画像全体の明るさとコントラストをランダムに変更します。A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2) で設定するのが一般的です。屋外撮影では時間帯や天候により明るさが大きく変わるため、この拡張は実環境のバリエーションを効果的にシミュレートします。

色相・彩度・明度 (HSV) 変換:

HSV 色空間で色相、彩度、明度を個別に変更します。色相のシフトは物体の色が変わるため、色に依存しない特徴の学習を促進します。ただし色が重要な手がかりとなるタスク (信号機の認識など) では色相シフトを控えめにします。A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20) で設定します。

ガウシアンノイズ:

画像にランダムなガウシアンノイズを加えます。センサーノイズや低照度環境をシミュレートし、ノイズに対するロバスト性を向上させます。A.GaussNoise(var_limit=(10, 50)) で分散を指定します。ノイズが強すぎると学習が不安定になるため、適切な範囲設定が重要です。

ガウシアンぼかし:

画像にガウシアンフィルタを適用してぼかします。フォーカスのずれや動きぼけをシミュレートします。物体検出では遠方の物体がぼけて写る状況を再現するのに有効です。

CLAHE:

局所的なコントラスト強調を適用します。医療画像や暗い画像で特に効果的で、局所的な特徴を強調しつつ全体的な明るさを保持します。A.CLAHE(clip_limit=4.0, tile_grid_size=(8, 8)) で適用します。

ミックス系拡張 - MixUp, CutMix, Mosaic

ミックス系拡張は、複数の画像を組み合わせて新たな訓練サンプルを生成する手法です。従来の単一画像に対する変換とは異なり、画像間の補間や合成により、決定境界の滑らかさを促進し、過学習を効果的に抑制します。

MixUp (Zhang et al., 2018):

2 枚の画像とそのラベルを線形補間して新たなサンプルを生成します。混合比を Beta 分布 Beta(alpha, alpha) からサンプリングし、x_new = lambda*x1 + (1-lambda)*x2 で計算します。alpha=0.2 が一般的で、CIFAR-10 で約 1% の精度向上が報告されています。ラベルのソフト化により、モデルの過信を抑制する正則化効果があります。

CutMix (Yun et al., 2019):

一方の画像の矩形領域を切り取り、もう一方の画像に貼り付けます。ラベルは面積比に応じて混合されます。MixUp と異なり局所的な情報が保持されるため、物体の部分的な特徴を学習しやすくなります。ImageNet で Top-1 精度が 1% 以上向上し、物体検出やセグメンテーションにも有効です。

Mosaic (YOLOv4):

4 枚の画像を 1 枚に合成します。各画像をランダムにリサイズ・クロップし、2x2 のグリッドに配置します。1 回のフォワードパスで 4 枚分のコンテキストを学習でき、小さな物体の検出精度向上に特に効果的です。YOLOv5 以降でも標準的に使用されています。

GridMask:

画像に規則的なグリッドパターンのマスクを適用し、一部の領域を隠す手法です。Cutout の発展形で、複数の小さな領域を規則的に隠すことで、モデルが局所的な特徴に過度に依存することを防ぎます。

自動拡張戦略 - AutoAugment と RandAugment

データ拡張のハイパーパラメータ (どの変換を、どの強度で、どの確率で適用するか) の最適化は困難です。自動拡張戦略は、強化学習や探索アルゴリズムを用いて最適な拡張ポリシーを自動的に発見する手法です。

AutoAugment (Cubuk et al., 2019):

強化学習を用いて最適な拡張ポリシーを探索します。ポリシーは 25 個のサブポリシーで構成され、各サブポリシーは 2 つの変換操作を含みます。探索には 15,000 GPU 時間を要しますが、発見されたポリシーは他のデータセットにも転移可能です。ImageNet で発見されたポリシーは回転、色変換、せん断の組み合わせが効果的であることを示しています。

RandAugment (Cubuk et al., 2020):

AutoAugment の探索コストを大幅に削減した手法です。N 個の変換をランダムに選択し、共通の強度 M で適用するだけのシンプルな設計です。探索パラメータが N と M の 2 つだけのため、グリッドサーチで最適値を見つけられます。N=2, M=9 が多くのタスクで良好な結果を示します。実装が極めて簡単で AutoAugment と同等以上の性能を達成します。

TrivialAugment (2021):

RandAugment をさらに簡略化し、各画像に対して 1 つの変換をランダムな強度で適用するだけの手法です。ハイパーパラメータが一切不要で、それでいて RandAugment と同等の性能を達成します。多数のエポックにわたる訓練で十分な多様性が確保されることが理由です。

実装例:

PyTorch では transforms.RandAugment(num_ops=2, magnitude=9) で直接使用できます。timm ライブラリの create_transform 関数は AutoAugment/RandAugment を含む包括的な拡張パイプラインを提供します。

タスク別の拡張戦略と Albumentations 実装

データ拡張の最適な戦略はタスクによって異なります。画像分類、物体検出、セマンティックセグメンテーションそれぞれの特性に合わせた拡張設計が重要です。Albumentations は OpenCV ベースの高速な画像拡張ライブラリで、torchvision.transforms と比較して 2-10 倍高速です。

画像分類での拡張:

分類タスクでは画像全体に対する変換が自由に適用できます。標準的なパイプラインは: リサイズ、ランダムクロップ、水平反転、色変換、正規化の順です。EfficientNet の訓練では RandAugment + Mixup + CutMix の組み合わせが標準です。

物体検出での拡張:

物体検出では画像の変換に合わせてバウンディングボックスも変換する必要があります。Albumentations は bbox_params=A.BboxParams(format="pascal_voc", min_visibility=0.3) でバウンディングボックスの自動変換をサポートします。Mosaic 拡張は小物体の検出に特に効果的で YOLO シリーズでは標準的に使用されています。

セグメンテーションでの拡張:

セグメンテーションでは画像とマスクに同一の幾何変換を適用する必要があります。色変換は画像のみに適用しマスクには適用しません。弾性変形は臓器のセグメンテーションで特に有効です。

テスト時拡張 (TTA):

推論時にも拡張を適用し、複数の予測結果を平均化することで精度を向上させる手法です。水平反転、マルチスケール、軽微な回転などを適用し、各バリエーションの予測を平均します。コンペティションでは 0.5-1% の精度向上が得られることが多いです。

パフォーマンス比較:

関連記事

物体検出の概要 - YOLO、SSD、Faster R-CNN のアーキテクチャと性能比較

深層学習による物体検出技術を体系的に解説。YOLO、SSD、Faster R-CNN の原理と特性、速度・精度のトレードオフ、実務での選択基準を具体的なベンチマークとともに紹介します。

画像セグメンテーションの基礎 - 領域分割の原理と応用を理解する

画像セグメンテーションの基本概念から深層学習ベースの最新手法まで解説。セマンティック、インスタンス、パノプティックの違いと Web での活用事例を紹介します。

転移学習で少量データから画像分類器を作る - Fine-tuning 実践ガイド

事前訓練済みモデルを活用し、100 枚程度の少量データから高精度な画像分類器を構築する転移学習の手法を PyTorch コード付きで解説します。

セマンティックセグメンテーション入門 - U-Net と DeepLab の仕組みを徹底解説

画像のピクセル単位分類を実現するセマンティックセグメンテーションの基礎から U-Net、DeepLab の構造まで、実装例を交えて解説します。

画像の自動タグ付け技術 - 物体検出、シーン認識、キャプション生成の仕組み

画像認識 AI による自動タグ付けの技術を解説。物体検出 (YOLO)、シーン認識、画像キャプション生成の仕組みと、Web アプリケーションへの実装方法を具体例とともに紹介します。

画像アノテーションツール比較 - CVAT, Label Studio, Roboflow の選び方

機械学習向け画像アノテーションツールを徹底比較。CVAT、Label Studio、Roboflow など主要ツールの機能・コスト・ AI アシスト機能を解説します。

関連用語