๋ณธ repo๋ ์ฃผ์ํ์ฌ ๋ฉ์ด์์ด๊ฐ ๋ง์ด์ ๋ฏธ
๋ผ๋ ํ๋ช
์ผ๋ก ์ฐธ๊ฐํ 2021 ์ธ๊ณต์ง๋ฅ ์จ๋ผ์ธ ๊ฒฝ์ง๋ํ
์ค ์ด์ ์ฌ๊ณ ์๋ฐฉ์ ์ํ ์ด์ ์ ๋ถ์ฃผ์ ํ๋ ๊ฒ์ถ ๋ชจ๋ธ ํ์คํฌ ์ํ์ ์ํ ๋ ํฌ์งํ ๋ฆฌ์
๋๋ค.
๋ฉ์ด์์ด๋ ๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ๊ฐ ์ฃผ์ตํ๊ณ ์ ๋ณดํต์ ์ฐ์ ์งํฅ์์ด ์ฃผ๊ดํ๋ 2021 ์ธ๊ณต์ง๋ฅ ์จ๋ผ์ธ ๊ฒฝ์ง๋ํ ์ ์ฐธ๊ฐํ์ฌ, ์ด๋ฏธ์ง ๋ถ์ผ 177๊ฐ ํ ์ค ์ต์ข 1์ ๋ฅผ ๋ฌ์ฑํ์ฌ ๊ณผํ๊ธฐ์ ์ ๋ณดํต์ ๋ถ์ฅ๊ด์ ์ ์์ํ์์ต๋๋ค.
๋ณธ repo๋ ๊ทธ ์ค [์ด๋ฏธ์ง] ์ด์ ์ฌ๊ณ ์๋ฐฉ์ ์ํ ์ด์ ์ ๋ถ์ฃผ์ ํ๋ ๊ฒ์ถ ๋ชจ๋ธ ํ์คํฌ๋ฅผ ๋ค๋ฃจ๊ณ ์์ผ๋ฉฐ, ๋ง์ด์ ๋ฏธ ํ์ ํด๋น ํ์คํฌ์์ Public/Private/Final ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๋ํด ์ข ํฉ 1์ ๋ฅผ ๋ฌ์ฑํ์์ต๋๋ค.
๊ด๋ จํ ๋ณด๋ค ์์ธํ ์๊ฐ๋ ๋ฉ์ด์์ด ๋ธ๋ก๊ทธ์์ ๋ณด์ค ์ ์์ต๋๋ค.
- 2021 ์ธ๊ณต์ง๋ฅ ์จ๋ผ์ธ ๊ฒฝ์ง๋ํ ์ด๋ฏธ์ง ๋ถ์ผ 1์์ ๋น๊ฒฐ์?
- ๋ฉ์ด์์ด, ์ ๋ถ ์ธ๊ณต์ง๋ฅ ๋ํ ๊ณผ๊ธฐ์ ํต๋ถ ์ฅ๊ด์ ์์
๋ฉ์ด์์ด๋ ๊ฐ์ ๋ํ์์ 2020๋ ์๋ 3๊ฐ ํ์คํฌ์์ ๊ฐ๊ฐ 1์, 2์, 2์๋ฅผ ๋ฌ์ฑํ์ฌ ์ข ํฉ 5์์ ๋ญํฌ๋์์ผ๋ฉฐ, 2022๋ ์๋ 2์๋ฅผ ๊ธฐ๋กํ์์ต๋๋ค:)
- 2022
- 2020
๋ํ ์ค ์์ฑํ์์๋ ์ฝ๋๋ฅผ ์์นด์ด๋นํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ผ, ๋ณ๋์ ๋ฌธ์ํ๋ ๋ฆฌํฉํ ๋ง์ ๊ฑฐ์น์ง ์์ ์ , ์ํด ๋ถํ๋๋ฆฝ๋๋ค:)
ํ์ต ๋ฐ ์ถ๋ก ์ ์ํ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋จ๊ณ์ ๋๋ค.
๋ณ๋์ ํ๊ฒฝ์ ์ํ ์ ์ ๊ณผ์ ์ ๋๋ค. docker ๊ฐ ์ค์น๋์ด ์๊ณ , dataset ์ด ์๋ง์ ๊ฒฝ๋ก์ ์ค๋น๋์ด ์๋ค๋ฉด ์๋ตํ ์ ์์ต๋๋ค.
๋ณธ 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 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/*
$ pip install -r requirements.txt
$ python train.py
$ python predict.py
repo ์ ๋ฐ์ ๋ํ ์์ธ ์ค๋ช ์ ๋๋ค.
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
: ์ถ๋ก ์ ์ฌ์ฉํ๋ ํ์ผ์ ๋๋ค.
์ฝ๋๊ฐ ์คํ๋๋ฉด ๊ธฐ์กด ํ์ผ๋ค ์ธ์ ๋ค์๊ณผ ๊ฐ์ ํ์ผ๋ค์ด ์์ฑ๋ฉ๋๋ค.
~/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๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
/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}
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 ์ ์ํํฉ๋๋ค.
์ 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
์ ์ ์ฅ๋ฉ๋๋ค.
๋ณธ 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 ๋ณด๋ค ๋์, ์์์๋ ์ํฅ์ ์ฃผ์ง ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.