YOLOv5 ์ ํจ๊ป Comet
์ด ๊ฐ์ด๋์์๋ YOLOv5 ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํฉ๋๋ค. Comet
์ ๋ณด Comet
Comet ๋ฐ์ดํฐ ๊ณผํ์, ์์ง๋์ด, ํ ๋ฆฌ๋๊ฐ ๋จธ์ ๋ฌ๋ ๋ฐ ๋ฅ ๋ฌ๋ ๋ชจ๋ธ์ ๊ฐ์ํํ๊ณ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋๋ ๋๊ตฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
์ค์๊ฐ์ผ๋ก ๋ชจ๋ธ ๋ฉํธ๋ฆญ์ ์ถ์ ๋ฐ ์๊ฐํํ๊ณ , ํ์ดํผํ๋ผ๋ฏธํฐ, ๋ฐ์ดํฐ ์ธํธ ๋ฐ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ ์ฅํ๊ณ , Comet ์ฌ์ฉ์ ์ง์ ํจ๋์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ์์ธก์ ์๊ฐํํ์ธ์! Comet ๋ชจ๋ ๊ท๋ชจ์ ํ์์ ๊ฒฐ๊ณผ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ๊ณ ํ์ ํ ์ ์๋๋ก ๋์์ค๋๋ค!
์์ํ๊ธฐ
์ค์น Comet
Comet ์๊ฒฉ ์ฆ๋ช ๊ตฌ์ฑ
Comet ๋ฅผ YOLOv5 ๋ก ๊ตฌ์ฑํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์๊ฒฉ ์ฆ๋ช ์ ์ค์ ํ ์ ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์
export COMET_API_KEY=<Your Comet API Key>
export COMET_PROJECT_NAME=<Your Comet Project Name> # This will default to 'yolov5'
๋๋ .comet.config
ํ์ผ์ ์์
๋๋ ํ ๋ฆฌ์ ๋ฃ๊ณ ๊ฑฐ๊ธฐ์ ์๊ฒฉ ์ฆ๋ช
์ ์ค์ ํฉ๋๋ค.
Comet ๊ตฌ์ฑ ํ์ผ
[comet]
api_key=<Your Comet API Key>
project_name=<Your Comet Project Name> # This will default to 'yolov5'
๊ต์ก ์คํฌ๋ฆฝํธ ์คํ
# Train YOLOv5s on COCO128 for 5 epochs
python train.py --img 640 --batch 16 --epochs 5 --data coco128.yaml --weights yolov5s.pt
Comet ์ ํ์ดํผํ๋ผ๋ฏธํฐ, ๋ช ๋ น์ค ์ธ์, ํธ๋ ์ด๋ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฉํธ๋ฆญ์ ์๋์ผ๋ก ๊ธฐ๋กํฉ๋๋ค. Comet UI์์ ์คํ์ ์๊ฐํํ๊ณ ๋ถ์ํ ์ ์์ต๋๋ค.
์์ ๋ฅผ ์ฌ์ฉํด ๋ณด์ธ์!
์ฌ๊ธฐ์์ ์๋ฃ๋ ์คํ์ ์๋ฅผ ํ์ธํ์ธ์.
๋๋ ์ด Colab ๋ ธํธ๋ถ์์ ์ง์ ์ฌ์ฉํด ๋ณด์ธ์.
์๋ ๋ก๊ทธ
Comet ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ํญ๋ชฉ์ด ๊ธฐ๋ก๋ฉ๋๋ค.
๋ฉํธ๋ฆญ
- ํ๋ จ ๋ฐ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ๋ฐ์ค ์์ค, ์ค๋ธ์ ํธ ์์ค, ๋ถ๋ฅ ์์ค
- ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ์ ๋ํ mAP_0.5, mAP_0.5:0.95 ๋ฉํธ๋ฆญ์ ์ฌ์ฉํฉ๋๋ค.
- ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ์ ์ ํ๋ ๋ฐ ํ์
๋งค๊ฐ๋ณ์
- ๋ชจ๋ธ ํ์ดํผํ๋ผ๋ฏธํฐ
- ๋ช ๋ น์ค ์ต์ ์ ํตํด ์ ๋ฌ๋๋ ๋ชจ๋ ๋งค๊ฐ๋ณ์
์๊ฐํ
- ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ธ ์์ธก์ ํผ๋ ํ๋ ฌ
- ๋ชจ๋ ํด๋์ค์ PR ๋ฐ F1 ๊ณก์ ํ๋กฏ
- ํด๋์ค ๋ ์ด๋ธ์ ์๊ด๊ด๊ณ๋
Comet ๋ก๊น ๊ตฌ์ฑ
Comet ๋ ํธ๋ ์ด๋ ์คํฌ๋ฆฝํธ์ ์ ๋ฌ๋ ๋ช ๋ น์ค ํ๋๊ทธ ๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
export COMET_MODE=online # Set whether to run Comet in 'online' or 'offline' mode. Defaults to online
export COMET_MODEL_NAME=<your model name> #Set the name for the saved model. Defaults to yolov5
export COMET_LOG_CONFUSION_MATRIX=false # Set to disable logging a Comet Confusion Matrix. Defaults to true
export COMET_MAX_IMAGE_UPLOADS=<number of allowed images to upload to Comet> # Controls how many total image predictions to log to Comet. Defaults to 100.
export COMET_LOG_PER_CLASS_METRICS=true # Set to log evaluation metrics for each detected class at the end of training. Defaults to false
export COMET_DEFAULT_CHECKPOINT_FILENAME=<your checkpoint filename> # Set this if you would like to resume training from a different checkpoint. Defaults to 'last.pt'
export COMET_LOG_BATCH_LEVEL_METRICS=true # Set this if you would like to log training metrics at the batch level. Defaults to false.
export COMET_LOG_PREDICTIONS=true # Set this to false to disable logging model predictions
๋ค์์ ์ฌ์ฉํ์ฌ ์ฒดํฌํฌ์ธํธ ๋ก๊น Comet
Comet ์ ๋ชจ๋ธ ๋ก๊น
์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ํ์ฑํํ๋ ค๋ฉด save-period
์ธ์๋ฅผ ํธ๋ ์ด๋ ์คํฌ๋ฆฝํธ์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ค์์์ ์ ๊ณตํ ๊ฐ๊ฒฉ ๊ฐ์ ๋ฐ๋ผ ๊ธฐ๋ก๋ ์ฒดํฌํฌ์ธํธ๊ฐ Comet ์ ์ ์ฅ๋ฉ๋๋ค. save-period
python train.py \
--img 640 \
--batch 16 \
--epochs 5 \
--data coco128.yaml \
--weights yolov5s.pt \
--save-period 1
๋ก๊น ๋ชจ๋ธ ์์ธก
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ธ ์์ธก(์ด๋ฏธ์ง, ์ค์ธก ๊ธฐ์ค ๋ ์ด๋ธ ๋ฐ ๋ฐ์ด๋ฉ ๋ฐ์ค)์ Comet ์ ๊ธฐ๋ก๋ฉ๋๋ค.
๋ก๊น
๋ ์์ธก ๋ฐ ๊ด๋ จ ์ด๋ฏธ์ง์ ๋น๋๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. bbox_interval
๋ช
๋ น์ค ์ธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ธก์ Comet ์ ๋ฌผ์ฒด ๊ฐ์ง ์ฌ์ฉ์ ์ง์ ํจ๋. ์ด ๋น๋๋ ๋ฐ์ดํฐ์ ๋ชจ๋ N๋ฒ์งธ ๋ฐฐ์น์ ํด๋นํฉ๋๋ค. epoch. ์๋ ์์์๋ ๊ฐ ์ํฌํฌ์ ๋ํด ๋ ๋ฒ์งธ ๋ฐ์ดํฐ ๋ฐฐ์น๋ง๋ค ๋ก๊น
ํ๊ณ ์์ต๋๋ค.
์ฐธ๊ณ : YOLOv5 ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ดํฐ ๋ก๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐ์น ํฌ๊ธฐ๊ฐ 32๋ก ์ค์ ๋๋ฏ๋ก ๊ทธ์ ๋ฐ๋ผ ๋ก๊น ๋น๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๋ค์์ ํจ๋์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ ์์์ ๋๋ค.
python train.py \
--img 640 \
--batch 16 \
--epochs 5 \
--data coco128.yaml \
--weights yolov5s.pt \
--bbox_interval 2
๋ก๊ทธ์ธํ ์์ธก ์ด๋ฏธ์ง ์ ์ ์ดํ๊ธฐ Comet
YOLOv5 ์์ ์์ธก์ ๋ก๊น
ํ ๋ Comet ์ ๊ฐ ์์ธก ์ธํธ์ ๊ด๋ จ๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๊น
ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ 100๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ ์ด๋ฏธ์ง๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค. ์ด ์ซ์๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ผ ์ ์์ต๋๋ค. COMET_MAX_IMAGE_UPLOADS
ํ๊ฒฝ ๋ณ์์
๋๋ค.
env COMET_MAX_IMAGE_UPLOADS=200 python train.py \
--img 640 \
--batch 16 \
--epochs 5 \
--data coco128.yaml \
--weights yolov5s.pt \
--bbox_interval 1
ํด๋์ค ์์ค ๋ฉํธ๋ฆญ ๋ก๊น
์ฌ์ฉ COMET_LOG_PER_CLASS_METRICS
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ mAP๋ฅผ ๊ธฐ๋กํฉ๋๋ค, ์ ๋ฐ๋, ๋ฆฌ์ฝ, ๊ฐ ํด๋์ค์ ๋ํด f1.
env COMET_LOG_PER_CLASS_METRICS=true python train.py \
--img 640 \
--batch 16 \
--epochs 5 \
--data coco128.yaml \
--weights yolov5s.pt
Comet ์ํฐํฉํธ์ ๋ฐ์ดํฐ ์ธํธ ์ ๋ก๋ํ๊ธฐ
๋ค์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ค๋ ๊ฒฝ์ฐ Comet ์ํฐํฉํธ๋ฅผ ์ฌ์ฉํ์ฌ upload_dataset
ํ๋๊ทธ.
๋ฐ์ดํฐ ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. YOLOv5 ๋ฌธ์. ๋ฐ์ดํฐ ์ธํธ ๊ตฌ์ฑ yaml
ํ์ผ๊ณผ ๋์ผํ ํ์์ ๋ฐ๋ผ์ผ ํฉ๋๋ค. coco128.yaml
ํ์ผ์ ๋ง๋ญ๋๋ค.
python train.py \
--img 640 \
--batch 16 \
--epochs 5 \
--data coco128.yaml \
--weights yolov5s.pt \
--upload_dataset
์ ๋ก๋๋ ๋ฐ์ดํฐ ์ธํธ๋ Comet ์ํฌ์คํ์ด์ค์ ์ํฐํฉํธ ํญ์์ ์ฐพ์ ์ ์์ต๋๋ค.
Comet UI์์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ ์์ต๋๋ค.
์ํฐํฉํธ๋ ๋ฒ์ ์ด ๊ด๋ฆฌ๋๋ฉฐ ๋ฐ์ดํฐ ์ธํธ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ ์ถ๊ฐ๋ ์ง์ํฉ๋๋ค. Comet ์ ๋ฐ์ดํฐ ์ธํธ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๊ธฐ๋กํฉ๋๋ค. yaml
ํ์ผ
์ ์ฅ๋ ์ํฐํฉํธ ์ฌ์ฉ
Comet ์ํฐํฉํธ์ ๋ฐ์ดํฐ ์งํฉ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค. path
๋ณ์ yaml
ํ์ผ์ ๋ค์ ์ํฐํฉํธ ๋ฆฌ์์ค URL์ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.
# contents of artifact.yaml file
path: "comet://<workspace name>/<artifact name>:<artifact version or alias>"
๊ทธ๋ฐ ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ด ํ์ผ์ ๊ต์ก ์คํฌ๋ฆฝํธ์ ์ ๋ฌํฉ๋๋ค.
์ํฐํฉํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ์ํฌํ๋ก์ฐ๋ฅผ ํตํด ๋ฐ์ดํฐ์ ๊ณ๋ณด๋ฅผ ์ถ์ ํ ์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ ๋ก๋ํ ๋ฐ์ดํฐ ์งํฉ์ ์ฌ์ฉํ ๋ชจ๋ ์คํ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ํ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
ํ๋ จ ์คํ ์ฌ๊ฐํ๊ธฐ
์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ๋ฑ์ ์ด์ ๋ก ํธ๋ ์ด๋ ๋ฌ๋์ด ์ค๋จ๋ ๊ฒฝ์ฐ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ฌ๋์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. resume
ํ๋๊ทธ์ Comet ์คํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์คํ ๊ฒฝ๋ก์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. comet://<your workspace name>/<your project name>/<experiment id>
.
์ด๋ ๊ฒ ํ๋ฉด ์ค๋จ ์ ์ํ๋ก ์คํ์ด ๋ณต์๋๋ฉฐ, ์ฌ๊ธฐ์๋ ์ฒดํฌํฌ์ธํธ์์ ๋ชจ๋ธ ๋ณต์, ๋ชจ๋ ํ์ดํผํ๋ผ๋ฏธํฐ ๋ฐ ํ์ต ์ธ์ ๋ณต์, ์๋ ์คํ์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ Comet ๋ฐ์ดํฐ ์ธํธ ์ํฐํฉํธ ๋ค์ด๋ก๋๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฌ๊ฐ๋ ์คํ์ Comet UI์ ๊ธฐ์กด ์คํ์ ๊ณ์ ๋ก๊น ๋ฉ๋๋ค.
Comet ์ต์ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฒ์
YOLOv5 ๋ Comet ์ ์ต์ ํ ๋๊ตฌ์ ํตํฉ๋์ด Comet UI์์ ํ์ดํผํ๋ผ๋ฏธํฐ ์ค์์ ๊ฐํธํ๊ฒ ์๊ฐํํ ์ ์์ต๋๋ค.
์ตํฐ๋ง์ด์ ์ค์ ๊ตฌ์ฑ
Comet ์ตํฐ๋ง์ด์ ๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ์ค์์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋ JSON ํ์ผ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์์ ํ์ผ์ utils/loggers/comet/optimizer_config.json
python utils/loggers/comet/hpo.py \
--comet_optimizer_config "utils/loggers/comet/optimizer_config.json"
๊ทธ๋ฆฌ๊ณ hpo.py
์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ ์ธ์๋ฅผ ํ์ฉํฉ๋๋ค. train.py
. ์ค์์ ์ถ๊ฐ ์ธ์๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ์คํฌ๋ฆฝํธ ๋ค์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
python utils/loggers/comet/hpo.py \
--comet_optimizer_config "utils/loggers/comet/optimizer_config.json" \
--save-period 1 \
--bbox_interval 1
๋ณ๋ ฌ๋ก ์ค์ ์คํ
comet optimizer -j <set number of workers> utils/loggers/comet/hpo.py \
utils/loggers/comet/optimizer_config.json"
๊ฒฐ๊ณผ ์๊ฐํ
Comet ๋ ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์์ ์ค์์ด ์๋ฃ๋ ํ๋ก์ ํธ๋ฅผ ์ดํด๋ณด์ธ์.