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/ 폴더에 λ°•μŠ€κ°€ κ·Έλ €μ§„ μ΄λ―Έμ§€λ‘œ μ €μž₯λ©λ‹ˆλ‹€.

ν•™μŠ΅ 원리 (μ½”λ“œμ™€ λŒ€μ‘)

  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(닀쀑 μŠ€μΌ€μΌ) 미적용 β†’ μž‘μ€ 객체에 약함
  • 데이터 증강 μ΅œμ†Œν™”

ν•™μŠ΅ 곑선 (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)을 ꢌμž₯ν•©λ‹ˆλ‹€.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support