본문 바로가기
프로그래밍/2P1L project

오토인코더 학습

by austag 2023. 8. 22.

https://crane206265.tistory.com/30

 

[2P1L] 이미지 데이터셋 numpy 배열로 저장하기

데이터셋이 이미지로 모여있습니다. 이를 그대로 쓸 수는 없고, 프로그래밍에 활용 가능한 데이터셋의 형태로 바꾸어야 합니다. Python의 경우는, numpy의 array(배열)로 바꿔주는 것이 일반적이죠.

crane206265.tistory.com

이미지를 학습시키는데 있어서 계속 오류가 났었는데 같이 활동하는 친구가 고쳐주었습니다.

계속 데이터 전처리 부분에서 실수를 하는데 이 부분은 더 공부해야 할 것 같습니다.


이제 제대로 학습시켜줄 수 있습니다.

#데이터셋 불러오기
(X_train), (X_test) = np.load(face_img)
print(train.shape[0])
X_train = train.reshape(train.shape[0], img_size, img_size, 1).astype('float32') / 255
X_test = test.reshape(test.shape[0], img_size, img_size, 1).astype('float32') / 255

#생성자 모델
autoencoder = Sequential()

#인코딩
autoencoder.add(Conv2D(16, kernel_size=3, padding='same', input_shape=(img_size,img_size,1), activation='relu'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, activation='relu', padding='same'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, strides=2, padding='same', activation='relu'))

#디코딩
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(16, kernel_size=3, activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(1, kernel_size=3, padding='same', activation='sigmoid'))

#컴파일 & 학습
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))

#학습 결과 출력
random_test = np.random.randint(X_test.shape[0], size=5)

#테스트 이미지 랜덤 호출
ae_imgs = autoencoder.predict(X_test)

plt.figure(figsize=(7,2)) #출력 이미지 크기

for i, image_idx in enumerate(random_test):
  ax = plt.subplot(2, 7, i+1) # 랜덤 이미지 나열
  plt.imshow(X_test[image_idx].reshape(img_size, img_size)) # 테스트 이미지
  ax.axis('off')
  ax = plt.subplot(2, 7, 7+i+1)
  plt.imshow(ae_imgs[image_idx].reshape(img_size, img_size)) #오토인코딩 결과 입력
  ax.axis('off')

plt.show()

오토인코더 코드는 다음과 같습니다.

친구가 학습을 미리 해봤고 그 결과는

28 x 28
d100 x 100
300 x 300

이렇습니다. 이미지 크기를 늘려줄 수록 더 정확해지는 것이 보이죠.

제가 학습한 이미지는

이렇게 나왔습니다. 더 뚜렷해졌습니다.

층을 늘리면 어떻게 될지 궁금하다길래 인코더, 디코더 부분을 한층씩 더 늘려봤는데

애가 퇴화하더라구요.

그래서 처음 모델로 진행했습니다.

 

이미지 크기 : 300 x 300
Epoch = 50
데이터 수 : 215 장

이 되겠습니다.

 

이렇게 STEAM 활동인 2P1L project를 마쳤습니다. 나중에 아이디어가 떠오르면 응용하고 개선시킬 것 같습니다.

 

전체 코드 (코랩에서 진행)

from tensorflow.keras.layers import Input, Dense, Reshape, Flatten, Dropout
from tensorflow.keras.layers import BatchNormalization, Activation, LeakyReLU, UpSampling2D, Conv2D
from tensorflow.keras.models import Sequential, Model

from tensorflow.keras.layers import Conv2D, MaxPooling2D, UpSampling2D

import numpy as np
import matplotlib.pyplot as plt

from tensorflow.keras.preprocessing import image
import keras.utils as image
from google.colab import drive
drive.mount('/content/drive')
import os
import random

#데이터 불러오기
face = '/content/drive/MyDrive/2023/STEAM/2P1L/face'
os.listdir(face)

#데이터 리스트 만들기
img_list = os.listdir(face)
print(img_list)
random.shuffle(img_list)
print(img_list)
#이미지 확인
import random

img = image.load_img(os.path.join(face, img_list[random.randint(0,214)]),
                     target_size=(250, 250))

plt.imshow(img)
plt.show()
#데이터 전처리 및 파일 생성
from PIL import Image
l = len(img_list)
print(l)

img_size = 300

train_list = img_list[:int(l*0.7)]
test_list = img_list[int(l*0.7):]

train = np.empty((0, img_size, img_size))
test = np.empty((0, img_size, img_size))

img = Image.open(face+'/'+train_list[0]).convert('L')
img = img.resize((img_size, img_size))
plt.imshow(img)
plt.show()

for name in train_list:
  img = Image.open(face+'/'+name).convert('L')
  img = img.resize((img_size, img_size))
  img_array = np.array(img)
  train = np.append(train, np.array([img_array]), axis=0)

for name in test_list:
  img = Image.open(face+'/'+name).convert('L')
  img = img.resize((img_size, img_size))
  img_array = np.array(img)
  test = np.append(test, np.array([img_array]), axis=0)

print(len(train))
print(len(test))

#print(train)
#print(test)

np.savez("/content/drive/MyDrive/2023/STEAM/2P1L/face_img.npz", train=train, test=test)
face_img = "/content/drive/MyDrive/2023/STEAM/2P1L/face_img.npz"

(위 링크 참고)

#데이터셋 불러오기
(X_train), (X_test) = np.load(face_img)
print(train.shape[0])
X_train = train.reshape(train.shape[0], img_size, img_size, 1).astype('float32') / 255
X_test = test.reshape(test.shape[0], img_size, img_size, 1).astype('float32') / 255

#생성자 모델
autoencoder = Sequential()

#인코딩
autoencoder.add(Conv2D(16, kernel_size=3, padding='same', input_shape=(img_size,img_size,1), activation='relu'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, activation='relu', padding='same'))
autoencoder.add(MaxPooling2D(pool_size=2, padding='same'))
autoencoder.add(Conv2D(8, kernel_size=3, strides=2, padding='same', activation='relu'))

#디코딩
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(16, kernel_size=3, activation='relu'))
autoencoder.add(UpSampling2D())
autoencoder.add(Conv2D(1, kernel_size=3, padding='same', activation='sigmoid'))

#컴파일 & 학습
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))

#학습 결과 출력
random_test = np.random.randint(X_test.shape[0], size=5)

#테스트 이미지 랜덤 호출
ae_imgs = autoencoder.predict(X_test)

plt.figure(figsize=(7,2)) #출력 이미지 크기

for i, image_idx in enumerate(random_test):
  ax = plt.subplot(2, 7, i+1) # 랜덤 이미지 나열
  plt.imshow(X_test[image_idx].reshape(img_size, img_size)) # 테스트 이미지
  ax.axis('off')
  ax = plt.subplot(2, 7, 7+i+1)
  plt.imshow(ae_imgs[image_idx].reshape(img_size, img_size)) #오토인코딩 결과 입력
  ax.axis('off')

plt.show()

'프로그래밍 > 2P1L project' 카테고리의 다른 글

데이터 생성과 오토인코더 활용  (1) 2023.08.27
GAN 학습  (0) 2023.08.25
데이터셋 나누기  (0) 2023.08.12
코랩에서 이미지 불러오기  (0) 2023.08.12
2P1L 이미지 생성하기 프로젝트  (0) 2023.08.10