Faster R-CNN from Scratch (Pascal VOC) β κ΅μ‘μ© κ΅¬ν
torchvisionμ μμ±λ νμ§κΈ°(fasterrcnn_resnet50_fpn)λ₯Ό μ°μ§ μκ³ ,
Faster R-CNNμ ν΅μ¬ ꡬμ±μμλ₯Ό λ°λ°λ₯λΆν° μ§μ ꡬννμ¬ μ리λ₯Ό
νμ΅νκΈ° μν μ μ₯μμ
λλ€. νμ΅ + νκ°(mAP) + μΆλ‘ μ 체 νμ΄νλΌμΈμ
ν¬ν¨ν©λλ€.
β οΈ μ±λ₯ κ²½κ³ : μ΄ μ μ₯μμ κ°μ€μΉ(
frcnn.pth)λ 1 μνλ§ νμ΅ν λ°λͺ¨μ©μ λλ€. μ€μ¬μ© λͺ©μ μ κ³ μ±λ₯ λͺ¨λΈμ΄ μλλΌ, "ꡬνμ΄ μ¬λ°λ₯Έκ°"λ₯Ό κ²μ¦νκ³ νμ΅ μ리λ₯Ό μ΄ν΄νκΈ° μν κ΅μ‘μ© μλ£μ λλ€. μ λλ‘ λ μ±λ₯μ΄ νμνλ©΄ 12 μν μ΄μ νμ΅νκ±°λ torchvision 곡μ ꡬνμ μ¬μ©νμΈμ.
무μμ μ§μ ꡬννλ
| ꡬμ±μμ | νμΌ | λ΄μ© |
|---|---|---|
| λ°μ΄ν° λ‘λ | 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 |
μ΄λ―Έμ§μ λ°μ€Β·λΌλ²¨Β·μ μ μκ°ν |
μν€ν μ²
μ΄λ―Έμ§
β ResNet50 (conv1~layer3, stride 16)
βΌ
νΉμ§λ§΅
βββΆ RPN ββ μ΅μ»€λ³ (κ°μ²΄μ¬λΆ + λ°μ€λ³΄μ ) ββ ν보μμ(proposal)
β
βΌ RoI Align (7x7)
RoI Head ββ (ν΄λμ€ λΆλ₯ + ν΄λμ€λ³ λ°μ€λ³΄μ ) ββ μ΅μ’
νμ§
μ¬μ©λ²
1. μ€λΉ
pip install torch torchvision pillow
Pascal VOC 2007 λ€μ΄λ‘λ (torchvision μλ):
import torchvision
torchvision.datasets.VOCDetection(root="./data", year="2007",
image_set="trainval", download=True)
2. νμ΅
python train.py --voc_root ./data/VOCdevkit/VOC2007 --epochs 12
3. μΆλ‘
python infer.py --ckpt frcnn.pth \
--image ./data/VOCdevkit/VOC2007/JPEGImages/000007.jpg \
--score_thresh 0.5
κ²°κ³Όλ results/ ν΄λμ λ°μ€κ° κ·Έλ €μ§ μ΄λ―Έμ§λ‘ μ μ₯λ©λλ€.
νμ΅ μ리 (μ½λμ λμ)
- μ΅μ»€ (
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(λ€μ€ μ€μΌμΌ) λ―Έμ μ© β μμ κ°μ²΄μ μ½ν¨
- λ°μ΄ν° μ¦κ° μ΅μν
νμ΅ κ³‘μ (1 μν μμ)
λ°λ°λ₯ ꡬνμ΄ μ¬λ°λ₯Έμ§λ lossκ° λ§€λλ½κ² κ°μνλμ§λ‘ κ²μ¦ν©λλ€.
iter 100 β loss 2.71
iter 800 β loss 1.30
iter 2100 β loss 1.10
iter 4400 β loss 0.98 (κ³μ κ°μ)
RPN μμ€μ΄ 0.69 β 0.10 μμ€μΌλ‘ λ¨μ΄μ§λ©° "κ°μ²΄ μμΉ μ°ΎκΈ°"λ₯Ό νμ΅νκ³ , RoI μμ€μ μ΄λ―Έμ§ λμ΄λμ λ°λΌ μΆλ μ΄μ§λ§ λμ νκ· μ΄ κ°μν©λλ€.
λΌμ΄μ μ€
MIT License. μμ λ‘κ² νμ΅Β·μμ Β·μ¬λ°°ν¬ κ°λ₯ν©λλ€. Pascal VOC λ°μ΄ν°μ μ λ³λ λΌμ΄μ μ€λ₯Ό λ°λ₯΄λ 곡μ μ¬μ΄νΈλ₯Ό νμΈνμΈμ.
λ©΄μ±
μ΄ κ΅¬νμ κ΅μ‘ λͺ©μ μ
λλ€. λ²€μΉλ§ν¬ μ±λ₯μ΄λ νλ‘λμ
λ°°ν¬κ° νμνλ©΄
torchvision 곡μ Faster R-CNN(fasterrcnn_resnet50_fpn)μ κΆμ₯ν©λλ€.