딥러닝/이미지처리

학습된 CNN모델에 직접 사진 test하기

씩씩한 IT블로그 2020. 6. 27. 21:20
반응형

1. 필요 모듈, 함수 구성

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# jpg 이미지를 숫자로
def jpg_image_to_array(image_path, size):
    # open image
    image = Image.open(image_path)      
    # resize (클수록 선명하지만 느릴 수 있다)
    image = image.resize((size, size))  
    # convert to int ndarray
    im_arr = np.fromstring(image.tobytes(), dtype=np.uint8)  
    # 모양확인 변수 .shape
    print(im_arr.shape)
    
    
    '''
    # 3차원으로 바꾸기
    im_arr[n][m][d]=> n,m위치의 d차원(r,g,b,중 하나)의 회색조값
    
    가로새로 28개
    [
    [[255,255,255],[255,255,255],[255,255,255],...[255,255,255]],
    [[255,255,255],[255,255,255],[255,255,255],...[255,255,255]],
    [[255,255,255],[255,255,255],[255,255,255],...[255,255,255]],
    .
    .
    .
    [[255,255,255],[255,255,255],[255,255,255],...[255,255,255]]
    ]
    
    '''
    # reshape to (28, 28, 3)
    im_arr = im_arr.reshape((image.size[0], image.size[1], 3)) 
    print(im_arr.shape)
    
    # 흑백 반전, 색이 클수록 밝으므로 -1을 곱하고 255더하면 해당차원(R or G or B 색조의) 밝은곳은 어두워지고, 어두운곳은 밝아짐 
    # (ex 완전한 초록색은 정반대의 색깔인 완전한 노란색)
    im_arr = im_arr*(-1)+255   
    return im_arr

# convert to 1-channel by averaging
def image_array_to_1channel(arr):
    arr_avg = (arr[:,:,0]+arr[:,:,1]+arr[:,:,2])/3   
    return arr_avg

 

2. 모델 불러오기, 확인

#모델 불러오기
from tensorflow.python.keras.models import load_model

model = load_model("cnn_mnist.h5")
model.summary()

 

3. 함수 작동 확인

path = "MNIST/1/1.jpg"

# 1. 그림->숫자 함수 확인
arr = jpg_image_to_array(path, 28)
plt.imshow(arr, cmap=plt.get_cmap('gray'))

# 2. 1채널화 함수 확인

'''
[
[255,255,255,...255]
[255,255,255....255]
.
.
.
[255,255,255....255]
]
'''
arr_1c = image_array_to_1channel(arr) #원채널로
print(arr_1c.shape)


'''
[
[
[[255],[255],[255],...[255]]
[[255],[255],[255],...[255]]
.
.
.
[[255],[255],[255],...[255]]
]
]
'''
img_rows, img_cols = 28, 28
x_train = arr_1c.reshape(1, img_rows, img_cols, 1) #CNN모델에 적용할수 있게
print(x_train.shape)

y_pred = model.predict_classes(x_train)

 

4. 정식으로 파일 불러오기, test 데이터셋 정리

import os
dir = "MNIST"

#폴더내의 모든 폴더or파일의 이름을 반환 os.listdir(), subdir_names=['1','2','5']
subdir_names = os.listdir(dir)


X_test = []
y_test = []
# (MNIST폴더)에서 (MNIST\\하위폴더)로 들어감
for subdir_name in subdir_names:
    subdir = dir+"\\"+subdir_name
    file_names = os.listdir(subdir) #해당폴더에 모든 파일을 입력
    for file_name in file_names:
        print("-------------  현재 파일이름 :",file_name,"---------------")
        path = subdir+"\\"+file_name
        arr = jpg_image_to_array(path, 28) #path는 상대경로로서 현재 디렉토리에서 하위로 들어감
        arr_1c = image_array_to_1channel(arr)  # convert to 1-channel
        print(arr_1c.shape)        
        if len(X_test)==0:
            X_test = [arr_1c]
            y_test = int(subdir_name)
            print("[ 현재 폴더 : ",subdir_name,"]")
        else:
            X_test = np.concatenate((X_test, [arr_1c]))
            y_test = np.append(y_test, int(subdir_name))
            print("[ 현재 폴더 : ",subdir_name,"]")

# CNN적용위해 끝차원 하나 늘림
print(X_test.shape)
X_test = np.expand_dims(X_test, axis=-1)
print(X_test.shape)
<<output>>
(4, 28, 28) 
(4, 28, 28, 1)

 

5. 예측값 확인

# 모델을 통한 예측값
y_pred = model.predict_classes(X_test)
print(y_pred)
array([1, 2, 5, 5], dtype=int64)

 

6. 실제값과 예측값 비교

from tensorflow.keras import utils

# 결과값 원핫코딩
y_binary = utils.to_categorical(y_test, 10)
print(y_binary)

#평가
score = model.evaluate(X_test, y_binary)
print('test_loss: ', score[0])
print('test_acc: ', score[1])

 

반응형