IT shoveler

(Part 5) Python OpenCV로 예제 결과 확인

작성일 작성자 최혁두

우분투(Ubuntu) 설치에서 파이썬(Python) Deep Learning 까지!

  1. 우분투(Ubuntu) 14.04 64bit 설치 및 기본 설정
  2. CUDA 설치
  3. 가상환경에 Theano 설치
  4. Keras 설치 & MNIST 예제 실행
  5. Python OpenCV로 예제 결과 확인

앞에서 실행한 예제가 실제로 잘 돌아가는 것인지 확인하려면 이미지와 숫자 클래스를 비교해보는 수밖에 없다.

겨우 이미지 띄우는데 OpenCV까지 동원할 필요는 없지만 앞으로 deep learning 기반 컴퓨터 비전을 계속하려면

OpenCV 사용이 필수일 것 같아 Python OpenCV를 써보기로 했다.

Python3를 위한 OpenCV 설치는 여기를 참고한다.


아무래도 신경망 학습에는 시간이 좀 들기 때문에 테스트를 하고 싶을 때마다 학습을 시키는 것은 시간 낭비가 심하다.

그래서 신경망을 학습시킨 후 파일로 저장했다가 테스트하고 싶을 때 파일을 통해 신경망을 복원하고 테스트를 하는 것이 효율적이다.

그래서 mnist_cnn.py 파일을 두 개로 나누었다.

mnist_train_save_cnn.py : 이름대로를  신경망을 학습시키고 그 결과 신경망을 파을일로 저장하는 스크립트

mnist_load_predict_cnn.py : 이름대로 파일로 저장된 신경망을 불러와서 테스트 데이터로 신경망을 테스트 하는 스크립트.

OpenCV로 이미지를 화면에 띄워서 결과를 직접 확인


Keras로 만든 신경망을 어떻게 저장하고 불러올 수 있을까?

Keras 홈페이지의 여기에서 답을 찾을 수 있었다.

신경망 모델(구조)는 json이나 yaml 파일로 저장하고 신경망의 weight는 HDF5 포맷으로 저장할 수 있다.

그래서 이전 글에서 pyyaml과 h5py를 설치한 것이다.

'mnist_train_save_cnn.py'를 실행하면 'mnist_cnn_arch.json' 파일과 'mnist_cnn_weights.h5' 파일이 생긴다.

그 후 'mnist_load_predict_cnn.py'를 실행하면 이미지가 뜨고 신경망의 결과가 보인다.

(파이썬 코드 실행은 'python file.py'로 실행한다.)

predicted vector [[  8.29102476e-09   1.79802253e-08   4.84173597e-06   1.50648560e-07
    4.89943197e-09   1.08263598e-09   1.49807673e-12   9.99994636e-01
    2.13977369e-08   2.93721996e-07]]
predicted class [7]

숫자 7 이미지에 대해 7번째 클래스가 0.9999의 확률을 받아 7번째 클래스로 분류되었다.

코드는 테스트 데이터의 10개 숫자만 순서대로 확인하게 했으니 알아서 더 늘려보길...

코드를 붙이며 '우분투(Ubuntu) 설치에서 파이썬(Python) Deep Learning 까지!' 시리즈를 마무리 한다.


mnist_train_save_cnn.py

#!/home/hyukdoo/Work/Keras/env/bin/python
'''Train a simple convnet on the MNIST dataset.

Run on GPU: THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python mnist_cnn.py

Get to 99.25% test accuracy after 12 epochs (there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''

from __future__ import print_function
import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.utils import np_utils

batch_size = 128
nb_classes = 10
nb_epoch = 12

# input image dimensions
img_rows, img_cols = 28, 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = 2
# convolution kernel size
nb_conv = 3

# the data, shuffled and split between tran and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

model.add(Convolution2D(nb_filters, nb_conv, nb_conv,
                        border_mode='valid',
                        input_shape=(1, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, nb_conv, nb_conv))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adadelta')

model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
          show_accuracy=True, verbose=1, validation_data=(X_test, Y_test))
score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

# save cnn
json_string = model.to_json()
open('mnist_cnn_arch.json', 'w').write(json_string)
model.save_weights('mnist_cnn_weights.h5', overwrite=True)


mnist_load_predict_cnn.py

#!/home/hyukdoo/Work/Keras/env/bin/python
'''Train a simple convnet on the MNIST dataset.

Run on GPU: THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python mnist_cnn.py

Get to 99.25% test accuracy after 12 epochs (there is still a lot of margin for parameter tuning).
16 seconds per epoch on a GRID K520 GPU.
'''

from __future__ import print_function
import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import model_from_json
import cv2

batch_size = 128
nb_classes = 10
nb_epoch = 12

# input image dimensions
img_rows, img_cols = 28, 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = 2
# convolution kernel size
nb_conv = 3

# the data, shuffled and split between tran and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

# read model and weights to reconstruct network
model = model_from_json(open('mnist_cnn_arch.json').read())
model.load_weights('mnist_cnn_weights.h5')

# compare 10 test images and prediction results step by step
for i in range(10):
    predicted_vector = model.predict(X_test[i:i+1,0:1], batch_size=1, verbose=0)
    predicted_class = model.predict_classes(X_test[i:i+1,0:1], batch_size=1, verbose=1)
    print('predicted vector', predicted_vector)
    print('predicted class', predicted_class)
    cv2.imshow('image', X_test[i,0]*256)
    cv2.waitKey(0)




맨위로
통합 검색어 입력폼