拡張を慎重に使う
すべての拡張をデプロイ先のカメラに照らして検証し、根拠のあるプロファイルを作成して、その設定で学習し、学習バッチで結果を確認します。
デフォルトの色相ジッターを使って、赤いカプセルとオレンジ色のカプセルを仕分けるラインを学習する場面を想像してください。各エポックで赤いカプセルがオレンジ色に色付けされた画像をモデルに見せると、モデルは色が重要ではないと学習します。しかし、色こそが学習させる必要のあった要素です。拡張によってモデルの頑健性が高まるのは、各変換がデプロイ先のカメラで実際に起こり得る場合に限られます。このレッスンでは、どの変換を使うかを決めるためのテストを紹介します。
実践的
データ拡張の役割#

データ拡張では、学習画像をその場で変換するため、モデルは各エポックで画像ごとに少しずつ異なるバージョンを見ます。適切に行えば、照明、スケール、向きに対する頑健性が向上し、過学習も抑制されます。画像が常に変化するため、モデルが画像を記憶できないからです。不適切な拡張は、物理的にあり得ないシーンを学習させ、修正すべきデータセットの不足を隠してしまいます。
上の色相パネルを見てください。赤いコンゴウインコが黄色に変わっています。「コンゴウインコか、それ以外か」の分類では問題ありませんが、色で2つのクラスを区別する場合には致命的です。
重要なデフォルト設定#
以下はUltralytics 8.4のデフォルト設定です。拡張設定リファレンスにすべての引数が記載されています。
| 引数 | デフォルト | 機能 | 変更する場合 |
|---|---|---|---|
hsv_h | 0.015 | 色相ジッター | 色がクラスを定義する場合は0に設定します |
hsv_s / hsv_v | 0.7 / 0.4 | 彩度と明度のジッター | 照明が固定され、制御されている場合は値を下げます |
degrees | 0.0 | ランダム回転(±度) | オブジェクトがあらゆる角度で現れる場合は値を上げます |
translate / scale | 0.1 / 0.5 | シフトとズーム | クロップによってクラスを定義する部分が切れる場合は値を下げます |
fliplr | 0.5 | 水平反転の確率 | 文字のように左右が重要な場合は0に設定します |
flipud | 0.0 | 垂直反転の確率 | 俯瞰画像、航空画像、顕微鏡画像では値を上げます |
mosaic | 1.0 | 4枚の画像を1枚に合成します | 使用することはまれです。close_mosaicを参照してください |
close_mosaic | 10 | 最後のNエポックではモザイクを無効にします | 実行期間が非常に短い場合は値を下げます |
mixup / cutmix | 0.0 / 0.0 | 2枚の画像をブレンドする/一方の画像のパッチをもう一方に貼り付ける | ベースラインを取得してから、小規模データセットで試します |
copy_paste | 0.0 | 画像間でオブジェクトのインスタンスを貼り付けます | セグメンテーション、セマンティック、OBBのデータセットで、希少クラスがある場合 |
例外は深度データセットです。mosaic、mixup、cutmix、copy_pasteを適用すると対応する深度マップが無効になるため、深度データローダーはこれらの値を自動的に0に設定します。
デプロイ環境でのテスト#
有効にするすべての変換について、2つの問いに順番に答える必要があります。
| 変換 | 現実的か? | 判定 |
|---|---|---|
| 屋外カメラで明るさを±30%変更 | はい:時間帯によって変わります | 使用する |
| 監視カメラで水平反転 | はい:人は両方向に歩きます | 使用する |
| 壁面設置カメラで垂直反転 | いいえ:床は常に下側にあります | 無効化 |
| 俯瞰コンベアカメラでの垂直反転 | はい。「上」という方向がフレーム内にありません | 有効化 |
| 固定式道路カメラでの90°回転 | いいえ。カメラが回転することはありません | 無効化 |
| 赤色と緑色の部品が異なるクラスの場合の色相シフト | いいえ。識別信号が失われます | 無効化 |

真下を向くドローンには、逆さまのコンゴウインコも適切な学習画像ですが、壁に固定されたカメラには無駄な画像です。このテストに通らない変換は、負の学習信号を生み出します。モデルは実際には見ることのない画像を認識するよう学習し、その分、実際に見る画像に割ける容量が減ります。
設定例#
コンベアを見下ろすカメラで、色だけが異なるクラスの部品を仕分けします。色相ジッターは無効にし、垂直反転と小さな回転は現実的な変換になります。以下はCOCO8のデモセットで実行できる設定です。データYAMLと実際のエポック数に置き換えてください。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco8.yaml",
epochs=1,
imgsz=320,
hsv_h=0.0, # 色がクラスのシグナルです。色相を忠実に保つ
flipud=0.5, # 俯瞰視点では、フレームに「上」はない
degrees=10.0, # 部品はさまざまな小さな角度で配置される
)実行フォルダー内のtrain_batch0.jpgを開き、次の3点を確認します。変換後もボックスが対象にぴったり合っていること、クラスを定義する手掛かり(色、形状、テキスト)が保たれていること、物理的にあり得ない見た目になっていないことです。いずれかを損なう変換は弱めてください。最初のモデルをトレーニングするでは、トレーニングの実行手順を説明しています。
Mosaicとclose_mosaic#

Mosaicは4枚の画像を1枚につなぎ合わせる手法で、デフォルトで有効になっています。検出に最も大きな効果をもたらすデータ拡張です。各学習画像に複数のシーン、スケール、物体のコンテキストが含まれます。ただし、Mosaic画像はデプロイ時のフレームとは異なる見た目になるため、close_mosaic=10は最後の10エポックでMosaicを無効にし、現実的な入力でモデルの学習を仕上げます。Mosaicを終了すると、mixup、cutmix、copy_pasteも無効になりますが、反転、HSV、幾何学的変換は継続します。
上記の1エポックのプロファイルを含め、close_mosaicエポック以下の実行では、最初のエポックからモザイクがオフになります。スモークテストではなく、フルレングス実行のtrain_batch0.jpgを基準にモザイクを評価します。
データ拡張で解決できないこと#
データ拡張は、既存のデータを増幅するものです。データセットに夜間の画像がなければ、どの設定でも夜間画像は生成できません。生成されるのは、昼間の画像を明るくしたり暗くしたりしたものです。あるクラスを強いデータ拡張でしか扱えないなら、そのクラスのデータが不足しています。高品質で代表性のあるデータを収集するに戻ってください。
小規模なデータセットですべての拡張を最大にすると、配備環境からますます遠い画像で学習することになり、検証時のmAPが低下することもよくあります。理由を明確にしたうえで、一度に1つの引数だけを変更し、同じ分割でデフォルトのベースラインと比較します。
トランプの角のマークのように、物体の小さな部分でクラスが定義される場合、mosaic、translate、scaleによってその部分が切り取られ、別のクラスとまったく同じに見える学習画像が作られることがあります。そのデータセットではこれらの値を下げ、train_batch0.jpgで修正を確認します。
解答を表示
ドローンが港を真上から撮影し、船を方向付きボックスで検出します。この視点には「上」がなく、船はあらゆる方向を向いており、色はクラスの定義に関係しません。
| 引数 | 選択 | 理由 |
|---|---|---|
flipud | 0.5 | 俯瞰画像は垂直反転しても同じに見えます |
degrees | 180 | 船はあらゆる方位を向いています |
hsv_h | デフォルト | 船体の色はさまざまで、クラスの判断基準ではありません |
mosaic | デフォルト | 画像あたりの小さな物体が多いため、Mosaicが役立ちます |
DOTA8の航空画像デモセットでは:
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=1 imgsz=320 flipud=0.5 degrees=180固定式の道路カメラでは、同じ2つの変更はデプロイ環境のテストに通りません。壁に取り付けたカメラの映像で、車が逆さまに映ることはないためです。