Ultralytics YOLOによるデータ拡張#
はじめに#
データ拡張は、既存の画像にさまざまな変換を適用して学習データセットを人工的に拡張する、コンピュータービジョンにおける重要な手法です。Ultralytics YOLOのようなディープラーニングモデルの学習では、データ拡張によってモデルの堅牢性が向上し、過学習が軽減され、実環境のシナリオに対する汎化性能が高まります。
視聴: Mosaic、MixUpなどのデータ拡張を使用して、Ultralytics YOLOモデルの汎化性能を高める方法 🚀
データ拡張が重要な理由#
データ拡張は、コンピュータービジョンモデルの学習において、複数の重要な役割を果たします。
- データセットの拡張: 既存の画像にバリエーションを加えることで、新しいデータを収集しなくても、学習データセットのサイズを効果的に増やせます。
- 汎化性能の向上: モデルはさまざまな条件下で物体を認識する方法を学習するため、実環境のアプリケーションに対する堅牢性が高まります。
- 過学習の軽減: 学習データに変化を加えることで、モデルが特定の画像の特徴を記憶してしまう可能性を抑えられます。
- 性能の向上: 適切なデータ拡張を用いて学習したモデルは、通常、検証セットとテストセットでより高い精度を達成します。
Ultralytics YOLOには包括的なデータ拡張手法が実装されており、それぞれが特定の目的を持ち、異なる形でモデルの性能向上に貢献します。このガイドでは、以下のデータ拡張設定について説明し、プロジェクトで効果的に使用するタイミングと方法を解説します。
設定例#
各パラメーターは、Python API、コマンドラインインターフェース(CLI)、または設定ファイルを使用してカスタマイズできます。以下に、各方法でデータ拡張を設定する例を示します。
import albumentations as A
from ultralytics import YOLO
# モデルを読み込む
model = YOLO("yolo26n.pt")
# カスタムデータ拡張パラメーターを指定して学習
model.train(data="coco8.yaml", epochs=100, hsv_h=0.03, hsv_s=0.6, hsv_v=0.5)
# 設定可能なすべてのデータ拡張を無効にして学習(無効にする値はわかりやすさのため省略)
model.train(
data="coco8.yaml",
epochs=100,
hsv_h=0.0,
hsv_s=0.0,
hsv_v=0.0,
translate=0.0,
scale=0.0,
fliplr=0.0,
mosaic=0.0,
erasing=0.0,
auto_augment=None,
)
# カスタムAlbumentations変換を指定して学習(Python APIのみ)
custom_transforms = [
A.Blur(blur_limit=7, p=0.5),
A.CLAHE(clip_limit=4.0, p=0.5),
]
model.train(data="coco8.yaml", epochs=100, augmentations=custom_transforms)このページに記載されている変換は、学習引数を通じて制御できるものです。Ultralyticsは、albumentationsパッケージがインストールされている場合、ぼかし、メディアンぼかし、グレースケール、CLAHEからなる少数のAlbumentations変換も、それぞれp=0.01で適用しますが、default.yaml内の引数では無効にできないため、パッケージをアンインストールして削除するか、独自のリストをaugmentationsに渡して置き換えてください。
設定ファイルを使用する#
拡張を含むすべての学習パラメーターは、YAML設定ファイル(例: train_custom.yaml)で定義できます。modeパラメーターが必要なのは、CLIを使用する場合のみです。この新しいYAMLファイルは、ultralyticsパッケージ内にあるデフォルトの設定ファイルを上書きします。
# train_custom.yaml
# 'mode' is required only for CLI usage
mode: train
data: coco8.yaml
model: yolo26n.pt
epochs: 100
hsv_h: 0.03
hsv_s: 0.6
hsv_v: 0.5次に、Python APIを使って学習を開始します。
from ultralytics import YOLO
# COCOで事前学習したYOLO26nモデルを読み込む
model = YOLO("yolo26n.pt")
# カスタム設定でモデルを学習
model.train(cfg="train_custom.yaml")色空間のデータ拡張#
色相の調整(hsv_h)#
- 範囲:
0.0~1.0 - デフォルト:
0.015 - 使用方法: 色同士の関係を保ちながら、画像の色をシフトします。
hsv_hハイパーパラメーターでシフト量を定義し、最終的な調整値は-hsv_hからhsv_hの範囲でランダムに選択されます。たとえば、hsv_h=0.3の場合、シフト量は-0.3から0.3の範囲でランダムに選択されます。0.5を超える値では色相シフトが色相環を一周するため、0.5と-0.5の間では同じように見えるデータ拡張になります。 - 目的: 照明条件が物体の見え方に大きく影響する屋外のシナリオで特に役立ちます。たとえば、バナナは明るい日差しの下では黄色く見えますが、屋内では緑がかって見えることがあります。
- Ultralyticsの実装: RandomHSV
-0.5 | -0.25 | 0.0 | 0.25 | 0.5 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
彩度の調整(hsv_s)#
- 範囲:
0.0~1.0 - デフォルト:
0.7 - 使用方法: 画像内の色の強度を変更します。
hsv_sハイパーパラメーターでシフト量を定義し、最終的な調整値は-hsv_sからhsv_sの範囲でランダムに選択されます。たとえば、hsv_s=0.7の場合、色の強度は-0.7から0.7の範囲でランダムに選択されます。 - 目的: さまざまな気象条件やカメラ設定にモデルが対応できるようにします。たとえば、赤い交通標識は晴れた日には鮮やかに見えますが、霧の中では色あせて鈍く見えることがあります。
- Ultralyticsの実装: RandomHSV
-1.0 | -0.5 | 0.0 | 0.5 | 1.0 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
明るさの調整(hsv_v)#
- 範囲:
0.0~1.0 - デフォルト:
0.4 - 使用方法: 画像の明るさを変更します。
hsv_vハイパーパラメーターでシフト量を定義し、最終的な調整値は-hsv_vからhsv_vの範囲でランダムに選択されます。たとえば、hsv_v=0.4の場合、強度は-0.4から0.4の範囲でランダムに選択されます。 - 目的: 異なる照明条件下で動作する必要があるモデルの学習に不可欠です。たとえば、赤いリンゴは日なたでは明るく見えても、日陰ではかなり暗く見えることがあります。
- Ultralyticsの実装: RandomHSV
-1.0 | -0.5 | 0.0 | 0.5 | 1.0 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
幾何学的変換#
回転(degrees)#
- 範囲:
0.0~180 - デフォルト:
0 - 使用方法: 指定した範囲内で画像をランダムに回転します。
degreesハイパーパラメーターで回転角度を定義し、最終的な調整値は-degreesからdegreesの範囲でランダムに選択されます。たとえば、degrees=10.0の場合、回転角度は-10.0から10.0の範囲でランダムに選択されます。 - 目的: 物体がさまざまな向きで現れるアプリケーションに不可欠です。たとえば、ドローンで撮影した航空画像では、車両はあらゆる方向を向いている可能性があるため、モデルは回転に関係なく物体を認識する必要があります。
- Ultralyticsの実装: RandomPerspective
-180 | -90 | 0.0 | 90 | 180 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
平行移動(translate)#
- 範囲:
0.0~1.0 - デフォルト:
0.1 - 使用方法: 画像サイズに対するランダムな割合で、画像を水平方向および垂直方向にシフトします。
translateハイパーパラメーターでシフト量を定義し、最終的な調整値は-translateからtranslateの範囲内で、各軸についてそれぞれランダムに選択されます。たとえば、translate=0.5の場合、x軸の平行移動量は-0.5から0.5の範囲でランダムに選択され、y軸にも同じ範囲から独立したランダム値が選択されます。 - 目的: モデルが部分的に見える物体を検出できるよう学習し、物体の位置に対する堅牢性を高めます。たとえば、車両の損傷評価アプリケーションでは、撮影者の位置や距離に応じて、車の部品がフレーム内に全体または一部だけ写ることがあります。平行移動によるデータ拡張を適用すると、モデルは部品の写り具合や位置に関係なく、こうした特徴を認識できるようになります。
- Ultralyticsの実装: RandomPerspective
- 注: わかりやすさのため、以下に示す平行移動は、
x軸とy軸の両方で毎回同じ値を適用しています。-1.0と1.0の値は、画像全体がフレーム外に移動するため表示していません。
-0.5 | -0.25 | 0.0 | 0.25 | 0.5 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
スケール(scale)#
- 範囲: 浮動小数点数の場合は
0.0~1.0、または明示的な(min, max)タプル - デフォルト:
0.5 - 使用方法: 指定した範囲内のランダムな倍率で画像をリサイズします。浮動小数点数の場合、
scaleハイパーパラメーターでスケーリング倍率を定義し、最終的な倍率は1-scaleから1+scaleの範囲でランダムに選択されます。たとえば、scale=0.5の場合、スケーリング倍率は0.5から1.5の範囲でランダムに選択されます。タプルの場合は、scaleで範囲を直接指定するため、scale=(0.5, 2.0)は0.5から2.0の間で倍率をサンプリングします。 - 目的: モデルが距離やサイズの異なる物体に対応できるようにします。たとえば、自動運転アプリケーションでは、車両はカメラからさまざまな距離に現れるため、モデルはサイズに関係なく車両を認識する必要があります。
- Ultralyticsの実装: RandomPerspective
- 注:
-1.0の値は画像を消失させるため表示していません。一方、1.0では単純に2倍にズームします。- 以下の表に示す値は、
scaleハイパーパラメーターに渡す値ではなく、実際に適用されたスケールの変化量です。 - 浮動小数点数形式の値は
0.0~1.0の範囲で検証され、範囲外の値を指定するとValueErrorが発生します。2倍ズームを超える倍率をサンプリングするには、代わりに(min, max)タプル形式を指定してください。 - タプル形式は幾何学的タスクにのみ適用されます。分類の学習では、浮動小数点数(
1.0 - scale~1.0)から独自のクロップ範囲が導出されるため、タプルを渡すとTypeErrorが発生します。
-0.5 | -0.25 | 0.0 | 0.25 | 0.5 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
せん断(shear)#
- 範囲:
-180~+180 - デフォルト:
0 - 使用方法: x軸とy軸の両方に沿って画像を傾ける幾何学的変換を適用します。平行線を保ちながら、画像の一部を一方向に移動させます。
shearハイパーパラメーターでせん断角度を定義し、最終的な調整値は-shearからshearの範囲でランダムに選択されます。たとえば、shear=10.0の場合、x軸のせん断量は-10から10の範囲でランダムに選択され、y軸にも同じ範囲から独立したランダム値が選択されます。 - 目的: わずかな傾きや斜めの視点による視角の変化に対して、モデルの汎化性能を高めます。たとえば、交通量の監視では、カメラが垂直に設置されていないため、車や道路標識が傾いて見えることがあります。せん断によるデータ拡張を適用すると、モデルはこうした歪みがあっても物体を認識できるようになります。
- Ultralyticsの実装: RandomPerspective
- 注:
shearの値を大きくすると画像が急速に歪む可能性があるため、小さな値から始めて段階的に増やすことをおすすめします。- 遠近変換とは異なり、せん断では奥行きや消失点は生じません。代わりに、向かい合う辺を平行に保ちながら角度を変え、物体の形状を歪ませます。
-10 | -5 | 0.0 | 5 | 10 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
遠近変換(perspective)#
- 範囲:
0.0~0.001 - デフォルト:
0 - 使用方法: x軸とy軸の両方に沿って完全な遠近変換を適用し、異なる奥行きや角度から物体を見たときの見え方を再現します。
perspectiveハイパーパラメーターで遠近変換の大きさを定義し、最終的な調整値は-perspectiveからperspectiveの範囲でランダムに選択されます。たとえば、perspective=0.001の場合、x軸の遠近変換量は-0.001から0.001の範囲でランダムに選択され、y軸にも同じ範囲から独立したランダム値が選択されます。 - 目的: 遠近変換によるデータ拡張は、特に遠近の変化によって物体が短縮または歪んで見えるシナリオで、極端な視点の変化に対応するために不可欠です。たとえば、ドローンによる物体検出では、ドローンの傾きや高度に応じて、建物、道路、車両が引き伸ばされたり圧縮されたりして見えることがあります。遠近変換を適用することで、モデルは遠近による歪みがあっても物体を認識できるようになり、実環境へのデプロイ時の堅牢性が向上します。
- Ultralyticsの実装: RandomPerspective
-0.001 | -0.0005 | 0.0 | 0.0005 | 0.001 |
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
上下反転(flipud)#
- 範囲:
0.0~1.0 - デフォルト:
0 - 使用方法: y軸に沿って画像を反転し、垂直方向に反転します。この変換では画像全体が上下逆さまになりますが、物体間の空間的な関係は保たれます。flipudハイパーパラメーターは変換を適用する確率を定義します。値が
flipud=1.0の場合はすべての画像が反転し、値がflipud=0.0の場合は変換が完全に無効になります。たとえば、flipud=0.5の場合、各画像が上下逆さまに反転される確率は50%です。 - 目的: 物体が上下逆さまに現れる可能性があるシナリオで役立ちます。たとえば、ロボットビジョンシステムでは、コンベアベルト上の物体やロボットアームで扱う物体が、さまざまな向きで持ち上げられたり置かれたりすることがあります。上下反転により、モデルは物体の上下の向きに関係なく認識できるようになります。
- Ultralyticsの実装: RandomFlip
flipudオフ | flipudオン |
|---|---|
![]() | ![]() |
左右反転(fliplr)#
- 範囲:
0.0~1.0 - デフォルト:
0.5 - 使用方法: x軸に沿って画像を反転し、水平方向に鏡像化します。この変換では左右が入れ替わりますが、空間的な整合性は保たれるため、鏡像の向きで現れる物体に対するモデルの汎化性能が高まります。
fliplrハイパーパラメーターは変換を適用する確率を定義します。値がfliplr=1.0の場合はすべての画像が反転し、値がfliplr=0.0の場合は変換が完全に無効になります。たとえば、fliplr=0.5の場合、各画像が左右反転される確率は50%です。 - 目的: 左右の違いに対する堅牢性を高めるため、物体検出、姿勢推定、顔認識で広く使用されます。たとえば、自動運転では車両や歩行者が道路の左右どちら側にも現れるため、左右反転によってモデルはどちらの向きでも同じように認識できるようになります。
- Ultralyticsの実装: RandomFlip
fliplrオフ | fliplrオン |
|---|---|
![]() | ![]() |
BGRチャンネルの入れ替え(bgr)#
- 範囲:
0.0~1.0 - デフォルト:
0 - 使用方法: 画像のカラーチャンネルをRGBからBGRに入れ替え、色の表現順序を変更します。
bgrハイパーパラメーターは変換を適用する確率を定義します。bgr=1.0ではすべての画像でチャンネルが入れ替わり、bgr=0.0では変換が無効になります。たとえば、bgr=0.5の場合、各画像がRGBからBGRに変換される確率は50%です。 - 目的: 異なるカラーチャンネル順に対する堅牢性を高めます。たとえば、RGB形式とBGR形式が一貫せずに使用されるさまざまなカメラシステムや画像ライブラリに対応するモデルを学習する場合や、入力の色形式が学習データと異なる可能性がある環境にモデルをデプロイする場合に役立ちます。
- Ultralyticsの実装: Format
bgrオフ | bgrオン |
|---|---|
![]() | ![]() |
モザイク(mosaic)#
- 範囲:
0.0~1.0 - デフォルト:
1 - 使用方法: 4枚の学習画像を1枚に結合します。
mosaicハイパーパラメーターは変換を適用する確率を定義します。mosaic=1.0ではすべての画像が結合され、mosaic=0.0では変換が無効になります。たとえば、mosaic=0.5の場合、各画像がほかの3枚の画像と結合される確率は50%です。 - 目的: 小さな物体の検出とコンテキストの理解を向上させるうえで、非常に効果的です。たとえば、野生動物保護プロジェクトでは、動物がさまざまな距離やスケールで現れることがあります。モザイクによるデータ拡張は、限られたデータから多様な学習サンプルを人工的に作成し、異なるサイズや部分的な遮蔽、さまざまな環境コンテキストにおいて、同じ種を認識する方法をモデルに学習させます。
- Ultralyticsの実装: Mosaic
- 注:
mosaicによるデータ拡張はモデルの堅牢性を高める一方で、学習プロセスをより難しくすることもあります。- 学習の終盤に
close_mosaicへ完了までのエポック数を設定すると、mosaicによるデータ拡張を無効にできます。たとえば、epochsが200に設定され、close_mosaicが20に設定されている場合、mosaicによるデータ拡張は180エポック後に無効になります。close_mosaicが0に設定されている場合、mosaicによるデータ拡張は学習全体を通じて有効になります。 - モザイクを終了すると、同じエポックで
copy_paste、mixup、cutmixも無効になります。これら4つは同時に無効になるため、最終エポックでは適用されませんが、その他の幾何学的変換、HSV、反転、Albumentationsによるデータ拡張は引き続き適用されます。なお、デフォルトのflipモードのcopy_pasteは、複数の画像を結合するのではなく、1枚の画像内で機能します。 - 生成されるモザイクの中心はランダムな値で決まり、画像の内側または外側のいずれかに配置されます。
- 現在の
mosaicによるデータ拡張の実装では、現在の画像を、最近読み込まれた画像のバッファー、またはcache='ram'の場合はデータセット内の任意の画像から選ばれた3枚と結合します。どちらの場合も復元抽出でサンプリングされるため、1つのモザイクに同じ画像が複数回含まれることがあります。
mosaicオフ | mosaicオン |
|---|---|
![]() | ![]() |
Mixup(mixup)#
- 範囲:
0.0~1.0 - デフォルト:
0 - 使用方法: 指定した確率で2枚の画像とそれぞれのラベルをブレンドします。
mixupハイパーパラメーターは変換を適用する確率を定義します。mixup=1.0ではすべての画像が混合され、mixup=0.0では変換が無効になります。たとえば、mixup=0.5の場合、各画像が別の画像と混合される確率は50%です。 - 目的: モデルの堅牢性を高め、過学習を抑制します。たとえば、小売商品の認識システムでは、Mixupによって異なる商品の画像をブレンドし、より堅牢な特徴をモデルに学習させることで、店頭の商品棚が混雑していて商品が一部しか見えない場合や、ほかの商品に隠れている場合でも、商品を識別できるようになります。
- Ultralyticsの実装: MixUp
- 注:
mixupの比率は、np.random.beta(32.0, 32.0)ベータ分布から選ばれるランダムな値です。そのため、多少のばらつきはありますが、各画像はおよそ50%ずつ寄与します。
1枚目の画像、mixupオフ | 2枚目の画像、mixupオフ | mixupオン |
|---|---|---|
![]() | ![]() | ![]() |
CutMix(cutmix)#
- 範囲:
0.0~1.0 - デフォルト:
0 - 使用方法: 指定した確率で、ある画像から矩形領域を切り取り、別の画像に貼り付けます。
cutmixハイパーパラメーターは変換を適用する確率を定義し、cutmix=1.0ではすべての画像に変換を適用し、cutmix=0.0では変換を完全に無効にします。たとえば、cutmix=0.5の場合、各画像は50%の確率で別の画像のパッチに置き換えられた領域を持ちます。 - 目的: 局所的な特徴を保ちながら、現実的なオクルージョン状況を作り出してモデルの性能を高めます。たとえば、自動運転システムでは、CutMixによって、車両や歩行者がほかの物体に部分的に隠れていても認識できるようモデルが学習し、物体が重なり合う複雑な実環境での検出精度が向上します。
- Ultralyticsの実装: CutMix
- 注:
- 切り取り領域のサイズと位置は、適用のたびにランダムに決定されます。
- ピクセル値を全体的にブレンドするMixUpとは異なり、
cutmixでは切り取り領域内の元のピクセル強度が保たれ、局所的な特徴が維持されます。 - 領域は、既存のバウンディングボックスと重ならない場合にのみ対象画像に貼り付けられます。また、元の面積が貼り付け領域内に十分残っているバウンディングボックスのみが保持されます。
- この最小バウンディングボックス面積のしきい値は、現在の実装では変更できません。検出ラベルでは
0.1(10%)、ラベルにセグメントが含まれる場合は0.01(1%)です。
1枚目の画像、cutmixオフ | 2枚目の画像、cutmixオフ | cutmixオン |
|---|---|---|
![]() | ![]() | ![]() |
Copy-Pasteによるデータ拡張#
Copy-Paste(copy_paste)#
- 範囲:
0.0~1.0 - デフォルト:
0 - 使用方法: ポリゴンラベルが必要なため、セグメンテーションおよびOBBタスクに適用されます。このデータ拡張では、
copy_paste_modeで制御しながら、画像内または画像間でオブジェクトをコピーします。flipモードでは、copy_pasteはコピー対象となるオブジェクトの割合です。コピー対象が6個ある画像では、copy_paste=0.5個のコピーが追加されます。mixupモードでは、同じ値でCopy-Pasteが実行される確率も制御します。copy_paste=0.0は変換を無効にします。 - 目的: インスタンスセグメンテーションタスクや、出現頻度の低いオブジェクトクラスで特に有効です。たとえば、特定の種類の欠陥がまれにしか発生しない産業用欠陥検出では、Copy-Pasteによるデータ拡張で、ある画像から別の画像に欠陥をコピーして希少な欠陥の出現頻度を人工的に高めることができます。これにより、不良サンプルを追加しなくても、モデルがこうした出現頻度の低いケースをよりよく学習できます。
- Ultralyticsの実装: CopyPaste
- 注:
- 以下の動画に示すように、
copy_pasteデータ拡張を使用して、ある画像から別の画像にオブジェクトをコピーできます。 - コピー対象のオブジェクトを選択すると、
copy_paste_modeにかかわらず、対象画像にすでに存在するすべてのオブジェクトとのIoAが計算されます。すべてのIoA値が0.3(30%)未満の場合にのみオブジェクトが貼り付けられ、いずれかのIoA値が0.3以上の場合は貼り付けられません。 - IoAのしきい値は現在の実装では変更できず、デフォルトで
0.3に設定されています。
- 以下の動画に示すように、
copy_pasteオフ | copy_pasteをcopy_paste_mode=flipで使用 | copy_pasteの処理を可視化 |
|---|---|---|
![]() | ![]() |
Copy-Pasteモード(copy_paste_mode)#
- オプション:
'flip'、'mixup' - デフォルト:
'flip' - 使用方法: Copy-Pasteデータ拡張で使用する方式を指定します。
'flip'に設定すると同じ画像からオブジェクトを取得し、'mixup'では別の画像からオブジェクトをコピーできます。 - 目的: コピーしたオブジェクトを対象画像に取り込む方法を柔軟に選択できます。
- Ultralyticsの実装: CopyPaste
- 注:
- どちらの
copy_paste_modeオプションでもIoAの原則は同じですが、オブジェクトのコピー方法は異なります。 - 画像サイズによっては、オブジェクトが部分的に、または完全にフレームの外側へコピーされることがあります。
- ポリゴンアノテーションの品質によっては、コピーしたオブジェクトの形状が元のオブジェクトとわずかに異なる場合があります。
- どちらの
| 参照画像 | copy_paste用に選択した画像 | copy_pasteをcopy_paste_mode=mixupで使用 |
|---|---|---|
![]() | ![]() | ![]() |
分類タスク専用のデータ拡張#
Auto Augment(auto_augment)#
- オプション:
'randaugment'、'autoaugment'、'augmix'、None - デフォルト:
'randaugment' - 使用方法: 分類用の自動データ拡張ポリシーを適用します。
'randaugment'オプションではRandAugment、'autoaugment'ではAutoAugment、'augmix'ではAugMixを使用します。Noneに設定すると、自動データ拡張が無効になります。 - 目的: 分類タスク向けのデータ拡張戦略を自動的に最適化します。それぞれの違いは次のとおりです。
- AutoAugment: ImageNet、CIFAR10、SVHNなどのデータセットを使って学習した、あらかじめ定義されたデータ拡張ポリシーを適用するモードです。ユーザーは既存のポリシーを選択できますが、Torchvision内で新しいポリシーを学習することはできません。特定のデータセットに最適なデータ拡張戦略を見つけるには、外部ライブラリまたはカスタム実装が必要です。AutoAugment論文を参照してください。
- RandAugment: 強度を均一にした変換をランダムに選択して適用します。この手法では、広範な探索段階が不要になるため、計算効率を高めながらモデルのロバスト性を向上できます。RandAugment論文を参照してください。
- AugMix: AugMixは、単純な変換をランダムに組み合わせて多様な画像バリエーションを作成し、モデルのロバスト性を高めるデータ拡張手法です。AugMix論文を参照してください。
- Ultralyticsの実装: classify_augmentations()
- 注:
- 基本的に、3つの手法の主な違いは、データ拡張ポリシーの定義方法と適用方法です。
- 3つの手法を詳しく比較したこちらの記事を参照してください。
Random Erasing(erasing)#
- 範囲:
0.0~1.0 - デフォルト:
0.4 - 使用方法: 分類の学習中に、画像の一部をランダムに消去します。
erasingハイパーパラメーターは変換を適用する確率を定義し、erasing=1.0ではすべての画像の領域を消去し、erasing=0.0では変換を無効にします。たとえば、erasing=0.5の場合、各画像は50%の確率で一部が消去されます。 - 目的: モデルがロバストな特徴を学習できるようにし、特定の画像領域への過度な依存を防ぎます。たとえば、顔認識システムでは、サングラス、フェイスマスク、その他の顔の特徴を部分的に覆う物体によるオクルージョンに対して、モデルがよりロバストになるようRandom Erasingが役立ちます。モデルが隠れる可能性のある特徴だけに頼らず、複数の顔の特徴を使って人物を識別するようになるため、実環境での性能が向上します。
- Ultralyticsの実装: classify_augmentations()
- 注:
erasingオフ | erasingを使用(例1) | erasingを使用(例2) | erasingを使用(例3) |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
高度なデータ拡張機能#
Albumentationsのカスタム変換(augmentations)#
- タイプ: Albumentations変換の
list - デフォルト:
None - 使用方法: Python APIを使用して、データ拡張用のカスタムAlbumentations変換を指定できます。このパラメーターはAlbumentations変換オブジェクトのリストを受け取り、デフォルトのAlbumentations変換の代わりに学習中に適用します。
- 目的: Albumentationsの豊富な変換ライブラリを活用し、データ拡張戦略をきめ細かく制御できます。組み込みのYOLOオプションでは対応できない特殊な拡張が必要な場合に特に有効です。たとえば、医療画像向けの弾性変形やグリッド歪み、上空からの航空写真や衛星画像の視点に合わせた変換、低照度環境を再現するノイズや明るさの変化、産業検査向けの欠陥に似たテクスチャのバリエーションなどがあります。
- Ultralyticsの実装: Albumentations
- 注:
- 変換オブジェクトを作成するにはPython APIが必要です。Ultralyticsはチェックポイントの保存時に
A.to_dict()を使用して変換オブジェクトをシリアライズするため、シリアライズ済みのリストはYAML設定ファイルまたはCLIを介してそのまま受け渡すことができ、resumeで復元できます。 - カスタム変換を指定すると、デフォルトのAlbumentationsセットは完全に置き換えられます。このページのほかの場所で設定したすべてのデータ拡張(
mosaic、hsv_h、degreesなど)は引き続き有効で、それぞれ独立して適用されます。 - 画像のジオメトリを変更する空間変換は、
A.OneOfまたはA.Compose内にネストされている場合も含め、画像に合わせてバウンディングボックス、ポリゴン、キーポイント、深度マスクまたはセマンティックマスクを移動します。A.RandomGridShuffleではポリゴンやキーポイントのトポロジーを保持できないため、セグメンテーション、ポーズ、OBBのサンプルでエラーが発生します。 - Albumentationsには70種類以上の変換があり、Albumentationsのドキュメントにすべて記載されています。変換を多数追加したり、計算コストの高い変換を追加したりすると学習が遅くなるため、まずは少数の変換から始め、エポック時間を確認してください。
detect、segment、semantic、depth、pose、obbの各タスクに適用されます。分類では別のデータ拡張パイプラインを使用するため、対象外です。
- 変換オブジェクトを作成するにはPython APIが必要です。Ultralyticsはチェックポイントの保存時に
以下の例にはAlbumentations 1.4.22以降が必要であり、そのためPython 3.9以降が必要です。
import albumentations as A
from ultralytics import YOLO
# モデルを読み込む
model = YOLO("yolo26n.pt")
# カスタムAlbumentations変換を定義
custom_transforms = [
A.Blur(blur_limit=7, p=0.5),
A.GaussNoise(std_range=(0.0124, 0.0277), p=0.3),
A.CLAHE(clip_limit=4.0, p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),
A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=30, val_shift_limit=20, p=0.5),
]
# カスタムAlbumentations変換を使って学習
model.train(
data="coco8.yaml",
epochs=100,
augmentations=custom_transforms, # カスタム変換を渡す
imgsz=640,
)よくある質問#
適切なデータ拡張は、具体的なユースケースとデータセットによって異なります。選択の参考となる一般的なガイドラインをいくつか紹介します。
- ほとんどの場合、色や明るさにわずかな変化を加えると効果的です。
hsv_h、hsv_s、hsv_vのデフォルト値は、出発点として適しています。 - カメラの視点が一定で、モデルのデプロイ後に変わらない場合は、
degrees(回転)、translate、scale、shear、perspectiveなどの幾何変換を省略できます。ただし、カメラの角度が変わる可能性があり、モデルのロバスト性を高める必要がある場合は、これらのデータ拡張を有効にしておくことをおすすめします。 - オブジェクトが部分的に隠れたり、画像あたりのオブジェクト数が複数になったりしても問題なく、ラベル値が変わらない場合にのみ、
mosaicデータ拡張を使用してください。あるいは、mosaicを有効にしたまま、close_mosaicの値を大きくして、学習プロセスの早い段階で無効になるようにすることもできます。
要点は、シンプルに保つことです。少数のデータ拡張から始め、必要に応じて段階的に追加してください。目的はモデルの汎化性能とロバスト性を高めることであり、学習プロセスを複雑にしすぎることではありません。また、適用するデータ拡張が、本番環境でモデルが遭遇するデータ分布を反映していることを確認してください。
- ほとんどの場合、色や明るさにわずかな変化を加えると効果的です。
albumentationsパッケージがインストールされている場合、Ultralyticsはこのパッケージを使って追加の画像データ拡張を自動的に適用します。これらのデータ拡張は内部で処理され、追加の設定は必要ありません。適用される変換の全一覧は、技術ドキュメントとAlbumentations統合ガイドで確認できます。確率
pが0より大きいデータ拡張のみが有効になる点に注意してください。これらは、ぼかしやグレースケール効果など、現実世界の視覚的なアーティファクトを再現するため、意図的に低い頻度で適用されます。Python APIを使って、独自のAlbumentationsカスタム変換を指定することもできます。詳しくは、高度なデータ拡張機能のセクションを参照してください。
albumentationsパッケージがインストールされているか確認してください。インストールされていない場合は、次のコマンドでインストールしてください。pip install albumentationsインストールすると、Ultralyticsがパッケージを自動的に検出して使用します。
カスタムデータセットクラスとトレーナーを作成して、データ拡張をカスタマイズできます。たとえば、デフォルトのUltralytics分類データ拡張を、PyTorchのtorchvision.transforms.Resizeやその他の変換に置き換えることができます。実装の詳細は、分類ドキュメントのカスタム学習の例を参照してください。













































