| --- |
| 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๋ฅผ |
| ์ ์ ๋ผ์ด์ ์ค ํ์ ์ฌ์ฉํ์ธ์. |
|
|