@camstack/addon-pipeline 1.2.101 → 1.2.103
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-utils-eUS6n_Zj.js → addon-utils-CLc6yHCN.js} +1 -1
- package/dist/audio-analyzer/index.js +3 -3
- package/dist/audio-analyzer/index.mjs +2 -2
- package/dist/detection-pipeline/index.js +163 -42
- package/dist/detection-pipeline/index.mjs +161 -40
- package/dist/{dist-dm3t4BOt.js → dist-C11WuNUP.js} +87 -51
- package/dist/{dist-gXdWP96z.mjs → dist-Ccmt3fGJ.mjs} +82 -52
- package/dist/{event-loop-stall-monitor-Lki2_mYY.js → event-loop-stall-monitor-Cq_NeC4o.js} +175 -132
- package/dist/{event-loop-stall-monitor-TnQ21mu0.mjs → event-loop-stall-monitor-OJrOMeuu.mjs} +170 -133
- package/dist/{lazy-sharp-oYppDIZR.js → lazy-sharp-RxUs6on_.js} +1 -1
- package/dist/motion-wasm/index.js +2 -2
- package/dist/motion-wasm/index.mjs +1 -1
- package/dist/pipeline-runner/index.js +5 -4
- package/dist/pipeline-runner/index.mjs +4 -3
- package/dist/{process-memory-CKWh609B.mjs → process-memory-D0zDmXLI.mjs} +1 -1
- package/dist/{process-memory-vkFVOdkV.js → process-memory-DOjQ3MgC.js} +1 -1
- package/dist/recorder/index.js +2 -2
- package/dist/recorder/index.mjs +1 -1
- package/dist/session-decode/decode-worker-child.js +2 -2
- package/dist/session-decode/decode-worker-child.mjs +1 -1
- package/dist/stream-broker/_stub.js +1 -1
- package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C4fRkYcj.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BdgcF1lL.mjs} +2 -2
- package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-zT-cYUdF.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DY31bUCj.mjs} +1 -1
- package/dist/stream-broker/{hostInit-CS6xpCdb.mjs → hostInit-Da9wVA2r.mjs} +2 -2
- package/dist/stream-broker/index.js +31 -11
- package/dist/stream-broker/index.mjs +31 -11
- package/dist/stream-broker/remoteEntry.js +1 -1
- package/dist/{worker-protocol-BrlrMxXu.js → worker-protocol-BePduZVV.js} +1 -1
- package/dist/{worker-protocol-DJWdPLKF.mjs → worker-protocol-DDpliBIW.mjs} +1 -1
- package/package.json +1 -1
- package/python/postprocessors/ctc.py +56 -3
- package/python/postprocessors/test_ctc.py +37 -0
package/dist/{event-loop-stall-monitor-TnQ21mu0.mjs → event-loop-stall-monitor-OJrOMeuu.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { W as hfModelUrl, a as COCO_80_LABELS, k as audioKindId, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-Ccmt3fGJ.mjs";
|
|
2
2
|
import { PerformanceObserver } from "node:perf_hooks";
|
|
3
3
|
//#region src/detection-pipeline/registry/model-catalogs.ts
|
|
4
4
|
var HF_REPO = "camstack/camstack-models";
|
|
@@ -48,7 +48,8 @@ var ovPrecisionVariant = (baseId, ovDir, baseName, precision, sizeMB, legacy = f
|
|
|
48
48
|
...precision === "int8" ? { group: {
|
|
49
49
|
family: baseId.slice(0, -1),
|
|
50
50
|
tier: baseId.slice(-1),
|
|
51
|
-
precision: "int8"
|
|
51
|
+
precision: "int8",
|
|
52
|
+
resolution: 640
|
|
52
53
|
} } : {}
|
|
53
54
|
});
|
|
54
55
|
var MLPACKAGE_FILES = [
|
|
@@ -191,7 +192,8 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
191
192
|
id: "yolo26n",
|
|
192
193
|
group: {
|
|
193
194
|
family: "yolo26",
|
|
194
|
-
tier: "n"
|
|
195
|
+
tier: "n",
|
|
196
|
+
resolution: 640
|
|
195
197
|
},
|
|
196
198
|
name: "YOLO26 Nano",
|
|
197
199
|
description: "YOLO26 Nano — latest generation ultra-lightweight detector with attention mechanism",
|
|
@@ -220,7 +222,8 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
220
222
|
id: "yolo26s",
|
|
221
223
|
group: {
|
|
222
224
|
family: "yolo26",
|
|
223
|
-
tier: "s"
|
|
225
|
+
tier: "s",
|
|
226
|
+
resolution: 640
|
|
224
227
|
},
|
|
225
228
|
name: "YOLO26 Small",
|
|
226
229
|
description: "YOLO26 Small — balanced speed/accuracy with attention-based architecture",
|
|
@@ -249,7 +252,8 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
249
252
|
id: "yolo26m",
|
|
250
253
|
group: {
|
|
251
254
|
family: "yolo26",
|
|
252
|
-
tier: "m"
|
|
255
|
+
tier: "m",
|
|
256
|
+
resolution: 640
|
|
253
257
|
},
|
|
254
258
|
name: "YOLO26 Medium",
|
|
255
259
|
description: "YOLO26 Medium — high accuracy general-purpose detector",
|
|
@@ -278,7 +282,8 @@ var OBJECT_DETECTION_MODELS = [
|
|
|
278
282
|
id: "yolo26l",
|
|
279
283
|
group: {
|
|
280
284
|
family: "yolo26",
|
|
281
|
-
tier: "l"
|
|
285
|
+
tier: "l",
|
|
286
|
+
resolution: 640
|
|
282
287
|
},
|
|
283
288
|
name: "YOLO26 Large",
|
|
284
289
|
description: "YOLO26 Large — maximum accuracy for demanding deployments",
|
|
@@ -474,7 +479,7 @@ var FACE_DETECTION_MODELS = [
|
|
|
474
479
|
{
|
|
475
480
|
id: "scrfd-2.5g",
|
|
476
481
|
name: "SCRFD 2.5G",
|
|
477
|
-
description: "SCRFD 2.5G — balanced face detection
|
|
482
|
+
description: "SCRFD 2.5G bnkps — balanced face detection with 5 keypoints (WIDER FACE 93.80/92.02/77.13). InsightFace pretrained weights.",
|
|
478
483
|
inputSize: {
|
|
479
484
|
width: 640,
|
|
480
485
|
height: 640
|
|
@@ -484,6 +489,7 @@ var FACE_DETECTION_MODELS = [
|
|
|
484
489
|
name: "Face"
|
|
485
490
|
}],
|
|
486
491
|
preprocessMode: "letterbox",
|
|
492
|
+
license: "InsightFace-NonCommercial-Research",
|
|
487
493
|
formats: {
|
|
488
494
|
onnx: {
|
|
489
495
|
url: hf("faceDetection/scrfd/onnx/camstack-scrfd-2.5g.onnx"),
|
|
@@ -512,6 +518,7 @@ var FACE_DETECTION_MODELS = [
|
|
|
512
518
|
name: "Face"
|
|
513
519
|
}],
|
|
514
520
|
preprocessMode: "letterbox",
|
|
521
|
+
license: "UNKNOWN",
|
|
515
522
|
formats: {
|
|
516
523
|
onnx: {
|
|
517
524
|
url: hfScrypted("onnx/scrypted_yolov9t_relu_face/scrypted_yolov9t_relu_face.onnx"),
|
|
@@ -550,63 +557,98 @@ var FACE_DETECTION_MODELS = [
|
|
|
550
557
|
} }
|
|
551
558
|
}
|
|
552
559
|
];
|
|
553
|
-
var FACE_EMBEDDING_MODELS = [
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
inputLayout: "nhwc",
|
|
562
|
-
labels: [{
|
|
563
|
-
id: "embedding",
|
|
564
|
-
name: "Face Embedding"
|
|
565
|
-
}],
|
|
566
|
-
preprocessMode: "resize",
|
|
567
|
-
faceAlignment: true,
|
|
568
|
-
formats: {
|
|
569
|
-
onnx: {
|
|
570
|
-
url: hf("faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx"),
|
|
571
|
-
sizeMB: 130
|
|
572
|
-
},
|
|
573
|
-
coreml: {
|
|
574
|
-
url: hf("faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage"),
|
|
575
|
-
sizeMB: 65,
|
|
576
|
-
isDirectory: true,
|
|
577
|
-
files: [...MLPACKAGE_FILES],
|
|
578
|
-
runtimes: ["python"]
|
|
560
|
+
var FACE_EMBEDDING_MODELS = [
|
|
561
|
+
{
|
|
562
|
+
id: "arcface-r100",
|
|
563
|
+
name: "ArcFace (ResNet34)",
|
|
564
|
+
description: "ArcFace ResNet34 — face recognition embeddings (512-d). NOTE: despite the `arcface-r100` id this is a ResNet34, not a ResNet-100 (verified 2026-08-19).",
|
|
565
|
+
inputSize: {
|
|
566
|
+
width: 112,
|
|
567
|
+
height: 112
|
|
579
568
|
},
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
569
|
+
inputLayout: "nhwc",
|
|
570
|
+
labels: [{
|
|
571
|
+
id: "embedding",
|
|
572
|
+
name: "Face Embedding"
|
|
573
|
+
}],
|
|
574
|
+
preprocessMode: "resize",
|
|
575
|
+
faceAlignment: true,
|
|
576
|
+
license: "UNKNOWN",
|
|
577
|
+
formats: {
|
|
578
|
+
onnx: {
|
|
579
|
+
url: hf("faceRecognition/arcface/onnx/camstack-arcface-arcface.onnx"),
|
|
580
|
+
sizeMB: 130
|
|
581
|
+
},
|
|
582
|
+
coreml: {
|
|
583
|
+
url: hf("faceRecognition/arcface/coreml/camstack-arcface-r100.mlpackage"),
|
|
584
|
+
sizeMB: 65,
|
|
585
|
+
isDirectory: true,
|
|
586
|
+
files: [...MLPACKAGE_FILES],
|
|
587
|
+
runtimes: ["python"]
|
|
588
|
+
},
|
|
589
|
+
openvino: ovFormat(hf("faceRecognition/arcface/openvino/camstack-arcface-r100.xml"), 65)
|
|
590
|
+
}
|
|
589
591
|
},
|
|
590
|
-
|
|
591
|
-
id: "
|
|
592
|
-
name: "
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
url: hfScrypted("onnx/inception_resnet_v1/inception_resnet_v1.onnx"),
|
|
598
|
-
sizeMB: 89.6
|
|
592
|
+
{
|
|
593
|
+
id: "auraface-r100",
|
|
594
|
+
name: "AuraFace R100",
|
|
595
|
+
description: "AuraFace v1 (fal.ai) — iResNet-100 ArcFace face recognition embeddings (512-d), Apache-2.0. Benchmarks published by fal: LFW 99.65, CFP-FP 95.19, AgeDB 96.10, CALFW 94.70, CPLFW 90.93. Genuinely a ResNet-100 (65 M params) — roughly twice the depth of the `arcface-r100` entry, which is a ResNet34.",
|
|
596
|
+
inputSize: {
|
|
597
|
+
width: 112,
|
|
598
|
+
height: 112
|
|
599
599
|
},
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
600
|
+
labels: [{
|
|
601
|
+
id: "embedding",
|
|
602
|
+
name: "Face Embedding"
|
|
603
|
+
}],
|
|
604
|
+
preprocessMode: "resize",
|
|
605
|
+
faceAlignment: true,
|
|
606
|
+
license: "Apache-2.0",
|
|
607
|
+
formats: {
|
|
608
|
+
onnx: {
|
|
609
|
+
url: hf("faceRecognition/auraface/onnx/camstack-auraface-r100.onnx"),
|
|
610
|
+
sizeMB: 261
|
|
611
|
+
},
|
|
612
|
+
coreml: {
|
|
613
|
+
url: hf("faceRecognition/auraface/coreml/camstack-auraface-r100.mlpackage"),
|
|
614
|
+
sizeMB: 131,
|
|
615
|
+
isDirectory: true,
|
|
616
|
+
files: [...MLPACKAGE_FILES],
|
|
617
|
+
runtimes: ["python"]
|
|
618
|
+
},
|
|
619
|
+
openvino: ovFormat(hf("faceRecognition/auraface/openvino/camstack-auraface-r100.xml"), 131)
|
|
620
|
+
}
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
id: "inception-resnet-v1",
|
|
624
|
+
name: "Inception ResNet V1",
|
|
625
|
+
description: "FaceNet-style face recognition embeddings (512-d) — hosted on plugin-models HF repo",
|
|
626
|
+
inputSize: {
|
|
627
|
+
width: 160,
|
|
628
|
+
height: 160
|
|
606
629
|
},
|
|
607
|
-
|
|
630
|
+
labels: [{
|
|
631
|
+
id: "embedding",
|
|
632
|
+
name: "Face Embedding"
|
|
633
|
+
}],
|
|
634
|
+
preprocessMode: "resize",
|
|
635
|
+
license: "UNKNOWN",
|
|
636
|
+
formats: {
|
|
637
|
+
onnx: {
|
|
638
|
+
url: hfScrypted("onnx/inception_resnet_v1/inception_resnet_v1.onnx"),
|
|
639
|
+
sizeMB: 89.6
|
|
640
|
+
},
|
|
641
|
+
coreml: {
|
|
642
|
+
url: hfScrypted("coreml/inception_resnet_v1/inception_resnet_v1.mlpackage"),
|
|
643
|
+
sizeMB: 45,
|
|
644
|
+
isDirectory: true,
|
|
645
|
+
files: [...MLPACKAGE_FILES],
|
|
646
|
+
runtimes: ["python"]
|
|
647
|
+
},
|
|
648
|
+
openvino: ovFormat(hf("faceRecognition/inception-resnet-v1/openvino/camstack-inception-resnet-v1.xml"), 45)
|
|
649
|
+
}
|
|
608
650
|
}
|
|
609
|
-
|
|
651
|
+
];
|
|
610
652
|
var PLATE_DETECTION_MODELS = [{
|
|
611
653
|
id: "yolov8n-plate",
|
|
612
654
|
name: "YOLOv8 Nano — License Plate",
|
|
@@ -1192,6 +1234,22 @@ var AUDIO_CLASSIFIER_MODELS = [{
|
|
|
1192
1234
|
} }
|
|
1193
1235
|
}];
|
|
1194
1236
|
//#endregion
|
|
1237
|
+
//#region src/detection-pipeline/pipeline/landmark-precision-gate.ts
|
|
1238
|
+
/**
|
|
1239
|
+
* `null` = admit. A verdict = refuse, carrying both numbers so the caller can
|
|
1240
|
+
* name them in a log. Pure.
|
|
1241
|
+
*/
|
|
1242
|
+
function landmarkPrecisionVerdict(input) {
|
|
1243
|
+
const { detectionShortSidePx, floorPx } = input;
|
|
1244
|
+
if (!(floorPx > 0)) return null;
|
|
1245
|
+
if (!Number.isFinite(detectionShortSidePx)) return null;
|
|
1246
|
+
if (detectionShortSidePx >= floorPx) return null;
|
|
1247
|
+
return {
|
|
1248
|
+
detectionShortSidePx,
|
|
1249
|
+
floorPx
|
|
1250
|
+
};
|
|
1251
|
+
}
|
|
1252
|
+
//#endregion
|
|
1195
1253
|
//#region src/detection-pipeline/registry/step-definitions.ts
|
|
1196
1254
|
var ANIMAL_10_LABELS = [
|
|
1197
1255
|
"cat",
|
|
@@ -1272,7 +1330,7 @@ var ObjectDetectionStep = class {
|
|
|
1272
1330
|
type: "multiselect",
|
|
1273
1331
|
key: "enabledMacroClasses",
|
|
1274
1332
|
label: "Enabled Classes",
|
|
1275
|
-
description: "Which macro classes to detect (empty =
|
|
1333
|
+
description: "Which macro classes to detect (empty = every class listed here).",
|
|
1276
1334
|
options: [
|
|
1277
1335
|
{
|
|
1278
1336
|
value: "person",
|
|
@@ -1285,10 +1343,6 @@ var ObjectDetectionStep = class {
|
|
|
1285
1343
|
{
|
|
1286
1344
|
value: "animal",
|
|
1287
1345
|
label: "Animal"
|
|
1288
|
-
},
|
|
1289
|
-
{
|
|
1290
|
-
value: "package",
|
|
1291
|
-
label: "Package"
|
|
1292
1346
|
}
|
|
1293
1347
|
],
|
|
1294
1348
|
default: [
|
|
@@ -1341,21 +1395,6 @@ var ObjectDetectionStep = class {
|
|
|
1341
1395
|
default: .5,
|
|
1342
1396
|
showValue: true
|
|
1343
1397
|
},
|
|
1344
|
-
{
|
|
1345
|
-
type: "slider",
|
|
1346
|
-
key: "minConfidencePackage",
|
|
1347
|
-
label: "Min Confidence — Package",
|
|
1348
|
-
description: "Drop package predictions below this score.",
|
|
1349
|
-
min: 0,
|
|
1350
|
-
max: 1,
|
|
1351
|
-
step: .05,
|
|
1352
|
-
default: .5,
|
|
1353
|
-
showValue: true,
|
|
1354
|
-
showWhen: {
|
|
1355
|
-
field: "enabledMacroClasses",
|
|
1356
|
-
includes: "package"
|
|
1357
|
-
}
|
|
1358
|
-
},
|
|
1359
1398
|
{
|
|
1360
1399
|
type: "slider",
|
|
1361
1400
|
key: "nmsIouThreshold",
|
|
@@ -1393,7 +1432,8 @@ var AudioClassifierStep = class {
|
|
|
1393
1432
|
description: "Which audio macro classes to surface (empty = all).",
|
|
1394
1433
|
options: AUDIO_MACRO_LABELS.map((l) => ({
|
|
1395
1434
|
value: l.id,
|
|
1396
|
-
label:
|
|
1435
|
+
label: l.name,
|
|
1436
|
+
iconId: audioKindId(l.id)
|
|
1397
1437
|
})),
|
|
1398
1438
|
default: [
|
|
1399
1439
|
"scream",
|
|
@@ -1520,66 +1560,36 @@ var ClassifierWithMinConfidence = class extends PipelineStepBase {
|
|
|
1520
1560
|
var PLATE_OCR_DEFAULT_REGION = "DE";
|
|
1521
1561
|
var PLATE_OCR_DEFAULT_MIN_TEXT_LENGTH = 3;
|
|
1522
1562
|
var PLATE_OCR_DEFAULT_MIN_TEXT_CONFIDENCE = 0;
|
|
1523
|
-
var PLATE_OCR_REGION_OPTIONS = [{
|
|
1524
|
-
value: "off",
|
|
1525
|
-
label: "Off (no format correction)"
|
|
1526
|
-
}, {
|
|
1527
|
-
value: "DE",
|
|
1528
|
-
label: "Germany"
|
|
1529
|
-
}];
|
|
1530
1563
|
/**
|
|
1531
1564
|
* Plate OCR step — exposes a `rectify` toggle (default ON) that deskews the
|
|
1532
1565
|
* plate crop (rotation rectification) before the CTC recognizer reads it.
|
|
1533
1566
|
* Oblique cameras (steeply angled plates) skew the text baseline and collapse
|
|
1534
1567
|
* CTC beyond ~10-15°; a frontal camera loses nothing at 0° because the executor
|
|
1535
|
-
* skips the warp when the estimated angle is ~0. Per-camera configurable
|
|
1568
|
+
* skips the warp when the estimated angle is ~0. Per-camera configurable, and
|
|
1569
|
+
* the ONLY per-camera knob this step has — see below.
|
|
1536
1570
|
*
|
|
1537
|
-
*
|
|
1538
|
-
*
|
|
1571
|
+
* `plateRegion` / `minTextLength` / `minTextConfidence` are NOT offered here.
|
|
1572
|
+
* They are consumed inside the Python CTC postprocessor, whose config is bound
|
|
1573
|
+
* when the model is loaded into the shared inference pool — node-level by
|
|
1574
|
+
* construction, exactly like `nmsIouThreshold` and the pool confidence floor.
|
|
1575
|
+
* They used to be rendered as per-camera sliders that wrote a settings row
|
|
1576
|
+
* nobody read: `engine-factory.buildPoolModelConfig` takes the STATIC value off
|
|
1577
|
+
* the step definition below, so the operator moved a slider and the runtime
|
|
1578
|
+
* kept the default (D62 — a per-camera switch that stores nothing is worse than
|
|
1579
|
+
* no switch). Making them genuinely per-camera means a per-REQUEST config
|
|
1580
|
+
* override through SharedInferencePool → inference_pool.py → ModelSlot.config,
|
|
1581
|
+
* i.e. a new wire protocol, not a step-schema entry.
|
|
1539
1582
|
*/
|
|
1540
1583
|
var PlateOcrStep = class extends PipelineStepBase {
|
|
1541
1584
|
getConfigSchema() {
|
|
1542
|
-
return [
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
},
|
|
1551
|
-
{
|
|
1552
|
-
type: "select",
|
|
1553
|
-
key: "plateRegion",
|
|
1554
|
-
label: "Plate Format",
|
|
1555
|
-
description: "Validate each read against a country plate grammar and repair OCR confusables (0↔O, 1↔I, 8↔B, …) to the highest-scoring conforming read. Never drops a plausible read — only fixes or annotates it. \"Off\" disables correction.",
|
|
1556
|
-
options: PLATE_OCR_REGION_OPTIONS,
|
|
1557
|
-
default: PLATE_OCR_DEFAULT_REGION,
|
|
1558
|
-
immediate: true
|
|
1559
|
-
},
|
|
1560
|
-
{
|
|
1561
|
-
type: "slider",
|
|
1562
|
-
key: "minTextLength",
|
|
1563
|
-
label: "Min Plate Length",
|
|
1564
|
-
description: "Suppress reads shorter than this many characters as low-resolution noise (never stored as a plate).",
|
|
1565
|
-
min: 1,
|
|
1566
|
-
max: 8,
|
|
1567
|
-
step: 1,
|
|
1568
|
-
default: PLATE_OCR_DEFAULT_MIN_TEXT_LENGTH,
|
|
1569
|
-
showValue: true
|
|
1570
|
-
},
|
|
1571
|
-
{
|
|
1572
|
-
type: "slider",
|
|
1573
|
-
key: "minTextConfidence",
|
|
1574
|
-
label: "Min OCR Confidence",
|
|
1575
|
-
description: "Suppress reads whose mean character confidence is below this floor. 0 disables the confidence gate (length is the primary discriminator).",
|
|
1576
|
-
min: 0,
|
|
1577
|
-
max: 1,
|
|
1578
|
-
step: .05,
|
|
1579
|
-
default: PLATE_OCR_DEFAULT_MIN_TEXT_CONFIDENCE,
|
|
1580
|
-
showValue: true
|
|
1581
|
-
}
|
|
1582
|
-
];
|
|
1585
|
+
return [{
|
|
1586
|
+
type: "boolean",
|
|
1587
|
+
key: "rectify",
|
|
1588
|
+
label: "Deskew Plate Crop",
|
|
1589
|
+
description: "Rotate the plate crop to level the text baseline before OCR. Recommended for oblique/angled cameras; a frontal camera is unaffected (no rotation applied at ~0°).",
|
|
1590
|
+
default: true,
|
|
1591
|
+
style: "switch"
|
|
1592
|
+
}];
|
|
1583
1593
|
}
|
|
1584
1594
|
};
|
|
1585
1595
|
var STEP_FACE_DETECTION = new PipelineStepBase({
|
|
@@ -1599,7 +1609,34 @@ var STEP_FACE_DETECTION = new PipelineStepBase({
|
|
|
1599
1609
|
minIntervalMs: 1e3
|
|
1600
1610
|
}
|
|
1601
1611
|
});
|
|
1602
|
-
|
|
1612
|
+
/**
|
|
1613
|
+
* `face-embedding` — carries the LANDMARK-PRECISION floor as its only operator
|
|
1614
|
+
* knob.
|
|
1615
|
+
*
|
|
1616
|
+
* It has to live here rather than beside the other face thresholds in
|
|
1617
|
+
* post-analysis's `face-settings.ts`: the gate is enforced in the runner's
|
|
1618
|
+
* executor, on the detection-frame measurement, BEFORE the native-size
|
|
1619
|
+
* substitution — and `child.settings` (hydrated from this schema by
|
|
1620
|
+
* `tree-builder`) is the only channel that reaches that code. A copy in
|
|
1621
|
+
* `face-settings.ts` would be a second knob that writes a store the gate never
|
|
1622
|
+
* reads, which this repo has shipped twice already.
|
|
1623
|
+
*/
|
|
1624
|
+
var FaceEmbeddingStep = class extends PipelineStepBase {
|
|
1625
|
+
getConfigSchema() {
|
|
1626
|
+
return [{
|
|
1627
|
+
type: "slider",
|
|
1628
|
+
key: "minLandmarkFaceSize",
|
|
1629
|
+
label: "Min face size for recognition (detection px)",
|
|
1630
|
+
description: "Refuse to embed a face smaller than this IN THE DETECTION FRAME — not at native resolution. The 5 landmarks that align the crop are regressed at detection scale, so below this floor the aligned crop is not reliably a face, and a native-resolution cutout cannot fix it. Measured on 60 live crops: at 24px, 61% come out correctly aligned versus 20% with no floor, at the cost of about 70% of the volume. Lower it if you are losing too many faces; 0 disables the gate. A degenerate crop is worse than no crop — it scores high similarity against everyone and poisons the gallery.",
|
|
1631
|
+
min: 0,
|
|
1632
|
+
max: 64,
|
|
1633
|
+
step: 2,
|
|
1634
|
+
showValue: true,
|
|
1635
|
+
default: 24
|
|
1636
|
+
}];
|
|
1637
|
+
}
|
|
1638
|
+
};
|
|
1639
|
+
var STEP_FACE_EMBEDDING = new FaceEmbeddingStep({
|
|
1603
1640
|
id: "face-embedding",
|
|
1604
1641
|
name: "Face Embedding",
|
|
1605
1642
|
slot: "classifier",
|
|
@@ -1995,4 +2032,4 @@ function startEventLoopStallMonitor(logger, reportThresholdMs = STALL_REPORT_MS)
|
|
|
1995
2032
|
};
|
|
1996
2033
|
}
|
|
1997
2034
|
//#endregion
|
|
1998
|
-
export { getDefaultModelForFormat as a, getStepDefinition as c, ALL_STEPS as i, resolveModelForFormat as l, startEventLoopStallMonitor as n, getDefaultModelForFormatFromDef as o, ALL_PIPELINE_STEPS as r, getStep as s, attributeStall as t };
|
|
2035
|
+
export { getDefaultModelForFormat as a, getStepDefinition as c, ALL_STEPS as i, resolveModelForFormat as l, startEventLoopStallMonitor as n, getDefaultModelForFormatFromDef as o, ALL_PIPELINE_STEPS as r, getStep as s, attributeStall as t, landmarkPrecisionVerdict as u };
|
|
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_dist = require("../dist-
|
|
6
|
-
const require_lazy_sharp = require("../lazy-sharp-
|
|
5
|
+
const require_dist = require("../dist-C11WuNUP.js");
|
|
6
|
+
const require_lazy_sharp = require("../lazy-sharp-RxUs6on_.js");
|
|
7
7
|
let node_path = require("node:path");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
9
|
//#region src/motion-wasm/wasm-motion-detector.ts
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { U as evaluateZoneRules, bt as hydrateSchema, ht as BaseAddon, q as motionDetectionCapability, vt as DeviceType } from "../dist-Ccmt3fGJ.mjs";
|
|
2
2
|
import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { readFileSync } from "node:fs";
|
|
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_dist = require("../dist-
|
|
6
|
-
const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-
|
|
7
|
-
const require_worker_protocol = require("../worker-protocol-
|
|
5
|
+
const require_dist = require("../dist-C11WuNUP.js");
|
|
6
|
+
const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-Cq_NeC4o.js");
|
|
7
|
+
const require_worker_protocol = require("../worker-protocol-BePduZVV.js");
|
|
8
8
|
const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
|
|
9
|
-
const require_lazy_sharp = require("../lazy-sharp-
|
|
9
|
+
const require_lazy_sharp = require("../lazy-sharp-RxUs6on_.js");
|
|
10
10
|
const require_remote_restream = require("../remote-restream-BYbAsgUf.js");
|
|
11
11
|
let sharp = require("sharp");
|
|
12
12
|
sharp = require_dist.__toESM(sharp);
|
|
@@ -2091,6 +2091,7 @@ function toDetailResult(detection, stepId, crop) {
|
|
|
2091
2091
|
score: detection.score,
|
|
2092
2092
|
bbox: mapBboxToFrameSpace(detection.bbox, crop),
|
|
2093
2093
|
...detection.embedding !== void 0 ? { embedding: encodeEmbeddingBase64(detection.embedding) } : {},
|
|
2094
|
+
...detection.embeddingMagnitude !== void 0 ? { embeddingMagnitude: detection.embeddingMagnitude } : {},
|
|
2094
2095
|
...label !== void 0 ? {
|
|
2095
2096
|
label: label.label,
|
|
2096
2097
|
...label.tier !== void 0 ? { labelTier: label.tier } : {},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { At as
|
|
2
|
-
import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-
|
|
3
|
-
import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-
|
|
1
|
+
import { At as array, Bt as EventCategory, F as defineCustomActions, Ft as number, It as object, L as deriveDetailCropRect, N as customAction, Nt as lazy, Pt as literal, Q as pipelineRunnerCapability, Rt as string, X as pickNativeLeaseOverride, Y as pickDetailCropConvention, c as DEFAULT_DETAIL_CROP_CONVENTION, d as DEVICE_BACKEND_TO_FORMAT, ht as BaseAddon, jt as boolean, kt as _enum, lt as errMsg, wt as nodePin, yt as createEvent } from "../dist-Ccmt3fGJ.mjs";
|
|
2
|
+
import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-OJrOMeuu.mjs";
|
|
3
|
+
import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-DDpliBIW.mjs";
|
|
4
4
|
import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
|
|
5
5
|
import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
|
|
6
6
|
import { i as withDetectionIntent, n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-Ci7RXNGb.mjs";
|
|
@@ -2084,6 +2084,7 @@ function toDetailResult(detection, stepId, crop) {
|
|
|
2084
2084
|
score: detection.score,
|
|
2085
2085
|
bbox: mapBboxToFrameSpace(detection.bbox, crop),
|
|
2086
2086
|
...detection.embedding !== void 0 ? { embedding: encodeEmbeddingBase64(detection.embedding) } : {},
|
|
2087
|
+
...detection.embeddingMagnitude !== void 0 ? { embeddingMagnitude: detection.embeddingMagnitude } : {},
|
|
2087
2088
|
...label !== void 0 ? {
|
|
2088
2089
|
label: label.label,
|
|
2089
2090
|
...label.tier !== void 0 ? { labelTier: label.tier } : {},
|
package/dist/recorder/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const require_dist = require("../dist-
|
|
1
|
+
const require_dist = require("../dist-C11WuNUP.js");
|
|
2
2
|
const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
|
|
3
|
-
const require_addon_utils = require("../addon-utils-
|
|
3
|
+
const require_addon_utils = require("../addon-utils-CLc6yHCN.js");
|
|
4
4
|
const require_retire_root_keys = require("../retire-root-keys-KE6D6Xh_.js");
|
|
5
5
|
let node_crypto = require("node:crypto");
|
|
6
6
|
let node_child_process = require("node:child_process");
|
package/dist/recorder/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
1
|
+
import { $ as recordingCapability, Bt as EventCategory, C as RecordingConfigSchema, Dt as selectAssignedProfileSlots, Ft as number, It as object, Lt as record, R as deriveRecordingMode, Rt as string, S as RECORDING_EXPORT_MAX_READ_BYTES, at as storageEvictableCapability, bt as hydrateSchema, et as recordingExportCapability, f as EVENT_PAD_MS, ht as BaseAddon, l as DEFAULT_EVENTS_BAND_BUFFER_SEC, lt as errMsg, m as ExportRecordSchema, rt as resolveRecordingProfiles, v as OpsLogEntrySchema, vt as DeviceType, wt as nodePin } from "../dist-Ccmt3fGJ.mjs";
|
|
2
2
|
import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
|
|
3
3
|
import { n as createFileDataPlaneHandler, s as parseRangeHeader, t as contentTypeFor } from "../addon-utils-A2S9D7pu.mjs";
|
|
4
4
|
import { n as RowMapStore, t as retireRootKeys } from "../retire-root-keys-DMolfhsP.mjs";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_worker_protocol = require("../worker-protocol-
|
|
3
|
-
const require_lazy_sharp = require("../lazy-sharp-
|
|
2
|
+
const require_worker_protocol = require("../worker-protocol-BePduZVV.js");
|
|
3
|
+
const require_lazy_sharp = require("../lazy-sharp-RxUs6on_.js");
|
|
4
4
|
//#region src/session-decode/color-conversion.ts
|
|
5
5
|
/**
|
|
6
6
|
* Explicit YUV→RGB colorspace/range resolution for the session-decode worker.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as formatNativeLeaseKnobs, n as isWorkerRequest, o as resolveNativeLeaseKnobs, r as logLevelForLine } from "../worker-protocol-
|
|
1
|
+
import { i as formatNativeLeaseKnobs, n as isWorkerRequest, o as resolveNativeLeaseKnobs, r as logLevelForLine } from "../worker-protocol-DDpliBIW.mjs";
|
|
2
2
|
import { n as setSharpWarnSink, r as hostExternalEntryUrls, t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
|
|
3
3
|
//#region src/session-decode/color-conversion.ts
|
|
4
4
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, p as c, r as l, s as u, t as d, u as f } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DsIi4G5Q.mjs";
|
|
2
2
|
import { a as p, i as m, n as h, o as g, r as _, t as v } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react__loadShare__.js-C9j-2lBe.mjs";
|
|
3
3
|
import { n as y, r as b, t as x } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-XO0-Pyu6.mjs";
|
|
4
|
-
import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-
|
|
4
|
+
import { t as S } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DY31bUCj.mjs";
|
|
5
5
|
import { n as C, t as w } from "./_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-BO7TIbJV.mjs";
|
|
6
6
|
//#region ../../node_modules/lucide-react/dist/esm/shared/src/utils.js
|
|
7
7
|
var T = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), E = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), D = (e) => {
|
|
@@ -18,7 +18,7 @@ var e = {
|
|
|
18
18
|
},
|
|
19
19
|
"@camstack/types": {
|
|
20
20
|
name: "@camstack/types",
|
|
21
|
-
version: "1.2.
|
|
21
|
+
version: "1.2.92",
|
|
22
22
|
scope: ["default"],
|
|
23
23
|
loaded: !1,
|
|
24
24
|
from: "addon_stream_broker_widgets",
|
|
@@ -33,7 +33,7 @@ var e = {
|
|
|
33
33
|
},
|
|
34
34
|
"@camstack/ui-library": {
|
|
35
35
|
name: "@camstack/ui-library",
|
|
36
|
-
version: "1.2.
|
|
36
|
+
version: "1.2.63",
|
|
37
37
|
scope: ["default"],
|
|
38
38
|
loaded: !1,
|
|
39
39
|
from: "addon_stream_broker_widgets",
|