CNN(Convolutional Neural Network)으로 손글씨 숫자 인식하기

KangHo Lee's avatar
Jun 20, 2025
CNN(Convolutional Neural Network)으로 손글씨 숫자 인식하기

🔢 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으로 숫자 인식하는 전체 흐름

  1. 데이터 불러오기
  1. 전처리: 정규화 + 라벨 인코딩
  1. 모델 구성 (CNN)
  1. 모델 학습
  1. 모델 평가 및 예측

💻 코드 예제 (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

devleekangho