ひとことで言うと
画像データ拡張は、元画像にラベルを保つ変換を施してから訓練する方法です。画像枚数を物理的に増やすというより、「この変化ではクラスが変わらない」という不変性を訓練データに埋め込みます。左右反転、切り出し、色の変化を何でも許すのではなく、対象タスクの意味に合う変換だけを選びます。
同じ製品を正面、少し横、暗い照明で検査するようなものです。検査員に「見え方が変わっても同じ製品だ」と教えられますが、上下を逆さにすると別の製品になる現場なら、その例は訓練に使えません。
なぜ必要か
撮影位置や照明の違いを、モデルがクラスの違いとして覚えると、訓練画像にない見え方で誤ります。そこで、入力 に変換 を適用した も同じラベル とみなせるなら、その組を訓練に加えます。ここで増やしているのは独立な現実データではなく、ラベルを変えないと仮定した見え方です。
AlexNetの論文では、訓練時にランダムな224×224パッチと水平反射を使い、さらにRGB各チャネルの強度を変えています。これは対象物の位置や照明への依存を弱める設計です。テスト時は複数の決めた切り出しと反射の予測を平均しています。
| 場面 | 変換の扱い | 判断 |
|---|---|---|
| 訓練 | ランダムに適用 | ラベルを保つ範囲で不変性を学ばせる |
| 検証・テスト | 固定した前処理 | 実行ごとの差を作らず指標を比較する |
仕組み
変換の集合を 、元画像とラベルを とすると、訓練時には次のような損失を最小化します。
はパラメータ を持つモデル、 は予測とラベルの損失、 は変換です。ローダーが呼ばれるたびにランダムなパラメータを選べます。torchvisionのランダム変換も、呼び出しごとにパラメータをサンプルします。
判断の中心は「その変換後もラベルが同じか」です。水平反転は、左右の向きがクラスに関係しない一般物体分類なら候補ですが、数字、文字、左右の部品を識別する検査では危険です。切り出しは、対象の一部だけでもクラスが分かること、または対象を見失わないことが前提です。色変換は照明差を吸収する一方、色そのものがクラスの手掛かりなら強度を変えすぎてはいけません。
物体検出やセグメンテーションでは、画像だけでなく bounding box やマスクも同じ幾何変換に追従させます。画像だけを反転して座標を変えなければ、入力と教師の対応が壊れます。検証・テストには通常このランダム拡張をかけません。評価ごとに入力が変わると指標の比較が不安定になり、訓練時の仮定を評価データへ持ち込むからです。必要なら決めた前処理や、論文のような固定した複数クロップの平均を、評価手順として別に定義します。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 拡張の目的 | ラベルを保つ変換で不変性を学習させる | 独立な実データを増やす手法とだけ説明する |
| 変換の選択 | タスクの意味に対してラベルが変わらない | すべての画像分類で水平反転できるとする |
| 評価時の扱い | 検証・テストは決定的な前処理にする | 訓練用のランダム拡張をそのまま適用する |
| 検出への適用 | bounding box やマスクも画像と同じ幾何変換を受ける | 画像だけ変換して教師座標を残す |
実装で確かめる
NumPyで、左右反転と中央切り出しを別々の配列操作として確認します。分類ラベルはそのままですが、検出なら反転後の横座標も変換が必要です。
import numpy as np
image = np.arange(3 * 4 * 1).reshape(3, 4, 1)
flipped = image[:, ::-1, :]
crop = flipped[1:, 1:3, :]
box = np.array([1, 0, 3, 2]) # x1, y1, x2, y2; 元画像の幅は4
flipped_box = np.array([4 - box[2], box[1], 4 - box[0], box[3]])
assert np.array_equal(flipped_box, [1, 0, 3, 2])
assert crop.shape == (2, 2, 1)
変換を強くする前に、変換後の画像を目視し、ラベルが成立しているかを確認します。ランダム切り出しで対象が消える、反転で文字が読めなくなる、色変換でクラス条件が消えるなら、その確率や範囲を下げるか採用しません。サンプル数より教師信号との整合性が優先です。
取り違えやすいもの
| 用語 | 画像データ拡張との切り分け |
|---|---|
| 正規化 | 画素値の尺度をそろえる前処理。ラベルを保つ別画像を作る拡張とは役割が違う |
| ランダムクロップ | 画像拡張の具体的な変換。対象を残すというタスク固有の条件がある |
| テスト時の複数クロップ | 固定した複数入力の予測を統合する評価手順。訓練時のランダム拡張とは目的が違う |
| MixUp・CutMix | 複数画像やラベルを組み合わせる拡張。単純な反転・色変換とラベルの扱いが異なる |
想起チェック
画像データ拡張で本当に増やしているものは何か
独立な画像の枚数ではなく、ラベルを保つと仮定した見え方と、その不変性です。
水平反転を常に使ってはいけない理由は何か
左右の向き、文字、数字などがラベルに関係するタスクでは、反転画像に元のラベルを付けると教師信号と矛盾するためです。
検証・テストに訓練時のランダム拡張をかけないのはなぜか
評価入力が実行ごとに変わって指標が不安定になり、訓練時の仮定を評価へ混ぜるからです。評価は固定前処理、または明示した固定クロップで行います。