hanbin9775

First project readme commit

Showing 1 changed file with 116 additions and 0 deletions
1 +# Self-Transfer Learning 을 통한 동영상 Super Resolution
2 +
3 +## Abstract
4 +
5 +기존의 동영상 Super Resolution 연구는 프레임 단위로 영상을 분할 한 뒤 각 프레임에 대해 Image Super Resolution 을 수행하고, SR 된 프레임을 다시 영상으로 합치는 방법을 주로 사용하였다. 인접한 프레임에 대한 초해상화 결과의 차이가 크다면 영상이 부자연스럽게 보일 수 있기 때문에 이를 개선하기 위해 인접한 5-7 프레임 가량을 RNN 등의 인공신경망을 통해 학습하여 초해상화에 사용하는 기법은 연구되어 왔으나, 인접하지 않은 한 동영상 내의 다른 프레임을 영상의 초해상화에 사용하는 연구는 이루어지지 않았다.
6 +본 프로젝트는 하나의 영상은 하나의 주제에 대한 영상이며 그 안에서 다수의 중복된 장면이 확대되어 여러번 나타난다는 관찰에서 출발하여, 이러한 중복된 프레임이 영상의 초해상화에 사용될 수 있음을 입증하는 것을 목표로 한다.
7 +
8 +## Project Process
9 +
10 +### GPU
11 +
12 +동영상을 소스로 사용하는 머신러닝 프로젝트 특성상 성능 좋은 GPU가 필요하다.
13 +본 프로젝트를 진행하면서 우리들은 GPU 사용 문제를 다음과 같이 해결했다.
14 +
15 +- 개인적으로 가지고 있는 GPU 사용.
16 +- GCP (Google Cloud Platform)에서 GPU 할당 요청 후 사용.
17 +
18 +### Requirements
19 +
20 +- Python 3
21 +- PyTorch (0.4.0), torchvision
22 +- Numpy, Scipy
23 +- Pillow, Scikit-image
24 +- h5py
25 +- importlib
26 +- ffmpeg
27 +
28 +### Project Scenario
29 +
30 +본 프로젝트에선 성능이 뛰어나고 경량화가 잘되었다고 평가받는 [CARN 모델](https://github.com/nmhkahn/CARN-pytorch)을 사용한다.
31 +
32 +우선 초해상화를 진행할 동영상을 대상으로 frame을 추출한다.
33 +
34 +```
35 +ffmpeg -i [추출한 동영상 파일 이름].mp4
36 + -vf "select=eq(pict_type\,I),scale=1280:720" // scale을 해당 영상의 크기에 맞춰, keyframe으로 추출
37 + -vsync 0 [추출한 frame 저장할 디렉토리]/%06d.png
38 +```
39 +
40 +추출한 frame들로 dataset을 구성한다.
41 +
42 +```
43 +from glob import glob
44 +import cv2
45 +
46 +images = sorted(glob("./[추출한 frame 저장할 디렉토리]/*.png"))
47 +```
48 +
49 +dataset 디렉토리를 만들어주고
50 +
51 +```
52 +from pathlib import Path
53 +Path("./dataset/DIV2K/DIV2K_train_HR").mkdir(parents=True, exist_ok=True)
54 +Path("./dataset/DIV2K/DIV2K_train_LR_bicubic/X2").mkdir(parents=True, exist_ok=True)
55 +```
56 +
57 +추출한 frame들을 decrease size해서 dataset으로 구성한다.
58 +
59 +```
60 +from tqdm import tqdm
61 +for image in tqdm(images):
62 + hr = cv2.imread(image, cv2.IMREAD_COLOR)
63 + lr = cv2.resize(hr, dsize=(640, 360), interpolation=cv2.INTER_CUBIC)
64 +
65 + cv2.imwrite("./dataset/DIV2K/DIV2K_train_HR/" + Path(image).name, hr)
66 + cv2.imwrite("./dataset/DIV2K/DIV2K_train_LR_bicubic/X2/" + Path(image).stem + "x2.png", lr)
67 +```
68 +
69 +그 후 div2h5.py 실행
70 +
71 +```
72 +import os
73 +import glob
74 +import h5py
75 +import scipy.misc as misc
76 +import numpy as np
77 +
78 +dataset_dir = "DIV2K/"
79 +dataset_type = "train"
80 +
81 +f = h5py.File("DIV2K_{}.h5".format(dataset_type), "w")
82 +dt = h5py.special_dtype(vlen=np.dtype('uint8'))
83 +
84 +for subdir in ["HR", "X2"]:
85 + if subdir in ["HR"]:
86 + im_paths = glob.glob(os.path.join(dataset_dir,
87 + "DIV2K_{}_HR".format(dataset_type),
88 + "*.png"))
89 +
90 + else:
91 + im_paths = glob.glob(os.path.join(dataset_dir,
92 + "DIV2K_{}_LR_bicubic".format(dataset_type),
93 + subdir, "*.png"))
94 + im_paths.sort()
95 + grp = f.create_group(subdir)
96 +
97 + for i, path in enumerate(im_paths):
98 + im = misc.imread(path)
99 + print(path)
100 + grp.create_dataset(str(i), data=im)
101 +
102 +```
103 +
104 +다음과 같이 구성된 dataset 을 가지고 carn-m 모델로 동영상의 초해상화를 진행한다.
105 +
106 +```
107 +!python carn/train.py --patch_size 64
108 + --batch_size 64
109 + --max_steps 600000
110 + --decay 400000
111 + --model carn_m
112 + --ckpt_name [체크포인트 이름]
113 + --ckpt_dir [체크포인트 디렉토리]
114 + --scale 2
115 + --group 4
116 +```
......