少ない画像でも精度を底上げする実践ガイド
画像データが少なくても、拡張テクニックを組み合わせれば大型データセット並みの汎化性能が狙えます。ここでは「基礎 → 実装 → 応用」の流れで、初心者がすぐ試せる最短ルートを解説します。
1. なぜデータ拡張が必要?
- 過学習対策:モデルが訓練データを丸暗記するのを防ぐ
- 現実のばらつきを再現:照明・向き・背景などの変化に強くなる
- コスト削減:ラベル付け作業や撮影費用を最小限に
2. PyTorchでの実装:まずは“王道4種”
from torchvision import transforms
train_tf = transforms.Compose([
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(0.2, 0.2, 0.2, 0.1),
transforms.RandomRotation(15),
transforms.ToTensor()
])
テクニック | 効果 | 注意点 |
---|---|---|
RandomResizedCrop | 構図の多様化 | 小物体が消えないか確認 |
HorizontalFlip | 左右対称性を学習 | 顔文字・文字列データではNG |
ColorJitter | 明るさ・色温度変化 | 過度に変えると別物になる |
Rotation | 傾き耐性 | 回転角は±15°程度が安全 |
3. 進化版:MixUp & CutMix
import timm
mix_tf = timm.data.create_transform(
input_size=224, is_training=True,
color_jitter=0.4, auto_augment='rand-m9-mstd0.5',
re_prob=0.25, re_count=1, mixup_alpha=0.2, cutmix_alpha=1.0)
- MixUp:画像とラベルを線形結合 → 汎化性能向上
- CutMix:画像の一部を別画像で置換 → 局所的特徴に強くなる
実装が複雑に見えますが、timm の create_transform
を使えばワンライナーで導入できます。
3.5 そのほかの拡張テクニック一覧
手法 | 一言説明 | 主なメリット | PyTorch/OSS 実装例 |
Mosaic | 4 枚の画像を 1 枚に貼り合わせる | 小物体検出・スケール多様化 | albumentations.Mosaic / YOLOv5+ 標準 |
HSV Augment | 色相・彩度・明度をランダム変化 | 照明条件・カメラ差異に強い | albumentations.HueSaturationValue() |
Random Blur | ガウシアン・モーションブラーを適用 | ブレ・フォーカスずれに耐性 | transforms.GaussianBlur(5) |
Synthetic Lighting | 擬似ライト・影を付与 | 光源変化をシミュレート | albumentations.RandomShadow() |
Random Erasing | 画像領域を矩形で欠損 | オクルージョン耐性向上 | transforms.RandomErasing(p=0.25) |
Random Crop | 任意位置で切り抜き | 背景依存を低減・構図多様化 | transforms.RandomCrop(200) |
AutoAugment / RandAugment | 機械探索で最適ポリシーを適用 | 高精度&タスク汎用 | transforms.AutoAugment() / timm.auto_augment |
CutOut | 小黒矩形を複数配置 | ノイズ・局所依存抑制 | albumentations.Cutout() |
GridMask | 格子状にピクセルをマスク | 全領域学習を促進 | albumentations.GridDropout() |
Random Perspective | 透視変換で遠近を付加 | カメラ角度変化に強い | transforms.RandomPerspective(0.5) |
Elastic Transform | ゴムのように歪ませる | 手書き・医療画像で形状耐性 | albumentations.ElasticTransform() |
Snow / Rain Augment | 雪・雨ノイズを重畳 | 悪天候時のロバスト化 | albumentations.RandomSnow() , RandomRain() |
4. 拡張設計のコツ
- 本番を想定:夜間・雨・逆光など実運用環境をシミュレート
- 少しずつ足す:効果を確認しながら拡張を追加=Debug しやすい
- ラベル崩壊に注意:過度な変形でクラス境界が曖昧にならないよう、可視化でチェック
5. ケーススタディ:ペット画像 500 枚の場合
ステップ | 設定 | 期待精度アップ |
ベースライン | 拡張なし | top-1 75% |
王道4種 | 本記事の transform | +6〜8% |
+ MixUp/CutMix | timm 版 transform | +3〜5% |
結果:データ枚数を増やさずとも、約 10〜13% の精度向上が見込める。
6. データ不足を補う “拡張外” テクニック
手法 | 検討タイミング | 効果 | 留意点 |
Pseudo‑Labeling | 未ラベル画像が大量にある時 | 半教師あり学習でデータ水増し | 初期モデルの品質が鍵 / 擬似ラベルのノイズ除去必須 |
Knowledge Distillation | 高精度 Teacher を小型デバイスへ移植したい時 | 推論高速化・省メモリ化 | Teacher 準備と温度・損失の調整が必要 |
Transfer Learning | 近いタスクの事前学習モデルが利用可 | 超少データでも高精度 | ドメインギャップが大きいと効果減 |
Synthetic Data | 実データ取得が難しい/コスト高 | 仮想環境で多様データ生成 | 合成↔実写ギャップを評価 |
Active Learning | 少数ラベル予算を最大化したい時 | 人手ラベルを効率集中 | サンプリング戦略設計とラベラー体制が必要 |
まとめ
データ拡張は、「撮影・アノテ」よりも安く確実な精度改善策です。まずは RandomResizedCrop
と HorizontalFlip
から始め、効果を確認しながら MixUp など高度な手法を取り入れてみましょう。少ないデータで大きな成果を得る近道になります。