@camstack/addon-pipeline-analysis 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/addon.d.mts +11 -0
- package/dist/addon.d.ts +11 -0
- package/dist/addon.js +949 -0
- package/dist/addon.js.map +1 -0
- package/dist/addon.mjs +7 -0
- package/dist/addon.mjs.map +1 -0
- package/dist/chunk-QMP6KSXZ.mjs +958 -0
- package/dist/chunk-QMP6KSXZ.mjs.map +1 -0
- package/dist/index.d.mts +2 -9
- package/dist/index.d.ts +2 -9
- package/dist/index.js +3 -3
- package/dist/index.mjs +19 -937
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/zones/geometry.ts","../src/tracker/sort-tracker.ts","../src/tracker/state-analyzer.ts","../src/events/event-filter.ts","../src/events/event-emitter.ts","../src/zones/overlap.ts","../src/zones/zone-engine.ts","../src/analytics/track-store.ts","../src/analytics/heatmap.ts","../src/analytics/analytics-provider.ts","../src/analytics/live-state.ts","../src/pipeline/analysis-pipeline.ts","../src/addon.ts"],"sourcesContent":["export interface Point {\n readonly x: number\n readonly y: number\n}\n\nexport interface LineSegment {\n readonly p1: Point\n readonly p2: Point\n}\n\nexport interface BboxRect {\n readonly x: number\n readonly y: number\n readonly w: number\n readonly h: number\n}\n\nexport interface TripwireResult {\n readonly crossed: boolean\n readonly direction: 'left' | 'right'\n}\n\n/** Ray-casting point-in-polygon test */\nexport function pointInPolygon(point: Point, polygon: readonly Point[]): boolean {\n if (polygon.length < 3) return false\n let inside = false\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x, yi = polygon[i].y\n const xj = polygon[j].x, yj = polygon[j].y\n const intersect = (yi > point.y) !== (yj > point.y)\n && point.x < ((xj - xi) * (point.y - yi)) / (yj - yi) + xi\n if (intersect) inside = !inside\n }\n return inside\n}\n\n/** Parametric line-segment intersection. Returns intersection point or null. */\nexport function lineIntersection(a: LineSegment, b: LineSegment): Point | null {\n const dx1 = a.p2.x - a.p1.x\n const dy1 = a.p2.y - a.p1.y\n const dx2 = b.p2.x - b.p1.x\n const dy2 = b.p2.y - b.p1.y\n\n const denom = dx1 * dy2 - dy1 * dx2\n if (Math.abs(denom) < 1e-10) return null\n\n const t = ((b.p1.x - a.p1.x) * dy2 - (b.p1.y - a.p1.y) * dx2) / denom\n const u = ((b.p1.x - a.p1.x) * dy1 - (b.p1.y - a.p1.y) * dx1) / denom\n\n if (t < 0 || t > 1 || u < 0 || u > 1) return null\n\n return { x: a.p1.x + t * dx1, y: a.p1.y + t * dy1 }\n}\n\n/** Detect tripwire crossing and direction via cross product. */\nexport function tripwireCrossing(\n prev: Point,\n curr: Point,\n wire: LineSegment,\n): TripwireResult | null {\n const movement: LineSegment = { p1: prev, p2: curr }\n const intersection = lineIntersection(movement, wire)\n if (!intersection) return null\n\n const cross = (curr.x - prev.x) * (wire.p2.y - wire.p1.y)\n - (curr.y - prev.y) * (wire.p2.x - wire.p1.x)\n\n return { crossed: true, direction: cross > 0 ? 'right' : 'left' }\n}\n\n/** Centroid of a bounding box { x, y, w, h } */\nexport function bboxCentroid(bbox: BboxRect): Point {\n return { x: bbox.x + bbox.w / 2, y: bbox.y + bbox.h / 2 }\n}\n\n/** Convert normalized (0–1) coordinates to pixel coordinates */\nexport function normalizeToPixel(p: Point, width: number, height: number): Point {\n return { x: p.x * width, y: p.y * height }\n}\n","import type { SpatialDetection, TrackedDetection, BoundingBox } from '@camstack/types'\nimport { bboxCentroid } from '../zones/geometry.js'\n\nexport interface TrackerConfig {\n readonly iouThreshold: number\n readonly maxMissedFrames: number\n readonly minHits: number\n}\n\nexport const DEFAULT_TRACKER_CONFIG: TrackerConfig = {\n iouThreshold: 0.3,\n maxMissedFrames: 30,\n minHits: 3,\n}\n\ninterface InternalTrack {\n id: string\n bbox: BoundingBox\n class: string\n originalClass: string\n score: number\n age: number\n hits: number\n path: BoundingBox[]\n firstSeen: number\n lastSeen: number\n velocity: { dx: number; dy: number }\n lost: boolean\n}\n\nconst MAX_PATH_LENGTH = 300\nlet nextTrackId = 1\n\nfunction iou(a: BoundingBox, b: BoundingBox): number {\n const ax1 = a.x, ay1 = a.y, ax2 = a.x + a.w, ay2 = a.y + a.h\n const bx1 = b.x, by1 = b.y, bx2 = b.x + b.w, by2 = b.y + b.h\n\n const ix1 = Math.max(ax1, bx1), iy1 = Math.max(ay1, by1)\n const ix2 = Math.min(ax2, bx2), iy2 = Math.min(ay2, by2)\n const iw = Math.max(0, ix2 - ix1), ih = Math.max(0, iy2 - iy1)\n const interArea = iw * ih\n\n const aArea = a.w * a.h\n const bArea = b.w * b.h\n const unionArea = aArea + bArea - interArea\n\n return unionArea > 0 ? interArea / unionArea : 0\n}\n\nexport class SortTracker {\n private readonly config: TrackerConfig\n private tracks: InternalTrack[] = []\n private lostTracks: InternalTrack[] = []\n\n constructor(config: Partial<TrackerConfig> = {}) {\n this.config = { ...DEFAULT_TRACKER_CONFIG, ...config }\n }\n\n update(detections: readonly SpatialDetection[], timestamp: number): TrackedDetection[] {\n const used = new Set<number>()\n const matchedTracks = new Set<InternalTrack>()\n const matched = new Map<InternalTrack, SpatialDetection>()\n\n const pairs: { track: InternalTrack; detIdx: number; score: number }[] = []\n for (const track of this.tracks) {\n for (let di = 0; di < detections.length; di++) {\n const score = iou(track.bbox, detections[di].bbox)\n if (score >= this.config.iouThreshold) {\n pairs.push({ track, detIdx: di, score })\n }\n }\n }\n pairs.sort((a, b) => b.score - a.score)\n\n for (const pair of pairs) {\n if (matchedTracks.has(pair.track) || used.has(pair.detIdx)) continue\n matched.set(pair.track, detections[pair.detIdx])\n matchedTracks.add(pair.track)\n used.add(pair.detIdx)\n }\n\n for (const [track, det] of matched) {\n const prevCenter = bboxCentroid({ x: track.bbox.x, y: track.bbox.y, w: track.bbox.w, h: track.bbox.h })\n const newCenter = bboxCentroid({ x: det.bbox.x, y: det.bbox.y, w: det.bbox.w, h: det.bbox.h })\n\n track.bbox = det.bbox\n track.class = det.class\n track.originalClass = det.originalClass\n track.score = det.score\n track.age = 0\n track.hits++\n track.lastSeen = timestamp\n track.velocity = { dx: newCenter.x - prevCenter.x, dy: newCenter.y - prevCenter.y }\n track.path.push(det.bbox)\n if (track.path.length > MAX_PATH_LENGTH) track.path.shift()\n }\n\n const surviving: InternalTrack[] = []\n for (const track of this.tracks) {\n if (matchedTracks.has(track)) {\n surviving.push(track)\n } else {\n track.age++\n if (track.age > this.config.maxMissedFrames) {\n track.lost = true\n this.lostTracks.push(track)\n } else {\n surviving.push(track)\n }\n }\n }\n\n for (let di = 0; di < detections.length; di++) {\n if (used.has(di)) continue\n const det = detections[di]\n surviving.push({\n id: `track-${nextTrackId++}`,\n bbox: det.bbox,\n class: det.class,\n originalClass: det.originalClass,\n score: det.score,\n age: 0,\n hits: 1,\n path: [det.bbox],\n firstSeen: timestamp,\n lastSeen: timestamp,\n velocity: { dx: 0, dy: 0 },\n lost: false,\n })\n }\n\n this.tracks = surviving\n\n return this.tracks\n .filter(t => t.hits >= this.config.minHits)\n .map(t => ({\n class: t.class,\n originalClass: t.originalClass,\n score: t.score,\n bbox: t.bbox,\n trackId: t.id,\n trackAge: t.hits,\n velocity: t.velocity,\n path: [...t.path],\n }))\n }\n\n getActiveTracks(): readonly InternalTrack[] {\n return this.tracks\n }\n\n getLostTracks(): readonly InternalTrack[] {\n return this.lostTracks\n }\n\n reset(): void {\n this.tracks = []\n this.lostTracks = []\n }\n}\n","import type { TrackedDetection, TrackedObjectState, ObjectState } from '@camstack/types'\nimport { bboxCentroid } from '../zones/geometry.js'\n\nexport interface StateAnalyzerConfig {\n readonly stationaryThresholdSec: number\n readonly loiteringThresholdSec: number\n readonly velocityThreshold: number\n readonly enteringFrames: number\n}\n\nexport const DEFAULT_STATE_ANALYZER_CONFIG: StateAnalyzerConfig = {\n stationaryThresholdSec: 10,\n loiteringThresholdSec: 60,\n velocityThreshold: 2,\n enteringFrames: 5,\n}\n\ninterface TrackState {\n enteredAt: number\n stationarySince: number | undefined\n totalDistancePx: number\n lastPosition: { x: number; y: number }\n frameCount: number\n}\n\nexport class StateAnalyzer {\n private readonly config: StateAnalyzerConfig\n private readonly states = new Map<string, TrackState>()\n\n constructor(config: Partial<StateAnalyzerConfig> = {}) {\n this.config = { ...DEFAULT_STATE_ANALYZER_CONFIG, ...config }\n }\n\n analyze(tracks: readonly TrackedDetection[], timestamp: number): TrackedObjectState[] {\n const currentIds = new Set(tracks.map(t => t.trackId))\n const results: TrackedObjectState[] = []\n\n for (const track of tracks) {\n let ts = this.states.get(track.trackId)\n const center = bboxCentroid({ x: track.bbox.x, y: track.bbox.y, w: track.bbox.w, h: track.bbox.h })\n\n if (!ts) {\n ts = {\n enteredAt: timestamp,\n stationarySince: undefined,\n totalDistancePx: 0,\n lastPosition: center,\n frameCount: 1,\n }\n this.states.set(track.trackId, ts)\n } else {\n const dx = center.x - ts.lastPosition.x\n const dy = center.y - ts.lastPosition.y\n const dist = Math.sqrt(dx * dx + dy * dy)\n ts.totalDistancePx += dist\n ts.lastPosition = center\n ts.frameCount++\n }\n\n const velocity = track.velocity\n ? Math.sqrt(track.velocity.dx ** 2 + track.velocity.dy ** 2)\n : 0\n const dwellTimeMs = timestamp - ts.enteredAt\n\n let state: ObjectState\n if (ts.frameCount <= this.config.enteringFrames) {\n state = 'entering'\n } else if (velocity <= this.config.velocityThreshold) {\n if (!ts.stationarySince) {\n ts.stationarySince = timestamp\n }\n const stationaryDurationSec = (timestamp - ts.stationarySince) / 1000\n if (stationaryDurationSec >= this.config.loiteringThresholdSec) {\n state = 'loitering'\n } else if (stationaryDurationSec >= this.config.stationaryThresholdSec) {\n state = 'stationary'\n } else {\n state = 'moving'\n }\n } else {\n ts.stationarySince = undefined\n state = 'moving'\n }\n\n results.push({\n trackId: track.trackId,\n state,\n stationarySince: ts.stationarySince,\n enteredAt: ts.enteredAt,\n totalDistancePx: ts.totalDistancePx,\n dwellTimeMs,\n })\n }\n\n for (const [trackId, ts] of this.states) {\n if (!currentIds.has(trackId)) {\n results.push({\n trackId,\n state: 'leaving',\n stationarySince: ts.stationarySince,\n enteredAt: ts.enteredAt,\n totalDistancePx: ts.totalDistancePx,\n dwellTimeMs: timestamp - ts.enteredAt,\n })\n this.states.delete(trackId)\n }\n }\n\n return results\n }\n\n reset(): void {\n this.states.clear()\n }\n}\n","export interface EventEmitterConfig {\n readonly minTrackAge: number\n readonly cooldownSec: number\n readonly enabledTypes: readonly string[]\n}\n\nexport const DEFAULT_EVENT_EMITTER_CONFIG: EventEmitterConfig = {\n minTrackAge: 3,\n cooldownSec: 5,\n enabledTypes: [\n 'object.entering', 'object.leaving', 'object.stationary', 'object.loitering',\n 'zone.enter', 'zone.exit', 'tripwire.cross',\n ],\n}\n","import type {\n TrackedDetection, TrackedObjectState, ZoneEvent,\n Classification, DetectionEvent, DetectionEventType,\n} from '@camstack/types'\nimport { DEFAULT_EVENT_EMITTER_CONFIG, type EventEmitterConfig } from './event-filter.js'\n\nexport type { EventEmitterConfig } from './event-filter.js'\n\nconst STATE_TO_EVENT: Record<string, DetectionEventType> = {\n entering: 'object.entering',\n leaving: 'object.leaving',\n stationary: 'object.stationary',\n loitering: 'object.loitering',\n}\n\nconst ZONE_TYPE_TO_EVENT: Record<string, DetectionEventType> = {\n 'zone-enter': 'zone.enter',\n 'zone-exit': 'zone.exit',\n 'zone-loiter': 'zone.enter',\n 'tripwire-cross': 'tripwire.cross',\n}\n\nlet eventIdCounter = 0\n\nexport class DetectionEventEmitter {\n private readonly config: EventEmitterConfig\n private readonly previousStates = new Map<string, string>()\n private readonly lastEmitted = new Map<string, number>()\n\n constructor(config: Partial<EventEmitterConfig> = {}) {\n this.config = { ...DEFAULT_EVENT_EMITTER_CONFIG, ...config }\n }\n\n emit(\n tracks: readonly TrackedDetection[],\n states: readonly TrackedObjectState[],\n zoneEvents: readonly ZoneEvent[],\n classifications: readonly Classification[],\n deviceId: string,\n ): DetectionEvent[] {\n const events: DetectionEvent[] = []\n const now = Date.now()\n const stateMap = new Map(states.map(s => [s.trackId, s]))\n const trackMap = new Map(tracks.map(t => [t.trackId, t]))\n\n for (const state of states) {\n const track = trackMap.get(state.trackId)\n if (!track) continue\n if (track.trackAge < this.config.minTrackAge) continue\n\n const eventType = STATE_TO_EVENT[state.state]\n if (!eventType) continue\n if (!this.config.enabledTypes.includes(eventType)) continue\n\n const prevState = this.previousStates.get(state.trackId)\n if (prevState === state.state) continue\n\n const cooldownKey = `${state.trackId}:${eventType}`\n const lastTime = this.lastEmitted.get(cooldownKey) ?? 0\n if ((now - lastTime) / 1000 < this.config.cooldownSec) continue\n\n this.previousStates.set(state.trackId, state.state)\n this.lastEmitted.set(cooldownKey, now)\n\n events.push({\n id: `evt-${++eventIdCounter}`,\n type: eventType,\n timestamp: now,\n deviceId,\n detection: track,\n classifications,\n objectState: state,\n zoneEvents: zoneEvents.filter(z => z.trackId === state.trackId),\n trackPath: [...track.path],\n })\n }\n\n for (const ze of zoneEvents) {\n const eventType = ZONE_TYPE_TO_EVENT[ze.type]\n if (!eventType) continue\n if (!this.config.enabledTypes.includes(eventType)) continue\n\n const track = trackMap.get(ze.trackId)\n if (!track || track.trackAge < this.config.minTrackAge) continue\n\n const state = stateMap.get(ze.trackId)\n\n events.push({\n id: `evt-${++eventIdCounter}`,\n type: eventType,\n timestamp: now,\n deviceId,\n detection: track,\n classifications,\n objectState: state ?? {\n trackId: ze.trackId, state: 'moving',\n enteredAt: now, totalDistancePx: 0, dwellTimeMs: 0,\n },\n zoneEvents: [ze],\n trackPath: [...track.path],\n })\n }\n\n for (const state of states) {\n if (state.state === 'leaving') {\n this.previousStates.delete(state.trackId)\n }\n }\n\n return events\n }\n\n reset(): void {\n this.previousStates.clear()\n this.lastEmitted.clear()\n }\n}\n","import { pointInPolygon, type Point, type BboxRect } from './geometry.js'\n\n/**\n * Calculate overlap of a bounding box with a polygon.\n * Uses sampling: divides bbox into grid, counts points inside polygon.\n * Returns fraction 0–1 (intersection area / bbox area).\n */\nexport function bboxPolygonOverlap(bbox: BboxRect, polygon: readonly Point[]): number {\n const area = bbox.w * bbox.h\n if (area <= 0) return 0\n\n const gridSize = 8\n let inside = 0\n const total = gridSize * gridSize\n\n for (let row = 0; row < gridSize; row++) {\n for (let col = 0; col < gridSize; col++) {\n const px = bbox.x + (col + 0.5) * (bbox.w / gridSize)\n const py = bbox.y + (row + 0.5) * (bbox.h / gridSize)\n if (pointInPolygon({ x: px, y: py }, polygon)) {\n inside++\n }\n }\n }\n\n return inside / total\n}\n\n/**\n * Calculate overlap of a segmentation mask with a polygon.\n * Mask is a binary array (0/1) at maskWidth×maskHeight resolution,\n * positioned at bbox within a frame of frameWidth×frameHeight.\n * Polygon points are in pixel coordinates.\n * Returns fraction 0–1 (mask pixels inside polygon / total mask pixels).\n */\nexport function maskPolygonOverlap(\n mask: Uint8Array,\n maskWidth: number,\n maskHeight: number,\n bbox: BboxRect,\n polygon: readonly Point[],\n _frameWidth: number,\n _frameHeight: number,\n): number {\n let totalMaskPixels = 0\n let insidePolygon = 0\n\n for (let my = 0; my < maskHeight; my++) {\n for (let mx = 0; mx < maskWidth; mx++) {\n if (mask[my * maskWidth + mx] === 0) continue\n totalMaskPixels++\n\n const frameX = bbox.x + (mx / maskWidth) * bbox.w\n const frameY = bbox.y + (my / maskHeight) * bbox.h\n\n if (pointInPolygon({ x: frameX, y: frameY }, polygon)) {\n insidePolygon++\n }\n }\n }\n\n if (totalMaskPixels === 0) return 0\n return insidePolygon / totalMaskPixels\n}\n","import type { CameraZone, DetectionZoneMembership, ZoneMode } from '@camstack/types'\nimport { normalizeToPixel, type BboxRect, type Point } from './geometry.js'\nimport { bboxPolygonOverlap, maskPolygonOverlap } from './overlap.js'\n\nexport interface FilterResult<T> {\n readonly passed: readonly T[]\n readonly excluded: readonly T[]\n readonly annotations: ReadonlyMap<T, readonly DetectionZoneMembership[]>\n}\n\ntype Stage = 'motion' | 'detection'\n\nexport class ZoneEngine {\n /**\n * Annotate a single detection with its zone memberships.\n * Returns zones where the detection overlaps above threshold.\n */\n annotateDetection(\n bbox: BboxRect,\n zones: readonly CameraZone[],\n frameWidth: number,\n frameHeight: number,\n mask?: Uint8Array,\n maskWidth?: number,\n maskHeight?: number,\n className?: string,\n ): DetectionZoneMembership[] {\n const memberships: DetectionZoneMembership[] = []\n\n for (const zone of zones) {\n if (zone.classFilter && zone.classFilter.length > 0 && className) {\n if (!zone.classFilter.includes(className)) continue\n }\n\n const pixelPolygon = zone.polygon.map(p => normalizeToPixel(p, frameWidth, frameHeight))\n\n let overlap: number\n if (zone.preferMask && mask && maskWidth && maskHeight) {\n overlap = maskPolygonOverlap(mask, maskWidth, maskHeight, bbox, pixelPolygon, frameWidth, frameHeight)\n } else {\n overlap = bboxPolygonOverlap(bbox, pixelPolygon)\n }\n\n if (overlap >= zone.overlapThreshold) {\n memberships.push({\n zoneId: zone.id,\n zoneName: zone.name,\n overlap,\n mode: zone.detectionMode,\n })\n }\n }\n\n return memberships\n }\n\n /**\n * Filter detections based on zone include/exclude/monitor logic for a given stage.\n */\n filterDetections<T extends BboxRect>(\n detections: readonly T[],\n zones: readonly CameraZone[],\n frameWidth: number,\n frameHeight: number,\n stage: Stage,\n getClassName?: (d: T) => string | undefined,\n getMask?: (d: T) => { mask: Uint8Array; width: number; height: number } | undefined,\n ): FilterResult<T> {\n if (zones.length === 0) {\n return {\n passed: detections,\n excluded: [],\n annotations: new Map(detections.map(d => [d, []])),\n }\n }\n\n const modeKey = stage === 'motion' ? 'motionMode' : 'detectionMode'\n const hasInclude = zones.some(z => z[modeKey] === 'include')\n\n const passed: T[] = []\n const excluded: T[] = []\n const annotations = new Map<T, DetectionZoneMembership[]>()\n\n for (const det of detections) {\n const className = getClassName?.(det)\n const maskInfo = getMask?.(det)\n const memberships = this.annotateDetection(\n det, zones, frameWidth, frameHeight,\n maskInfo?.mask, maskInfo?.width, maskInfo?.height,\n className,\n )\n annotations.set(det, memberships)\n\n // Filtering uses only include/exclude zones for this stage\n const stageMemberships = memberships.filter(m => m.mode !== 'monitor')\n\n if (hasInclude) {\n const inInclude = stageMemberships.some(m => m.mode === 'include')\n if (inInclude) {\n passed.push(det)\n } else {\n excluded.push(det)\n }\n } else {\n const inExclude = stageMemberships.some(m => m.mode === 'exclude')\n if (inExclude) {\n excluded.push(det)\n } else {\n passed.push(det)\n }\n }\n }\n\n return { passed, excluded, annotations }\n }\n\n /**\n * Generate an auto-border exclusion zone as a polygon with a hole.\n */\n generateAutoBorderZone(percent: number): CameraZone {\n const p = Math.max(0, Math.min(0.2, percent))\n return {\n id: '__auto-border-exclude',\n name: 'Auto Border Exclusion',\n polygon: [\n { x: 0, y: 0 }, { x: 0, y: 1 }, { x: 1, y: 1 }, { x: 1, y: 0 },\n { x: p, y: p }, { x: 1 - p, y: p }, { x: 1 - p, y: 1 - p }, { x: p, y: 1 - p },\n ],\n motionMode: 'exclude',\n detectionMode: 'exclude',\n overlapThreshold: 0.1,\n preferMask: false,\n color: '#888888',\n }\n }\n}\n","import type { TrackedDetection, ZoneEvent, Classification, BoundingBox, DetectionEvent, EventSnapshot } from '@camstack/types'\nimport type { TrackDetail, ObjectState } from '@camstack/types'\n\ninterface ActiveTrack {\n trackId: string\n class: string\n originalClass: string\n state: ObjectState\n firstSeen: number\n lastSeen: number\n path: Array<{ timestamp: number; bbox: BoundingBox; velocity: { dx: number; dy: number } }>\n zoneTransitions: Array<{ zoneId: string; zoneName: string; entered: number; exited?: number; dwellMs: number }>\n identity?: { name: string; confidence: number; matchedAt: number }\n plateText?: { text: string; confidence: number; readAt: number }\n subClass?: { class: string; confidence: number }\n bestSnapshot?: EventSnapshot\n events: DetectionEvent[]\n}\n\nconst MAX_PATH_LENGTH = 300\n\nexport class TrackStore {\n private readonly tracks = new Map<string, ActiveTrack>()\n\n update(\n tracked: readonly TrackedDetection[],\n zoneEvents: readonly ZoneEvent[],\n classifications: readonly Classification[],\n timestamp: number,\n ): void {\n for (const t of tracked) {\n let at = this.tracks.get(t.trackId)\n if (!at) {\n at = {\n trackId: t.trackId,\n class: t.class,\n originalClass: t.originalClass,\n state: 'entering',\n firstSeen: timestamp,\n lastSeen: timestamp,\n path: [],\n zoneTransitions: [],\n events: [],\n }\n this.tracks.set(t.trackId, at)\n }\n\n at.lastSeen = timestamp\n at.class = t.class\n at.path.push({\n timestamp,\n bbox: t.bbox,\n velocity: t.velocity ?? { dx: 0, dy: 0 },\n })\n if (at.path.length > MAX_PATH_LENGTH) at.path.shift()\n }\n\n for (const ze of zoneEvents) {\n const at = this.tracks.get(ze.trackId)\n if (!at) continue\n\n if (ze.type === 'zone-enter') {\n at.zoneTransitions.push({\n zoneId: ze.zoneId,\n zoneName: ze.zoneName,\n entered: ze.timestamp,\n dwellMs: 0,\n })\n } else if (ze.type === 'zone-exit') {\n const transition = [...at.zoneTransitions].reverse().find(\n zt => zt.zoneId === ze.zoneId && !zt.exited,\n )\n if (transition) {\n transition.exited = ze.timestamp\n transition.dwellMs = ze.timestamp - transition.entered\n }\n }\n }\n }\n\n addEvent(trackId: string, event: DetectionEvent): void {\n const at = this.tracks.get(trackId)\n if (at) {\n at.events.push(event)\n if (!at.bestSnapshot && event.snapshot) {\n at.bestSnapshot = event.snapshot\n }\n }\n }\n\n getTrackDetail(trackId: string): TrackDetail | null {\n const at = this.tracks.get(trackId)\n if (!at) return null\n return this.toDetail(at)\n }\n\n finishTrack(trackId: string): TrackDetail | null {\n const at = this.tracks.get(trackId)\n if (!at) return null\n this.tracks.delete(trackId)\n return this.toDetail(at)\n }\n\n getActiveTrackIds(): string[] {\n return [...this.tracks.keys()]\n }\n\n reset(): void {\n this.tracks.clear()\n }\n\n private toDetail(at: ActiveTrack): TrackDetail {\n return {\n trackId: at.trackId,\n class: at.class,\n originalClass: at.originalClass,\n state: at.state,\n firstSeen: at.firstSeen,\n lastSeen: at.lastSeen,\n totalDwellMs: at.lastSeen - at.firstSeen,\n path: at.path,\n identity: at.identity,\n plateText: at.plateText,\n subClass: at.subClass,\n zoneTransitions: at.zoneTransitions,\n bestSnapshot: at.bestSnapshot,\n events: at.events,\n }\n }\n}\n","import type { HeatmapData } from '@camstack/types'\n\nexport class HeatmapAggregator {\n private readonly gridSize: number\n private readonly cells: Float32Array\n private maxCount = 0\n private _totalPoints = 0\n\n constructor(gridSize = 32) {\n this.gridSize = gridSize\n this.cells = new Float32Array(gridSize * gridSize)\n }\n\n get totalPoints(): number {\n return this._totalPoints\n }\n\n addPoint(x: number, y: number): void {\n const col = Math.min(this.gridSize - 1, Math.max(0, Math.floor(x * this.gridSize)))\n const row = Math.min(this.gridSize - 1, Math.max(0, Math.floor(y * this.gridSize)))\n const idx = row * this.gridSize + col\n this.cells[idx]++\n if (this.cells[idx] > this.maxCount) this.maxCount = this.cells[idx]\n this._totalPoints++\n }\n\n getHeatmap(): HeatmapData {\n return {\n width: this.gridSize,\n height: this.gridSize,\n gridSize: this.gridSize,\n cells: new Float32Array(this.cells),\n maxCount: this.maxCount,\n }\n }\n\n reset(): void {\n this.cells.fill(0)\n this.maxCount = 0\n this._totalPoints = 0\n }\n}\n","import type {\n ICameraAnalyticsProvider, CameraLiveState, TrackedObjectSummary,\n ZoneLiveState, TrackFilter, ZoneHistoryPoint, HeatmapData,\n HeatmapOptions, TimeRangeOptions, TrackDetail, PipelineStatus,\n} from '@camstack/types'\nimport { TrackStore } from './track-store.js'\nimport { HeatmapAggregator } from './heatmap.js'\n\nexport class AnalyticsProvider implements ICameraAnalyticsProvider {\n private readonly liveStates = new Map<string, CameraLiveState>()\n private readonly trackStores = new Map<string, TrackStore>()\n private readonly heatmaps = new Map<string, HeatmapAggregator>()\n\n updateLiveState(deviceId: string, state: CameraLiveState): void {\n this.liveStates.set(deviceId, state)\n }\n\n getTrackStore(deviceId: string): TrackStore {\n let store = this.trackStores.get(deviceId)\n if (!store) {\n store = new TrackStore()\n this.trackStores.set(deviceId, store)\n }\n return store\n }\n\n getHeatmapAggregator(deviceId: string, gridSize = 32): HeatmapAggregator {\n let hm = this.heatmaps.get(deviceId)\n if (!hm) {\n hm = new HeatmapAggregator(gridSize)\n this.heatmaps.set(deviceId, hm)\n }\n return hm\n }\n\n getLiveState(deviceId: string): CameraLiveState | null {\n return this.liveStates.get(deviceId) ?? null\n }\n\n getTracks(deviceId: string, filter?: TrackFilter): TrackedObjectSummary[] {\n const state = this.liveStates.get(deviceId)\n if (!state) return []\n let tracks = [...state.tracks]\n if (filter?.class) tracks = tracks.filter(t => filter.class!.includes(t.class))\n if (filter?.state) tracks = tracks.filter(t => filter.state!.includes(t.state))\n if (filter?.minDwellMs) tracks = tracks.filter(t => t.dwellTimeMs >= filter.minDwellMs!)\n return tracks\n }\n\n getZoneState(deviceId: string, zoneId: string): ZoneLiveState | null {\n const state = this.liveStates.get(deviceId)\n return state?.zones.find(z => z.zoneId === zoneId) ?? null\n }\n\n async getZoneHistory(_deviceId: string, _zoneId: string, _options: TimeRangeOptions): Promise<ZoneHistoryPoint[]> {\n return []\n }\n\n async getHeatmap(deviceId: string, _options: HeatmapOptions): Promise<HeatmapData> {\n const hm = this.heatmaps.get(deviceId)\n return hm?.getHeatmap() ?? { width: 32, height: 32, gridSize: 32, cells: new Float32Array(32 * 32), maxCount: 0 }\n }\n\n getTrackDetail(deviceId: string, trackId: string): TrackDetail | null {\n const store = this.trackStores.get(deviceId)\n return store?.getTrackDetail(trackId) ?? null\n }\n\n getCameraStatus(_deviceId: string): PipelineStatus[] {\n return []\n }\n}\n","import type {\n TrackedDetection, TrackedObjectState, CameraLiveState,\n TrackedObjectSummary, ZoneLiveState, PipelineStatus, DetectionEvent,\n} from '@camstack/types'\n\nconst FPS_WINDOW_MS = 5000\n\nexport class LiveStateManager {\n private readonly frameTimes: number[] = []\n private readonly pipelineTimes: number[] = []\n\n buildState(\n deviceId: string,\n tracks: readonly TrackedDetection[],\n states: readonly TrackedObjectState[],\n pipelineStatus: readonly PipelineStatus[],\n timestamp: number,\n lastEvent?: DetectionEvent,\n pipelineMs?: number,\n ): CameraLiveState {\n this.frameTimes.push(timestamp)\n const cutoff = timestamp - FPS_WINDOW_MS\n while (this.frameTimes.length > 0 && this.frameTimes[0] < cutoff) this.frameTimes.shift()\n const currentFps = this.frameTimes.length > 1\n ? (this.frameTimes.length - 1) / ((this.frameTimes[this.frameTimes.length - 1] - this.frameTimes[0]) / 1000)\n : 0\n\n if (pipelineMs !== undefined) {\n this.pipelineTimes.push(pipelineMs)\n if (this.pipelineTimes.length > 100) this.pipelineTimes.shift()\n }\n const avgPipelineMs = this.pipelineTimes.length > 0\n ? this.pipelineTimes.reduce((a, b) => a + b, 0) / this.pipelineTimes.length\n : 0\n\n const stateMap = new Map(states.map(s => [s.trackId, s]))\n\n const objectCounts: Record<string, number> = {}\n let moving = 0, stationary = 0\n const trackSummaries: TrackedObjectSummary[] = []\n\n for (const t of tracks) {\n objectCounts[t.class] = (objectCounts[t.class] ?? 0) + 1\n const s = stateMap.get(t.trackId)\n if (s?.state === 'moving' || s?.state === 'entering') moving++\n if (s?.state === 'stationary' || s?.state === 'loitering') stationary++\n\n trackSummaries.push({\n trackId: t.trackId,\n class: t.class,\n originalClass: t.originalClass,\n state: s?.state ?? 'entering',\n bbox: t.bbox,\n velocity: t.velocity ?? { dx: 0, dy: 0 },\n dwellTimeMs: s?.dwellTimeMs ?? 0,\n inZones: [],\n })\n }\n\n return {\n deviceId,\n lastFrameTimestamp: timestamp,\n activeObjects: tracks.length,\n movingObjects: moving,\n stationaryObjects: stationary,\n objectCounts,\n tracks: trackSummaries,\n zones: [],\n lastEvent,\n pipelineStatus: [...pipelineStatus],\n avgPipelineMs,\n currentFps,\n }\n }\n\n reset(): void {\n this.frameTimes.length = 0\n this.pipelineTimes.length = 0\n }\n}\n","import type {\n ICamstackAddon,\n AddonManifest,\n AddonContext,\n CapabilityProviderMap,\n FrameInput,\n PipelineRunResult,\n PipelineConfig,\n CameraZone,\n MotionSource,\n KnownFace,\n KnownPlate,\n DetectionEvent,\n CameraLiveState,\n TrackedObjectSummary,\n ZoneLiveState,\n TrackFilter,\n ZoneHistoryPoint,\n HeatmapData,\n HeatmapOptions,\n TimeRangeOptions,\n TrackDetail,\n PipelineStatus,\n SpatialDetection,\n BoundingBox,\n} from '@camstack/types'\nimport type { BboxRect } from '../zones/geometry.js'\nimport { SortTracker } from '../tracker/sort-tracker.js'\nimport { StateAnalyzer } from '../tracker/state-analyzer.js'\nimport { DetectionEventEmitter } from '../events/event-emitter.js'\nimport { ZoneEngine } from '../zones/zone-engine.js'\nimport { AnalyticsProvider } from '../analytics/analytics-provider.js'\nimport { LiveStateManager } from '../analytics/live-state.js'\n\n/**\n * Intermediate shape that satisfies BboxRect (for ZoneEngine.filterDetections)\n * while carrying the original SpatialDetection fields.\n *\n * ZoneEngine.filterDetections<T extends BboxRect> uses T.x / T.y / T.w / T.h\n * directly, so we spread the bbox fields onto the top level.\n */\ninterface FlatDetection extends BboxRect {\n readonly detection: SpatialDetection\n}\n\ninterface CameraState {\n readonly tracker: SortTracker\n readonly stateAnalyzer: StateAnalyzer\n readonly eventEmitter: DetectionEventEmitter\n readonly liveStateManager: LiveStateManager\n zones: readonly CameraZone[]\n pipelineStatus: readonly PipelineStatus[]\n}\n\n/**\n * AnalysisPipeline — the main per-camera orchestrator.\n *\n * Implements IAnalysisAddon (extends ICamstackAddon + ICameraAnalyticsProvider).\n * Per-camera state is keyed by deviceId.\n *\n * processFrame pipeline:\n * PipelineRunResult → convert bboxes → zone filter → track → analyze state\n * → emit events → update analytics → notify callbacks\n */\nexport class AnalysisPipeline implements ICamstackAddon {\n readonly manifest: AddonManifest = {\n id: 'analysis-pipeline',\n name: 'Analysis Pipeline',\n version: '0.1.0',\n description: 'Per-camera zone engine, tracker, event emitter and analytics',\n capabilities: [{ name: 'analysis-pipeline', mode: 'singleton' as const }],\n passive: true,\n }\n\n private readonly cameraStates = new Map<string, CameraState>()\n private readonly analytics = new AnalyticsProvider()\n private readonly liveStateCallbacks = new Map<string, Set<(state: CameraLiveState) => void>>()\n\n // --------------------------------------------------------------------------\n // ICamstackAddon\n // --------------------------------------------------------------------------\n\n async initialize(_context: AddonContext): Promise<void> {\n // No initialization required — per-camera state is lazily created\n }\n\n async shutdown(): Promise<void> {\n this.cameraStates.clear()\n this.liveStateCallbacks.clear()\n }\n\n getCapabilityProvider<K extends keyof CapabilityProviderMap>(\n name: K,\n ): CapabilityProviderMap[K] | null {\n if (name === 'analysis-pipeline') {\n return this as unknown as CapabilityProviderMap[K]\n }\n return null\n }\n\n // --------------------------------------------------------------------------\n // IAnalysisAddon — configuration\n // --------------------------------------------------------------------------\n\n setCameraPipeline(deviceId: string, _config: PipelineConfig): void {\n this.ensureCameraState(deviceId)\n }\n\n setCameraZones(deviceId: string, zones: readonly CameraZone[]): void {\n const state = this.ensureCameraState(deviceId)\n // Produce new state object with updated zones (immutable update)\n this.cameraStates.set(deviceId, { ...state, zones })\n }\n\n setCameraMotionConfig(_deviceId: string, _source: MotionSource): void {\n // Motion source config stored for future use; no per-frame action needed now\n }\n\n setKnownFaces(_faces: KnownFace[]): void {\n // Reserved for future face-recognition integration\n }\n\n setKnownPlates(_plates: KnownPlate[]): void {\n // Reserved for future plate-recognition integration\n }\n\n onLiveStateChange(\n deviceId: string,\n callback: (state: CameraLiveState) => void,\n ): () => void {\n let callbacks = this.liveStateCallbacks.get(deviceId)\n if (!callbacks) {\n callbacks = new Set()\n this.liveStateCallbacks.set(deviceId, callbacks)\n }\n callbacks.add(callback)\n return () => {\n this.liveStateCallbacks.get(deviceId)?.delete(callback)\n }\n }\n\n // --------------------------------------------------------------------------\n // IAnalysisAddon — frame processing\n // The interface declares (deviceId, frame) but callers may pass an optional\n // PipelineRunResult as a third argument; we accept it here.\n // --------------------------------------------------------------------------\n\n async processFrame(\n deviceId: string,\n frame: FrameInput,\n pipelineResult?: PipelineRunResult,\n ): Promise<DetectionEvent[]> {\n const state = this.ensureCameraState(deviceId)\n const timestamp = frame.timestamp\n\n // 1. Extract raw SpatialDetections from PipelineRunResult, flattened for ZoneEngine\n const frameWidth = pipelineResult?.imageWidth ?? frame.width\n const frameHeight = pipelineResult?.imageHeight ?? frame.height\n\n const flatDetections: FlatDetection[] = pipelineResult\n ? pipelineResult.detections.map(det => {\n const bbox = this.convertBbox(det.bbox)\n const detection: SpatialDetection = {\n class: det.className,\n originalClass: det.originalClass ?? det.className,\n score: det.confidence,\n bbox,\n }\n return { ...bbox, detection }\n })\n : []\n\n // 2. Zone filter (detection stage)\n const zoneEngine = new ZoneEngine()\n\n const { passed: filteredFlat } = zoneEngine.filterDetections(\n flatDetections,\n state.zones,\n frameWidth,\n frameHeight,\n 'detection',\n fd => fd.detection.class,\n )\n\n // Unwrap back to SpatialDetection for the tracker\n const filteredDetections: SpatialDetection[] = filteredFlat.map(fd => fd.detection)\n\n // 3. Track filtered detections\n const trackedDetections = state.tracker.update(filteredDetections, timestamp)\n\n // 4. Analyze object states\n const objectStates = state.stateAnalyzer.analyze(trackedDetections, timestamp)\n\n // 5. Emit detection events (no zone events or classifications at this stage)\n const events = state.eventEmitter.emit(\n trackedDetections,\n objectStates,\n [],\n [],\n deviceId,\n )\n\n // 6. Update TrackStore\n const trackStore = this.analytics.getTrackStore(deviceId)\n trackStore.update(trackedDetections, [], [], timestamp)\n\n // 7. Update heatmap with track centroids\n const heatmap = this.analytics.getHeatmapAggregator(deviceId)\n for (const t of trackedDetections) {\n const cx = (t.bbox.x + t.bbox.w / 2) / frameWidth\n const cy = (t.bbox.y + t.bbox.h / 2) / frameHeight\n heatmap.addPoint(cx, cy)\n }\n\n // 8. Attach events to TrackStore\n for (const event of events) {\n trackStore.addEvent(event.detection.trackId, event)\n }\n\n // 9. Build and store live state\n const liveState = state.liveStateManager.buildState(\n deviceId,\n trackedDetections,\n objectStates,\n state.pipelineStatus,\n timestamp,\n events[events.length - 1],\n pipelineResult?.totalMs,\n )\n this.analytics.updateLiveState(deviceId, liveState)\n\n // 10. Notify live state callbacks\n const callbacks = this.liveStateCallbacks.get(deviceId)\n if (callbacks && callbacks.size > 0) {\n for (const cb of callbacks) {\n cb(liveState)\n }\n }\n\n return events\n }\n\n // --------------------------------------------------------------------------\n // ICameraAnalyticsProvider\n // --------------------------------------------------------------------------\n\n getLiveState(deviceId: string): CameraLiveState | null {\n return this.analytics.getLiveState(deviceId)\n }\n\n getTracks(deviceId: string, filter?: TrackFilter): TrackedObjectSummary[] {\n return this.analytics.getTracks(deviceId, filter)\n }\n\n getZoneState(deviceId: string, zoneId: string): ZoneLiveState | null {\n return this.analytics.getZoneState(deviceId, zoneId)\n }\n\n async getZoneHistory(\n deviceId: string,\n zoneId: string,\n options: TimeRangeOptions,\n ): Promise<ZoneHistoryPoint[]> {\n return this.analytics.getZoneHistory(deviceId, zoneId, options)\n }\n\n async getHeatmap(deviceId: string, options: HeatmapOptions): Promise<HeatmapData> {\n return this.analytics.getHeatmap(deviceId, options)\n }\n\n getTrackDetail(deviceId: string, trackId: string): TrackDetail | null {\n return this.analytics.getTrackDetail(deviceId, trackId)\n }\n\n getCameraStatus(deviceId: string): PipelineStatus[] {\n return this.analytics.getCameraStatus(deviceId)\n }\n\n // --------------------------------------------------------------------------\n // Private helpers\n // --------------------------------------------------------------------------\n\n private ensureCameraState(deviceId: string): CameraState {\n let state = this.cameraStates.get(deviceId)\n if (!state) {\n state = {\n tracker: new SortTracker(),\n stateAnalyzer: new StateAnalyzer(),\n eventEmitter: new DetectionEventEmitter(),\n liveStateManager: new LiveStateManager(),\n zones: [],\n pipelineStatus: [],\n }\n this.cameraStates.set(deviceId, state)\n }\n return state\n }\n\n /**\n * Convert PipelineDetection bbox [x1, y1, x2, y2] to BoundingBox {x, y, w, h}.\n * Pipeline bboxes are in pixel coordinates.\n */\n private convertBbox(bbox: readonly [number, number, number, number]): BoundingBox {\n const [x1, y1, x2, y2] = bbox\n return { x: x1, y: y1, w: x2 - x1, h: y2 - y1 }\n }\n}\n","import type { ICamstackAddon, AddonManifest, AddonContext, CapabilityProviderMap } from '@camstack/types'\nimport { AnalysisPipeline } from './pipeline/analysis-pipeline.js'\n\nexport class AnalysisPipelineAddon implements ICamstackAddon {\n readonly manifest: AddonManifest = {\n id: 'pipeline-analysis',\n name: 'Pipeline Analysis',\n version: '0.1.0',\n description: 'Zone engine, object tracker, and analytics for detection pipeline',\n capabilities: [\n { name: 'analysis-pipeline', mode: 'singleton' as const },\n ],\n }\n\n private pipeline: AnalysisPipeline | null = null\n\n async initialize(context: AddonContext): Promise<void> {\n this.pipeline = new AnalysisPipeline()\n await this.pipeline.initialize(context)\n context.logger.info('Pipeline Analysis addon initialized')\n }\n\n async shutdown(): Promise<void> {\n await this.pipeline?.shutdown()\n this.pipeline = null\n }\n\n getCapabilityProvider<K extends keyof CapabilityProviderMap>(\n name: K,\n ): CapabilityProviderMap[K] | null {\n if (name === 'analysis-pipeline') {\n return this.pipeline as unknown as CapabilityProviderMap[K]\n }\n return null\n }\n}\n"],"mappings":"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","names":["MAX_PATH_LENGTH"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-pipeline-analysis",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Zone engine, object tracker, and analytics for CamStack detection pipeline",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"dev": "tsup --watch",
|
|
39
39
|
"typecheck": "tsc --noEmit",
|
|
40
40
|
"test": "vitest run",
|
|
41
|
-
"test:watch": "vitest"
|
|
41
|
+
"test:watch": "vitest",
|
|
42
|
+
"publish": "npm publish --access public"
|
|
42
43
|
},
|
|
43
44
|
"peerDependencies": {
|
|
44
45
|
"@camstack/types": "^0.1.0"
|