본문 바로가기
고려사이버대학교/Keras

[케라스 3주차] 알파벳 수화 이미지를 학습한 뒤 맞춰보기

by 꿈돌이. 2022. 3. 22.

케라스 딥러닝 3주차 두번째 과제로 '인공지능 경진대회(AI팩토리)'에서 주최한 문제를 직접 풀고, 제출까지 완료하는 것이다. 이 문제의 학습목표는 알파벳 수화 데이터셋에 대해 이해하고, 훈련셋의 이미지와 라벨을 같이 가시화하는 방법에 대해 이해하는 것이다.

 

  • 알파벳 수화 직접 배워보기 [참여]

문제 정의

알파벳 수화에 대해 학습해보자. 사전 지식이 없다고 가정했을 때, 사람은 어떻게 배우는지, 그리고 학습한 것을 어떻게 평가할 것인지도 알아보자.

 

실습

먼저 알파벳 수화 이미지 데이터셋을 다운받아야 한다. 그 다음 다운로드 받은 파일을 구글 코랩 서버에 업로드한 뒤 불러온다.

 

> 알파벳 수화 이미지 데이터셋 [다운로드]

 

구글 코랩 서버에 업로드된 파일

다운로드 받은 파일을 구글 코랩 서버에 업로드하면, 위 사진과 같이 'sign_mnist.npz' 파일이 나타난다.

 

import numpy as np

dataset = np.load('sign_mnist.npz')
x_train, y_train = dataset['x_train'], dataset['y_train']   #훈련셋
x_test, y_train = dataset['x_test'], dataset['y_test']   #시험셋

데이터셋은 크게 훈련셋(x_train, y_train)시험셋(x_test, y_test)으로 구분된다.

  • npz 확장자 : numpy의 array 파일

 

print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

(27455, 28, 28)   #샘플수, 행, 열
(27455,)
(7172, 28, 28)
(7172,)

훈련셋과 실험셋을 출력해보면 다음과 같은 결과를 확인할 수 있다. 첫번째 값 27455는 샘플 수, 두번째와 세번째 값은 각각 행과 열을 의미한다.

 

 

시험셋의 샘플 데이터 10개를 가시화 시켜보자.

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=10, figsize=(10, 13),   #nrows는 행개수, ncols는 열개수
                         subplot_kw={'xticks': [], 'yticks': []})   #x,y축 눈금 없애기

for i, ax in enumerate(axes.flat):   #0~9번째까지 반복
    ax.imshow(x_test[i], cmap = 'gray')   #이미지 색상은 흑백
    ax.set_title(str(i) + ': ?')   #타이틀은 물음표(?)로 지정
plt.show()

subplots을 이용하여, 10개의 작은 이미지를 보기 좋게 나타낸다.

 

import numpy as np

y_pred = ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']   #10개의 알파벳을 y_pred에 넣는다

np.savetxt('y_pred.csv', y_pred, fmt='%c')   #y_pred.csv파일을 텍스트 형태로 저장한다

알파벳 수화에 대해 기존에 알고 있다면, 각 손 모양 이미지가 의미하는 알파벳을 배열에 기록하여 파일로 저장한다.

 

알파벳 수화를 모른다면, 시험셋이 아닌 훈련셋을 보고 학습해본다. 훈련셋의 샘플 100개를 손 이미지와 라벨을 함께 나타낸다.

fig, axes = plt.subplots(nrows=10, ncols=10, figsize=(10, 13),   #행과 열은 10개씩, 사이즈는 가로10, 세로13
                         subplot_kw={'xticks': [], 'yticks': []})   #x,y축 눈금 없애기

alphabat = 'abcdefghijklmnopqrstuvwxyz'   #라벨값에 매핑되는 알파벳 입력

for i, ax in enumerate(axes.flat):
    ax.imshow(x_train[i], cmap = 'gray')
    title = alphabat[y_train[i]]   #타이틀 이름은 훈련셋으로
    ax.set_title(title)
plt.show()

 

출력된 훈련셋을 충분히 숙지하거나, 시험셋의 샘플과 유사한 것을 찾아내서 라벨을 기록하여 파일에 저장한다.

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=1, ncols=10, figsize=(10, 13), 
                         subplot_kw={'xticks': [], 'yticks': []})

for i, ax in enumerate(axes.flat):
    ax.imshow(x_test[i], cmap = 'gray')
    ax.set_title(str(i) + ': ?')
plt.show()

 

import numpy as np

y_pred = ['g', 'a', 'a', 'a', 'd', 'a', 'a', 'o', 'd', 'a']   #출력한 이미지셋과 같은 알파벳을 입력

np.savetxt('y_pred.csv', y_pred, fmt='%c')

코드를 실행해본 결과, 위 사진과 같이 'y_pred.csv'라는 파일이 생성되었다. 파일을 열면 라벨 값을 확인할 수 있다. 이 파일을 다운로드 받아서 제출하면 되는데, 예측한 값과 실제 값의 숫자가 일치하면 점수가 부여된다.

댓글