운전자 이상 행동 중 문자
행동을 분류하기 위해 시선의 yaw(수평 각도), pitch(수직 각도)를 계산하는 모델인 L2CS-Net 을 이용하여 문자
를 할 때 시선이 자꾸 밑으로 가는 걸 탐지한다.
문제점
원래는 pytorch 에서 공식으로 지원하는 L2CS-Net 을 사용했는데, 값이 이해할 수 없게 나오는 문제가 있다.
방향과 부호가 이상함
- 프로젝트 데이터(DMD, yawDD)에서 추출한 yaw, pitch와 roboflow에 올라와있는 데모 영상 과 방향과 부호가 불일치
yaw, pitch 값이 서로 바뀜
yaw, pitch 값이 뒤바뀐 것 같다고 생각될 때가 많았음
밑을 바라보고 있는데, 왜 pitch가 0도이고 yaw 가 0.41도 인지..
시선 각도가 너무 다른데 두번째 사진과 세번째 사진 모두 yaw가 비슷하다.
공식 레포의 issue들을 보니 코드 상에서 yaw, pitch가 바뀌었다는 issue도 있음
→ 실제로 코드 확인해보니 뒤바뀌어있음
각도의 크기가 너무 작음
yaw, pitch 값이 0~0.7 사이에 있음
L2CS-Net 논문에 따르면 L2CS-Net은 단위를 degree(°) 를 씀
- classification 기반 모델 yaw, pitch를 90개의 클래스 중 하나로 분류
- raw output은
클래스 확률 분포
(Softmax 결과)
- raw output은
- 각 클래스는 일정한 각도 구간을 대표(→ 4도 단위로 90개 구간)
클래스 0 -180도 클래스 1 -176도 클래스 2 -172도 … 클래스 89 +176도
→최종적으로 softmax 확률 분포를 기반으로 기댓값을 구하고, 그걸 4를 곱하고 -180을 더해서 degree 단위의 연속값들을 만들어냄 → 최종 결과 단위는 degree(°)
💡
최종 결과를 계산하는 공식
Predicted Angle (degree) = (Softmax Expected Index) * 4 - 180
- Softmax Expected Index: Softmax 확률분포 전체를 반영해서 부드럽게 평균 내는 것. 가장 높은 확률(=argmax)만 쓰면 뚝뚝 끊기기 때문
- L2CS Net 레포 코드(test.py)를 확인해보니 최종 결과를 계산하는 방식이 이상하게 되어있음test.py code
- 프로젝트에 사용한 pipeline.py에는 제대로 계산을 하고 있지만, 반환하는 값의 단위를 raidan으로 변환하여 반환하고 있음을 확인 → 단위가 radian이어서 각도가 작았던 것.pipeline.py code
해결 방안
다른 모델 사용
더 개선된 L2CS 레포를 찾음
- -180 ~ 180도로 반환하는 코드 확인 ✅
- 이전보다 성능이 개선된 모델 ✅
*는 이전에 사용한 레포 모델 성능
Ahmednull/L2CS-Net vs Shohruh72/L2CS-Net
새로 찾은 모델을 적용시켜서 비교를 해보면..
Shohruh72/L2CS-Net 참고하여 작성한 코드
Ahmednull/L2CS-Net 이 더 정확한 것 같음
Ahmednull/L2CS-Net 모델 반환 값 수정하여 사용
- 모델이 반환하는 yaw, pitch 값을 원상태로 복구하여 사용
- 해석하거나 시각화할 때는 radian 를 degree로 변환하여 사용
🔎 radian vs degree 둘 중 모델 학습에 뭐가 더 적합할까?
항목 | radian | degree |
사용 예시 | 수학적 연산 및 신경망 구현에서는 radian이 표준 | 사람에게 익숙 모델 내부 연산에는 부적합 |
값의 범위 | -pi ~ pi (약 -3.14 ~ 3.14) | -180 ~ +180 |
초기 학습 안정성 | 더 빠르고 부드럽게 수렴 | 초기 loss가 커서 진동할 수 있음 |
미세한 시선 변화 감지 | 작은 값 변화에 민감 작은 변화도 loss에 작게 반영되어 미세한 조정 가능 | 상대적으로 둔감 작은 변화도 loss가 커서 덜 미세하게 반영 |
→ 해석하거나 시각화할 때는 degree를 사용하고, 모델에는 radian 을 넣으려고 함.