File size: 4,102 Bytes
a3a92f1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | ---
license: mit
tags:
- object-detection
- faster-rcnn
- yolo
- pascal-voc
- pytorch
- educational
- from-scratch
library_name: pytorch
pipeline_tag: object-detection
datasets:
- pascal-voc-2007
language:
- en
---
# 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 (์ง์ ๊ตฌํ)
```bash
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 (๋น๊ต)
```bash
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 โโ (ํด๋์ค ๋ถ๋ฅ + ํด๋์ค๋ณ ๋ฐ์ค๋ณด์ ) โโ ์ต์ข
ํ์ง
```
## ํ์ต ์๋ฆฌ (์ฝ๋์ ๋์)
1. **์ต์ปค** (`box_utils.generate_anchors`): ๊ฒฉ์๋ง๋ค 9๊ฐ ๊ธฐ์ค ๋ฐ์ค
2. **RPN ํ๊น ํ ๋น** (`losses.rpn_loss`): IoUโฅ0.7 ๊ฐ์ฒด / <0.3 ๋ฐฐ๊ฒฝ
3. **ํ๋ณด์์ญ ์์ฑ** (`model._proposals`): RPN ์ถ๋ ฅ โ NMS
4. **RoI ํ๊น ํ ๋น** (`losses.assign_roi_targets`): IoUโฅ0.5 positive
5. **RoI Align** (`model.RoIHead`): ํ๋ณด์์ญ โ 7ร7 ๊ณ ์ ํน์ง
6. **์์ค**: ๋ถ๋ฅ(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๋ฅผ
์ ์ ๋ผ์ด์ ์ค ํ์ ์ฌ์ฉํ์ธ์.
|