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
딥러닝 네트워크 학습시키기
이곳부터 길을 잃고 헤매이고 있습니다. 다음에 이어서 시도를 해 보겠습니다.
오늘의 소감 : 하나씩 비교해 가면서, 천천히 읽으면서 내용을 이해하고 적용해 나가는 과정에서 실행이 되는 즐거움과 실행이 되지 않을 때의 고민이 충돌하는 하루였네.. 그래도 같이 하기엔 도움을 받고, 다른님들은 어찌하는지도 듣고... 잘 해 보자!!
Author And Source
이 문제에 관하여(2022년 1월 4일), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@min2sun1/2022년-1월-4일저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)