강사님의 조언을 듣고, SAMURAI를 기존 코드에 적용해보고자함.. 제발 훈련이 진행되고, 정확도가 올라가기를 빌면서 🙏
기존 구조는
Flask 서버 -> 영상 전처리 -> 관절 데이터 추출 -> ST-GCN -> 예측결과
SAMURI를 적용하면
Flask 서버 -> 영상 전처리 -> 관절 데이터 추출 + 프레임 피처 추가 -> SAMURAI (ST-GCN + 스파스 융합) -> 예측 결과
SAMURAI는 ST-GCN에 추출한 관절 특징과 프레임 이미지 피처를 통합하여 동작
객체를 잡는 것은 SAMURAI가 자동으로 수행 가능
-> 일단 SAMURAI에 입력된 데이터를 기반으로 자동으로 중요한 객체를 학습하고, 예측에 반영
train_model에서 기존 ST-GCN 모델 학습 단계에 SAMURAI를 추가, 관절 데이터와 프레임 피처를 입력으로 학습
test_model_with_video 에서 사용자로부터 받은 영상을 분석할 때 SAMURAI를 사용하여 예측 / 관절 데이터와 추가 프레임 정보를 SAMURAI에 전달하여 동작
FLASK 서버에서 사용자로부터 받은 영상을 처리하여 관절 데이터와 프레임 피처를 추출한 뒤, SAMURAI를 통해 예측 결과 반환
프레임 피처는 비디오나 연속적인 데이터를 다룰 때, 각 프레임에서 추출된 유용한 정보
1차
frame_features가 주어지지 않거나 더미 데이터(0으로 채워진 텐서)일 경우 ST-GCN만 사용
학습(Train)과 검증(Validation)의 손실(Loss) 및 정확도(Accuracy)
Train Loss -> 학습 손실이 초기에는 감소하다가 어느 순간 거의 일정하게 유지
Validation Loss -> 검증 손실이 초기에는 감소하지만, 에포크 10 이후 갑작스럽게 증가하거나 크게 변동, 모델이 과적합(Overfitting)
Train Accuracy -> 40% 까지 증가 , 모델 학습 데이터를 잘 예측하고 있다는 신호
Validation Accuracy -> 일정 수준(약 10%)에서 머물러있음..
진짜 미치겠네.. 일단 samurai를 도입했을 때 train 정확도가 올라감 흠..
validation loss도 전의 값에서는 말도안되는 값이 나왔는데 확실히 잡힘 오...
2차
frame_features 데이터를 미리 생성하지 않아도 되도록, 모델 내부에서 SAMURAI처럼 프레임 피처를 동적으로 추출하는 모듈을 추가
Linear 계층 -> 3D CNN (공간적(이미지) 정보뿐만 아니라 시간적(프레임 간) 정보를 동시에 학습) 변경
linear 계층을 사용하는 것은 영상 분석에서도 적절할 수 있지만, 주로 시각적 또는 시공간적 정보를 충분히 캡처하지 못할 가능성... 왜 이걸 생각 못했지 완전 다르게 생각했다..
시공간적 패턴을 학습하려면 3D CNN, RNN/LSTM, 또는 Transformer 기반 아키텍처를 고려
class Config:
def __init__(self):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.num_classes = 12 # 행동 클래스 수
self.num_joints = 15 # 관절 개수
self.num_frames = 30 # 프레임 수
self.batch_size = 16 # 배치 크기
self.learning_rate = 0.001 # 학습률
self.num_epochs = 20 # 에포크 수
self.models_dir = "./models" # 모델 저장 경로
self.train_csv = "./data/train.csv" # 학습 데이터 경로
self.val_csv = "./data/val.csv" # 검증 데이터 경로
1초당 30장의 프레임으로 분석
validation loss의 불안정성과 validation Accuracy가 매우 낮음
위의 결과와 비슷한걸 보니.. 데이터의 문제인가 행동마다의 개수가 달라서 내가 그 조건을 빠뜨린 것 같다.. 다시
현재 데이터를 train.csv, val.csv, test.csv로 나누었는데 일단 나눈 이유는 모델 학습과 검증을 명확히 구분하기 위해서..
train_data, temp_data = train_test_split(data, test_size=0.3, random_state=42, stratify=data['label'])
validation_data, test_data = train_test_split(temp_data, test_size=0.5, random_state=42, stratify=temp_data['label'])
현재 비율을 70:15:15
데이터의 문제일까.. 현재 데이터는 87764개의 샘플이 있고, 12개의 행동으로 분류되어있다. 각 행동에 대한 샘플 수는 다르기에.. 클래스 불균형 문제있을 가능성
다음은 80:10:10으로 바꾸고 실행
'팀프로젝트 - TailsRoute' 카테고리의 다른 글
TEAM Project (12.01) - SAMURAI, SAM 2 설치 (0) | 2024.12.02 |
---|---|
TEAM Project (11.30) (0) | 2024.12.01 |
TEAM Project (11.28) (0) | 2024.11.28 |
TEAM Project (11.26) (0) | 2024.11.26 |
TEAM Project (11.25) - 카카오 소셜 로그인 구현 (0) | 2024.11.25 |