Each camera frame is scored. Faces and objects are extracted with a tight bounding box and a quality score. Only what's worth processing moves to the next layer.
{
"face_detected": true,
"bbox": [x, y, w, h],
"quality_score": 0.93
}Recognition models are commodity. Identity event orchestration at port scale, under partial chaos, with audit guarantees — is not. This is what ports.io owns.
Each camera frame is scored. Faces and objects are extracted with a tight bounding box and a quality score. Only what's worth processing moves to the next layer.
{
"face_detected": true,
"bbox": [x, y, w, h],
"quality_score": 0.93
}ByteTrack / OC-SORT links frames into a single track per camera. A worker walking through a lane is no longer 40 detections — it is one track_id.
track_id: gate3_lane2_track18
Blur, occlusion, side profile, low illumination and small bounding boxes are rejected. Only the top-K candidate frames per track survive. Compute drops by an order of magnitude.
ArcFace / InsightFace produces a 512-dimensional biometric vector. The vector is the only thing that crosses the network — never the raw face.
embedding: float32[512]
Vector search (pgvector now, Qdrant later) returns the closest worker_id with a confidence score. Below the threshold, the sighting is logged as unknown and surfaced to operators.
{
"worker_id": "PORT_EMP_9382",
"confidence": 0.98
}Same identity, same gate, within a 20-second window — collapsed into one logical event. This is the layer that turns chaos into a clean operational signal.
Shift windows, IN/OUT inference, contractor rules, blacklist routing. The output is a single attendance_event your HRMS, payroll and audit log can trust.