Data Augmentation
データ拡張では、既存の画像を反転、切り抜き、色調変更などでランダムに変換し、モデルを学習させます。これにより汎化性能が向上します。
データ拡張は、既存のサンプルに反転、クロップ、リスケーリング、色調変更、画像の合成などのランダム変換を適用することで、学習データセットの多様性を高めます。変換後のコピーには元のラベルが保持されるため、視点、照明、位置が変わっても物体は同じ物体であるとモデルが学習します。新しい画像の収集やラベリングには時間とコストがかかるため、拡張は過学習を防ぐ最も低コストな手段です。現代のコンピュータービジョンモデルのほぼすべてが、データ拡張を使って学習します。
データ拡張の仕組み#
多くの学習パイプラインではオンラインで拡張を行います。データローダーがバッチを構築する際に各画像を変換し、毎回新しいランダムパラメーターを選ぶため、各エポックで画像の異なるバージョンを参照します。一方、オフライン拡張では学習前に固定数の変換済みコピーをディスクに保存するため、ストレージ使用量が増え、モデルが参照できる異なるバリエーションも大幅に少なくなります。
データ拡張でデータを損なわないためのルールは2つあります。1つ目は、ピクセルとともにラベルも移動させることです。物体検出、インスタンスセグメンテーション、姿勢推定では、幾何変換によってすべてのバウンディングボックス、マスク、キーポイントを更新する必要があります。また、水平反転では左右のキーポイントも入れ替えます。2つ目は、実世界で起こり得る変換を使うことです。垂直反転は航空画像や顕微鏡画像には適していますが、街路シーンでは推論時に現れない上下逆さまの車が生成されます。torchvisionの変換では、画像と一緒にボックスを渡すと、1つ目のルールに自動的に対応できます。
from urllib.request import urlopen
from PIL import Image
from torchvision import tv_tensors
from torchvision.transforms import v2
image = Image.open(urlopen("https://ultralytics.com/images/bus.jpg")) # 810 x 1080 pixels
boxes = tv_tensors.BoundingBoxes([[50, 400, 250, 900]], format="XYXY", canvas_size=(1080, 810))
# Flip every time (p=1.0) and shift colors; the box must move with the pixels
augment = v2.Compose([v2.RandomHorizontalFlip(p=1.0), v2.ColorJitter(brightness=0.4, saturation=0.7)])
new_image, new_boxes = augment(image, boxes)
print(f"Original box: {boxes.tolist()}")
print(f"Flipped box: {new_boxes.tolist()}")画像左側の人物を囲むボックスは、幅810ピクセルの画像を基準に反転して、[50, 400, 250, 900]から[560, 400, 760, 900]へ移動します。一方、カラージッターはボックスに触れずにピクセルの色を変更します。
一般的な手法#
- 幾何変換: 反転、回転、スケーリング、平行移動、クロップ、せん断、射影変換によって、カメラ位置や物体サイズの違いをシミュレートします。
- フォトメトリック変換: 明るさ、コントラスト、彩度、色相の変更に加え、ぼかしやノイズを使って、照明、センサー、画像品質の違いをシミュレートします。
- オクルージョン: ランダム消去やカットアウトで矩形領域を塗りつぶし、モデルが物体の単一の部分だけに依存できないようにします。
- 画像の合成: MixUpは2枚の画像とそのラベルを混合し、CutMixは一方の画像のパッチをもう一方に貼り付けます。モザイクは4枚の画像を1つの学習サンプルにタイル状に配置し、コピー・ペーストはセグメンテーション済みの物体を新しい背景に移動します。
- 自動化ポリシー: RandAugmentは、変換の数と強度という2つの設定だけで制御されるランダムな変換シーケンスを適用します。これにより、以前の学習ベースのポリシーで必要だった高コストな探索を省けます。
物体検出向けデータ拡張パイプライン#
検出パイプラインでは複数の変換を連続して適用し、それぞれに固有の確率を設定します。そのため、学習画像ごとに異なるランダムな組み合わせが適用されます。
Ultralytics YOLOの学習では、デフォルトでこのパイプラインが実行され、すべての画像にモザイク (mosaic=1.0)、50%の確率での水平反転 (fliplr=0.5)、最大±50%のスケーリング、HSV色調変更が適用されます。また、最後の10エポック (close_mosaic=10) ではモザイクを無効にし、完全で自然な見た目の画像を使ってモデルの学習を仕上げます。
from ultralytics import YOLO
# 事前学習済みYOLO26nモデルを読み込みます
model = YOLO("yolo26n.pt")
# fliplr: 水平反転の確率、scale: ズーム範囲 (+/- 70%)、degrees: 回転範囲 (+/- 5)
results = model.train(data="coco8.yaml", epochs=10, fliplr=0.5, scale=0.7, degrees=5.0)この実行中、YOLO26のトレーナーは、最初の3つの拡張済みバッチをtrain_batch0.jpg、train_batch1.jpg、train_batch2.jpgとしてボックス付きで保存するため、長時間の実行を始める前に各設定の効果を確認できます。










