Autoencoder를 활용한 비지도 학습
이미지는 컴퓨터 비전 분야에서 중요한 데이터 유형 중 하나입니다. 이미지를 벡터화하고 압축하는 것은 이미지 처리와 관련된 다양한 작업에 유용한 전처리 단계입니다.
이 포스팅에서는 Autoencoder를 사용하여 이미지를 벡터화하고 압축하는 방법을 알아보겠습니다.
Autoencoder는 비지도 학습 모델로, 입력 이미지를 잠재 표현으로 압축하고 다시 복원하는 구조를 가지고 있습니다. 이를 통해 이미지의 특징을 학습하고 잠재 표현 벡터를 얻을 수 있습니다.
Autoencoder의 작동 원리
Autoencoder는 Encoder와 Decoder로 구성되며, 주로 컨볼루션 신경망(Convolutional Neural Network)을 사용합니다.
Encoder는 입력 이미지를 저차원의 잠재 표현 벡터로 압축하는 역할을 합니다.
Decoder는 잠재 표현 벡터를 원래의 이미지 공간으로 복원하는 역할을 합니다.
이미지 벡터화
Autoencoder를 사용하여 이미지를 벡터화하는 과정은 다음과 같습니다.
입력 이미지를 Encoder에 주입하여 잠재 표현 벡터를 얻습니다.
이 잠재 표현 벡터는 이미지의 중요한 특징을 담고 있는 저차원의 표현입니다.
벡터화된 이미지는 다양한 이미지 처리 작업에 활용될 수 있습니다.
이미지 압축
Autoencoder는 입력 이미지를 잠재 표현 벡터로 압축하는 과정을 통해 이미지 압축을 수행할 수 있습니다.
잠재 표현 벡터는 원본 이미지보다 저차원이기 때문에, 더 적은 메모리 공간을 차지하며 전송과 저장에 유리합니다.
압축된 이미지는 복원 단계에서 Decoder를 사용하여 원래의 이미지로 복원할 수 있습니다.
잠재 표현의 활용
Autoencoder를 통해 얻은 잠재 표현 벡터는 이미지의 특징을 학습한 결과입니다.
이 잠재 표현 벡터는 이미지 유사도 측정, 이미지 검색, 분류 등 다양한 이미지 처리 작업에 활용될 수 있습니다.
벡터화된 이미지를 다른 모델에 입력하여 더 높은 수준의 태스크를 수행할 수도 있습니다.
모델 학습
# 필요한 라이브러리 import
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, Conv2DTranspose, Flatten, Reshape
from tensorflow.keras.models import Model
# Autoencoder 모델 정의
def build_autoencoder(input_shape, latent_dim):
# Encoder
input_img = Input(shape=input_shape)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = Flatten()(x)
encoded = Dense(latent_dim, activation='relu')(x)
# Decoder
x = Dense(28 * 28 * 64, activation='relu')(encoded)
x = Reshape((28, 28, 64))(x)
x = Conv2DTranspose(64, (3, 3), activation='relu', padding='same')(x)
x = Conv2DTranspose(32, (3, 3), activation='relu', padding='same')(x)
decoded = Conv2DTranspose(1, (3, 3), activation='sigmoid', padding='same')(x)
# Autoencoder 모델
autoencoder = Model(input_img, decoded)
return autoencoder
# 모델 생성
input_shape = (28, 28, 1) # 예시로 MNIST 데이터셋을 사용하므로 (28, 28, 1) 크기의 이미지
latent_dim = 32
autoencoder = build_autoencoder(input_shape, latent_dim)
# MNIST 데이터셋 로드
(x_train, _), (x_test, _) = mnist.load_data()
# 데이터 전처리 및 정규화
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)
# 모델 생성
input_shape = (28, 28, 1)
latent_dim = 32
autoencoder = build_autoencoder(input_shape, latent_dim)
# 모델 컴파일
autoencoder.compile(optimizer=Adam(), loss=MeanSquaredError())
# 모델 학습
batch_size = 64
epochs = 10
autoencoder.fit(x_train, x_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, x_test))
학습된 모델을 활용한 이미지 복원 / 유사 이미지 탐색
# 필요한 라이브러리 import
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# Autoencoder 모델 정의 (이전 코드 참고)
# ...
# 이미지 복원 예제
def reconstruct_image(autoencoder, image):
# 이미지를 모델에 주입하여 복원
reconstructed_image = autoencoder.predict(np.expand_dims(image, axis=0))[0]
return reconstructed_image
# 유사한 이미지 검색 예제
def find_similar_images(autoencoder, images, query_image, num_similar=5):
# 쿼리 이미지를 잠재 표현 벡터로 변환
query_vector = autoencoder.encoder.predict(np.expand_dims(query_image, axis=0))[0]
# 모든 이미지를 잠재 표현 벡터로 변환
latent_vectors = autoencoder.encoder.predict(images)
# 쿼리 이미지와의 잠재 표현 벡터 간 거리 계산
distances = np.linalg.norm(latent_vectors - query_vector, axis=1)
# 거리가 가장 가까운 상위 num_similar 개의 이미지 선택
similar_indices = np.argsort(distances)[:num_similar]
# 유사한 이미지와 거리 출력
for index in similar_indices:
distance = distances[index]
similar_image = images[index]
print(f"Distance: {distance}, Image Shape: {similar_image.shape}")
plt.imshow(similar_image, cmap='gray')
plt.axis('off')
plt.show()
# 이미지 데이터셋 로드 (예시로 MNIST 데이터셋 사용)
(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()
# 이미지 전처리
train_images = train_images.astype('float32') / 255.0
test_images = test_images.astype('float32') / 255.0
# 모델 생성 (이전 코드 참고)
# ...
# 이미지 복원 예제
image_index = 0 # 복원할 이미지 인덱스 선택
original_image = test_images[image_index]
reconstructed_image = reconstruct_image(autoencoder, original_image)
# 결과 출력
plt.subplot(1, 2, 1)
plt.title("Original Image")
plt.imshow(original_image, cmap='gray')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.title("Reconstructed Image")
plt.imshow(reconstructed_image, cmap='gray')
plt.axis('off')
plt.show()
# 유사한 이미지 검색 예제
query_image_index = 10 # 쿼리 이미지 인덱스 선택
query_image = test_images[query_image_index]
similar_images = find_similar_images(autoencoder, test_images, query_image, num_similar=5)
실제 적용 사례
이미지 벡터화와 압축은 다양한 컴퓨터 비전 태스크에 활용될 수 있습니다.
이미지 유사도 측정: 벡터화된 이미지 간의 유클리디안 거리나 코사인 유사도를 계산하여 이미지 간의 유사성을 판단할 수 있습니다.
이미지 검색: 벡터화된 이미지를 인덱싱하여 특정 특징이나 속성에 기반한 이미지 검색 시스템을 구축할 수 있습니다.
이미지 분류: 벡터화된 이미지를 입력으로 다른 모델(예: 신경망)에 전달하여 분류 작업을 수행할 수 있습니다.
'데이터 분석 > 머신러닝' 카테고리의 다른 글
이미지를 이용하여 텍스트를 생성하는 모델 Image to Text(이미지 캡셔닝) (0) | 2023.07.27 |
---|---|
이미지 벡터화 - VGG16 / VGG19 (0) | 2023.05.26 |
다양한 산업 분야에서 머신러닝이 활용되고 있는 사례 (0) | 2023.04.25 |
머신러닝 학습 방향 및 학습 예제 (0) | 2023.04.25 |
웹 페이지 크롤링 기초 (1) | 2023.04.11 |