전에 설명했던 숫자 이미지 하나 불러와서 숫자 맞추기를 이용하여 이번에는 직접 손으로 쓴 숫자를 이미지를 사용하여 맞추기를 해보겠습니다이미지를 만드는게 귀찮았는데 오늘은 시간이 좀 남아서 시도해 보았습니다.

 

1. 숫자 이미지 만들기

2. 디렉토리 생성

3. 코딩

4. 결과

5. 전체 소스

 


1. 숫자 이미지 만들기

 

숫자 이미지는 이미지 편집 프로그램이 없다면 윈도우즈 보조프로그램에 기본적으로 들어있는 그림판을 이용해서 만들면 됩니다.


tensorflow_mnist


그림판에 마우스를 이용해서 3을 써보았습니다. 좀 덜덜거리며 씌여졌지만 처음 한번 쓴걸 사용하기로 했습니다숫자를 적었으니 저장을 합니다.

 

파일 > 다른 이름으로 저장 > PNG


물론 다른 이미지로 저장을 해도 됩니다그럼 불러올 때 그에 맞추어서 소스를 수정해 사용하시면 되고요.


tensorflow_mnist


tensorflow_model03.png로 저장을 했습니다

tensorflow_mnist


2. 디렉토리 생성

 

손으로 작성한 숫자 이미지를 저장할 위치를 만들었습니다그리고 숫자 이미지는 number 디렉토리로 이동을 했습니다전에 테스트 했던 9도 아직 삭제를 안해서 같이 있네요.


tensorflow_mnist



3. 코딩

 

처음에 나오는 부분은 전에 설명했던 부분이고 이미지를 불러오는 부분부터 변경이 되었습니다기존에는 이미지 사이즈가 테스트 하기에 적당한 크기 였지만 이번에는 사이즈를 조정해야 해서 변경을 하였습니다.

 

이미지를 cv2를 이용해서 불러오고 화면에 출력을 해 봅니다.


gray = cv2.imread("F:/tensordata/number/tensorflow_model03.png", cv2.IMREAD_GRAYSCALE)

plt.imshow(gray)

plt.show() 


불러온 이미지의 사이즈를 테스트에 적합 하게 수정해 줍니다.


gray = cv2.resize(255-gray, (28, 28))

test_num = gray.flatten() / 255.0

test_num = test_num.reshape((-1, 28, 28, 1))


변경된 이미지를 사용하여 숫자 번호가 몇인지 알아맞춰 봅니다.


print('The Answer is ', model.predict_classes(test_num))



4. 결과

 

The Answer is  [3] 이라고 하는군요정답 입니다.


tensorflow_mnist



5. 전체 소스


import tensorflow as tf

import matplotlib.pyplot as plt

from PIL import Image

mnist = tf.keras.datasets.mnist

import cv2

 

(x_train, y_train),(x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0

 

model = tf.keras.models.Sequential([

  tf.keras.layers.Flatten(),

  tf.keras.layers.Dense(512, activation=tf.nn.relu),

  tf.keras.layers.Dropout(0.2),

  tf.keras.layers.Dense(10, activation=tf.nn.softmax)

])

model.compile(optimizer='adam',

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy'])

 

model.fit(x_train, y_train, epochs=5)

score = model.evaluate(x_test, y_test)


# 이미지 불러와 출력

gray = cv2.imread("F:/tensordata/number/tensorflow_model03.png", cv2.IMREAD_GRAYSCALE)

plt.imshow(gray)

plt.show()


# 이미지 사이즈 변경

gray = cv2.resize(255-gray, (28, 28))

test_num = gray.flatten() / 255.0

test_num = test_num.reshape((-1, 28, 28, 1))


# 이미지 숫자 테스트 

print('The Answer is ', model.predict_classes(test_num))



텐서플로우 튜터리얼 첫페이지에 나오는 소스를 이용해서 숫자 이미지를 불러와 맞추는 테스트를 해보았습니다.



1. MNIST 소스 코드

 

먼저 tensorflow tutorial 페이지를 방문해 봅니다.


https://www.tensorflow.org/tutorials


tensorflow_mnist_keras


이런식으로 우측에 소스가 보입니다.

 

소스를 긁어다가 실행을 해 봅니다.


tensorflow_mnist_keras


tensorflow_mnist_keras


98%의 정확도를 가지고 있습니다.


tensorflow_mnist_keras


작업관리자를 확인해 보니 CPU가 매일 탱자탱자 노는 모습에 울화가 치밀었는데 드디어 오늘 일하는 모습을 보게 되어 기쁩니다.



2. 숫자 이미지

 

이제 숫자 이미지를 준비해야 하는데 따로 준비하기가 귀찮아 MNIST 데이터에 있는 숫자 이미지를 하나 복사해서 사용하기로 했습니다.


tensorflow_mnist_keras



3. 테스트 결과

 

우선 결과 화면을 보면 다음과 같습니다.


tensorflow_mnist_keras


잘 맞추었습니다.



4. 소스 설명

 

4.1 작업 관련 library import


import tensorflow as tf

import matplotlib.pyplot as plt

from PIL import Image


4.2 MNIST 데이터


MNIST 데이터를 불러와서 traintest용으로 분류 합니다.


mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0


4.3 tk.keras model


모델을 정의하고 어떤식으로 학습을 진행 할지 컴파일 환경을 설정 합니다.


model = tf.keras.models.Sequential([

  tf.keras.layers.Flatten(),

  tf.keras.layers.Dense(512, activation=tf.nn.relu),

  tf.keras.layers.Dropout(0.2),

  tf.keras.layers.Dense(10, activation=tf.nn.softmax)

])

model.compile(optimizer='adam',

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy']) 


4.4 훈련과 평가


model.fit(x_train, y_train, epochs=5)

score = model.evaluate(x_test, y_test) 


4.5 이미지 로딩


테스트를 진행할 이미지 한개를 불러와 규격에 맞춥니다.

여기서는 이미 규격화된 이미지라 사이즈 조정이 필요 없습니다.


test_num = plt.imread('F:/tensordata/number/58.png')

plt.imshow(test_num, cmap='Greys', interpolation='nearest');

test_num = test_num.reshape((1, 28, 28, 1)) 


4.6 예측

 

이미지를 이용하여 값을 예측하고 출력 합니다.


print('The Answer is ', model.predict_classes(test_num))

plt.show() 



5. 전체 소스


import tensorflow as tf

import matplotlib.pyplot as plt

from PIL import Image

 

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()

x_train, x_test = x_train / 255.0, x_test / 255.0

 

model = tf.keras.models.Sequential([

  tf.keras.layers.Flatten(),

  tf.keras.layers.Dense(512, activation=tf.nn.relu),

  tf.keras.layers.Dropout(0.2),

  tf.keras.layers.Dense(10, activation=tf.nn.softmax)

])

model.compile(optimizer='adam',

              loss='sparse_categorical_crossentropy',

              metrics=['accuracy'])

 

model.fit(x_train, y_train, epochs=5)

score = model.evaluate(x_test, y_test)

 

############ 추가 소스 ##################

img = Image.open("F:/tensordata/number/58.png")

plt.imshow(img)

plt.show()

 

test_num = plt.imread('F:/tensordata/number/58.png')

 

plt.imshow(test_num, cmap='Greys', interpolation='nearest');

 

test_num = test_num.reshape((1, 28, 28, 1))

 

print('The Answer is ', model.predict_classes(test_num))

plt.show() 


- copy coding -


1

+ Recent posts