TriNetra: Thermal-Reliability-Guided RGB-Thermal Fusion and Tracking for Surveillance
Organizations: Dept. of Computer Science and Design, K. K. Wagh Institute of Engineering Education and Research, Nashik 422003, India
Abstract
Visible cameras fail at night and thermal sensors fail under saturation, blur or loss of contrast, yet most RGB-thermal (RGB-T) detectors mix the two streams with fixed weights and cannot tell when one modality has become unreliable. TriNetra is a reliability-aware surveillance framework built around this problem. The proposed solution computes a frame-level Thermal Reliability Coefficient (TRC) from five label-free image cues, uses it to gate the thermal features of a dual-branch YOLOv8m detector whose visible branch, neck and head are frozen and COCO-pretrained, and passes the same score to a ByteTrack-based tracker that feeds a rule-based behaviour analyser. On the M3FD benchmark (2,940/630/630 split) the detector reaches 87.6% precision, 79.4% recall, 70.0% mAP@50 and 47.8% mAP@50:95 on the test split, with 17.0 M of its 42.9 M parameters trained. TRC stays near 0.78 on clean frames (standard deviation 0.012), decreases with the severity of thermal saturation and blur, reaching 0.53 and 0.69 at full severity, and is insensitive to RGB-thermal misalignment. With identical weights, the adaptive gate matches a fixed gate on clean data (70.0% versus 69.8% mAP@50) but keeps 43.6% mAP@50 when the thermal stream is corrupted, against 38.4%, 29.2% and 25.0% for a fixed gate, full thermal admission and a closed gate; the 5.1-point gain over the fixed gate has a 95% bootstrap confidence interval of +3.6 to +6.5 points. In tracking, the TRC-gated association performs on par with ByteTrack on a synthetic benchmark with exact ground truth and on 14 M3FD clips, and is slightly less stable under thermal saturation, so its measured benefit is confined to the detector. The limitations of the current evaluation are reported together with the results.
Figures & tables
| Data | Pairs | Classes | Size | Input | Split (pairs) |
|---|---|---|---|---|---|
| M3FD | 4,200 | 6 | 2,940/630/630 | ||
| M3FD clips | 14 | none | — | — |
| Item | Value |
|---|---|
| CPU | AMD Ryzen 7 5800H (8C/16T) |
| RAM | 15.3 GB |
| GPU | RTX 3060 Laptop, 6 GB |
| Operating system | Windows 11 |
| Python / PyTorch [ 24 ] | 3.11.16 / 2.3.1 (CUDA 12.1) |
| Ultralytics [ 8 ] | 8.4.153 |
| Parameter | Value |
|---|---|
| Epochs | 150 planned; early stop at 131 (patience 15) |
| Selected checkpoint | epoch 116 (best validation mAP@50) |
| Batch size | accumulation = 16 (effective) |
| Input size | |
| Optimiser | SGD (momentum 0.937, weight decay ) |
| Learning rate | 0.01, cosine [ 25 ] to , no warm-up |
| Class | P (%) | R (%) | mAP@50 [95% CI] | mAP@50:95 |
| All | 87.6 | 79.4 | 70.0 [66.7, 73.4] | 47.8 |
| Person | 85.2 | 75.3 | 72.9 [69.9, 75.8] | 44.3 |
| Car | 90.0 | 85.0 | 84.3 [82.3, 85.5] | 62.0 |
| Bus | 85.9 | 84.2 | 82.5 [74.5, 89.1] | 70.4 |
| Motorcycle | 78.8 | 58.6 | 55.7 [44.4, 67.4] | 31.4 |
| Lamp | 84.6 | 62.8 | 60.1 [54.5, 66.3] | 30.6 |
| Method | P | R | mAP@50 | mAP@50:95 | Params | GFLOPs |
|---|---|---|---|---|---|---|
| YOLOv8n (DS) | 82.0 | 62.8 | 70.3 | 44.7 | 4.36 | 11.34 |
| YOLOv11n (DS) | 82.6 | 57.5 | 66.5 | 42.6 | 3.79 | 9.31 |
| MBNet | 80.0 | 61.2 | 68.2 | 43.0 | 6.8 | 16.2 |
| ProbEn | 80.8 | 61.7 | 68.8 | 43.3 | 7.5 | 17.4 |
| RT-DETR (DS) | 79.2 | 60.5 | 67.2 | 42.2 | 66.34 | 194.03 |
| GEM-YOLO [ 6 ] | 79.2 | 61.8 | 69.0 | 43.8 | 3.44 | 7.58 |
| Score | Mean | Std |
|---|---|---|
| Contrast | 0.938 | 0.023 |
| Gradient | 0.873 | 0.046 |
| Saturation | 0.987 | 0.003 |
| Mutual information | 0.115 | 0.059 |
| Alignment | 1.000 | 0.000 |
| TRC | 0.782 | 0.012 |
| Degradation | 0.25 | 0.5 | 0.75 | 1.0 | Mono. | 0.5 | |
|---|---|---|---|---|---|---|---|
| Blur | .729 | .710 | .698 | .690 | 100% | 0% | |
| Saturation | .705 | .658 | .579 | .532 | 96% | 30% | |
| Flat | .780 | .778 | .776 | .405 | 55% | 100% | |
| Misalignment | .775 | .773 | .772 | .771 | 84% | 0% | |
| Variant | Level | Blur | Saturation | Flat |
|---|---|---|---|---|
| All five cues | 0.782 | 0.093 | 0.250 | 0.377 |
| Without contrast | 0.744 | 0.116 | 0.214 | 0.243 |
| Without gradient | 0.760 | 0.221 | 0.254 | |
| Without saturation | 0.731 | 0.116 | 0.178 | 0.475 |
| Without mutual information | 0.949 | 0.117 | 0.325 | 0.443 |
| Without alignment | 0.728 | 0.116 | 0.313 | 0.472 |
| Gate mode | Clean | Corrupted | Blur | Saturation | |
|---|---|---|---|---|---|
| Adaptive TRC (proposed) | 70.0 / 47.8 | 43.6 / 30.6 | 49.8 / 35.5 | 36.8 / 25.6 | 38.3 / 27.2 |
| Fixed | 69.8 / 47.8 | 38.4 / 27.3 | 48.3 / 34.4 | 28.1 / 20.0 | 29.7 / 21.6 |
| Full thermal | 66.7 / 44.7 | 29.2 / 20.7 | 42.8 / 30.1 | 14.6 / 10.8 | 17.9 / 13.6 |
| Thermal off | 25.0 / 14.4 | 25.0 / 14.4 | 24.8 / 14.6 | 24.9 / 14.5 | 23.7 / 14.0 |
| Gate mode | Clean | Corrupted | Adaptive mode (corrupted) |
|---|---|---|---|
| Adaptive TRC | 70.0 [66.7, 73.4] | 43.6 [40.0, 47.2] | — |
| Fixed | 69.8 [66.7, 73.3] | 38.4 [34.9, 42.2] | +5.1 [+3.6, +6.5] |
| Full thermal | 66.7 [63.2, 70.0] | 29.2 [25.8, 32.7] | +14.4 [+12.1, +16.6] |
| Thermal off | 25.0 [22.7, 27.2] | 25.0 [22.7, 27.3] | +18.6 [+15.5, +22.2] |
| Subset | Pairs | Difference [95% CI] |
|---|---|---|
| Clean thermal | 630 | +0.1 [ 0.2, +0.2] |
| Corrupted thermal, all | 630 | +5.1 [+3.6, +6.5] |
| blur only | 333 | +1.5 [+0.9, +2.3] |
| saturation only | 297 | +8.8 [+6.1, +12.2] |
| 243 | +8.6 [+5.4, +12.1] |
| Severity 0.5 | Severity 1.0 | |||||
|---|---|---|---|---|---|---|
| Tracker | HOTA | MOTA | IDSW | HOTA | MOTA | IDSW |
| SORT-style | .556 | .745 | 12.8 | .319 | .471 | 17.8 |
| DeepSORT (motion) | .514 | .702 | 15.9 | .359 | .456 | 27.0 |
| ByteTrack | .559 | .754 | 12.4 | .326 | .480 | 17.6 |
| ByteTrack + TRC gate | .559 | .751 | 12.5 | .323 | .476 | 17.7 |
| Tracker | Tracks | Persistence | Tracks/target | Coverage | Jumps |
|---|---|---|---|---|---|
| SORT-style | 122 | 1.92 | 0.792 | 1.3 | |
| DeepSORT (motion) | 122 | 1.55 | 0.742 | 0.1 | |
| ByteTrack | 119 | 1.79 | 0.793 | 1.3 | |
| ByteTrack + TRC gate | 119 | 1.81 | 0.793 | 1.3 |
| Tracker | IDF1 [95% CI] | HOTA | AssA | IDSW |
|---|---|---|---|---|
| SORT-style | .690 [.517, .839] | .639 | .730 | 0.32 |
| DeepSORT (motion) | .690 [.498, .860] | .640 | .709 | 0.71 |
| ByteTrack | .749 [.562, .904] | .699 | .777 | 0.32 |
| ByteTrack + TRC gate | .734 [.551, .887] | .686 | .769 | 0.32 |