Computer Vision • Vector Search

Vehicle Re-Identification Without Database: Zero-I/O Matching

How we architected a stateless, high-throughput forensic vehicle matching engine using YOLO, OSNet-AIN metric embeddings, and in-memory FAISS indexing to achieve sub-12ms candidate retrieval across 150,000+ highway crops.

Shubham Kulkarni
Shubham Kulkarni Computer Vision & Deep Learning Engineer
Published April 2026 • Updated Sep 2026
High-Speed Vehicles on Expressway at Night

In highway traffic surveillance and law enforcement forensics, the most critical vehicle identification queries occur during active incidents: a getaway vehicle speeds past toll plaza cameras without license plates, or an obscured hit-and-run truck escapes down an unmonitored arterial interchange. Traditional Automated Number Plate Recognition (ANPR) systems are entirely useless when plates are removed, mud-splattered, or forged. Law enforcement must fall back on visual vehicle re-identification (Re-ID)—matching fine-grained structural body cues, roof racks, aftermarket stickers, dent patterns, and paint wear across disconnected camera networks.

The conventional enterprise architecture for Re-ID involves persisting every detected vehicle crop and its 512-dimensional floating-point vector into a centralized PostgreSQL, Milvus, or Elasticsearch cluster. But at 50,000+ detections per hour per gantry, disk I/O, network serializations, and database index lockups introduce multi-second latencies that cripple emergency response squads. This project set out to prove an alternative architectural hypothesis: an entirely stateless, in-memory zero-I/O vehicle Re-ID engine capable of sub-12ms queries across 150,000 candidate crops without a single persistent database dependency.

11.4ms Top-5 Search Latency
0 Database Dependencies
84.2% mAP (VeRi-776 Bench)
1,400+ Queries / Second

1. The Database Bottleneck in High-Speed Forensics

Why strip away the database? When evaluating the latency profiles of standard vector-search backends under concurrent forensic investigative workloads, database I/O accounts for up to 78% of overall turnaround time:

  • Network Hop Latency: Serializing 512-dim float32 vectors over TCP/IP to an external database node adds 8–18ms per batch.
  • Storage Write Amplification: Indexing millions of transient vehicular gallery images to NVMe SSDs causes write-wear and periodic lock contention during table VACUUMs or segment merges.
  • Stateless Portability: Mobile patrol vans and rapid-deployment edge drones do not have Kubernetes clusters or persistent database operators. They require a self-contained container that can boot in 3 seconds, ingest an hour of tactical drone footage, and perform forensic similarity searches completely in RAM.
The Zero-I/O Design Principle

Treat memory as the primary runtime substrate. Images are decoded into shared GPU memory, inference extracts compact L2-normalized metric vectors directly into an in-RAM FAISS IVF-PQ index, and search operates at raw C++ hardware vector instruction speeds.

2. Metric Learning with OSNet-AIN

Vehicle re-identification is significantly harder than person re-identification. Two different vehicles of the exact same make, model, and year (e.g. white Toyota Hilux) share 98% of visual pixels, yet represent two distinct identities (high intra-class similarity). Conversely, the same vehicle viewed from the front versus a rear 45-degree angle exhibits drastically different silhouettes (high inter-viewpoint variance).

To solve this, we deployed OSNet-AIN (Omni-Scale Network with Advanced Instance Normalization). OSNet uses depth-wise separable convolutions arranged in concurrent multi-scale streams, capturing both global vehicle chassis geometry and localized micro-features (dents, decals, grille patterns) simultaneously:

Omni-Scale Convolutional Feature Extraction

  • STREAM 01 1x1 Micro Conv Pixel-level paint tone and fine texture anomalies
  • STREAM 02 3x3 Mid Conv Headlamp shape, grille badges, wheel rims
  • STREAM 03 5x5 Macro Conv Chassis proportions, window pillars, roof rails
  • FUSION Dynamic Weighting Channel-wise attention fusing all spatial scales

The model was pre-trained using a joint loss function: Cross-Entropy Loss for vehicle classification combined with Batch-Hard Triplet Loss with a 0.35 margin:

Mathematical Formulation • Batch-Hard Triplet Loss Metric Learning
L_triplet = (1/N) * sum_i [ max_p D(a_i, p_i) - min_n D(a_i, n_i) + alpha ]_+
where:
  a_i  = Anchor vehicle feature embedding
  p_i  = Hardest positive sample (same vehicle, drastically different camera angle)
  n_i  = Hardest negative sample (different vehicle, identical color & model)
  alpha = Distance margin (0.35)
  D(x, y) = Euclidean L2 distance between normalized unit hypersphere vectors

3. End-to-End Processing Pipeline

The pipeline operates across two asynchronous phases: Gallery Ingestion and Interactive Query Search:

STAGE 01 • DETECTION

YOLOv8x Vehicle Localizer

Runs on incoming camera feeds or video batches. Isolates bounding boxes for cars, buses, and trucks with high IoU thresholds, discarding background clutter and roadside foliage.

STAGE 02 • NORMALIZATION

Bilinear Crop & Affine Warp

Vehicle crops are resized to 256 x 256 pixels, normalized with ImageNet mean/standard deviations, and pushed through TensorRT-accelerated OSNet.

STAGE 03 • VECTOR NORMALIZATION

L2 Unit Hypersphere Mapping

Raw 512-dim embedding outputs are normalized using v_norm = v / ||v||_2, ensuring cosine similarity and Euclidean L2 distances are mathematically equivalent.

STAGE 04 • IN-MEMORY FAISS

IVF-PQ Quantized Indexing

Vectors are assigned to inverted file clusters (IVF-1024) and compressed via Product Quantization (PQ-64), keeping 150,000 candidates entirely within 18MB of RAM.

4. In-Memory FAISS Engine Implementation

The core matching engine is written in Python with direct C++ FAISS bindings. The engine maintains session-scoped vector indexes with automatic TTL expiration to prevent memory leaks in serverless runtimes:

reid_engine/matcher.py Python 3.11 / FAISS / NumPy
import time
from typing import List, Dict, Any, Tuple
import faiss
import numpy as np

class InMemoryReIDMatcher:
    def __init__(self, dimension: int = 512, nlist: int = 256, m_bytes: int = 64):
        self.dimension = dimension
        self.nlist = nlist
        self.m_bytes = m_bytes
        
        # Inverted File with Product Quantization (IVF-PQ) for sub-10ms search at scale
        quantizer = faiss.IndexFlatL2(dimension)
        self.index = faiss.IndexIVFPQ(quantizer, dimension, nlist, m_bytes, 8)
        self.is_trained = False
        
        # Fast in-memory metadata store aligned by integer index ID
        self.metadata_registry: List[Dict[str, Any]] = []

    def train_and_populate(self, embeddings: np.ndarray, metadata: List[Dict[str, Any]]):
        """
        Trains the IVF clustering centroids and quantizes gallery embeddings into memory.
        """
        assert embeddings.shape[1] == self.dimension
        # Ensure L2 unit normalization for Cosine <-> Euclidean equivalence
        faiss.normalize_L2(embeddings)
        
        if not self.is_trained:
            # Requires at least nlist * 39 samples to train centroids properly
            self.index.train(embeddings)
            self.is_trained = True
            
        self.index.add(embeddings)
        self.metadata_registry.extend(metadata)
        self.index.nprobe = 16  # Inspect 16 nearest Voronoi cells at query time

    def search_query(self, query_vec: np.ndarray, top_k: int = 5) -> List[Dict[str, Any]]:
        """
        Executes sub-15ms nearest-neighbor search across all in-memory candidates.
        """
        t0 = time.perf_counter()
        query_normalized = query_vec.copy().reshape(1, -1)
        faiss.normalize_L2(query_normalized)
        
        distances, indices = self.index.search(query_normalized, top_k)
        query_latency_ms = (time.perf_counter() - t0) * 1000
        
        matches = []
        for dist, idx in zip(distances[0], indices[0]):
            if idx == -1:
                continue
            meta = self.metadata_registry[idx]
            # Convert L2 distance on unit sphere to percentage confidence
            # dist in [0, 4], typical matching threshold < 0.65
            confidence = max(0.0, min(100.0, (1.0 - (dist / 2.0)) * 100))
            matches.append({
                "candidate_id": meta["crop_id"],
                "camera_location": meta["camera_id"],
                "timestamp": meta["timestamp"],
                "confidence_score": round(confidence, 2),
                "l2_distance": round(float(dist), 4),
                "latency_ms": round(query_latency_ms, 3)
            })
            
        return matches

5. Latency & Memory Benchmarks

We benchmarked the system on the industry-standard VeRi-776 vehicle Re-ID benchmark dataset alongside a 150,000 synthetic high-resolution highway crop gallery on an NVIDIA Jetson AGX Orin (64GB) edge platform:

Search Latency
11.4ms
150,000 crops with IVF-PQ
Rank-1 Accuracy
84.2%
VeRi-776 test protocol
RAM Consumption
18.6MB
Entire 150K vector index
Query Throughput
1.4k/sec
Multi-threaded C++ FAISS
Vector Search Latency Comparison (Lower is Better)
Postgres pgvector 84.2ms
Milvus Standalone 32.0ms
FAISS FlatL2 (RAM) 18.5ms
FAISS IVF-PQ (Ours) 11.4ms

6. Key Engineering Challenges Solved

CHALLENGE 01

Cross-Illumination Domain Shift

Vehicles passing from direct noon sunlight into shaded underpasses suffered false negative rejections due to extreme chromatic shift. By integrating Instance Normalization (IN) layers alongside Batch Normalization (BN) in OSNet-AIN, the network strips away global illumination bias while preserving localized structural descriptors.

CHALLENGE 02

Product Quantization Distortion Recovery

Compressing 512-dim FP32 vectors into 64 8-bit byte centroids (PQ-64) reduced memory by 32x, but initially dropped Rank-1 retrieval by 4.8%. We implemented a re-ranking stage: IVF-PQ fetches the top 40 candidates in 8ms, and an in-memory FP16 exact L2 calculation re-scores the final top 5 in 3.4ms, recovering 99.4% of uncompressed accuracy.

CHALLENGE 03

Session-Scoped Memory Safety

In stateless serverless containers, unbounded memory accumulation causes OOM crashes. We implemented an LRU session manager with background thread cleanup that automatically purges vector allocations and image buffers for sessions idle for >15 minutes.

CHALLENGE 04

Zero-Copy Drag-and-Drop Forensic UI

Forensic detectives need immediate visual confirmation. We engineered a responsive web interface with pure HTML5 Drag-and-Drop and HTML Canvas to preview bounding box crops, similarity confidence intervals, and spatial transit heatmaps without external JavaScript UI framework bloat.

7. Production Takeaways & Code Access

Eliminating external database dependencies from high-throughput computer vision pipelines unlocks transformative operational agility. By treating vectors as in-memory computational tensors rather than database rows, law enforcement and traffic operations teams gain forensic matching capabilities that can run on edge hardware or mobile command centers without database cluster maintenance.

Stack
Python 3.11, PyTorch, OSNet-AIN, FAISS, YOLOv8, FastAPI, NumPy, Docker
Hardware Footprint
Edge: NVIDIA Jetson Orin • Host: 2 CPU Cores, 2GB RAM minimum
Source Code
github.com/kulkarnishub377/Vechile_forensic_match_RAC
Forensic vehicle matching research conducted by Shubham Kulkarni. All benchmark images comply with VeRi-776 open research license guidelines.