@souscheflabs/ml-vision 0.1.1 → 0.1.2
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/CHANGELOG.md +54 -0
- package/LICENSE +15 -0
- package/README.md +50 -5
- package/dist/{components → cjs/components}/DetectionOverlay.js +1 -0
- package/dist/cjs/components/DetectionOverlay.js.map +1 -0
- package/dist/{components → cjs/components}/index.js +1 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/{core → cjs/core}/CacheManager.js +1 -0
- package/dist/cjs/core/CacheManager.js.map +1 -0
- package/dist/{core → cjs/core}/MLVisionProvider.js +4 -2
- package/dist/cjs/core/MLVisionProvider.js.map +1 -0
- package/dist/{core → cjs/core}/ServerClient.js +33 -13
- package/dist/cjs/core/ServerClient.js.map +1 -0
- package/dist/{core → cjs/core}/index.js +1 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/classLabels.js +1 -0
- package/dist/cjs/hooks/classLabels.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/classLabelsCoco.js +1 -0
- package/dist/cjs/hooks/classLabelsCoco.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/index.js +1 -0
- package/dist/cjs/hooks/index.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/useMultiBarcodeScanner.js +6 -3
- package/dist/cjs/hooks/useMultiBarcodeScanner.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/useProductDetector.js +161 -90
- package/dist/cjs/hooks/useProductDetector.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/useReceiptScanner.js +60 -52
- package/dist/cjs/hooks/useReceiptScanner.js.map +1 -0
- package/dist/{hooks → cjs/hooks}/useVideoScanner.js +8 -5
- package/dist/cjs/hooks/useVideoScanner.js.map +1 -0
- package/dist/{index.js → cjs/index.js} +8 -4
- package/dist/cjs/index.js.map +1 -0
- package/dist/{processors → cjs/processors}/detectionProcessor.js +1 -0
- package/dist/cjs/processors/detectionProcessor.js.map +1 -0
- package/dist/{processors → cjs/processors}/index.js +1 -0
- package/dist/cjs/processors/index.js.map +1 -0
- package/dist/{processors → cjs/processors}/tfliteFrameProcessor.js +108 -25
- package/dist/cjs/processors/tfliteFrameProcessor.js.map +1 -0
- package/dist/{types → cjs/types}/barcode.js +1 -0
- package/dist/cjs/types/barcode.js.map +1 -0
- package/dist/{types → cjs/types}/detection.js +1 -0
- package/dist/cjs/types/detection.js.map +1 -0
- package/dist/{types → cjs/types}/index.js +1 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/{types → cjs/types}/ocr.js +1 -0
- package/dist/cjs/types/ocr.js.map +1 -0
- package/dist/{utils → cjs/utils}/imagePreprocessor.js +30 -25
- package/dist/cjs/utils/imagePreprocessor.js.map +1 -0
- package/dist/cjs/utils/logger.js +99 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/{utils → cjs/utils}/yoloProcessor.js +1 -0
- package/dist/cjs/utils/yoloProcessor.js.map +1 -0
- package/dist/esm/components/DetectionOverlay.js +130 -0
- package/dist/esm/components/DetectionOverlay.js.map +1 -0
- package/dist/esm/components/index.js +5 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/core/CacheManager.js +327 -0
- package/dist/esm/core/CacheManager.js.map +1 -0
- package/dist/esm/core/MLVisionProvider.js +185 -0
- package/dist/esm/core/MLVisionProvider.js.map +1 -0
- package/dist/esm/core/ServerClient.js +305 -0
- package/dist/esm/core/ServerClient.js.map +1 -0
- package/dist/esm/core/index.js +7 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/hooks/classLabels.js +436 -0
- package/dist/esm/hooks/classLabels.js.map +1 -0
- package/dist/esm/hooks/classLabelsCoco.js +98 -0
- package/dist/esm/hooks/classLabelsCoco.js.map +1 -0
- package/dist/esm/hooks/index.js +9 -0
- package/dist/esm/hooks/index.js.map +1 -0
- package/dist/esm/hooks/useMultiBarcodeScanner.js +290 -0
- package/dist/esm/hooks/useMultiBarcodeScanner.js.map +1 -0
- package/dist/esm/hooks/useProductDetector.js +714 -0
- package/dist/esm/hooks/useProductDetector.js.map +1 -0
- package/dist/esm/hooks/useReceiptScanner.js +407 -0
- package/dist/esm/hooks/useReceiptScanner.js.map +1 -0
- package/dist/esm/hooks/useVideoScanner.js +383 -0
- package/dist/esm/hooks/useVideoScanner.js.map +1 -0
- package/dist/esm/index.js +93 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/processors/detectionProcessor.js +121 -0
- package/dist/esm/processors/detectionProcessor.js.map +1 -0
- package/dist/esm/processors/index.js +7 -0
- package/dist/esm/processors/index.js.map +1 -0
- package/dist/esm/processors/tfliteFrameProcessor.js +292 -0
- package/dist/esm/processors/tfliteFrameProcessor.js.map +1 -0
- package/dist/esm/types/barcode.js +17 -0
- package/dist/esm/types/barcode.js.map +1 -0
- package/dist/esm/types/detection.js +8 -0
- package/dist/esm/types/detection.js.map +1 -0
- package/dist/esm/types/index.js +10 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/ocr.js +8 -0
- package/dist/esm/types/ocr.js.map +1 -0
- package/dist/esm/utils/imagePreprocessor.js +268 -0
- package/dist/esm/utils/imagePreprocessor.js.map +1 -0
- package/dist/esm/utils/logger.js +94 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/yoloProcessor.js +151 -0
- package/dist/esm/utils/yoloProcessor.js.map +1 -0
- package/dist/{components → types/components}/DetectionOverlay.d.ts +1 -0
- package/dist/types/components/DetectionOverlay.d.ts.map +1 -0
- package/dist/{components → types/components}/index.d.ts +1 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/{core → types/core}/CacheManager.d.ts +1 -0
- package/dist/types/core/CacheManager.d.ts.map +1 -0
- package/dist/{core → types/core}/MLVisionProvider.d.ts +1 -0
- package/dist/types/core/MLVisionProvider.d.ts.map +1 -0
- package/dist/{core → types/core}/ServerClient.d.ts +1 -0
- package/dist/types/core/ServerClient.d.ts.map +1 -0
- package/dist/{core → types/core}/index.d.ts +1 -0
- package/dist/types/core/index.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/classLabels.d.ts +1 -0
- package/dist/types/hooks/classLabels.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/classLabelsCoco.d.ts +1 -0
- package/dist/types/hooks/classLabelsCoco.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/index.d.ts +1 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/useMultiBarcodeScanner.d.ts +1 -0
- package/dist/types/hooks/useMultiBarcodeScanner.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/useProductDetector.d.ts +1 -0
- package/dist/types/hooks/useProductDetector.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/useReceiptScanner.d.ts +2 -1
- package/dist/types/hooks/useReceiptScanner.d.ts.map +1 -0
- package/dist/{hooks → types/hooks}/useVideoScanner.d.ts +1 -0
- package/dist/types/hooks/useVideoScanner.d.ts.map +1 -0
- package/dist/types/index.d.ts +58 -124
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{processors → types/processors}/detectionProcessor.d.ts +1 -0
- package/dist/types/processors/detectionProcessor.d.ts.map +1 -0
- package/dist/{processors → types/processors}/index.d.ts +1 -0
- package/dist/types/processors/index.d.ts.map +1 -0
- package/dist/{processors → types/processors}/tfliteFrameProcessor.d.ts +5 -4
- package/dist/types/processors/tfliteFrameProcessor.d.ts.map +1 -0
- package/dist/types/{barcode.d.ts → types/barcode.d.ts} +1 -0
- package/dist/types/types/barcode.d.ts.map +1 -0
- package/dist/types/{detection.d.ts → types/detection.d.ts} +1 -0
- package/dist/types/types/detection.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +127 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/{ocr.d.ts → types/ocr.d.ts} +1 -0
- package/dist/types/types/ocr.d.ts.map +1 -0
- package/dist/{utils → types/utils}/imagePreprocessor.d.ts +1 -0
- package/dist/types/utils/imagePreprocessor.d.ts.map +1 -0
- package/dist/types/utils/logger.d.ts +52 -0
- package/dist/types/utils/logger.d.ts.map +1 -0
- package/dist/{utils → types/utils}/yoloProcessor.d.ts +1 -0
- package/dist/types/utils/yoloProcessor.d.ts.map +1 -0
- package/package.json +62 -21
- package/dist/index.d.ts +0 -58
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useVideoScanner Hook
|
|
3
|
+
*
|
|
4
|
+
* React hook for real-time video scanning combining product detection,
|
|
5
|
+
* barcode scanning, and text recognition.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { useVideoScanner } from '@souschef/ml-vision';
|
|
10
|
+
*
|
|
11
|
+
* function LiveScanner() {
|
|
12
|
+
* const {
|
|
13
|
+
* isScanning,
|
|
14
|
+
* products,
|
|
15
|
+
* barcodes,
|
|
16
|
+
* startScanning,
|
|
17
|
+
* stopScanning,
|
|
18
|
+
* cameraRef,
|
|
19
|
+
* } = useVideoScanner({
|
|
20
|
+
* modes: ['products', 'barcodes'],
|
|
21
|
+
* onDetected: (results) => console.log('Found:', results),
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* return (
|
|
25
|
+
* <Camera ref={cameraRef} />
|
|
26
|
+
* );
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import { useState, useCallback, useRef, useMemo, useEffect } from 'react';
|
|
31
|
+
import { useMLVisionContext } from '../core/MLVisionProvider';
|
|
32
|
+
import { useProductDetector } from './useProductDetector';
|
|
33
|
+
import { useMultiBarcodeScanner } from './useMultiBarcodeScanner';
|
|
34
|
+
import { useTFLiteFrameProcessor, } from '../processors/tfliteFrameProcessor';
|
|
35
|
+
import { COCO_CLASSES } from './classLabelsCoco';
|
|
36
|
+
import { logger } from '../utils/logger';
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Constants
|
|
39
|
+
// ============================================================================
|
|
40
|
+
const DEFAULT_TARGET_FPS = 10;
|
|
41
|
+
const DEFAULT_SMOOTHING_FRAMES = 3;
|
|
42
|
+
const MS_PER_SECOND = 1000;
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Hook Implementation
|
|
45
|
+
// ============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Hook for real-time video scanning
|
|
48
|
+
*/
|
|
49
|
+
export function useVideoScanner(options = {}) {
|
|
50
|
+
const { modes = ['products', 'barcodes'], targetFps = DEFAULT_TARGET_FPS, minProductConfidence = 0.5, productCategories, maxProducts = 10, maxBarcodes = 5, temporalSmoothing = true, smoothingFrames = DEFAULT_SMOOTHING_FRAMES, onDetected, onError, hapticFeedback = true,
|
|
51
|
+
// TFLite options
|
|
52
|
+
tfliteModel, useOnDeviceFrameProcessor = !!tfliteModel, foodOnly = true, } = options;
|
|
53
|
+
// Context
|
|
54
|
+
const { isInitialized } = useMLVisionContext();
|
|
55
|
+
// Child hooks
|
|
56
|
+
const productDetector = useProductDetector({
|
|
57
|
+
model: 'fast',
|
|
58
|
+
minConfidence: minProductConfidence,
|
|
59
|
+
categories: productCategories,
|
|
60
|
+
maxDetections: maxProducts,
|
|
61
|
+
hapticFeedback: false, // We'll handle haptics at video level
|
|
62
|
+
});
|
|
63
|
+
const barcodeScanner = useMultiBarcodeScanner({
|
|
64
|
+
maxBarcodes,
|
|
65
|
+
hapticFeedback: false,
|
|
66
|
+
});
|
|
67
|
+
// State
|
|
68
|
+
const [isScanning, setIsScanning] = useState(false);
|
|
69
|
+
const [products, setProducts] = useState([]);
|
|
70
|
+
const [barcodes, setBarcodes] = useState([]);
|
|
71
|
+
const [frameNumber, setFrameNumber] = useState(0);
|
|
72
|
+
const [fps, setFps] = useState(0);
|
|
73
|
+
const [error, setError] = useState(null);
|
|
74
|
+
// Track inference time from TFLite frame processor
|
|
75
|
+
const inferenceTimeMsRef = useRef(0);
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// TFLite Frame Processor (for real-time video detection)
|
|
78
|
+
// ============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Convert TFLite detection to ProductDetectionResult
|
|
81
|
+
*/
|
|
82
|
+
const tfliteToProductResult = useCallback((detection) => {
|
|
83
|
+
return {
|
|
84
|
+
id: `tflite_${Date.now()}_${detection.classIndex}`,
|
|
85
|
+
type: 'product',
|
|
86
|
+
confidence: detection.confidence,
|
|
87
|
+
boundingBox: {
|
|
88
|
+
x: detection.x,
|
|
89
|
+
y: detection.y,
|
|
90
|
+
width: detection.width,
|
|
91
|
+
height: detection.height,
|
|
92
|
+
},
|
|
93
|
+
source: 'on_device',
|
|
94
|
+
processingTimeMs: 0,
|
|
95
|
+
timestamp: Date.now(),
|
|
96
|
+
data: {
|
|
97
|
+
category: 'produce', // Map to closest ProductCategory
|
|
98
|
+
classLabel: detection.label,
|
|
99
|
+
classIndex: detection.classIndex,
|
|
100
|
+
name: detection.label.charAt(0).toUpperCase() + detection.label.slice(1),
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}, []);
|
|
104
|
+
/**
|
|
105
|
+
* Handle TFLite detections
|
|
106
|
+
*/
|
|
107
|
+
const handleTFLiteDetections = useCallback((detections) => {
|
|
108
|
+
const productResults = detections.map(tfliteToProductResult);
|
|
109
|
+
setProducts(productResults);
|
|
110
|
+
setFrameNumber((prev) => prev + 1);
|
|
111
|
+
// Callback
|
|
112
|
+
if (productResults.length > 0 && onDetected) {
|
|
113
|
+
onDetected({
|
|
114
|
+
products: productResults,
|
|
115
|
+
barcodes,
|
|
116
|
+
timestamp: Date.now(),
|
|
117
|
+
frameNumber,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}, [tfliteToProductResult, barcodes, frameNumber, onDetected]);
|
|
121
|
+
// TFLite frame processor hook
|
|
122
|
+
const tfliteFrameProcessor = useTFLiteFrameProcessor({
|
|
123
|
+
model: useOnDeviceFrameProcessor ? tfliteModel ?? null : null,
|
|
124
|
+
numClasses: 80, // COCO
|
|
125
|
+
confThreshold: minProductConfidence,
|
|
126
|
+
classLabels: [...COCO_CLASSES], // Convert readonly to mutable array
|
|
127
|
+
foodOnly,
|
|
128
|
+
onDetections: handleTFLiteDetections,
|
|
129
|
+
});
|
|
130
|
+
// Refs
|
|
131
|
+
const cameraRef = useRef(null);
|
|
132
|
+
const lastFrameTimeRef = useRef(0);
|
|
133
|
+
const frameCountRef = useRef(0);
|
|
134
|
+
const fpsStartTimeRef = useRef(Date.now());
|
|
135
|
+
const productHistoryRef = useRef([]);
|
|
136
|
+
const mountedRef = useRef(true);
|
|
137
|
+
// Computed readiness
|
|
138
|
+
const isReady = useMemo(() => {
|
|
139
|
+
// For products: either TFLite frame processor is ready, or productDetector is loaded
|
|
140
|
+
const productReady = !modes.includes('products') ||
|
|
141
|
+
(useOnDeviceFrameProcessor ? tfliteFrameProcessor.isReady : productDetector.isModelLoaded);
|
|
142
|
+
const barcodeReady = !modes.includes('barcodes') || barcodeScanner.isReady;
|
|
143
|
+
return isInitialized && productReady && barcodeReady;
|
|
144
|
+
}, [
|
|
145
|
+
isInitialized,
|
|
146
|
+
modes,
|
|
147
|
+
useOnDeviceFrameProcessor,
|
|
148
|
+
tfliteFrameProcessor.isReady,
|
|
149
|
+
productDetector.isModelLoaded,
|
|
150
|
+
barcodeScanner.isReady,
|
|
151
|
+
]);
|
|
152
|
+
// ============================================================================
|
|
153
|
+
// FPS Calculation
|
|
154
|
+
// ============================================================================
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
if (!isScanning)
|
|
157
|
+
return;
|
|
158
|
+
const interval = setInterval(() => {
|
|
159
|
+
const now = Date.now();
|
|
160
|
+
const elapsed = (now - fpsStartTimeRef.current) / MS_PER_SECOND;
|
|
161
|
+
if (elapsed > 0) {
|
|
162
|
+
setFps(Math.round(frameCountRef.current / elapsed));
|
|
163
|
+
}
|
|
164
|
+
frameCountRef.current = 0;
|
|
165
|
+
fpsStartTimeRef.current = now;
|
|
166
|
+
}, MS_PER_SECOND);
|
|
167
|
+
return () => clearInterval(interval);
|
|
168
|
+
}, [isScanning]);
|
|
169
|
+
// ============================================================================
|
|
170
|
+
// Temporal Smoothing
|
|
171
|
+
// ============================================================================
|
|
172
|
+
/**
|
|
173
|
+
* Apply temporal smoothing to product detections
|
|
174
|
+
*/
|
|
175
|
+
const smoothProducts = useCallback((newProducts) => {
|
|
176
|
+
if (!temporalSmoothing)
|
|
177
|
+
return newProducts;
|
|
178
|
+
// Add to history
|
|
179
|
+
productHistoryRef.current.push(newProducts);
|
|
180
|
+
if (productHistoryRef.current.length > smoothingFrames) {
|
|
181
|
+
productHistoryRef.current.shift();
|
|
182
|
+
}
|
|
183
|
+
// Count occurrences of each class
|
|
184
|
+
const classCounts = new Map();
|
|
185
|
+
const bestDetections = new Map();
|
|
186
|
+
for (const frameProducts of productHistoryRef.current) {
|
|
187
|
+
for (const product of frameProducts) {
|
|
188
|
+
const key = product.data.classLabel;
|
|
189
|
+
const count = (classCounts.get(key) || 0) + 1;
|
|
190
|
+
classCounts.set(key, count);
|
|
191
|
+
// Keep best confidence detection
|
|
192
|
+
const existing = bestDetections.get(key);
|
|
193
|
+
if (!existing || product.confidence > existing.confidence) {
|
|
194
|
+
bestDetections.set(key, product);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Keep products that appear in at least half the frames
|
|
199
|
+
const threshold = Math.ceil(smoothingFrames / 2);
|
|
200
|
+
return Array.from(bestDetections.entries())
|
|
201
|
+
.filter(([key]) => (classCounts.get(key) || 0) >= threshold)
|
|
202
|
+
.map(([, product]) => product);
|
|
203
|
+
}, [temporalSmoothing, smoothingFrames]);
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Frame Processing
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* Process a frame (called from frame processor)
|
|
209
|
+
* @deprecated Use TFLite frame processor instead
|
|
210
|
+
*/
|
|
211
|
+
const _processFrame = useCallback(async (frameUri) => {
|
|
212
|
+
const now = Date.now();
|
|
213
|
+
const minInterval = MS_PER_SECOND / targetFps;
|
|
214
|
+
// Throttle based on target FPS
|
|
215
|
+
if (now - lastFrameTimeRef.current < minInterval) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
lastFrameTimeRef.current = now;
|
|
219
|
+
frameCountRef.current++;
|
|
220
|
+
try {
|
|
221
|
+
const results = {
|
|
222
|
+
products: [],
|
|
223
|
+
barcodes: [],
|
|
224
|
+
timestamp: now,
|
|
225
|
+
frameNumber: frameNumber,
|
|
226
|
+
};
|
|
227
|
+
// Product detection
|
|
228
|
+
if (modes.includes('products') && productDetector.isModelLoaded) {
|
|
229
|
+
const detected = await productDetector.detectProducts(frameUri);
|
|
230
|
+
results.products = smoothProducts(detected);
|
|
231
|
+
}
|
|
232
|
+
// Barcode detection is handled by VisionCamera's code scanner
|
|
233
|
+
// Results come through barcodeScanner.results
|
|
234
|
+
// Update state
|
|
235
|
+
if (mountedRef.current) {
|
|
236
|
+
setFrameNumber((prev) => prev + 1);
|
|
237
|
+
if (results.products.length > 0) {
|
|
238
|
+
setProducts(results.products);
|
|
239
|
+
}
|
|
240
|
+
// Combine with barcode results
|
|
241
|
+
results.barcodes = barcodeScanner.results;
|
|
242
|
+
// Callback
|
|
243
|
+
if (results.products.length > 0 || results.barcodes.length > 0) {
|
|
244
|
+
onDetected?.(results);
|
|
245
|
+
// Haptic feedback
|
|
246
|
+
if (hapticFeedback) {
|
|
247
|
+
// Trigger haptic
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
const frameError = err instanceof Error ? err : new Error('Frame processing failed');
|
|
254
|
+
logger.error('[VideoScanner] Frame error:', frameError);
|
|
255
|
+
setError(frameError);
|
|
256
|
+
onError?.(frameError);
|
|
257
|
+
}
|
|
258
|
+
}, [
|
|
259
|
+
targetFps,
|
|
260
|
+
frameNumber,
|
|
261
|
+
modes,
|
|
262
|
+
productDetector,
|
|
263
|
+
barcodeScanner.results,
|
|
264
|
+
smoothProducts,
|
|
265
|
+
onDetected,
|
|
266
|
+
onError,
|
|
267
|
+
hapticFeedback,
|
|
268
|
+
]);
|
|
269
|
+
// ============================================================================
|
|
270
|
+
// Actions
|
|
271
|
+
// ============================================================================
|
|
272
|
+
/**
|
|
273
|
+
* Start video scanning
|
|
274
|
+
*/
|
|
275
|
+
const startScanning = useCallback(() => {
|
|
276
|
+
if (!isReady) {
|
|
277
|
+
logger.warn('[VideoScanner] Not ready to scan');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
setIsScanning(true);
|
|
281
|
+
setError(null);
|
|
282
|
+
frameCountRef.current = 0;
|
|
283
|
+
fpsStartTimeRef.current = Date.now();
|
|
284
|
+
productHistoryRef.current = [];
|
|
285
|
+
// Start barcode scanner if enabled
|
|
286
|
+
if (modes.includes('barcodes')) {
|
|
287
|
+
barcodeScanner.startScanning();
|
|
288
|
+
}
|
|
289
|
+
}, [isReady, modes, barcodeScanner]);
|
|
290
|
+
/**
|
|
291
|
+
* Stop video scanning
|
|
292
|
+
*/
|
|
293
|
+
const stopScanning = useCallback(() => {
|
|
294
|
+
setIsScanning(false);
|
|
295
|
+
barcodeScanner.stopScanning();
|
|
296
|
+
}, [barcodeScanner]);
|
|
297
|
+
/**
|
|
298
|
+
* Toggle scanning
|
|
299
|
+
*/
|
|
300
|
+
const toggleScanning = useCallback(() => {
|
|
301
|
+
if (isScanning) {
|
|
302
|
+
stopScanning();
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
startScanning();
|
|
306
|
+
}
|
|
307
|
+
}, [isScanning, startScanning, stopScanning]);
|
|
308
|
+
/**
|
|
309
|
+
* Clear all detections
|
|
310
|
+
*/
|
|
311
|
+
const clearDetections = useCallback(() => {
|
|
312
|
+
setProducts([]);
|
|
313
|
+
setBarcodes([]);
|
|
314
|
+
barcodeScanner.clearResults();
|
|
315
|
+
productDetector.clearDetections();
|
|
316
|
+
productHistoryRef.current = [];
|
|
317
|
+
}, [barcodeScanner, productDetector]);
|
|
318
|
+
/**
|
|
319
|
+
* Capture current frame as photo
|
|
320
|
+
*/
|
|
321
|
+
const captureFrame = useCallback(async () => {
|
|
322
|
+
// This would use VisionCamera's takePhoto method
|
|
323
|
+
// Requires ref to be properly typed and connected
|
|
324
|
+
logger.debug('[VideoScanner] Frame capture requires VisionCamera ref');
|
|
325
|
+
return null;
|
|
326
|
+
}, []);
|
|
327
|
+
// ============================================================================
|
|
328
|
+
// Frame Processor Configuration
|
|
329
|
+
// ============================================================================
|
|
330
|
+
const frameProcessorConfig = useMemo(() => {
|
|
331
|
+
if (!isScanning)
|
|
332
|
+
return null;
|
|
333
|
+
return {
|
|
334
|
+
// For VisionCamera frame processor
|
|
335
|
+
// This would be used with useFrameProcessor
|
|
336
|
+
codeScanner: modes.includes('barcodes') ? barcodeScanner.frameProcessor : undefined,
|
|
337
|
+
// Product detection happens through processFrame
|
|
338
|
+
};
|
|
339
|
+
}, [isScanning, modes, barcodeScanner.frameProcessor]);
|
|
340
|
+
// ============================================================================
|
|
341
|
+
// Cleanup
|
|
342
|
+
// ============================================================================
|
|
343
|
+
useEffect(() => {
|
|
344
|
+
mountedRef.current = true;
|
|
345
|
+
return () => {
|
|
346
|
+
mountedRef.current = false;
|
|
347
|
+
};
|
|
348
|
+
}, []);
|
|
349
|
+
// Sync barcode results
|
|
350
|
+
useEffect(() => {
|
|
351
|
+
if (barcodeScanner.results.length > 0) {
|
|
352
|
+
setBarcodes(barcodeScanner.results);
|
|
353
|
+
}
|
|
354
|
+
}, [barcodeScanner.results]);
|
|
355
|
+
// ============================================================================
|
|
356
|
+
// Return
|
|
357
|
+
// ============================================================================
|
|
358
|
+
return {
|
|
359
|
+
// State
|
|
360
|
+
isScanning,
|
|
361
|
+
isReady,
|
|
362
|
+
products,
|
|
363
|
+
barcodes,
|
|
364
|
+
frameNumber,
|
|
365
|
+
fps,
|
|
366
|
+
error,
|
|
367
|
+
inferenceTimeMs: inferenceTimeMsRef.current,
|
|
368
|
+
// Actions
|
|
369
|
+
startScanning,
|
|
370
|
+
stopScanning,
|
|
371
|
+
toggleScanning,
|
|
372
|
+
clearDetections,
|
|
373
|
+
captureFrame,
|
|
374
|
+
// Camera ref
|
|
375
|
+
cameraRef,
|
|
376
|
+
// Frame processor config
|
|
377
|
+
frameProcessorConfig,
|
|
378
|
+
// TFLite frame processor (use this with VisionCamera)
|
|
379
|
+
frameProcessor: useOnDeviceFrameProcessor ? tfliteFrameProcessor.frameProcessor : undefined,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
export default useVideoScanner;
|
|
383
|
+
//# sourceMappingURL=useVideoScanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVideoScanner.js","sourceRoot":"","sources":["../../../src/hooks/useVideoScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @souschef/ml-vision
|
|
3
|
+
*
|
|
4
|
+
* ML-powered product detection for React Native
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Multi-barcode scanning (scan multiple barcodes at once)
|
|
8
|
+
* - Receipt OCR (photograph receipts to extract items)
|
|
9
|
+
* - Visual product recognition (recognize fridge/pantry contents)
|
|
10
|
+
* - Video scanning (real-time product detection)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import {
|
|
15
|
+
* MLVisionProvider,
|
|
16
|
+
* useMultiBarcodeScanner,
|
|
17
|
+
* useProductDetector,
|
|
18
|
+
* useReceiptScanner,
|
|
19
|
+
* } from '@souschef/ml-vision';
|
|
20
|
+
*
|
|
21
|
+
* // Wrap your app with the provider
|
|
22
|
+
* function App() {
|
|
23
|
+
* return (
|
|
24
|
+
* <MLVisionProvider
|
|
25
|
+
* config={{ serverUrl: 'http://192.168.1.100:8000' }}
|
|
26
|
+
* storage={mmkvInstance}
|
|
27
|
+
* >
|
|
28
|
+
* <YourApp />
|
|
29
|
+
* </MLVisionProvider>
|
|
30
|
+
* );
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // Use hooks in your components
|
|
34
|
+
* function ScannerScreen() {
|
|
35
|
+
* const { scanPhoto, results } = useMultiBarcodeScanner();
|
|
36
|
+
* const { detectProducts, detections } = useProductDetector();
|
|
37
|
+
*
|
|
38
|
+
* // ...
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @packageDocumentation
|
|
43
|
+
*/
|
|
44
|
+
// Re-export barcode format constants
|
|
45
|
+
export { GROCERY_BARCODE_FORMATS } from './types/barcode';
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// Core - Provider, Cache, Server Client
|
|
48
|
+
// ============================================================================
|
|
49
|
+
export {
|
|
50
|
+
// Provider
|
|
51
|
+
MLVisionProvider, useMLVisionContext, useMLVisionReady,
|
|
52
|
+
// Cache
|
|
53
|
+
CacheManager, createCacheManager, CACHE_TTL,
|
|
54
|
+
// Server Client
|
|
55
|
+
ServerClient, createServerClient, ServerError, } from './core';
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Hooks
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Phase 3: Visual product detection
|
|
60
|
+
export { useProductDetector } from './hooks/useProductDetector';
|
|
61
|
+
export { CLASS_LABELS, NUM_CLASSES, getClassInfo, getLabelsArray, CATEGORY_CLASSES, } from './hooks/classLabels';
|
|
62
|
+
// Phase 5: Multi-barcode scanning
|
|
63
|
+
export { useMultiBarcodeScanner } from './hooks/useMultiBarcodeScanner';
|
|
64
|
+
// Phase 6: Receipt OCR
|
|
65
|
+
export { useReceiptScanner } from './hooks/useReceiptScanner';
|
|
66
|
+
// Phase 7: Video scanning
|
|
67
|
+
export { useVideoScanner, } from './hooks/useVideoScanner';
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Components
|
|
70
|
+
// ============================================================================
|
|
71
|
+
export { DetectionOverlay, DetectionLoadingOverlay, } from './components';
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// Processors
|
|
74
|
+
// ============================================================================
|
|
75
|
+
export { createDetectionProcessor, frameDetectionToResult, getClassLabel, } from './processors';
|
|
76
|
+
// TFLite Frame Processor for real-time video scanning
|
|
77
|
+
export { useTFLiteFrameProcessor, createTFLiteFrameProcessor, } from './processors';
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// Utilities
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Image preprocessing for on-device TFLite inference
|
|
82
|
+
export { preprocessImage, isSkiaAvailable, isResizePluginAvailable, getFrameProcessorInstructions, } from './utils/imagePreprocessor';
|
|
83
|
+
// YOLO output processing
|
|
84
|
+
export { processYoloOutput, scaleDetections, } from './utils/yoloProcessor';
|
|
85
|
+
// COCO class labels (80 classes for general object detection)
|
|
86
|
+
export { COCO_CLASSES, CLASS_LABELS_COCO, NUM_CLASSES_COCO, FOOD_CLASS_INDICES, getCocoClassInfo, isFoodClass, } from './hooks/classLabelsCoco';
|
|
87
|
+
// Logger utility
|
|
88
|
+
export { logger, setLogLevel, getLogLevel, } from './utils/logger';
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Version
|
|
91
|
+
// ============================================================================
|
|
92
|
+
export const VERSION = '0.1.1';
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAsDH,qCAAqC;AACrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,+EAA+E;AAC/E,wCAAwC;AACxC,+EAA+E;AAE/E,OAAO;AACL,WAAW;AACX,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB;AAIhB,QAAQ;AACR,YAAY,EACZ,kBAAkB,EAClB,SAAS;AAIT,gBAAgB;AAChB,YAAY,EACZ,kBAAkB,EAClB,WAAW,GAKZ,MAAM,QAAQ,CAAC;AAEhB,+EAA+E;AAC/E,QAAQ;AACR,+EAA+E;AAE/E,oCAAoC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,cAAc,EACd,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,kCAAkC;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,0BAA0B;AAC1B,OAAO,EACL,eAAe,GAKhB,MAAM,yBAAyB,CAAC;AAEjC,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GAExB,MAAM,cAAc,CAAC;AAEtB,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,GAGd,MAAM,cAAc,CAAC;AAEtB,sDAAsD;AACtD,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,cAAc,CAAC;AAEtB,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,qDAAqD;AACrD,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,yBAAyB;AACzB,OAAO,EACL,iBAAiB,EACjB,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,8DAA8D;AAC9D,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,iBAAiB;AACjB,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,GAEZ,MAAM,gBAAgB,CAAC;AAExB,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection Frame Processor
|
|
3
|
+
*
|
|
4
|
+
* VisionCamera frame processor for real-time product detection.
|
|
5
|
+
* Uses react-native-fast-tflite for on-device inference.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { useFrameProcessor } from 'react-native-vision-camera';
|
|
10
|
+
* import { detectProducts } from '@souschef/ml-vision/processors';
|
|
11
|
+
*
|
|
12
|
+
* function CameraScreen() {
|
|
13
|
+
* const frameProcessor = useFrameProcessor((frame) => {
|
|
14
|
+
* 'worklet';
|
|
15
|
+
* const detections = detectProducts(frame);
|
|
16
|
+
* // Handle detections...
|
|
17
|
+
* }, []);
|
|
18
|
+
*
|
|
19
|
+
* return <Camera frameProcessor={frameProcessor} />;
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { CLASS_LABELS, NUM_CLASSES } from '../hooks/classLabels';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Frame Counter for Skipping
|
|
26
|
+
// ============================================================================
|
|
27
|
+
let frameCounter = 0;
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Frame Processor Plugin
|
|
30
|
+
// ============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* Create a detection frame processor
|
|
33
|
+
*
|
|
34
|
+
* This returns a function that can be used with VisionCamera's useFrameProcessor.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const detectFrame = createDetectionProcessor({
|
|
39
|
+
* minConfidence: 0.5,
|
|
40
|
+
* maxDetections: 10,
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* const frameProcessor = useFrameProcessor((frame) => {
|
|
44
|
+
* 'worklet';
|
|
45
|
+
* const detections = detectFrame(frame);
|
|
46
|
+
* runOnJS(handleDetections)(detections);
|
|
47
|
+
* }, []);
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export function createDetectionProcessor(options = {}) {
|
|
51
|
+
const { frameSkip = 3 } = options;
|
|
52
|
+
/**
|
|
53
|
+
* The actual frame processor function
|
|
54
|
+
*
|
|
55
|
+
* Note: This is a placeholder that shows the expected interface.
|
|
56
|
+
* The actual TFLite inference requires native module integration
|
|
57
|
+
* via react-native-fast-tflite's useRunOnce or similar.
|
|
58
|
+
*/
|
|
59
|
+
return function detectProductsInFrame(_frame) {
|
|
60
|
+
'worklet';
|
|
61
|
+
// Frame skipping for performance
|
|
62
|
+
frameCounter++;
|
|
63
|
+
if (frameCounter % frameSkip !== 0) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
// In a real implementation, this would:
|
|
67
|
+
// 1. Get frame data from VisionCamera
|
|
68
|
+
// 2. Preprocess for TFLite input
|
|
69
|
+
// 3. Run inference via react-native-fast-tflite
|
|
70
|
+
// 4. Post-process output
|
|
71
|
+
// Placeholder - actual implementation requires native TFLite integration
|
|
72
|
+
// with VisionCamera frame processors using Reanimated worklets
|
|
73
|
+
return [];
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Utility Functions
|
|
78
|
+
// ============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Convert FrameDetection to ProductDetectionResult
|
|
81
|
+
*
|
|
82
|
+
* Call this on the JS thread after receiving worklet results.
|
|
83
|
+
*/
|
|
84
|
+
export function frameDetectionToResult(detection, imageWidth, imageHeight) {
|
|
85
|
+
const classInfo = CLASS_LABELS[detection.classIndex] ?? {
|
|
86
|
+
label: `class_${detection.classIndex}`,
|
|
87
|
+
category: 'unknown',
|
|
88
|
+
};
|
|
89
|
+
const boundingBox = {
|
|
90
|
+
x: detection.box.x * imageWidth,
|
|
91
|
+
y: detection.box.y * imageHeight,
|
|
92
|
+
width: detection.box.width * imageWidth,
|
|
93
|
+
height: detection.box.height * imageHeight,
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
id: `frame_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
97
|
+
type: 'product',
|
|
98
|
+
confidence: detection.confidence,
|
|
99
|
+
boundingBox,
|
|
100
|
+
data: {
|
|
101
|
+
category: classInfo.category,
|
|
102
|
+
classLabel: classInfo.label,
|
|
103
|
+
classIndex: detection.classIndex,
|
|
104
|
+
name: classInfo.label.replace(/_/g, ' '),
|
|
105
|
+
},
|
|
106
|
+
source: 'on_device',
|
|
107
|
+
processingTimeMs: 0, // Frame processor timing handled externally
|
|
108
|
+
timestamp: Date.now(),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get label for class index (can be called from worklet via shared value)
|
|
113
|
+
*/
|
|
114
|
+
export function getClassLabel(classIndex) {
|
|
115
|
+
return CLASS_LABELS[classIndex]?.label ?? `class_${classIndex}`;
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// Export
|
|
119
|
+
// ============================================================================
|
|
120
|
+
export { NUM_CLASSES, CLASS_LABELS };
|
|
121
|
+
//# sourceMappingURL=detectionProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectionProcessor.js","sourceRoot":"","sources":["../../../src/processors/detectionProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAuCjE,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAqC,EAAE;IAC9E,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAElC;;;;;;OAMG;IACH,OAAO,SAAS,qBAAqB,CACnC,MAAe;QAEf,SAAS,CAAC;QAEV,iCAAiC;QACjC,YAAY,EAAE,CAAC;QACf,IAAI,YAAY,GAAG,SAAS,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,wCAAwC;QACxC,sCAAsC;QACtC,iCAAiC;QACjC,gDAAgD;QAChD,yBAAyB;QAEzB,yEAAyE;QACzE,+DAA+D;QAE/D,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAyB,EACzB,UAAkB,EAClB,WAAmB;IAEnB,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI;QACtD,KAAK,EAAE,SAAS,SAAS,CAAC,UAAU,EAAE;QACtC,QAAQ,EAAE,SAAkB;KAC7B,CAAC;IAEF,MAAM,WAAW,GAAgB;QAC/B,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU;QAC/B,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW;QAChC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,GAAG,UAAU;QACvC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW;KAC3C,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACpE,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,WAAW;QACX,IAAI,EAAE;YACJ,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,UAAU,EAAE,SAAS,CAAC,KAAK;YAC3B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SACzC;QACD,MAAM,EAAE,WAAW;QACnB,gBAAgB,EAAE,CAAC,EAAE,4CAA4C;QACjE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,IAAI,SAAS,UAAU,EAAE,CAAC;AAClE,CAAC;AAED,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Processors exports
|
|
3
|
+
*/
|
|
4
|
+
export { createDetectionProcessor, frameDetectionToResult, getClassLabel, NUM_CLASSES, CLASS_LABELS, } from './detectionProcessor';
|
|
5
|
+
// TFLite Frame Processor for real-time video scanning
|
|
6
|
+
export { useTFLiteFrameProcessor, createTFLiteFrameProcessor, } from './tfliteFrameProcessor';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/processors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,aAAa,EACb,WAAW,EACX,YAAY,GAGb,MAAM,sBAAsB,CAAC;AAE9B,sDAAsD;AACtD,OAAO,EACL,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,wBAAwB,CAAC"}
|