Object Detection from Scratch โ Faster R-CNN vs YOLO
๊ฐ์ฒดํ์ง๋ฅผ ๋ฐ๋ฐ๋ฅ๋ถํฐ ์ง์ ๊ตฌํ(Faster R-CNN)ํ๊ณ , ์ด๋ฅผ ์ค๋ฌด ํ์ค์ธ YOLO์ ๋น๊ตํ๋ฉฐ ํ์ตํ๋ ๊ต์ก์ฉ ์ ์ฅ์์ ๋๋ค. 2-stage ํ์ง๊ธฐ์ ๋ด๋ถ ์๋ฆฌ๋ฅผ ์์ผ๋ก ๊ตฌํํด๋ณด๊ณ , 1-stage ํ์ง๊ธฐ(YOLO)์ ๊ฒฐ๊ณผยท์ฒ ํ์ ๋์กฐํฉ๋๋ค.
โ ๏ธ ์ฑ๋ฅ ๊ฒฝ๊ณ : ์ด ์ ์ฅ์์ Faster R-CNN ๊ฐ์ค์น(
frcnn.pth)๋ 1 ์ํญ๋ง ํ์ตํ ๋ฐ๋ชจ์ฉ์ ๋๋ค. ์ค์ฌ์ฉ ๋ชฉ์ ์ด ์๋๋ผ "๊ตฌํ์ด ์ฌ๋ฐ๋ฅธ๊ฐ"๋ฅผ ๊ฒ์ฆํ๊ณ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํ ๊ต์ก ์๋ฃ์ ๋๋ค.
๋ ๊ฐ์ง ์ ๊ทผ์ ๋์กฐ
| Faster R-CNN (์ง์ ๊ตฌํ) | YOLOv8 (Ultralytics) | |
|---|---|---|
| ๋ฐฉ์ | 2-stage (ํ๋ณด์์ญ โ ๋ถ๋ฅ) | 1-stage (ํ ๋ฒ์ ์์ธก) |
| ์๋ | ๋๋ฆผ | ๋งค์ฐ ๋น ๋ฆ (์ค์๊ฐ) |
| ๊ตฌํ | ๋ฐ๋ฐ๋ฅ๋ถํฐ (๊ต์ก์ ) | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ |
| ํ์ต ๋ฐ์ดํฐ | Pascal VOC (20 ํด๋์ค) | COCO (80 ํด๋์ค) |
| ์ด ์ ์ฅ์์ ์ญํ | ์๋ฆฌ ํ์ต | ์ค๋ฌด ํ์ค๊ณผ ๋น๊ต |
ํ์ผ ๊ตฌ์ฑ
Faster R-CNN ์ง์ ๊ตฌํ
| ํ์ผ | ๋ด์ฉ |
|---|---|
dataset.py |
VOC XML ํ์ฑ, ๋ฆฌ์ฌ์ด์ฆ, ์ ๊ทํ |
box_utils.py |
์ต์ปค ์์ฑ, IoU, ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ, NMS |
model.py |
ResNet50 ๋ฐฑ๋ณธ + RPN + RoI Align + RoI Head |
losses.py |
IoU ๊ธฐ๋ฐ ํ๊น ํ ๋น + RPN/RoI ์์ค |
train.py |
ํ์ต ๋ฃจํ + VOC mAP@0.5 |
infer.py |
์ถ๋ก + ๋ฐ์ค ์๊ฐํ |
YOLO ๋น๊ต
| ํ์ผ | ๋ด์ฉ |
|---|---|
yolo_infer.py |
YOLOv8(COCO ์ฌ์ ํ์ต) ์ถ๋ก โ ๊ฐ์ ์ด๋ฏธ์ง ๋น๊ต์ฉ |
์ฌ์ฉ๋ฒ
Faster R-CNN (์ง์ ๊ตฌํ)
pip install torch torchvision pillow
# VOC 2007 ๋ค์ด๋ก๋ (torchvision ์๋)
python -c "import torchvision; torchvision.datasets.VOCDetection(root='./data', year='2007', image_set='trainval', download=True)"
# ํ์ต
python train.py --voc_root ./data/VOCdevkit/VOC2007 --epochs 12
# ์ถ๋ก
python infer.py --ckpt frcnn.pth --image ./sample.jpg --score_thresh 0.5
YOLOv8 (๋น๊ต)
pip install ultralytics
# ๊ฐ์ ์ด๋ฏธ์ง๋ก ์ถ๋ก (๊ฒฐ๊ณผ๋ฅผ Faster R-CNN๊ณผ ๋น๊ต)
python yolo_infer.py --image ./sample.jpg
์ํคํ ์ฒ (Faster R-CNN)
์ด๋ฏธ์ง
โ ResNet50 (conv1~layer3, stride 16)
โผ
ํน์ง๋งต
โโโถ RPN โโ ์ต์ปค๋ณ (๊ฐ์ฒด์ฌ๋ถ + ๋ฐ์ค๋ณด์ ) โโ ํ๋ณด์์ญ(proposal)
โ
โผ RoI Align (7x7)
RoI Head โโ (ํด๋์ค ๋ถ๋ฅ + ํด๋์ค๋ณ ๋ฐ์ค๋ณด์ ) โโ ์ต์ข
ํ์ง
ํ์ต ์๋ฆฌ (์ฝ๋์ ๋์)
- ์ต์ปค (
box_utils.generate_anchors): ๊ฒฉ์๋ง๋ค 9๊ฐ ๊ธฐ์ค ๋ฐ์ค - RPN ํ๊น ํ ๋น (
losses.rpn_loss): IoUโฅ0.7 ๊ฐ์ฒด / <0.3 ๋ฐฐ๊ฒฝ - ํ๋ณด์์ญ ์์ฑ (
model._proposals): RPN ์ถ๋ ฅ โ NMS - RoI ํ๊น ํ ๋น (
losses.assign_roi_targets): IoUโฅ0.5 positive - RoI Align (
model.RoIHead): ํ๋ณด์์ญ โ 7ร7 ๊ณ ์ ํน์ง - ์์ค: ๋ถ๋ฅ(CE/BCE) + ํ๊ท(smooth L1), positive์๋ง ํ๊ท
๋จ์ํํ ๋ถ๋ถ (์๋ ผ๋ฌธ ๋๋น)
batch_size=1๊ณ ์ - RPN objectness๋ฅผ 1-logit(BCE)์ผ๋ก ์ฒ๋ฆฌ
- RoI Head๋ฅผ layer4 ๋์ FC๋ก ๊ตฌ์ฑ
- FPN ๋ฏธ์ ์ฉ โ ์์ ๊ฐ์ฒด์ ์ฝํจ
๋ผ์ด์ ์ค
- ์ด ์ ์ฅ์์ ์ฝ๋: MIT License
- YOLOv8 (
yolo_infer.py๊ฐ ์ฌ์ฉ): Ultralytics YOLO๋ AGPL-3.0.yolo_infer.py๋ Ultralytics๋ฅผ ํธ์ถ๋ง ํ๋ฉฐ, YOLO ๊ฐ์ค์น๋ ํฌํจํ์ง ์์ต๋๋ค(์ฌ์ฉ์๊ฐ ์คํ ์ ์๋ ๋ค์ด๋ก๋). ์์ ์ ํ์์์ค ์ฌ์ฉ ์ Ultralytics ์์ฉ ๋ผ์ด์ ์ค๊ฐ ๋ณ๋๋ก ํ์ํฉ๋๋ค. - Pascal VOC ๋ฐ์ดํฐ์ ์ ๊ณต์ ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.
๋ฉด์ฑ
๊ต์ก ๋ชฉ์ ๊ตฌํ์
๋๋ค. ํ๋ก๋์
๋ฐฐํฌ๊ฐ ํ์ํ๋ฉด torchvision ๊ณต์
Faster R-CNN(fasterrcnn_resnet50_fpn_v2) ๋๋ Ultralytics YOLO๋ฅผ
์ ์ ๋ผ์ด์ ์ค ํ์ ์ฌ์ฉํ์ธ์.