Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] 머신러닝, 딥러닝 실전 앱 개발

머신러닝 모델로 내가 찍은 사진 평가하기

Kellyyyy 2020. 5. 15. 08:00

*저는 머신러닝/딥러닝에 관해 공부하고 있는 사람입니다.

잘못된 내용이나 참고할 만한 내용이 있다면 댓글로 남겨주시면 정말 감사드리겠습니다!

 

이번 포스팅에서는 지금까지 만들었던 MLP모델을 활용해서 내가 찍은 사진이 어떤 카테고리의 사진인지 평가해본다.

그러기 위해서는 다음과 같은 작업이 필요하다.

 

1. 내가 찍은 사진을 입력 형식에 맞게 가공하기

2. 예측 실행하고 결과 출력하기

 

STEP 1. 내가 찍은 사진을 입력 형식에 맞게 가공하기

 

우선 사진을 찍고 이미지를 jupyter notebook에 불러와보자.

 

귀여운 고양이 사진을 찍고 프로젝트 폴더에 cat.jpg라는 이름으로 저장했다.

cat.jpg

이제 OpenCV라는 이미지 라이브러리를 통해 이미지를 읽고, 가공할 것이다.

*OpneCV는 이미지 라이브러러리로, 자세한 내용은 OpenCV 포스팅을 참고해주세요.

imread 함수를 통해 이미지 파일을 읽을 수 있다.

 

 

import cv2
im = cv2.imread('cat.jpg') #사진 읽어들이기

#이미지 출력
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()

 

 

파이썬 imread함수

 

 

이제 본격적으로 이미지데이터를 전처리해보겠다.

나는 MLP모델을 생성할 때 아래와 같은 전처리 과정을 거쳤다.

 

32*32 픽셀의 RGB 형식 이미지데이터 -> 정규화한 1차원 배열

 

일단, 위 사진은 가로/세로 1000픽셀은 넘어보이고, 색공간도 일반적인 RGB형식이 아닌 것을 볼 수 있다.

색공간이 RGB형식이 아닌 이유는 OpenCV가 이미지를 읽을 때 BGR이라는 색공간으로 읽기 때문이다.

 

어쨋든, 나는 위 사진을 32*32 픽셀의 RGB형식의 이미지로 바꾼 다음에,

그 사진을 다시 정규화한 1차원 배열 형식으로 바꿀 것이다.

 

먼저 cvtColor라는 함수를 통해 BGR -> RGB로 색공간을 변환시켰다.

이미지 크기는 resize라는 함수를 통해 조정했다.

 

im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) #색공간 변환
im = cv2.resize(im, (32,32)) #사이즈 조정

#이미지 출력
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()

 

 

가공한 결과는 아래와 같다.

 

 

파이썬 resize, cvtColor함수

 

다음은 정규화한 1차원 배열로 바꿀 것이다.

이 과정은 데이터 전처리 포스팅에서 자세히 다뤘으므로 여기서는 결과만 다루겠다.

 

import numpy as np
im = im.reshape(-1,in_size)/ 255
im

 

 

파이썬 reshape()

 

 

STEP 2. 예측실행하고 결과출력하기

 

예측을 실행하기 위해서는 만들어 둔 예측모델을 불러와야한다. 

이때, 모델의 틀은 먼저 세팅해두어야한다. (입력층, 출력층 생성)

이전 포스팅에서 저장해 둔 'cifar10-weight.h5' 파일을 로드하여 모델을 완성시켰다.

 

그 후에 예측 label을 세팅했다. 

 

from keras.models import Sequential
from keras.layers import Dense

#입력 데이터 크기 : 32*32 픽셀, RGB형 이미지 데이터 (데이터 전처리 포스팅 참고)
in_size = 32*32*3 

#출력 데이터 크기 : 10개의 카테고리
num_classes = 10

model = Sequential()
#입력층 생성
model.add(Dense(512, activation='relu', input_shape=(in_size,)))
#출력층 생성
model.add(Dense(num_classes,activation='softmax'))

model.load_weights('cifar10-weight.h5')

labels = ["airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck"]

 

 

 

파이썬 load_weights() 함수

 

 

예측은 predict()라는 함수를 사용한다.

 

 

r = model.predict(im, batch_size=32, verbose=1)
r
res = r[0]

 

 

파이썬 predict() 함수

 

실행 결과를 보면 예측 결과 r은 2차원 배열 값이다.

정확한 이유는 모르겠지만, 추정해보면 입력 데이터 형식이 2차원 배열이라서가 아닐까 싶다..

예측결과를 받아오기 위해 res라는 변수에 r[0] 값을 할당했다.

 

예측한 결과를 출력하기 위해 가장 큰 값을 찾는 argmax()를 이용하여 가장 큰 값을 가진 label을 출력했다.

 

for i, acc in enumerate(res) :
    print(labels[i], "=", int(acc*100))
print("---")
print("예측한 결과 = " , labels[res.argmax()])

 

 

 

파이썬 argmax()함수

 

예측 결과는 bird..

애초에 정확도가 0.5를 남짓하는 모델이라서 별로 기대는 안 했지만 실망스럽다..ㅎㅎ

또 사진을 32*32로 변환해서 보니 사람이 봐도 고양이라는 것을 알기 힘들 것 같긴하다.

 

다음 포스팅에서는 좀 더 정확도 높은 모델인 CNN을 구현해보고 다른 사진들도 예측 해보겠다.

 

참고문헌 : 파이썬을 이용한 머신러닝, 딥러닝 실전 앱 개발