19.05.20의 세미나 기록_
발표하는 날은 너무 피곤하다.....
Gan(Generative Adverserial Network)의 종류 중 하나인 pix2pix의 코드를 train 시키고 변형하여 test 중인데 그 과정을 기록하고 오늘 세미나에서 발표를 하였습니다.
발표준비를 하는 과정에서 해야할 것들과 그것들의 해결방안을 나열하는 식으로 공부하고 준비하였습니다.
-스케치와 실제이미지를 넣어서 G가 실제이미지를 만들어내는 것을 train한 것을 test 해보기
Val의 데이터를 가져와서 test함 그럼 test 폴더는 어떻게 되는걸까??(아직 의문)
-G가 어떤 것을 기반으로(latent code 삼아서) 색과 모양을 뽑아내는지 원리 이해하기
->코드를 살펴보면 train 을 시작하면 train 폴더(400장)에서 이미지를 가져와서
# Update D network
|
D network ,G network를 업데이트 해주고
batch_images 가 pair 데이터가 들어간다.
if np.mod(counter, 100) == 1: self.sample_model(args.sample_dir, epoch, idx) |
100번마다 sample_model( )을 실행해주고 있다.
def sample_model(self, sample_dir, epoch, idx): sample_images = self.load_random_samples() samples, d_loss, g_loss = self.sess.run( [self.fake_B_sample, self.d_loss, self.g_loss], feed_dict={self.real_data: sample_images} |
sample_model( )을 살펴보면
load_random_samples( )함수를 통해 val 폴더에서 이미지를 가져오고 fake_B_sample( generator와 같은 역할을 하는 sampler를 통과한 것_실제이미지를 넣어줘서 generator가 만들어 낸 스케치이미지)와 d_loss, g_loss를 함께 넣어서 run해준다.
즉 train시 sample폴더에 출력되는 스케치 이미지는 train폴더에서 가져온 이미지 400장을 기반으로 구한 optimum 최적의 값으로 discriminator와 generator 네트워크를 만들어 d_loss와 g_loss를 구해주고
그 후에 sample_model( )함수로 또다른 val 폴더에서 그 폴더안의 이미지의 d_loss와 g_loss를 구해서 train시에 train 폴더의 데이터를 통해 만들어진 네트워크에 적용 후 이미지 출력 해준다.
Generator Network에 U-Net(cnn종류)을 사용-전체적인 맥락이해 및 복원을 위해 인코더와 디코더 형태를 취하고 최종적으로 영상을 복원 했을 때 화질이 선명하지 못한 문제를 해결하기 위해 U-Net 구조를 취한다.
Discriminator 에서는 PatchGAN구조 사용
- 스케치와 실제이미지를 넣어서 G가 스케치 이미지를 만들어내는 것을 train 하기
-train data가 모두 왼쪽을 향한 신발 데이터인데 왼쪽 오른쪽 방향 상관없이 출력 되는지 알아내기 --사이즈를 변환해서 그런가?
--실제로 test 하면 위치 잘 나옴…
-train
-open CV(추후 코드 설명 업데이트 예정)를 이용한 데이터 셋 구조 정리
canny image 만들기
두개의 이미지 합치기
여러개의 이미지 사이즈 256X256으로 통일하기
위 코드를 이용해 Test 시킬 데이터 셋 ( train data 와 겹치지 않는 data) 100장 뽑아내기
전반적인 코드 분석
Sample 폴더에는 G가 만든 실제 신발이 저장
Val 폴더에는 Train 폴더에서 제공한 데이터 400장 중 100장만 선별해서 넣어줬는데 G가 train 폴더의 이미지로 train 을 하고 val있는 데이터를 기반으로 해서 색과 모양을 뽑아내는 건지 원리를 알아내기
-G가 train 폴더의 data 는 어떻게 사용하고 val 폴더의 data는 어떻게 사용하는지!(위에서 설명했음)
train시 sample폴더에 출력되는 스케치 이미지는 train폴더에서 가져온 이미지 400장을 기반으로 구한 optimum 최적의 값으로 discriminator와 generator 네트워크를 만들어 d_loss와 g_loss를 구해주고 그 후에 sample_model( )함수로 또다른 val 폴더에서 그 폴더안의 이미지의 d_loss와 g_loss를 구해서 train시에 train 폴더의 데이터를 통해 만들어진 네트워크에 적용 후 이미지 출력 해준다.
문제!(Question)_추후에 해결하기!
def test(self, args)함수의
n = [i for i in map(lambda x: x.split('/')[-1].split('.jpg')[0], sample_files)]
# n = [i for i in map(lambda x: x.split('/')[-1].split('.jpg')[0], sample_files)]
# lamda로 함수 만들어서 앞의 경로를 자르고 마지막 단락과 jpg도 잘라낸 것을 map으로 리스트에 담아줌
#sorted(key=lambda x : x.split('/')[-1].split('.jpg')[0],reverse=False)
print(n)
이 부분에서 1.jpg,2.jpg…..100.jpg 라고 저장되어 있는 것을 1, 2 , 3, 만 가지고와서 n에 리스트로 저장하고 싶은데 그렇게 저장이 안되고
['val\\1', 'val\\10', 'val\\100', 'val\\11', 'val\\12', 'val\\13', 'val\\14', 'val\\15', 'val\\16', 'val\\17', 'val\\18', 'val\\19',
'val\\2', 'val\\20', 'val\\21', 'val\\22', 'val\\23', 'val\\24', 'val\\25', 'val\\26', 'val\\27', 'val\\28', 'val\\29',
'val\\3', 'val\\30', 'val\\31', 'val\\32', 'val\\33', 'val\\34', 'val\\35', 'val\\36', 'val\\37', 'val\\38', 'val\\39',
'val\\4', 'val\\40', 'val\\41', 'val\\42', 'val\\43', 'val\\44', 'val\\45', 'val\\46', 'val\\47', 'val\\48', 'val\\49',
'val\\5', 'val\\50', 'val\\51', 'val\\52', 'val\\53', 'val\\54', 'val\\55', 'val\\56', 'val\\57', 'val\\58', 'val\\59',
'val\\6', 'val\\60', 'val\\61', 'val\\62', 'val\\63', 'val\\64', 'val\\65', 'val\\66', 'val\\67', 'val\\68', 'val\\69',
'val\\7', 'val\\70', 'val\\71', 'val\\72', 'val\\73', 'val\\74', 'val\\75', 'val\\76', 'val\\77', 'val\\78', 'val\\79',
'val\\8', 'val\\80', 'val\\81', 'val\\82', 'val\\83', 'val\\84', 'val\\85', 'val\\86', 'val\\87', 'val\\88', 'val\\89',
'val\\9', 'val\\90', 'val\\91', 'val\\92', 'val\\93', 'val\\94', 'val\\95', 'val\\96', 'val\\97', 'val\\98', 'val\\99']
이런식으로 저장이 된다. map내부에서 sort 가 되는 것인지 lambda에서 sort가 되는 것인지 잘 모르겠다.