Skip to content

1st ranked 'driver careless behavior detection' for AI Online Competition 2021, hosted by MSIT Korea.

License

Notifications You must be signed in to change notification settings

PJunhyuk/2021AICompetition-03

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

6 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

2021AICompetition-03

๋ณธ repo๋Š” ์ฃผ์‹ํšŒ์‚ฌ ๋ฉ”์ด์•„์ด๊ฐ€ ๋งˆ์ด์• ๋ฏธ๋ผ๋Š” ํŒ€๋ช…์œผ๋กœ ์ฐธ๊ฐ€ํ•œ 2021 ์ธ๊ณต์ง€๋Šฅ ์˜จ๋ผ์ธ ๊ฒฝ์ง„๋Œ€ํšŒ ์ค‘ ์šด์ „ ์‚ฌ๊ณ  ์˜ˆ๋ฐฉ์„ ์œ„ํ•œ ์šด์ „์ž ๋ถ€์ฃผ์˜ ํ–‰๋™ ๊ฒ€์ถœ ๋ชจ๋ธ ํƒœ์Šคํฌ ์ˆ˜ํ–‰์„ ์œ„ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋ฉ”์ด์•„์ด๋Š” ๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€๊ฐ€ ์ฃผ์ตœํ•˜๊ณ  ์ •๋ณดํ†ต์‹ ์‚ฐ์—…์ง„ํฅ์›์ด ์ฃผ๊ด€ํ•˜๋Š” 2021 ์ธ๊ณต์ง€๋Šฅ ์˜จ๋ผ์ธ ๊ฒฝ์ง„๋Œ€ํšŒ ์— ์ฐธ๊ฐ€ํ•˜์—ฌ, ์ด๋ฏธ์ง€ ๋ถ„์•ผ 177๊ฐœ ํŒ€ ์ค‘ ์ตœ์ข… 1์œ„ ๋ฅผ ๋‹ฌ์„ฑํ•˜์—ฌ ๊ณผํ•™๊ธฐ์ˆ ์ •๋ณดํ†ต์‹ ๋ถ€์žฅ๊ด€์ƒ ์„ ์ˆ˜์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ณธ repo๋Š” ๊ทธ ์ค‘ [์ด๋ฏธ์ง€] ์šด์ „ ์‚ฌ๊ณ  ์˜ˆ๋ฐฉ์„ ์œ„ํ•œ ์šด์ „์ž ๋ถ€์ฃผ์˜ ํ–‰๋™ ๊ฒ€์ถœ ๋ชจ๋ธ ํƒœ์Šคํฌ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ, ๋งˆ์ด์• ๋ฏธ ํŒ€์€ ํ•ด๋‹น ํƒœ์Šคํฌ์—์„œ Public/Private/Final ๋ชจ๋“  ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•ด ์ข…ํ•ฉ 1์œ„ ๋ฅผ ๋‹ฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

leaderboard.PNG

๊ด€๋ จํ•œ ๋ณด๋‹ค ์ž์„ธํ•œ ์†Œ๊ฐœ๋Š” ๋ฉ”์ด์•„์ด ๋ธ”๋กœ๊ทธ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ด์•„์ด๋Š” ๊ฐ™์€ ๋Œ€ํšŒ์—์„œ 2020๋…„์—๋Š” 3๊ฐœ ํƒœ์Šคํฌ์—์„œ ๊ฐ๊ฐ 1์œ„, 2์œ„, 2์œ„๋ฅผ ๋‹ฌ์„ฑํ•˜์—ฌ ์ข…ํ•ฉ 5์œ„์— ๋žญํฌ๋˜์—ˆ์œผ๋ฉฐ, 2022๋…„์—๋Š” 2์œ„๋ฅผ ๊ธฐ๋กํ•˜์˜€์Šต๋‹ˆ๋‹ค:)

๋Œ€ํšŒ ์ค‘ ์ž‘์„ฑํ•˜์˜€์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์•„์นด์ด๋น™ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ, ๋ณ„๋„์˜ ๋ฌธ์„œํ™”๋‚˜ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์น˜์ง€ ์•Š์€ ์ , ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค:)


์…‹์—…

ํ•™์Šต ๋ฐ ์ถ”๋ก ์„ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๋ณ„๋„ ์…‹์—…

๋ณ„๋„์˜ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ์…‹์—… ๊ณผ์ •์ž…๋‹ˆ๋‹ค. docker ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ณ , dataset ์ด ์•Œ๋งž์€ ๊ฒฝ๋กœ์— ์ค€๋น„๋˜์–ด ์žˆ๋‹ค๋ฉด ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker ์„ค์น˜

๋ณธ repo ๋Š” ๊ฐ„ํŽธํ•œ ์„ค์น˜๋ฅผ ์œ„ํ•ด docker ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์— docker ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ค์น˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

$ sudo apt-get remove docker docker-engine docker.io
$ sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$ sudo apt-get update && sudo apt-cache search docker-ce
# Message: docker-ce - Docker: the open-source application container engine

$ sudo apt-get update && sudo apt-get install docker-ce
$ sudo usermod -aG docker $USER

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker

๋„์ค‘์— sudo: unable to resolve host ์—๋Ÿฌ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋งํฌ ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์…‹์—…

์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๋กœ์— ์…‹์—…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • train ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ: /DATA/Final_DATA/task03_train
  • test ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ: /DATA/Final_DATA/task03_test

์œ„์™€ ๊ฐ™์ด ์…‹์—…๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ œ์‹œ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ /DATA/Final_DATA/ ํด๋”์— ๋†“์€ ํ›„, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋กœ ์••์ถ•์„ ํ’€์–ด ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.

## ๊ธฐ๋ณธ ์ œ๊ณต ๋ฐ์ดํ„ฐ๋ฅผ drowsy_face_raw ํด๋”์— ์••์ถ• ํ•ด์ œ
$ sudo unzip /DATA/Final_DATA/task03_train.zip -d /DATA/Final_DATA/task03_train
$ sudo unzip /DATA/Final_DATA/task03_test.zip -d /DATA/Final_DATA/task03_test

## ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•˜๋‹ค๋ฉด .zip ํŒŒ์ผ์€ ์‚ญ์ œ
$ sudo rm ../drowsy_face_raw/task03_train.zip
$ sudo rm ../drowsy_face_raw/task03_test.zip

ํด๋” ์„ธํŒ…

์ž‘์—… ํด๋”๋ฅผ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ถœํ•œ ์ฝ”๋“œ๋ฅผ ~/workspace/code/2021AICompetition-03 ์— ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
ํ˜น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด git ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

$ mkdir -p ~/workspace/code
(~/workspace/code) $ git clone https://github.com/PJunhyuk/2021AICompetition-03

** ์ดํ›„์˜ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ํŠน๋ณ„ํ•œ ์–ธ๊ธ‰์ด ์—†๋‹ค๋ฉด current work directory(~/workspace/code/2021AICompetition-03) ํ•˜์—์„œ์˜ ์‹คํ–‰์„ ์ „์ œํ•ฉ๋‹ˆ๋‹ค.

docker ๋ฐ git, ffmpeg (for opencv) ์„ธํŒ…

์—ฌ๋Ÿฌ docker image ์ค‘ nvidia/pytorch ์˜ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ docker ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ธฐ๋ณธ package ์ธ git ๊ณผ ffmpeg ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ถ”๊ฐ€ ์„ค์น˜๊ฐ€ ์›Œ๋‚™ ๊ฐ„๋‹จํ•˜์—ฌ, ๋ณ„๋„๋กœ docker image ํŒŒ์ผ์„ ๋งŒ๋“ค์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.
$ docker pull nvcr.io/nvidia/pytorch:20.12-py3
$ docker run --gpus all --name 2021AICompetition-03 --shm-size 8G -v ~/workspace/code:/root/workspace/code -v /DATA:/DATA -it nvcr.io/nvidia/pytorch:20.12-py3

# Install git & ffmpeg
# 'glib2' is a dependency of 'opencv'
# type 6-69-6
$ apt-get update && apt-get install -y --no-install-recommends \
    git libxrender1 ffmpeg libglib2.0-0 && \
    rm -rf /var/lib/apt/lists/*

dependencies ์„ค์น˜

$ pip install -r requirements.txt

ํ•™์Šต ๋ฐ ์ถ”๋ก 

ํ•™์Šต

$ python train.py

์ถ”๋ก 

$ python predict.py

์ฝ”๋“œ ์„ค๋ช…

repo ์ „๋ฐ˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

Code file ์— ๋Œ€ํ•œ description

๊ตฌ์กฐ

Code file ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

~/workspace/code/2021AICompetition-03 (current work directory)
  /data
    drowsy_face.yaml
    drowsy_face_tuning.yaml
    hyp.scratch-p6.yaml
    hyp.finetune.yaml
    hyp.finetune-simple.yaml
  /models
    /hub
      yolov5l6.yaml
    *.py
  /utils
    *
  .gitignore
  README.md
  requirements.txt
  train.py
  predict.py

์ƒ์„ธ ์„ค๋ช…

  • ${PROJECT}/data/drowsy_face.yaml: baseline ํ•™์Šต ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/data/drowsy_face_tuning.yaml: fine-tuning ํ•™์Šต ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. drowsy_face.yaml ํŒŒ์ผ๊ณผ train dataset ๊ฒฝ๋กœ ๋ถ€๋ถ„์—์„œ๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ${PROJECT}/data/hyp.scratch-p6.yaml: baseline ํ•™์Šต์— ํ•„์š”ํ•œ hyperparameter ๋“ค์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/data/hyp.finetune.yaml: fine-tuning ํ•™์Šต์— ํ•„์š”ํ•œ hyperparameter ๋“ค์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/data/hyp.finetune-simple.yaml: fine-tuning ํ•™์Šต์— ํ•„์š”ํ•œ hyperparameter ๋“ค์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. hyp.finetune.yaml ๊ณผ ๋‹ฌ๋ฆฌ hsv_v, scale, mosaic ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ${PROJECT}/models/hub/yolov5l6.yaml: ํ•™์Šต์— ์‚ฌ์šฉํ•œ backbone ์ธ yolov5l6 ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/models/*.py: yolov5 ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋“ค์ž…๋‹ˆ๋‹ค. ์›๋ณธ ํŒŒ์ผ๋“ค๊ณผ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ${PROJECT}/utils/*: yolov5 ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ๋“ค์ž…๋‹ˆ๋‹ค. ์›๋ณธ ํŒŒ์ผ๋“ค๊ณผ ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ${PROJECT}/.gitignore: GitHub ๋ฅผ ์œ„ํ•œ .gitignore ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/README.md: repo ์ „๋ฐ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/requirements.txt: dependencies ๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/train.py: ํ•™์Šต์— ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

  • ${PROJECT}/predictpy: ์ถ”๋ก ์— ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

output ์— ๋Œ€ํ•œ description

๊ตฌ์กฐ

์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๊ธฐ์กด ํŒŒ์ผ๋“ค ์™ธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

~/workspace/code
  /2021AICompetition-03 (current work directory)
    /runs
      /train
        /final
          /weights
            last.pt
            best.pt
          *
        /final2
          /weights
            last.pt
            best.pt
          *
      /test
        /final
          last_predictions.json
          *
  /drowsy_face
    /images
      /train
      /val
    /labels
      /train
      /val
  /drowsy_face_diet
    /images
      /train
    /labels
      /train

์ƒ์„ธ ์„ค๋ช…

  • ~/workspace/code/2021AICompetition-03/runs
  • ~/workspace/code/drowsy_face/: train.py ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. /DATA/Final_DATA ์˜ ๋ฐ์ดํ„ฐ๋“ค์„ train set ๊ณผ validation set ์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ yolo ํ˜•์‹์— ๋งž์ถฐ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ~/workspace/code/drowsy_face_diet/: train.py ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ƒ์„ฑ๋˜๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. data imbalance ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด /DATA/Final_DATA ์˜ ๋ฐ์ดํ„ฐ๋“ค์„ ํŠน์ • ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ถ”์ถœํ•˜์—ฌ yolo ํ˜•์‹์— ๋งž์ถฐ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ•™์Šต์— ํ•„์š”ํ•œ ๋ช…๋ น์–ด

$ python train.py

ํ”Œ๋ž˜๊ทธ

์œ„ ๋ช…๋ น์–ด ๋งŒ์œผ๋กœ ๋ชจ๋“  ํ•™์Šต ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ํŽธ์˜๋ฅผ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • --no_data_prepare : ์ด๋ฏธ train.py ๊ฐ€ ํ•œ ๋ฒˆ ์ด์ƒ ์‹คํ–‰๋˜์–ด drowsy_face ์™€ drowsy_face_diet ํด๋”๊ฐ€ ์„ธํŒ…๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ณธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด data prepare ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  ๋ฐ”๋กœ ํ•™์Šต์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (default: False)
  • --batch 4 : batch size ๋ฅผ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. (default: 4)
  • --device 0 : ์—ฌ๋Ÿฌ ๊ฐœ์˜ GPU ๊ฐ€ ์žˆ๋Š” ์„œ๋ฒ„์—์„œ ํŠน์ • ๋ฒˆํ˜ธ์˜ GPU ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (default: '')
  • --img 640 : input image size ์ž…๋‹ˆ๋‹ค. (default: 1280)
  • --name final : ๊ฒฐ๊ณผ ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ํด๋”์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. (default: exp)

์ ์ ˆํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ python train.py --epochs 2 --save_period 2 --epochs_tune 2 --save_period_tune 2
$ python train.py --no_data_prepare --device 0 --batch 4 --img 640 --epochs 1 --save_period 1 --epoch_parts 300 --epochs_tune 1 --epoch_parts_tune 1000 --save_period_tune 1

ํ•™์Šต์‹œ๊ฐ„

V100 ํ™˜๊ฒฝ์—์„œ ์ด 26์‹œ๊ฐ„ ์ •๋„๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์„ธ๋ถ€ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • baseline train ์— 21.5์‹œ๊ฐ„ ์ •๋„๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. (300 epochs completed in 21.028 hours.)
    • 1 epoch ํ•™์Šตํ•˜๋Š”๋ฐ์— 4๋ถ„ 10์ดˆ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
    • ํ•™์Šต์ด ๋๋‚œ ํ›„ /drowsy_face/val ์— ๋Œ€ํ•ด validation ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 6๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
  • fine-tuning ์— 4.5์‹œ๊ฐ„ ์ •๋„๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. (50 epochs completed in 4.295 hours.)
    • 1 epoch ํ•™์Šตํ•˜๋Š”๋ฐ์— 5๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
    • ํ•™์Šต์ด ๋๋‚œ ํ›„ /drowsy_face/val ์— ๋Œ€ํ•ด validation ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 6๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

ํ•™์Šต/์ถ”๋ก  ์†๋„ ์ฒดํฌ๋ฅผ ์œ„ํ•ด NAVER CLOUD PLATFORM ์˜ GPU Server ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์ŠคํŽ™
  • CPU: 8 vCPUs
  • RAM: 90GB
  • GPU: Tesla V100
  • VRAM: 32GB
  • OS: Ubuntu 16.04
์„œ๋ฒ„ ์ƒํƒœ
# CUDA
$ nvcc --version # 10.0.130

# nvidia-driver
$ nvidia-smi # 418.67, Tesla V100-SXM2..., 32480MiB

# Ubuntu
$ lsb_release -a # Ubuntu 16.04.1 LTS

ํ•™์Šต ๊ณผ์ •

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋Š” ์ „์ฒด ํ•™์Šต ๊ณผ์ •์€ ํฌ๊ฒŒ 3๊ฐœ์˜ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

1. data_prepare

/DATA/Final_DATA ๋ฅผ yolo ํ˜•ํƒœ์˜ data ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

  • ์›๋ณธ data ๋Š” data imbalance ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•˜์—ฌ, ๊ทธ๋Œ€๋กœ ํ•™์Šตํ•˜๋ฉด ์ ์€ ๊ฐœ์ˆ˜์˜ class ๋“ค์ด ์ž˜ ํ•™์Šต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ๋ณด์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜์—ฌ drowsy_face_diet/train ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • drowsy_face_diet/train ์„ ์ƒ์„ฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • cigar ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ phone ์ด ์žˆ์œผ๋ฉด drowsy_face_diet/train ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • eye_closed ์™€ mouth_closed ๊ฐ€ ๋™์‹œ์— ์žˆ์œผ๋ฉด drowsy_face_diet/train ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • eye_closed ์™€ mouth_opened ๊ฐ€ ๋™์‹œ์— ์žˆ์œผ๋ฉด drowsy_face_diet/train ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • mouth_opened ๊ฐ€ ์žˆ๋Š” ์ด๋ฏธ์ง€ ์ค‘ 1/3 ์„ drowsy_face_diet/train ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ์ „์ฒด train data ์ค‘ random ํ•˜๊ฒŒ 20000๊ฐœ๋ฅผ ์ถ”์ถœํ•˜์—ฌ drowsy_face/val ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‚จ์€ data ๋“ค์€ drowsy_face/train ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์…‹๋“ค์˜ class ๋ณ„ ๋ถ„ํฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

generate raw_train.json, raw_val.json
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 273224/273224 [02:17<00:00, 1991.69it/s]
generate drowsy_face/train, drowsy_face/val
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 20000/20000 [00:08<00:00, 2485.50it/s]
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 253224/253224 [01:47<00:00, 2346.73it/s]
generate diet_train.json
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 273224/273224 [00:00<00:00, 543536.13it/s]
generate drowsy_face_diet/train
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 56747/56747 [00:27<00:00, 2091.26it/s]
count classes
diet_train.json
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 56747/56747 [00:00<00:00, 500054.98it/s]
{'eye_opened': 61941, 'eye_closed': 47630, 'mouth_opened': 23254, 'mouth_closed': 25658, 'face': 56738, 'phone': 12687, 'cigar': 11370}
raw_train.json
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 253224/253224 [00:00<00:00, 619673.71it/s]
{'eye_opened': 419135, 'eye_closed': 74551, 'mouth_opened': 35233, 'mouth_closed': 127282, 'face': 253167, 'phone': 11792, 'cigar': 10499}
raw_val.json
100%|โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ| 20000/20000 [00:00<00:00, 449781.67it/s]
{'eye_opened': 32994, 'eye_closed': 5975, 'mouth_opened': 2823, 'mouth_closed': 9851, 'face': 19997, 'phone': 895, 'cigar': 871}
2. baseline ํ•™์Šต

drowsy_face_diet/train ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

  • 300 epoch ํ•™์Šตํ•˜๋ฉฐ, hyp.scratch-p6.yaml ๊ณผ drowsy_face.yaml ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  train set ์„ ํ•™์Šตํ•˜๋ฉด ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, RandomSampler ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹ ์ค‘ ์ผ๋ถ€๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์€ epoch_parts ๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, default ๊ฐ’์€ 15 ๋กœ, ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹์„ ๋งค epoch ๋งˆ๋‹ค ๋žœ๋คํ•˜๊ฒŒ 15๋“ฑ๋ถ„ํ•˜์—ฌ ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์…‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 300 epoch ํ•™์Šต์ด ๋๋‚œ ํ›„ drowsy_face/val ์— ๋Œ€ํ•ด validation ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
3. fine-tuning ํ•™์Šต

์œ„ baseline ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ์ˆ˜๊ฐ€ ์ ์€ phone ๊ณผ cigar ๊ณผ ๊ฐ™์ด ๊ฐœ์ˆ˜๊ฐ€ ์ ์€ class ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋‚˜, face ์™€ ๊ฐ™์ด ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€ class ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋œ ๋ฐ์ดํ„ฐ์…‹๊ณผ class ๋ถ„ํฌ๊ฐ€ ๊ฐ™์€ drowsy_face/train ์„ ์‚ฌ์šฉํ•˜์—ฌ fine-tuning ํ•ฉ๋‹ˆ๋‹ค.

  • 50 epoch ํ•™์Šตํ•˜๋ฉฐ, hyp.finetune-simple.yaml ๊ณผ drowsy_face_tuning.yaml ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ RandomSampler ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์€ epoch_parts_tune ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, default ๊ฐ’์€ 50 ์ž…๋‹ˆ๋‹ค.
  • 50 epoch fine-tuning ์ด ๋๋‚œ ํ›„ drowsy_face/val ์— ๋Œ€ํ•ด validation ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๋ก  ๊ฒฐ๊ณผ

์œ„ ๊ณผ์ •์€ baseline ํ•™์Šต๊ณผ fine-tuning ์„ ๋™์‹œ์— ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. default ์„ค์ •์œผ๋กœ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ, ๊ฐ๊ฐ์˜ weight ๋Š” ๋‹ค์Œ์˜ ๊ฒฝ๋กœ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  • baseline: runs/train/final/weights/last.pt
  • fine-tuning: runs/train/final2/weights/last.pt

์ถ”๋ก ์— ํ•„์š”ํ•œ ๋ช…๋ น์–ด

$ python predict.py

ํ˜„์žฌ๋Š” ์‚ฌ์ „์— ํ•™์Šต๋œ weights/weights_baseline.pt ์™€ weights/weights_tuned.pt ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๋ก ์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๋“œ์ฝ”๋”ฉ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ•™์Šต์œผ๋กœ ์–ป์€ ์ƒˆ๋กœ์šด weight ํŒŒ์ผ์œผ๋กœ ์ถ”๋ก ์„ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ python predict.py --weights runs/train/final/weights/last.pt runs/train/final2/weights/last.pt

์ถ”๋ก  ์‹œ๊ฐ„

V100 ํ™˜๊ฒฝ์—์„œ ensemble ๊ธฐ์ค€ ์ด 1์‹œ๊ฐ„ ์ •๋„๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

์ถ”๋ก  ๊ณผ์ •

ํ•™์Šต ๊ณผ์ •์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ 2๊ฐœ์˜ weight ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ensemble ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๋ก  ๊ฒฐ๊ณผ

์ถ”๋ก  ๊ฒฐ๊ณผ๋Š” runs/test/final ๊ฒฝ๋กœ ์•„๋ž˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ตœ์ข… ์ œ์ถœ ํŒŒ์ผ์€ ํด๋” ๋‚ด์˜ last_predictions.json ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


Reproducibility

๋ณธ repo ์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Reproducibility ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์šฐ์„  train.py ์—์„œ __main__ ํ•จ์ˆ˜๊ฐ€ ์‹œ์ž‘๋œ ์งํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Reproducibility ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
# Reproducibility
torch.manual_seed(opt.random_seed)
torch.cuda.manual_seed(opt.random_seed)
torch.cuda.manual_seed_all(opt.random_seed) # if use multi-GPU
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(opt.random_seed)
random.seed(opt.random_seed)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ๋„ utils/general.py ์—์„œ init_seeds ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Reproducibility ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
def init_seeds(seed=0):
    # Initialize random number generator (RNG) seeds
    random.seed(seed)
    np.random.seed(seed)
    init_torch_seeds(seed)

๊ทธ๋Ÿฌ๋‚˜ PyTorch ๋Š” ๊ณต์‹์ ์œผ๋กœ ์™„๋ฒฝํžˆ Reproducibility ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ CUDA ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” PyTorch ํ•จ์ˆ˜๋“ค ์ค‘ nondeterministic ํ•œ ํ•จ์ˆ˜๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ณธ repo ๋Š” ์ด ์ค‘ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ torch.nn.funcional.interpolate() ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด, ์™„๋ฒฝํ•œ Reproducibility ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋งค iter ๋งˆ๋‹ค loss ๋ฅผ ์ฐ์–ด๋ณธ ๊ฒฐ๊ณผ, ์ดˆ๋ฐ˜ 1-20 iter ์ •๋„๋Š” ๋ชจ๋“  loss ๊ฐ€ ๊ฐ™๊ฒŒ ๋‚˜์™”์ง€๋งŒ, ์–ด๋А ์ˆœ๊ฐ„๋ถ€ํ„ฐ obj loss ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ฐํžˆ๊ธฐ ์‹œ์ž‘ํ•˜๊ณ , ์ด๊ฑธ ์‹œ์ž‘์œผ๋กœ ๋‹ค๋ฅธ loss ๋“ค๋„ ๋‹ค๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์œ„์— ์–ธ๊ธ‰ํ•œ torch.nn.funcional.interpolate() ํ•จ์ˆ˜ ํ˜น์€ obj loss ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์—ฐ์‚ฐ๋˜๋Š” bcewithlogitsloss ์—์„œ Reproducibility ๊ฐ€ ๊นจ์ง€๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ •๋ฉ๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ๋ณธ repo ์—์„œ๋Š” ์™„๋ฒฝํ•œ Reproducibility ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋ณธ repo ์˜ ์„ค์ •๋Œ€๋กœ ํ•™์Šต ๋ฐ ์ถ”๋ก ์„ ์ง„ํ–‰ํ•˜์—ฌ ์ œ์ถœํ•ด ๋ณธ ๊ฒฐ๊ณผ, Public testset ์— ๋Œ€ํ•ด ๊ฐ๊ฐ 0.7459674232 (best, 66๋ฒˆ์งธ submission) , 0.7378836101 (65๋ฒˆ์งธ submission) 0.7320975839 (61๋ฒˆ์งธ submission) ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ํ•ด๋‹น ๊ฒฐ๊ณผ๋Š” ๋ชจ๋‘ ๋ฆฌ๋”๋ณด๋“œ ๊ธฐ์ค€ 2๋“ฑ์— ์œ„์น˜ํ•œ est_snow ํŒ€์˜ 0.732055294 ๋ณด๋‹ค ๋†’์•„, ์ˆœ์œ„์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

About

1st ranked 'driver careless behavior detection' for AI Online Competition 2021, hosted by MSIT Korea.

Topics

Resources

License

Stars

Watchers

Forks

Languages