Image Processing Tool의 기본 증강(Factor 5, Random ±5°)을 2448×2048 PNG에 돌리면 장당 약 4.3초가 걸렸습니다. 학습 데이터 수천 장을 준비하는 데 몇 시간이 걸린다는 뜻입니다.
어디서 시간이 새고 있었나
프로파일링해 보니 회전이나 정렬이 아니라 저장이 병목이었습니다. 실행 시간의 90% 이상이 PIL의 PNG 인코더(기본 압축 level 6)에서 쓰이고 있었습니다.
바꾼 것
- PNG 압축 level 1 — 무손실은 그대로이고, 인코딩은 약 5배 빨라집니다. 대신 파일이 10% 정도 커집니다.
- 출력 병렬 저장 — 입력 1장당 출력 6장을
ThreadPoolExecutor(최대 8 스레드)로 동시에 저장합니다. PIL 인코더는 GIL을 놓기 때문에 코어 수만큼 빨라집니다. - 회전 경로 단순화 —
rotate(expand=True)후 중앙을 잘라내던 것을rotate(expand=False)한 번으로 바꿨습니다. 결과는 같고 비용은 절반입니다. - 로그 스로틀 — 파일마다 찍던 로그를 10건에 한 번으로 줄였습니다.
결과
| 항목 | v1.6.1 | v1.6.2 |
|---|---|---|
| 장당 처리 시간 | 약 4.3초 | 약 0.26초 |
| 출력 파일 크기 | 기준 | 약 +10% |
| 설정 파일 형식 | — | 변경 없음 |
회전 경계에서 0.003% 미만의 픽셀 차이가 생기지만 증강 품질에는 영향이 없습니다.