2022. 12. 31. 21:29ㆍProject/Panorama-Converter
이전에 작성한 글과 연관되어 있습니다.
https://hopedevelopment.tistory.com/75
SinGAN
공부하다 정리하기 위하여 적은 것이므로 잘못된 것이 있으면 알려주세요:) SinGAN이란 SinGAN이란 2019년에 나온 논문으로 Single Image GAN을 줄였다고 한다. 일반적으로 GAN은 대량의 training set을 이용
hopedevelopment.tistory.com
SinGAN은 하나의 이미지를 이용하여 학습을 하고 이를 통하여 자연스러운 Panorama 이미지를 생성할 수 있다.
이러한 기술을 다른 사람이 사용하기 쉽게 웹을 이용하여 사용하게 하고 싶어 시작하게 되었다.
일단 SinGAN의 Github를 보니 Pytorch를 이용하여 작성되었다.
평소에 딥러닝을 하기 위해서 Pytorch를 이용하였기에 매우 다행스러웠다.
하지만 처음에 SinGAN을 이용하려니 문제가 생겼다. 나의 데스크톱에는 Pytorch가 1.12 버전으로 본래 Github에서 필요로 하는 Pytorch의 버전과는 달라 연산 중 충돌이 일어났고 이로 인해 본래 Github에 있던 코드들을 활용하지 못한다는 점을 알게 되었다. (약간은 안일하였다.)

찾아보니 본래 Github에도 최신 버전은 다른 사람 repository에 있는 코드를 이용해 보라고 나와있었다..(이런..)
나에게 두가지 선택지가 있었다. Pytorch의 버전을 낮추거나 다른 코드를 사용하거나!
결론부터 말하자면 지금은 Pytorch의 버전을 낮췄다! 하지만 처음에는 kligvasser의 코드를 사용하였다.
kligvasser의 코드를 사용하여 학습을 한 경우 Train은 잘 되었지만 내가 원하는 Random samples of arbitrary sizes 모드를 사용할 수가 없었다. 그리하여 Pytorch 버전을 낮추기로 결정했다.
Pytorch 버전을 낮추기 위해서는 여러 방법이 있는 데 나는 anaconda를 이용해서 Pytorch를 1.4에 맞추었다. Pytorch 1.4는 Python의 버전에도 영향을 끼치는 데 3.8 이하로 맞추어야 한다.
Panorama 만드는 과정
SinGAN을 이용하여 Panorama를 만들기 위해서는 아래의 과정을 거친다.
1. 하나의 이미지를 학습한다.
2. 학습한 이미지를 Random samples of arbitrary sizes모드를 이용하여 원하는 비율로 새로운 이미지 생성한다.
3. 새롭게 생성된 이미지를 Resize하여 원하는 Size의 파노라마 이미지를 얻는다.
일단은 SinGAN을 사용해 보자! (일단 웹 서비스에 적용하기 위해서 이것저것 만져보느라 코드도 약간 이해하고 수정도 해보기는 했다...ㅎ 이미 내가 했으니 다른 사람은 안 하는 것을 추천한다.)
Train
python main_train.py --input_dir <input_dir> --input_name <input_file_name>
input_dir 부분에 자신이 train할 이미지가 있는 directory의 path를 넣어주고 <input_file_name>에 file명을 입력하면 된다.
그러면 Train이 시작된다. out이라는 option이 있는데 이것을 이용하면 학습 후 결과 디렉토리를 바꿀수 있다. Default로는 Output이다. 그리고 하위 디렉토리는 RandomSamples로 고정이다. (물론 바꿀 수 있다.)
다른 Option들은 옵션를 확인하면 알 수 있다.
추가적으로 min_size는 downsample된 이미지중 첫 scale의 이미지의 가로와 세로 중 작은 값(단위는 pixel)이고 max_size는 downsample된 이미지중 마지막 scale의 이미지의 가로, 세로 중 가장 큰 값을 의미한다.(실제로 학습마다 이미지가 생성되는 데 그 것들의 사이즈를 보면 확인할 수 있다.) default로는 min_size는 25, max_size는 250이다. 나는 gpu의 메모리로 인하여 max_size를 200으로 진행하였다. scale을 결정할 때, min_size와 max_size도 영향을 준다.(참고)
patch는 11 x 11이 default인데 커널 사이즈, layer 수, stride가 영향을 미친다.(참고, 근거 : 논문 4 페이지, Training 부분 중 Adversarial loss 설명 마지막에 나온다.)
마지막으로 niter이란 옵션은 scale당 학습을 몇번 할 건지에 대한 옵션인데 default는 2000이다.
만약 scale이 7이고 niter이 2,000이면 최종적으로 7 x 2,000 = 14,000번 학습한다고 보면 된다.
Random samples of arbitrary sizes
새로운 사이즈의 이미지를 만들기 위해서는 Random samples of arbitrary sizes 모드를 사용하면 된다.
python random_samples.py --input_dir <input_dir> --input_name <training_image_file_name> --mode random_samples_arbitrary_sizes --scale_h <horizontal scaling factor> --scale_v <vertical scaling factor>
<horizontal scaling factor>에는 수평 방향의 비율을 <vertical scaling factor>에는 수직 방향의 비율을 넣어주면 된다.
default는 각각 1.5, 1로 되어있다.
실험으로 이미지는 SinGAN의 Github에 있던 mountains을 사용하였고 여러 차례를 진행하였다.
처음에는 horizontal scaling factor과 vertical scaling factor을 default로 하고 새로운 이미지를 만들어 보았고 나머지 하나는 horizontal scaling factor와 vertical scaling factor를 각각 7, 3로 지정하고 생성해 보았다. (처음에는 그냥 비율 정하는 거구나 정도로만 생각했는데 아니었다...)



(지금 보아도 해괴하다....)
이를 통하여 세로를 늘릴 예정이 아니라면 vertical scaling factor를 1로 추천한다...
기본적인 SinGAN의 작동법 및 나의 여정을 소개하였다.
추후로 다른 실험 과정 및 결과들도 올릴 예정이며 웹 서비스를 하기 위한 여정도 적을 예정이다.