Object detection from scratch: Faster R-CNN + YOLO comparison
Browse files
README.md
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
tags:
|
| 4 |
+
- object-detection
|
| 5 |
+
- faster-rcnn
|
| 6 |
+
- yolo
|
| 7 |
+
- pascal-voc
|
| 8 |
+
- pytorch
|
| 9 |
+
- educational
|
| 10 |
+
- from-scratch
|
| 11 |
+
library_name: pytorch
|
| 12 |
+
pipeline_tag: object-detection
|
| 13 |
+
datasets:
|
| 14 |
+
- pascal-voc-2007
|
| 15 |
+
language:
|
| 16 |
+
- en
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
# Object Detection from Scratch โ Faster R-CNN vs YOLO
|
| 20 |
+
|
| 21 |
+
๊ฐ์ฒดํ์ง๋ฅผ **๋ฐ๋ฐ๋ฅ๋ถํฐ ์ง์ ๊ตฌํ**(Faster R-CNN)ํ๊ณ , ์ด๋ฅผ ์ค๋ฌด ํ์ค์ธ
|
| 22 |
+
**YOLO์ ๋น๊ต**ํ๋ฉฐ ํ์ตํ๋ ๊ต์ก์ฉ ์ ์ฅ์์
๋๋ค.
|
| 23 |
+
2-stage ํ์ง๊ธฐ์ ๋ด๋ถ ์๋ฆฌ๋ฅผ ์์ผ๋ก ๊ตฌํํด๋ณด๊ณ , 1-stage ํ์ง๊ธฐ(YOLO)์
|
| 24 |
+
๊ฒฐ๊ณผยท์ฒ ํ์ ๋์กฐํฉ๋๋ค.
|
| 25 |
+
|
| 26 |
+
> โ ๏ธ **์ฑ๋ฅ ๊ฒฝ๊ณ **: ์ด ์ ์ฅ์์ Faster R-CNN ๊ฐ์ค์น(`frcnn.pth`)๋
|
| 27 |
+
> **1 ์ํญ๋ง ํ์ตํ ๋ฐ๋ชจ์ฉ**์
๋๋ค. ์ค์ฌ์ฉ ๋ชฉ์ ์ด ์๋๋ผ "๊ตฌํ์ด ์ฌ๋ฐ๋ฅธ๊ฐ"๋ฅผ
|
| 28 |
+
> ๊ฒ์ฆํ๊ณ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํ **๊ต์ก ์๋ฃ**์
๋๋ค.
|
| 29 |
+
|
| 30 |
+
## ๋ ๊ฐ์ง ์ ๊ทผ์ ๋์กฐ
|
| 31 |
+
|
| 32 |
+
| | Faster R-CNN (์ง์ ๊ตฌํ) | YOLOv8 (Ultralytics) |
|
| 33 |
+
|---|---|---|
|
| 34 |
+
| ๋ฐฉ์ | 2-stage (ํ๋ณด์์ญ โ ๋ถ๋ฅ) | 1-stage (ํ ๋ฒ์ ์์ธก) |
|
| 35 |
+
| ์๋ | ๋๋ฆผ | ๋งค์ฐ ๋น ๋ฆ (์ค์๊ฐ) |
|
| 36 |
+
| ๊ตฌํ | ๋ฐ๋ฐ๋ฅ๋ถํฐ (๊ต์ก์ ) | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ |
|
| 37 |
+
| ํ์ต ๋ฐ์ดํฐ | Pascal VOC (20 ํด๋์ค) | COCO (80 ํด๋์ค) |
|
| 38 |
+
| ์ด ์ ์ฅ์์ ์ญํ | **์๋ฆฌ ํ์ต** | **์ค๋ฌด ํ์ค๊ณผ ๋น๊ต** |
|
| 39 |
+
|
| 40 |
+
## ํ์ผ ๊ตฌ์ฑ
|
| 41 |
+
|
| 42 |
+
**Faster R-CNN ์ง์ ๊ตฌํ**
|
| 43 |
+
| ํ์ผ | ๋ด์ฉ |
|
| 44 |
+
|------|------|
|
| 45 |
+
| `dataset.py` | VOC XML ํ์ฑ, ๋ฆฌ์ฌ์ด์ฆ, ์ ๊ทํ |
|
| 46 |
+
| `box_utils.py` | ์ต์ปค ์์ฑ, IoU, ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ, NMS |
|
| 47 |
+
| `model.py` | ResNet50 ๋ฐฑ๋ณธ + RPN + RoI Align + RoI Head |
|
| 48 |
+
| `losses.py` | IoU ๊ธฐ๋ฐ ํ๊น ํ ๋น + RPN/RoI ์์ค |
|
| 49 |
+
| `train.py` | ํ์ต ๋ฃจํ + VOC mAP@0.5 |
|
| 50 |
+
| `infer.py` | ์ถ๋ก + ๋ฐ์ค ์๊ฐํ |
|
| 51 |
+
|
| 52 |
+
**YOLO ๋น๊ต**
|
| 53 |
+
| ํ์ผ | ๋ด์ฉ |
|
| 54 |
+
|------|------|
|
| 55 |
+
| `yolo_infer.py` | YOLOv8(COCO ์ฌ์ ํ์ต) ์ถ๋ก โ ๊ฐ์ ์ด๋ฏธ์ง ๋น๊ต์ฉ |
|
| 56 |
+
|
| 57 |
+
## ์ฌ์ฉ๋ฒ
|
| 58 |
+
|
| 59 |
+
### Faster R-CNN (์ง์ ๊ตฌํ)
|
| 60 |
+
|
| 61 |
+
```bash
|
| 62 |
+
pip install torch torchvision pillow
|
| 63 |
+
|
| 64 |
+
# VOC 2007 ๋ค์ด๋ก๋ (torchvision ์๋)
|
| 65 |
+
python -c "import torchvision; torchvision.datasets.VOCDetection(root='./data', year='2007', image_set='trainval', download=True)"
|
| 66 |
+
|
| 67 |
+
# ํ์ต
|
| 68 |
+
python train.py --voc_root ./data/VOCdevkit/VOC2007 --epochs 12
|
| 69 |
+
|
| 70 |
+
# ์ถ๋ก
|
| 71 |
+
python infer.py --ckpt frcnn.pth --image ./sample.jpg --score_thresh 0.5
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
### YOLOv8 (๋น๊ต)
|
| 75 |
+
|
| 76 |
+
```bash
|
| 77 |
+
pip install ultralytics
|
| 78 |
+
|
| 79 |
+
# ๊ฐ์ ์ด๋ฏธ์ง๋ก ์ถ๋ก (๊ฒฐ๊ณผ๋ฅผ Faster R-CNN๊ณผ ๋น๊ต)
|
| 80 |
+
python yolo_infer.py --image ./sample.jpg
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
## ์ํคํ
์ฒ (Faster R-CNN)
|
| 84 |
+
|
| 85 |
+
```
|
| 86 |
+
์ด๋ฏธ์ง
|
| 87 |
+
โ ResNet50 (conv1~layer3, stride 16)
|
| 88 |
+
โผ
|
| 89 |
+
ํน์ง๋งต
|
| 90 |
+
โโโถ RPN โโ ์ต์ปค๋ณ (๊ฐ์ฒด์ฌ๋ถ + ๋ฐ์ค๋ณด์ ) โโ ํ๋ณด์์ญ(proposal)
|
| 91 |
+
โ
|
| 92 |
+
โผ RoI Align (7x7)
|
| 93 |
+
RoI Head โโ (ํด๋์ค ๋ถ๋ฅ + ํด๋์ค๋ณ ๋ฐ์ค๋ณด์ ) โโ ์ต์ข
ํ์ง
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
## ํ์ต ์๋ฆฌ (์ฝ๋์ ๋์)
|
| 97 |
+
|
| 98 |
+
1. **์ต์ปค** (`box_utils.generate_anchors`): ๊ฒฉ์๋ง๋ค 9๊ฐ ๊ธฐ์ค ๋ฐ์ค
|
| 99 |
+
2. **RPN ํ๊น ํ ๋น** (`losses.rpn_loss`): IoUโฅ0.7 ๊ฐ์ฒด / <0.3 ๋ฐฐ๊ฒฝ
|
| 100 |
+
3. **ํ๋ณด์์ญ ์์ฑ** (`model._proposals`): RPN ์ถ๋ ฅ โ NMS
|
| 101 |
+
4. **RoI ํ๊น ํ ๋น** (`losses.assign_roi_targets`): IoUโฅ0.5 positive
|
| 102 |
+
5. **RoI Align** (`model.RoIHead`): ํ๋ณด์์ญ โ 7ร7 ๊ณ ์ ํน์ง
|
| 103 |
+
6. **์์ค**: ๋ถ๋ฅ(CE/BCE) + ํ๊ท(smooth L1), positive์๋ง ํ๊ท
|
| 104 |
+
|
| 105 |
+
## ๋จ์ํํ ๋ถ๋ถ (์๋
ผ๋ฌธ ๋๋น)
|
| 106 |
+
|
| 107 |
+
- `batch_size=1` ๊ณ ์
|
| 108 |
+
- RPN objectness๋ฅผ 1-logit(BCE)์ผ๋ก ์ฒ๋ฆฌ
|
| 109 |
+
- RoI Head๋ฅผ layer4 ๋์ FC๋ก ๊ตฌ์ฑ
|
| 110 |
+
- FPN ๋ฏธ์ ์ฉ โ ์์ ๊ฐ์ฒด์ ์ฝํจ
|
| 111 |
+
|
| 112 |
+
## ๋ผ์ด์ ์ค
|
| 113 |
+
|
| 114 |
+
- **์ด ์ ์ฅ์์ ์ฝ๋**: MIT License
|
| 115 |
+
- **YOLOv8** (`yolo_infer.py`๊ฐ ์ฌ์ฉ): Ultralytics YOLO๋ **AGPL-3.0**.
|
| 116 |
+
`yolo_infer.py`๋ Ultralytics๋ฅผ *ํธ์ถ*๋ง ํ๋ฉฐ, YOLO ๊ฐ์ค์น๋ ํฌํจํ์ง
|
| 117 |
+
์์ต๋๋ค(์ฌ์ฉ์๊ฐ ์คํ ์ ์๋ ๋ค์ด๋ก๋). ์์
์ ํ์์์ค ์ฌ์ฉ ์
|
| 118 |
+
Ultralytics ์์ฉ ๋ผ์ด์ ์ค๊ฐ ๋ณ๋๋ก ํ์ํฉ๋๋ค.
|
| 119 |
+
- Pascal VOC ๋ฐ์ดํฐ์
์ ๊ณต์ ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ
๋๋ค.
|
| 120 |
+
|
| 121 |
+
## ๋ฉด์ฑ
|
| 122 |
+
|
| 123 |
+
๊ต์ก ๋ชฉ์ ๊ตฌํ์
๋๋ค. ํ๋ก๋์
๋ฐฐํฌ๊ฐ ํ์ํ๋ฉด torchvision ๊ณต์
|
| 124 |
+
Faster R-CNN(`fasterrcnn_resnet50_fpn_v2`) ๋๋ Ultralytics YOLO๋ฅผ
|
| 125 |
+
์ ์ ๋ผ์ด์ ์ค ํ์ ์ฌ์ฉํ์ธ์.
|