機械学習向けデータ拡張の実践 - 画像 Augmentation で精度を高める手法
データ拡張とは - なぜ学習データを水増しするのか
データ拡張 (Data Augmentation) は、既存の学習データに変換を加えて新たなサンプルを生成し、訓練データセットを実質的に拡大する手法です。深層学習モデルは大量のデータを必要としますが、ラベル付きデータの収集にはコストがかかります。データ拡張により、限られたデータから多様な学習サンプルを生成し、モデルの汎化性能を向上させます。
過学習の抑制:
訓練データが少ない場合、モデルは訓練データに過度に適合し、未知のデータに対する予測精度が低下します。データ拡張は訓練データの多様性を増やすことで、モデルが特定のパターンに依存しすぎることを防ぎます。例えば画像分類で猫の画像が全て正面向きだった場合、横向きの猫を認識できません。回転や反転の拡張を加えることで、向きに依存しない特徴を学習できます。
データ拡張の効果:
- CIFAR-10: 基本的な拡張 (水平反転+ランダムクロップ) だけでテスト精度が 2-3% 向上
- ImageNet: AutoAugment 適用で Top-1 精度が 0.83% 向上 (77.63% から 78.46%)
- 医療画像: データ数 100-500 枚の場合、拡張なしと比較して AUC が 0.05-0.15 向上
オンライン拡張とオフライン拡張:
オンライン拡張は訓練ループ内でバッチごとにランダムな変換を適用する方式で、エポックごとに異なるバリエーションが生成されます。オフライン拡張は事前に拡張済みデータを保存する方式です。現代のフレームワーク (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% の精度向上が得られることが多いです。
パフォーマンス比較:
- Albumentations: OpenCV ベース、最速。1000 枚/秒以上の処理速度
- torchvision.transforms: Pillow ベース、PyTorch 標準。Albumentations の 1/3-1/5 の速度
- Kornia: GPU 上で変換を実行。バッチ処理に最適
- DALI (NVIDIA): GPU パイプライン全体を最適化。大規模訓練で CPU ボトルネックを解消