Anchor box ও NMS
এই পাঠে যা শিখবেন
- Anchor box-এর role ও design
- NMS algorithm step-by-step
- Soft-NMS, Matrix NMS variants
- NumPy-এ NMS implement
১ · Anchor box কেন
Detection-এ "এই pixel-এ কী object?" — এই question-এর সরাসরি উত্তর কঠিন। কারণ — object size variable, position variable, scale variable।
Solution: pre-define কয়েকটি "guess" box (anchor)। Network-এর কাজ — anchor-এর offset predict (much easier)।
Anchor = "starting hypothesis"। Network refine করে "actual box"-এ। Direct regression-এর চেয়ে — anchor-relative regression-এ training stable।
২ · Anchor design
Standard Faster R-CNN/YOLO setup:
- Scales: 32, 64, 128, 256, 512 px (multi-scale)।
- Aspect ratios: 1:1, 1:2, 2:1 (sometimes 1:3, 3:1)।
- Per location: 3 scales × 3 ratios = 9 anchor।
- FPN: different scale per pyramid level।
৩ · Anchor matching (during training)
Each anchor — match with ground-truth (GT) box:
- Positive: IoU(anchor, GT) > 0.7 → predict GT class + offset।
- Negative: IoU < 0.3 → predict "background"।
- Ignore: 0.3 ≤ IoU ≤ 0.7 → no gradient (ambiguous)।
৪ · Box parameterization
Network predict offset, not absolute box:
$$t_x = (x - x_a) / w_a, \quad t_y = (y - y_a) / h_a$$ $$t_w = \log(w / w_a), \quad t_h = \log(h / h_a)$$
- $(x_a, y_a, w_a, h_a)$ — anchor box।
- $(t_x, t_y, t_w, t_h)$ — predicted offsets।
- Log scale on w, h — multiplicative-এ stable।
৫ · NMS — Non-Maximum Suppression
Detection output dense — same object multiple time। NMS removes duplicates।
Algorithm:
- Confidence-এ sort detections (descending)।
- Top detection keep।
- IoU > threshold (typical 0.5)-এ যেগুলো — discard।
- Repeat with next top।
- Continue till empty।
৬ · Soft-NMS (২০১৭, Bodla et al.)
Hard discard problem: crowded scene-এ — দু'টি car touching, একটি keep, একটি miss।
Soft-NMS solution: confidence-কে decay (not zero):
$$s_i' = s_i \cdot e^{-\frac{\text{IoU}^2}{\sigma}}$$
- High IoU — confidence drastically reduce।
- Low IoU — confidence preserve।
- Final filter — confidence threshold।
৭ · NMS variants
- Greedy NMS: standard, simple।
- Soft-NMS: gradual decay।
- Weighted NMS: overlapping box-এর coordinate average।
- Matrix NMS (SOLO): parallelizable।
- DIoU-NMS: distance-aware IoU।
- Cluster-NMS: multi-class joint।
৮ · NumPy-তে NMS implement
import numpy as np
def iou(box, boxes):
"""Compute IoU between one box and array of boxes."""
x1 = np.maximum(box[0], boxes[:, 0])
y1 = np.maximum(box[1], boxes[:, 1])
x2 = np.minimum(box[2], boxes[:, 2])
y2 = np.minimum(box[3], boxes[:, 3])
inter = np.maximum(0, x2-x1) * np.maximum(0, y2-y1)
a1 = (box[2]-box[0]) * (box[3]-box[1])
a2 = (boxes[:,2]-boxes[:,0]) * (boxes[:,3]-boxes[:,1])
return inter / (a1 + a2 - inter + 1e-9)
def nms(boxes, scores, thresh=0.5):
"""Greedy NMS. boxes: (N, 4), scores: (N,)."""
order = scores.argsort()[::-1]
keep = []
while len(order) > 0:
i = order[0]
keep.append(i)
ious = iou(boxes[i], boxes[order[1:]])
order = order[1:][ious <= thresh]
return keep
# Example
boxes = np.array([
[10, 10, 50, 50],
[12, 12, 52, 52], # overlap with first
[60, 60, 100, 100], # different region
[62, 62, 105, 105], # overlap with third
])
scores = np.array([0.9, 0.85, 0.8, 0.75])
keep = nms(boxes, scores, thresh=0.5)
print("Keep indices:", keep) # [0, 2]
print("Survived boxes:", boxes[keep])
nms() CUDA-optimized।
৯ · Modern: anchor-free + NMS-free
- FCOS (২০১৯): per-pixel center + size — no anchor।
- CenterNet: heatmap-based — local maxima।
- YOLOv8: anchor-free।
- DETR: NMS-free + anchor-free — set prediction।
ভাবনার প্রশ্ন
প্র ০১ NMS threshold (IoU 0.5) — কম বা বেশি করলে কী হয়? Crowded scene-এ optimal কী?
NMS threshold — detection-এর critical hyperparameter।
Threshold low (e.g., 0.3):
- Aggressive suppression।
- Touching object-এ একটি miss।
- Output cleaner কিন্তু missed detection।
Threshold high (e.g., 0.7):
- Conservative suppression।
- Duplicate detection survive।
- Output cluttered, but recall high।
Standard 0.5: COCO benchmark — balanced।
Crowded scene strategies:
- Higher threshold (0.7) + post-filter।
- Soft-NMS — gradient decay।
- DETR — set prediction native।
- CrowdHuman dataset — specialized model।
Per-class threshold: people 0.7, car 0.5 — empirical tuning।
Bangladesh use case: traffic — overlap inevitable। Soft-NMS or DETR preferred।
মূল উপলব্ধি: Single-number tuning rarely optimal। Domain-specific NMS strategy পরিগণিত।
প্র ০২ Anchor-free detector (FCOS, CenterNet) traditional anchor-based-এর চেয়ে কেন simpler? Performance gap কী?
Anchor-free — design simplification, not just trick।
Anchor-based complexity:
- Hyperparameter: scale, ratio, count।
- Matching strategy: IoU thresholds।
- Domain-specific tuning।
- Class-agnostic anchor — class-specific scale awkward।
Anchor-free philosophy:
- Each pixel — predict directly: in object? center? size?
- FCOS: per-pixel (center, top, bottom, left, right) distance।
- CenterNet: heatmap of center + size regression।
- No matching IoU needed।
Advantages:
- Fewer hyperparameter।
- Adaptable across dataset।
- Easy multi-task extension (FCOS supports keypoint, segmentation)।
- Better small object — direct prediction।
Performance comparison:
- FCOS COCO: 41.5 mAP (vs RetinaNet 39.1)।
- YOLOv8 anchor-free: 53.9 mAP (vs YOLOv5 50.7)।
- Modern era — anchor-free competitive বা better।
Why anchor-free historically lost:
- Earlier (2018-2019) — anchor-based dominated।
- Required stronger backbone, FPN।
- ২০২০+ — DenseBox, FCOS, CenterNet — proper attention।
মূল উপলব্ধি: Anchor — historical solution, not necessary। Modern shift natural progression। Architecture simplicity often wins।
প্র ০৩ Soft-NMS-এর Gaussian decay formula — কেন exponential? Linear decay কী হবে?
Soft-NMS-এর math choice — empirical + principled।
Linear decay:
- $s' = s \cdot (1 - \text{IoU})$ if IoU > threshold।
- Simple, no hyperparameter।
- Works OK।
Gaussian decay:
- $s' = s \cdot e^{-\text{IoU}^2 / \sigma}$।
- Smooth, differentiable everywhere।
- Hyperparameter $\sigma$ controls decay rate।
- $\sigma$ small — aggressive। Large — gentle।
Comparison (paper):
- Standard NMS: 39.4 mAP।
- Linear: 40.0।
- Gaussian: 40.8।
- Gaussian wins by 0.8%।
Why Gaussian smoother:
- Continuous decay — no discontinuity at threshold।
- Differentiable — useful in trainable NMS variants।
- Statistically motivated (similar to confidence calibration)।
Implementation:
def soft_nms(boxes, scores, sigma=0.5, conf_thresh=0.001):
indices = np.argsort(-scores)
keep = []
while len(indices) > 0:
i = indices[0]
keep.append(i)
ious = iou(boxes[i], boxes[indices[1:]])
scores[indices[1:]] *= np.exp(-ious**2 / sigma)
indices = indices[1:][scores[indices[1:]] > conf_thresh]
return keep
মূল উপলব্ধি: Math choice — both empirical তাত্ত্বিক justification। Soft-NMS — principled refinement of greedy NMS।
প্র ০৪ DETR (২০২০) NMS-free। কীভাবে set prediction কাজ করে — Hungarian matching মানে কী?
DETR — Carion et al. (Facebook AI Research, 2020) — paradigm shift।
Idea:
- Fixed N "object queries" (e.g., 100)।
- Each query — predict (class, box) or "no object"।
- One-to-one matching with ground-truth।
Hungarian matching:
- Combinatorial optimization — Kuhn-Munkres algorithm।
- Bipartite graph: predictions ↔ ground-truth।
- Edge weight: matching cost (class + bbox + IoU)।
- Find perfect matching minimum cost।
Cost function:
$\mathcal{L}_{\text{match}} = \lambda_{\text{cls}} \mathcal{L}_{\text{cls}} + \lambda_{\text{bbox}} \mathcal{L}_{\text{bbox}} + \lambda_{\text{IoU}} \mathcal{L}_{\text{IoU}}$
Effect:
- Each ground-truth → exactly one prediction।
- Other predictions → "no object" (penalty)।
- No duplicate by construction।
- NMS unnecessary।
Why end-to-end?
- Loss differentiable through Hungarian matching (with smoothing)।
- Training optimizes detection directly।
- No anchor matching heuristic।
DETR drawbacks:
- Slow convergence — 500 epoch typical।
- Small object struggle।
- Computationally heavy (transformer)।
Improvements:
- Deformable DETR — sparse attention।
- DINO-DETR — anchor-aware queries।
- RT-DETR — realtime, NMS-free।
- Co-DETR — collaborative head।
NMS-free trend implication:
- End-to-end training cleaner।
- Hyperparameter কম।
- Crowded scene natural handle।
- Still GPU expensive।
মূল উপলব্ধি: DETR's set prediction — detection-এর philosophical change। NMS heuristic-এর end ushering. Future direction clear।
অনুশীলন
-
Anchor count: RetinaNet-এ FPN 5 level, 9 anchor per pixel — 800×800 input-এ total anchor কত?
FPN levels: 100×100, 50×50, 25×25, 13×13, 7×7। Total spatial = 12463। × 9 anchor = ~112K anchor। NMS-এর importance বোঝা যায়।
-
NMS torchvision: Multiple-class NMS — torchvision-এর ops use।
from torchvision.ops import nms, batched_nms # Single-class keep = nms(boxes, scores, iou_threshold=0.5) # Multi-class — batched keep = batched_nms(boxes, scores, classes, iou_threshold=0.5) -
ভাবুন: Bangladesh CCTV-এ rickshaw dense crowd। Standard NMS-এ অর্ধেক miss। কী করবেন?
(1) Soft-NMS try। (2) Higher NMS threshold (0.6-0.7)। (3) DETR/RT-DETR — NMS-free। (4) Specialized crowd detector।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পাঠ ২১ · Segmentation types পরবর্তী পাঠ Detection-এর পর pixel-level।
- পাঠ ১৯ · YOLO আগের পাঠ Anchor + NMS-এর primary user।
- পাঠ ২৮ · DETR এগিয়ে NMS-free transformer detector।
- সব AI Courses দেখুন ABCL TECH Python, ML, DL, NLP, CV, GenAI, RL, MLOps — সব AI কোর্স একসাথে।