R&D
CENTER

병목은 PNG 인코더였다 — 증강 속도 16배 개선기

증강 시간의 90% 이상이 PIL PNG 인코더에서 쓰이고 있었습니다. 압축 레벨 하나와 병렬 저장으로 장당 4.3초를 0.26초로 줄였습니다.

Image Processing Tool의 기본 증강(Factor 5, Random ±5°)을 2448×2048 PNG에 돌리면 장당 약 4.3초가 걸렸습니다. 학습 데이터 수천 장을 준비하는 데 몇 시간이 걸린다는 뜻입니다.

어디서 시간이 새고 있었나

프로파일링해 보니 회전이나 정렬이 아니라 저장이 병목이었습니다. 실행 시간의 90% 이상이 PIL의 PNG 인코더(기본 압축 level 6)에서 쓰이고 있었습니다.

바꾼 것

  1. PNG 압축 level 1 — 무손실은 그대로이고, 인코딩은 약 5배 빨라집니다. 대신 파일이 10% 정도 커집니다.
  2. 출력 병렬 저장 — 입력 1장당 출력 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% 미만의 픽셀 차이가 생기지만 증강 품질에는 영향이 없습니다.