본문 바로가기

인공지능 대학원/AI 영상처리

CNN(Convolutional Neural Network)

CNN(Convolutional Neural Network)

1. CNN 개요

CNN(Convolutional Neural Network)은 이미지 데이터 처리에 특화된 딥러닝 모델로, 특징 추출(Feature Extraction)과 분류(Classification)를 자동으로 수행할 수 있다.

(1) CNN의 주요 구성 요소

  • Convolution Layer (컨볼루션 레이어) → 이미지 특징 추출
  • Activation Function (비선형 활성화 함수, 주로 ReLU) → 비선형성 부여
  • Pooling Layer (풀링 레이어) → 차원 축소, 중요한 정보 유지
  • Fully Connected Layer (완전 연결층) → 최종 분류

2. 컨볼루션 연산 (Convolution Operation)

(1) 컨볼루션 필터(3×3 필터)

  • 컨볼루션 필터는 이미지에서 패턴(특징)을 추출하는 역할
  • 필터 크기: 일반적으로 3×3 또는 5×5 크기를 많이 사용
  • 출력 크기(Feature Map, 피처맵): 입력 이미지에 필터를 적용하여 생성됨

(2) 패딩 (Padding)

컨볼루션을 수행하면 이미지 크기가 줄어들 수 있기 때문에, 패딩을 추가하여 크기를 유지할 수 있다.

  • Valid Padding: 패딩을 추가하지 않고 연산 → 이미지 크기 줄어듦
  • Same Padding: 원본 크기를 유지하도록 패딩 추가
import tensorflow as tf
import numpy as np

# 3x3 필터 생성 (엣지 감지)
filter_3x3 = np.array([[1, 0, -1],
                        [1, 0, -1],
                        [1, 0, -1]], dtype=np.float32)

filter_3x3 = filter_3x3.reshape((3, 3, 1, 1))  # (height, width, in_channels, out_channels)

# TensorFlow에서 필터 적용
image = tf.random.normal([1, 5, 5, 1])  # 5x5 이미지
conv_layer = tf.nn.conv2d(image, filter_3x3, strides=[1, 1, 1, 1], padding="SAME")

print(conv_layer.shape)  # 출력 Feature Map 크기 확인

3. 다채널(Multi-Channel) 컨볼루션

(1) RGB 채널 개념

  • 일반적인 컬러 이미지는 RGB 채널을 가지며, Depth = 3(R, G, B)
  • 필터(Filter)의 Depth는 입력 이미지의 채널 개수와 동일해야 함

(2) 필터(Filter)의 구조

컨볼루션 필터는 4차원 텐서로 표현됨.
[필터 높이, 필터 너비, 입력 채널 수, 출력 채널 수]

예를 들어, RGB 이미지에 대해 10개의 필터를 적용하면:

filter_shape = (3, 3, 3, 10)  # 3x3 크기의 필터, 입력 채널 3개, 출력 채널 10
  • in_channels = 3 (RGB)
  • out_channels = 10 (Feature Maps 개수)

4. 스트라이드(Stride)

  • Stride: 필터를 이동시키는 간격
  • 기본값: stride = 1
  • stride = 2 로 설정하면 한 칸씩이 아닌 두 칸씩 이동하여 연산량 감소
conv_layer = tf.nn.conv2d(image, filter_3x3, strides=[1, 2, 2, 1], padding="SAME")
  • strides = [1, 2, 2, 1]
    • 첫 번째 1: 배치 크기 유지
    • 2,2: 가로, 세로 방향으로 2칸씩 이동
    • 마지막 1: 채널 유지

5. 활성화 함수(Activation Function)

컨볼루션 연산 후, 비선형성을 부여하기 위해 활성화 함수를 적용해야 한다.

(1) ReLU (Rectified Linear Unit)

  • 가장 많이 사용되는 활성화 함수
  • 음수 값을 0으로 변환하여 기울기 소실 문제 해결

f(x)=max(0,x)f(x) = max(0, x)

relu_output = tf.nn.relu(conv_layer)

(2) Softmax

  • 최종 분류 단계에서 사용
  • 출력을 확률 값(0~1)로 변환하여 여러 클래스 중 하나를 선택
softmax_output = tf.nn.softmax(relu_output)

6. 풀링(Pooling)

(1) 풀링(Pooling) 레이어의 역할

  • 특징을 유지하면서 크기를 줄여 연산량 감소
  • 약간의 위치 변화에도 강인한 모델을 만들기 위해 사용

(2) 풀링 종류

풀링 종류 설명

맥스 풀링 (Max Pooling) 필터 영역에서 가장 큰 값 선택
평균 풀링 (Average Pooling) 필터 영역의 평균 값 선택
pooling_layer = tf.nn.max_pool(relu_output, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
  • ksize = [1, 2, 2, 1] → 2×2 필터 사용
  • strides = [1, 2, 2, 1] → 2칸씩 이동

7. Fully Connected Layer (완전 연결층)

(1) CNN 마지막 단계

  • 컨볼루션 & 풀링을 반복한 후 출력층(Fully Connected Layer, FC Layer)에서 최종 분류
  • 보통 Flatten(평탄화)하여 Dense Layer(완전 연결층)에 연결
flatten = tf.keras.layers.Flatten()(pooling_layer)
fc_layer = tf.keras.layers.Dense(units=128, activation='relu')(flatten)
output_layer = tf.keras.layers.Dense(units=10, activation='softmax')(fc_layer)  # 10개 클래스 분류

8. CNN을 이용한 분류 모델 구조

CNN을 사용한 대표적인 이미지 분류 모델 구조:

  1. Input Image (입력)
  2. Conv Layer (컨볼루션 연산, 특징 추출)
  3. ReLU (비선형성 부여)
  4. Pooling Layer (맥스풀링, 차원 축소)
  5. Conv + ReLU + Pooling 반복
  6. Flatten Layer (1차원 변환)
  7. Fully Connected Layer (분류)
  8. Softmax (최종 확률 출력)

9. CNN 모델 구현 예제 (TensorFlow)

import tensorflow as tf
from tensorflow.keras import layers, models

# CNN 모델 생성
model = models.Sequential([
    layers.Conv2D(32, (3,3), activation='relu', input_shape=(32, 32, 3)), # 3x3 필터 32개
    layers.MaxPooling2D((2,2)),  # 2x2 맥스풀링
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.MaxPooling2D((2,2)),
    layers.Conv2D(64, (3,3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),  # Fully Connected Layer
    layers.Dense(10, activation='softmax')  # 출력층 (10개 클래스)
])

# 모델 요약 출력
model.summary()

10. 정리

- CNN은 이미지 데이터를 처리하기 위해 설계된 딥러닝 모델
- 컨볼루션 연산(필터), 패딩, 스트라이드 개념 중요
- ReLU 활성화 함수로 비선형성 추가
- 맥스풀링으로 차원 축소 및 중요한 특징 유지
- Fully Connected Layer에서 최종 분류 수행

 

728x90