R&D
CENTER

ボトルネックは PNG エンコーダだった — 拡張処理を16倍高速化

拡張処理時間の90%以上が PIL の PNG エンコーダで消費されていました。圧縮レベルの変更と並列保存で、1枚あたり4.3秒を0.26秒に短縮しました。

Image Processing Tool の標準の拡張処理(Factor 5、Random ±5°)を 2448×2048 の PNG に適用すると、1枚あたり約4.3秒かかっていました。数千枚の学習データの準備に数時間かかる計算です。

時間はどこで消えていたか

プロファイリングの結果、ボトルネックは回転や整列ではなく保存処理でした。実行時間の90%以上が PIL の PNG エンコーダ(標準の圧縮レベル6)で費やされていました。

変更点

  1. PNG 圧縮レベル1 — 可逆圧縮のまま、エンコードが約5倍高速になります。ファイルサイズは約10%増えます。
  2. 出力の並列保存 — 入力1枚あたり6枚の出力を ThreadPoolExecutor(最大8スレッド)で同時に保存します。PIL のエンコーダは GIL を解放するため、コア数に比例して速くなります。
  3. 回転処理の簡素化 — rotate(expand=True) の後に中央を切り出す処理を、rotate(expand=False) の1回に置き換えました。結果は同じで、コストは半分です。
  4. ログの間引き — ファイルごとのログを10件に1回に減らしました。

結果

項目 v1.6.1 v1.6.2
1枚あたりの処理時間 約4.3秒 約0.26秒
出力ファイルサイズ 基準 約+10%
設定ファイル形式 — 変更なし

回転の境界で0.003%未満の画素差が生じますが、拡張の品質には影響しません。