14 — Specialist Model Research (2026-09-25)¶
Candidate models for the resident specialists that feed the VLM through specialist_outputs (spec rev 6, D3). It was written from the owner's host session. The rulings it depends on are in the ledger as F12:
- licenses are not a selection criterion;
- the face gap is closed with option A;
- YOLOE-26 is approved for a future open-vocabulary slot.
What this doc is for:
- §1 (faces, plates) feeds Phase 1 Task 3b now. The plan's Task 3b names the picks.
- Everything else is a proposal for spec rev 7. Nothing there enters the build without an owner-approved spec change. Its shortlist is at the end.
The test a specialist must pass¶
A specialist is worth its memory only if it gives the VLM a fact that isn't in the 1-4 stills:
| Fact | Why the VLM can't get it itself |
|---|---|
| Identity | Recognizing a household face or plate needs the household gallery |
| Memory | Knowing what is normal for this camera needs its history |
| Time | Seeing motion needs more frames than the key stills |
| Fine detail | Small or distant objects are exactly where small VLMs fail |
Further requirements:
- Output: one short line, for example
face: unknown adult, face covered (0.91). Anything that needs a paragraph is the VLM's job. - Budget: about 300 MB of GPU memory or less at FP16, or run on CPU. The spec's VRAM row allows about 2 GiB for all resident specialists together.
- Latency: milliseconds per crop, because S4 gives the whole verdict 30 s at p95.
The owner chose three gap buckets for this round: identity, fine detail, and time plus memory. Audio events, night/IR image quality and wildlife classification were not researched.
Method and evidence levels¶
Three host-side agents opened the primary source for every candidate (Hugging Face model card, GitHub repo or LICENSE, NGC page, or paper). File sizes come from the HF or GitHub APIs. Any field no primary source confirmed is marked unverified. est. marks an agent's own estimate, usually latency from parameter count or FLOPs. Perplexity deep research (sonar-deep-research) supplied leads only; its tables were mostly unverified, and nothing here rests on it alone.
§1 Identity (Phase 1 Task 3b)¶
Faces: the picks¶
| Role | Model | Evidence | Size | Notes |
|---|---|---|---|---|
| Detection + 5 landmarks | SCRFD-10G-KPS (scrfd_10g_bnkps.onnx, InsightFace buffalo_l) | WIDER val 95.16 / 93.87 / 83.05 (easy / medium / hard) | 3.86M params, 16.9 MB | Landmarks allow ArcFace 5-point alignment |
| Embedding | w600k_r50.onnx (InsightFace buffalo_l, R50, WebFace600K) | IJB-C (TAR @ FAR 1e-4) 97.25; MR-ALL 91.25 | whole pack 326 MB; this file unverified | Load with onnxruntime on CPU, hash-pinned |
| Challenger for small/night faces (bake-off, later) | AdaFace IR101 or IR18 (WebFace4M/12M) | IR101: TinyFace Rank-1 72.29; IR18: LFW 99.53, CFP-FP 97.26, AgeDB 96.47 | IR18 96 MB | Its quality-adaptive margin targets low-quality faces. No published ONNX, but export is straightforward |
| Tiny fallback | EdgeFace-S γ0.5 | IJB-C 95.63, CFP-FP 95.74 | 3.65M params, 14.7 MB | For when CPU time matters |
| Face quality (later) | CR-FIQA | Top ranks in NIST FATE-Quality (the authors' claim) | unverified | A size-and-score gate is enough for 3b |
- The old "~1.5 GB VRAM" figure is not the model's cost. It came from the
insightfacepackage'sFaceAnalysisputting all fivebuffalo_lmodels on the GPU. The face leg needs two ONNX files, run on CPU. - Why not the current face detector:
yolo11-face(AdamCodd YOLOv11n; WIDER 0.942 / 0.921 / 0.810; 5.4 MB FP16) outputs boxes only. ArcFace-family embedders are trained on aligned crops, so unaligned crops quietly lose accuracy.
For reference, the permissive alternatives set aside by the license ruling:
- AuraFace-v1
glintr100.onnx(Apache-2.0; 260.7 MB FP32; LFW 99.65, CFP-FP 95.19; no IJB-C or TinyFace figures published). Watch out for the rest of that repo: four of its five ONNX files are byte-identical to InsightFace'santelopev2pack. - YuNet (MIT; 233 KB; WIDER 0.884 / 0.866 / 0.750).
- eDifFIQA(T) (CC-BY-4.0; 7.3 MB).
Plates¶
| Part | Model | Evidence | Size |
|---|---|---|---|
| Detector (keep) | yolo-v9-t-384-license-plate-end2end (open-image-models) | mAP50 0.920 (the s-608 variant: 0.966, 28.6 MB) | 7.8 MB |
| OCR (current pin) | cct-xs-v1-global-model | US plate_acc 0.905 (author's validation split) | ~2.1 MB |
| OCR (suggested) | cct-xs-v2-global-model; cct-s-v2 is the docs' recommended default | US plate_acc 0.929, char 0.987 (a different split) | 3.3 MB / 5.3 MB |
| Second-opinion OCR | PaddleOCR en_PP-OCRv5_mobile_rec | 85.25 on Paddle's English recognition set (general text, not plates) | 7.8 MB |
The current stack totals about 10 MB, not the 28 MB in models.yml. Re-test any OCR swap on our own plate crops, because the two published numbers use different validation splits.
Vehicles (rev 7 candidate)¶
| Model | Outputs | Evidence | Size |
|---|---|---|---|
| NVIDIA TAO VehicleTypeNet | coupe, sedan, SUV, van, large vehicle, truck (no pickup) | 88% top-1 on >60K North American images | 18.97 MB ONNX |
| NVIDIA TAO VehicleMakeNet | 20 makes | 91% top-1 | 7.07 MB ONNX |
PaddleClas PULC vehicle_attribute | 10 colours + 9 types, including pickup | mA 90.81 on VeRi (Chinese traffic) | 7.2 MB |
| fast-reid SBS R50-ibn (VeRi) | vehicle re-ID embedding | VeRi Rank-1 97.0 / mAP 81.9 | unverified; the repo is dormant |
Together these replace the catalogue's 1.5 GB ResNet-50 vehicle classifier. Vehicle re-ID answers "the same car as last night" when the plate is unreadable. The VLM can probably report colour itself.
§2 Fine detail (rev 7 candidate)¶
Open-vocabulary detection: YOLOE-26 (owner-approved for the slot)¶
| Model | Params | LVIS minival AP / APr (zero-shot) | Speed | Notes |
|---|---|---|---|---|
| YOLOE-26s | 10.7M | 30.8 / 23.9 | est. 2-6 ms on A5500 TRT; YOLOE-v8-S measured 305.8 FPS on T4 TRT | set_classes() bakes the vocabulary into the exported weights, so the text encoder (MobileCLIP2-B) is only needed offline. Only -seg checkpoints are published, so a detection-only model must be rebuilt from YAML |
| YOLOE-26m | 21.3M | 35.4 / 31.1 | est. a few ms | Best accuracy per millisecond in the survey |
| ref: OmDet-Turbo-Tiny | ~0.1B incl. text encoder | 30.3 / unverified | est. 15-25 ms | Its "language cache" precomputes text embeddings |
| ref: MM-Grounding-DINO-T / LLMDet-T | ~0.2B | 41.4 / 34.2 and 44.7 / 37.3 | est. 50-80 ms | Over both budgets |
| ref: OWLv2-B/16 | ~0.2B | 43.9 / 40.5 | well over 50 ms | 960 px ViT input |
- Keep the vocabulary short, and vary it by camera and time of day. An aerial benchmark found that cutting 80 classes to about 3 improved results 15-fold. Examples:
crowbar, bolt cutters, ladderat the back fence at night;packageon the porch by day;balaclava, ski mask, hoodeverywhere. - Night evidence is only indirect. The zero-shot thermal results (Thermal-Det) come from LWIR cameras, not Foscam near-IR. Measure false positives on our own night footage.
Weapons¶
No published checkpoint deserves trust.
- The current
Subh775/Threat-Detection-YOLOv8nreports identical 83.0% recall on every class, on an unnamed Roboflow dataset, and calls itself "research and educational purposes". - Its RF-DETR sibling's test table is a verbatim copy of the YOLOv8n card's.
- On real CCTV, handguns are 16-47 px. The best AP50 on real robbery footage is 57.4 (CCTV-Gun), and it falls to 3.7 across datasets.
Design:
- Weapon hits reach the VLM as hints, never triggers. They come from YOLOE-26 with a high threshold, counted only when the box overlaps a person's hand or arm.
- Measure false positives on our night footage and on US Mock Attack (real CCTV from 3 cameras, with smartphones as distractors).
- Stop-gap:
Subh775/Firearm_Detection_Yolov8n(mAP50 0.890; it reports 324 background false positives on validation; gun class only). - Fine-tune path: RF-DETR-N (30.5M params; COCO AP 48.4; 2.3 ms on T4 TRT) or YOLOE, trained on WeaponDetection_Grouped (7,615 images) plus hard negatives (phones, tools, umbrellas).
Person attributes and "face covered"¶
| Model | Outputs | Evidence | Size |
|---|---|---|---|
PaddleClas PULC person_attribute (PP-LCNet) | 26 PA-100K attributes: bags, hat, glasses, holding an object, clothing, orientation | PA-100K mA 78.59; 2.01 ms on a Xeon CPU | 7.1 MB |
| PP-Human attribute (PP-HGNet_small) | same 26 attributes | mA 95.4 on an internal mixed set (not comparable) | unverified |
- Neither outputs mask, hood or gloves. "Face covered" comes from YOLOE-26 prompts, or from SigLIP2 zero-shot on head crops, checked on our own footage.
- The LamKser ConvNeXt-S face-occlusion classifier (0.9887 on its own split) needs a detected face, so it doesn't help at night or at distance.
§3 Time and memory (rev 7 candidates)¶
Person re-ID¶
| Model | MSMT17 Rank-1 / mAP | Params | Notes |
|---|---|---|---|
| PersonViT ViT-S/16 | 89.2 / 74.3 | ViT-S (unverified) | LUPerson pretraining; weights ~3 years old; ONNX export not documented |
| CLIP-ReID ViT-B/16 | 88.7 / 73.4 | 87.5M (est. ~175 MB FP16) | The most robust across domains in a 2026 comparison of 11 models; ONNX export unproven |
| SOLIDER-REID Swin-T | 85.9 / 67.4 | unverified | LUPerson pretraining |
| fast-reid SBS R50-ibn | 83.9 / 60.6 | ~23.5M | ONNX and TensorRT export documented |
| NVIDIA TAO ReIdentificationNet R50 | Market-1501 94.7 / 93.0 (same domain) | 91.9 MB | Encrypted; runs only on NVIDIA runtimes |
| incumbent OSNet-AIN x1.0 | MSMT17→Market 70.1 / 43.3 | 2.2M | Mislabeled in the repo as "MSMT17 73.3%": that figure is the multi-source MS+D+C→Market Rank-1, and its training included the withdrawn DukeMTMC |
- Do not use a general scene embedder for re-ID. Zero-shot SigLIP2 measured mAP 2.8-14.2% for re-ID in the same 2026 comparison.
- None of these publishes a cross-domain score, so run our own cross-camera test before switching.
- KPR is flagged regardless of the license ruling. Its Hippocratic License 3.0 prohibits surveillance and law-enforcement use.
Pose¶
| Model | COCO AP | Params | Latency | Notes |
|---|---|---|---|---|
| RTMPose-s, top-down on YOLO26 person crops (rtmlib ONNX) | 71.6 | 5.47M | 1.39 ms TRT-FP16 on a GTX 1660 Ti | Crops are upsampled, which suits small, distant people. RTMPose-t: 68.2 / 3.34M / 1.06 ms |
| RTMPose-m | 74.6 (75.8 with the AIC+COCO checkpoint) | 13.59M | unverified | Within about 1 AP of ViTPose-B at a sixth of the size |
| YOLO26-pose, one pass per frame | mAPpose50-95: n 57.2, s 63.0, m 68.8, l 70.4 | 2.9 / 10.4 / 21.5 / 25.9M | 1.8 / 2.7 / 5.0 / 6.5 ms on T4 TRT | Same exporter and toolchain as the YOLO26 gate, with no crop loop. It works on the 640 px full frame, so it is weaker on small people |
| DETRPose-S | 67.0 | 11.5M | 4.99 ms on V100 TRT FP16 | Young repo |
| incumbent YOLOv8n-pose | — | — | — | Superseded by YOLO26-pose |
The top-down AP and the YOLO pose mAP use different protocols, so they are not directly comparable. Suggested setup: YOLO26-pose if we want pose inside the detector pass, and RTMPose-s top-down for small subjects.
Skeleton action¶
No pretrained model covers the residential behaviours: trying door handles, peering into windows, climbing a fence, loitering. NVIDIA PoseClassificationNet only has sitting down, getting up, sitting, standing, walking and jumping.
- Start from the PYSKL ST-GCN++ NTU-120 2D checkpoint. It scores 84.4 on NTU120 XSub with joints only, and 86.4 with four streams (89.3 on NTU60 XSub). It has 1.39M params and costs 1.95 GFLOPs per clip. The 2D checkpoints consume COCO-17 keypoints, so RTMPose or YOLO26-pose output feeds it directly, with no joint remapping.
- Relevant NTU classes:
- falls: A43 falling, A42 staggering;
- posture: A80 squat down;
- violence: A50 punch/slap, A51 kicking, A52 pushing, A106 hit with object, A107 wield knife, A108 knock over;
- movement: A99 run on the spot, A27 jump up, A59 walking towards.
- Domain gap: NTU is indoor lab footage with near-frontal Kinect viewpoints and full bodies in frame. Expect it to degrade on small outdoor IR people, and fine-tune the head.
- Fine-tune data: OmniFall (15k videos, 16 fall-related classes; its synthetic split transfers as well as staged footage), AVA v2.2 (crouch/kneel, fall down, run, climb, fight, "open a window or car door"), Kinetics-700 ("closing door", and possibly "climbing ladder"), plus clips the owner stages on our own cameras, day and IR. Only the owner's clips cover peering and door handles.
- Accuracy ceiling: ProtoGCN (NTU120 XSub 90.9, but as a 6-model ensemble).
- Split by input:
- stills: posture rules or a tiny MLP on keypoints (crouching, lying down);
- clips: ST-GCN++;
- loitering and running: dwell-time and displacement rules from the tracker and re-ID, not a classifier.
Scene novelty ("is this unusual for this camera?")¶
| Embedder | ImageNet zero-shot | Vision params | Notes |
|---|---|---|---|
| SigLIP2-B/16-224 (incumbent, resident) | 78.2 | ~86M | Adds no new model; precompute the text embeddings |
| MobileCLIP2-S2 | 77.2 | 35.7M | Within 1 point at ~40% of the vision params. MobileCLIP2-B: 79.4 at 86.3M. There is no documented ONNX export (it is OpenCLIP-based). Worth a head-to-head |
| PE-Core-S16-384 | 72.7 | ~20M | 384 px input |
| DINOv2-S/14 | ImageNet k-NN 79.0 | 22.1M | No text tower |
| DINOv3 ViT-S/16 | ImageNet-ReaL 87.0 | 21M | Stronger dense features, so the better backbone for optional patch-level localisation |
Google publishes no SigLIP2 so150m checkpoint. The so150m weights on HF are timm supervised backbones with no text tower.
Recipe: kNN against a per-camera memory bank of global embeddings.
- L2-normalize each still's vision embedding.
- Key the bank by (camera, IR vs day mode taken from colour saturation, 2-hour bin plus its neighbours). Store only frames from events that were not escalated, capped at about 3k per key over a rolling 30-60 days. An exact index is enough at that size.
- Score each still as the mean cosine distance to its k=5 nearest neighbours, excluding frames from the same upload burst.
- Convert the score to a percentile against the key's leave-one-out scores.
- Take the maximum over the event's 1-4 stills.
- Emit nothing until a key holds at least 200 frames. Reset the bank when the camera moves.
- Optionally, run the same kNN on YOLO26 person crops to get "person crop novelty" (AI-VAD's deep-feature idea), and use DINOv3 patch-kNN to show which region changed.
Output line: scene novelty: 97th percentile for this camera at night (k=5, n=1840).
Related methods: PatchCore and AnomalyDINO work on stills (AnomalyDINO: MVTec one-shot AUROC 96.6). AI-VAD partly does: velocity needs consecutive frames, but its pose and CLIP-kNN parts work on stills. AnomalyCLIP and VideoPatchCore don't fit.
Trackers¶
Trackers only help within a clip. Across separate uploads, re-ID does the association.
- roboflow/trackers (clean-room SORT, ByteTrack, OC-SORT, BoT-SORT; v2.6.1, 2026-09-25) has no re-ID branch.
- BoxMOT puts one API over ByteTrack, BoT-SORT, OC-SORT, Deep OC-SORT and StrongSORT, with re-ID backends.
- The Ultralytics built-in ByteTrack/BoT-SORT is the zero-glue path if pose moves to YOLO26-pose.
- For fixed cameras, turn off BoT-SORT's camera-motion compensation.
- MOT17 HOTA ranges from 63.1 (ByteTrack) to 65.0 (BoT-SORT with re-ID).
Rev 7 shortlist (proposal, not yet approved)¶
The order follows expected verdict impact per unit of effort:
- Re-ID swap. The vlm path's re-ID may be a zero-shot CLIP embedder, whose matches are close to noise. Candidates: PersonViT ViT-S/16 or CLIP-ReID.
- YOLOE-26 open-vocabulary slot. It covers fine detail, weapon hints (gated on a hand or arm) and face covered, in one resident model of a few ms.
- Scene-novelty baseline. It reuses the resident SigLIP2 tower, so it costs almost no VRAM. The storage rule is in F12: PostgreSQL, adding pgvector past about 100k vectors.
- Vehicle type, make and re-ID. TAO VehicleTypeNet and VehicleMakeNet (about 26 MB), plus a vehicle re-ID embedding.
- Pose and action. The most effort. Start from the NTU-120 ST-GCN++ checkpoint; the residential classes need OmniFall, AVA and owner-staged clips.
Each item enters the build the same way Task 3b's specialists did: a synthetic verdict-changing case, an S1/S4 measurement, and a false-positive measurement on the owner's night footage.
Traps and corrections found¶
- A model's license follows its framework, text encoder and training data, not just its card. For example, anything trained with Ultralytics is AGPL whatever the card says. That no longer gates selection (F12), but it explains why cards contradict themselves.
- AuraFace-v1 ships four InsightFace
antelopev2files alongside its ownglintr100.onnx. - A metric copied between cards: the Subh775 RF-DETR table duplicates its YOLOv8n table.
- Repo corrections:
- the OSNet-AIN "MSMT17 73.3%" label (see §3);
- the
fast-alprstack is ~10 MB, not 28 MB, and pins the v1 OCR; buffalo_l's "~1.5 GB" is the loader's cost, not the model's (see §1).- Use restrictions, still flagged:
- KPR (Hippocratic License 3.0);
- BlazeFace (its card excludes faces beyond 5 m and surveillance or identity use).
rapdataset.com(the RAP attribute dataset) serves a TLS certificate for unrelated gambling domains. Don't download from it.- A patent to check before this ships as a product: US8167430B2 (Motorola Solutions, active until 2030-11-09) covers time-of-day anomaly detection in video surveillance. Its claim 1 uses adaptive resonance theory networks on motion data, which differs materially from kNN over embeddings. This is not a license question, so F12 doesn't cover it.
- The in-house
stgcn_action(~20 MB) is probably NTU-trained. That's fine under F12, but it means the model already shares NTU's indoor-lab domain gap.
Primary sources (selection)¶
InsightFace model zoo · fal/AuraFace-v1 · opencv_zoo (YuNet, SFace, eDifFIQA) · minchul/cvlface_adaface_ir18_webface4m · Idiap/EdgeFace · ankandrew/fast-alpr, fast-plate-ocr, open-image-models · NGC TAO VehicleTypeNet, VehicleMakeNet, ReIdentificationNet · PaddleClas PULC · docs.ultralytics.com/models/yoloe · omlab/omdet-turbo-swin-tiny-hf · Subh775 threat and firearm cards · srikarym/CCTV-Gun · roboflow/rf-detr · hustvl/PersonViT · Syliz517/CLIP-ReID · KaiyangZhou/deep-person-reid · JDAI-CV/fast-reid · tinyvision/SOLIDER-REID · open-mmlab/mmpose (RTMPose, RTMO) · Tau-J/rtmlib · docs.ultralytics.com/tasks/pose · SebastianJanampa/DETRPose · kennymckormick/pyskl · firework8/ProtoGCN · NGC PoseClassificationNet · apple/MobileCLIP2 · facebook/PE-Core · facebook/dinov2-small · facebook/dinov3-vits16 · dammsi/AnomalyDINO · amazon-science/patchcore-inspection · roboflow/trackers · mikel-brostrom/boxmot. The full URL for every candidate is in the host session's research reports (2026-09-25).