사람 정면, 측면 구별해보기

HyeonKi Jo·2022년 7월 25일
0

인트로

  • 머신러닝, 이미지 분석을 잊지않기위해, 연습으로 사람의 정면 측면을 구별해보자.
  • 데이터는 AI허브에서 랜덤으로 가져온 데이터를 사용한다.

컴퓨팅 자원 확인

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

데이터 전처리하기

데이터 확인하기

from PIL import Image
import matplotlib.pyplot as plt

img = Image.open(이미지경로)	# PIL.Image로 이미지를 읽는다.
plt.imshow(img) # maplotlib.pyplot으로 그래프를 생성하고 거기에 읽은 이미지를 올린다.

데이터 분류하기

  • 데이터를 수작업으로 직접 Front와 Side폴더로 약 100장씩 나누었다.

반복문을 사용해 이미지 전처리 및 라벨링하기

import numpy as np
import os

PATH = 'Front, Side폴더가 있는 경로'
def resizin_image(file_path):	# 이미지 경로를 받아. 전처리해서 반환해주는 함수
    img = Image.opne(file_path).convert("L")	#이미지를 읽어온다. 읽어올때 그레이스케일(흑백)해준다.
    											# 컬러(R,G,B)=정수3개, 흑백(명암)=정수1개, 더 작고, 더 빠르게 계산된다. 
    imgarr = np.array(img, dtype=np.float32)	# np.array(np.float32)로 만들어서 학습시킬 것이다.
    imgarr = imgarr/255.0						# 데이터 정규화(normalize)해준다. 1~255 -> 0~1
    return imgarr

data = []	# 데이터를 저장할 리스트
for label, folder in enumerate(['Front', 'Side']):		# 정면과 측면폴더 둘다 읽을것이다.
												# enumerate는 리스트의 인덱스를 같이 반복문에서 사용할 수 있게 해준다.
                                                # 즉 (0, 'Front'), (1, 'Side')로 사용할 수 있고, 인덱스는 머신러닝에서 label로 사용할 것이다. 
                                                # 0-> Front, 1-> Side
    image_path = PATH + '/' + folder			# 이미지가 있는 경로
    image_list = os.listdir(image_path)			# 이미지 경로에 있는 모든 파일의 이름을 리스트로 반환
    for image in image_list:					# 이미지 경로에 있는 모든 파일에 대해 반복문
        data.append([resizeing_image(image_path+'/'+image), label]) # 데이터에는 [이미지데이터, 라벨] 형식으로 들어간다.

Train, Test 분리

DataFrame으로 만들기

import pandas as pd
df = pd.DataFrame(data, columns=['data', 'label']

Train, Test 분리

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(np.array(df.data.tolist()).astype(np.float32), np.array(df.label.tolist()).astype(np.int32), test_size=0.2, shuffle=True)

모델 만들기

import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50
with tf.device('/gpu:0'):
    '''					# ResNet50 모델을 사용해봤지만, 정확도가 좋지 않았다.
    model = ResNet50(
        include_top=True,
        weights=None,
        input_shape=(360,480,1),
        pooling=max,
        classes=1
    )
    '''
    model = tf.keras.Sequential([	# 간단한 모델 생성
        tf.keras.layers.Flatten(input_shape=(입력할 이미지의 해상도(x, y))),
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dropout(0.5),	# 과대적합을 막기위해 Dropout을 50% 준다.
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(16, activation='relu'),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(2)	# Front, Side 최종 결과는 2가지중 하나로 나올 것이다.
    ])
    model.summary()

모델 컴파일

from tensorflow.keras import optimizers, losses, metrics

model.compile(optimizer=optimizers.Adam(learning_rate=1e-3),
            loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
  • 옵티마이저는 Adam을 사용한다. (평균적으로 좋다고 한다.)
  • loss는 SparseCategoricalCrossentropy를 사용한다.
  • metrics는 accuracy, 정확도로 측정할 것이다.

모델 학습

history = model.fit(
    x_train, y_train,	# 학습할 때, 문제와 정답
    batch_size=10,		# 한번학습할 때, 사용할 데이터의 수.
    					# 현재 컴퓨터의 메모리 크기에 따라 조정하면된다. 메모리가 부족하면 숫자를 적게
    epochs=10			# 학습 반복 수.

학습한 모델 저장

import tensorflow as tf

model.save('저장할 경로')
profile
Talking Potato

0개의 댓글

관련 채용 정보