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 | +``` | ... | ... |
-
Please register or login to post a comment