Skip to content

boostcampaitech5/level3_cv_finalproject-cv-07

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

μ˜μƒ 기반 농ꡬ 점수 μžλ™ 기둝 AI μ„œλΉ„μŠ€βœ¨

Read this in other languages: English, ν•œκ΅­μ–΄

πŸ€ λ°°κ²½

 농ꡬ κ²½κΈ°μ—μ„œ μ„ μˆ˜κ°€ μ–Όλ§ˆλ‚˜ 골을 잘 λ„£μ„κΉŒ 생각해 보신 적이 μžˆλ‚˜μš”? λ§Œμ•½ μ–΄λ–€ μ„ μˆ˜μ˜ μ•Όνˆ¬μœ¨μ„ μˆ˜μž‘μ—…μœΌλ‘œ κ³„μ‚°ν•œλ‹€κ³  ν•˜λ©΄ λ§Žμ€ μ‹œκ°„κ³Ό λ…Έλ ₯이 ν•„μš”ν•  κ²ƒμž…λ‹ˆλ‹€. κ²Œλ‹€κ°€ λ°”μœ ν˜„λŒ€μΈλ“€μ€ 본인 ν˜Ήμ€ μ„ μˆ˜λ“€μ— λŒ€ν•œ λͺ¨λ“  κ²½κΈ° μ˜μƒμ„ μ‹œμ²­ν•˜κ³  뢄석할 μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€. 이처럼 농ꡬ 경기에 λŒ€ν•΄ λΆ„μ„ν•˜κ³  μ‹Άμ§€λ§Œ, μ‹œκ°„μ΄ μ—†μ–΄ λ§μ„€μ΄λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ μ €ν¬λŠ” λ”₯λŸ¬λ‹μ„ μ‚¬μš©ν•œ μ˜μƒ 기반 농ꡬ 점수 μžλ™ 기둝 AI μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€! 😊


🧠 λͺ¨λΈ

Β μš°λ¦¬λŠ” λͺ©ν‘œλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ 두 κ°€μ§€μ˜ λͺ¨λΈμ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 첫 번째 λͺ¨λΈμ€ μ„ μˆ˜, 곡, κ³¨λŒ€, μŠ›, 골을 κ°μ§€ν•˜λŠ” 데 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 두 번째 λͺ¨λΈμ€ ν”„λ ˆμž„λ³„λ‘œ 개인의 idλ₯Ό μΆ”μ ν•˜λŠ” 데 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 즉, μš°λ¦¬λŠ” μ•Όνˆ¬μœ¨ 좔적기λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ Object Detectionκ³Ό Person Re-Identification λͺ¨λΈμ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. Object Detection λͺ¨λΈμ€ Deci-AIμ—μ„œ κ°œλ°œν•œ super-gradients의 YOLO-NAS-Lλ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ Person Re-Identification λͺ¨λΈμ€ 더 λΉ λ₯Έ μΆ”λ‘  속도와 더 μž‘μ€ λͺ¨λΈ 크기λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•΄ MobileNetV3λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.


Ⓜ️ Faiss

 메타가 λ§Œλ“  FaissλŠ” μ—¬λŸ¬ 벑터 ν‘œν˜„ κ°„μ˜ μœ μ‚¬μ„±μ„ λΉ λ₯΄κ²Œ 검색할 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 μ–΄λ–€ μ„ μˆ˜κ°€ μŠ›μ„ 쏘고 골을 λ„£μ—ˆλŠ”μ§€ νŒŒμ•…ν•  수 있기 λ•Œλ¬Έμ— ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ— κΌ­ ν•„μš”ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. μ²˜μŒμ—λŠ” μœ μ‚¬μ„±μ„ μΈ‘μ •ν•˜κΈ° μœ„ν•΄ L2 (μœ ν΄λ¦¬λ“œ) 거리λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈν•˜μ˜€κ³  쒋은 κ²°κ³Όλ₯Ό μ–»μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μΆ”κ°€ μ‹€ν—˜μ„ κ±°μ³μ„œ Cosine Similarityλ₯Ό ν™œμš©ν•œ 것이 더 λ‚˜μ€ κ²°κ³Όλ₯Ό λ„μΆœν•œλ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μš°λ¦¬λŠ” μ΅œμ’…μ μΈ Cosine Similarityλ₯Ό 검색 λ°©λ²•μœΌλ‘œ μ±„νƒν•˜κΈ°λ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€


πŸ–ΌοΈ Object Detection + Person Re-Identification μΆ”λ‘  λ‹€μ΄μ–΄κ·Έλž¨

Β μ•„λž˜λŠ” 우리 ν”„λ‘œμ νŠΈμ˜ 흐름을 λ‚˜νƒ€λ‚΄λŠ” λ‹€μ΄μ–΄κ·Έλž¨μž…λ‹ˆλ‹€. μž…λ ₯ ν”„λ ˆμž„μ΄ 주어지면, Detection λͺ¨λΈμ„ 톡해 μ„ μˆ˜, 곡, κ³¨λŒ€, μŠ›, 골 클래슀λ₯Ό κ°μ§€ν•©λ‹ˆλ‹€. 이 쀑 μ„ μˆ˜ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μΆ”μΆœν•˜μ—¬ Re-ID λͺ¨λΈμ— μž…λ ₯으둜 μ œκ³΅ν•©λ‹ˆλ‹€. μ΄μ–΄μ„œ Re-ID λͺ¨λΈμ€ 개개인의 이미지λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μž„λ² λ”© 벑터λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. ν•΄λ‹Ή 벑터듀은 Faiss에 μΆ”κ°€λ˜μ–΄, 각 μž„λ² λ”© 벑터에 ν•΄λ‹Ήν•˜λŠ” μƒμœ„ 5개의 IDλ₯Ό 얻을 수 있게 λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 얻어진 결과듀에 λŒ€ν•΄ μ΅œμ’…μ μœΌλ‘œ κ°€μž₯ 높은 신뒰도λ₯Ό 가진 IDλ₯Ό ν™•μ •ν•˜κΈ° μœ„ν•΄ hard voting을 ν™œμš©ν•©λ‹ˆλ‹€.


πŸ“ ν•™μŠ΅ μ‹€ν—˜ κ²°κ³Ό

Object Detection λͺ¨λΈ

Models Dataset1 Input Dimensions Epochs Batch Size (Accumulate) Optimizer LR Loss Augmentations F1val
0.5
mAPval
0.5
YOLO NAS-L D1 (1920,1088) 50 8
(64)
AdamW 0.00001 PPYOLOE Resize
Normalize
HorizontalFlip
0.2811 0.6485
YOLO NAS-L D2 (1920,1088) 215 8
(64)
AdamW 0.0001 PPYOLOE HSV
Mosaic
RandomAffine
HorizontalFlip
PaddedRescale
Standardize
0.8709 0.9407

Person Re-Identification λͺ¨λΈ

Models Dataset2 Embedded Dimensions Epochs Batch Size Optimizer LR Loss Augmentations mAPval
MobileNetV3 R1 1000 100 64 AdamW 0.001 TripletLoss Resize
Normalize
HorizontalFlip
0.9829
MobileVitV2 R1 1000 100 64 AdamW 0.001 TripletLoss Resize
Normalize
HorizontalFlip
0.9748
ConvNextV2-A R1 1000 100 64 AdamW 0.001 TripletLoss Resize
Normalize
HorizontalFlip
0.9721
SqueezeNet R1 1000 100 64 AdamW 0.001 TripletLoss Resize
Normalize
HorizontalFlip
0.9758
MobileNetV3 R2 1000 100 64 AdamW 0.001 TripletLoss Resize
Normalize
HorizontalFlip
0.8743
MobileNetV3 R2 1000 100 64 AdamW 0.001 QuadrupletLoss Resize
Normalize
HorizontalFlip
0.9782
SqueezeNetMod3 R2 1000 500 64 AdamW 0.001 QuadrupletLoss Resize
Normalize
HorizontalFlip
0.9857
MobileNetV3 R2 1000 500 64 AdamW 0.001 QuadrupletLoss Resize
Normalize
HorizontalFlip
0.9923

πŸ› οΈ μ„€μΉ˜

git clone https://github.com/boostcampaitech5/level3_cv_finalproject-cv-07.git
cd level3_cv_finalproject-cv-07
conda env create --name <env_name> -f env.yaml

πŸ—‚οΈ Dataset 경둜 μ„€μ •

Object Detection 경둜

Dataset을 λ‹€μŒκ³Ό 같은 κ²½λ‘œμ— ꡬ성해 μ£Όμ„Έμš”:

  1. data 파일λͺ…은 ν•™μŠ΅μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ json 파일λͺ…은 train.jsonκ³Ό valid.json둜 μ„€μ •ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
detection
β”œβ”€β”€ data
β”‚   β”œβ”€β”€ dataset
|   |    β”œβ”€β”€ train
|   |    |   β”œβ”€β”€ <sample1>.jpg
|   |    |   β”œβ”€β”€ <sample2>.jpg
|   |    |   ...
|   |    |   └── <sample10>.jpg
|   |    β”œβ”€β”€ valid
|   |    |   β”œβ”€β”€ <sample1>.jpg
|   |    |   β”œβ”€β”€ <sample2>.jpg
|   |    |   ...
|   |    |   └── <sample10>.jpg
|   |    β”œβ”€β”€ train.json
|   |    └── valid.json
β”‚   β”œβ”€β”€ images
β”‚   └── video
...

Person Re-Identifcation 경둜

Dataset을 λ‹€μŒκ³Ό 같은 κ²½λ‘œμ— ꡬ성해 μ£Όμ„Έμš”:

  1. 각 데이터 ν•­λͺ©λͺ…을 λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ ꡬ성해야 ν•©λ‹ˆλ‹€ : xxxxx_xx.jpg or xxxxx_xx_xx.jpg
  2. ν•΄λ‹Ή ν˜•μ‹μ—μ„œ 처음 5개의 μˆ«μžλŠ” μ‚¬λžŒμ˜ ID 번호λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
re_id
β”œβ”€β”€ data
β”‚   └── custom_dataset
|       β”œβ”€β”€ gallery
|       |   β”œβ”€β”€ <00001_01>.jpg
|       |   β”œβ”€β”€ <00001_02>.jpg
|       |   β”œβ”€β”€ <00002_01>.jpg
|       |   β”œβ”€β”€ <00002_02>.jpg
|       |   ...
|       |   └── <00010_2>.jpg
|       β”œβ”€β”€ query
|       |   β”œβ”€β”€ <00001_01>.jpg
|       |   β”œβ”€β”€ <00001_02>.jpg
|       |   β”œβ”€β”€ <00002_01>.jpg
|       |   β”œβ”€β”€ <00002_02>.jpg
|       |   ...
|       |   └── <00010_2>.jpg
|       └── training
|           β”œβ”€β”€ <00001_01>.jpg
|           β”œβ”€β”€ <00001_02>.jpg
|           β”œβ”€β”€ <00002_01>.jpg
|           β”œβ”€β”€ <00002_02>.jpg
|           ...
|           └── <00010_2>.jpg
... 

Magic 경둜

이곳에 μΆ”λ‘ ν•  λΉ„λ””μ˜€λ₯Ό μ €μž₯ν•΄ μ£Όμ„Έμš”.

datasets
β”œβ”€β”€ <video1>.mp4
β”œβ”€β”€ <video2>.mp4
... 

πŸ‘¨πŸ»β€πŸ’» 단 ν•˜λ‚˜μ˜ Command Line으둜 ν•™μŠ΅ 및 μΆ”λ‘ 

Detection Model ν•™μŠ΅


cd detection/tools
python3 train.py --exp_name exp1 --input_dim (1920,1088) --epochs 100 --lr 0.0001 --batch_size 8 --optimizer AdamW --num_workers 4 --warmup_initial_lr 0.00001 --lr_warmup_epochs 5 --score_thr 0.8 --nms_thr 0.8 -- metric F1@0.50 --fp16 True
  • --exp_name: μ‹€ν—˜λͺ…
  • --input_dim: input dimensions
  • --epochs: epoch
  • --lr: learning rate
  • --batch_size: batch size
  • --optimizer: optimizer
  • --num_workers: dataloader num workers
  • --warmup_initial_lr: warmup initial learning rate
  • --lr_warmup_epochs: learning rate warmup epochs
  • --score_thr: score threshold
  • --nms_thr: non-max suppression threshold
  • --metric: evaluation metric
  • --fp16: mixed precision training

Detection Model μΆ”λ‘ 


cd detection/tools
python3 inference.py --image True --video False --file_name image1.png --conf 0.25 --iou 0.35 --model_weight <your_exp_name>/<your_detection_weight>

image λž‘ video λŠ” λ™μ‹œμ— True 둜 μ„€μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€!

  • --image: image μΆ”λ‘ 
  • --video: video μΆ”λ‘ 
  • --file_name: μΆ”λ‘ ν•  image λ˜λŠ” video 파일
  • --conf: confidence threshold
  • --iou: iou threshold
  • --model_weight: model weight file

Person Re-Identification Model ν•™μŠ΅


cd re_id/tools
python3 train.py --demo False --seed 1 --model mobilenetv3 --epoch 100 --train_batch 64 --valid_batch 256 --lr 0.001 --num_workers 8 --quadruplet True --scheduler False --fp16 False
  • --demo: True DeepSportsRadar dataset μ‚¬μš© | False Custom dataset μ‚¬μš©
  • --seed: seed number
  • --model: model. μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λΈμ€ model.py 을 μ°Έκ³ ν•΄ μ£Όμ„Έμš”.
  • --epoch: epoch
  • --train_batch: train batch size
  • --valid_batch: valid batch size
  • --lr: learning rate
  • --num_workers: dataloader num workers
  • --quadruplet: True quadruplet loss μ‚¬μš© | False triplet loss μ‚¬μš©
  • --scheduler: lambda scheduler with 0.95**epoch
  • --fp16: mixed precision training

Person Re-Identification Model μΆ”λ‘ 


cd re_id/tools
python3 inference.py --demo False --model mobilenetv3 --model_weight <your_reid_weight> --batch_size 256 --num_workers 8 --query_index 0
  • --demo: True DeepSportsRadar dataset μ‚¬μš© | False Custom dataset μ‚¬μš©
  • --model: model
  • --model_weight: model weight file
  • --batch size: test batch size
  • --num worker: dataloader num worker
  • --query_index: query index

Magic μΆ”λ‘  (μ΅œμ’… κ²°κ³Ό λ„μΆœ)


python3 magic.py --detection_weight <exp_name>/<your_detection_weight> --reid_weight <your_reid_weight> --video_file <your_video_file> --reid_model mobilenetv3 --person_thr 0.5 --cosine_thr 0.5
  • --detection_weight: detection model trained weight
  • --reid_weight: re-id model trained weight
  • --video_file: μΆ”λ‘ ν•  video 파일
  • --reid_model: re-id model
  • --person_thr: person confidence threshold
  • --cosine_thr: cosine similarity threshold

멀버

κ³ κΈˆκ°• κΉ€λ™μš° 박쀀일 μž„μž¬κ·œ μ΅œμ§€μš±
Github Github Github Github Github
twinkay@yonsei.ac.kr dwkim8155@gmail.com joonil2613@gmail.com jaekyu.1998.bliz@gmail.com guk9898@gmail.com

Footnotes

  1. D1, D2 Dataset은 μ €ν¬μ˜ Custom Datasetμž…λ‹ˆλ‹€. D2은 D1보닀 μ•½ 3.1λ°° λ§Žμ€ 데이터λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. ↩

  2. R1, R2 Dataset은 μ €ν¬μ˜ Custom Datasetμž…λ‹ˆλ‹€. R2κ°€ R1보닀 쑰금 더 λ§Žμ€ 데이터와 idλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. ↩

  3. 8배의 채널 압좕을 ν•œ SqueezeNet + CBAM ↩

About

level3_cv_finalproject-cv-07 created by GitHub Classroom

Resources

Stars

Watchers

Forks

Packages

No packages published