@souscheflabs/ml-vision 0.1.1 → 0.1.3
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/cjs/hooks/classLabels.js +178 -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 +168 -97
- 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 +174 -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 +5 -4
- 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/hooks/classLabels.js +0 -439
- package/dist/index.d.ts +0 -58
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ServerClient - HTTP client for ML inference server communication
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Health checks
|
|
6
|
+
* - Product detection requests
|
|
7
|
+
* - OCR requests
|
|
8
|
+
* - Error handling and retries
|
|
9
|
+
*/
|
|
10
|
+
import { logger } from '../utils/logger';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Server Error
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Custom error for server communication failures
|
|
16
|
+
*/
|
|
17
|
+
export class ServerError extends Error {
|
|
18
|
+
constructor(message, code, statusCode, details) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = 'ServerError';
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.statusCode = statusCode;
|
|
23
|
+
this.details = details;
|
|
24
|
+
}
|
|
25
|
+
static fromResponse(response, statusCode) {
|
|
26
|
+
return new ServerError(response.error, response.code, statusCode, response.details);
|
|
27
|
+
}
|
|
28
|
+
static networkError(originalError) {
|
|
29
|
+
return new ServerError(originalError?.message || 'Network request failed', 'NETWORK_ERROR');
|
|
30
|
+
}
|
|
31
|
+
static timeoutError() {
|
|
32
|
+
return new ServerError('Request timed out', 'TIMEOUT_ERROR');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// ServerClient Class
|
|
37
|
+
// ============================================================================
|
|
38
|
+
/**
|
|
39
|
+
* Client for communicating with the ML inference server
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const client = new ServerClient('http://192.168.1.100:8000');
|
|
44
|
+
*
|
|
45
|
+
* // Check health
|
|
46
|
+
* const health = await client.checkHealth();
|
|
47
|
+
*
|
|
48
|
+
* // Detect products
|
|
49
|
+
* const detections = await client.detectProducts({
|
|
50
|
+
* image: base64Image,
|
|
51
|
+
* isBase64: true,
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export class ServerClient {
|
|
56
|
+
constructor(baseUrl, defaultTimeout = 5000) {
|
|
57
|
+
// Remove trailing slash
|
|
58
|
+
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
59
|
+
this.defaultTimeout = defaultTimeout;
|
|
60
|
+
}
|
|
61
|
+
// ==========================================================================
|
|
62
|
+
// Health Check
|
|
63
|
+
// ==========================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Check server health status
|
|
66
|
+
*/
|
|
67
|
+
async checkHealth(options) {
|
|
68
|
+
const response = await this.request('/health', 'GET', undefined, options);
|
|
69
|
+
return response;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Quick connectivity check (returns boolean)
|
|
73
|
+
*/
|
|
74
|
+
async isAvailable() {
|
|
75
|
+
try {
|
|
76
|
+
const health = await this.checkHealth({ timeout: 2000 });
|
|
77
|
+
return health.status === 'healthy';
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ==========================================================================
|
|
84
|
+
// Detection Endpoints
|
|
85
|
+
// ==========================================================================
|
|
86
|
+
/**
|
|
87
|
+
* Detect products in an image
|
|
88
|
+
*/
|
|
89
|
+
async detectProducts(imageData, options) {
|
|
90
|
+
logger.debug('[ServerClient] detectProducts called');
|
|
91
|
+
logger.debug('[ServerClient] baseUrl:', this.baseUrl);
|
|
92
|
+
logger.debug('[ServerClient] imageData.image:', imageData.image?.substring(0, 100));
|
|
93
|
+
logger.debug('[ServerClient] imageData.isBase64:', imageData.isBase64);
|
|
94
|
+
const formData = this.createImageFormData(imageData);
|
|
95
|
+
if (options?.maxDetections) {
|
|
96
|
+
formData.append('max_detections', String(options.maxDetections));
|
|
97
|
+
}
|
|
98
|
+
if (options?.minConfidence) {
|
|
99
|
+
formData.append('min_confidence', String(options.minConfidence));
|
|
100
|
+
}
|
|
101
|
+
if (options?.categories) {
|
|
102
|
+
formData.append('categories', options.categories.join(','));
|
|
103
|
+
}
|
|
104
|
+
logger.debug('[ServerClient] Sending request to /api/v1/detect/products...');
|
|
105
|
+
try {
|
|
106
|
+
const response = await this.requestWithForm('/api/v1/detect/products', formData, options);
|
|
107
|
+
logger.debug('[ServerClient] Response received:', JSON.stringify(response));
|
|
108
|
+
return response.detections;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
logger.error('[ServerClient] Request failed:', err);
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Detect fresh produce with quality assessment
|
|
117
|
+
*/
|
|
118
|
+
async detectProduce(imageData, options) {
|
|
119
|
+
const formData = this.createImageFormData(imageData);
|
|
120
|
+
const response = await this.requestWithForm('/api/v1/detect/produce', formData, options);
|
|
121
|
+
return response.detections;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Detect spice jars (requires larger model on server)
|
|
125
|
+
*/
|
|
126
|
+
async detectSpices(imageData, options) {
|
|
127
|
+
const formData = this.createImageFormData(imageData);
|
|
128
|
+
const response = await this.requestWithForm('/api/v1/detect/spices', formData, options);
|
|
129
|
+
return response.detections;
|
|
130
|
+
}
|
|
131
|
+
// ==========================================================================
|
|
132
|
+
// OCR Endpoints
|
|
133
|
+
// ==========================================================================
|
|
134
|
+
/**
|
|
135
|
+
* Extract text and items from a receipt image
|
|
136
|
+
*/
|
|
137
|
+
async scanReceipt(imageData, options) {
|
|
138
|
+
const formData = this.createImageFormData(imageData);
|
|
139
|
+
if (options?.storeHint) {
|
|
140
|
+
formData.append('store_hint', options.storeHint);
|
|
141
|
+
}
|
|
142
|
+
if (options?.languageHint) {
|
|
143
|
+
formData.append('language_hint', options.languageHint);
|
|
144
|
+
}
|
|
145
|
+
const response = await this.requestWithForm('/api/v1/ocr/receipt', formData, options);
|
|
146
|
+
return response;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Read text from a product label
|
|
150
|
+
*/
|
|
151
|
+
async readLabel(imageData, options) {
|
|
152
|
+
const formData = this.createImageFormData(imageData);
|
|
153
|
+
const response = await this.requestWithForm('/api/v1/ocr/label', formData, options);
|
|
154
|
+
return response;
|
|
155
|
+
}
|
|
156
|
+
// ==========================================================================
|
|
157
|
+
// Private Methods
|
|
158
|
+
// ==========================================================================
|
|
159
|
+
/**
|
|
160
|
+
* Create FormData with image
|
|
161
|
+
*/
|
|
162
|
+
createImageFormData(imageData) {
|
|
163
|
+
const formData = new FormData();
|
|
164
|
+
if (imageData.isBase64) {
|
|
165
|
+
// For base64, send as a field
|
|
166
|
+
formData.append('image_base64', imageData.image);
|
|
167
|
+
if (imageData.mimeType) {
|
|
168
|
+
formData.append('mime_type', imageData.mimeType);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// For file URI, create a file object
|
|
173
|
+
// React Native's FormData handles file:// URIs
|
|
174
|
+
const uri = imageData.image;
|
|
175
|
+
const filename = uri.split('/').pop() || 'image.jpg';
|
|
176
|
+
const type = imageData.mimeType || 'image/jpeg';
|
|
177
|
+
formData.append('image', {
|
|
178
|
+
uri,
|
|
179
|
+
name: filename,
|
|
180
|
+
type,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
return formData;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Make a JSON request
|
|
187
|
+
*/
|
|
188
|
+
async request(endpoint, method, body, options) {
|
|
189
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
190
|
+
const timeout = options?.timeout ?? this.defaultTimeout;
|
|
191
|
+
// Create abort controller for timeout
|
|
192
|
+
const controller = new AbortController();
|
|
193
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
194
|
+
// Track external abort handler for cleanup
|
|
195
|
+
let externalAbortHandler = null;
|
|
196
|
+
// Combine with external signal if provided
|
|
197
|
+
if (options?.signal) {
|
|
198
|
+
externalAbortHandler = () => controller.abort();
|
|
199
|
+
options.signal.addEventListener('abort', externalAbortHandler);
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const response = await fetch(url, {
|
|
203
|
+
method,
|
|
204
|
+
headers: {
|
|
205
|
+
'Content-Type': 'application/json',
|
|
206
|
+
Accept: 'application/json',
|
|
207
|
+
},
|
|
208
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
209
|
+
signal: controller.signal,
|
|
210
|
+
});
|
|
211
|
+
if (!response.ok) {
|
|
212
|
+
const errorBody = await response.json().catch(() => ({
|
|
213
|
+
error: 'Unknown error',
|
|
214
|
+
code: 'UNKNOWN_ERROR',
|
|
215
|
+
}));
|
|
216
|
+
throw ServerError.fromResponse(errorBody, response.status);
|
|
217
|
+
}
|
|
218
|
+
return (await response.json());
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
if (error instanceof ServerError) {
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
if (error instanceof Error) {
|
|
225
|
+
if (error.name === 'AbortError') {
|
|
226
|
+
throw ServerError.timeoutError();
|
|
227
|
+
}
|
|
228
|
+
throw ServerError.networkError(error);
|
|
229
|
+
}
|
|
230
|
+
throw ServerError.networkError();
|
|
231
|
+
}
|
|
232
|
+
finally {
|
|
233
|
+
// Clean up timeout
|
|
234
|
+
clearTimeout(timeoutId);
|
|
235
|
+
// Clean up external abort listener
|
|
236
|
+
if (options?.signal && externalAbortHandler) {
|
|
237
|
+
options.signal.removeEventListener('abort', externalAbortHandler);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Make a multipart form request
|
|
243
|
+
*/
|
|
244
|
+
async requestWithForm(endpoint, formData, options) {
|
|
245
|
+
const url = `${this.baseUrl}${endpoint}`;
|
|
246
|
+
const timeout = options?.timeout ?? this.defaultTimeout;
|
|
247
|
+
const controller = new AbortController();
|
|
248
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
249
|
+
// Track external abort handler for cleanup
|
|
250
|
+
let externalAbortHandler = null;
|
|
251
|
+
if (options?.signal) {
|
|
252
|
+
externalAbortHandler = () => controller.abort();
|
|
253
|
+
options.signal.addEventListener('abort', externalAbortHandler);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
const response = await fetch(url, {
|
|
257
|
+
method: 'POST',
|
|
258
|
+
headers: {
|
|
259
|
+
Accept: 'application/json',
|
|
260
|
+
// Don't set Content-Type for FormData - fetch will set it with boundary
|
|
261
|
+
},
|
|
262
|
+
body: formData,
|
|
263
|
+
signal: controller.signal,
|
|
264
|
+
});
|
|
265
|
+
if (!response.ok) {
|
|
266
|
+
const errorBody = await response.json().catch(() => ({
|
|
267
|
+
error: 'Unknown error',
|
|
268
|
+
code: 'UNKNOWN_ERROR',
|
|
269
|
+
}));
|
|
270
|
+
throw ServerError.fromResponse(errorBody, response.status);
|
|
271
|
+
}
|
|
272
|
+
return (await response.json());
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
if (error instanceof ServerError) {
|
|
276
|
+
throw error;
|
|
277
|
+
}
|
|
278
|
+
if (error instanceof Error) {
|
|
279
|
+
if (error.name === 'AbortError') {
|
|
280
|
+
throw ServerError.timeoutError();
|
|
281
|
+
}
|
|
282
|
+
throw ServerError.networkError(error);
|
|
283
|
+
}
|
|
284
|
+
throw ServerError.networkError();
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
// Clean up timeout
|
|
288
|
+
clearTimeout(timeoutId);
|
|
289
|
+
// Clean up external abort listener
|
|
290
|
+
if (options?.signal && externalAbortHandler) {
|
|
291
|
+
options.signal.removeEventListener('abort', externalAbortHandler);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// ============================================================================
|
|
297
|
+
// Factory Function
|
|
298
|
+
// ============================================================================
|
|
299
|
+
/**
|
|
300
|
+
* Create a ServerClient instance
|
|
301
|
+
*/
|
|
302
|
+
export function createServerClient(baseUrl, timeout) {
|
|
303
|
+
return new ServerClient(baseUrl, timeout);
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=ServerClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerClient.js","sourceRoot":"","sources":["../../../src/core/ServerClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core module exports
|
|
3
|
+
*/
|
|
4
|
+
export { MLVisionProvider, useMLVisionContext, useMLVisionReady, } from './MLVisionProvider';
|
|
5
|
+
export { CacheManager, createCacheManager, CACHE_TTL, } from './CacheManager';
|
|
6
|
+
export { ServerClient, createServerClient, ServerError, } from './ServerClient';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,SAAS,GAGV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,WAAW,GAKZ,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class label mappings for the trained SousChef YOLOv8 model
|
|
3
|
+
*
|
|
4
|
+
* These labels correspond to the 43 classes in the souschef_products_v2 model.
|
|
5
|
+
* The model was trained on curated grocery product images.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Categorize a food item label
|
|
9
|
+
*/
|
|
10
|
+
function categorizeLabel(label) {
|
|
11
|
+
// Produce
|
|
12
|
+
const produce = [
|
|
13
|
+
'apple', 'banana', 'blackberries', 'blueberries', 'cherries',
|
|
14
|
+
'lettuce', 'pomegranate', 'red_onion', 'serrano_pepper', 'tomato'
|
|
15
|
+
];
|
|
16
|
+
// Meat & Seafood
|
|
17
|
+
const meat = [
|
|
18
|
+
'beef_tenderloin', 'chicken_drumsticks', 'chicken_tenders', 'chicken_wings',
|
|
19
|
+
'chuck_roast', 'ground_beef', 'pork_chops', 'pork_loin', 'pork_shoulder',
|
|
20
|
+
'pork_tenderloin', 'rotisserie_chicken', 'sirloin_steak'
|
|
21
|
+
];
|
|
22
|
+
// Dairy
|
|
23
|
+
const dairy = [
|
|
24
|
+
'butter', 'goat_cheese', 'greek_yogurt', 'half_and_half', 'provolone_cheese',
|
|
25
|
+
'salted_butter', 'shredded_cheese', 'sliced_cheese', 'unsalted_butter',
|
|
26
|
+
'whole_milk', 'yogurt'
|
|
27
|
+
];
|
|
28
|
+
// Packaged/Pantry
|
|
29
|
+
const packaged = [
|
|
30
|
+
'all_purpose_flour', 'crushed_tomatoes', 'flour', 'honey', 'mixed_nuts',
|
|
31
|
+
'rice', 'sugar', 'white_rice'
|
|
32
|
+
];
|
|
33
|
+
// Beverages
|
|
34
|
+
const beverage = [
|
|
35
|
+
'bottled_water', 'sparkling_water'
|
|
36
|
+
];
|
|
37
|
+
if (produce.includes(label))
|
|
38
|
+
return 'produce';
|
|
39
|
+
if (meat.includes(label))
|
|
40
|
+
return 'meat';
|
|
41
|
+
if (dairy.includes(label))
|
|
42
|
+
return 'dairy';
|
|
43
|
+
if (packaged.includes(label))
|
|
44
|
+
return 'packaged';
|
|
45
|
+
if (beverage.includes(label))
|
|
46
|
+
return 'beverage';
|
|
47
|
+
// Default categorization based on common patterns
|
|
48
|
+
if (label.includes('cheese'))
|
|
49
|
+
return 'dairy';
|
|
50
|
+
if (label.includes('milk') || label.includes('cream') || label.includes('butter'))
|
|
51
|
+
return 'dairy';
|
|
52
|
+
if (label.includes('beef') || label.includes('chicken') || label.includes('pork') ||
|
|
53
|
+
label.includes('fish') || label.includes('shrimp') || label.includes('salmon'))
|
|
54
|
+
return 'meat';
|
|
55
|
+
if (label.includes('bread') || label.includes('bun'))
|
|
56
|
+
return 'bakery';
|
|
57
|
+
if (label.includes('juice') || label.includes('water') || label.includes('soda'))
|
|
58
|
+
return 'beverage';
|
|
59
|
+
return 'unknown';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Map class index to label and category (43 classes)
|
|
63
|
+
*/
|
|
64
|
+
export const CLASS_LABELS = {
|
|
65
|
+
0: { label: 'all_purpose_flour', category: 'packaged' },
|
|
66
|
+
1: { label: 'apple', category: 'produce' },
|
|
67
|
+
2: { label: 'banana', category: 'produce' },
|
|
68
|
+
3: { label: 'beef_tenderloin', category: 'meat' },
|
|
69
|
+
4: { label: 'blackberries', category: 'produce' },
|
|
70
|
+
5: { label: 'blueberries', category: 'produce' },
|
|
71
|
+
6: { label: 'bottled_water', category: 'beverage' },
|
|
72
|
+
7: { label: 'butter', category: 'dairy' },
|
|
73
|
+
8: { label: 'cherries', category: 'produce' },
|
|
74
|
+
9: { label: 'chicken_drumsticks', category: 'meat' },
|
|
75
|
+
10: { label: 'chicken_tenders', category: 'meat' },
|
|
76
|
+
11: { label: 'chicken_wings', category: 'meat' },
|
|
77
|
+
12: { label: 'chuck_roast', category: 'meat' },
|
|
78
|
+
13: { label: 'crushed_tomatoes', category: 'packaged' },
|
|
79
|
+
14: { label: 'flour', category: 'packaged' },
|
|
80
|
+
15: { label: 'goat_cheese', category: 'dairy' },
|
|
81
|
+
16: { label: 'greek_yogurt', category: 'dairy' },
|
|
82
|
+
17: { label: 'ground_beef', category: 'meat' },
|
|
83
|
+
18: { label: 'half_and_half', category: 'dairy' },
|
|
84
|
+
19: { label: 'honey', category: 'packaged' },
|
|
85
|
+
20: { label: 'lettuce', category: 'produce' },
|
|
86
|
+
21: { label: 'mixed_nuts', category: 'snack' },
|
|
87
|
+
22: { label: 'pomegranate', category: 'produce' },
|
|
88
|
+
23: { label: 'pork_chops', category: 'meat' },
|
|
89
|
+
24: { label: 'pork_loin', category: 'meat' },
|
|
90
|
+
25: { label: 'pork_shoulder', category: 'meat' },
|
|
91
|
+
26: { label: 'pork_tenderloin', category: 'meat' },
|
|
92
|
+
27: { label: 'provolone_cheese', category: 'dairy' },
|
|
93
|
+
28: { label: 'red_onion', category: 'produce' },
|
|
94
|
+
29: { label: 'rice', category: 'packaged' },
|
|
95
|
+
30: { label: 'rotisserie_chicken', category: 'meat' },
|
|
96
|
+
31: { label: 'salted_butter', category: 'dairy' },
|
|
97
|
+
32: { label: 'serrano_pepper', category: 'produce' },
|
|
98
|
+
33: { label: 'shredded_cheese', category: 'dairy' },
|
|
99
|
+
34: { label: 'sirloin_steak', category: 'meat' },
|
|
100
|
+
35: { label: 'sliced_cheese', category: 'dairy' },
|
|
101
|
+
36: { label: 'sparkling_water', category: 'beverage' },
|
|
102
|
+
37: { label: 'sugar', category: 'packaged' },
|
|
103
|
+
38: { label: 'tomato', category: 'produce' },
|
|
104
|
+
39: { label: 'unsalted_butter', category: 'dairy' },
|
|
105
|
+
40: { label: 'white_rice', category: 'packaged' },
|
|
106
|
+
41: { label: 'whole_milk', category: 'dairy' },
|
|
107
|
+
42: { label: 'yogurt', category: 'dairy' },
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Number of classes in the model
|
|
111
|
+
*/
|
|
112
|
+
export const NUM_CLASSES = 43;
|
|
113
|
+
/**
|
|
114
|
+
* Get label info for a class index
|
|
115
|
+
*/
|
|
116
|
+
export function getClassInfo(classIndex) {
|
|
117
|
+
const info = CLASS_LABELS[classIndex];
|
|
118
|
+
if (info) {
|
|
119
|
+
return info;
|
|
120
|
+
}
|
|
121
|
+
// Fallback for unknown indices
|
|
122
|
+
return { label: `class_${classIndex}`, category: 'unknown' };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get all labels as an array (ordered by class index)
|
|
126
|
+
*/
|
|
127
|
+
export function getLabelsArray() {
|
|
128
|
+
const labels = [];
|
|
129
|
+
for (let i = 0; i < NUM_CLASSES; i++) {
|
|
130
|
+
labels.push(CLASS_LABELS[i]?.label ?? `class_${i}`);
|
|
131
|
+
}
|
|
132
|
+
return labels;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Category to class indices mapping
|
|
136
|
+
*/
|
|
137
|
+
export const CATEGORY_CLASSES = {
|
|
138
|
+
produce: Object.entries(CLASS_LABELS)
|
|
139
|
+
.filter(([, v]) => v.category === 'produce')
|
|
140
|
+
.map(([k]) => parseInt(k, 10)),
|
|
141
|
+
meat: Object.entries(CLASS_LABELS)
|
|
142
|
+
.filter(([, v]) => v.category === 'meat')
|
|
143
|
+
.map(([k]) => parseInt(k, 10)),
|
|
144
|
+
dairy: Object.entries(CLASS_LABELS)
|
|
145
|
+
.filter(([, v]) => v.category === 'dairy')
|
|
146
|
+
.map(([k]) => parseInt(k, 10)),
|
|
147
|
+
packaged: Object.entries(CLASS_LABELS)
|
|
148
|
+
.filter(([, v]) => v.category === 'packaged')
|
|
149
|
+
.map(([k]) => parseInt(k, 10)),
|
|
150
|
+
bakery: Object.entries(CLASS_LABELS)
|
|
151
|
+
.filter(([, v]) => v.category === 'bakery')
|
|
152
|
+
.map(([k]) => parseInt(k, 10)),
|
|
153
|
+
snack: Object.entries(CLASS_LABELS)
|
|
154
|
+
.filter(([, v]) => v.category === 'snack')
|
|
155
|
+
.map(([k]) => parseInt(k, 10)),
|
|
156
|
+
beverage: Object.entries(CLASS_LABELS)
|
|
157
|
+
.filter(([, v]) => v.category === 'beverage')
|
|
158
|
+
.map(([k]) => parseInt(k, 10)),
|
|
159
|
+
condiment: Object.entries(CLASS_LABELS)
|
|
160
|
+
.filter(([, v]) => v.category === 'condiment')
|
|
161
|
+
.map(([k]) => parseInt(k, 10)),
|
|
162
|
+
spice: Object.entries(CLASS_LABELS)
|
|
163
|
+
.filter(([, v]) => v.category === 'spice')
|
|
164
|
+
.map(([k]) => parseInt(k, 10)),
|
|
165
|
+
frozen: Object.entries(CLASS_LABELS)
|
|
166
|
+
.filter(([, v]) => v.category === 'frozen')
|
|
167
|
+
.map(([k]) => parseInt(k, 10)),
|
|
168
|
+
unknown: Object.entries(CLASS_LABELS)
|
|
169
|
+
.filter(([, v]) => v.category === 'unknown')
|
|
170
|
+
.map(([k]) => parseInt(k, 10)),
|
|
171
|
+
};
|
|
172
|
+
// Export the categorize function for use elsewhere
|
|
173
|
+
export { categorizeLabel };
|
|
174
|
+
//# sourceMappingURL=classLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classLabels.js","sourceRoot":"","sources":["../../../src/hooks/classLabels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class label mappings for YOLOv8 COCO model
|
|
3
|
+
*
|
|
4
|
+
* These labels correspond to the 80 classes in the COCO dataset.
|
|
5
|
+
* Food-related classes: banana (46), apple (47), sandwich (48), orange (49),
|
|
6
|
+
* broccoli (50), carrot (51), hot dog (52), pizza (53), donut (54), cake (55)
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* COCO class names in order
|
|
10
|
+
*/
|
|
11
|
+
export const COCO_CLASSES = [
|
|
12
|
+
'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck',
|
|
13
|
+
'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench',
|
|
14
|
+
'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra',
|
|
15
|
+
'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
|
|
16
|
+
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove',
|
|
17
|
+
'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
|
|
18
|
+
'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange',
|
|
19
|
+
'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
|
|
20
|
+
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse',
|
|
21
|
+
'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink',
|
|
22
|
+
'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier',
|
|
23
|
+
'toothbrush'
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Map COCO class to a product category
|
|
27
|
+
*/
|
|
28
|
+
function getCocoCategory(label) {
|
|
29
|
+
// Food items
|
|
30
|
+
const produceItems = ['banana', 'apple', 'orange', 'broccoli', 'carrot'];
|
|
31
|
+
const meatItems = ['hot dog'];
|
|
32
|
+
const bakeryItems = ['sandwich', 'pizza', 'donut', 'cake'];
|
|
33
|
+
const dairyItems = [];
|
|
34
|
+
const beverageItems = ['bottle', 'wine glass', 'cup'];
|
|
35
|
+
const condimentItems = ['bowl']; // Often contains condiments/sauces
|
|
36
|
+
if (produceItems.includes(label))
|
|
37
|
+
return 'produce';
|
|
38
|
+
if (meatItems.includes(label))
|
|
39
|
+
return 'meat';
|
|
40
|
+
if (bakeryItems.includes(label))
|
|
41
|
+
return 'bakery';
|
|
42
|
+
if (dairyItems.includes(label))
|
|
43
|
+
return 'dairy';
|
|
44
|
+
if (beverageItems.includes(label))
|
|
45
|
+
return 'beverage';
|
|
46
|
+
if (condimentItems.includes(label))
|
|
47
|
+
return 'condiment';
|
|
48
|
+
// Kitchen items (useful for context)
|
|
49
|
+
const kitchenItems = [
|
|
50
|
+
'fork', 'knife', 'spoon', 'microwave', 'oven', 'toaster', 'sink',
|
|
51
|
+
'refrigerator', 'dining table'
|
|
52
|
+
];
|
|
53
|
+
if (kitchenItems.includes(label))
|
|
54
|
+
return 'unknown'; // Not a product but kitchen context
|
|
55
|
+
return 'unknown';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Map class index to label and category for COCO
|
|
59
|
+
*/
|
|
60
|
+
export const CLASS_LABELS_COCO = Object.fromEntries(COCO_CLASSES.map((label, index) => [
|
|
61
|
+
index,
|
|
62
|
+
{ label, category: getCocoCategory(label) }
|
|
63
|
+
]));
|
|
64
|
+
/**
|
|
65
|
+
* Number of classes in COCO model
|
|
66
|
+
*/
|
|
67
|
+
export const NUM_CLASSES_COCO = 80;
|
|
68
|
+
/**
|
|
69
|
+
* Food class indices in COCO (useful for filtering)
|
|
70
|
+
*/
|
|
71
|
+
export const FOOD_CLASS_INDICES = [46, 47, 48, 49, 50, 51, 52, 53, 54, 55];
|
|
72
|
+
/**
|
|
73
|
+
* Kitchen/dining class indices (context)
|
|
74
|
+
*/
|
|
75
|
+
export const KITCHEN_CLASS_INDICES = [39, 40, 41, 42, 43, 44, 45, 60, 68, 69, 70, 71, 72];
|
|
76
|
+
/**
|
|
77
|
+
* Get label info for a COCO class index
|
|
78
|
+
*/
|
|
79
|
+
export function getCocoClassInfo(classIndex) {
|
|
80
|
+
const info = CLASS_LABELS_COCO[classIndex];
|
|
81
|
+
if (info) {
|
|
82
|
+
return info;
|
|
83
|
+
}
|
|
84
|
+
return { label: `class_${classIndex}`, category: 'unknown' };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if a class index is a food item
|
|
88
|
+
*/
|
|
89
|
+
export function isFoodClass(classIndex) {
|
|
90
|
+
return FOOD_CLASS_INDICES.includes(classIndex);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all COCO labels as an array
|
|
94
|
+
*/
|
|
95
|
+
export function getCocoLabelsArray() {
|
|
96
|
+
return [...COCO_CLASSES];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=classLabelsCoco.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classLabelsCoco.js","sourceRoot":"","sources":["../../../src/hooks/classLabelsCoco.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hooks exports
|
|
3
|
+
*/
|
|
4
|
+
export { useProductDetector, default as useProductDetectorDefault } from './useProductDetector';
|
|
5
|
+
export { useMultiBarcodeScanner, default as useMultiBarcodeScannerDefault } from './useMultiBarcodeScanner';
|
|
6
|
+
export { useReceiptScanner, default as useReceiptScannerDefault } from './useReceiptScanner';
|
|
7
|
+
export { useVideoScanner, default as useVideoScannerDefault, } from './useVideoScanner';
|
|
8
|
+
export { CLASS_LABELS, NUM_CLASSES, getClassInfo, getLabelsArray, CATEGORY_CLASSES } from './classLabels';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,iBAAiB,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EACL,eAAe,EACf,OAAO,IAAI,sBAAsB,GAKlC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|