2022년 1월 4일

1-7 미니 프로젝트 : 가위바위보 분류기를 만들자

디렉토리 만들기

$ mkdir -p ~/aiffel/rock_scissor_paper/scissor
$ mkdir -p ~/aiffel/rock_scissor_paper/rock
$ mkdir –p ~/aiffel/rock_scissor_paper/paper

$ ls -l ~/aiffel/rock_scissor_paper

토막 리눅스 사용법

mkdir -p : mkdir를 사용하여 하위 디렉토리를 생성할때 차례대로 만들지 않고 중간 디렉토리 없이 바로 그 다음 하위 디렉토리를 만들게되면 "디렉토리를 생성할 수 없습니다." 라는 메시지가 나오는데, -p 옵션을 주어 생성하게 되면 자동으로 중간 단계의 디렉토리를 생성하면서 그 하위 디렉토리를 생성하게 됩니다.

데이터는 아이펠의 것으로~

rock_scissor_paper/paper 폴더 내 이미지 사용

데이터 불러오기 + Resize 하기

  • 숫자 손글씨의 경우 이미지 크기가 28x28 이었기 때문에, 가위, 바위, 보 이미지도 28x28로 만들기
  • 이를 위해서는 PIL 라이브러리를 사용하기, 라이브러리 부르기

1 from PIL import Image
2 import glob
3
4 print("PIL 라이브러리 import 완료!")

코드 실행 :
PIL 라이브러리 import 완료!

  • 가위 이미지를 불러와서 28x28 사이즈로 변경, 아래 코드를 실행

1 def resize_images(img_path):
2 images=glob.glob(img_path + "/*.jpg")
3
4 print(len(images), " images to be resized.")
5
6 # 파일마다 모두 28x28 사이즈로 바꾸어 저장합니다.
7 target_size=(28,28)
8 for img in images:
9 old_img=Image.open(img)
10 new_img=old_img.resize(target_size,Image.ANTIALIAS)
11 new_img.save(img, "JPEG")
12
13 print(len(images), " images resized.")
14
15 # 가위 이미지가 저장된 디렉토리 아래의 모든 jpg 파일을 읽어들여서
16 image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper/scissor"
17 resize_images(image_dir_path)
18
19 print("가위이미지 resize 완료!")

코드 실행 :
100 images to be resized.
100 images resized.
가위이미지 resize 완료!

바위, 보도 마찬가지로 진행~ 완료!!

  • 가위, 바위, 보 데이터를 읽을 수 있는 load_data() 함수를 만들어 준다.

import numpy as np

def load_data(img_path, number_of_data=300): # 가위바위보 이미지 개수 총합에 주의!!

# 가위 : 0, 바위 : 1, 보 : 2
img_size=28
color=3
#이미지 데이터와 라벨(가위 : 0, 바위 : 1, 보 : 2) 데이터를 담을 행렬(matrix) 영역을 생성합니다.
imgs=np.zeros(number_of_data*img_size*img_size*color,dtype=np.int32).reshape(number_of_data,img_size,img_size,color)
labels=np.zeros(number_of_data,dtype=np.int32)

idx=0
for file in glob.iglob(img_path+'/scissor/*.jpg'):
    img = np.array(Image.open(file),dtype=np.int32)
    imgs[idx,:,:,:]=img    # 데이터 영역에 이미지 행렬을 복사
    labels[idx]=0   # 가위 : 0
    idx=idx+1

for file in glob.iglob(img_path+'/rock/*.jpg'):
    img = np.array(Image.open(file),dtype=np.int32)
    imgs[idx,:,:,:]=img    # 데이터 영역에 이미지 행렬을 복사
    labels[idx]=1   # 바위 : 1
    idx=idx+1  

for file in glob.iglob(img_path+'/paper/*.jpg'):
    img = np.array(Image.open(file),dtype=np.int32)
    imgs[idx,:,:,:]=img    # 데이터 영역에 이미지 행렬을 복사
    labels[idx]=2   # 보 : 2
    idx=idx+1
    
print("학습데이터(x_train)의 이미지 개수는", idx,"입니다.")
return imgs, labels

image_dir_path = os.getenv("HOME") + "/aiffel/rock_scissor_paper"
(x_train, y_train)=load_data(image_dir_path)
x_train_norm = x_train/255.0 # 입력은 0~1 사이의 값으로 정규화

print("x_train shape: {}".format(x_train.shape))
print("y_train shape: {}".format(y_train.shape))

코드실행 :
학습데이터(x_train)의 이미지 개수는 300 입니다.
x_train shape: (300, 28, 28, 3)
y_train shape: (300,)

import matplotlib.pyplot as plt

plt.imshow(x_train[0])
print('라벨: ', y_train[0])

실행 완료 : 라벨: 0

딥러닝 네트워크 설계하기

import tensorflow as tf
from tensorflow import keras
import numpy as np

model = keras.models.Sequential()
model.add(keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(224,224,3)))
model.add(keras.layers.MaxPool2D(2,2))
model.add(keras.layers.Conv2D(32, (3,3), activation='relu'))
model.add(keras.layers.MaxPooling2D((2,2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(32, activation='relu'))
model.add(keras.layers.Dense(3, activation='softmax'))

print('Model에 추가된 Layer 개수: ', len(model.layers))
model.summary()

코드 실행 :
Model에 추가된 Layer 개수: 7
Model: "sequential_1"

layer Output Shape Param ============================================================
conv2d_2 (Conv2D) (None, 222, 222, 16) 448


max_pooling2d_2 (MaxPooling2 (None, 111, 111, 16) 0


conv2d_3 (Conv2D) (None, 109, 109, 32) 4640


max_pooling2d_3 (MaxPooling2 (None, 54, 54, 32) 0


flatten_1 (Flatten) (None, 93312) 0


dense_2 (Dense) (None, 32) 2986016


dense_3 (Dense) (None, 3)99 ==========================================================
Total params: 2,991,203
Trainable params: 2,991,203
Non-trainable params: 0


딥러닝 네트워크 학습시키기

이곳부터 길을 잃고 헤매이고 있습니다. 다음에 이어서 시도를 해 보겠습니다.

오늘의 소감 : 하나씩 비교해 가면서, 천천히 읽으면서 내용을 이해하고 적용해 나가는 과정에서 실행이 되는 즐거움과 실행이 되지 않을 때의 고민이 충돌하는 하루였네.. 그래도 같이 하기엔 도움을 받고, 다른님들은 어찌하는지도 듣고... 잘 해 보자!!

좋은 웹페이지 즐겨찾기