🔢 CNN으로 손글씨 숫자 인식하기: 이미지 분류의 시작
- 우리가 흔히 보는 손글씨 숫자(예: 0~9)를 인식하는 모델은 어떻게 작동할까요?
- 이 글에서는 CNN(합성곱 신경망)을 이용해 이미지로부터 숫자를 인식하는 과정을 소개합니다.
- 대표적인 예제로는 MNIST 데이터셋이 사용됩니다.
🧠 CNN이란?
CNN(Convolutional Neural Network)은 이미지, 음성, 영상 등 2차원 데이터를 다룰 때 매우 강력한 성능을 보여주는 딥러닝 모델입니다.
🔍 주요 특징
- 합성곱 계층 (Convolution Layer): 이미지의 특징 추출
- 풀링 계층 (Pooling Layer): 크기 축소 및 중요한 특징 유지
- 완전연결 계층 (Dense Layer): 최종 분류 수행
일반적인 신경망(Dense NN)은 이미지의 구조를 무시하지만, CNN은 공간적 구조(위치, 모양 등)를 고려합니다.
📦 사용하는 데이터: MNIST
MNIST는 0~9까지의 손글씨 숫자 이미지 데이터입니다.
항목 | 내용 |
이미지 크기 | 28x28 (흑백) |
클래스 | 10개 (0~9) |
학습용 데이터 | 60,000장 |
테스트용 데이터 | 10,000장 |
🧪 CNN으로 숫자 인식하는 전체 흐름
- 데이터 불러오기
- 전처리: 정규화 + 라벨 인코딩
- 모델 구성 (CNN)
- 모델 학습
- 모델 평가 및 예측
💻 코드 예제 (TensorFlow / Keras)
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
import matplotlib.pyplot as plt
# 1. 데이터 불러오기
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 2. 전처리
X_train = X_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0
X_test = X_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 3. CNN 모델 정의
model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)),
MaxPooling2D(pool_size=(2,2)), # 각 구역(2x2 크기)에서 최대값 추출
Conv2D(64, (3,3), activation='relu'),
MaxPooling2D(pool_size=(2,2)),
Flatten(), # 2D 정보를 1D로 변경
Dense(128, activation='relu'),
Dense(10, activation='softmax') # 10개의 클래스 분류
])
# 4. 컴파일 & 학습
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, validation_split=0.2, epochs=5, batch_size=128)
# 5. 평가
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"테스트 정확도: {test_acc:.4f}")
📈 결과 확인 (시각화)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
✅ 마무리
CNN을 이용하면 복잡한 전처리 없이도 이미지 인식이 가능합니다.
MNIST 숫자 인식은 딥러닝 이미지 분류 입문에 가장 적합한 프로젝트입니다.
Share article