# Self-Transfer Learning 을 통한 동영상 Super Resolution
## Abstract
기존의 동영상 Super Resolution 연구는 프레임 단위로 영상을 분할 한 뒤 각 프레임에 대해 Image Super Resolution 을 수행하고, SR 된 프레임을 다시 영상으로 합치는 방법을 주로 사용하였다. 인접한 프레임에 대한 초해상화 결과의 차이가 크다면 영상이 부자연스럽게 보일 수 있기 때문에 이를 개선하기 위해 인접한 5-7 프레임 가량을 RNN 등의 인공신경망을 통해 학습하여 초해상화에 사용하는 기법은 연구되어 왔으나, 인접하지 않은 한 동영상 내의 다른 프레임을 영상의 초해상화에 사용하는 연구는 이루어지지 않았다.
본 프로젝트는 하나의 영상은 하나의 주제에 대한 영상이며 그 안에서 다수의 중복된 장면이 확대되어 여러번 나타난다는 관찰에서 출발하여, 이러한 중복된 프레임이 영상의 초해상화에 사용될 수 있음을 입증하는 것을 목표로 한다.
## Project Process
### GPU
동영상을 소스로 사용하는 머신러닝 프로젝트 특성상 성능 좋은 GPU가 필요하다.
본 프로젝트를 진행하면서 우리들은 GPU 사용 문제를 다음과 같이 해결했다.
- 개인적으로 가지고 있는 GPU 사용.
- GCP (Google Cloud Platform)에서 GPU 할당 요청 후 사용.
### Requirements
- Python 3
- PyTorch (0.4.0), torchvision
- Numpy, Scipy
- Pillow, Scikit-image
- h5py
- importlib
- ffmpeg
### Project Scenario
본 프로젝트에선 성능이 뛰어나고 경량화가 잘되었다고 평가받는 [CARN 모델](https://github.com/nmhkahn/CARN-pytorch)을 사용한다.
우선 초해상화를 진행할 동영상을 대상으로 frame을 추출한다.
```
ffmpeg -i [추출한 동영상 파일 이름].mp4
-vf "select=eq(pict_type\,I),scale=1280:720" // scale을 해당 영상의 크기에 맞춰, keyframe으로 추출
-vsync 0 [추출한 frame 저장할 디렉토리]/%06d.png
```
추출한 frame들로 dataset을 구성한다.
```
from glob import glob
import cv2
images = sorted(glob("./[추출한 frame 저장할 디렉토리]/*.png"))