- 큰 이미지를 한 번에 처리하던 JPEG XL 인코딩의 병목을 libjxl 0.10이 스트리밍 인코딩 API로 줄이며, 무손실 압축의 메모리 사용량과 속도를 크게 개선함
- 13500×6750 NASA 야간 지구 이미지 무손실 인코딩은 libjxl 0.9의 약 8GB RAM·2분 이상에서 libjxl 0.10의 0.7GB RAM, 단일 스레드 30초, 8스레드 5초로 줄어듦
- 압축 방식 비교는 파일 크기만으로 부족하며, 인코딩 속도와 압축 밀도를 함께 보는 파레토 프론트가 시간 예산별 최적 설정을 가르는 기준이 됨
- 손실 압축은 압축률·속도·화질을 동시에 봐야 하며, SSIMULACRA2 60~90 범위에서 JPEG XL은 특히 고화질~시각적 무손실 영역에서 강한 결과를 보임
- jpegli 같은 새 JPEG 인코더도 매우 빠른 인코딩 구간에서는 여전히 경쟁력이 있지만, JPEG XL은 넓은 속도 범위에서 무손실·손실 압축 모두의 핵심 선택지로 자리 잡음
libjxl 0.10의 핵심 변화
- libjxl 0.10은 JPEG XL 참조 구현의 새 버전이며, 가장 큰 변화는 스트리밍 인코딩 API의 완전 구현임
- 이 API는 큰 이미지를 한 번에 처리하지 않고 청크 단위로 인코딩함
- 전체 이미지를 메모리에 올릴 때 생기는 RAM 부담이 줄어듦
- 인코딩 속도도 함께 개선됨
- 특히 큰 이미지의 무손실 압축에서 효과가 두드러짐
무손실 압축에서 줄어든 메모리와 시간
- libjxl 0.10 이전의 무손실 JPEG XL 인코딩은 큰 메모리와 긴 처리 시간이 문제가 될 수 있었음
- 예시 이미지는 NASA의 13500×6750 야간 지구 이미지임
- TIFF 파일은 64MB
- 압축 전 크기는 273MB
- 기본 effort 설정 e7에서 같은 이미지를 압축한 결과:
- libjxl 0.9는 약 8GB RAM을 사용하고 2분 이상 걸렸으며, 결과 파일은 33.7MB였음
- 단일 스레드는 2분 40초, 8스레드는 2분 6초로 스레드 증가 효과가 크지 않았음
- 측정 환경은 12코어 Apple M3 Pro CPU와 36GB RAM을 탑재한 2023년 11월 MacBook Pro임
- libjxl 0.10에서는 같은 이미지 압축에 0.7GB RAM만 필요함
- 단일 스레드 30초
- 8스레드 5초
- 결과 파일은 33.2MB
- effort 값을 높이면 압축률은 좋아지지만 CPU 시간 대비 개선 폭은 점점 줄어듦
- e1에서 e2로 가며 0.1초 대신 1초를 쓰면 22MB를 줄일 수 있었음
- e2에서 e7로 가며 1초 대신 5초를 쓰면 추가로 11MB를 줄였음
- e7에서 e9로 가며 1MB를 더 줄이려면 거의 2분을 기다려야 했음
effort 설정의 실용적 절충
- 압축 설정은 시간과 파일 크기 사이의 절충 문제임
- 이미지 편집 중 로컬에 저장하는 저작 워크플로에서는 강한 압축이 꼭 필요하지 않아 낮은 effort 인코딩이 합리적일 수 있음
- 일대다 전달 시나리오나 장기 보관에서는 CPU 시간을 더 써서 몇 MB를 줄이는 선택이 가치 있을 수 있음
파레토 프론트로 압축 방식 비교하기
- 압축 기법을 비교할 때 파일 크기만 보면 실제 선택에 필요한 정보를 놓치기 쉬움
-
비교 축과 차트 해석
- 핵심 축은 압축 밀도와 인코딩 속도임
- 어떤 방식이 파레토 최적이라는 것은, 같은 또는 더 나은 압축 밀도를 더 짧은 시간에 달성하는 다른 방식이 없다는 뜻임
- 파레토 최적 방식들의 집합이 파레토 프론트임
- 차트에서는 세로축이 인코딩 속도, 가로축이 압축된 이미지의 평균 bits per pixel임
- 세로축은 megapixels per second 단위이며, 폭넓은 속도 범위를 다루기 위해 로그 스케일을 사용함
- 압축 전 8비트 RGB는 24bpp임
- 위쪽일수록 빠르고, 왼쪽일수록 압축률이 좋음
무손실 압축 비교 결과
- 이전 libjxl도 모든 속도 범위에서 파레토 최적 결과를 냈고, PNG·무손실 AVIF·무손실 WebP보다 작은 파일을 만들었음
- libjxl 0.10은 이전 버전보다 상당한 차이로 더 나은 결과를 보임
- QOI는 차트에는 표시되지 않았지만, 154Mpx/s에서 17bpp를 기록함
- libjxl의 가장 낮은 effort 설정은 427Mpx/s에서 11.5bpp까지 압축함
- libjxl 쪽이 2.7배 빠르고 결과 파일은 32.5% 작았음
비사진 이미지에서의 무손실 압축
- 사진은 자연 노이즈가 많아 무손실 압축이 어려운 편이며, 비사진 이미지에서는 결과가 달라짐
- 다양한 그림체의 만화 이미지 41장을 사용한 테스트에서 평균 크기는 7.3메가픽셀이었음
- 이런 이미지는 약 4bpp까지 압축되어, 사진 이미지의 약 10bpp보다 훨씬 잘 압축됨
- 무손실 AVIF는 이 이미지 유형에서 유용하지 않았음
- PNG보다 압축률이 낮았음
- QOI와 비슷한 밀도에 도달했지만 훨씬 느렸음
- 무손실 WebP는 이런 이미지에서 매우 좋은 압축률을 보임
- QOI는 속도와 단순성을 고려하면 괜찮지만 파레토 최적과는 거리가 있음
- 낮은 effort의 JPEG XL 인코딩은 QOI보다 2배 빠르고 31% 작았음
- libjxl 0.10은 비사진 이미지에서도 0.9보다 크게 개선됨
- WebP 기본 effort는 4.30bpp, 2.3Mpx/s
- libjxl 0.9 effort 5는 4.27bpp, 2.6Mpx/s
- libjxl 0.10 effort 5는 4.25bpp, 12.2Mpx/s
- libjxl 0.10 effort 7은 4.04bpp, 5.9Mpx/s
손실 압축에는 화질 축이 추가됨
- 무손실 압축은 압축 크기와 속도만 보면 되지만, 손실 압축에는 화질이 추가됨
- 손실 이미지 코덱과 인코더는 품질 지점에 따라 성능이 달라질 수 있음
- 고화질 인코딩에서 좋은 인코더가 저화질에서도 좋다고 볼 수 없음
- 반대도 마찬가지임
- 압축률과 화질만 보는 bitrate-distortion 플롯은 인코딩 effort와 압축 성능 사이의 절충을 평가하기 어렵게 함
- 손실 압축의 파레토 프론트를 보려면 압축·속도·화질의 3차원 공간을 여러 품질 지점에서 잘라 봐야 함
화질 측정과 집계 방식
- 이미지 화질은 주관적이며 사람마다 다를 수 있음
- 가장 좋은 측정 방식은 수십 명 이상의 사람이 엄격한 테스트 프로토콜에 따라 이미지를 비교하거나 점수화하는 실험임
- 이런 실험은 시간과 비용이 많이 들어 모든 인코더 설정을 테스트하기 어렵기 때문에 객관 지표가 쓰임
- 공개 지표 중 좋은 지표로는 SSIMULACRA2, Butteraugli, DSSIM이 꼽힘
- 이들은 인간 시각 시스템을 모델링하려고 하며 주관 평가와의 상관이 좋음
- PSNR이나 SSIM 같은 오래된 단순 지표는 인간의 화질 판단과 잘 맞지 않음
- 인코더가 내부적으로 최적화하는 지표로 평가하면 결과가 해당 인코더에 유리하게 왜곡될 수 있음
- 고 effort libjxl은 Butteraugli를 최적화함
- libavif는 PSNR 또는 SSIM을 최적화할 수 있음
- SSIMULACRA2는 테스트된 인코더가 내부 최적화에 쓰지 않아 안전한 지표로 취급됨
- 테스트에서는 각 설정을 전체 이미지 집합에 적용했을 때 평균 SSIMULACRA2 점수가 특정 값에 가깝도록 인코더 설정을 선택함
- 평균 점수 정렬은 WebP와 AVIF에 유리한 방식임
- 이전 연구에서는 AVIF와 WebP가 JPEG·HEIC보다 일관성이 낮고, JPEG XL은 가장 일관적인 인코더였음
- 실사용에서는 최악의 점수 또는 실제 최악의 시각 품질을 맞추고 싶을 수 있음
실제 사용에 가까운 품질 범위
- 손실 압축은 50:1이나 200:1 같은 높은 압축률도 가능하지만, 압축 아티팩트가 생김
- 실제 사용에서 관련성이 큰 범위는 SSIMULACRA2 60~90임
- 품질 지점별 특성:
- SSIMULACRA2 90: 시각적 무손실 품질이며, AVIF와 JPEG XL 같은 현대 코덱은 약 8:1 압축률, 즉 3bpp로 도달할 수 있음
- SSIMULACRA2 80: 고화질이며, 약 16:1 압축률, 즉 1.5bpp로 도달할 수 있음
- SSIMULACRA2 70: 중상 품질이며, 약 30:1 압축률, 즉 0.8bpp로 도달할 수 있음
- SSIMULACRA2 60: 중간 품질이며, 약 40:1 압축률, 즉 0.6bpp로 도달할 수 있음
- SSIMULACRA2 60보다 낮은 품질은 대역폭을 더 줄일 수 있지만 이미지를 망칠 위험이 있음
- 2024년 웹에서는 중간~고화질 범위가 관련성이 큼
- HTTP Archive 기준 웹의 AVIF 중앙값은 1bpp로, 중상 품질에 해당함
- JPEG 중앙값은 2.1bpp로, 고화질에 해당함
- 카메라 같은 비웹 사용 사례에서는 고화질~시각적 무손실 범위가 더 관련 있음
손실 압축 파레토 프론트 결과
- 손실 압축 테스트는 2024년 2월 말 기준 각 인코더의 최신 버전으로 수행됨
- 인코딩 속도는 Apple M3 Pro 기반 2023년 11월 MacBook Pro에서 8스레드로 측정됨
- AVIF는 타일 설정과 비타일 설정을 모두 테스트함
- 타일 설정은 멀티스레딩 활용이 좋아 더 빠름
- 대신 압축 밀도 손실이 있음
중간 품질: SSIMULACRA2 60
- 같은 포맷 안에서도 인코더와 effort 설정에 따라 결과 차이가 컸음
- 역사적으로 널리 쓰인 JPEG 인코더인 libjpeg-turbo 기본 설정은 차트에서 가장 빠르지만 압축 밀도가 낮은 쪽에 위치함
- WebP는 libjpeg-turbo보다 압축 밀도가 좋았음
- mozjpeg는 libjpeg-turbo보다 느리지만 더 나은 압축 결과를 제공하며, 이 이미지 집합과 품질 지점에서는 WebP보다 파레토 효율적이었음
- Google의 JPEG XL 팀이 만든 jpegli는 mozjpeg보다 빠르고 압축률도 좋았음
- guetzli와 libjxl에서 얻은 교훈을 기반으로 함
- WebP와 고속 AVIF보다 더 잘 압축하면서도 기존 JPEG 파일을 생성함
- AVIF와 HEIC는 JPEG·WebP보다 나은 압축 밀도를 얻을 수 있지만 인코딩은 더 느렸음
- JPEG XL은 비슷한 압축 밀도에 도달하면서 훨씬 빠르게 인코딩함
- 이 품질 지점의 파레토 프론트는 합리적인 속도 구간에서는 JPEG XL과 여러 JPEG 인코더, 더 느린 구간에서는 AVIF로 구성됨
중상·고화질 결과
- SSIMULACRA2 70의 중상 품질에서는 전체 결과가 중간 품질과 비슷했음
- 웹에 관련된 가장 높은 품질 지점으로 평균 SSIMULACRA2 85를 사용했으며, 대부분의 이미지가 80 이상을 달성하도록 설정함
- 이 고화질 지점에서는 차이가 더 뚜렷해짐
- mozjpeg는 더 이상 WebP를 이기지 못했음
- jpegli는 여전히 WebP를 이겼음
- 파레토 프론트는 대부분 JPEG XL이 차지했음
- 매우 빠른 인코딩에서는 기존 JPEG가 여전히 좋았음
- 이 품질 지점에서 AVIF는 파레토 프론트에 없었음
- 가장 느린 설정에서 0.5Mpx/s 이하 속도로 두 번째로 빠른 libjxl 설정과 같은 압축 밀도를 맞췄음
- 해당 libjxl 설정은 52Mpx/s로 100배 이상 빨랐음
디코딩 속도
- 지금까지의 비교는 압축 밀도와 인코딩 속도 중심이었음
- 현대 컴퓨터에서 디코딩 속도는 큰 문제가 아니지만 측정값도 비교됨
- 순차 JPEG는 디코딩 속도에서 가장 강함
- mozjpeg와 기본 jpegli가 생성하는 프로그레시브 JPEG는 더 느리지만, 합리적인 크기의 이미지를 매우 빠르게 로드할 만큼 충분히 빠름
- JPEG XL은 순차 JPEG와 프로그레시브 JPEG 사이에 위치함
- AVIF의 디코딩 속도는 인코딩 방식에 따라 달라짐
- 더 빠르지만 약간 나쁜 멀티타일 인코딩을 사용하면 디코딩도 더 빠름
- 기본 싱글타일 인코딩은 더 느림
- 측정된 가장 느린 디코딩 속도도 인코딩 속도와 비교하면 충분히 빠른 편임
시각적 무손실과 큰 이미지
- 시각적 무손실 품질 차트에는 WebP가 포함되지 않았음
- 손실 모드에서 이 품질 지점에 도달할 수 없었음
- WebP는 4:2:0 크로마 서브샘플링이 의무적이기 때문임
- mozjpeg도 이 품질 지점에 맞게 설계되지 않아 libjpeg-turbo보다 압축과 속도 모두 나빴음
- 기본 속도 설정에서 libavif는 libjpeg-turbo보다 20% 작았지만 인코딩에는 한 자릿수 더 긴 시간이 걸렸음
- 같은 품질 지점에서 libjxl은 libavif보다 20% 작고 2.5배 빨랐음
- 시각적 무손실 품질의 파레토 프론트는 대부분 JPEG XL이 차지했으며, 가장 빠른 속도 구간에는 JPEG도 포함됨
- 웹 크기 이미지 약 1메가픽셀 테스트와 달리, 더 큰 이미지 테스트에서는 결과가 크게 달라짐
- 고화질 지점에서 WebP, mozjpeg, AVIF는 libjpeg-turbo보다 나빴음
- HEIC는 libjpeg-turbo 대비 상당한 절감을 제공함
- jpegli도 더 나은 속도로 상당한 절감을 제공함
- JPEG XL은 이미지를 1.3bpp 미만으로 압축했고, AVIF·libjpeg-turbo·WebP는 2bpp 이상이 필요했음
libjxl 0.10의 최종 위치
- libjxl 0.10은 무손실·손실 압축 모두에서 메모리 사용량을 한 자릿수 규모로 줄임
- 속도도 개선됐으며, 특히 멀티스레드 무손실 인코딩의 기본 effort 설정은 한 자릿수 규모로 빨라짐
- JPEG XL은 무손실과 손실 압축 모두에서, 특히 고화질~시각적 무손실 품질 범위에서 강한 이미지 코덱으로 정리됨
- 넓은 속도 설정 범위에서 JPEG XL은 파레토 최적에 가까운 선택지로 남아 있음
- 기존 JPEG도 새 인코더 덕분에 여전히 매력적임
- jpegli는 mozjpeg보다 속도와 압축 모두에서 크게 개선됨
- 극도로 빠른 인코딩이 필요할 때 기존 JPEG는 여전히 최선의 선택일 수 있음