R&D
CENTER

瓶頸竟是 PNG 編碼器 — 擴增速度提升 16 倍的紀錄

擴增時間有 90% 以上耗費在 PIL 的 PNG 編碼器上。只靠調整一個壓縮等級加上平行儲存,就將每張 4.3 秒縮短至 0.26 秒。

在 2448×2048 的 PNG 上執行 Image Processing Tool 的預設擴增(Factor 5、Random ±5°),每張約需 4.3 秒。這代表準備數千張訓練資料需要好幾個小時。

時間耗在哪裡

經過效能分析後發現,瓶頸不是旋轉或對齊,而是儲存。執行時間的 90% 以上都耗費在 PIL 的 PNG 編碼器(預設壓縮 level 6)上。

改了什麼

  1. PNG 壓縮 level 1 — 仍然是無損壓縮,編碼速度約快 5 倍。代價是檔案大約增加 10%。
  2. 平行儲存輸出 — 每張輸入對應的 6 張輸出,以 ThreadPoolExecutor(最多 8 個執行緒)同時儲存。PIL 編碼器會釋放 GIL,因此速度可隨核心數提升。
  3. 簡化旋轉流程 — 將原本 rotate(expand=True) 後再裁切中央的做法,改為只執行一次 rotate(expand=False)。結果相同,成本減半。
  4. 日誌節流 — 原本每個檔案都輸出的日誌,改為每 10 筆輸出一次。

結果

項目 v1.6.1 v1.6.2
每張處理時間 約 4.3 秒 約 0.26 秒
輸出檔案大小 基準 約 +10%
設定檔格式 — 無變更

旋轉邊界會產生不到 0.003% 的像素差異,但不影響擴增品質。