https://dacon.io/competitions/official/236050/overview/description
https://wandb.ai/seokjin/video-hand-gesture-classification?workspace=user-seokjin
https://github.com/Yoon-SeokJin/ai-competition/tree/main/hand_gesture_recognition
fps가 30인 1초짜리 영상 약 600개가 학습데이터로 주어진다. 총 5가지의 손동작을 분류하는 과제이다.
public score가 0.95였는데 private score가 0.45로 추락했다.
1. pytorchvideo의 slowfast_16x8_r101_50_50 사용
2. SGD, ReduceLROnPlateau 사용
3. 이미지 크기를 256으로 resize함 (학습데이터의 해상도가 두 가지였어서 하나로 통일하기 위해)
private score가 너무 많이 떨어진 것은 과적합되어서 그런 것 같다. 사용했던 모델은 입력되는 데이터 영상의 가로세로 크기가 256보다 작거나 프레임 수가 64보다 작으면 작동하지 않을 정도로 레이어가 많았다. (레이어의 수가 하도 많아서 CNN을 반복해서 통과하다 보니 커널의 크기보다 더 작아지는 문제 때문에 작동하지 않는다.) 그래서 30장짜리 영상을 강제로 64장으로 늘려 넣었다. 불안했긴 했는데 validation score가 7에폭만에 가장 높은 1이 나와서 제출해보았지만 엄청 과적합이었다.
무조건 무거운 모델을 사용할 게 아니라 데이터의 복잡도에 따라 결정해야겠다.
회색이 최종으로 제출했던 실험의 validation score이다. 나머지는 kfold를 수행하려고 학습하였지만 최종 제출에는 반영이 되지 않은 실험이다. fold끼리 저렇게 성적의 차이가 크다는 것이 의심할만 해보인다. 회색 그래프가 아주 우연히 1점을 찍은 것으로 보인다. 다른 fold로 수행해보고 비슷한 성적이 나오지 않으면 우연히 높게 나온 것으로 생각해야겠다.
pretrained모델을 가져다 사용할 때 방식을 여러가지로 실험해보았다. 아래 그래프에서 사용한 모델은 모두 slow_r50으로 같다. 이 모델은 400가지 클래스를 분류하는 모델으로 학습되었다. 하지만 우리의 과제는 5가지 클래스를 분류하는 것이기 때문에 클래스 수를 맞춰줘야한다. 그 방법은 아래에 설명되어있다.
replace_classifier: 모델의 마지막 부분에 400가지의 출력을 내는 Linear Layer를 제거하고 그 자리에 5가지의 출력을 내는 Linear Layer로 갈아끼운 방식
add_classifier: 기존의 모델을 건드리지 않고 400가지 출력을 다시 Linear Layer로 통과시켜 5가지의 출력을 내도록 한 방식
no_transform: 아무것도 건드리지 않고 그냥 씀. 모델이 400가지의 출력을 낼 수는 있지만 0~4의 label로만 학습을 시켜 자연스럽게 5~399번의 출력이 작게 나오도록 함.
add_classifier_freeze: 위 세 가지 방법은 모델 전체가 학습되도록 한 것에 반해, 이 방법은 add_classifier의 방식과 동일하지만 직접 추가한 새로운 레이어만 학습하고 나머지는 requires_grad=False
를 통해 학습을 차단함
no_transform은 사실 클래스 수를 맞춰야 한다는 사실을 깜빡해서 수행한 작업이었는데 놀랍게도 4가지 방법 중 1등이었다. 오히려 전이학습의 정석이라 배운 방식인 add_classifier_freeze는 4등이었다. 일반적으로 자주 사용하는 replace_classifier가 3등, 마지막에 단순히 추가하는 것이 거의 공동1등이다. 아무래도 앞으로는 add_classifier방식만 사용할 것 같다.
https://dacon.io/competitions/official/236050/codeshare/7549?page=1&dtype=recent
torchvision r3d_18 + Linear Layer
Cross Entropy Loss + Class Weight
https://dacon.io/competitions/official/236050/codeshare/7548?page=1&dtype=recent
torchvision.models.video.r2plus1d_18 replace last layer
AdamW
CosineAnnealingWarmRestart
https://dacon.io/competitions/official/236050/codeshare/7554?page=1&dtype=recent
torchvision.models.video.r3d_18 replace last layer
Adam
https://dacon.io/competitions/official/236050/codeshare/7555?page=1&dtype=recent
VGGNet3d + media pipe
Adam, AdamW, CosineAnnealingWarmRestart, r2plus1d_18, r3d_18, Class Weight