해당 포스팅은 수어 모션 인식 모델을 위한 데이터 수집 포스팅입니다.
[수어쉬워] 수어 교육 및 번역 플랫폼
30초 동안 랜드마크된 손동작 모션 데이터 들을 LSTM 모델로 학습하여 줍니다.
🌳 1. 데이터 준비
이전 포스팅에서 올린 seq 데이터를 준비해줍니다.
원래 1개씩 있는게 정상입니다
🌳 2. 환경설정
- os
import numpy as np
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
os.environ['TF_FORCE_GPU_ALLOW_GROWTH'] = 'true'
모델 학습을 위하여, GPU 1번을 , 사용할 것입니다.
- 데이터
actions = [
'안녕하세요',
'여러분',
'발표',
'시작',
'오늘',
'하루',
'어떻게',
'보내다'
]
data = np.concatenate([
np.load('../dataset/seq_안녕하세요_1658110324.npy'),
np.load('../dataset/seq_여러분_1658110324.npy'),
np.load('../dataset/seq_발표_1658110324.npy'),
np.load('../dataset/seq_시작_1658110324.npy'),
np.load('../dataset/seq_오늘_1658130330.npy'),
np.load('../dataset/seq_하루_1658130330.npy'),
np.load('../dataset/seq_어때_의문문_1658130330.npy'),
np.load('../dataset/seq_보내다_1658130330.npy')
], axis=0)
data.shape
액션명 및 data를 하나로 모아줍니다.
- 데이터 분리
x_data = data[:, :, :-1]
labels = data[:, 0, -1]
from tensorflow.keras.utils import to_categorical
y_data = to_categorical(labels, num_classes=len(actions))
y_data.shape
x_data와 y_data , labels 로 분류한 모습입니다.
from sklearn.model_selection import train_test_split
x_data = x_data.astype(np.float32)
y_data = y_data.astype(np.float32)
x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.1, random_state=2021)
print(x_train.shape, y_train.shape)
print(x_val.shape, y_val.shape)
sklearn을 이용하여, 학습과 테스트 데이터셋으로 나눠줍니다
- 모델
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential([
LSTM(64, activation='relu', input_shape=x_train.shape[1:3]),
Dense(32, activation='relu'),
Dense(len(actions), activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
model.summary()
모델로는 LSTM, relu, softmax를 사용합니다. 최적화 방식은 adam을 사용합니다.
- 학습
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau
history = model.fit(
x_train,
y_train,
validation_data=(x_val, y_val),
epochs=200,
callbacks=[
ModelCheckpoint('models/model.h5', monitor='val_acc', verbose=1, save_best_only=True, mode='auto'),
ReduceLROnPlateau(monitor='val_acc', factor=0.5, patience=50, verbose=1, mode='auto')
]
)
학습이 시작됩니다. 가장 최적화된 모델을 model.h5 파일명으로 저장해줍니다.
- 시각화
제대로 학습이 되면 좋지만 epoch를 할 수록 떨어지는 모습입니다.
- 최종 모델 데이터
앞에서 저장한 모션 데이터를 가지고 모션인식모델을 만들었습니다.
해당 포스팅은 유튜버 빵형의 개발도상국 채널을 보고 적용하고 쓴 글입니다.
https://www.youtube.com/watch?v=eHxDWhtbRCk&t=287s