안녕하세요! 메이아이는 2021년 6월에 치뤄진 <2021 인공지능 온라인 경진대회> “운전 사고 예방을 위한 운전자 부주의 행동 검출 모델” 분야에 참가하여 종합 1등이라는 우수한 성적을 거두었습니다!
(2020년에도 우수한 성적을 거둔 바 있습니다 ─ 보러가기)
이번 글에서는 저희가 “운전 사고 예방을 위한 운전자 부주의 행동 검출 모델” 을 어떻게 풀었는지 그 속을 낱낱이 파헤쳐 보도록 하겠습니다.
목차는 아래와 같습니다.
- 문제가 무엇인디?
- EDA : 답은 여기에?!
- Data Preprocessing
- Model, Train Strategy
- Inference
- 후기
이 글이 Object Detection 을 수행하시는 모든 분들께 도움이 되었으면 좋겠습니다 :)
code: https://github.com/PJunhyuk/2021AICompetition-03
문제가 무엇인디? 📚

저희 메이아이가 도전한 "운전 사고 예방을 위한 운전자 부주의 행동 검출 모델" 분야는 이미지 속에 있는 얼굴, 눈, 입, 담배, 휴대폰 등을 탐지하는 object detection 문제입니다.
object detection이라는 키워드를 보자마자 바로 이 문제를 선택했어요. 이미 오프라인 공간 분석 서비스인 mAsh를 개발하면서 비슷한 종류의 문제를 많이 풀어왔기 때문입니다.
EDA : 답은 여기에?! 📊
먼저 저희는 데이터 셋이 어떻게 구성되어 있는지 살펴봤습니다. 데이터 셋을 구성하는 대부분의 이미지에서는 운전자가 1명 등장하였고, 각 물체끼리의 occlusion 은 거의 없었습니다. 이러한 운전자 이미지가 흑백 형태로 약 27만 장 정도 주어졌고, 각 class 간의 비율은 아래 차트와 같았습니다.

다들 이미 눈치채셨겠지만 data imbalance 문제가 심각한 것을 알 수 있습니다. 대회 초기에는 여러가지로 모델 구조를 바꿔보는 등의 실험을 진행하기도 했지만, EDA 진행 후에는 이 imbalance한 데이터를 균형 있게 학습할 수 있는 방법들을 취하도록 전략을 바꾸었습니다.
Data Preprocessing🗃️
앞서 EDA 를 통해 data imbalance 문제가 심각하다는 것을 알 수 있었습니다. 그렇다면 이제는 이걸 어떻게 해결할지 생각해봐야겠죠. 저희는 크게 두 가지 아이디어로 접근했습니다.
- 상대적으로 부족한 class 데이터를 더 많이 만들자.
- 상대적으로 많은 class 데이터를 줄이자.
먼저 1번 아이디어를 적용하기 위해 선택한 방법은 object cut-mix 였습니다. 위의 차트를 살펴보시면 phone과 cigar class가 상대적으로 부족한 것을 보실 수 있는데, 저희는 이 object들을 잘라서 적절하게 augmentation 을 한 뒤 학습할 이미지 빈 공간에 붙여주었습니다.
2번 아이디어는 아주 효과적이었는데요! 아래와 같은 기준으로 데이터 셋을 보기 좋게 '다이어트' 했습니다.
- cigar 가 있거나 phone 이 있으면 데이터 셋에 포함!
- eye_closed 와 mouth_closed 가 동시에 있으면 데이터 셋에 포함!
- eye_closed 와 mouth_opened 가 동시에 있으면 데이터 셋에 포함!
- mouth_opened 가 있는 이미지 중 1/3 을 데이터 셋에 포함!

그 결과 위와 같은 분포를 가진 데이터 셋을 얻었고, 이를 사용하여 학습을 진행했습니다.
Model 🧬 , Train Strategy 📝
모델 구조면에서도 여러 시도들이 있었습니다. 원래 대회에서 제공하는 baseline code 는 yolov5 였습니다. 이와 함께 yolov5l, Swin-L, Centernet 2 등의 여러 모델 구조를 테스트한 결과 yolov5l 를 최종 선택하였고, 이 모델의 정확도를 향상하는데에 집중하였습니다! 참고로 yolov5l 는 coco-test 에서 mAP(0.5:0.95) 0.48 의 정확도를 보여주는 엄청난 모델입니다.
- 쪼개서 학습하기
일단 yolov5의 기본 학습 전략을, 앞서 data preprocessing 을 통해 만든 다이어트 데이터 셋에 적용하여 학습했습니다. epoch 은 학습할 데이터 셋을 전부 한 번씩 도는 것인데, 다이어트를 한 데이터 셋을 전부 도는 것이 생각보다 너무 오래 걸려서 epoch를 새로 정의했습니다.
epoch*: 다이어트 데이터 셋을 15 등분으로 쪼개어 shuffle 한 뒤, 첫 1 / 15 의 작은 데이터 셋을 학습하는 것을 1 epoch 으로 정의합니다.

이렇게 학습한 결과 저희가 임의로 분리한 validation set 의 phone, cigar 에 대해 mAP가 잘 나와주었고 제출해서 test-set 에 적용했을 때도 1등을 달성하였습니다! 그렇다는 건 균형있는 데이터 셋으로 generality 또한 잘 학습했다는 뜻이겠죠? 그럼 이제..!
2. Fine Tuning
다이어트 데이터 셋에 포함되지 않은 데이터로 Fine tuning 을 진행합니다. 이 녀석들도 데이터 셋 크기가 상당하기 때문에 새로 정의한 epoch* 으로 50 등분하여 50 epoch* 을 학습했습니다.

오, 무려 0.01 이나 올랐네요!
Inference 🥇
이제 최종적으로 ML/DL 대회 국룰인 앙상블과 TTA(Test Time Augmentation) 를 적용하여 제출하였습니다!

그 결과 최종적으로 분야 1위를 사수할 수 있었습니다.
후기
박준혁: 큰 대회라 잘 하는 팀들이 많이 참가해서 재밌게 경쟁할 수 있었고, 결과가 너무 좋아서 더욱 기쁜 것 같습니다! 대회에서 배운 지식과 자신감(?)을 살려서 더욱 좋은 제품을 만들 수 있도록 노력할게요~
정재민 : 메이아이에서 object detection 을 연구한 경험이 대회에서 도움이 많이 되기도 했고 대회 경험이 메이아이에서 하는 연구에 많은 도움이 되기도 했습니다.
기타
- 데이터 수가 너무 많아서 1 epoch 을 돌리기 어려워 epoch*라는 단위로 쪼갰는데 이건 너무 epoch-based train strategy 만 생각했던 것 같습니다. 사실 iteration 단위의 step-based train strategy 로 풀었다면 어땠을까 하네요!
- Data Preprocessing 방법 중 1번 방법인 object cut-mix 는 메이아이에서 영상 속 Detection FP(False Positive) 를 학습하는 연구로 진행되고 있어요.
인터뷰로 만나보기 👇
👇 관련 기사 보러가기

👇 메이아이의 뉴스레터를 통해 오프라인 공간 분석 트랜드를 알고 싶다면 구독하세요!
