waifu2x를 통해 2d 이미지를 퀄리티 좋게 확대하는것이 가능해졌습니다. 그리고 waifu2x-caffe를 사용하면 cuda나 cudnn 가속을 사용할 수 있고요.. 예전에 이 방법을 통해서 리듬게임 bga 영상을 고화질으로 몇번 만들어 봤었는데 간단하게 방법을 소개해 보도록 하겠습니다.
작업순서는 다음과 같습니다.
1. ffmpeg로 동영상을 이미지 시퀀스화
2. 이미지 시퀀스화된 이미지를 waifu2x-caffe로 확대
3. 확대된 이미지를 ffmpeg로 연결(+인코딩) [+ 소리와 합침]
*반드시 64bit OS가 필요하며(waifu2x-caffe가 32bit OS를 미지원 함), 영상은 프레임 수가 엄청나게 많으므로 cuda(cudnn) 가속을 사용하는 것이 좋습니다.
필요한 프로그램은 waifu2x-caffe, ffmpeg 입니다.
waifu2x-caffe https://github.com/lltcggie/waifu2x-caffe/releases
ffmpeg windows 빌드
*8비트 인코딩 (64bit static을 받아서 압축해제) https://ffmpeg.zeranoe.com/builds/
*10비트 인코딩용 빌드 (가장 최근 날짜 폴더의 파일명이 static 64bit high bit depth로 된 zip를 받음) https://sourceforge.net/projects/ffmpegwindowsbi/files/?source=navbar
우선 영상을 선정합니다. 영상은 되도록 640x360 이상인게 좋으며, 거의 어지간해서는 크기 2배를 할 때가 가장 보기가 좋습니다. 그리고 크기를 2배 이상으로 설정할 경우 2배 확대했던 이미지를 다시 그대로 2배 확대하는 방식으로 이미지가 만들어 집니다.
그리고 영상의 종류는 실사, 3d 폴리곤 형태인 경우 정말 하나마나이므로 추천하지 않습니다. waifu2x-caffe의 특성 상 애니메이션 계열이 가장 효과가 좋습니다.
1. ffmpeg로 동영상을 이미지 시퀀스화
우선 ffmpeg를 압축 해제 하시면 ff-prompt.bat 파일이 있습니다. 실행하면 검은 cmd 창이 하나 나오는데, 명령어를 다음과 같이 입력합니다.
ffmpeg -i 원본영상.확장자 -q:v 0 대상폴더\images%05d.jpg
예시 : 파일이름이 name.mp4인 영상을 D:\upscale에 저장
ffmpeg -i name.mp4 -q:v 0 D:\upscale%05d.jpg
*저장할때 손실 포맷인 jpg를 사용하는 이유는 거의 대부분의 영상이 yuv포맷(4:2:0)으로 저장되어 있기 때문입니다. png는 yuv포맷으로 저장이 불가능하여 rgb로 이미지가 저장되는데, 저장시에 yuv→rgb로 변환이 되면서 화질 손실이 발생합니다.
그리고 위와 같이 변환 후 보여지는 창에 Stream #0.0 video로 시작하는 문구가 있습니다.
Stream #0:0: Video: h264 (High 10), yuv420p10le, 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
그중에 fps를 잘 메모해 놓으시면 됩니다.
변환된 이미지 목록을 확인하면 이런 식으로 나오게 됩니다.
2. 이미지 시퀀스화된 이미지를 waifu2x-caffe로 확대
그리고 변환한 이미지를 waifu2x-caffe로 돌립니다. 여기서도 jpg로 설정 후 출력 화질은 100 으로 설정합니다. 만일 영상이 bd 미디어 등에서 립을 뜬 파일인 경우 노이즈 제거 단계를 1단계나 0단계로 설정 하시는게 좋습니다.
노이즈 제거 단계를 높이게 되면 애니메이션의 경우 셀화의 디테일한 부분이 사라질 가능성이 높으며 뭔가 뭉개진듯한 느낌을 받을 수 있습니다.
확대 비율은 2로 설정합니다.
모델의 경우 UpRGB와 UpPhoto 이 둘중에 하나만 쓰면 되는데, 저는 설명에 적혀있는 데로 영상을 변환하는 것이므로 UpPhoto 모델을 사용합니다. 이 역시 뭔가 디테일한 면이 사라진다고 해야되나..
TTA 모드는 속도가 8분의 1으로 줄어들으므로 체크 안하시는것을 추천합니다. 화질이 조금 더 개선되는 효과가 있다고는 하는데 너무 오래 걸려서...
분할 크기는 칸에 입력도 가능합니다. pc와 이미지에 따라 팅기지 않는 최적의 수치를 찾아서 설정 후 돌리시는것을 추천합니다. 크기를 크게 할 수록 VRAM을 많이 사용하게 됩니다.
*추가 : 나중에 안 사실이지만... 분할 크기를 무작정 크게 늘린다고 빨라지지는 않습니다. 이미지의 크기에 따른 최적의 크기를 먼저 찾은 후에 돌리시는 것을 추천합니다. 세로프레임 길이의 2분의 1을 하는게 가장 나은듯 하네요.
3. 확대된 이미지를 ffmpeg로 연결(+인코딩) [+ 소리와 합침]
사실 이 부분은 인코딩을 어떻게 할 것인가에 따라 속도가 천차만별으로 변합니다. 그러나 여기에서는 프리셋과 인코딩 하는 방법의 설명은 생략하며, 기본적인 이미지 +소리 → 동영상 에 대해서만 설명 하겠습니다.
이전에 실행했던 ffprompt.bat를 실행합니다.
*기본적인 x264를 사용하는 명령어입니다.
ffmpeg -framerate 23.98 -i images%05d.jpg -i 원본영상파일명.확장자 -c:v libx264 -preset slow -crf 19 -pix_fmt yuv420p -c:a copy 저장할파일.확장자
-framerate 23.98 : 위에서 메모해야 했던 fps 입니다. fps가 일치하지 않으면 영상 싱크가 맞지 않으니 반드시 확인 후 인코딩을 실행하세요.
원본영상파일.확장자 : 원본 영상의 소리를 가져오기 위해서 추가합니다. 뒤에 -c:a copy (오디오 트랙 복사)와 맞물려 있습니다. 저장할때 사운드 코덱 변경도 가능하지만 여기에서는 생략합니다.
crf 19 : 0에 가까울수록 화질이 좋아지며 용량이 커집니다. 보통 화질의 기준은 24이며 0-51으로 설정이 가능합니다. 22~23만 되어도 충분히 좋은 화질이 나옵니다. (저는 19를 사용함) 16~24 사이에서 설정을 추천 합니다.
x265 인코딩을 하려면 -c:v를 libx265로 설정 하면 됩니다.
x265 10bpp 인코딩 시에는 위에서 10비트용 ffmpeg를 받아 실행해야 하며, -c:v를 libx265로, -pix_fmt를 yuv420p10le로 바꾸면 됩니다. 10비트 cpu 인코딩은 속도가 매우 느리므로 참고 바랍니다.
만일 nvenc를 사용하여 gpu 인코딩을 하고싶은 경우, -c:v 부분을 nvenc_h264 또는 nvenc_hevc 를 사용 하시면 됩니다.
*nvenc를 사용하면 -crf 수치를 적용할 수 없어 -crf를 지우고 -b:v 비트레이트(50M, 50000K 등)를 입력해야 합니다. 또한 같은 비트레이트일 경우 cpu로 하는 인코딩에 비해서 화질이 약간 떨어지는 경향이 있으므로 비트레이트 자체를 높게 주는것이 좋습니다.
*파스칼은 hevc main10 하드웨어 인코딩이 가능한데, 직접 해보지 못해서 어떤 명령어를 써야하는지 잘 모르겠네요..;
퀵싱크를 이용해서 인코딩을 할 경우에는 -c:v 부분을 h264_qsv 나 hevc_qsv로 하면 될것 같습니다. 이부분도 역시 직접 해보지 못한거라 잘 모르겠습니다.
그외의 특정 애니릴 같은 경우는 캡션이나 mkv 내장자막 같은 항목들이 있는데, megui에 내장된 툴을 사용하면 쉽게 가져올 수 있으며 이부분의 설명 역시 생략합니다.
이렇게 까지만 하면 끝입니다.
그나저나.. 명령어를 ffmpeg 내에서 알아낼려고 help를 몇번 쳐 봤는데 도움이 전혀 되지 않아서 검색 하느라 조금 오래 걸렸네요... 특히 파스칼 main10 인코딩은 검색 아무리 해도 나오지가 않아서.. 아직 1060이 없어서 해볼 수도 없고..