Python | OpenCV 資料增強
📑 目錄
📚 前言
在上一篇 TensorFlow/Keras 微調範例 中,我們完成了兩階段微調的完整流程。
這一篇深入介紹 資料增強 (Data Augmentation) 的原理與各種常用技巧。
前兩篇的訓練腳本中已經各自用了少量資料增強:
- PyTorch 微調範例 的
train_transform用了RandomHorizontalFlip、RandomRotation、ColorJitter - TensorFlow/Keras 微調範例 的
data_augmentation用了RandomFlip、RandomRotation、RandomZoom、RandomBrightness
🔎 資料增強的原理
增強不會在磁碟上產生新圖片
很多人以為資料增強是把 000001.jpg(貓)翻轉後另存成 000002.jpg,讓磁碟上的圖片數量增加。
實際上完全不是這樣。增強發生在記憶體中、訓練的當下,原始圖片永遠不會被修改或複製。
1 | ❌ 常見誤解:增強 = 另存新圖(磁碟上的圖片數量增加) |
DataLoader 每次從磁碟讀取圖片,就在記憶體中套用一組隨機的變換,然後把這個即時生成的版本餵給模型。
原始檔案不受影響,下次讀取同一張圖時又是另一組隨機變換。
訓練 15 個 epoch,模型實際上看過 15 個版本的 000001.jpg,但磁碟上始終只有那一張。
增強的核心假設
資料增強的假設是:圖片在合理的變換後,其類別標籤不應改變。
例如,一張貓的圖片左右翻轉後仍然是貓;亮度調暗後仍然是貓。
透過這些變換,模型學會了不依賴特定的方向、亮度或細節來辨識類別,從而提升泛化能力。
💡 資料增強只在訓練集使用,驗證集與測試集不做增強,確保評估結果真實反映模型的泛化能力。
🧠 常用增強技巧
圖:常用資料增強技巧 ─ 各種增強方式的簡單說明與適合使用情境
🛠️ 環境安裝
本篇以三種工具示範資料增強的實作,各有不同的整合方式與適用場景:
圖:常用資料增強套件比較 ─ torchvision.transforms、tf.keras.layers 與 albumentations 的特色差異
1 | # 只裝你需要的就好,不用三個都裝 |
💡 先看效果,再看設定
在進入三種工具的完整設定之前,先用十幾行程式看看增強的效果。
這段程式碼只需要 torchvision,不需要 DataLoader 或模型,執行後你會看到來自同一張圖片的五種不同隨機結果。
1 | # simple_augment_demo.py |

圖:對同一張圖片連續套用增強管線四次並並排顯示,每次的翻轉角度與亮度都不同
看完這個效果之後,下面的三種工具就是教你如何把相同的邏輯整合進 DataLoader 和訓練迴圈。
💻 PyTorch — torchvision.transforms
在 PyTorch 微調範例 的 train.py 裡,train_transform 只有三個基本增強。
以下示範的完整管線可以直接替換 train.py 的 train_transform 定義,訓練迴圈的其他部分不需要修改。
圖:PyTorch 資料載入與即時增強流程 ─ 從資料夾到模型輸入 Tensor 的完整過程
1 | # augment_pytorch.py |

圖:定義 torchvision.transforms 增強管線並整合至 ImageFolder 與 DataLoader,印出 batch 形狀確認資料流正確
視覺化增強結果
把完整的增強管線套用在單張圖片上,看看每次的隨機結果有多大差異。
1 | # visualize_augment_pytorch.py |



圖:對同一張圖片套用 PyTorch 完整增強管線四次並並排顯示,直觀比較各次增強的隨機效果
💻 TensorFlow/Keras — 增強層
在 TensorFlow/Keras 微調範例 的 train.py 裡,data_augmentation 只有四層基本增強。
以下展示更完整的增強層組合,可以直接替換 train.py 的 data_augmentation 定義,不需要修改其他程式碼。
圖:TensorFlow 資料載入與自動增強流程 ─ image_dataset_from_directory 與資料增強層的完整過程
Keras 的增強層嵌入模型架構內部,model.fit 時自動啟用、model.predict 時自動關閉,不需要手動切換。
這是 Keras 與 PyTorch 在增強實作上最大的差異:PyTorch 在 DataLoader 層處理,Keras 在模型內部處理。
1 | # augment_keras.py |

圖:將 Keras 增強層嵌入 MobileNetV2 模型架構,以 image_dataset_from_directory 載入資料後執行 model.fit 訓練
視覺化增強結果
在模型架構之外,手動呼叫增強層對單張圖片套用四次,確認增強效果是否符合預期。
1 | # visualize_augment_keras.py |



圖:使用 TensorFlow Keras 增強層對圖片套用四次隨機增強並並排視覺化比較
💻 Albumentations — 更豐富的增強選項
Albumentations 是 torchvision.transforms 的替代方案,整合方式對應 PyTorch 微調範例 的 DataLoader 流程,但提供更豐富的增強種類,也支援物件偵測任務的邊界框同步變換(翻轉、旋轉時邊界框座標自動跟著調整)。
圖:使用 Albumentations 的 PyTorch 資料載入流程 ─ 自訂 Dataset + Albumentations 增強管線
1 | # augment_albumentations.py |

圖:以自訂 Dataset 整合 Albumentations 增強管線,透過 DataLoader 取出一個 batch 並印出形狀確認
視覺化增強結果
1 | # visualize_augment_albumentations.py |



圖:對同一張圖片套用 Albumentations 增強管線四次並並排顯示,比較翻轉、旋轉、雜訊的隨機效果
⚠️ 注意事項
- 不是所有增強都適用所有任務:垂直翻轉對自然場景的分類任務通常沒有幫助(天空在上、地面在下);文字辨識任務也不能做大幅旋轉。選擇增強前,先想清楚「這個變換後的圖片,人還是能正確辨識嗎?」
- 增強強度要適中:過度增強(如旋轉 90 度、極端色彩變換)可能讓圖片失去原有的語意,反而降低訓練效果。建議從常用組合開始,若準確率未改善再調整強度。
- 驗證集不做增強:驗證集只做 Resize 與 Normalize,不加任何增強,確保評估結果穩定、可比較。
- 物件偵測要同步變換標註:對偵測任務做幾何增強(翻轉、旋轉)時,邊界框座標也必須一起變換。使用 Albumentations 時,在
A.Compose加入bbox_params=A.BboxParams(format="yolo")可自動處理。 - Windows 上
num_workers設 0:PyTorch DataLoader 在 Windows 上使用多進程可能造成死鎖,建議設為 0;Linux / macOS 可設 2 或 4 提升效率。
📊 應用場景
- 分類任務資料不足:以 PyTorch
transforms或 Keras 增強層快速擴充訓練集,不需額外收集資料。 - 物件偵測與標註同步:Albumentations 支援邊界框、遮罩的同步變換,是 YOLO、Faster R-CNN 等偵測任務的主流增強工具。
- 醫療影像:病理切片、X 光片可用隨機旋轉與翻轉增強,但不適合大幅色彩變換(色彩可能帶有診斷意義)。
- 衛星與航拍影像:沒有固定方向,適合同時使用水平與垂直翻轉,大幅擴充訓練資料。
- 工廠品管:瑕疵偵測場景可加入高斯雜訊與模糊,模擬不同品質的相機鏡頭效果。
🎯 結語
資料增強是提升模型泛化能力最直接的方式,尤其在資料量有限的情況下效果顯著。
PyTorch 的 transforms 整合 DataLoader、Keras 的增強層嵌入模型架構、Albumentations 支援最豐富的增強種類,三者各有適用場景,可依框架與任務需求選擇。
下一步是 避免過擬合,進一步強化模型的泛化能力。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
PyTorch 官方文件 — torchvision.transforms
TensorFlow 官方文件 — Preprocessing Layers
Albumentations 官方文件