Image Processing Tool の標準の拡張処理(Factor 5、Random ±5°)を 2448×2048 の PNG に適用すると、1枚あたり約4.3秒かかっていました。数千枚の学習データの準備に数時間かかる計算です。
時間はどこで消えていたか
プロファイリングの結果、ボトルネックは回転や整列ではなく保存処理でした。実行時間の90%以上が PIL の PNG エンコーダ(標準の圧縮レベル6)で費やされていました。
変更点
- PNG 圧縮レベル1 — 可逆圧縮のまま、エンコードが約5倍高速になります。ファイルサイズは約10%増えます。
- 出力の並列保存 — 入力1枚あたり6枚の出力を
ThreadPoolExecutor(最大8スレッド)で同時に保存します。PIL のエンコーダは GIL を解放するため、コア数に比例して速くなります。 - 回転処理の簡素化 —
rotate(expand=True)の後に中央を切り出す処理を、rotate(expand=False)の1回に置き換えました。結果は同じで、コストは半分です。 - ログの間引き — ファイルごとのログを10件に1回に減らしました。
結果
| 項目 | v1.6.1 | v1.6.2 |
|---|---|---|
| 1枚あたりの処理時間 | 約4.3秒 | 約0.26秒 |
| 出力ファイルサイズ | 基準 | 約+10% |
| 設定ファイル形式 | — | 変更なし |
回転の境界で0.003%未満の画素差が生じますが、拡張の品質には影響しません。