딥러닝 이미지 처리
딥러닝 이미지 처리 기술: CNN
1. 서론: 이미지 데이터와 딥러닝
이미지 데이터는 딥러닝 분야에서 중요한 역할을 합니다. 이미지 인식, 객체 탐지, 이미지 생성 등 다양한 분야에서 딥러닝 기술이 활용되고 있습니다. 이 글에서는 딥러닝을 이용한 이미지 처리의 핵심 기술인 CNN(Convolutional Neural Network)에 대해 자세히 알아보고, 실제 코드 예제를 통해 CNN 모델을 구현하는 방법을 살펴보겠습니다.
2. 이미지 데이터의 이해
이미지는 픽셀이라는 작은 점들로 구성된 데이터입니다. 각 픽셀은 색상 정보를 가지고 있으며, 일반적으로 RGB(Red, Green, Blue) 세 가지 색상 채널로 표현됩니다. 딥러닝 모델은 이러한 픽셀 정보를 입력으로 받아 이미지의 특징을 학습하고, 이를 바탕으로 다양한 작업을 수행합니다.
from PIL import Image import numpy as np import matplotlib.pyplot as plt
def print_color_image_as_numbers(image_path): try: img = Image.open(image_path) img_array = np.array(img) height, width, channels = img_array.shape print(f”이미지 크기: {width} x {height}, 채널 수: {channels}”) print(“이미지 데이터 (일부):”) for y in range(min(10, height)): for x in range(min(10, width)): print(img_array[y, x], end=” “) print() plt.figure(figsize=(12, 4)) plt.subplot(131) plt.imshow(img_array, cmap=’Reds’) except FileNotFoundError: print(f”오류: {image_path} 파일을 찾을 수 없습니다.”) except Exception as e: print(f”오류: {e}”)
image_path = “/content/카리나.jpg” # 이미지 파일 경로 print_color_image_as_numbers(image_path)
위 코드는 PIL 라이브러리를 사용하여 이미지를 불러오고, NumPy 배열로 변환하여 이미지 데이터를 확인하는 예제입니다.
3. CNN(Convolutional Neural Network) 이란?
CNN은 이미지 처리에 특화된 딥러닝 모델입니다. CNN은 기존의 신경망 모델과 달리, Convolutional Layer, Pooling Layer 등의 레이어를 사용하여 이미지의 특징을 효과적으로 추출합니다.
- Convolutional Layer: 입력 이미지에 필터(Kernel)를 적용하여 특징 맵(Feature Map)을 생성하는 레이어입니다. 필터는 이미지의 특정 패턴(예: 엣지, 색상)을 감지하는 역할을 합니다.
- Pooling Layer: 특징 맵의 크기를 줄여 계산량을 감소시키고, 과적합을 방지하는 레이어입니다. Max Pooling, Average Pooling 등이 사용됩니다.
4. 1D CNN을 이용한 특징 추출
1D CNN은 시퀀스 데이터에서 특징을 추출하는 데 사용됩니다. 1D CNN은 이미지 데이터를 1차원 시퀀스로 간주하여 특징을 추출할 수 있습니다.
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten, MaxPooling1D, Input from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix from sklearn.datasets import load_iris from numpy import unique
# Iris 데이터셋 로드 iris = load_iris() x, y = iris.data, iris.target
# 데이터 차원 변경 x = x.reshape(x.shape[0], x.shape[1], 1)
# 데이터 분할 xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.15)
# 모델 구성 model = Sequential() model.add(Input(shape=(4, 1))) # 입력 레이어 model.add(Conv1D(filters=64, kernel_size=2, activation=”relu”)) # 1D CNN 레이어 model.add(MaxPooling1D()) # Pooling 레이어 model.add(Flatten()) # Flatten 레이어 model.add(Dense(128, activation=”relu”)) # Dense 레이어 model.add(Dense(3, activation=”softmax”)) # 출력 레이어
# 모델 컴파일 model.compile( loss=’sparse_categorical_crossentropy’, optimizer=”adam”, metrics=[‘accuracy’] )
# 모델 학습 model.fit(xtrain, ytrain, batch_size=16, epochs=100, verbose=0)
# 모델 평가 acc = model.evaluate(xtrain, ytrain) print(“Loss:”, acc[0], “Accuracy:”, acc[1])
# 예측 및 혼동 행렬 계산 pred = model.predict(xtest) pred_y = pred.argmax(axis=-1) cm = confusion_matrix(ytest, pred_y) print(cm)
위 코드는 1D CNN을 이용하여 Iris 데이터셋을 분류하는 예제입니다.
5. 2D CNN을 이용한 이미지 처리
2D CNN은 이미지 데이터를 직접 입력으로 받아 특징을 추출하고, 이미지 관련 작업을 수행하는 데 사용됩니다.
from tensorflow.keras.layers import Conv2D, InputLayer import matplotlib.pyplot as plt from tensorflow.keras.datasets import mnist import numpy as np
# MNIST 데이터셋 로드 (x_train, _), _ = mnist.load_data() img = x_train[0] # 이미지 한 장 img = img.astype(np.float32) / 255.0 # 정규화
# 이미지 차원 변경 img = np.expand_dims(img, axis=(0, -1))
# 엣지 검출 필터 정의 custom_kernel = np.array([ [1, 1, 1], [1, -8, 1], [1, 1, 1], ], dtype=np.float32) custom_kernel = custom_kernel.reshape((3, 3, 1, 1))
# CNN 모델 구성 model = Sequential([ InputLayer(input_shape=(28, 28, 1)), Conv2D( filters=1, kernel_size=(3, 3), padding=’same’, use_bias=False, trainable=False # 필터를 학습하지 않음 ) ])
# 필터 적용 model.layers[0].set_weights([custom_kernel]) filtered_img = model.predict(img)
# 결과 시각화 plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1) plt.title(“Original”) plt.imshow(img[0, :, :, 0], cmap=’gray’)
plt.subplot(1, 2, 2) plt.title(“Filtered (Edge Detection)”) plt.imshow(filtered_img[0, :, :, 0], cmap=’gray’)
plt.tight_layout() plt.show()
위 코드는 2D CNN을 이용하여 MNIST 데이터셋 이미지에서 엣지를 검출하는 예제입니다.
6. CNN 모델 개발 및 학습
CNN 모델을 개발하고 학습하는 과정은 다음과 같습니다.
- 데이터 준비: 입력 이미지와 해당 이미지의 레이블(정답) 데이터를 준비합니다.
- 모델 구성: CNN 레이어(Convolutional Layer, Pooling Layer 등)를 쌓아 모델을 구성합니다.
- 모델 컴파일: 손실 함수, 최적화 알고리즘, 평가 지표 등을 설정합니다.
- 모델 학습: 준비된 데이터를 이용하여 모델을 학습시킵니다.
- 모델 평가: 학습된 모델의 성능을 평가합니다.
import tensorflow as tf from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D from tensorflow.keras.utils import to_categorical from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping import numpy as np
# MNIST 데이터셋 로드 (X_train, Y_train), (X_test, Y_test) = tf.keras.datasets.mnist.load_data()
# 데이터 전처리 X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype( ‘float32’) / 255 X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype(‘float32’) / 255 Y_train = to_categorical(Y_train) Y_test = to_categorical(Y_test)
# CNN 모델 구성 model = tf.keras.Sequential() model.add(Conv2D(32, kernel_size=(3, 3), input_shape=( 28, 28, 1), activation=’relu’)) model.add(Conv2D(64, (3, 3), activation=’relu’)) model.add(MaxPooling2D(pool_size=2)) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation=’relu’)) model.add(Dropout(0.5)) model.add(Dense(10, activation=’softmax’))
# 모델 컴파일 model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
# 콜백 함수 정의 MODEL_DIR = ‘/content/drive/MyDrive/model/cnnmodel/’ modelpath = “{epoch:02d}-{val_loss:.4f}.keras” modelpos = os.path.join(MODEL_DIR, modelpath) checkpointer = ModelCheckpoint( filepath=modelpos, monitor=’val_loss’, verbose=1, save_best_only=True) early_stopping_callback = EarlyStopping(monitor=’val_loss’, patience=10)
# 모델 학습 history = model.fit(X_train, Y_train, validation_data=( X_test, Y_test), epochs=30, batch_size=200, verbose=0, callbacks=[early_stopping_callback, checkpointer])
# 모델 평가 print(“\n Test Accuracy: %.4f” % (model.evaluate(X_test, Y_test)[1]))
위 코드는 MNIST 데이터셋을 이용하여 CNN 모델을 학습하고 평가하는 예제입니다.
7. 결론: CNN을 이용한 이미지 처리
CNN은 이미지 처리 분야에서 매우 강력한 성능을 보여주는 딥러닝 모델입니다. CNN을 이용하여 이미지 분류, 객체 탐지, 이미지 생성 등 다양한 작업을 수행할 수 있습니다. 이 튜토리얼을 통해 CNN의 기본 개념과 구현 방법을 이해하고, 딥러닝 기반 이미지 처리 기술을 개발하는 데 도움이 되기를 바랍니다.