Anomaly-Aware YOLO: A Frugal yet Robust Approach to Infrared Small Target Detection
Paper • 2510.04741 • Published
Part of the ANIMA Perception Suite by Robot Flow Labs.
AA-YOLO: Anomaly-Aware YOLO for Infrared Small Target Detection arXiv: 2510.04741
AA-YOLO introduces an Anomaly-Aware Detection Head (AADH) that reformulates IR target detection as a statistical anomaly detection problem. The AADH adds only +0.2M parameters and +5% FLOPs to any YOLO backbone. Key components:
-ln(F_mu2) anomaly scoresThis checkpoint uses the AA-YOLOv7t backbone (YOLOv8n architecture as v7-tiny proxy).
| Parameter | Value |
|---|---|
| Dataset | SIRST (427 images: 256 train / 85 val / 86 test) |
| Backbone | AA-YOLOv7t (YOLOv8n + AADH) |
| Epochs | 100 |
| Optimizer | SGD (lr=0.01, momentum=0.937, weight_decay=0.0005) |
| Scheduler | Cosine annealing, 3 epoch warmup |
| Precision | FP16 mixed precision |
| Best val_loss | 1.0874 (epoch 73) |
| Final train_loss | 1.0715 |
| Backbone freeze | First 10 epochs |
| Hardware | NVIDIA L4 (23GB) |
| Training time | ~2 min (100 epochs) |
| Format | File | Size | Use Case |
|---|---|---|---|
| PyTorch (.pth) | pytorch/fenris_v0.1.0.pth |
12 MB | Training, fine-tuning |
| SafeTensors | pytorch/fenris_v0.1.0.safetensors |
12 MB | Fast loading, safe |
| ONNX (opset 18) | onnx/fenris_v0.1.0_allinone.onnx |
12.3 MB | Cross-platform inference |
| TensorRT FP32 | tensorrt/fenris_v0.1.0_fp32.engine |
~17 MB | Full precision inference |
| TensorRT FP16 | tensorrt/fenris_v0.1.0_fp16.engine |
~8 MB | Edge deployment (Jetson/L4) |
| Training checkpoint | checkpoints/best.pth |
24 MB | Resume training (includes optimizer state) |
import torch
from safetensors.torch import load_file
# Load SafeTensors (recommended)
state_dict = load_file("pytorch/fenris_v0.1.0.safetensors")
# Or load PyTorch
state_dict = torch.load("pytorch/fenris_v0.1.0.pth", map_location="cpu")
import onnxruntime as ort
import numpy as np
session = ort.InferenceSession("onnx/fenris_v0.1.0_allinone.onnx")
input_data = np.random.randn(1, 3, 256, 256).astype(np.float32)
outputs = session.run(None, {"ir_input": input_data})
import tensorrt as trt
runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))
with open("tensorrt/fenris_v0.1.0_fp16.engine", "rb") as f:
engine = runtime.deserialize_cuda_engine(f.read())
| Metric | Target | Dataset |
|---|---|---|
| F1 | >= 98.1% | SIRST |
| AP_s | >= 79.8% | SIRST |
| AP | >= 72.0% | IRSTD-1k |
| AP | >= 65.0% | VEDAI |
ghcr.io/robotflow-labs/anima-fenris:0.1.0/health, /ready, /infoApache 2.0 -- Robot Flow Labs / AIFLOW LABS LIMITED