이미지 인식 - CNN

2024. 7. 17. 16:47·빅데이터 분석가 양성과정/Python - 딥러닝
목차
  1. 이미지 인식하는 원리
  2. 학습 데이터 셋 준비
  3. 클래스 데이터 준비
  4. 딥러닝 기본 프레임 만들기
  5. 학습/테스트 셋 의 오차 시각화
  6. 은닉층 추가
  7. 은닉층 + Dropout 추가
  8. 컨볼루션 신경망
  9. 맥스 폴링, 드롭아웃, 플래트

이미지 인식하는 원리


    
python
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

 


    
python
print("shape of 'X_train':", X_train.shape)
print("type of 'X_train' :", type(X_train) )

 


    
python
print("shape of 'X_train[0]':", X_train[0].shape)
print("type of 'X_train[0]' :", type(X_train[0]) )

 


    
python
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='Greys')
plt.show()

 


    
python
#라벨 출력
y_train[0] # 5

    
python
import sys
for pixel_line in X_train[0]:
for pixel in pixel_line:
sys.stdout.write("%-4s" % pixel)
sys.stdout.write('\n')

 


    
python
X_train.shape

 

학습 데이터 셋 준비


    
python
X_train = X_train.reshape( X_train.shape[0], 784)
  • 케라스는 데이터를 0~1 사이의 값으로 변환한 후 구동할 때 최적의 성능을 보임

    
python
# 정규화(normalization) : 0 ~ 1사이의 값으로 변경
X_train = X_train.astype('float64') # 실수형으로 변경
X_train = X_train / 255 # 정규화 0~1 사의 값으로 변경

 

클래스 데이터 준비


    
python
# 클래스 값을 확인해 봅니다.
print("class : %d " % (y_train[0]) )
# 바이너리화 과정을 실습해 봅니다.
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(y_train[0])

 


    
python
# 이미지를 인식하는 원리
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import sys
# MNIST 데이터셋을 불러와 학습셋과 테스트셋으로 저장
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 학습셋과 테스트셋이 각각 몇 개의 이미지로 되어 있는지 확인
print("학습셋 이미지 수 : %d 개" % (X_train.shape[0]))
print("테스트셋 이미지 수 : %d 개" % (X_test.shape[0]))
# 첫 번째 이미지를 확인
plt.imshow(X_train[0], cmap='Greys')
plt.show()
# 이미지가 인식되는 원리를 알아봅시다.
for x in X_train[0]:
    for i in x:
        sys.stdout.write("%-3s" % i)
    sys.stdout.write('\n’)
# 차원 변환 과정을 실습해 봅니다.
X_train = X_train.reshape(X_train.shape[0], 784)
X_train = X_train.astype('float64')
X_train = X_train / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float64') / 255
# 클래스 값을 확인해 봅니다.
print("class : %d " % (y_train[0]) )
# 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(y_train[0])

 

딥러닝 기본 프레임 만들기


    
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
import os
# MNIST 데이터를 불러옵니다.
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 차원 변환 후, 테스트셋과 학습셋으로 나누어 줍니다.
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

    
python
# 모델 구조를 설정합니다.
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()

 


    
python
# 모델 실행 환경을 설정합니다.
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 최적화를 위한 설정 구간입니다.
modelpath="./MNIST_MLP.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, 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_split=0.25,
epochs=30,
batch_size=200,
verbose=0,
callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도를 출력합니다.
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 

학습/테스트 셋 의 오차 시각화


    
python
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Validset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시해 보겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

 


    
python
# MNIST 데이터 로드
from tensorflow.keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 모델 구조 설계 및 컴파일
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(10, input_dim=784, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# 모델을 훈련(학습) 실행
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200, batch_size=128, verbose=0)
                                       
# 테스트 데이터셋에 대한 적확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 


    
python
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(10, input_dim=784, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200, batch_size=128, verbose=0)
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 


    
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. 데이터 준비 ------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 -----------------------------------------------
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
# 모델 훈련(학습) 실행 ------------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
batch_size=200,verbose=0)
# 테스트 데이터셋에 대한 정확도를 출력 ------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 

은닉층 추가


    
python
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
# 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(128, input_dim=784, activation='relu', name='dense_layer_1'))
model.add(Dense(128, activation='relu', name='dense_layer_2'))
model.add(Dense(10, activation='softmax', name='dense_layer_3'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd',
metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
batch_size=128, verbose=0)
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 

은닉층 + Dropout 추가


    
python
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
# 1. 데이터 준비 -------------------------------------------------------------
(X_train, y_train), (X_test, y_test) = mnist.load_data()
  # X_train은 60,000개 행과 28 x 28 = 784 개 열(속성)으로 reshape 후 정규화
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
  # 레이블(클래스)를 원-핫 인코딩
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
# 2. 모델 구조 설계 및 컴파일 ------------------------------------------------
model = Sequential()
model.add(Dense(128, input_dim=784, activation='relu', name='dense_layer_1'))
model.add(Dropout(0.3))
model.add(Dense(128, activation='relu', name='dense_layer_2'))
model.add(Dropout(0.3))
model.add(Dense(10, activation='softmax', name='dense_layer_3'))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='sgd',
              metrics=['accuracy'])
# 3. 모델을 훈련(학습) 실행 --------------------------------------------------
history = model.fit(X_train, y_train, validation_split=0.25, epochs=200,
                    batch_size=128, verbose=0)
                                       
# 4. 테스트 데이터셋에 대한 정확도 출력 --------------------------------------
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 

컨볼루션 신경망

  • 입력된 이미지에서 다시 한 번 특징을 추출하기 위해 커널(스라이딩 원도우)을 도입하는 기법

  • 기본 딥러닝 프레임에 이미지 인식 분야에서 강력한 성능을 보이는 컨볼루션 신경망(Convolutional Neural Network, CNN)을 얹어 보겠음.

 


    
python
model.add(Conv2D(32,
                 kernel_size=(3,3),
                 input_shape=(28,28, 1),
                 activation='relu'))

 

맥스 폴링, 드롭아웃, 플래트

맥스 폴링

  • 정해진 구역 내에서 최댓값을 뽑아내는 맥스 폴링

드롭아웃(drop out)
  • 은닉층에 배치된 노드 중 일부를 임의로 꺼 주는 것

플래튼

  • 데이터를 1차원 배열로 변경


    
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import numpy as np
# 데이터를 불러옵니다.
(X_train, y_train), (X_test, y_test) = 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)
# 컨볼루션 신경망의 설정
model = 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,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 = Sequential()
# model.add(Conv2D(32, kernel_size=(3, 3), input_shape=(28, 28, 1), activation='relu'))
# model.add( MaxPooling2D( pool_size=(2,2) ) )
# model.add(Conv2D(64, (3, 3), activation='relu'))
# model.add( MaxPooling2D( pool_size=(2,2) ) )
# model.add( MaxPooling2D( pool_size=(2,2), strides=(2,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'])
# 모델 최적화를 위한 설정 구간입니다.
modelpath="./MNIST_CNN.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath,
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_split=0.25,
epochs=30,
batch_size=200,
verbose=0,
callbacks=[early_stopping_callback,checkpointer])
# 테스트 정확도를 출력합니다.
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 


    
python
# 검증셋과 학습셋의 오차를 저장합니다.
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='validset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시하겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

 

 

'빅데이터 분석가 양성과정 > Python - 딥러닝' 카테고리의 다른 글

순환 신경망(Recurrent Neural Network, RNN)  (0) 2024.07.17
딥러닝을 이용한 자연어 처리  (1) 2024.07.17
실습  (0) 2024.07.17
모델 성능 향상  (1) 2024.07.17
모델 성능 검증  (0) 2024.07.17
  1. 이미지 인식하는 원리
  2. 학습 데이터 셋 준비
  3. 클래스 데이터 준비
  4. 딥러닝 기본 프레임 만들기
  5. 학습/테스트 셋 의 오차 시각화
  6. 은닉층 추가
  7. 은닉층 + Dropout 추가
  8. 컨볼루션 신경망
  9. 맥스 폴링, 드롭아웃, 플래트
'빅데이터 분석가 양성과정/Python - 딥러닝' 카테고리의 다른 글
  • 순환 신경망(Recurrent Neural Network, RNN)
  • 딥러닝을 이용한 자연어 처리
  • 실습
  • 모델 성능 향상
분석가 황규진
분석가 황규진
공공기관 위험평가관련 부서에서 근무하고 있습니다.
글쓰기 관리
분석가 황규진
HGJ's Insight
홈
|
로그인
  • 전체 글 555
    • 개인 공부 36
      • Tableau Bootcamp 10
      • 직무 공부 22
    • 자격증 7
      • 빅데이터분석기사 1
      • 정보처리기사 1
      • 경영정보시각화 1
      • SQL개발자(SQLD) 1
      • 데이터 분석 준전문가(ADsP) 1
      • 통계적품질관리(SPC) 1
      • AICE Associate 1
    • 개인 활동(일상) 3
      • 독서 2
      • 근황 공유 1
    • 강의 12
      • 강의 - 메타코드M 8
      • 현직자 특강 & 인터뷰 4
    • 코드 정리 11
      • 코드 정리 - Tistory 8
      • 코드 정리 - Python 3
    • 코딩테스트연습 116
      • SQL_프로그래머스 116
    • 취업사관학교 9기 199
      • 모닝스쿨 54
      • 스스로 모닝스쿨 125
      • 직무 스터디 20
      • 반성과 다짐 0
    • 빅데이터 분석가 양성과정 174
      • Python 88
      • Python - 머신러닝 26
      • Python - 딥러닝 32
      • PyQt 4
      • JavaScript 10
      • MySQL 13
      • Node.js 1
hELLO· Designed By정상우.v4.6.1
분석가 황규진
이미지 인식 - CNN
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.