Perceptual Video Quality Metric
좋은 Perceptual Video Quality Metric을 갖는 것은 중요하다.
넷플릭스에서 내보내는 영화나 드라마의 영상 화질(Video Quality)이 어떤지를 넷플릭스는 알아야 한다. 비디오 화질이 안 좋다면 화질개선조치를 취해야 한다. 비디오 화질이 지나치게 좋다면, 시청자들은 어차피 차이를 알아차리지도 못한다면, 애먼 데 돈 쓸 것 없다. 화질을 낮추고 비용을 아껴야 한다. 이런 결정은 실시간으로 내려져야 한다. 넷플릭스 사용자가 콘텐츠를 시청하는 동안 뒤로는 이러한 의사결정이 매 초마다 일어난다.
줌도 마찬가지다. 줌 사용자가 영상통화를 하는 내내 영상 화질을 측정해 실시간으로 화질 조정 조치를 취해야 한다. 넷플릭스와 줌의 한 가지 차이는 있다. 넷플릭스의 경우 실어 날아야 할 콘텐츠의 내용이 미리 정해져 있고 줌의 경우 그렇지 않다는 것이다. 영상통화의 내용이 미리 정해져 있지 않기 때문이다. 콘텐츠의 내용이 정해져 있는 쪽이 유리하다. 한 가지 정보라도 더 알고 있는 쪽이 서비스 품질과 비용을 최적화하는데 유리하다.
영상 화질이 좋은지 나쁜지를 알려주는 영상 화질 지표(Video Quality Metric)라는 것이 오래전부터 있어 왔다. 가장 간단하고 많이 쓰이는 것은 PSNR이다. 비디오는 이미지 여러 장을 빠르게 재생해서 보여주는 것이고, 이미지는 점(픽셀) 여러 개가 모여 만들어진 것이다. 픽셀의 값은 3개의 숫자(RGB, YUV 등)으로 결정이 된다. RGB를 예로 들면 Red의 세기를 나타내는 0에서 255 사이 숫자 하나, Green의 세기를 나타내는 마찬가지 숫자 하나, Blue의 세기를 나타내는 숫자 하나, 해서 총 3개의 숫자가 픽셀 하나가 낼 색을 결정하는 것이다. PSNR은 영상 화면의 각 픽셀 숫자들을 단순 비교하는 방법이다.
넷플릭스가 송신하고자 하는 고화질 영상이 있고 넷플릭스 유저가 실제 수신하는 영상이 있다. 둘의 품질은 여러 가지 이유로 차이가 난다. 지역 기반시설 낙후 정도에 따라 애초에 고화질 영상을 송신할 수 없는 경우도 있고, 영상이 전달되는 과정에서 인터넷 상태 불량으로 배송사고가 나는 경우가 있고, 보내오는 영상이 어떻든 영상을 받는 기계가 고화질을 감당할 수 없는 경우도 있다. 고화질 송신 영상과 실제 수신 영상의 품질 차이를 알기 위해 PSNR을 이용할 수 있다. 두 영상 사이 픽셀값들이 얼마나 차이가 나는지 계산해 보는 것이다.
영상이 사실은 그저 숫자 덩어리로 이뤄진 정보에 불과함을 아는 사람에게, 회사가 영상 하나를 던져주며 원본에 비해 얼마나 훼손되는지 평가할 방법을 생각해 내라고 시켰다면, 누구나 PSNR 비슷한 지표를 먼저 만들지 않았을까. 그러나 이 직관적인 지표 PSNR은 현실에서 잘 작동하지 않는 편이다. 아래는 PSNR의 한계를 보여주는 유명한 예시다.
Wang, Zhou, et al. "Image quality assessment: from error visibility to structural similarity." IEEE transactions on image processing 13.4 (2004): 600-612.
GT는 원본 사진이며 나머지 다섯 장은 모두 원본을 변형한 사진이다. 다섯 개 변형본들은 모두 같은 PSNR값을 가진다. PSNR값이 다 같다고 하기에 사람이 인식하는 다섯 개 변형본들의 화질은 놀라우리만치 다르다. 원본보다 나은 변형본도 있고 원본보다 훨씬 못한 변형본도 있다.
PSNR의 한계가 드러난 이후로 단순 픽셀값 비교가 아닌 사람의 인식을 반영한 지각 기반 영상 화질 지표(Perceptual Video Quality Metric)를 찾기 위한 많은 노력이 이어졌다. 피크는 지났으나 아직까지도 연구가 이어지고 있는 분야다. 지금껏 만들어진 것들 중에 가장 유명하고 유용하게 쓰이는 지표는 *두 가지다. 10년 전쯤 넷플릭스에서 만들어 공개한 VMAF[1]가 하나, 그로부터 2년 후 UC버클리와 openAI, Adove Research 연구원들이 합작 개발해 공개한 LPIPS[2]가 다른 하나다. LPIPS는 완벽한 딥러닝 모델임에 반해 VMAF는 사실 전통적인 통계 모델에 가깝다. VMAF는 기존에 흔히 쓰이던 이미지 평가 지표(image quality metrics)들과 모션 지표들을 엄선해서 넷플릭스 자체 train, test 데이터에 맞게 SVM regression 모델을 최적화시킨 것이다. 그럼에도 아직도 웬만한 인공지능 모델과 어깨를 견준다. 인공지능 모델이니 기계학습 모델이니 쓸데없이 멋 부리지 않고 가장 확실한 실리를 택한 느낌이다.
엄밀히 말하자면 VMAF도 LPIPS도 인식 기반 '영상' 화질 지표(Perceptual 'Video' Quality Metric)는 아니다. '이미지' 화질 지표(Perceptual 'Image' Quality Metric)다. 이 둘을 '영상' 화질 지표로 사용하자면 영상을 구성하는 이미지들에 대고 VMAF, LPIPS값을 하나하나 계산한 후 합계를 낸다. 통상 평균을 구한다. 이런 방식에는 단점이 있다. 이미지들 사이의 관계를 반영하지 못한다는 점이다. 격렬한 액션무비는 이미지가 넘어갈 때마다 변화가 많을 것이고 데스크에 앉은 뉴스 앵커가 프롬프터를 읽는 영상은 모든 이미지가 비슷할 터다. 이미지 화질 지표로는 이 차이를 담아낼 수 없다. 이런 이유로 여러 인식 기반 '영상' 화질 지표들이 개발되어 왔지만 VMAF와 LPIPS를 뛰어넘는 모델은 생각보다 많지 않다.
어느 비디오 관련 업무에서든 사용자들이 영상의 화질을 어떻게 받아들이는지, 좋다 느끼는지, 안 좋다 느끼는지, 아는 것은 중요하다. 내가 일하는 중에는 지각 기반 영상 화질 지표를 자체 개발도 해보고, 외주도 줘보고, 학계에 나와 있는 좋다 하는 모델들도 여럿 가져다 써봤다. 모든 경우에 VMAF와 LPIPS가 언제나 탑이었던 것은 아니지만 꾸준히 준수한 퍼포먼스를 보였다. 그러므로 누구든 영상 화질을 평가해야 할 상황에 있는 이가 있다면 한번 사용해 보길 권한다. 자체 모델을 개발한다면 벤치마크로서의 사용 가치도 크다.
실무자들을 위한 팁 몇 가지:
1. VMAF도 LPIPS도 'Full Reference' 화질 지표다. 즉, 원본(Original/Reference) 영상이 있고 훼손(Contaminated) 영상이 있어서 둘 사이의 거리를 재주는 식으로 화질을 평가하는 것이다. 대응되는 원본 영상 없이, 그저 주어진 하나의 영상에 대한 화질을 평가하는 'No Reference' 화질 지표를 가지고는 일해본 지가 오래돼 현재로서는 아는 바가 별로 없다. No Reference 지표가 필요한 경우라면 괜히 VMAF를 가지고 힘 빼지 마시길.
2. VMAF를 돌리기 위한 준비물은 세 가지다. ffmpeg, reference 영상, treatment 영상. 영상은 yuv, mp4 파일 모두 가능하다. ffmpeg은 다음의 링크에서 https://www.gyan.dev/ffmpeg/builds/ 최신 full 버전을 다운로드하면 된다. ffmpeg를 가지고서 vmaf를 돌리는 방법은 chatGPT나 copilot에 물어보면 된다. 굳이 유료버전이 아니라도 이 정도 대답은 해줄 것이다. 나도 ffmpeg command를 외우지 못해서 번번이 물어보며 쓴다. Give me an ffmpeg command line to run vmaf for referernce.mp4 and treatment.mp4. 혹시 에러가 나거든 에러 메시지를 복사해다 붙여놓고 다시 한번 물어본다. The ffmpeg command line above gave me the following error. How can I fix this?
[1] https://netflixtechblog.com/toward-a-practical-perceptual-video-quality-metric-653f208b9652
[2] Zhang, Richard, et al. "The unreasonable effectiveness of deep features as a perceptual metric." Proceedings of the IEEE conference on computer vision and pattern recognition. 2018.