[모두의 딥러닝] CNN에 대하여
디지털 이미지 종류(True color, Grey color)
이미지는 다양한 종류가 있습니다. 일반적으로 디지털 이미지는 픽셀의 직합으로 구성되며, 각각의 픽셀은 숫자로 표현된 색상 정보를 가리고 있습니다. 대표적인 이미지 종류는 true color와 grey color가 있습니다.
True color 이미지
RGB 색상 체계를 사용하여 픽셀의 색상을 표현하는 이미지입니다. 이는 대부분의 디지털 이미지에서 사용되는 기본 색상 체계입니다.
Grey color 이미지
각 픽셀이 하나의 단일 색상 값으로만 구성된 이미지입니다. 이러한 이미지는 주로 흑백 사진이나 스캔한 문서 등에서 사용됩니다.
CNN을 사용하는 이유
CNN은 이미지 분류, 객체 인식, 얼굴 인식 등의 다양한 컴퓨터 비전 작업에서 매우 효과적인 딥러닝 모델입니다. 이러한 이유로 CNN이 사용되는 이유는 같습니다.
1. 지역 정보 공유 : CNN은 이미지에서 지역 정보를 공유하도록 설계되어 있습니다. 이를 통해 CNN은 이미지의 지역적인 특징을 추출할 수 있습니다.
ex) 이미지에서 얼굴을 인식하는 경우, CNN은 얼굴의 여러 부분에서 공통적인 패턴을 찾아낼 수 있습니다.
2. 가중치 공유 : CNN은 가중치 공유를 통해 모델의 파라미터 수를 줄일 수 있습니다. 이를 모델의 복잡성을 낮추고 과적합을 방지할 수 있습니다.
3. 데이터 증강 : CNN은 데이터 증강 기법을 적용하기 쉽습니다. 데이터 증강은 기존의 데이터셋을 다양한 방법으로 변형하여 데이터의 다양성을 높이는 기법으로, CNN 모델의 성능 향상에 큰 역할을 합니다.
4. 계층적 구조 : CNN은 여러 개의 레이어로 이루어진 계층적 구조를 가집니다. 이러한 구조는 이미지의 복잡한 특징을 다양ㅎ나 수준에서 추출할 수 있습니다.
5. 자동 특징 추출 : CNN은 이미지에서 특징을 자동적으로 추출할 수 있습니다. 이는 전통적인 방법으로는 어려웠던 이미지 분류, 객체 인식, 얼굴 인식 등의 작업을 더욱 간단하게 해줍니다.
따라서 이러한 이유로 CNN은 이미지 분류, 객체 인식, 얼굴 인식 등의 다양한 컴퓨터 비전 작업에서 효과적인 딥러닝 모델로 사용되고 있습니다.
CNN에서 convolution layer 동작 원리
1. 입력 이미지: Convolution Layer의 입력으로 사용되는 이미지는 3차원 배열 형태입니다. 일반적으로 RGB 이미지의 경우, 세 개의 채널(Red, Green, Blue)로 구성된 3차원 배열로 표현됩니다.
2. 필터 적용: Convolution Layer에서는 입력 이미지에 일련의 작은 필터를 적용합니다. 이때, 필터는 이미지의 작은 영역에 대한 가중치들로 구성되어 있으며, 필터의 크기는 보통 3x3 또는 5x5로 지정됩니다. 필터는 입력 이미지와 같은 차원의 배열로 표현됩니다.
3. 합성곱 연산: 필터를 입력 이미지에 적용하는 과정을 합성곱(Convolution) 연산이라고 합니다. 이때, 필터와 입력 이미지의 각 위치에서의 곱셈 결과를 모두 더하여 출력 이미지를 생성합니다. 이러한 연산을 통해 입력 이미지의 특징을 추출할 수 있습니다.
4. 스트라이드: 필터를 적용하는 위치를 조정하는 Stride 파라미터를 사용하여 출력 이미지의 크기를 조절할 수 있습니다. Stride가 1인 경우, 필터는 한 픽셀씩 이동하며 출력 이미지의 크기는 입력 이미지와 동일합니다. Stride가 2인 경우, 필터는 두 픽셀씩 이동하며 출력 이미지의 크기는 입력 이미지의 절반으로 줄어듭니다.
5. 출력 이미지: 합성곱 연산을 통해 생성된 출력 이미지는 필터에 의해 추출된 입력 이미지의 특징을 나타냅니다. Convolution Layer에서는 보통 여러 개의 필터를 사용하여 출력 이미지를 생성하며, 이를 통해 입력 이미지의 다양한 특징을 추출할 수 있습니다.
이러한 과정을 여러 번 반복하여 다층 Convolution Layer를 구성하면, 입력 이미지의 다양한 특징을 추출하고 이를 기반으로 이미지 분류, 객체 인식 등의 작업을 수행할 수 있는 CNN 모델을 만들 수 있습니다.
CNN에서 pooling layer 동작 원리
1. 입력 이미지: Convolution Layer의 출력 이미지를 입력으로 사용합니다.
2. 윈도우(window) 설정: 입력 이미지에서 일정한 크기의 윈도우를 설정합니다. 보통 2x2 또는 3x3 크기의 윈도우를 사용합니다.
3. 풀링 연산: 윈도우 내에서 가장 큰 값을 선택하는 Max Pooling, 평균 값을 선택하는 Average Pooling 등 다양한 연산을 사용하여 윈도우를 처리합니다. 이때, 연산된 결과를 출력 이미지의 해당 위치에 저장합니다.
4. 스트라이드: 필터 적용과 마찬가지로 Stride 파라미터를 사용하여 윈도우를 이동시키며, 출력 이미지의 크기를 조절합니다.
5. 출력 이미지: Pooling Layer를 거쳐 생성된 출력 이미지는 Convolution Layer의 출력 이미지에 비해 크기가 작아지며, 입력 이미지의 중요한 특징을 유지합니다.
Pooling Layer는 Convolution Layer와 함께 여러 번 반복하여 다층 구조를 형성합니다. 이러한 다층 구조를 통해 입력 이미지의 다양한 특징을 추출하고, 이를 기반으로 이미지 분류, 객체 인식 등의 작업을 수행할 수 있는 CNN 모델을 만들 수 있습니다.
Flatten이란?
Flatten은 다차원 배열을 1차원 배열로 변환하는 작업을 의미합니다. 딥러닝에서는 Flatten 레이어를 사용하여, 이미지, 텍스트 등의 다차원 입력 데이터를 1차원 벡터로 바꾸어 인공 신경망에 입력할 수 있습니다.
예를 들어, 28x28 크기의 MNIST 손글씨 이미지 데이터는 각각 28x28=784개의 픽셀로 구성되어 있습니다. 이를 Flatten 레이어를 사용하여 784개의 원소를 가진 1차원 벡터로 변환하면, 이를 인공 신경망의 입력으로 사용할 수 있습니다.
Flatten 레이어는 입력 데이터의 형태를 변경하는 역할을 수행하며, 별도의 학습 파라미터가 존재하지 않습니다. 따라서, 이 레이어는 모델의 복잡도에 영향을 주지 않습니다. Flatten 레이어는 Convolutional Neural Network(CNN) 모델의 마지막 단계에 적용되어, Fully Connected Layer에 입력으로 제공됩니다. 이를 통해, 이미지 분류, 객체 인식, 자연어 처리 등 다양한 딥러닝 태스크를 수행할 수 있습니다.
CNN 예제 코드 작성 및 첨부
MNIST 손글씨 숫자 데이터셋을 사용하여, 손글씨 숫자 인식 모델을 학습하는 코드입니다.
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
# 데이터셋 로드
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 입력 이미지 전처리
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
# 레이블 전처리
num_classes = 10
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
# 모델 구성
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))
# 모델 컴파일
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adam(),
metrics=['accuracy'])
# 모델 학습
model.fit(x_train, y_train,
batch_size=128,
epochs=10,
verbose=1,
validation_data=(x_test, y_test))
# 모델 평가
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
CNN 활용 예제
CNN은 이미지 처리 분야에서 광범위하게 활용되고 있습니다. 다음은 CNN을 활용한 예제들입니다.
1. 이미지 분류
- CIFAR-10, CIFAR-100, ImageNet 등의 대규모 이미지 데이터셋에서의 분류 작업
- 개와 고양이 구분, 식물과 동물 구분 등의 이진 분류 작업
2. 객체 검출
- Faster R-CNN, YOLO 등의 객체 검출 알고리즘에서 CNN을 활용
- CCTV 영상에서 특정 객체 검출 등의 작업
3. 세그멘테이션
- FCN, U-Net 등의 세그멘테이션 알고리즘에서 CNN을 활용
- 의료 영상에서 종양 등을 검출하는 작업
4. 스타일 변환
- Gatys et al.의 논문에서 소개된 Neural Style Transfer 알고리즘에서 CNN을 활용
- 원본 이미지의 스타일을 다른 이미지의 스타일로 변환하는 작업
5. 이미지 생성
- DCGAN, VAE-GAN, GPT 등의 알고리즘에서 CNN을 활용하여 이미지 생성
- 가상 도시 생성, 유사 이미지 생성 등의 작업