# Ablation Study Configurations # # Each ablation isolates one variable to measure its contribution. # Run: python scripts/run_ablations.py --config configs/ablations.yaml # # Baseline: SCRFD-34G with default settings ablations: # 1. Sample Redistribution (SCRFD's key contribution) sample_redistribution: description: "Impact of large-scale crops on small face detection" experiments: - name: "baseline_crops" data.crop_scales: [0.3, 0.45, 0.6, 0.8, 1.0] note: "Standard crops only (no SR)" - name: "extended_crops" data.crop_scales: [0.3, 0.45, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0] note: "Full Sample Redistribution (SCRFD default)" - name: "extreme_crops" data.crop_scales: [0.3, 0.6, 1.0, 1.5, 2.0, 2.5, 3.0] note: "Even larger crops — test limits" # 2. Loss Function Choice loss_functions: description: "GFL vs Focal Loss for classification" experiments: - name: "gfl_diou" model.losses.cls: gfl model.losses.reg: diou note: "SCRFD default" - name: "focal_diou" model.losses.cls: focal model.losses.reg: diou note: "Standard focal loss" - name: "gfl_smoothl1" model.losses.cls: gfl model.losses.reg: smooth_l1 note: "GFL + Smooth L1 regression" # 3. Anchor Matching Strategy matching: description: "ATSS vs fixed IoU threshold matching" experiments: - name: "atss_k9" model.matching.type: atss model.matching.topk: 9 note: "ATSS with k=9 (SCRFD default)" - name: "atss_k5" model.matching.type: atss model.matching.topk: 5 note: "ATSS with smaller k" - name: "iou_035" model.matching.type: iou model.matching.pos_iou: 0.35 model.matching.neg_iou: 0.3 note: "Fixed IoU (TinaFace-style lower threshold)" - name: "iou_050" model.matching.type: iou model.matching.pos_iou: 0.5 model.matching.neg_iou: 0.4 note: "Standard IoU threshold" # 4. Robustness Augmentations robustness: description: "Impact of blur/compression/lighting augmentations" experiments: - name: "no_robustness" data.robustness_augmentation: false note: "Standard aug only" - name: "blur_only" data.robustness_augmentation: true data.robustness_blur_prob: 0.3 data.robustness_jpeg_prob: 0.0 data.robustness_lowlight_prob: 0.0 note: "Blur augmentation only" - name: "compression_only" data.robustness_augmentation: true data.robustness_blur_prob: 0.0 data.robustness_jpeg_prob: 0.3 data.robustness_lowlight_prob: 0.0 note: "JPEG compression only" - name: "full_robustness" data.robustness_augmentation: true note: "All robustness augmentations" # 5. GroupNorm vs BatchNorm normalization: description: "GN vs BN (TinaFace found GN better at small batch sizes)" experiments: - name: "group_norm" model.neck.use_gn: true model.head.use_gn: true note: "GroupNorm (SCRFD/TinaFace default)" - name: "batch_norm" model.neck.use_gn: false model.head.use_gn: false note: "Standard BatchNorm" # 6. Input Resolution input_resolution: description: "Trade-off between resolution and speed for tiny faces" experiments: - name: "res_320" data.input_size: 320 inference.input_size: 320 - name: "res_480" data.input_size: 480 inference.input_size: 480 - name: "res_640" data.input_size: 640 inference.input_size: 640 - name: "res_960" data.input_size: 960 inference.input_size: 960 note: "Higher res for tiny faces (+5-10% Hard AP, ~4x slower)" # 7. Landmark Multi-Task Learning landmarks: description: "RetinaFace finding: auxiliary landmark loss improves detection" experiments: - name: "no_landmarks" model.head.use_landmarks: false - name: "with_landmarks" model.head.use_landmarks: true model.losses.lmk_weight: 0.1 note: "Requires RetinaFace landmark annotations" # 8. Tracker Configuration tracking: description: "ByteTrack hyperparameter sensitivity" experiments: - name: "no_tracking" engine.use_tracking: false - name: "conservative" engine.tracker.high_thresh: 0.6 engine.tracker.low_thresh: 0.2 engine.tracker.max_lost: 15 - name: "aggressive" engine.tracker.high_thresh: 0.3 engine.tracker.low_thresh: 0.05 engine.tracker.max_lost: 60 note: "More tracks, more false positives"