scripting
This commit is contained in:
@@ -93,7 +93,10 @@ export async function getModel(): Promise<PlantDiseaseModel> {
|
||||
const model = await Promise.race([
|
||||
loadingPromise,
|
||||
new Promise<never>((_, reject) =>
|
||||
setTimeout(() => reject(new Error(`Model load timed out after ${MODEL_LOAD_TIMEOUT}ms`)), MODEL_LOAD_TIMEOUT),
|
||||
setTimeout(
|
||||
() => reject(new Error(`Model load timed out after ${MODEL_LOAD_TIMEOUT}ms`)),
|
||||
MODEL_LOAD_TIMEOUT,
|
||||
),
|
||||
),
|
||||
]);
|
||||
|
||||
@@ -172,6 +175,18 @@ async function tryLoadTFJS(): Promise<PlantDiseaseModel | null> {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let tf: any;
|
||||
|
||||
// Monkey-patch: add util.isNullOrUndefined for Node.js 26 compatibility.
|
||||
// @tensorflow/tfjs-node references this function which was removed in Node 15+.
|
||||
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||
const nodeUtil = require("util");
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if (typeof (nodeUtil as any).isNullOrUndefined !== "function") {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(nodeUtil as any).isNullOrUndefined = function (x: unknown): boolean {
|
||||
return x === null || x === undefined;
|
||||
};
|
||||
}
|
||||
|
||||
// Try tfjs-node first (server-side, uses native bindings).
|
||||
// Use dynamic strings so bundlers (Turbopack/webpack) don't trace these
|
||||
// as required dependencies — they are truly optional.
|
||||
@@ -197,7 +212,9 @@ async function tryLoadTFJS(): Promise<PlantDiseaseModel | null> {
|
||||
const startTime = performance.now();
|
||||
|
||||
// Reshape to [1, 3, 160, 160] NCHW → [1, 160, 160, 3] NHWC for TF.js
|
||||
const inputTensor = tf.tensor4d(Array.from(tensor), [3, 160, 160])
|
||||
// Reshape NCHW flat array [3*160*160] → [3, 160, 160] → NHWC [1, 160, 160, 3]
|
||||
const inputTensor = tf
|
||||
.tensor3d(Array.from(tensor), [3, 160, 160])
|
||||
.transpose([1, 2, 0])
|
||||
.expandDims(0);
|
||||
|
||||
@@ -352,7 +369,7 @@ function generateMockLogits(tensor: Float32Array): Float32Array {
|
||||
logits[topIndex] = 3.5;
|
||||
|
||||
// Second highest
|
||||
const secondIndex = (topIndex + Math.abs(hash % 10) + 1) % (numClasses - 1) + 1;
|
||||
const secondIndex = ((topIndex + Math.abs(hash % 10) + 1) % (numClasses - 1)) + 1;
|
||||
logits[secondIndex] = 2.5;
|
||||
|
||||
logits[numClasses - 1] = -2; // "unknown" gets low score
|
||||
|
||||
Reference in New Issue
Block a user