feat: 导入 IRSTD 研究代码与文档(小目标检测)

- 新增 irstd 核心包、scripts、tests、configs
- 新增研究文档:literature_review / mathematical_analysis / novelty_matrix / experiment_plan / research_decision / research_log / manuscript_outline
- 新增 evidence、results 数据与审计产物
- 新增 pyproject.toml、requirements、.gitignore
This commit is contained in:
u52f85420 committed 2026-11-01 10:10:33 +00:00
1 parent 9b4a29c4d2
commit 04bf90c09b
35 files changed
+2220 -2

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
__pycache__/
*.pyc
.venv/
*.egg-info/
data/*
!data/README.md
runs/
*.pt
+34
View File
@@ -0,0 +1,34 @@
7d1e0ddfdb4426ffb927d1dd39ad1cbeda1f01d6de737eb72432676d022f4f08 .gitignore
c285194eb7af8b7e344e536aba5db06d802ab0e33370dc11ee3b5117a25f6335 README.md
c3ae05270d76ec205da3bb7bece26663a612f2e608836af25eee96c66270eeaf configs/ablations.csv
8346e5ca6fae19e5dfb441e5a35fb3da3a99a034f03c465dc5f0714ef9a0cce2 data/README.md
7641c6789c27309cf8ef00eacd417e01bf7a1683a5c7bdbaeb6b290896088aa2 evidence/papers.json
bf1ce5f0924d4c5e93455cc4a5bb7c39b6730aa629cf339182f960011f58a80d evidence/upstream_audit.md
19ec2160d5dc910147671c3ce678cd89fa60d8382b16cb1c5cb830fbc58ddc0b experiment_plan.md
d909687f70245e3fc3c9811271359f9ab827057ae3a7a6245f6d26ead7ef4d56 irstd/__init__.py
4775281f0e897fa22dd6b1697f8d6673e63aa6e3746ff5e058ae93d2860ca140 irstd/core.py
6c6fd77673d18f97271e9b2d6b3548ba1c477ba67ddbc53d80d507e7ae4e0879 irstd/data.py
ea405b291820d076b09285d3940eb20bc3348ca64eeff5b89dfa76f81cb5f1a8 irstd/models.py
51897c6ba5a98e2790eec4b9d440aa64644064c42501bd14d01efbc32e3fc550 literature_review.md
f071ca15394dea34339784af23cece8acdc4320a2773d5b9969632bf997c93b7 manuscript_outline.md
6cece4721ad443ddb35e2c9ab24ff2cd3a5607e3bc06101e299c0aef3cc15f5b mathematical_analysis.md
e2441716df54e3725f208e6514e7dd06a7a70d617003cb1eefec4a3660fea3c9 novelty_matrix.md
48c8ebe01079642883c2b64ff1bc05771192b419ea3caec73db91aede4776322 pyproject.toml
f793676a40e71a12c2d9066d4f2e342bf5d920a971a725519c00ed500c4231ed requirements-core.txt
aea3df914eb73b204f3461b373e0b33cab0e2d58d31200b7f40c29a6614e1e02 requirements-training.txt
c5c803a06c5f0e8b9e220cf5e4dd79e018d881c006420ab6d03806d5b8c9901e research_decision.md
4d3c59eab8eda8d0c4836b66a01693ad0a456e157afb3f33fdb2faa7734dd2da research_log.md
3522b07838f6b3327e5f2253f251113139fd2608cb741554a98361a386f7ea9a results/README.md
9728844a980ca8598b75c3f347a08d51a1c8996ba855876f6b53a879e57cbf2a results/environment.json
7d6f7bd3315bb0498c2801551bd64272deea801a49c88444431de13c713b4837 results/math_checks.json
0348ac8f5b1daa5915ac86771242ec540146ab89cfc771216f5e7bcb90b510f3 results/unit_tests.txt
08f8a6b3c180aa8ad5778b05fa1708f328c8c24ff40888fdd70ac397f16ddd96 scripts/audit_data.py
8302aa0cf43cc221f513384187b10bcddfaa8ba8d67d3e9ad1f7cdc3aef79267 scripts/benchmark.py
3bf43e8595702b3c0b5f31912cd8db9752a1bccb9c58d4a814460a7d73eb8364 scripts/check_math.py
f0aeff4d7cf7ba9c8d5fc11d3887b46e3d013b428a0363ea31e0b76f9281f219 scripts/evaluate.py
44198107c3843b3c58ac12a744060cd4284299e920c33945e8f4d60a7c2619e7 scripts/predict.py
7f8ec19c8e0f502b0e4bab4670f5e94ead9fe46b7b34cba3d7250c5eadb347d4 scripts/train.py
934ef3746f5768c67aceb81ff69e8ba15ff78f38726b28117c5487c2f6dc6951 scripts/train_gate.py
51e77d35a9baff1ec4f12dcf45f113725db9e3e479e5abd22c695546269fcb1b tests/test_core.py
1b4858d3e6ff6fac6e59dfc0772abbec98ff7b8c48a24807471687b64d6593d9 tests/test_pipeline.py
be0b12fa539f73d4576f664a82400fe320665ed3be872660c03618dcc99a2d5a tests/test_torch.py
+86 -2
View File
@@ -1,3 +1,87 @@
# tiny_object_detection
# IRSTD verification and risk-control prototype
Small target object detection project.
**Status: research dossier and partially executed prototype, 2026-10-31.** Revised Project B is the provisional priority. None of A/B/C has been established as a novel publishable result. No real dataset has been trained on or evaluated in this environment.
Read in order: `research_decision.md`, `novelty_matrix.md`, `mathematical_analysis.md`, `literature_review.md`, `experiment_plan.md`. Full bibliographic verification, dataset rights/downloads and several upstream implementations remain open, individually marked in the review. There are 10 A, 15 B and 12 C relevant reference placements with overlap, plus a pending NP-loss reference. General loss/calibration papers are explicitly distinguished from IRSTD papers.
## Contents
- `irstd/core.py`: fixed-component candidates, maximum matching, metrics, exact tiny MWIS, layered DP, CP and fixed-sequence risk calibration.
- `irstd/models.py`: original compact U-Net, basic segmentation losses, MLP candidate gate and constrained surrogate.
- `scripts/`: train, predict, train gate, calibrate/evaluate, audit data, benchmark and mathematical checks.
- `tests/`: mathematical counterexamples, exhaustive tiny matching checks, CPU CLI integration and optional PyTorch gradients.
- `configs/ablations.csv`: prepared versus unimplemented comparisons.
- `evidence/papers.json`: bibliographic/status records; no copied paper text.
- `results/`: actual test logs and analytic calculations only.
- `manuscript_outline.md`, `research_log.md`: writing and milestone records.
## Actual execution status
The execution runtime is Python 3.12.14 with NumPy 2.3.5, SciPy 1.17.0 and Pillow 12.3.0. PyTorch is absent; `nvidia-smi` was not found. The user's RTX 3090 is not attached to this runtime. **26 CPU tests pass; 2 PyTorch tests are skipped.** Compilation checks pass. Synthetic fixture tests verify plumbing, not accuracy. Detector/gate training, GPU profiling, upstream baseline reproduction and real dataset metrics have not run. No performance table is populated.
## Setup
The following is a proposed, pinned training environment, not an environment already validated on the 3090. Python 3.12 is recommended. Core package versions match the executed CPU checks. PyTorch 2.5.1 is a conservative explicit pin; CUDA 12.1 wheels are listed in the official [previous versions instructions](https://pytorch.org/get-started/previous-versions/). Confirm driver compatibility on the actual workstation. Do not install MIST's older NATTEN dependencies into this environment.
```bash
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-core.txt
python -m pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121
python -m pip install --no-deps -e .
python -m unittest discover -s tests -v
python scripts/check_math.py
```
For CPU-only evaluation, omit PyTorch; `evaluate.py` imports it only when a learned gate is requested. In the supplied execution environment, tests used `PYTHONPATH=. "$CODEX_PRIMARY_RUNTIME_PYTHON" -m unittest discover -s tests -v` rather than installing packages. Future successful training must save `pip freeze`, Python/torch/CUDA/driver versions and GPU model. Determinism is scoped to a recorded stack, not guaranteed across different hardware/software: [PyTorch reproducibility guidance](https://docs.pytorch.org/docs/stable/notes/randomness.html).
## Data preparation
No data, checkpoints or third-party code are bundled. Follow `data/README.md` and `experiment_plan.md`. Create `data/manifest.csv` with native uint8 image/mask paths, exact split membership and independent scene groups. Original test sets stay untouched; dev and cal come from training groups or separately authorized data. Binary masks cannot resolve overlapping target identities. License and annotation audits are required before claiming a valid benchmark.
```bash
python scripts/audit_data.py --manifest data/manifest.csv --out data/audit.json
```
This detects exact-byte cross-split image leakage, group leakage, malformed data and measures size statistics. It does not detect all near-duplicates or establish independent sampling.
## Minimal experiment sequence
Commands below require real input files and (for training/prediction) PyTorch. They have not been executed here. Output run directories must be new; scripts refuse accidental overwrite.
```bash
python scripts/train.py --manifest data/manifest.csv --out runs/bce_dice_seed0 --loss bce_dice --epochs 100 --seed 0 --device cuda
python scripts/predict.py --manifest data/manifest.csv --checkpoint runs/bce_dice_seed0/best.pt --out runs/prob_seed0 --device cuda
python scripts/train_gate.py --manifest data/manifest.csv --predictions runs/prob_seed0 --out runs/gate_seed0 --mode constrained --alpha-train .1 --epochs 100 --seed 0
python scripts/evaluate.py --manifest data/manifest.csv --predictions runs/prob_seed0 --gate runs/gate_seed0/gate.pt --split cal --calibrate --risk count --alpha .1 --out runs/count_certificate.json
python scripts/evaluate.py --manifest data/manifest.csv --predictions runs/prob_seed0 --gate runs/gate_seed0/gate.pt --split test --certificate runs/count_certificate.json --out runs/count_test.json
```
Calibration always uses the predeclared 101 gate thresholds. The certificate hashes source, model/probability provenance, input files, manifest and parameters; changed artifacts invalidate reuse. Its statistical statement is **conditional on iid calibration units from the deployment distribution**. Filenames/group checks do not prove that assumption. A `reject_all` result means no useful detector was certified at the selected budget. Do not report that as strong detection performance. Do not substitute `--risk any` for `--risk count` without changing the claimed objective.
For the crucial no-gate baseline, omit `--gate` in both calibration and evaluation. For the BCE gate, use `--mode bce`; for the size ablation use `--no-size`. All must use identical candidate pools and calibration access. Gate training currently uses in-sample detector predictions; an out-of-fold or held-out gate-training split is a planned robustness check against detector/gate overfitting. The prototype uses a fixed final gate epoch count; tune it using dev data only.
Uncalibrated segmentation check:
```bash
python scripts/evaluate.py --manifest data/manifest.csv --predictions runs/prob_seed0 --split test --pixel-baseline --threshold .5 --out runs/pixel_test.json
python scripts/benchmark.py --device cuda --size 256 --out runs/runtime_256.json
```
The benchmark uses random images solely for timing. It excludes disk IO and learned-gate costs; the output states FLOP exclusions. Final manuscript latency must include the actual gate and all requested preprocessing, measured separately. Batch-one native-size training deliberately avoids interpolation and augmentation for debugging. It is not a competitive published training recipe.
## Reproducibility and limitations
- Three seeds: 0,1,2; record manifest/archive SHA256 and upstream source revisions before real runs.
- Preserve test/cal separation, exact 8-connectivity, centroid ≤3 pixels, maximum-cardinality one-to-one matching, and all metric denominators.
- Keep native pixel and object metrics separate. `null` means an undefined denominator, not zero accuracy.
- No SLS, SD, AC-SLSIoU, CG-IRNet, graph GNN or full temporal tracker is claimed implemented. Their validation remains in the experiment plan.
- The included CP/union-bound and fixed-sequence procedures are known statistical machinery; proposed novelty and empirical utility remain unverified.
- The MLP is a staged candidate selector, not end-to-end differentiable connected-component detection.
- This package is a local repository scaffold. No GitHub repository has been published or external compute job started.
## Alternative calibration procedure
Add `--calibration-method fixed_sequence` to the calibration command to test the predeclared thresholds from highest to lowest and stop at the first failure. The default remains `bonferroni` for reference. Count risk uses the Hoeffding KL bound on FP/cap; any-alarm risk uses an exact binomial lower-tail test. The output reports a certified risk budget, not a simultaneous table of confidence bounds. Choose the procedure before calibration; selecting whichever procedure works on the same labels requires its own error allocation.
At alpha=.01 and delta=.05, zero observed errors need 299 independent images for the fixed-sequence any-alarm test, or 19,172 for count risk with cap=64. These are procedure-specific calculations, not universal lower bounds. See mathematical_analysis.md.
+18
View File
@@ -0,0 +1,18 @@
id,segmentation_loss,gate,area_weight,calibration,status
B00,bce,none,no,tail_sum_CP,prepared
B01,dice,none,no,tail_sum_CP,prepared
B02,bce_dice,none,no,tail_sum_CP,prepared
B03,focal,none,no,tail_sum_CP,prepared
B04,iou,none,no,tail_sum_CP,prepared
B05,bce_dice,bce,no,tail_sum_CP,prepared
B06,bce_dice,constrained,yes,tail_sum_CP,prepared
B07,bce_dice,constrained,no,tail_sum_CP,prepared
B08,SLS,none,no,tail_sum_CP,upstream_audit_required
B09,SD,none,no,tail_sum_CP,upstream_audit_required
B10,AC-SLSIoU,none,no,tail_sum_CP,upstream_audit_required
B11,bce_dice,fixed_penalty,yes,tail_sum_CP,not_implemented
B12,bce_dice,constrained,yes,empirical_only,not_implemented
B13,bce_dice,graph_gate,yes,tail_sum_CP,not_implemented
B14,bce_dice,none,no,fixed_sequence,prepared
B15,bce_dice,bce,no,fixed_sequence,prepared
B16,bce_dice,constrained,yes,fixed_sequence,prepared
1 id segmentation_loss gate area_weight calibration status
2 B00 bce none no tail_sum_CP prepared
3 B01 dice none no tail_sum_CP prepared
4 B02 bce_dice none no tail_sum_CP prepared
5 B03 focal none no tail_sum_CP prepared
6 B04 iou none no tail_sum_CP prepared
7 B05 bce_dice bce no tail_sum_CP prepared
8 B06 bce_dice constrained yes tail_sum_CP prepared
9 B07 bce_dice constrained no tail_sum_CP prepared
10 B08 SLS none no tail_sum_CP upstream_audit_required
11 B09 SD none no tail_sum_CP upstream_audit_required
12 B10 AC-SLSIoU none no tail_sum_CP upstream_audit_required
13 B11 bce_dice fixed_penalty yes tail_sum_CP not_implemented
14 B12 bce_dice constrained yes empirical_only not_implemented
15 B13 bce_dice graph_gate yes tail_sum_CP not_implemented
16 B14 bce_dice none no fixed_sequence prepared
17 B15 bce_dice bce no fixed_sequence prepared
18 B16 bce_dice constrained yes fixed_sequence prepared
+15
View File
@@ -0,0 +1,15 @@
# Dataset contract
No real dataset is bundled. Verify original download terms before use. Create a CSV:
```csv
id,image,mask,split,group
example_train,images/example_train.png,masks/example_train.png,train,scene_a
example_dev,images/example_dev.png,masks/example_dev.png,dev,scene_b
example_cal,images/example_cal.png,masks/example_cal.png,cal,scene_c
example_test,images/example_test.png,masks/example_test.png,test,scene_d
```
These are format examples, not real files. Paths resolve relative to the CSV. Input is 2D uint8 grayscale, masks are same-sized 2D arrays with zero background and positive foreground. Conversion from 16-bit data requires an explicit versioned preprocessing procedure; the loader refuses silent conversion. Preserve native coordinates. Scene groups must not cross splits. Group fields cannot establish independence by themselves.
Keep dataset source URL, downloaded archive SHA256, actual license text, upstream split hashes, conversion settings and annotation-audit findings beside the private data. Do not redistribute datasets with this repository until rights are established.
+444
View File
@@ -0,0 +1,444 @@
[
{
"id": "A1",
"projects": "A",
"title": "EDGRU: edge-guided dual graph reasoning U-Net with spatial graph attention for infrared small target detection",
"authors": "Xinying Huang; Jianhua Song; Xinrong Fu; Yizhe Lu; Lei Yuan",
"date": "2026-10-27, Scientific Reports early article",
"identifier": "10.1038/s41598-026-76517-6",
"url": "https://www.nature.com/articles/s41598-026-76517-6",
"already_done": "Edge cues and dual graph feature reasoning already address clutter. This is not evidence for physical mutual exclusion between candidates.",
"code": "Author repository accessible; commit b0159312ae8047e37c913cf2cf6116c7776eeffc (2026-10-28). Model/train/test files listed; not executed; no root license file observed.",
"data": "SIRST and NUDT-SIRST reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A2",
"projects": "A",
"title": "Infrared small target detection based on multi-feature fusion combined with graph representation learning",
"authors": "Jiakun Deng; Yizhuo Yin; Yanbo Zhang; Chang Long; Kexuan Li; Xingye Cui; Zhenming Peng",
"date": "2026, 55(1):100–108; received 2025-03-19",
"identifier": "10.12178/1001-0548.2025060",
"url": "https://www.juestc.uestc.edu.cn/en/article/doi/10.12178/1001-0548.2025060",
"already_done": "Morphological proposals, graph representations, fused handcrafted/deep features and classification already filter candidate false alarms.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Publisher page opened; abstract read"
},
{
"id": "A3",
"projects": "A",
"title": "CS-ViG-UNet: Infrared small and dim target detection based on cycle shift vision graph convolution network",
"authors": "Jian Lin; Shaoyi Li; Xi Yang; Saisai Niu; Binbin Yan; Zhongjie Meng",
"date": "2024, Expert Systems with Applications; exact online date unresolved",
"identifier": "10.1016/j.eswa.2024.124385",
"url": "https://www.sciencedirect.com/science/article/pii/S095741742401251X",
"already_done": "Patch-level sparse graph attention and U-Net integration; graph use alone is not new.",
"code": "https://github.com/Linaom1214/CSViG-UNet — indexed repository with train/eval files; not executed",
"data": "SIRST Augment and IRSTD-1k links listed; bytes not acquired",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A4",
"projects": "A",
"title": "IRST-CGSeg: Infrared Small Target Detection Based on Clustering-Guided Graph Learning and Hierarchical Features",
"authors": "Guimin Jia; Tao Chen; Yu Cheng; Pengyu Lu",
"date": "2025-02-21, Electronics",
"identifier": "10.3390/electronics14050858",
"url": "https://www.mdpi.com/2079-9292/14/5/858",
"already_done": "Clustering initializes subgraphs and guides graph/texture feature fusion.",
"code": "No public code verified",
"data": "Publisher says study data available on request",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A5",
"projects": "AC",
"title": "Graph Laplacian regularization for fast infrared small target detection",
"authors": "Ting Liu; Yongxian Liu; Jungang Yang; Boyang Li; Yingqian Wang; Wei An",
"date": "2025 volume 158; DOI assigned 2024; online day unresolved",
"identifier": "10.1016/j.patcog.2024.111077",
"url": "https://www.sciencedirect.com/science/article/pii/S0031320324008288",
"already_done": "Frame-node graph regularization replaces expensive low-rank estimation; MCP sparsity separates targets. Explicit optimization already exists.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A6",
"projects": "AC",
"title": "Infrared small target detection based on hypergraph and asymmetric penalty function",
"authors": "Yuan Luo; Xiaorun Li; Shuhan Chen",
"date": "2025, Pattern Recognition",
"identifier": "10.1016/j.patcog.2025.111634",
"url": "https://www.sciencedirect.com/science/article/pii/S0031320325002948",
"already_done": "Patch-tensor hypergraphs combine spatial and temporal weights; low-rank background and asymmetric target sparsity are jointly modeled.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A7",
"projects": "A",
"title": "Robust Infrared Small Target Detection via Jointly Sparse Constraint of l1/2-Metric and Dual-Graph Regularization",
"authors": "Fei Zhou; Yiquan Wu; Yimian Dai; Kang Ni",
"date": "2020, Remote Sensing 12(12):1963",
"identifier": "10.3390/rs12121963",
"url": "https://www.mdpi.com/2072-4292/12/12/1963",
"already_done": "Spatial and feature manifold regularizers plus nonconvex sparsity suppress clutter. Graph-constrained optimization is established prior art.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A8",
"projects": "A",
"title": "Directional graph-structured energy propagation for infrared small target detection",
"authors": "Sen Yang; Guanxun Cui",
"date": "2026-06 volume, Infrared Physics & Technology",
"identifier": "10.1016/j.infrared.2026.106613",
"url": "https://www.sciencedirect.com/science/article/pii/S1350449526002483",
"already_done": "Gradient-directed pixel DAG energy propagation drives U-Net attention. A graph or DAG by itself is not a contribution.",
"code": "Not verified; no runnable release established",
"data": "IRSTD-1k reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "A9",
"projects": "AC",
"title": "DISTA-Net: Dynamic Closely-Spaced Infrared Small Target Unmixing",
"authors": "Shengdong Han; Shangdong Yang; Yuxuan Li; Xin Zhang; Xiang Li; Jian Yang; Ming-Ming Cheng; Yimian Dai",
"date": "ICCV 2025; preprint 2025-05-25",
"identifier": "arXiv:2505.19148",
"url": "https://openaccess.thecvf.com/content/ICCV2025/html/Han_DISTA-Net_Dynamic_Closely-Spaced_Infrared_Small_Target_Unmixing_ICCV_2025_paper.html",
"already_done": "Dynamic sparse unmixing explicitly resolves close targets, including subpixel positions; exposes the flaw in proximity exclusion.",
"code": "https://github.com/GrokCV/GrokCSO — repository indexed",
"data": "CSIST-100K and CSO-mAP released according to paper/repository; download not tested",
"verification": "CVF proceedings metadata and arXiv abstract verified; author order follows proceedings (preprint differs)"
},
{
"id": "A10",
"projects": "AC",
"title": "Motion Prior Knowledge Learning with Homogeneous Language Descriptions for Moving Infrared Small Target Detection",
"authors": "Shengjia Chen; Luping Ji; Weiwei Duan; Shuang Peng; Mao Ye",
"date": "2025-04-11 proceedings release, AAAI",
"identifier": "10.1609/aaai.v39i2.32217",
"url": "https://ojs.aaai.org/index.php/AAAI/article/view/32217",
"already_done": "Motion representations refined by graph attention; motion-aware graph learning is already used.",
"code": "Not verified; no runnable release established",
"data": "ITSDT-15K and IRDST reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B1",
"projects": "B",
"title": "Infrared Small Target Detection with Scale and Location Sensitivity",
"authors": "Qiankun Liu; Rui Liu; Bolun Zheng; Hongkui Wang; Ying Fu",
"date": "CVPR 2024; preprint 2024-03-28",
"identifier": "arXiv:2403.19366",
"url": "https://arxiv.org/abs/2403.19366",
"already_done": "SLS combines scale-weighted IoU and centroid-related localization; generic size-sensitive loss is not new.",
"code": "https://github.com/ying-fu/MSHNet — opened; model/utils/main.py visible",
"data": "IRSTD-1k and NUDT-SIRST; links in repository",
"verification": "Primary metadata plus method equations read in arXiv HTML"
},
{
"id": "B2",
"projects": "B",
"title": "Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection",
"authors": "Jiangnan Yang; Shuangli Liu; Jingjun Wu; Xinyu Su; Nan Hai; Xueli Huang",
"date": "AAAI 2025, proceedings release 2025-04-11; preprint 2024-12-22",
"identifier": "10.1609/aaai.v39i9.32996; arXiv:2412.16986",
"url": "https://ojs.aaai.org/index.php/AAAI/article/view/32996",
"already_done": "Scale-dependent weighting of localization/scale terms already exists.",
"code": "https://github.com/JN-Yang/PConv-SDloss-Data — opened; MIT repository license",
"data": "SIRST-UAVB and IRSTD-1k; release links, not downloaded",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B3",
"projects": "B",
"title": "Revisiting the Scale Loss Function and Gaussian-Shape Convolution for Infrared Small Target Detection",
"authors": "Hao Li; Man Fung Zhuo",
"date": "2026-04-11 preprint; peer review not verified",
"identifier": "arXiv:2604.09991",
"url": "https://arxiv.org/abs/2604.09991",
"already_done": "Already critiques scale-loss monotonicity and proposes a signed-area-difference loss. Do not present that critique as new.",
"code": "Abstract claims anonymous code/weights; URL/release not established",
"data": "IRSTD-1k, NUDT-SIRST, SIRST-UAVB reported",
"verification": "arXiv record opened"
},
{
"id": "B4",
"projects": "B",
"title": "Boosting Infrared Small Target Detection via Logit-Domain Contrast and Adaptive Shape Refinement",
"authors": "Handong Zeng; Zhengeng Yang; Shuai Zhang; Shikai Chen; Hongshan Yu",
"date": "2026-07-02 preprint; submitted to IEEE, acceptance not verified",
"identifier": "arXiv:2607.01555",
"url": "https://arxiv.org/abs/2607.01555",
"already_done": "AC-SLSIoU combines logit-margin discrimination, adaptive boundary penalties and false-alarm focal weighting. A new weighted negative-pixel term is insufficient.",
"code": "Not verified; no runnable release established",
"data": "IRSTD benchmarks reported; release not established",
"verification": "arXiv record and method sections opened"
},
{
"id": "B5",
"projects": "B",
"title": "CG-IRNet: Structure–Confidence Hybrid Learning for Low-False-Alarm Infrared Small Target Detection",
"authors": "Ziwen Zhu; Mengmeng Liao",
"date": "2026-06-01, Electronics",
"identifier": "10.3390/electronics15112405",
"url": "https://www.mdpi.com/2079-9292/15/11/2405",
"already_done": "Confidence-aware SLS, instance structure supervision and background suppression already target low false alarms.",
"code": "Not verified; no runnable release established",
"data": "SIRST, NUDT-SIRST, IRSTD-1k reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B6",
"projects": "B",
"title": "Infrared Small Target Detection based on Adjustable Sensitivity Strategy and Multi-Scale Fusion",
"authors": "Jinmiao Zhao; Zelin Shi; Chuang Yu; Yunpeng Liu",
"date": "2024-07-29 preprint",
"identifier": "arXiv:2407.20090",
"url": "https://arxiv.org/abs/2407.20090",
"already_done": "EEDM loss and adjustable-sensitivity postprocessing address imbalance and detection tradeoffs; threshold selection is not new.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B7",
"projects": "B",
"title": "Miss Detection vs. False Alarm: Adversarial Learning for Small Object Segmentation in Infrared Images",
"authors": "Huan Wang; Luping Zhou; Lei Wang",
"date": "ICCV 2019",
"identifier": "DOI not independently captured; stable CVF proceedings URL",
"url": "https://openaccess.thecvf.com/content_ICCV_2019/html/Wang_Miss_Detection_vs._False_Alarm_Adversarial_Learning_for_Small_Object_ICCV_2019_paper.html",
"already_done": "Separates missed detections and false alarms into adversarial learning tasks. Optimizing this tradeoff predates recent loss work.",
"code": "Official lead https://github.com/wanghuanphd/MDvsFA_cGAN not opened; https://github.com/ZhexuanZhou/MDvsFA is a third-party PyTorch implementation, not treated as official",
"data": "Original data release not downloaded",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B8",
"projects": "B",
"title": "ISNet: Shape Matters for Infrared Small Target Detection",
"authors": "Mingjin Zhang; Rui Zhang; Yuxiang Yang; Haichen Bai; Jing Zhang; Jie Guo",
"date": "CVPR 2022",
"identifier": "10.1109/CVPR52688.2022.00095 (secondary DOI metadata; CVF paper verified)",
"url": "https://openaccess.thecvf.com/content/CVPR2022/html/Zhang_ISNet_Shape_Matters_for_Infrared_Small_Target_Detection_CVPR_2022_paper.html",
"already_done": "Edge supervision and Dice-based shape learning establish a localization/shape baseline.",
"code": "https://github.com/RuiZhang97/ISNet — opened; code directed to master branch",
"data": "Paper says 1,000; repository says 1,001 IRSTD-1k images. Resolve by downloaded manifest.",
"verification": "CVF page/PDF excerpt and author repository checked"
},
{
"id": "B9",
"projects": "B",
"title": "A Normalized Gaussian Wasserstein Distance for Tiny Object Detection",
"authors": "Jinwang Wang; Chang Xu; Wen Yang; Lei Yu",
"date": "2021-10-26 preprint",
"identifier": "arXiv:2110.13389",
"url": "https://arxiv.org/abs/2110.13389",
"already_done": "Gaussian box distance mitigates tiny-box overlap sensitivity; not a mask loss or false-alarm certificate.",
"code": "https://github.com/jwwangchn/NWD — paper-linked, not opened",
"data": "AI-TOD; not an IRSTD dataset",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B10",
"projects": "B",
"title": "Rethinking Evaluation of Infrared Small Target Detection",
"authors": "Youwei Pang; Xiaoqi Zhao; Lihe Zhang; Huchuan Lu; Georges El Fakhri; Xiaofeng Liu; Shijian Lu",
"date": "NeurIPS 2025 Datasets and Benchmarks",
"identifier": "arXiv:2509.16888; 10.52202/085713-3860",
"url": "https://papers.nips.cc/paper_files/paper/2025/hash/a81051ae2c8b1e46bd51480917b8ab84-Abstract-Datasets_and_Benchmarks_Track.html",
"already_done": "Hybrid pixel/object metrics, error analysis and cross-dataset evaluation already challenge legacy Pd/Fa evaluation.",
"code": "https://github.com/lartpang/PyIRSTDMetrics — opened; MIT; code files visible",
"data": "Toolkit available; not executed",
"verification": "Proceedings/PDF excerpt/repository read; full name follows PDF"
},
{
"id": "B11",
"projects": "B",
"title": "Focal Loss for Dense Object Detection",
"authors": "Tsung-Yi Lin; Priya Goyal; Ross Girshick; Kaiming He; Piotr Dollár",
"date": "2017-08-07 preprint; ICCV 2017",
"identifier": "arXiv:1708.02002",
"url": "https://arxiv.org/abs/1708.02002",
"already_done": "Hard-example reweighting handles imbalance; no budget certificate.",
"code": "Code linked in arXiv; not executed",
"data": "COCO, not IRSTD",
"verification": "arXiv record opened"
},
{
"id": "B12",
"projects": "B",
"title": "V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation",
"authors": "Fausto Milletari; Nassir Navab; Seyed-Ahmad Ahmadi",
"date": "2016-06-15 preprint",
"identifier": "arXiv:1606.04797",
"url": "https://arxiv.org/abs/1606.04797",
"already_done": "Dice objective addresses overlap/imbalance, not object false-alarm constraints.",
"code": "Not verified; no runnable release established",
"data": "Medical MRI, not IRSTD",
"verification": "arXiv record opened"
},
{
"id": "B13",
"projects": "B",
"title": "Learn then Test: Calibrating Predictive Algorithms to Achieve Risk Control",
"authors": "Anastasios N. Angelopoulos; Stephen Bates; Emmanuel J. Candès; Michael I. Jordan; Lihua Lei",
"date": "2021-10-03 preprint; Annals of Applied Statistics 2025",
"identifier": "arXiv:2110.01052",
"url": "https://arxiv.org/abs/2110.01052",
"already_done": "Finite-sample risk control through hypothesis testing already applies to detection/segmentation. Our certificate is an application, not a new concentration theorem.",
"code": "Not verified; no runnable release established",
"data": "General calibration examples; no IRSTD dataset claimed",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B14",
"projects": "B",
"title": "Conformal Risk Control",
"authors": "Anastasios N. Angelopoulos; Stephen Bates; Adam Fisch; Lihua Lei; Tal Schuster",
"date": "2022-08-04 preprint",
"identifier": "arXiv:2208.02814",
"url": "https://arxiv.org/abs/2208.02814",
"already_done": "Monotone bounded losses support marginal expected-risk guarantees. Distinguish these from high-probability-over-calibration guarantees.",
"code": "Not verified; no runnable release established",
"data": "General prediction examples; no IRSTD dataset claimed",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "B15",
"projects": "B",
"title": "Diffuse to Detect: Bi-Level Sample Rebalancing with Pseudo-Label Diffusion for Point-Supervised Infrared Small-Target Detection",
"authors": "Zhu Liu; Yuanhang Yao; Ping Qian; Zihang Chen; Risheng Liu",
"date": "ICML 2026",
"identifier": "DOI/arXiv not captured; PMLR 306:79394–79413",
"url": "https://proceedings.mlr.press/v306/liu26fj.html",
"already_done": "Adaptive sample weights, label diffusion and bi-level optimization already tackle sample imbalance.",
"code": "https://github.com/yuanhang-yao/diffuse-to-detect — indexed author repository",
"data": "SIRST-v1, NUDT-SIRST, IRSTD-1k, SIRST3 listed",
"verification": "PMLR proceedings verified"
},
{
"id": "C1",
"projects": "C",
"title": "MIST: A Benchmark and Baseline for Multi-Frame Infrared Small Target Detection in Complex Motion",
"authors": "Rui Gao; Meihong Zhang; Gongyang Li; Guanyi Li; Kai Zhao; Xianchao Zhang; Dan Zeng",
"date": "TIP 2026; author acceptance announcement 2026-04-27",
"identifier": "10.1109/TIP.2026.3689420 (PubMed metadata)",
"url": "https://github.com/ShuCvlab/MIST",
"already_done": "Complex-motion benchmark; shifted-neighborhood compensation and information-bottleneck decoding already address irregular weak motion.",
"code": "Author repository opened; train/test/config files; dataset/weights released",
"data": "MIST 78 train / 42 test sequences; 11 hard test subset; links not downloaded",
"verification": "Author repository read; DOI secondary metadata, publisher full text not audited"
},
{
"id": "C2",
"projects": "C",
"title": "Probing Deep into Temporal Profile Makes the Infrared Small Target Detector Much Better",
"authors": "Ruojing Li; Wei An; Yingqian Wang; Xinyi Ying; Yimian Dai; Longguang Wang; Miao Li; Yulan Guo; Li Liu",
"date": "Preprint 2025-06-15; TPAMI 2026 volume",
"identifier": "arXiv:2506.12766; 10.1109/TPAMI.2026.3683258",
"url": "https://arxiv.org/abs/2506.12766",
"already_done": "Long temporal profiles and one-dimensional anomaly modeling accumulate weak evidence without candidate graphs.",
"code": "https://github.com/TinaLRJ/DeepPro — opened",
"data": "NUDT-MIRSDT, HiNo and satellite dataset links; README 120 total vs 80 train +20 test leaves 20 unexplained",
"verification": "arXiv, repository; journal DOI from PubMed, author order follows journal/repository"
},
{
"id": "C3",
"projects": "C",
"title": "HyperTea: Hypergraph-based temporal enhancement and alignment network for moving infrared small target detection",
"authors": "Zhaoyuan Qi; Weihua Gao; Wenlong Niu; Jie Tang; Yun Li; Xiaodong Peng",
"date": "Preprint 2025-08-14; KBS 2026",
"identifier": "arXiv:2508.10678; 10.1016/j.knosys.2026.116099",
"url": "https://arxiv.org/abs/2508.10678",
"already_done": "Global/local temporal hypergraph enhancement and alignment directly overlap generic Project C.",
"code": "https://github.com/Lurenjia-LRJ/HyperTea — indexed README says full code/weights still being organized; not a verified runnable release",
"data": "DAUB and IRDST links; no dataset bytes acquired",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "C4",
"projects": "C",
"title": "MI-DETR: A Strong Baseline for Moving Infrared Small Target Detection with Bio-Inspired Motion Integration",
"authors": "Nian Liu; Jin Gao; Shubo Lin; Yutong Kou; Sikui Zhang; Fudong Ge; Zhiqiang Pu; Liang Li; Gang Wang; Yizheng Wang; Weiming Hu",
"date": "2026-03-05 preprint",
"identifier": "arXiv:2603.05071",
"url": "https://arxiv.org/abs/2603.05071",
"already_done": "Explicit cellular-automaton motion maps and appearance interaction; explicit motion modeling is not new.",
"code": "https://github.com/nliu-25/MI-DETR — paper-linked, not executed",
"data": "IRDST-H, DAUB-R, ITSDT-15K reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "C5",
"projects": "C",
"title": "IRDINO: Adapting DINOv3 with Second-Order Motion Awareness for Moving Infrared Small Target Detection",
"authors": "Qian Xu; Shuaipeng Fan; Fei Gao; Mingjin Zhang",
"date": "CVPR Findings 2026, not main-track CVPR",
"identifier": "DOI/arXiv not captured; stable CVF URL",
"url": "https://openaccess.thecvf.com/content/CVPR2026F/html/Xu_IRDINO_Adapting_DINOv3_with_Second-Order_Motion_Awareness_for_Moving_Infrared_CVPRF_2026_paper.html",
"already_done": "Second-order motion plus pretrained features is an additional temporal baseline.",
"code": "Not verified; no runnable release established",
"data": "DAUB, ITSDT-15K, IRDST reported",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "C6",
"projects": "C",
"title": "TLCFormer: synergizing temporal motion and local contrast for robust infrared video small object detection",
"authors": "Zihan Wang; Lun Li; Fan Bai",
"date": "2026-05-20, Scientific Reports",
"identifier": "10.1038/s41598-026-53189-w",
"url": "https://doi.org/10.1038/s41598-026-53189-w",
"already_done": "Temporal motion and contrast fusion already target very small weak video objects.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Primary indexed metadata/abstract; full text not audited"
},
{
"id": "C7",
"projects": "C",
"title": "Temporal-Emerged Prompting for Segment Anything in Multiframe Infrared Small Target Detection",
"authors": "Yinghui Xing; Donghao Chu; Shizhou Zhang; Di Xu",
"date": "ICML 2026; preprint 2026-06-26",
"identifier": "arXiv:2606.27655",
"url": "https://proceedings.mlr.press/v306/xing26b.html",
"already_done": "Global/local motion discrepancy provides temporal prompts for SAM; temporal weak-evidence emergence is established.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "PMLR proceedings and arXiv metadata verified"
},
{
"id": "C8",
"projects": "C",
"title": "DP–MHT–TBD: A Dynamic Programming and Multiple Hypothesis Testing-Based Infrared Dim Point Target Detection Algorithm",
"authors": "Jinming Du; Huanzhang Lu; Luping Zhang; Moufa Hu; Yingjie Deng; Xinglin Shen; Dongyang Li; Yu Zhang",
"date": "2022-10-11, Remote Sensing",
"identifier": "10.3390/rs14205072",
"url": "https://www.mdpi.com/2072-4292/14/20/5072",
"already_done": "Dynamic programming and multiple hypotheses accumulate trajectories before detection. A differentiable DP alone is incremental.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "Publisher indexed abstract; author list cross-check from DBLP, full text pending"
},
{
"id": "X1",
"projects": "B",
"title": "Neural-Network-Based False Alarm Controllable Detector for Weak Targets via a Differentiable NP Loss",
"authors": "Qizhe Qu; Hao Chen; Weijian Liu; Binbin Li; Yong-Liang Wang",
"date": "2025, IEEE TAES 61(5):12258–12270",
"identifier": "10.1109/TAES.2025.3572501",
"url": "https://doi.org/10.1109/TAES.2025.3572501",
"already_done": "Potential major conceptual prior: differentiable Neyman–Pearson training. Do not claim first constrained detector.",
"code": "Not verified; no runnable release established",
"data": "Availability/protocol not independently established",
"verification": "UNVERIFIED PRIMARY ACCESS: secondary bibliographic leads agree; DOI fetch failed. Do not rely on technical summary until full paper read"
}
]
+13
View File
@@ -0,0 +1,13 @@
# Upstream source audit
Audit cutoff: 2026-10-31. Public author repository text was fetched; no upstream code was executed or bundled. Blob hashes identify individual files, not whole repository revisions.
| Item | Evidence inspected | Finding and limitation |
|---|---|---|
| [EDGRU](https://github.com/Huang-1015/EDGRU/tree/b0159312ae8047e37c913cf2cf6116c7776eeffc) | Root/model listings; README; latest commit | Code release exists. README contains only a title/description; no root license file observed. Commit b0159312ae8047e37c913cf2cf6116c7776eeffc dated 2026-10-28. Model blob 9efdbc4fd211317c4b49af4056fa0419f8791dd3 listed, not executed. |
| [MSHNet SLS](https://github.com/ying-fu/MSHNet/blob/main/model/loss.py) | Full loss source; blob c30b85961eb3db8029072725c356bbfaffa1d972 | Scale ratio uses squared half mass difference. Localization uses unnormalized first moments divided by pixel count, not probability-mass-normalized centroids. Warmup and with_shape matter. Root listing did not expose a license file. |
| [SD loss](https://github.com/JN-Yang/PConv-SDloss-Data/blob/main/model/loss.py) | Loss source; blob 831b2c64eea02e238a4d918b94deb9ae80d9c617 | SDM combines SLS-style overlap and localization with a batch-mean scale coefficient using area, 512²/(HW), and a cap. SDB is a different box objective. File-level availability does not establish a standalone executable training pipeline. |
For SLS/SD, the helper named Dice includes an additional intersection term in its denominator compared with conventional soft Dice. Preserve this distinction in any reproduction: do not silently equate that helper with our standard Dice baseline. Both inspected SLS-style functions use zero smoothing for overlap; empty-mask/numerical edge cases need explicit parity tests. SD's device/dtype behavior also needs a real PyTorch test. None of these observations establishes a published-result error.
A faithful SLS/SD comparator should record warmup, reduction, resolution, mass moments, smoothing and dynamic coefficient exactly, then separately label any robustness fixes. Do not substitute textbook centroid formulas while retaining the upstream method name.
+91
View File
@@ -0,0 +1,91 @@
# Experimental plan — no benchmark runs completed
## Dataset audit and access status
All counts below are source-reported, not locally measured. Download links were located; dataset payloads were not downloaded. No target-size histogram, annotation accuracy, or license entitlement is inferred from a paper's description.
| Dataset / source | Verified metadata and protocol evidence | Rights/download status | Required audit / use |
|---|---|---|---|
| [SIRST](https://github.com/YimianDai/sirst), often called NUAA-SIRST in other work | Original author requests the name SIRST. Repository contains `idx_320`, `idx_427`, images.zip, masks.zip; multiple protocols exist | Public files visible; no dataset license established in inspected page | Use exact original split filenames/hashes; 427-image count widely reported but verify actual payload. Real images; inspect close pairs and omitted dim targets |
| [NUDT-SIRST / DNANet](https://github.com/YeRen123455/Infrared-Small-Target-Detection) | Author reports 1,327 synthetic images, 256×256; training command uses `50_50` | MIT repository license visible; separate dataset scope not established; Baidu download listed | Check synthesis/background reuse across splits; compute mask component areas; synthetic annotation precision is not real sensor validity |
| [IRSTD-1k / ISNet](https://github.com/RuiZhang97/ISNet) | CVF paper says 1,000, repository 1,001 manually labeled images; no silent reconciliation | Repository advertises dataset MIT agreement, Drive/cloud links; archive agreement not inspected | Use manifest count and published baseline split; document 800/200 versus 800/201 variants, never mix scores. Audit boundary ambiguity |
| [MIST](https://github.com/ShuCvlab/MIST) | Synthetic targets in real backgrounds; 78 training/42 testing sequences; 11-sequence hard subset. Masks, boxes and points listed | MIT code repository; dataset license scope unresolved; Drive link present | Preserve sequence splits; `val_all`/`val_hard` are test naming in release, not freely tunable dev data. Test rapid/irregular motion |
| [NUDT-MIRSDT via DeepPro](https://github.com/TinaLRJ/DeepPro) | README reports 120 sequences but specifies 80 train +20 test | Drive/Baidu links; license unresolved | Resolve remaining 20 sequences and exact split files. Do not invent an 80/40 split |
| [IRDST](https://xzbai.buaa.edu.cn/datasets.html) | 142,727 frames: 40,650 real in 85 scenes; 102,077 synthetic in 317 scenes. Masks, boxes, center labels; boxes padded two pixels beyond mask boundary | Author page with real/synthetic Drive/Baidu links and sequence-version link; license not stated in inspected page | Keep scenes disjoint; use real subset for external robustness. Mask-derived boxes differ from tight boxes |
| [DAUB](https://www.scidb.cn/en/detail?dataSetId=720626420933459968) | Dataset landing page resolves; HyperTea links it | Page body unreadable; license, counts, split and payload unverified | Do not treat as ready-to-use; verify record and annotations first |
| [CSIST-100K](https://github.com/GrokCV/GrokCSO) | DISTA-Net provides close-target unmixing ecosystem and subpixel metrics | Repository indexed; dataset license/download not tested | Essential adversarial test for A; optional specialized extension for C, not interchangeable with mask-segmentation benchmarks |
The first three are single-frame benchmarks and cannot validate temporal/subpixel claims. Source occupancy below a pixel does not imply a one-pixel binary mask; report optical PSF and source location separately. MIST is useful but not a substitute for real video validation.
### Data validation before any training
Create `manifest.csv` with id,image,mask,split,group. Preserve the published test split. From the original training data, allocate independent scene groups to train/dev/cal, with a documented fixed seed and counts. Label comparisons under this reduced-training protocol separately from full-training published scores; retrain every baseline using the same split. Do not use test images for calibration. Calibration-size requirements may force an additional authorized exposure dataset.
Run `scripts/audit_data.py`. It measures native area bins 1–4, 5–9, 10–25, ≥26 pixels, area quantiles, object counts, empty-image proportion, resolutions, nearest-centroid separations, file hashes and group leakage. It does not establish missing annotations or near-duplicates. Manually inspect all very small components and a stratified sample of at least 50 images, including large clutter, empty frames, close pairs and saturation. Record mask edits as a separate version; report official-label results separately. Check decoded-image hashes/perceptual near-duplicates and source sequence overlap across datasets before transfer evaluation. No such inspection has yet run on real data.
## Baseline ladder and implementation status
| Baseline / method | Current implementation | Required role |
|---|---|---|
| Compact one-pool U-Net + BCE, Dice, BCE+Dice, focal or soft IoU | Written from scratch; PyTorch runtime not available, gradient tests skipped | Sanity/falsification baseline, not published SOTA reproduction |
| Frozen candidate max-probability score + calibration | Implemented and CPU pipeline tested with synthetic fixtures | Measures benefit of calibration without learned gate |
| Same candidates + BCE MLP gate + same calibration | Training code prepared, not executed | Controls for capacity/extra stage |
| Same candidates + constrained matching-aware MLP, with/without area weight | Prototype prepared; pointwise bound CPU tests pass | Tests proposed mechanism |
| MSHNet + SLS, SD Loss, AC-SLSIoU, CG-IRNet | Sources located; not ported/reproduced | Required close prior comparators, under identical train/calibration splits |
| NWD and GIoU/DIoU/CIoU | Not implemented in mask prototype | Box-level comparison only with common box head and assignment; do not substitute a mask formula and call it NWD |
| A: MLP / graph gate / NMS / exact MWIS on same candidates | Exact tiny MWIS oracle only | Test edge correctness, isolated false positives and recall retention |
| C: single-frame, temporal mean, DP/TBD, DeepPro, MISTNet, HyperTea | Tiny complete-path DP oracle only | All require identical window/causality and explicit release/protocol audit |
BCE averages pixel log loss; Focal uses α=.25 and γ=2; soft Dice and IoU use epsilon 1e-6. These definitions are explicit in `models.py`; focal variants must not be silently changed. Use known baseline source code for SLS/SD after checking licenses and upstream revisions. No third-party implementation is bundled or relabeled.
## Evaluation specification
Use native-resolution masks. Main segmentation operating point is probability ≥0.5; diagnostic curves use a predetermined 101-threshold grid 0,.01,…,1. Never choose the final operating point using test labels. For calibrated object selection, proposals are frozen at base threshold .1 with 8-connectivity, retain at most K=64 by component peak score (raster-order tie break), then delete entire components by gate score. The pixel and object thresholds are separate. Default numbers are development hypotheses, not validated settings.
Ground-truth objects are 8-connected mask components. Eligibility: centroid Euclidean distance ≤3 native pixels. Maximum-cardinality bipartite matching enforces one-to-one assignment; the prototype's deterministic augmenting-path ordering resolves ties. A merged prediction can match at most one target. Centroid gating alone can credit a poor mask, hence always report overlap metrics and an overlap-gated sensitivity analysis. Official author metric implementations must also be run for paper comparability; do not label this maximum-matching implementation as identical to a legacy greedy matcher.
| Metric | Exact definition / convention |
|---|---|
| IoU | Sum intersection pixels / sum union pixels over images; all-empty denominator → null |
| nIoU | Arithmetic mean per-image IoU; both masks empty → 1. Also report nonempty-target subset separately in final study |
| Pixel F1 | 2Σ intersection/(Σ predicted pixels+Σ GT pixels); zero denominator → null |
| Pd | Matched GT objects / total GT objects; no GT → null |
| Object F1 | 2TP/(2TP+FP+FN), from one-to-one matching; zero denominator → null |
| FP/image | Unmatched predicted component count / number of images; primary budget metric |
| P(any FA) | Fraction of images with at least one unmatched predicted object; secondary, distinct risk |
| Fa_pixel | Predicted background pixels / total image pixels; report raw fraction and ×10^-6, not FP object count |
| Fa_unmatched_area | Total pixels in unmatched predicted components / total image pixels; deterministic matching tie rule disclosed |
| Latency | Batch 1 native 256 and 512 dimensions; 20 warm-up +100 timed iterations; CUDA synchronization; FP32 reference; separately FP16 only if tested |
| Cost | Trainable parameters, convolution MACs (one multiply-accumulate), FLOPs=2×MACs with excluded operators listed; peak allocated VRAM |
Do not call all “Fa” measures equivalent. Matched-component overflow pixels contribute to Fa_pixel but not Fa_unmatched_area. The NeurIPS 2025 [PyIRSTDMetrics](https://github.com/lartpang/PyIRSTDMetrics) toolkit provides additional matching/hybrid analyses; cross-check once its source revision is pinned. Threshold sweeps are descriptive test curves, not a source for selecting published operating thresholds.
Report scene-bootstrap uncertainty for descriptive test metrics, while keeping the iid finite-sample calibration theorem separate. Repeat training seeds 0,1,2. Unit tests are not benchmark evidence. For extremely low rates report exposure, observed counts and one-sided intervals. Include all-background real images; positive-only benchmarks miss important operating conditions.
## Single RTX 3090 plan
For B, begin with native 256/512 inputs, width 16, batch 1, FP32; the compact baseline is expected to fit, but no VRAM measurement has run. Profile a batch before scaling. Gate training uses five cached component features and is inexpensive on CPU. Record wall time and memory; do not estimate completed GPU-hours. Use larger batches/AMP only as a separately logged change. The prototype intentionally has no augmentation, resizing or AMP to simplify initial verification; stronger baselines must use a matched documented augmentation regime.
For C, begin with 5 frames, ≤64 candidates/frame, bounded-degree motion edges and batch 1. Test windows 3/5/9 only after profiling. MIST upstream uses two 24 GB GPUs; microbatching and accumulation do not exactly preserve BatchNorm behavior. Its older PyTorch/NATTEN stack should live in a separate environment. Window changes and online vs offline access must be disclosed. Do not claim a faithful one-GPU reproduction solely because the model executes.
## Ablations and stop conditions
Run `configs/ablations.csv` in the stated order. Primary comparisons share detector probabilities, proposal masks, K, calibration data and matching rule. Mandatory factors: no gate, BCE gate, constrained gate, no size weights; fixed penalty vs dual updates; actual-match risk vs canonical bound tightness; raw pixel negative penalty; proposal recall/cap/base-threshold changes; one-to-one vs legacy matching; separate calibration vs empirical-only threshold; K=16/32/64; close-pair distance; background-only scenes; distribution shift without recalibration.
Development grid: α_count=.1,.5,1 FP/image, α_any=.01,.05,.1; δ=.05. Each certificate is per declared risk/budget/pipeline. If claiming simultaneous validity across multiple trained models, risk types or budgets, include them in multiplicity accounting or reserve an independent final audit set. The prototype certificate covers its single frozen model and threshold family only. Models and budgets cannot be repeatedly selected by reusing calibration outcomes without adjustment.
Continue only if a useful certificate exists and constrained training improves recall over equally calibrated baselines. If zero-output selection dominates, first fix sample adequacy or target risk scope. Never relax α after seeing the test set and present it as the original budget.
## 8–12-week work packages
- Weeks 1–2: close-prior full texts, code rights/revisions, data audit, sample-size decision, exact split manifests.
- Weeks 3–4: compact baselines and gate comparisons, three seeds, constraint feasibility and calibration coverage on controlled simulation.
- Weeks 5–6: verified SLS/SD and recent-loss comparisons; second backbone; add hard real negatives.
- Weeks 7–8: cross-dataset and close-pair stress tests; independent metric audit; make go/no-go decision.
- Weeks 9–12: robust repeats where justified, full limitation analysis, manuscript and reproduction package.
## Calibration and upstream audit update
Predeclare either Bonferroni tail calibration or fixed-sequence testing; compare training methods under the same choice. For a formal comparison that selects the best procedure using calibration labels, allocate the total delta across procedures or use a fresh independent calibration set. Record procedure, risk type, cap, order, alpha, delta and accepted threshold in each run. Do not treat any-alarm probability as expected object count.
The SLS/SD loss-file audit is recorded in evidence/upstream_audit.md. Implement parity checks for native resolution, empty labels, multi-target images, batch reduction and warmup before labeling a baseline faithful. Their source availability is verified, execution is not. EDGRU's repository revision is now recorded; its license is not established by source visibility.
+1
View File
@@ -0,0 +1 @@
"""Research prototype; no pretrained weights or benchmark results included."""
+229
View File
@@ -0,0 +1,229 @@
"""Reference CPU implementation. Coordinates are (row, col), native pixels."""
import itertools
import math
import numpy as np
from scipy import ndimage
from scipy.stats import beta, binom
def components(mask):
mask = np.asarray(mask, dtype=bool)
if mask.ndim != 2:
raise ValueError('Expected a 2D mask')
labels, n = ndimage.label(mask, structure=np.ones((3, 3), dtype=int))
return [labels == i for i in range(1, n + 1)]
def centers(masks):
return np.asarray([np.argwhere(m).mean(0) for m in masks], float).reshape(-1, 2)
def eligibility(pred_masks, gt_masks, radius=3.0):
if radius < 0:
raise ValueError('radius must be nonnegative')
a, b = centers(pred_masks), centers(gt_masks)
return np.linalg.norm(a[:, None] - b[None, :], axis=-1) <= radius
def matching(edges):
"""Deterministic maximum cardinality bipartite matching, not greedy matching."""
edges = np.asarray(edges, bool)
if edges.ndim != 2:
raise ValueError('Expected two-dimensional eligibility')
owner = [-1] * edges.shape[1]
def augment(i, seen):
for j in np.flatnonzero(edges[i]):
if j in seen:
continue
seen.add(j)
if owner[j] < 0 or augment(owner[j], seen):
owner[j] = i
return True
return False
for i in range(edges.shape[0]):
augment(i, set())
return sorted((i, j) for j, i in enumerate(owner) if i >= 0)
def candidate_pool(prob, base_threshold=0.1, cap=64):
"""Threshold ONCE; subsequent gate thresholds delete whole fixed components."""
prob = np.asarray(prob, float)
if prob.ndim != 2 or not np.isfinite(prob).all() or np.any((prob < 0) | (prob > 1)):
raise ValueError('Expected finite 2D probabilities in [0,1]')
if not 0 <= base_threshold <= 1 or not isinstance(cap, int) or cap < 1:
raise ValueError('Invalid threshold/cap')
masks = components(prob >= base_threshold)
masks.sort(key=lambda m: -float(prob[m].max())) # stable ties: raster component order
masks = masks[:cap]
features = []
for m in masks:
p = prob[m]
ring = ndimage.binary_dilation(m, iterations=2) & ~m
contrast = float(p.mean() - prob[ring].mean()) if ring.any() else 0.0
features.append([float(p.max()), float(p.mean()), float(p.std()),
float(np.log1p(m.sum())), contrast])
return masks, np.asarray(features, np.float32).reshape(-1, 5)
def canonical_labels(pred_masks, gt_mask, radius=3.0):
gt = components(gt_mask)
pairs = matching(eligibility(pred_masks, gt, radius))
labels = np.zeros(len(pred_masks), np.float32)
areas = np.ones(len(pred_masks), np.float32)
for i, j in pairs:
labels[i] = 1
areas[i] = gt[j].sum()
return labels, areas
def image_stats(pred_masks, gt_mask, radius=3.0):
gt_mask = np.asarray(gt_mask, bool)
gt = components(gt_mask)
pairs = matching(eligibility(pred_masks, gt, radius))
tp = len(pairs)
union_pred = np.zeros_like(gt_mask)
for m in pred_masks:
if m.shape != gt_mask.shape:
raise ValueError('Shape mismatch')
union_pred |= m
intersection = int((union_pred & gt_mask).sum())
union = int((union_pred | gt_mask).sum())
fp_pixels = int((union_pred & ~gt_mask).sum())
matched = {i for i, _ in pairs}
# Separate legacy-style unmatched-component area from literal background-pixel FP.
unmatched_area = sum(int(m.sum()) for i, m in enumerate(pred_masks) if i not in matched)
return dict(tp=tp, fp=len(pred_masks)-tp, fn=len(gt)-tp,
intersection=intersection, union=union,
pred_pixels=int(union_pred.sum()), gt_pixels=int(gt_mask.sum()),
fp_pixels=fp_pixels, unmatched_area=unmatched_area,
pixels=gt_mask.size, niou=(intersection/union if union else 1.0))
def aggregate(rows):
if not rows:
raise ValueError('Cannot evaluate an empty split')
sums = {k: sum(r[k] for r in rows) for k in rows[0] if k != 'niou'}
def ratio(a, b):
return a/b if b else None
tp, fp, fn = (sums[k] for k in ('tp', 'fp', 'fn'))
return dict(images=len(rows), **sums,
IoU=ratio(sums['intersection'], sums['union']),
nIoU=float(np.mean([r['niou'] for r in rows])),
Pd=ratio(tp, tp+fn), object_F1=ratio(2*tp, 2*tp+fp+fn),
pixel_F1=ratio(2*sums['intersection'], sums['pred_pixels']+sums['gt_pixels']),
FP_per_image=fp/len(rows), P_any_FA=sum(r['fp']>0 for r in rows)/len(rows),
Fa_pixel=sums['fp_pixels']/sums['pixels'],
Fa_unmatched_area=sums['unmatched_area']/sums['pixels'])
def cp_upper(successes, n, error):
if n < 1 or not 0 < error < 1 or not 0 <= successes <= n:
raise ValueError('Invalid binomial parameters')
return 1.0 if successes == n else float(beta.ppf(1-error, successes+1, n-successes))
def calibrate(fp_counts, thresholds, cap, alpha=0.1, delta=0.05, risk='count', method='bonferroni'):
"""Finite-grid CP calibration. Rows MUST be iid held-out deployment units.
Does not infer iid sampling from filenames. Empty fallback is explicit.
"""
counts = np.asarray(fp_counts)
ts = np.asarray(thresholds, float)
if (counts.ndim != 2 or counts.shape[0] < 1 or counts.shape[1] != len(ts)
or len(ts) < 1 or not np.isfinite(counts).all()
or not np.isfinite(ts).all() or np.any((ts<0)|(ts>1))
or len(np.unique(ts)) != len(ts) or not isinstance(cap, int) or cap < 1
or np.any(counts < 0) or np.any(counts > cap) or np.any(counts != np.floor(counts))
or not 0 < delta < 1 or not 0 <= alpha <= (cap if risk=='count' else 1)
or risk not in ('count', 'any') or method not in ('bonferroni', 'fixed_sequence')):
raise ValueError('Invalid calibration input')
n, m = counts.shape
if method == 'fixed_sequence':
# Order fixed before inspecting labels; stop at the first failed test.
order = np.argsort(-ts).tolist()
tested = []
chosen = None
limit = cap if risk == 'count' else 1
for j in order:
values = counts[:, j] if risk == 'count' else (counts[:, j] > 0)
mean = float(np.mean(values))/limit
target = alpha/limit
if target == 1:
pvalue = 0.0 # Risk <= known support is deterministic.
elif target == 0 or mean >= target:
pvalue = 1.0
elif risk == 'any':
pvalue = float(binom.cdf(int(np.sum(values)), n, target))
else:
kl = ((mean*math.log(mean/target) if mean else 0.0)
+ (1-mean)*math.log((1-mean)/(1-target)))
pvalue = math.exp(-n*kl)
tested.append(dict(threshold=float(ts[j]), pvalue=pvalue))
if pvalue > delta:
break
chosen = j
return dict(method=method, risk=risk, alpha=alpha, delta=delta, n=n, cap=cap,
thresholds=ts.tolist(), tested=tested,
threshold=None if chosen is None else float(ts[chosen]),
reject_all=chosen is None,
certified_risk_budget=0.0 if chosen is None else alpha,
status='reject_all_no_nontrivial_certificate' if chosen is None else 'certified_under_iid_assumptions')
tails = cap if risk == 'count' else 1
bounds = [sum(cp_upper(int((counts[:,j]>=k).sum()), n, delta/(m*tails))
for k in range(1, tails+1)) for j in range(m)]
feasible = [j for j in range(m) if bounds[j] <= alpha]
# Lowest threshold keeps largest nested set; no label-based utility search needed.
chosen = min(feasible, key=lambda j: ts[j]) if feasible else None
return dict(method=method, risk=risk, alpha=alpha, delta=delta, n=n, cap=cap,
thresholds=ts.tolist(), upper_bounds=bounds,
threshold=None if chosen is None else float(ts[chosen]),
reject_all=chosen is None,
selected_upper_bound=0.0 if chosen is None else bounds[chosen],
status='reject_all_no_nontrivial_certificate' if chosen is None else 'certified_under_iid_assumptions')
def softplus_bound(scores, negative, tau=1.0):
if tau <= 0:
raise ValueError('tau must be positive')
return float(np.logaddexp(0, np.asarray(scores)[np.asarray(negative, bool)]/tau).sum()/math.log(2))
def exact_mwis(weights, edges):
"""Tiny-instance oracle only; exponential, capped at 20 nodes."""
w = np.asarray(weights, float)
if len(w) > 20:
raise ValueError('Oracle limited to 20 nodes')
best, selection = 0.0, []
for bits in itertools.product((0,1), repeat=len(w)):
if any(bits[i] and bits[j] for i,j in edges):
continue
score = float(w @ bits)
if score > best:
best, selection = score, [i for i,b in enumerate(bits) if b]
return best, selection
def best_path(node_scores, transition_costs):
"""Complete path through layered DAG. inf cost denotes forbidden edge."""
if not node_scores or len(transition_costs) != len(node_scores)-1:
raise ValueError('Inconsistent layers')
dp = np.asarray(node_scores[0], float)
if not len(dp):
return -math.inf, []
parents = []
for scores, costs in zip(node_scores[1:], transition_costs):
scores, costs = np.asarray(scores,float), np.asarray(costs,float)
if costs.shape != (len(dp), len(scores)) or not len(scores):
raise ValueError('Invalid transitions')
val = dp[:,None]-costs
par = val.argmax(0)
dp = scores + val[par, np.arange(len(scores))]
parents.append(par)
k = int(dp.argmax())
best = float(dp[k])
if not np.isfinite(best):
return -math.inf, []
path = [k]
for par in reversed(parents):
k = int(par[k]); path.append(k)
return best, path[::-1]
+44
View File
@@ -0,0 +1,44 @@
import csv
import hashlib
from pathlib import Path
import numpy as np
from PIL import Image
def sha(path):
return hashlib.sha256(Path(path).read_bytes()).hexdigest()
def read_manifest(path):
path=Path(path)
with path.open(newline='') as stream:
rows=list(csv.DictReader(stream))
if not rows or not {'id','image','mask','split','group'} <= set(rows[0]):
raise ValueError('Manifest requires id,image,mask,split,group')
ids=set(); groups={}; hashes={}
for r in rows:
if r['id'] in ids or not r['id'] or '/' in r['id'] or '\\' in r['id'] or r['id'] in ('.','..'):
raise ValueError('Duplicate/unsafe id')
ids.add(r['id'])
if r['split'] not in ('train','dev','cal','test') or not r['group']:
raise ValueError('Invalid split/group')
if r['group'] in groups and groups[r['group']]!=r['split']:
raise ValueError('Scene group crosses splits')
groups[r['group']]=r['split']
for k in ('image','mask'):
r[k]=str((path.parent/r[k]).resolve())
if not Path(r[k]).is_file(): raise FileNotFoundError(r[k])
h=sha(r['image'])
if h in hashes and hashes[h]!=r['split']:
raise ValueError('Identical image bytes cross splits')
hashes[h]=r['split']
return rows
def read_pair(row):
with Image.open(row['image']) as img:
image=np.asarray(img).copy()
with Image.open(row['mask']) as img:
mask=np.asarray(img).copy()
if image.ndim!=2 or image.dtype!=np.uint8:
raise ValueError('Prototype requires native-resolution 8-bit grayscale; no implicit conversion')
if mask.ndim!=2 or mask.shape!=image.shape:
raise ValueError('Mask shape/format mismatch')
return image.astype(np.float32)/255., mask>0
+51
View File
@@ -0,0 +1,51 @@
"""Original compact baseline, NOT a reproduction of MSHNet or DNANet."""
import torch
from torch import nn
from torch.nn import functional as F
class TinyUNet(nn.Module):
def __init__(self, width=16):
super().__init__()
def block(a,b):
return nn.Sequential(nn.Conv2d(a,b,3,padding=1),nn.ReLU(),
nn.Conv2d(b,b,3,padding=1),nn.ReLU())
self.enc = block(1,width)
self.mid = block(width,width*2)
self.dec = block(width*3,width)
self.head = nn.Conv2d(width,1,1)
def forward(self,x):
a = self.enc(x)
b = self.mid(F.max_pool2d(a,2,ceil_mode=True))
b = F.interpolate(b,size=a.shape[-2:],mode='bilinear',align_corners=False)
return self.head(self.dec(torch.cat((a,b),1)))
class CandidateGate(nn.Module):
def __init__(self):
super().__init__()
self.net=nn.Sequential(nn.Linear(5,16),nn.ReLU(),nn.Linear(16,1))
def forward(self,x):
return self.net(x).squeeze(-1)
def segmentation_loss(logits, target, name='bce_dice'):
p = logits.sigmoid()
bce = F.binary_cross_entropy_with_logits(logits,target)
dims=tuple(range(1,p.ndim)); eps=1e-6
inter=(p*target).sum(dims)
if name=='bce': return bce
if name=='focal':
pt=p*target+(1-p)*(1-target)
weight=.25*target+.75*(1-target)
return (weight*(1-pt).pow(2)*F.binary_cross_entropy_with_logits(logits,target,reduction='none')).mean()
dice=(1-(2*inter+eps)/(p.sum(dims)+target.sum(dims)+eps)).mean()
if name=='dice': return dice
if name=='bce_dice': return bce+dice
if name=='iou': return (1-(inter+eps)/(p.sum(dims)+target.sum(dims)-inter+eps)).mean()
raise ValueError(name)
def gate_loss(logits, labels, areas, dual, alpha, size_weight=True, tau=1.):
import math
pos=labels>0.5; neg=~pos
weight=areas.clamp_min(1).rsqrt().clamp(.1,1) if size_weight else torch.ones_like(areas)
positive=(F.softplus(-logits[pos])*weight[pos]).sum()/max(1,int(pos.sum()))
upper=F.softplus(logits[neg]/tau).sum()/math.log(2)
return positive+dual*(upper-alpha), upper
+422
View File
@@ -0,0 +1,422 @@
# Literature and novelty verification — 2026-10-31
## Scope and evidence standard
This independent review replaces assumptions from the earlier conversation. Cutoff: October 31, 2026, UTC (the supplied environment date). It does not cover future November publications. Searches used two search engines, publisher/CVF/PMLR/NeurIPS pages, arXiv and author repositories. Searches covered graph/candidate/conflict, loss/false-alarm/Neyman–Pearson/calibration, and motion/temporal/hypergraph/track-before-detect terms, including venue-specific 2025–2026 queries. Earlier foundational papers are included where directly relevant.
**This is a verification dossier, not a completed systematic review or an experimental validation.** Bibliographic identity and reported mechanisms have stronger support than runnable code, data rights, or novelty absence. Indexed publisher excerpts are explicitly distinguished from full-text inspection. A search with no result never proves novelty. No citation counts, performance improvements, or journal quartiles are asserted. Links establish discovery/access to a page, not a successful dataset download or reproduction. Every unknown remains marked. For entries with no captured DOI/arXiv, the proceedings URL is supplied instead of inventing an identifier.
## Decision-changing findings
1. Candidate-region graph classification already suppresses false alarms (A2). EDGRU (A1) is real recent prior art, and its author repository now has a verified code listing. Generic graph use is not novel.
2. SLS, SD Loss, AC-SLSIoU, and CG-IRNet overlap the original Project B. “Size-adaptive loss plus negative weighting” is insufficient.
3. HyperTea, MIST, DeepPro, MoPKL, and classical track-before-detect substantially overlap Project C. Candidate sparsification must retain evidence that would otherwise be discarded; a graph cannot recover a target removed before graph construction.
4. NeurIPS 2025 already addresses metric inconsistency (B10). A paper merely redefining Pd/Fa would not be new.
5. LTT and CRC establish risk calibration (B13–B14). Our proposed certificate is a transparent application of known statistical tools. The potentially useful contribution is matching-aware training and a carefully validated object-level protocol, not a new general theorem.
6. Close-target unmixing (A9) makes a minimum-separation exclusion assumption especially difficult to defend.
## Evidence records
The code/data fields below state the strongest checked status; “not verified” does not mean nonexistent. Original paper-reported results are not copied into our results table. `evidence/papers.json` contains the same records in machine-readable form.
## Project A: 10 directly relevant records
### A1 — EDGRU: edge-guided dual graph reasoning U-Net with spatial graph attention for infrared small target detection
- Authors: Xinying Huang; Jianhua Song; Xinrong Fu; Yizhe Lu; Lei Yuan.
- Date/venue: 2026-10-27, Scientific Reports early article.
- Identifier: 10.1038/s41598-026-76517-6. [Primary/source link](https://www.nature.com/articles/s41598-026-76517-6).
- Already done / relevance: Edge cues and dual graph feature reasoning already address clutter. This is not evidence for physical mutual exclusion between candidates.
- Code: Author repository https://github.com/Huang-1015/EDGRU is accessible: model, train, test, data, loss and metric files listed. Commit b0159312ae8047e37c913cf2cf6116c7776eeffc, dated 2026-10-28. Execution untested; root listing contains no license file. See evidence/upstream_audit.md.
- Data: SIRST and NUDT-SIRST reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A2 — Infrared small target detection based on multi-feature fusion combined with graph representation learning
- Authors: Jiakun Deng; Yizhuo Yin; Yanbo Zhang; Chang Long; Kexuan Li; Xingye Cui; Zhenming Peng.
- Date/venue: 2026, 55(1):100–108; received 2025-03-19.
- Identifier: 10.12178/1001-0548.2025060. [Primary/source link](https://www.juestc.uestc.edu.cn/en/article/doi/10.12178/1001-0548.2025060).
- Already done / relevance: Morphological proposals, graph representations, fused handcrafted/deep features and classification already filter candidate false alarms.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Publisher page opened; abstract read.
### A3 — CS-ViG-UNet: Infrared small and dim target detection based on cycle shift vision graph convolution network
- Authors: Jian Lin; Shaoyi Li; Xi Yang; Saisai Niu; Binbin Yan; Zhongjie Meng.
- Date/venue: 2024, Expert Systems with Applications; exact online date unresolved.
- Identifier: 10.1016/j.eswa.2024.124385. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S095741742401251X).
- Already done / relevance: Patch-level sparse graph attention and U-Net integration; graph use alone is not new.
- Code: https://github.com/Linaom1214/CSViG-UNet — indexed repository with train/eval files; not executed.
- Data: SIRST Augment and IRSTD-1k links listed; bytes not acquired.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A4 — IRST-CGSeg: Infrared Small Target Detection Based on Clustering-Guided Graph Learning and Hierarchical Features
- Authors: Guimin Jia; Tao Chen; Yu Cheng; Pengyu Lu.
- Date/venue: 2025-02-21, Electronics.
- Identifier: 10.3390/electronics14050858. [Primary/source link](https://www.mdpi.com/2079-9292/14/5/858).
- Already done / relevance: Clustering initializes subgraphs and guides graph/texture feature fusion.
- Code: No public code verified.
- Data: Publisher says study data available on request.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A5 — Graph Laplacian regularization for fast infrared small target detection
- Authors: Ting Liu; Yongxian Liu; Jungang Yang; Boyang Li; Yingqian Wang; Wei An.
- Date/venue: 2025 volume 158; DOI assigned 2024; online day unresolved.
- Identifier: 10.1016/j.patcog.2024.111077. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S0031320324008288).
- Already done / relevance: Frame-node graph regularization replaces expensive low-rank estimation; MCP sparsity separates targets. Explicit optimization already exists.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A6 — Infrared small target detection based on hypergraph and asymmetric penalty function
- Authors: Yuan Luo; Xiaorun Li; Shuhan Chen.
- Date/venue: 2025, Pattern Recognition.
- Identifier: 10.1016/j.patcog.2025.111634. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S0031320325002948).
- Already done / relevance: Patch-tensor hypergraphs combine spatial and temporal weights; low-rank background and asymmetric target sparsity are jointly modeled.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A7 — Robust Infrared Small Target Detection via Jointly Sparse Constraint of l1/2-Metric and Dual-Graph Regularization
- Authors: Fei Zhou; Yiquan Wu; Yimian Dai; Kang Ni.
- Date/venue: 2020, Remote Sensing 12(12):1963.
- Identifier: 10.3390/rs12121963. [Primary/source link](https://www.mdpi.com/2072-4292/12/12/1963).
- Already done / relevance: Spatial and feature manifold regularizers plus nonconvex sparsity suppress clutter. Graph-constrained optimization is established prior art.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A8 — Directional graph-structured energy propagation for infrared small target detection
- Authors: Sen Yang; Guanxun Cui.
- Date/venue: 2026-06 volume, Infrared Physics & Technology.
- Identifier: 10.1016/j.infrared.2026.106613. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S1350449526002483).
- Already done / relevance: Gradient-directed pixel DAG energy propagation drives U-Net attention. A graph or DAG by itself is not a contribution.
- Code: Not verified; no runnable release established.
- Data: IRSTD-1k reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A9 — DISTA-Net: Dynamic Closely-Spaced Infrared Small Target Unmixing
- Authors: Shengdong Han; Shangdong Yang; Yuxuan Li; Xin Zhang; Xiang Li; Jian Yang; Ming-Ming Cheng; Yimian Dai.
- Date/venue: ICCV 2025; preprint 2025-05-25.
- Identifier: arXiv:2505.19148. [Primary/source link](https://openaccess.thecvf.com/content/ICCV2025/html/Han_DISTA-Net_Dynamic_Closely-Spaced_Infrared_Small_Target_Unmixing_ICCV_2025_paper.html).
- Already done / relevance: Dynamic sparse unmixing explicitly resolves close targets, including subpixel positions; exposes the flaw in proximity exclusion.
- Code: https://github.com/GrokCV/GrokCSO — repository indexed.
- Data: CSIST-100K and CSO-mAP released according to paper/repository; download not tested.
- Verification: CVF proceedings metadata and arXiv abstract verified; author order follows proceedings (preprint differs).
### A10 — Motion Prior Knowledge Learning with Homogeneous Language Descriptions for Moving Infrared Small Target Detection
- Authors: Shengjia Chen; Luping Ji; Weiwei Duan; Shuang Peng; Mao Ye.
- Date/venue: 2025-04-11 proceedings release, AAAI.
- Identifier: 10.1609/aaai.v39i2.32217. [Primary/source link](https://ojs.aaai.org/index.php/AAAI/article/view/32217).
- Already done / relevance: Motion representations refined by graph attention; motion-aware graph learning is already used.
- Code: Not verified; no runnable release established.
- Data: ITSDT-15K and IRDST reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
## Project B: 15 directly relevant records
This includes IRSTD-specific objectives/evaluation and directly applicable general loss/calibration foundations, explicitly labeled by dataset domain.
### B1 — Infrared Small Target Detection with Scale and Location Sensitivity
- Authors: Qiankun Liu; Rui Liu; Bolun Zheng; Hongkui Wang; Ying Fu.
- Date/venue: CVPR 2024; preprint 2024-03-28.
- Identifier: arXiv:2403.19366. [Primary/source link](https://arxiv.org/abs/2403.19366).
- Already done / relevance: SLS combines scale-weighted IoU and centroid-related localization; generic size-sensitive loss is not new.
- Code: https://github.com/ying-fu/MSHNet — opened; model/utils/main.py visible.
- Data: IRSTD-1k and NUDT-SIRST; links in repository.
- Verification: Primary metadata plus method equations read in arXiv HTML.
### B2 — Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection
- Authors: Jiangnan Yang; Shuangli Liu; Jingjun Wu; Xinyu Su; Nan Hai; Xueli Huang.
- Date/venue: AAAI 2025, proceedings release 2025-04-11; preprint 2024-12-22.
- Identifier: 10.1609/aaai.v39i9.32996; arXiv:2412.16986. [Primary/source link](https://ojs.aaai.org/index.php/AAAI/article/view/32996).
- Already done / relevance: Scale-dependent weighting of localization/scale terms already exists.
- Code: https://github.com/JN-Yang/PConv-SDloss-Data — opened; MIT repository license.
- Data: SIRST-UAVB and IRSTD-1k; release links, not downloaded.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B3 — Revisiting the Scale Loss Function and Gaussian-Shape Convolution for Infrared Small Target Detection
- Authors: Hao Li; Man Fung Zhuo.
- Date/venue: 2026-04-11 preprint; peer review not verified.
- Identifier: arXiv:2604.09991. [Primary/source link](https://arxiv.org/abs/2604.09991).
- Already done / relevance: Already critiques scale-loss monotonicity and proposes a signed-area-difference loss. Do not present that critique as new.
- Code: Abstract claims anonymous code/weights; URL/release not established.
- Data: IRSTD-1k, NUDT-SIRST, SIRST-UAVB reported.
- Verification: arXiv record opened.
### B4 — Boosting Infrared Small Target Detection via Logit-Domain Contrast and Adaptive Shape Refinement
- Authors: Handong Zeng; Zhengeng Yang; Shuai Zhang; Shikai Chen; Hongshan Yu.
- Date/venue: 2026-07-02 preprint; submitted to IEEE, acceptance not verified.
- Identifier: arXiv:2607.01555. [Primary/source link](https://arxiv.org/abs/2607.01555).
- Already done / relevance: AC-SLSIoU combines logit-margin discrimination, adaptive boundary penalties and false-alarm focal weighting. A new weighted negative-pixel term is insufficient.
- Code: Not verified; no runnable release established.
- Data: IRSTD benchmarks reported; release not established.
- Verification: arXiv record and method sections opened.
### B5 — CG-IRNet: Structure–Confidence Hybrid Learning for Low-False-Alarm Infrared Small Target Detection
- Authors: Ziwen Zhu; Mengmeng Liao.
- Date/venue: 2026-06-01, Electronics.
- Identifier: 10.3390/electronics15112405. [Primary/source link](https://www.mdpi.com/2079-9292/15/11/2405).
- Already done / relevance: Confidence-aware SLS, instance structure supervision and background suppression already target low false alarms.
- Code: Not verified; no runnable release established.
- Data: SIRST, NUDT-SIRST, IRSTD-1k reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B6 — Infrared Small Target Detection based on Adjustable Sensitivity Strategy and Multi-Scale Fusion
- Authors: Jinmiao Zhao; Zelin Shi; Chuang Yu; Yunpeng Liu.
- Date/venue: 2024-07-29 preprint.
- Identifier: arXiv:2407.20090. [Primary/source link](https://arxiv.org/abs/2407.20090).
- Already done / relevance: EEDM loss and adjustable-sensitivity postprocessing address imbalance and detection tradeoffs; threshold selection is not new.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B7 — Miss Detection vs. False Alarm: Adversarial Learning for Small Object Segmentation in Infrared Images
- Authors: Huan Wang; Luping Zhou; Lei Wang.
- Date/venue: ICCV 2019.
- Identifier: DOI not independently captured; stable CVF proceedings URL. [Primary/source link](https://openaccess.thecvf.com/content_ICCV_2019/html/Wang_Miss_Detection_vs._False_Alarm_Adversarial_Learning_for_Small_Object_ICCV_2019_paper.html).
- Already done / relevance: Separates missed detections and false alarms into adversarial learning tasks. Optimizing this tradeoff predates recent loss work.
- Code: Official lead https://github.com/wanghuanphd/MDvsFA_cGAN not opened; https://github.com/ZhexuanZhou/MDvsFA is a third-party PyTorch implementation, not treated as official.
- Data: Original data release not downloaded.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B8 — ISNet: Shape Matters for Infrared Small Target Detection
- Authors: Mingjin Zhang; Rui Zhang; Yuxiang Yang; Haichen Bai; Jing Zhang; Jie Guo.
- Date/venue: CVPR 2022.
- Identifier: 10.1109/CVPR52688.2022.00095 (secondary DOI metadata; CVF paper verified). [Primary/source link](https://openaccess.thecvf.com/content/CVPR2022/html/Zhang_ISNet_Shape_Matters_for_Infrared_Small_Target_Detection_CVPR_2022_paper.html).
- Already done / relevance: Edge supervision and Dice-based shape learning establish a localization/shape baseline.
- Code: https://github.com/RuiZhang97/ISNet — opened; code directed to master branch.
- Data: Paper says 1,000; repository says 1,001 IRSTD-1k images. Resolve by downloaded manifest..
- Verification: CVF page/PDF excerpt and author repository checked.
### B9 — A Normalized Gaussian Wasserstein Distance for Tiny Object Detection
- Authors: Jinwang Wang; Chang Xu; Wen Yang; Lei Yu.
- Date/venue: 2021-10-26 preprint.
- Identifier: arXiv:2110.13389. [Primary/source link](https://arxiv.org/abs/2110.13389).
- Already done / relevance: Gaussian box distance mitigates tiny-box overlap sensitivity; not a mask loss or false-alarm certificate.
- Code: https://github.com/jwwangchn/NWD — paper-linked, not opened.
- Data: AI-TOD; not an IRSTD dataset.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B10 — Rethinking Evaluation of Infrared Small Target Detection
- Authors: Youwei Pang; Xiaoqi Zhao; Lihe Zhang; Huchuan Lu; Georges El Fakhri; Xiaofeng Liu; Shijian Lu.
- Date/venue: NeurIPS 2025 Datasets and Benchmarks.
- Identifier: arXiv:2509.16888; 10.52202/085713-3860. [Primary/source link](https://papers.nips.cc/paper_files/paper/2025/hash/a81051ae2c8b1e46bd51480917b8ab84-Abstract-Datasets_and_Benchmarks_Track.html).
- Already done / relevance: Hybrid pixel/object metrics, error analysis and cross-dataset evaluation already challenge legacy Pd/Fa evaluation.
- Code: https://github.com/lartpang/PyIRSTDMetrics — opened; MIT; code files visible.
- Data: Toolkit available; not executed.
- Verification: Proceedings/PDF excerpt/repository read; full name follows PDF.
### B11 — Focal Loss for Dense Object Detection
- Authors: Tsung-Yi Lin; Priya Goyal; Ross Girshick; Kaiming He; Piotr Dollár.
- Date/venue: 2017-08-07 preprint; ICCV 2017.
- Identifier: arXiv:1708.02002. [Primary/source link](https://arxiv.org/abs/1708.02002).
- Already done / relevance: Hard-example reweighting handles imbalance; no budget certificate.
- Code: Code linked in arXiv; not executed.
- Data: COCO, not IRSTD.
- Verification: arXiv record opened.
### B12 — V-Net: Fully Convolutional Neural Networks for Volumetric Medical Image Segmentation
- Authors: Fausto Milletari; Nassir Navab; Seyed-Ahmad Ahmadi.
- Date/venue: 2016-06-15 preprint.
- Identifier: arXiv:1606.04797. [Primary/source link](https://arxiv.org/abs/1606.04797).
- Already done / relevance: Dice objective addresses overlap/imbalance, not object false-alarm constraints.
- Code: Not verified; no runnable release established.
- Data: Medical MRI, not IRSTD.
- Verification: arXiv record opened.
### B13 — Learn then Test: Calibrating Predictive Algorithms to Achieve Risk Control
- Authors: Anastasios N. Angelopoulos; Stephen Bates; Emmanuel J. Candès; Michael I. Jordan; Lihua Lei.
- Date/venue: 2021-10-03 preprint; Annals of Applied Statistics 2025.
- Identifier: arXiv:2110.01052. [Primary/source link](https://arxiv.org/abs/2110.01052).
- Already done / relevance: Finite-sample risk control through hypothesis testing already applies to detection/segmentation. Our certificate is an application, not a new concentration theorem.
- Code: Not verified; no runnable release established.
- Data: General calibration examples; no IRSTD dataset claimed.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B14 — Conformal Risk Control
- Authors: Anastasios N. Angelopoulos; Stephen Bates; Adam Fisch; Lihua Lei; Tal Schuster.
- Date/venue: 2022-08-04 preprint.
- Identifier: arXiv:2208.02814. [Primary/source link](https://arxiv.org/abs/2208.02814).
- Already done / relevance: Monotone bounded losses support marginal expected-risk guarantees. Distinguish these from high-probability-over-calibration guarantees.
- Code: Not verified; no runnable release established.
- Data: General prediction examples; no IRSTD dataset claimed.
- Verification: Primary indexed metadata/abstract; full text not audited.
### B15 — Diffuse to Detect: Bi-Level Sample Rebalancing with Pseudo-Label Diffusion for Point-Supervised Infrared Small-Target Detection
- Authors: Zhu Liu; Yuanhang Yao; Ping Qian; Zihang Chen; Risheng Liu.
- Date/venue: ICML 2026.
- Identifier: DOI/arXiv not captured; PMLR 306:79394–79413. [Primary/source link](https://proceedings.mlr.press/v306/liu26fj.html).
- Already done / relevance: Adaptive sample weights, label diffusion and bi-level optimization already tackle sample imbalance.
- Code: https://github.com/yuanhang-yao/diffuse-to-detect — indexed author repository.
- Data: SIRST-v1, NUDT-SIRST, IRSTD-1k, SIRST3 listed.
- Verification: PMLR proceedings verified.
## Project C: 12 directly relevant records
### A5 — Graph Laplacian regularization for fast infrared small target detection
- Authors: Ting Liu; Yongxian Liu; Jungang Yang; Boyang Li; Yingqian Wang; Wei An.
- Date/venue: 2025 volume 158; DOI assigned 2024; online day unresolved.
- Identifier: 10.1016/j.patcog.2024.111077. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S0031320324008288).
- Already done / relevance: Frame-node graph regularization replaces expensive low-rank estimation; MCP sparsity separates targets. Explicit optimization already exists.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A6 — Infrared small target detection based on hypergraph and asymmetric penalty function
- Authors: Yuan Luo; Xiaorun Li; Shuhan Chen.
- Date/venue: 2025, Pattern Recognition.
- Identifier: 10.1016/j.patcog.2025.111634. [Primary/source link](https://www.sciencedirect.com/science/article/pii/S0031320325002948).
- Already done / relevance: Patch-tensor hypergraphs combine spatial and temporal weights; low-rank background and asymmetric target sparsity are jointly modeled.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### A9 — DISTA-Net: Dynamic Closely-Spaced Infrared Small Target Unmixing
- Authors: Shengdong Han; Shangdong Yang; Yuxuan Li; Xin Zhang; Xiang Li; Jian Yang; Ming-Ming Cheng; Yimian Dai.
- Date/venue: ICCV 2025; preprint 2025-05-25.
- Identifier: arXiv:2505.19148. [Primary/source link](https://openaccess.thecvf.com/content/ICCV2025/html/Han_DISTA-Net_Dynamic_Closely-Spaced_Infrared_Small_Target_Unmixing_ICCV_2025_paper.html).
- Already done / relevance: Dynamic sparse unmixing explicitly resolves close targets, including subpixel positions; exposes the flaw in proximity exclusion.
- Code: https://github.com/GrokCV/GrokCSO — repository indexed.
- Data: CSIST-100K and CSO-mAP released according to paper/repository; download not tested.
- Verification: CVF proceedings metadata and arXiv abstract verified; author order follows proceedings (preprint differs).
### A10 — Motion Prior Knowledge Learning with Homogeneous Language Descriptions for Moving Infrared Small Target Detection
- Authors: Shengjia Chen; Luping Ji; Weiwei Duan; Shuang Peng; Mao Ye.
- Date/venue: 2025-04-11 proceedings release, AAAI.
- Identifier: 10.1609/aaai.v39i2.32217. [Primary/source link](https://ojs.aaai.org/index.php/AAAI/article/view/32217).
- Already done / relevance: Motion representations refined by graph attention; motion-aware graph learning is already used.
- Code: Not verified; no runnable release established.
- Data: ITSDT-15K and IRDST reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### C1 — MIST: A Benchmark and Baseline for Multi-Frame Infrared Small Target Detection in Complex Motion
- Authors: Rui Gao; Meihong Zhang; Gongyang Li; Guanyi Li; Kai Zhao; Xianchao Zhang; Dan Zeng.
- Date/venue: TIP 2026; author acceptance announcement 2026-04-27.
- Identifier: 10.1109/TIP.2026.3689420 (PubMed metadata). [Primary/source link](https://github.com/ShuCvlab/MIST).
- Already done / relevance: Complex-motion benchmark; shifted-neighborhood compensation and information-bottleneck decoding already address irregular weak motion.
- Code: Author repository opened; train/test/config files; dataset/weights released.
- Data: MIST 78 train / 42 test sequences; 11 hard test subset; links not downloaded.
- Verification: Author repository read; DOI secondary metadata, publisher full text not audited.
### C2 — Probing Deep into Temporal Profile Makes the Infrared Small Target Detector Much Better
- Authors: Ruojing Li; Wei An; Yingqian Wang; Xinyi Ying; Yimian Dai; Longguang Wang; Miao Li; Yulan Guo; Li Liu.
- Date/venue: Preprint 2025-06-15; TPAMI 2026 volume.
- Identifier: arXiv:2506.12766; 10.1109/TPAMI.2026.3683258. [Primary/source link](https://arxiv.org/abs/2506.12766).
- Already done / relevance: Long temporal profiles and one-dimensional anomaly modeling accumulate weak evidence without candidate graphs.
- Code: https://github.com/TinaLRJ/DeepPro — opened.
- Data: NUDT-MIRSDT, HiNo and satellite dataset links; README 120 total vs 80 train +20 test leaves 20 unexplained.
- Verification: arXiv, repository; journal DOI from PubMed, author order follows journal/repository.
### C3 — HyperTea: Hypergraph-based temporal enhancement and alignment network for moving infrared small target detection
- Authors: Zhaoyuan Qi; Weihua Gao; Wenlong Niu; Jie Tang; Yun Li; Xiaodong Peng.
- Date/venue: Preprint 2025-08-14; KBS 2026.
- Identifier: arXiv:2508.10678; 10.1016/j.knosys.2026.116099. [Primary/source link](https://arxiv.org/abs/2508.10678).
- Already done / relevance: Global/local temporal hypergraph enhancement and alignment directly overlap generic Project C.
- Code: https://github.com/Lurenjia-LRJ/HyperTea — indexed README says full code/weights still being organized; not a verified runnable release.
- Data: DAUB and IRDST links; no dataset bytes acquired.
- Verification: Primary indexed metadata/abstract; full text not audited.
### C4 — MI-DETR: A Strong Baseline for Moving Infrared Small Target Detection with Bio-Inspired Motion Integration
- Authors: Nian Liu; Jin Gao; Shubo Lin; Yutong Kou; Sikui Zhang; Fudong Ge; Zhiqiang Pu; Liang Li; Gang Wang; Yizheng Wang; Weiming Hu.
- Date/venue: 2026-03-05 preprint.
- Identifier: arXiv:2603.05071. [Primary/source link](https://arxiv.org/abs/2603.05071).
- Already done / relevance: Explicit cellular-automaton motion maps and appearance interaction; explicit motion modeling is not new.
- Code: https://github.com/nliu-25/MI-DETR — paper-linked, not executed.
- Data: IRDST-H, DAUB-R, ITSDT-15K reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### C5 — IRDINO: Adapting DINOv3 with Second-Order Motion Awareness for Moving Infrared Small Target Detection
- Authors: Qian Xu; Shuaipeng Fan; Fei Gao; Mingjin Zhang.
- Date/venue: CVPR Findings 2026, not main-track CVPR.
- Identifier: DOI/arXiv not captured; stable CVF URL. [Primary/source link](https://openaccess.thecvf.com/content/CVPR2026F/html/Xu_IRDINO_Adapting_DINOv3_with_Second-Order_Motion_Awareness_for_Moving_Infrared_CVPRF_2026_paper.html).
- Already done / relevance: Second-order motion plus pretrained features is an additional temporal baseline.
- Code: Not verified; no runnable release established.
- Data: DAUB, ITSDT-15K, IRDST reported.
- Verification: Primary indexed metadata/abstract; full text not audited.
### C6 — TLCFormer: synergizing temporal motion and local contrast for robust infrared video small object detection
- Authors: Zihan Wang; Lun Li; Fan Bai.
- Date/venue: 2026-05-20, Scientific Reports.
- Identifier: 10.1038/s41598-026-53189-w. [Primary/source link](https://doi.org/10.1038/s41598-026-53189-w).
- Already done / relevance: Temporal motion and contrast fusion already target very small weak video objects.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Primary indexed metadata/abstract; full text not audited.
### C7 — Temporal-Emerged Prompting for Segment Anything in Multiframe Infrared Small Target Detection
- Authors: Yinghui Xing; Donghao Chu; Shizhou Zhang; Di Xu.
- Date/venue: ICML 2026; preprint 2026-06-26.
- Identifier: arXiv:2606.27655. [Primary/source link](https://proceedings.mlr.press/v306/xing26b.html).
- Already done / relevance: Global/local motion discrepancy provides temporal prompts for SAM; temporal weak-evidence emergence is established.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: PMLR proceedings and arXiv metadata verified.
### C8 — DP–MHT–TBD: A Dynamic Programming and Multiple Hypothesis Testing-Based Infrared Dim Point Target Detection Algorithm
- Authors: Jinming Du; Huanzhang Lu; Luping Zhang; Moufa Hu; Yingjie Deng; Xinglin Shen; Dongyang Li; Yu Zhang.
- Date/venue: 2022-10-11, Remote Sensing.
- Identifier: 10.3390/rs14205072. [Primary/source link](https://www.mdpi.com/2072-4292/14/20/5072).
- Already done / relevance: Dynamic programming and multiple hypotheses accumulate trajectories before detection. A differentiable DP alone is incremental.
- Code: Not verified; no runnable release established.
- Data: Availability/protocol not independently established.
- Verification: Publisher indexed abstract; author list cross-check from DBLP, full text pending.
## High-priority unresolved references and coverage limitations
- X1: **Neural-Network-Based False Alarm Controllable Detector for Weak Targets via a Differentiable NP Loss**, Qu, Chen, Liu, Li, Wang; TAES 2025; [DOI lead](https://doi.org/10.1109/TAES.2025.3572501). Secondary records agree; primary access failed. Full technical comparison is mandatory before claiming novelty for Project B.
- [ECFNet author repository](https://github.com/IVPLabs/ECFNet): ECCV 2026 author claim, coarse/fine region proposals and distillation; authors Houzhang Fang, Ruixuan Huang, Qiuhuan Chen, Xiaolin Wang, Yi Chang, Luxin Yan. Proceedings DOI not independently captured. Add to candidate-stage baseline audit.
- [SPIRE author project](https://nirixiang.github.io/SPIRE-IRSTD/): ECCV 2026 claim; probabilistic point-response supervision and peak extraction. Full identifier and method comparison pending.
- [2026 graph-spectral TGRS paper](https://ieeexplore.ieee.org/abstract/document/11667104/): *Dynamic Spectral Graph Wavelet Transform and Iterative Reweighted Physical Residual Feedback for Infrared Small Target Detection*, DOI 10.1109/TGRS.2026.3727434. Publisher indexed existence verified, full author/code audit pending; not counted toward the ten A records.
- [MISA](https://ieeexplore.ieee.org/abstract/document/11646933/): DOI 10.1109/JSTARS.2026.3722252; imperfect-correspondence temporal fusion. Full author/code audit pending.
- [ReCIRC](https://arxiv.org/abs/2609.38112) and [Macro Mondrian CRC](https://arxiv.org/abs/2610.35035) are recent calibration leads. Do not claim adaptive/groupwise calibration novelty before reading them.
- A NeurIPS 2026 “under review” homepage listing is not an accepted paper. None is promoted to publication status here.
## Remaining verification gate
Obtain full texts and exact versions of A2, A1, B2, B4, B5, X1, C1 and C3; audit actual algorithms rather than abstracts. Record upstream commit SHAs and license scope for reused code. Download authorized datasets, hash split lists, inspect annotation conventions and duplicates, and compute target-size distributions. These are open tasks; the constrained prototype is useful even if subsequent review rejects its novelty.
## Follow-up source audit
The initial EDGRU retrieval failure was an access failure, not evidence of absent code. The release listing is now verified. SLS and SD loss source files were inspected; their exact blob identifiers and implementation caveats are in [upstream_audit.md](evidence/upstream_audit.md). This narrows the remaining baseline work to faithful integration and execution, not just locating code.
[Learn then Test, sections 2.2–2.3](https://arxiv.org/html/2110.01052v5) explicitly supplies bounded-risk tests and fixed-sequence threshold testing. Neither mechanism can be claimed as new here. The inspected HTML has inconsistent displayed date fields; retain the arXiv identity/version rather than using its page-render date as publication evidence. The unresolved TAES NP-loss full text remains a novelty blocker: secondary metadata alone is insufficient to exclude overlap.
The requested end-of-November 2026 coverage is future coverage relative to the supplied October 31 environment date. The date header has been corrected accordingly; this dossier does not claim a complete November search.
+16
View File
@@ -0,0 +1,16 @@
# Manuscript outline — evidence gate, not a submission-ready paper
Working title: Matching-Aware Training and Finite-Sample Object-Level False-Alarm Calibration for Infrared Small Target Detection.
1. **Introduction:** operational mismatch between pixel overlap and object alarms. State measurable question: does matching-aware gate training improve recall under the same certified expected count budget? No first-ever graph/loss/calibration claims.
2. **Related work:** SLS/SD/AC-SLSIoU/CG-IRNet; MDvsFA; graph candidate filtering; NeurIPS metric study; Neyman–Pearson learning; LTT/CRC. Explicitly distinguish segmentation, box detection and subpixel unmixing.
3. **Problem:** candidate generation, one-to-one matching, FP/image versus P(any FA), distribution and sampling assumptions, immutable calibration family.
4. **Method:** compact backbone, frozen candidate masks, canonical assignment, differentiable count upper bound, size-weighted positive loss and projected dual training. Explain why MLP is the first implementation; graph features only if ablation supports them.
5. **Analysis:** unsafe conflict-edge counterexample, pixel splitting counterexample, matching-deficiency monotonicity, surrogate bound, tail-sum certificate, sample complexity and distribution-shift limits. Credit established statistical tools.
6. **Experiments:** audited datasets and disjoint groups; all baselines get same calibration; three seeds; useful-certificate rate and recall; count budgets; real negative scenes; close pairs; cross-dataset transfer; latency/memory.
7. **Failure analysis:** missed proposals, merged targets, canonical-label conservatism, sample scarcity, empty-output certificates, correlated exposures, annotation uncertainty.
8. **Conclusion:** only claims supported by results; no assumed SOTA improvement.
Planned figures: object-versus-pixel threshold counterexample; method schematic; held-out Pd versus FP/image curves with calibrated points; sample-size/abstention curve; failure montage. Planned tables: prior-art distinctions; main comparisons at predeclared budgets; ablations; hardware costs. All result cells remain blank until actual runs.
Submission gate: full-text novelty audit, verified upstream baselines, nontrivial calibrated performance on real data, repeated tests, reproducible artifacts and an independent checking pass. The current package does not pass that gate.
+142
View File
@@ -0,0 +1,142 @@
# Mathematical analysis
Status: analytical derivations below are proved under their stated assumptions. They are not claims of new mathematics. No real-data performance claim has been verified. Numerical checks are reported separately in `results/`.
## A. What a conflict edge actually means
Let C(X) be a finite candidate set, w_i a real score, and H=(C,E) a conflict graph. Maximum-weight independent selection is
\[
\max_{z\in\{0,1\}^{|C|}}\sum_i w_i z_i,\qquad z_i+z_j\le1\quad(ij\in E).
\]
An edge is valid only if its endpoints cannot both be accepted under the task's definition of distinct true detections. Two alternative explanations of the *same* measurement can justify exclusivity when an explicit generative/association assumption establishes this. Spatial nearness, similar intensities, shared background, or a learned similarity alone cannot.
**Necessary feasibility condition.** If T contains one correct candidate for each true object, all those detections can be retained only if H[T] is edgeless. This is also sufficient for T to be feasible, but not for an optimizer to select T. Proof: a single internal edge violates an inequality; without such edges all inequalities for the indicator of T hold.
**Counterexample 1 (adjacency).** Two real targets at (10,10) and (10,12), scores 0.9 and 0.8, and a proximity-conflict radius of 3 force the output to contain at most one. Recall is at most 1/2, even with perfect candidate scores.
**Counterexample 2 (valid graph does not guarantee recall).** A true candidate of weight 1 conflicts with a spurious alternative of weight 2. Even if the conflict is valid as a one-measurement association constraint, the optimal set selects the wrong hypothesis. Constraints ensure consistency, not correctness.
A sufficient optimality condition is: T is independent, true weights are strictly positive, and all false weights strictly negative. Then T is the unique optimum. This assumption is essentially already-perfect classification and offers no realistic detection guarantee. Positive isolated false candidates are always selected; independent-set selection alone cannot reject them.
### Quadratic penalty and relaxation
Consider F(z)=Σw_i z_i−λΣ_(ij∈E)z_i z_j. For λ>max(0,max_i w_i), every binary maximizer is independent. If a selected node has a selected neighbor, deleting it changes F by −w_i+λd_selected(i)>0. Thus a violating solution cannot maximize F. On independent sets the objectives coincide.
This is an exact penalty result for binary optimization, not an efficient algorithm: general MWIS remains NP-hard. A triangle with edge constraints relaxed to z∈[0,1]^3 admits z=(1/2,1/2,1/2), objective 1.5 for unit weights, versus integral optimum 1. Clique inequalities improve this relaxation but do not generally describe the stable-set polytope. Rounding can break both feasibility and recall. Gumbel sampling, unrolled optimization, or implicit differentiation changes optimization mechanics, not the validity of edges. A straight-through gradient is biased and gives no discrete optimality guarantee.
### Defensible replacement
Use a bipartite candidate-to-object/hypothesis assignment, or multi-source reconstruction y=Σ_j a_j h(·−μ_j)+b+ε, with a_j≥0 and a point-spread-function model. Distinct nearby μ_j are allowed. For training, ground truth supplies distinct identities; at inference that privilege disappears. Restrict hard conflict edges to verified duplicate measurement hypotheses and keep uncertain edges as soft learned features. Test on close pairs at separations 0.5,1,2,3,5 pixels, multiple amplitudes and PSF widths, with source-level labels. Below resolution, identifiability requires additional assumptions; coincident equal-PSF sources cannot be uniquely separated from their summed amplitude in one image.
## B. Define risk before choosing a loss
For a prediction set S and true objects G, construct a bipartite eligibility graph using a fixed matching rule. Let ν(S,G) be maximum matching cardinality. Define
\[
TP=\nu(S,G),\quad FP=|S|-\nu(S,G),\quad FN=|G|-\nu(S,G).
\]
Primary desired risk is R_count=E[FP per image], not pixel error, precision, false discovery rate, nor probability of any false alarm. Also report R_any=P(FP≥1). With a deterministic proposal cap K, R_any≤R_count≤K R_any. These quantities must never share an unlabeled “Fa” column.
The ideal objective minimizes expected size-weighted missed objects subject to R_count≤α. This is nonconvex and nondifferentiable. Optimizing a surrogate constraint empirically does not prove the population constraint. Weighted BCE, Focal, Dice and IoU do not automatically solve the constrained problem. NWD compares Gaussian box surrogates and does not count spurious objects; changing from boxes to masks changes the task.
### Frozen object pool makes monotonicity well-defined
Freeze the proposal generator, its base segmentation threshold, cap K, masks, centroids and eligibility rule. Learn a candidate gate score s_i. At threshold t retain the entire candidate if s_i≥t; never resegment its pixels as t changes.
**Proposition B1 (matching deficiency monotonicity).** If S⊆T are subsets of the same frozen pool with unchanged eligibility, FP(S)≤FP(T). Adding one candidate increases maximum matching size by either 0 or 1, so |S|−ν changes by either 1 or 0. Induct over additions. TP also cannot decrease under addition.
**Why a pixel threshold fails this assumption.** On an all-background image, three horizontally adjacent pixels with probabilities (0.9,0.6,0.9) form one false object at threshold 0.5 and two at threshold 0.8. Raising the threshold increases object FP. Thresholding pixels does not produce nested object sets. Generic monotone CRC cannot be applied without addressing this; finite-family LTT-style testing can handle nonmonotone risks with multiplicity correction.
### Differentiable upper bound tied to matching
On each training image, choose a deterministic maximum matching in the full frozen pool. Designate the matched candidate endpoints as P, one distinct candidate per matched object, and all remaining candidates as N. Every subset of P remains injectively matchable. Consequently, for any selected S,
\[
FP(S)\le |S\cap N|.
\]
At gate logit threshold b=0 (probability 0.5), use
\[
U_\tau(s)=\sum_{i\in N}\frac{\operatorname{softplus}(s_i/\tau)}{\log 2}.
\]
Since softplus(u)≥log 2 for u≥0, 1{s_i≥0}≤softplus(s_i/τ)/log 2. Thus FP(S_0)≤U_τ pointwise. This includes duplicate detections, not just background-labeled pixels. Ordinary sigmoid soft counts are **not** upper bounds: σ(0)=1/2 while 1{0≥0}=1.
Train with L_pos=Σ_(i∈P) w_i softplus(−s_i)/max(1,|P|), w_i=clip(1/√a_i,0.1,1), where a_i is the matched ground-truth component area in native pixels, and empirical mean constraint E_train U_τ≤α_train. The Lagrangian is L_pos+λ(E_train U_τ−α_train), λ≥0. A projected dual-ascent update increases λ on constraint violations; gradient descent updates gate parameters. No global convergence claim is made for a neural gate. The prototype uses an MLP; a GNN is an ablation, not an assumption.
Limitations: canonical labels penalize alternative valid matches, possibly reducing recall. The assignment is frozen rather than differentiated. Empty or incomplete proposal pools limit attainable recall. A fully merged pair remains one candidate. Area weighting can amplify annotation noise. The pointwise bound is conservative and is only asserted at the training threshold; calibration measures actual FP at every chosen test threshold. Jointly changing the proposal backbone invalidates frozen assignments and the calibration certificate. This is a staged prototype, **not an end-to-end differentiable component extractor**.
### Finite-family calibration certificate (known statistical machinery)
Freeze all learned parameters and preprocessing using training/development data. Before looking at calibration labels, fix M finite gate thresholds. Use n independent, identically distributed calibration images from the deployment distribution. For threshold j and k=1,…,K, let Z_ijk=1{FP_ij≥k}. Its mean p_jk is a Bernoulli tail probability. Obtain a one-sided Clopper–Pearson upper bound u_jk with error probability δ/(M K). Set
\[
U_j=\sum_{k=1}^K u_{jk}.
\]
Because E FP_j=Σ_k p_jk and a union bound covers all MK pairs, with probability at least 1−δ over the calibration sample, **every** threshold j satisfies E FP_j≤U_j. Choose any j with U_j≤α, including a data-dependent utility maximizer within this certified set. This gives a PAC-style high-probability statement about population expected count; it is not a guarantee that each image has ≤α false objects. The CP formula is BetaQuantile(1−ε; r+1,n−r) for r<n, and 1 for r=n.
The explicit reject-all policy has known risk zero and is a valid fallback without a statistical estimate. Report it as certification failure for useful detection, not a successful detector. For R_any, use only k=1 and δ/M. Do not substitute that certificate for R_count. Other bounded-loss inequalities or LTT tests may improve efficiency; the theorem above is deliberately elementary and conservative.
**Sample scarcity.** With zero observed false alarms for one Bernoulli event, upper bound =1−ε^(1/n). Certifying α requires n≥ceil(log ε/log(1−α)). For M=101, δ=.05, α=.01 this requires 758 independent zero-error calibration units. With K=64 count tails, even the zero-FP case needs 75,321 units at α=.01 under this conservative certificate. Existing small benchmarks cannot substantiate arbitrary stringent distribution-free count budgets. At n=80, even zero observed errors is not enough for a 1% any-alarm certificate with that grid. Bootstrap intervals do not repair insufficient independent exposure.
Adjacent frames are not iid calibration units. For videos calibrate independent sequences using a predeclared sequence risk and cap, or state a defensible dependence model. Exchangeability alone does not justify independent-binomial CP intervals. Distribution shift, reused calibration labels for training/model selection, incomplete annotations, post-calibration resizing, or changing K breaks the stated guarantee. Calibration uncertainty and run-to-run training variation are distinct.
### Additional checks on size/location claims
The published SLS area weight uses min/max area and a variance term. With areas 1 and 1+d and population variance d²/4, w=(1+d²/4)/(1+d+d²/4). Its derivative has sign d²/4−1: it decreases then increases. This independently confirms that a global monotonic-decrease interpretation is false; B3 already investigates this issue, so the observation is not claimed as new. It does not by itself prove that the complete SLS loss is nonmonotone along every prediction path.
A polar-coordinate centroid penalty measured from the image origin is not translation invariant: positions (1,0),(2,0) give a radial ratio penalty 1/2; translating both by 100 in x gives 1/102. Use normalized relative displacement for a translation-invariant localization ablation. These facts are mathematical checks, not evidence that a replacement trains better.
## C. Temporal path formulation and failure modes
For frame candidates V_t and forward motion-gated edges, score a path π by Σ_t ℓ_t(v_t)−Σ_t c(v_(t−1),v_t). The recurrence
D_t(v)=ℓ_t(v)+max_(u→v)[D_(t−1)(u)−c(u,v)]
finds the best complete path in a DAG in O(|V|+|E|), provided state contains all information required by transition costs. Acceleration needs an augmented state (previous pair or velocity), not just current position. Replace max by τ log Σ exp(·/τ) for a differentiable path-partition recurrence; at path level max score≤τ logΣ_π exp(score(π)/τ)≤max score+τ log(number of feasible paths). This smooths inference; it neither proves correct detection nor introduces a new general DP method.
For multiple targets, flow conservation with unit node capacity can enforce candidate nonreuse; min-cost flow is a natural baseline. It does not resolve a candidate that already merges two objects. Birth/death and missing observations need explicit transitions and costs; the prototype DP test is complete-path-only, not a full tracker.
If independent frame evidence has signal mean μ and noise variance σ², summing T correctly aligned observations gives SNR √T μ/σ. With equicorrelated noise ρ, gain becomes √(T/[1+(T−1)ρ]); at ρ=1 there is no gain. Alignment bias and PSF blur reduce signal mean. A coherent moving clutter streak can have a higher path score than the target. Maximizing over many noise paths increases false alarms through a multiple-comparisons effect; a √T claim without trajectory-search correction is misleading.
Use camera-compensated displacement r=x_t−W_(t−1→t)(x_(t−1)) and Mahalanobis cost rᵀΣ⁻¹r, with positive-definite uncertainty Σ. These are modeling choices, not guarantees. Compensation can erase a stationary target or create edges from parallax; uncertain motion gates can omit the correct path. Evaluate identity compensation, known synthetic compensation, estimated compensation and deliberately wrong compensation separately. True subpixel claims require PSF-integrated synthetic source positions or real subpixel ground truth, not just tiny binary masks.
## Claim ledger
| Claim | Status |
|---|---|
| Proximity conflict edges preserve recall | False; explicit two-target counterexample |
| Binary quadratic penalty recovers independent feasible optimizers for sufficiently large λ | Proved above; computational hardness remains |
| Pixel threshold produces monotone object FP | False; splitting counterexample |
| Frozen-set matching deficiency is monotone | Proved above |
| Canonical-assignment softplus count bounds selected FP | Proved pointwise under fixed eligibility |
| Calibration tail-sum bound controls population count risk | Proved under iid units, frozen finite family and fixed cap |
| Proposed training improves recall at a certified budget | Untested hypothesis |
| Path aggregation universally provides √T improvement | False without alignment/independence and search correction |
| Any proposed combination is genuinely new | Not proved; full-text novelty gate remains |
## Audit extension: fixed-sequence calibration and sample burden
The existing tail-sum Bonferroni procedure is valid but conservative. [Learn then Test](https://arxiv.org/html/2110.01052v5), sections 2.2–2.3, already develops bounded-loss tests and fixed-sequence testing. The implementation adds this known alternative; it is not a proposed novel theorem. Its order is thresholds 1 down to 0, fixed independently of the calibration labels. Stop permanently at the first failed test.
For count risk let Z_i=FP_i/K in [0,1], a=alpha/K and zbar their mean. Use p=exp(-n kl(min(zbar,a),a)), where kl is binary relative entropy. For any-alarm risk, sum 1{FP_i>0} is binomial under iid units; use its lower-tail CDF at alpha. Test each at delta. No CP binomial test is applied directly to fractional count observations. Endpoint alpha=0 yields no empirical certificate; alpha equal to the support bound is deterministically valid.
**Verification of the guarantee.** Bounded Z satisfies E exp(-t Z) <= 1-mu+mu exp(-t), by the chord bound for a convex exponential, where mu=EZ. Independence and Markov's inequality then give P(zbar<=x) <= exp(-n kl(x,mu)) for x<mu. For the unsafe null mu>a this is at most the bound evaluated at a, yielding a valid lower-tail p-value. In the predetermined testing order, let j0 be the first unsafe threshold. Any unsafe acceptance requires accepting j0; this has probability at most delta. Dependence among threshold tests does not affect that implication. Choosing any accepted threshold is safe outside this event; if none pass, the explicit empty predictor has risk zero. This proof requires iid deployment units, a frozen pipeline and a bounded candidate count. It does not establish distribution-shift protection or a guarantee for a learned training loss.
| Zero-event calculation, alpha=.01, delta=.05, K=64, M=101 | Required independent n |
|---|---:|
| Bonferroni any-alarm CP | 758 |
| Fixed-sequence any-alarm exact test | 299 |
| Bonferroni sum of K count-tail CP bounds | 75,321 |
| Fixed-sequence normalized-count KL test | 19,172 |
Thus 758 and 75,321 are not universal sample requirements. For the fixed-sequence zero case, n=ceil(log(delta)/log(1-alpha)) for any risk, or replace alpha by alpha/K for count risk. These calculations are executed in results/math_checks.json. They describe the all-zero data case, not expected power or observed detector performance.
A remaining obstruction is rare bursts: FP=K with probability q and 0 otherwise. If q>alpha/K, mean count risk is unsafe, yet n samples are all zero with probability (1-q)^n. Any deterministic procedure that certifies this fixed detector on every all-zero observation must account for that event. This counterexample explains why the cap matters; it does not prove every adaptive procedure has the table's sample requirement. Reducing K changes the detector and may remove true targets.
Do not inspect calibration results and then choose between Bonferroni and fixed sequence at full delta each. Predeclare the choice, or divide error across procedures. Fixed sequence returns a certified budget; it does not confer simultaneous confidence coverage on unused pointwise bounds.
+38
View File
@@ -0,0 +1,38 @@
# Novelty matrix
Reference IDs resolve to `literature_review.md` and `evidence/papers.json`. “No certificate established” means none was established in this audit; it does not assert absence from an unread full text.
## Closest three per original proposal
| Project | Closest prior method | Already covered | Potential remaining contribution | Reviewer objection / required test |
|---|---|---|---|---|
| A | Candidate graph classification, Deng et al. 2026 (A2) | Propose regions, graph features, reject false candidates | Correctly justified exclusivity with measured close-pair protection | Merely graph postprocessing; compare to independent MLP gate and NMS |
| A | EDGRU (A1) | Edge-guided graph reasoning and clutter discrimination | Explicit candidate feasibility rather than feature affinity | Hard edges may delete true targets; require counterexample-driven stress tests |
| A | CS-ViG-UNet (A3) | Sparse graph features in an efficient detector | Sparse candidate selection with provable assumptions | GNN may add cost without gain; parameter-matched nongraph baseline |
| B | SD Loss (B2) | Size-dependent localization/scale loss | Count-budget-aware object selection and measured calibration utility | Another size weight is incremental; remove all size weights as an ablation |
| B | AC-SLSIoU (B4) | Hard-negative margins and false-alarm weighting | Match-defined FP bound rather than negative-pixel penalty | Why not tune the existing loss and threshold? Give all baselines identical calibration |
| B | CG-IRNet (B5) | Instance structure and confidence-based background suppression | Explicit held-out expected-count certificate with sample-size limits | Certificate might select empty output; report abstention rate and recall |
| C | HyperTea (C3) | Temporal graph/high-order enhancement plus alignment | Candidate-path decisions with explicit uncertainty and computation budget | Hypergraph→graph may be simplification only; same input window and budget |
| C | MISTNet (C1) | Irregular/fast motion, implicit compensation | Explicit sparse trajectory inference | Motion assumptions fail on MIST-Hard; oracle-edge recall and gate-miss audit |
| C | DeepPro (C2) | Long-term weak-evidence accumulation | Sparse path-conditioned evidence under camera motion | Long profiles may be cheaper and better; equal temporal context comparison |
For revised B, **LTT (B13), CRC (B14), and differentiable NP learning (X1, primary access pending)** are conceptually closer than many IRSTD architectures. They must appear prominently in a manuscript. B10 already motivates stronger IRSTD evaluation. For C, classical DP–MHT–TBD (C8) prevents a claim that trajectory optimization is new. A9 prevents a naive close-target exclusion story.
## What can and cannot be claimed now
| Proposed claim | Assessment |
|---|---|
| First graph-based IRSTD / first graph false-alarm suppression | Contradicted by verified prior art |
| First size-sensitive or false-alarm-aware IRSTD loss | Contradicted by verified prior art |
| First temporal graph detector / first weak-evidence temporal accumulation | Contradicted by verified prior art |
| First differentiable constrained detector | Not supportable; NP and risk-control prior art |
| New general statistical calibration theorem | Not claimed; CP, union bounds and LTT are established |
| Matching-consistent candidate training plus calibrated object-count selection for IRSTD | Plausible application-level research hypothesis; novelty not certified |
| Better recall at the same statistically certified count risk | Strong experimentally testable claim; currently no evidence |
| Guaranteed retention of arbitrary close targets | False absent candidate/source identifiability and safe edges |
The useful mathematical mechanism is that the frozen-pool deficiency |S|−ν(S,G) permits coherent object-level calibration and a simple differentiable upper bound. Applying known calibration alone would likely be an incremental paper. Publishability requires a nontrivial, repeatable gain from training under that mechanism, clear evidence on real clutter, and comparison with calibrated existing models.
## Audit update
EDGRU code is now accessible (see evidence/upstream_audit.md), strengthening its role as an executable comparison candidate pending license and environment checks. SLS/SD source inspection confirms that their scale/localization reductions must be reproduced exactly. Fixed-sequence risk testing is explicitly established in LTT; replacing the conservative calibration bound is a baseline improvement, not an additional novelty claim.
+10
View File
@@ -0,0 +1,10 @@
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
[project]
name = "irstd-risk-prototype"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = ["numpy==2.3.5", "scipy==1.17.0", "Pillow==12.3.0"]
[tool.setuptools.packages.find]
include = ["irstd*"]
+3
View File
@@ -0,0 +1,3 @@
numpy==2.3.5
scipy==1.17.0
Pillow==12.3.0
+2
View File
@@ -0,0 +1,2 @@
-r requirements-core.txt
torch==2.5.1
+43
View File
@@ -0,0 +1,43 @@
# Research decision — provisional, 2026-10-31
Select **revised Project B for the first falsification experiments**, followed by C, then original A. This is an engineering/research allocation decision, not a finding of novelty or publishability. Full-text/code/license/data verification is incomplete; no SCI submission is ready.
Working title: **Matching-Aware Training and Finite-Sample Object-Level False-Alarm Calibration for Infrared Small Target Detection**.
The original title overemphasized size adaptation, which B1–B5 already cover. Keep size weights as an ablation. Use a compact frozen detector and object gate first; avoid a new backbone until the mechanism survives matched-budget comparisons.
## Evidence-based ranking
Scores are qualitative expert judgments on a 1–5 scale, not measurements. Higher novelty/depth/feasibility/potential is better; higher difficulty/negative-result risk is worse. All novelty ratings are provisional.
| Rank | Project | Novelty | Mathematical depth | Experimental difficulty | Publication potential | Negative/inconclusive risk | Single-3090 feasibility | 8–12-week feasibility |
|---|---|---:|---:|---:|---:|---:|---:|---:|
| 1 | Revised B | 3 | 4 | 3 | 3 | 4 | 5 | 4 |
| 2 | Revised C | 2–3 | 4 | 5 | 3 | 4 | 3 | 2–3 |
| 3 | Original A | 1–2 | 3 | 3 | 2 | 5 | 4 | 3 |
B is cheap to falsify on cached candidate maps and fits the researcher's combinatorial optimization expertise through one-to-one matching. C has substantial overlap and sequence/compensation complexity. Original A rests on an invalid recall-preservation premise and cannot suppress isolated false candidates with positive weights. A could reappear as an ablation inside B only after edge validity is established.
## Main risk: useful certificates may be impossible on small benchmarks
Hundreds of iid calibration images cannot generally certify extremely low object-count rates with a conservative finite-family bound. This is a central feasibility problem, not a detail to hide. Use both expected FP/image and any-alarm risk, but never replace the requested count budget by a more favorable metric without declaring it. Retain the original test sets and obtain an independent background exposure set with verified annotations and rights if strong low-risk claims are necessary. Do not pretend correlated video frames are independent samples.
## Go / no-go criteria
1. Week 1: read full texts of B2/B4/B5/X1 and relevant calibration work. If an existing paper implements the same matching-aware loss and object-count certificate, stop the novelty claim and compare or redesign.
2. Week 2: audit authorized data and independent scene groups; measure calibration sample adequacy analytically. If only reject-all is certifiable at the operational budget, report this and revise the data plan before training larger models.
3. Weeks 3–4: compare frozen-score calibration, BCE gate, constrained gate, with/without size weights. Use three seeds, shared candidate pools and equal calibration access. Continue only if the gate yields a reproducible recall improvement at the same budget without a material close-pair deficit.
4. Weeks 5–8: add verified SLS/SD and AC-SLSIoU comparators, two backbones, cross-dataset transfer and difficult real negatives. Improvement must exceed seed/scene uncertainty; select a practical improvement threshold on development data before opening test results.
5. Weeks 9–12: independent evaluation audit, failure analysis and writing. If the training gain vanishes after fair threshold calibration, do not package the calibration wrapper as a novel detector; publishable alternatives require a substantial evaluation finding or new method.
Potential journal positioning is conditional: an IRSTD method with robust empirical evidence could fit the scope of TGRS/TIP/Pattern Recognition, whose relevant papers are in the review. No current quartile/indexing or acceptance probability is asserted. Choose a journal only after the result quality is known; do not promise a top-tier outcome from a prototype.
## Work completed vs outstanding
- Completed: independent literature discovery and annotated evidence records; explicit counterexamples; proof of conditional prototype guarantees; initial experiment design; local mathematical/evaluation implementation and tests (see actual results log).
- Prepared but not executed: PyTorch detector/gate training scripts and ablation commands.
- Outstanding: full-text audit of several closest methods; exact upstream commit pinning; dataset download/license-scope confirmation and annotation audit; GPU profiling; all real benchmark experiments.
## Follow-up decision check
Ranking remains B > C > A. The fixed-sequence baseline reduces the originally reported calibration sample burden, but 1% expected FP/image with a 64-candidate bound still needs substantial independent exposure for a nontrivial distribution-free certificate. Calibration alone is an application of existing work. The decisive experiment is constrained versus BCE gate versus score-only selection under the same predeclared calibration procedure. Upstream SLS and SD source inspection is now complete at the loss-file level; numerical parity, training and remaining closest-paper full-text audits are pending. EDGRU release availability is now verified, but execution and license scope remain unresolved.
+25
View File
@@ -0,0 +1,25 @@
# Research log
## 2026-10-31 — independent verification and first prototype
**Literature milestone.** Searched current publisher, proceedings, preprint and author-repository sources independently of previous discussion. Recorded 34 unique bibliography entries (including one pending primary-access NP reference), with overlapping project placements. Main corrections: EDGRU has a 2026-10-27 early-article record; HyperTea has a 2025 preprint and 2026 journal record; MIST is a 2026 TIP project, not merely an unspecified dataset; SD Loss is AAAI 2025 though its preprint is December 2024. DeepPro preprint and journal author order/status differ. Some publisher pages were blocked, so primary indexed excerpts or explicitly marked secondary metadata were retained. No citation counts were inferred.
**Failed hypotheses.** Proximity-conflict constraints can force deletion of true adjacent targets. Independent-set optimization cannot reject isolated positive-score clutter by itself. Pixel thresholds need not make object FP monotone. Generic size-sensitive loss and temporal graph fusion have substantial prior art. A training constraint is not a test-time guarantee.
**Decision.** Revised B is the first falsification target; C second; original A third. No novel theorem or publication-ready performance claim. Full-text novelty gates remain open.
**Analytical milestone.** Derived matching-deficiency monotonicity for frozen candidates; canonical assignment gives a conservative smooth FP upper bound; iid finite-grid tail-sum CP intervals give a population expected-count certificate. Derived explicit sample-size limitations. All use known combinatorial/statistical tools. Proved assumptions and counterexamples are in `mathematical_analysis.md`.
**Implementation milestone.** Created original compact U-Net/loss/gate training code, fixed-pool metrics/calibration, data audit, scripts and ablation matrix. Pure CPU mathematical and integration checks pass. 24 tests discovered: 22 pass; 2 PyTorch gradient tests skipped. Syntax compilation passes. No dataset/GPU experiment ran; PyTorch and an exposed NVIDIA device are unavailable. The fixture pipeline exercises reject-all handling and certificate invalidation, not real IRSTD accuracy.
**Actual numeric checks.** With M=101, δ=.05 and α=.01, zero observed events require n=758 for the any-alarm CP bound. Under K=64 tail-sum count calibration the conservative zero-event requirement is n=75,321. At n=80 the any-alarm upper bound is about .09075, despite zero observed events. These are analytical/sample-size checks, not detector results.
**Unresolved.** Some DOI/author/code fields and dataset license scopes remain unverified. No archives were downloaded; actual size distributions, duplicate audit and annotation quality remain unknown. MIST GPU adaptation is untested. Gate-training gradient/runtime checks await PyTorch. Obtain full texts of the closest loss/NP methods before treating revised B as novel; obtain adequate independent exposure before claiming stringent false-alarm guarantees.
**Next concrete milestone.** Complete full-text/code audit and data rights/manifest checks, then measure whether any useful certificate is feasible before spending substantial GPU time. The prepared scripts do not imply a continuing background job.
## Follow-up audit and calibration refinement
Corrected the cutoff to the supplied environment date, October 31 UTC; future November coverage remains impossible. Verified EDGRU code listing and commit, inspected SLS/SD loss source, and recorded implementation caveats without copying upstream code. Read LTT's bounded-test and fixed-sequence sections; added the known fixed-sequence baseline and its proof assumptions.
Executed 28 tests: 26 passed, 2 PyTorch tests skipped. An initial rerun failed two subprocess imports because PYTHONPATH was omitted; rerunning with the documented PYTHONPATH=. command passed. This was a test invocation issue, not a detector experiment. Four new tests check exact zero-event sample boundaries, stopping without restart, count calibration and support endpoints. Fixed-sequence zero-event counts are 299 (any risk) and 19,172 (count risk, K=64). No real dataset, training or GPU profiling ran.
+7
View File
@@ -0,0 +1,7 @@
# Actual results only
- `unit_tests.txt`: executed CPU tests and explicitly skipped PyTorch tests.
- `math_checks.json`: analytic calibration sample-size calculations.
- `environment.json`: observed runtime availability.
No trained detector scores, dataset performance, latency or VRAM numbers exist. Tests use synthetic fixtures. No table cell marked pending should be interpreted as zero performance.
+10
View File
@@ -0,0 +1,10 @@
{
"python": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]",
"platform": "Linux-6.18.57-x86_64-with-glibc2.39",
"numpy": "2.3.5",
"scipy": "1.17.0",
"Pillow": "12.3.0",
"torch_available": false,
"nvidia_smi": null,
"real_data_acquired": false
}
+14
View File
@@ -0,0 +1,14 @@
{
"experiment_type": "analytic_sample_size_and_synthetic_sanity_only",
"python": "3.12.14",
"numpy": "2.3.5",
"scipy": "1.17.0",
"n_zero_error_any": 758,
"n_zero_error_count_tail_sum": 75321,
"n_zero_error_any_fixed_sequence": 299,
"n_zero_error_count_fixed_sequence": 19172,
"any_upper_n80": 0.09075042258738893,
"any_upper_n1000": 0.007581963587247506,
"detector_training": "not run",
"real_dataset_metrics": "not measured"
}
+33
View File
@@ -0,0 +1,33 @@
test_adjacent_targets_conflict (test_core.CoreTests.test_adjacent_targets_conflict) ... ok
test_binary_penalty_exactness (test_core.CoreTests.test_binary_penalty_exactness) ... ok
test_canonical_bound_exhaustive (test_core.CoreTests.test_canonical_bound_exhaustive) ... ok
test_count_and_any_distinct (test_core.CoreTests.test_count_and_any_distinct) ... ok
test_cp_zero_and_all (test_core.CoreTests.test_cp_zero_and_all) ... ok
test_disconnected_path (test_core.CoreTests.test_disconnected_path) ... ok
test_empty_image_conventions (test_core.CoreTests.test_empty_image_conventions) ... ok
test_empty_matching (test_core.CoreTests.test_empty_matching) ... ok
test_fixed_sequence_count_zero_boundary (test_core.CoreTests.test_fixed_sequence_count_zero_boundary) ... ok
test_fixed_sequence_stops_without_restart (test_core.CoreTests.test_fixed_sequence_stops_without_restart) ... ok
test_fixed_sequence_support_endpoints (test_core.CoreTests.test_fixed_sequence_support_endpoints) ... ok
test_fixed_sequence_zero_boundary (test_core.CoreTests.test_fixed_sequence_zero_boundary) ... ok
test_invalid_calibration (test_core.CoreTests.test_invalid_calibration) ... ok
test_invalid_recall_even_with_feasible_target (test_core.CoreTests.test_invalid_recall_even_with_feasible_target) ... ok
test_large_zero_calibration_certifies_any (test_core.CoreTests.test_large_zero_calibration_certifies_any) ... ok
test_matching_deficiency_exhaustive (test_core.CoreTests.test_matching_deficiency_exhaustive) ... ok
test_matching_not_greedy (test_core.CoreTests.test_matching_not_greedy) ... ok
test_metrics_one_to_one (test_core.CoreTests.test_metrics_one_to_one) ... ok
test_path_matches_enumeration (test_core.CoreTests.test_path_matches_enumeration) ... ok
test_pixel_threshold_splits_false_object (test_core.CoreTests.test_pixel_threshold_splits_false_object) ... ok
test_pool_cap_and_stability (test_core.CoreTests.test_pool_cap_and_stability) ... ok
test_small_calibration_abstains (test_core.CoreTests.test_small_calibration_abstains) ... ok
test_surrogate_upper_bound (test_core.CoreTests.test_surrogate_upper_bound) ... ok
test_cpu_calibration_evaluation_and_tamper_guard (test_pipeline.PipelineTests.test_cpu_calibration_evaluation_and_tamper_guard) ... ok
test_data_audit_cli (test_pipeline.PipelineTests.test_data_audit_cli) ... ok
test_group_leakage_rejected (test_pipeline.PipelineTests.test_group_leakage_rejected) ... ok
test_gate_gradients (test_torch.TorchTests.test_gate_gradients) ... skipped 'PyTorch is unavailable; gradient/training tests NOT executed'
test_shapes_and_gradient (test_torch.TorchTests.test_shapes_and_gradient) ... skipped 'PyTorch is unavailable; gradient/training tests NOT executed'
----------------------------------------------------------------------
Ran 28 tests in 3.447s
OK (skipped=2)
+24
View File
@@ -0,0 +1,24 @@
import argparse,json
from collections import Counter
from pathlib import Path
import numpy as np
from irstd.data import read_manifest,read_pair,sha
from irstd.core import components,centers
def main():
p=argparse.ArgumentParser();p.add_argument('--manifest',required=True);p.add_argument('--out',required=True);a=p.parse_args()
rows=read_manifest(a.manifest);areas=[];dist=[];sizes=Counter();counts=[];empty=0
for r in rows:
x,y=read_pair(r);ms=components(y);areas.extend(int(m.sum()) for m in ms);counts.append(len(ms));empty+=not len(ms)
sizes[str(x.shape)]+=1;c=centers(ms)
if len(c)>1:
d=np.linalg.norm(c[:,None]-c[None,:],axis=-1);np.fill_diagonal(d,np.inf);dist.extend(d.min(1).tolist())
def quant(v):return dict(zip(['min','q25','median','q75','max'],map(float,np.quantile(v,[0,.25,.5,.75,1])))) if v else None
result=dict(manifest_sha256=sha(a.manifest),splits=dict(Counter(r['split'] for r in rows)),
groups=len(set(r['group'] for r in rows)),resolutions=dict(sizes),empty_images=empty,
target_area_pixels=quant(areas),targets_per_image=quant(counts),nearest_target_distance=quant(dist),
area_bins={'1-4':sum(1<=v<=4 for v in areas),'5-9':sum(5<=v<=9 for v in areas),'10-25':sum(10<=v<=25 for v in areas),'26+':sum(v>=26 for v in areas)},
image_hashes={r['id']:sha(r['image']) for r in rows},mask_hashes={r['id']:sha(r['mask']) for r in rows},
limitations='Does not verify licensing, missing annotations, visual near-duplicates, source identities, or independence.')
Path(a.out).write_text(json.dumps(result,indent=2))
if __name__=='__main__':main()
+37
View File
@@ -0,0 +1,37 @@
"""Hardware measurement only; random input is NOT accuracy evaluation."""
import argparse,json,time,statistics
from pathlib import Path
import torch
from irstd.models import TinyUNet
from irstd.core import candidate_pool
def main():
p=argparse.ArgumentParser();p.add_argument('--out',required=True);p.add_argument('--size',type=int,default=256)
p.add_argument('--device',default='cuda');p.add_argument('--iterations',type=int,default=100);a=p.parse_args()
if a.iterations<1 or a.size<2:p.error('Invalid benchmark dimensions')
model=TinyUNet().to(a.device).eval();x=torch.randn(1,1,a.size,a.size,device=a.device)
cuda=str(a.device).startswith('cuda')
def sync():
if cuda:torch.cuda.synchronize()
if cuda:torch.cuda.reset_peak_memory_stats()
times=[];full=[]
with torch.no_grad():
for i in range(20+a.iterations):
sync();start=time.perf_counter();y=model(x).sigmoid();sync();middle=time.perf_counter()
candidate_pool(y[0,0].cpu().numpy());end=time.perf_counter()
if i>=20:times.append((middle-start)*1000);full.append((end-start)*1000)
# Exact conv MAC estimate via hooks, measured for declared resolution.
macs=[0]
def hook(m,inp,out):
macs[0]+=out.numel()*(m.in_channels//m.groups)*m.kernel_size[0]*m.kernel_size[1]
handles=[m.register_forward_hook(hook) for m in model.modules() if isinstance(m,torch.nn.Conv2d)]
with torch.no_grad():model(x)
for h in handles:h.remove()
Path(a.out).write_text(json.dumps(dict(device=a.device,gpu=torch.cuda.get_device_name() if cuda else None,
input=[1,1,a.size,a.size],dtype='float32',warmup=20,iterations=a.iterations,
parameters=sum(p.numel() for p in model.parameters()),conv_MACs=macs[0],conv_FLOPs_2_per_MAC=2*macs[0],
model_latency_median_ms=statistics.median(times),end_to_end_median_ms=statistics.median(full),
peak_allocated_bytes=torch.cuda.max_memory_allocated() if cuda else None,
excludes='Disk IO, candidate MLP, graph solver; FLOPs exclude interpolation/activations/pooling',
accuracy='not measured; random input'),indent=2))
if __name__=='__main__':main()
+16
View File
@@ -0,0 +1,16 @@
import json,math,platform
from pathlib import Path
import numpy as np
import scipy
from irstd.core import cp_upper,calibrate
m=101;delta=.05;alpha=.01;k=64
n_any=math.ceil(math.log(delta/m)/math.log1p(-alpha))
n_count=math.ceil(math.log(delta/(m*k))/math.log1p(-alpha/k))
report=dict(experiment_type='analytic_sample_size_and_synthetic_sanity_only',python=platform.python_version(),numpy=np.__version__,scipy=scipy.__version__,
n_zero_error_any=n_any,n_zero_error_count_tail_sum=n_count,
n_zero_error_any_fixed_sequence=math.ceil(math.log(delta)/math.log1p(-alpha)),
n_zero_error_count_fixed_sequence=math.ceil(math.log(delta)/math.log1p(-alpha/k)),
any_upper_n80=cp_upper(0,80,delta/m),
any_upper_n1000=cp_upper(0,1000,delta/m),
detector_training='not run',real_dataset_metrics='not measured')
Path('results/math_checks.json').write_text(json.dumps(report,indent=2));print(json.dumps(report,indent=2))
+78
View File
@@ -0,0 +1,78 @@
"""Calibrate/evaluate frozen candidates. No training or test threshold selection."""
import argparse,json,hashlib
from pathlib import Path
import numpy as np
from irstd.core import candidate_pool,image_stats,aggregate,calibrate,components
from irstd.data import read_manifest,read_pair,sha
def main():
p=argparse.ArgumentParser();p.add_argument('--manifest',required=True);p.add_argument('--predictions',required=True)
p.add_argument('--out',required=True);p.add_argument('--gate');p.add_argument('--split',choices=['dev','cal','test'],default='test')
p.add_argument('--calibrate',action='store_true');p.add_argument('--certificate');p.add_argument('--threshold',type=float,default=.5)
p.add_argument('--base-threshold',type=float,default=.1);p.add_argument('--cap',type=int,default=64);p.add_argument('--radius',type=float,default=3.)
p.add_argument('--alpha',type=float,default=.1);p.add_argument('--delta',type=float,default=.05)
p.add_argument('--risk',choices=['count','any'],default='count');p.add_argument('--pixel-baseline',action='store_true')
p.add_argument('--calibration-method',choices=['bonferroni','fixed_sequence'],default='bonferroni')
a=p.parse_args()
if a.calibrate and (a.split!='cal' or a.pixel_baseline or a.certificate):p.error('Calibration requires cal split, fixed candidates and no certificate input')
if a.pixel_baseline and (a.gate or a.certificate):p.error('Pixel baseline cannot use gate/candidate certificate')
if not 0<=a.threshold<=1:p.error('threshold outside [0,1]')
rows=read_manifest(a.manifest);root=Path(a.predictions)
provenance_path=root/'provenance.json'
if not provenance_path.exists():raise ValueError('Missing prediction provenance.json')
provenance=json.loads(provenance_path.read_text())
if provenance.get('manifest_sha256')!=sha(a.manifest):raise ValueError('Prediction manifest differs')
pipeline=dict(manifest_sha256=sha(a.manifest),provenance=provenance,
base_threshold=a.base_threshold,cap=a.cap,radius=a.radius,
gate_sha256=sha(a.gate) if a.gate else None,
prediction_hashes={r['id']:sha(root/(r['id']+'.npy')) for r in rows},
input_hashes={r['id']:dict(image=sha(r['image']),mask=sha(r['mask'])) for r in rows},
source_hashes={name:sha(Path(__file__).resolve().parents[1]/name) for name in ['irstd/core.py','irstd/models.py','scripts/evaluate.py']},
evaluation_version=1)
fingerprint=hashlib.sha256(json.dumps(pipeline,sort_keys=True).encode()).hexdigest()
gate=None
if a.gate:
import torch
from irstd.models import CandidateGate
ck=torch.load(a.gate,map_location='cpu',weights_only=True);cfg=ck['config']
for k in ('cap','base_threshold','radius'):
if cfg[k]!=getattr(a,k):raise ValueError('Gate pipeline differs: '+k)
if cfg['manifest_sha256']!=sha(a.manifest):raise ValueError('Gate manifest differs')
gate=CandidateGate();gate.load_state_dict(ck['state_dict']);gate.eval()
thresholds=np.linspace(0,1,101).tolist() if a.calibrate else [a.threshold]
reject_all=False
if a.certificate:
cert=json.loads(Path(a.certificate).read_text())
if cert['pipeline_fingerprint']!=fingerprint:raise ValueError('Certificate invalidated by changed pipeline/data')
reject_all=cert['reject_all'];thresholds=[cert['threshold'] if not reject_all else 1.]
selected=[r for r in rows if r['split']==a.split]
if not selected:raise ValueError('Empty split')
fp=[];stats=[];per_image=[]
for r in selected:
prob=np.load(root/(r['id']+'.npy'),allow_pickle=False);_,gt=read_pair(r)
if prob.shape!=gt.shape:raise ValueError('Prediction shape mismatch')
masks,features=candidate_pool(prob,a.base_threshold,a.cap)
scores=features[:,0]
if gate is not None and len(features):
with torch.no_grad():scores=gate(torch.from_numpy(features)).sigmoid().numpy()
row_stats=[]
for t in thresholds:
keep=[] if reject_all else [m for m,s in zip(masks,scores) if s>=t]
if a.pixel_baseline:keep=components(prob>=t)
row_stats.append(image_stats(keep,gt,a.radius))
fp.append([s['fp'] for s in row_stats]);stats.append(row_stats[0])
per_image.append(dict(id=r['id'],group=r['group'],**row_stats[0]))
if a.calibrate:
result=calibrate(fp,thresholds,a.cap,a.alpha,a.delta,a.risk,a.calibration_method)
result.update(pipeline_fingerprint=fingerprint,pipeline=pipeline,
calibration_ids=[r['id'] for r in selected],
calibration_groups=len(set(r['group'] for r in selected)),
assumption_notice='Conditional on iid images; group labels alone do not verify independence. Do not pool adjacent video frames.')
else:
result=dict(metrics=aggregate(stats),per_image=per_image,pipeline_fingerprint=fingerprint,
split=a.split,threshold=None if reject_all else thresholds[0],reject_all=reject_all,
certificate_used=a.certificate,mode='pixel' if a.pixel_baseline else 'fixed_candidate')
dest=Path(a.out);dest.parent.mkdir(parents=True,exist_ok=True)
if dest.exists():raise FileExistsError(dest)
dest.write_text(json.dumps(result,indent=2,allow_nan=False));print(dest)
if __name__=='__main__':main()
+20
View File
@@ -0,0 +1,20 @@
import argparse,json
from pathlib import Path
import numpy as np
import torch
from irstd.models import TinyUNet
from irstd.data import read_manifest,read_pair,sha
def main():
p=argparse.ArgumentParser();p.add_argument('--manifest',required=True);p.add_argument('--checkpoint',required=True)
p.add_argument('--out',required=True);p.add_argument('--device',default='cuda');a=p.parse_args()
ck=torch.load(a.checkpoint,map_location='cpu',weights_only=True)
model=TinyUNet().to(a.device);model.load_state_dict(ck['state_dict']);model.eval()
out=Path(a.out);out.mkdir(parents=True,exist_ok=False)
with torch.no_grad():
for r in read_manifest(a.manifest):
x,_=read_pair(r)
prob=model(torch.from_numpy(x)[None,None].to(a.device)).sigmoid()[0,0].cpu().numpy()
np.save(out/(r['id']+'.npy'),prob)
(out/'provenance.json').write_text(json.dumps(dict(checkpoint_sha256=sha(a.checkpoint),manifest_sha256=sha(a.manifest)),indent=2))
if __name__=='__main__':main()
+40
View File
@@ -0,0 +1,40 @@
"""Single-device, batch-one reference training; no dataset auto-download."""
import argparse,json,random,os
from pathlib import Path
os.environ.setdefault('CUBLAS_WORKSPACE_CONFIG', ':4096:8')
import numpy as np
import torch
from irstd.models import TinyUNet,segmentation_loss
from irstd.data import read_manifest,read_pair,sha
def main():
p=argparse.ArgumentParser(); p.add_argument('--manifest',required=True);p.add_argument('--out',required=True)
p.add_argument('--epochs',type=int,default=100);p.add_argument('--seed',type=int,default=0)
p.add_argument('--loss',choices=['bce','dice','bce_dice','focal','iou'],default='bce_dice')
p.add_argument('--device',default='cuda'); a=p.parse_args()
if a.epochs<1: p.error('epochs must be positive')
random.seed(a.seed);np.random.seed(a.seed);torch.manual_seed(a.seed)
torch.use_deterministic_algorithms(True);torch.backends.cudnn.benchmark=False
rows=read_manifest(a.manifest);tr=[r for r in rows if r['split']=='train'];dv=[r for r in rows if r['split']=='dev']
if not tr or not dv: raise ValueError('Train and development splits required')
out=Path(a.out);out.mkdir(parents=True,exist_ok=False)
model=TinyUNet().to(a.device);opt=torch.optim.AdamW(model.parameters(),lr=1e-3,weight_decay=1e-4)
config=vars(a)|dict(manifest_sha256=sha(a.manifest),torch=str(torch.__version__),numpy=np.__version__,cuda=torch.version.cuda)
(out/'config.json').write_text(json.dumps(config,indent=2));best=float('inf')
def batch(r):
x,y=read_pair(r)
return torch.from_numpy(x)[None,None].to(a.device),torch.from_numpy(y.astype(np.float32))[None,None].to(a.device)
with (out/'train.jsonl').open('w') as f:
for epoch in range(a.epochs):
model.train();random.shuffle(tr);total=0.
for r in tr:
x,y=batch(r);opt.zero_grad();loss=segmentation_loss(model(x),y,a.loss)
loss.backward();opt.step();total+=loss.item()
model.eval();dev=0.
with torch.no_grad():
for r in dv:
x,y=batch(r);dev+=segmentation_loss(model(x),y,a.loss).item()
dev/=len(dv);f.write(json.dumps(dict(epoch=epoch,train_loss=total/len(tr),dev_loss=dev))+'\n');f.flush()
if dev<best:
best=dev;torch.save(dict(state_dict=model.state_dict(),config=config,epoch=epoch),out/'best.pt')
if __name__=='__main__':main()
+48
View File
@@ -0,0 +1,48 @@
import argparse,json,random,os
from pathlib import Path
os.environ.setdefault('CUBLAS_WORKSPACE_CONFIG', ':4096:8')
import numpy as np
import torch
from torch.nn import functional as F
from irstd.models import CandidateGate,gate_loss
from irstd.core import candidate_pool,canonical_labels
from irstd.data import read_manifest,read_pair,sha
def main():
p=argparse.ArgumentParser();p.add_argument('--manifest',required=True);p.add_argument('--predictions',required=True);p.add_argument('--out',required=True)
p.add_argument('--epochs',type=int,default=100);p.add_argument('--seed',type=int,default=0)
p.add_argument('--mode',choices=['bce','constrained'],default='constrained');p.add_argument('--no-size',action='store_true')
p.add_argument('--alpha-train',type=float,default=.1);p.add_argument('--cap',type=int,default=64);p.add_argument('--base-threshold',type=float,default=.1)
p.add_argument('--radius',type=float,default=3.);a=p.parse_args()
if a.epochs<1 or a.alpha_train<0: p.error('Invalid epochs/budget')
random.seed(a.seed);np.random.seed(a.seed);torch.manual_seed(a.seed);torch.use_deterministic_algorithms(True)
rows=read_manifest(a.manifest);cached=[];files={}
for r in rows:
if r['split']!='train':continue
path=Path(a.predictions)/(r['id']+'.npy');prob=np.load(path,allow_pickle=False)
_,gt=read_pair(r)
if prob.shape!=gt.shape:raise ValueError('Prediction shape mismatch')
masks,features=candidate_pool(prob,a.base_threshold,a.cap);labels,areas=canonical_labels(masks,gt,a.radius)
cached.append(tuple(torch.from_numpy(v) for v in (features,labels,areas)));files[r['id']]=sha(path)
if not cached:raise ValueError('No train images')
gate=CandidateGate();opt=torch.optim.Adam(gate.parameters(),lr=1e-3);dual=0.
out=Path(a.out);out.mkdir(parents=True,exist_ok=False)
config=vars(a)|dict(manifest_sha256=sha(a.manifest),training_prediction_hashes=files)
# Fixed epochs: tune this on dev in separate runs, never on calibration/test labels.
with (out/'gate.jsonl').open('w') as f:
for epoch in range(a.epochs):
random.shuffle(cached);upper_total=0.;loss_total=0.
for x,y,area in cached:
if not len(x):continue # zero surrogate contribution; retain image in denominator
opt.zero_grad();s=gate(x)
if a.mode=='constrained':
loss,upper=gate_loss(s,y,area,dual,a.alpha_train,not a.no_size)
else:
loss=F.binary_cross_entropy_with_logits(s,y);_,upper=gate_loss(s,y,area,0.,a.alpha_train)
loss.backward();opt.step();upper_total+=float(upper.detach());loss_total+=float(loss.detach())
mean_upper=upper_total/len(cached)
if a.mode=='constrained':dual=max(0.,dual+.01*(mean_upper-a.alpha_train))
f.write(json.dumps(dict(epoch=epoch,loss=loss_total/len(cached),surrogate=mean_upper,dual=dual))+'\n');f.flush()
torch.save(dict(state_dict=gate.state_dict(),config=config),out/'gate.pt')
(out/'config.json').write_text(json.dumps(config,indent=2))
if __name__=='__main__':main()
+94
View File
@@ -0,0 +1,94 @@
import itertools,unittest,math
import numpy as np
from irstd.core import *
class CoreTests(unittest.TestCase):
def test_matching_not_greedy(self):
self.assertEqual(len(matching([[1,1],[1,0]])),2)
def test_empty_matching(self):
self.assertEqual(matching(np.zeros((0,2),bool)),[])
self.assertEqual(matching(np.zeros((2,0),bool)),[])
def test_adjacent_targets_conflict(self):
_,selected=exact_mwis([.9,.8],[(0,1)])
self.assertEqual(len(selected),1)
self.assertEqual(len(exact_mwis([.9,.8],[])[1]),2)
def test_invalid_recall_even_with_feasible_target(self):
self.assertEqual(exact_mwis([1.,2.],[(0,1)])[1],[1])
def test_pixel_threshold_splits_false_object(self):
p=np.array([[.9,.6,.9]])
self.assertEqual(len(components(p>=.5)),1)
self.assertEqual(len(components(p>=.8)),2)
def test_matching_deficiency_exhaustive(self):
# Exhaust all 3x2 eligibility graphs and all subsets.
for flat in itertools.product([0,1],repeat=6):
e=np.array(flat).reshape(3,2)
for bits in itertools.product([0,1],repeat=3):
s=np.flatnonzero(bits);fp=len(s)-len(matching(e[s]))
for j in set(range(3))-set(s):
t=np.append(s,j);self.assertLessEqual(fp,len(t)-len(matching(e[t])))
def test_canonical_bound_exhaustive(self):
for flat in itertools.product([0,1],repeat=6):
e=np.array(flat).reshape(3,2);pos={i for i,_ in matching(e)}
for bits in itertools.product([0,1],repeat=3):
s=np.flatnonzero(bits)
self.assertLessEqual(len(s)-len(matching(e[s])),len(set(s)-pos))
def test_surrogate_upper_bound(self):
s=np.array([-100,-1,0,1,100.])
self.assertGreaterEqual(softplus_bound(s,np.ones(5,bool)),(s>=0).sum())
def test_cp_zero_and_all(self):
self.assertAlmostEqual(cp_upper(0,100,.05),1-.05**.01)
self.assertEqual(cp_upper(100,100,.05),1.)
def test_small_calibration_abstains(self):
r=calibrate(np.zeros((80,101),int),np.linspace(0,1,101),64,alpha=.01,risk='any')
self.assertTrue(r['reject_all'])
def test_large_zero_calibration_certifies_any(self):
r=calibrate(np.zeros((1000,2),int),[.1,.9],64,alpha=.01,risk='any')
self.assertFalse(r['reject_all']);self.assertEqual(r['threshold'],.1)
def test_count_and_any_distinct(self):
counts=np.zeros((1000,2),int)
self.assertTrue(calibrate(counts,[.1,.9],64,.01,risk='count')['reject_all'])
self.assertFalse(calibrate(counts,[.1,.9],64,.01,risk='any')['reject_all'])
def test_invalid_calibration(self):
for x in (np.array([[65]]),np.array([[.5]]),np.array([[np.nan]])):
with self.assertRaises(ValueError):calibrate(x,[.5],64)
def test_fixed_sequence_zero_boundary(self):
for n,expected in ((298,True),(299,False)):
r=calibrate(np.zeros((n,101),int),np.linspace(0,1,101),64,.01,risk='any',method='fixed_sequence')
self.assertEqual(r['reject_all'],expected)
self.assertEqual(r['threshold'],0.)
def test_fixed_sequence_stops_without_restart(self):
# Deliberately nonmonotone table: later passing tests must not be inspected.
x=np.zeros((1000,3),int);x[:,1]=1
r=calibrate(x,[.1,.5,.9],64,.01,risk='any',method='fixed_sequence')
self.assertEqual(r['threshold'],.9)
self.assertEqual([v['threshold'] for v in r['tested']],[.9,.5])
def test_fixed_sequence_count_zero_boundary(self):
n=math.ceil(math.log(.05)/math.log1p(-.01/64))
for size,expected in ((n-1,True),(n,False)):
r=calibrate(np.zeros((size,1),int),[.5],64,.01,method='fixed_sequence')
self.assertEqual(r['reject_all'],expected)
def test_fixed_sequence_support_endpoints(self):
x=np.array([[0],[64]])
self.assertTrue(calibrate(x,[.5],64,0,method='fixed_sequence')['reject_all'])
self.assertFalse(calibrate(x,[.5],64,64,method='fixed_sequence')['reject_all'])
def test_pool_cap_and_stability(self):
p=np.zeros((5,5));p[0,0]=.9;p[4,4]=.8
m,x=candidate_pool(p,.1,1);self.assertEqual(len(m),1);self.assertTrue(m[0][0,0])
def test_metrics_one_to_one(self):
g=np.zeros((9,9),bool);g[4,4]=1
a=np.zeros_like(g);a[4,3]=1;b=np.zeros_like(g);b[4,5]=1
r=image_stats([a,b],g);self.assertEqual((r['tp'],r['fp'],r['fn']),(1,1,0))
def test_empty_image_conventions(self):
r=aggregate([image_stats([],np.zeros((4,4),bool))])
self.assertEqual(r['nIoU'],1.);self.assertIsNone(r['Pd']);self.assertEqual(r['FP_per_image'],0.)
def test_path_matches_enumeration(self):
nodes=[[1.,2.],[3.,0.],[.5,2.]];cost=[np.array([[0.,2.],[1.,0.]]),np.array([[0.,1.],[3.,0.]])]
best,path=best_path(nodes,cost)
scores=[(sum(nodes[t][v] for t,v in enumerate(p))-sum(cost[t][p[t],p[t+1]] for t in range(2)),p) for p in itertools.product(range(2),repeat=3)]
self.assertAlmostEqual(best,max(s[0] for s in scores));self.assertEqual(len(path),3)
def test_disconnected_path(self):
self.assertEqual(best_path([[1.],[2.]],[np.array([[np.inf]])]),(-math.inf,[]))
def test_binary_penalty_exactness(self):
w=[1.,2.,3.];edges=[(0,1),(1,2)];lam=4.
values=[(sum(w[i]*b[i] for i in range(3))-lam*sum(b[i]*b[j] for i,j in edges),b) for b in itertools.product([0,1],repeat=3)]
value,b=max(values);self.assertFalse(any(b[i] and b[j] for i,j in edges));self.assertEqual(value,exact_mwis(w,edges)[0])
+46
View File
@@ -0,0 +1,46 @@
import unittest,tempfile,csv,json,subprocess,sys,os
from pathlib import Path
import numpy as np
from PIL import Image
from irstd.data import sha,read_manifest
class PipelineTests(unittest.TestCase):
def make_fixture(self,root):
rows=[];pred=root/'pred';pred.mkdir()
for i,split in enumerate(['train','dev','cal','cal','test']):
name=f'image{i}';x=np.full((9,9),i,np.uint8);x[4,4]=200+i
y=np.zeros((9,9),np.uint8);y[4,4]=255
Image.fromarray(x).save(root/(name+'.png'));Image.fromarray(y).save(root/(name+'_mask.png'))
prob=np.zeros((9,9),np.float32);prob[4,4]=.9;np.save(pred/(name+'.npy'),prob)
rows.append(dict(id=name,image=name+'.png',mask=name+'_mask.png',split=split,group='g'+str(i)))
manifest=root/'manifest.csv'
with manifest.open('w',newline='') as f:
w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
(pred/'provenance.json').write_text(json.dumps(dict(checkpoint_sha256='synthetic_fixture_not_a_checkpoint',manifest_sha256=sha(manifest))))
return manifest,pred,rows
def run_script(self,name,args):
return subprocess.run([sys.executable,'scripts/'+name]+list(map(str,args)),capture_output=True,text=True)
def test_cpu_calibration_evaluation_and_tamper_guard(self):
with tempfile.TemporaryDirectory() as d:
root=Path(d);manifest,pred,_=self.make_fixture(root)
cert=root/'cert.json';out=root/'eval.json'
common=['--manifest',manifest,'--predictions',pred]
r=self.run_script('evaluate.py',common+['--split','cal','--calibrate','--out',cert,'--alpha','.01'])
self.assertEqual(r.returncode,0,r.stderr);self.assertTrue(json.loads(cert.read_text())['reject_all'])
r=self.run_script('evaluate.py',common+['--certificate',cert,'--out',out])
self.assertEqual(r.returncode,0,r.stderr);self.assertEqual(json.loads(out.read_text())['metrics']['Pd'],0.)
np.save(pred/'image4.npy',np.ones((9,9),np.float32))
r=self.run_script('evaluate.py',common+['--certificate',cert,'--out',root/'tampered.json'])
self.assertNotEqual(r.returncode,0);self.assertIn('invalidated',r.stderr)
def test_data_audit_cli(self):
with tempfile.TemporaryDirectory() as d:
root=Path(d);manifest,_,_=self.make_fixture(root);out=root/'audit.json'
r=self.run_script('audit_data.py',['--manifest',manifest,'--out',out])
self.assertEqual(r.returncode,0,r.stderr);report=json.loads(out.read_text())
self.assertEqual(report['area_bins']['1-4'],5);self.assertEqual(report['splits']['cal'],2)
def test_group_leakage_rejected(self):
with tempfile.TemporaryDirectory() as d:
root=Path(d);manifest,_,rows=self.make_fixture(root);rows[-1]['group']=rows[0]['group']
with manifest.open('w',newline='') as f:
w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
with self.assertRaisesRegex(ValueError,'crosses splits'):read_manifest(manifest)
+18
View File
@@ -0,0 +1,18 @@
import unittest,importlib.util
AVAILABLE=importlib.util.find_spec('torch') is not None
@unittest.skipUnless(AVAILABLE,'PyTorch is unavailable; gradient/training tests NOT executed')
class TorchTests(unittest.TestCase):
def test_shapes_and_gradient(self):
import torch
from irstd.models import TinyUNet,segmentation_loss
model=TinyUNet();x=torch.randn(1,1,17,19);y=torch.zeros_like(x);y[:,:,8,9]=1
for name in ['bce','dice','bce_dice','focal','iou']:
model.zero_grad();z=model(x);self.assertEqual(z.shape,x.shape)
loss=segmentation_loss(z,y,name);loss.backward();self.assertTrue(torch.isfinite(loss))
self.assertTrue(all(torch.isfinite(p.grad).all() for p in model.parameters()))
def test_gate_gradients(self):
import torch
from irstd.models import gate_loss
s=torch.tensor([0.,0.],requires_grad=True)
loss,upper=gate_loss(s,torch.tensor([1.,0.]),torch.tensor([4.,1.]),1.,.1)
loss.backward();self.assertLess(s.grad[0],0);self.assertGreater(s.grad[1],0);self.assertAlmostEqual(upper.item(),1.)