mirror of https://github.com/vladmandic/human
add loaded property to model stats and mark models not loaded correctly.
Signed-off-by: Vladimir Mandic <mandic00@live.com>main
parent
df73c8247f
commit
49b25830b4
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -4,6 +4,105 @@
|
||||||
author: <https://github.com/vladmandic>'
|
author: <https://github.com/vladmandic>'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import*as m from"../../dist/human.esm.js";var v=1920,b={debug:!0,backend:"webgl",modelBasePath:"https://vladmandic.github.io/human-models/models/",filter:{enabled:!0,equalization:!1,flip:!1},face:{enabled:!0,detector:{rotation:!1},mesh:{enabled:!0},attention:{enabled:!1},iris:{enabled:!0},description:{enabled:!0},emotion:{enabled:!0},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},segmentation:{enabled:!1},gesture:{enabled:!0}},e=new m.Human(b);e.env.perfadd=!1;e.draw.options.font='small-caps 18px "Lato"';e.draw.options.lineHeight=20;e.draw.options.drawPoints=!0;var a={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("status"),perf:document.getElementById("performance")},n={detect:0,draw:0,tensors:0,start:0},s={detectFPS:0,drawFPS:0,frames:0,averageMs:0},o=(...t)=>{a.log.innerText+=t.join(" ")+`
|
|
||||||
`,console.log(...t)},i=t=>a.fps.innerText=t,g=t=>a.perf.innerText="tensors:"+e.tf.memory().numTensors.toString()+" | performance: "+JSON.stringify(t).replace(/"|{|}/g,"").replace(/,/g," | ");async function f(){if(!a.video.paused){n.start===0&&(n.start=e.now()),await e.detect(a.video);let t=e.tf.memory().numTensors;t-n.tensors!==0&&o("allocated tensors:",t-n.tensors),n.tensors=t,s.detectFPS=Math.round(1e3*1e3/(e.now()-n.detect))/1e3,s.frames++,s.averageMs=Math.round(1e3*(e.now()-n.start)/s.frames)/1e3,s.frames%100===0&&!a.video.paused&&o("performance",{...s,tensors:n.tensors})}n.detect=e.now(),requestAnimationFrame(f)}async function u(){var d,r,c;if(!a.video.paused){let l=e.next(e.result),w=await e.image(a.video);e.draw.canvas(w.canvas,a.canvas);let p={bodyLabels:`person confidence [score] and ${(c=(r=(d=e.result)==null?void 0:d.body)==null?void 0:r[0])==null?void 0:c.keypoints.length} keypoints`};await e.draw.all(a.canvas,l,p),g(l.performance)}let t=e.now();s.drawFPS=Math.round(1e3*1e3/(t-n.draw))/1e3,n.draw=t,i(a.video.paused?"paused":`fps: ${s.detectFPS.toFixed(1).padStart(5," ")} detect | ${s.drawFPS.toFixed(1).padStart(5," ")} draw`),setTimeout(u,30)}async function h(){let d=(await e.webcam.enumerate())[0].deviceId,r=await e.webcam.start({element:a.video,crop:!1,width:v,id:d});o(r),a.canvas.width=e.webcam.width,a.canvas.height=e.webcam.height,a.canvas.onclick=async()=>{e.webcam.paused?await e.webcam.play():e.webcam.pause()}}async function y(){o("human version:",e.version,"| tfjs version:",e.tf.version["tfjs-core"]),o("platform:",e.env.platform,"| agent:",e.env.agent),i("loading..."),await e.load(),o("backend:",e.tf.getBackend(),"| available:",e.env.backends),o("models stats:",e.models.stats()),o("models loaded:",e.models.loaded()),o("environment",e.env),i("initializing..."),await e.warmup(),await h(),await f(),await u()}window.onload=y;
|
// demo/typescript/index.ts
|
||||||
|
import * as H from "../../dist/human.esm.js";
|
||||||
|
var width = 1920;
|
||||||
|
var humanConfig = {
|
||||||
|
// user configuration for human, used to fine-tune behavior
|
||||||
|
debug: true,
|
||||||
|
backend: "webgl",
|
||||||
|
// cacheSensitivity: 0,
|
||||||
|
// cacheModels: false,
|
||||||
|
// warmup: 'none',
|
||||||
|
// modelBasePath: '../../models',
|
||||||
|
modelBasePath: "https://vladmandic.github.io/human-models/models/",
|
||||||
|
filter: { enabled: true, equalization: false, flip: false },
|
||||||
|
face: { enabled: true, detector: { rotation: false }, mesh: { enabled: true }, attention: { enabled: false }, iris: { enabled: true }, description: { enabled: true }, emotion: { enabled: true }, antispoof: { enabled: true }, liveness: { enabled: true } },
|
||||||
|
body: { enabled: false },
|
||||||
|
hand: { enabled: false },
|
||||||
|
object: { enabled: false },
|
||||||
|
segmentation: { enabled: false },
|
||||||
|
gesture: { enabled: true }
|
||||||
|
};
|
||||||
|
var human = new H.Human(humanConfig);
|
||||||
|
human.env.perfadd = false;
|
||||||
|
human.draw.options.font = 'small-caps 18px "Lato"';
|
||||||
|
human.draw.options.lineHeight = 20;
|
||||||
|
human.draw.options.drawPoints = true;
|
||||||
|
var dom = {
|
||||||
|
// grab instances of dom objects so we dont have to look them up later
|
||||||
|
video: document.getElementById("video"),
|
||||||
|
canvas: document.getElementById("canvas"),
|
||||||
|
log: document.getElementById("log"),
|
||||||
|
fps: document.getElementById("status"),
|
||||||
|
perf: document.getElementById("performance")
|
||||||
|
};
|
||||||
|
var timestamp = { detect: 0, draw: 0, tensors: 0, start: 0 };
|
||||||
|
var fps = { detectFPS: 0, drawFPS: 0, frames: 0, averageMs: 0 };
|
||||||
|
var log = (...msg) => {
|
||||||
|
dom.log.innerText += msg.join(" ") + "\n";
|
||||||
|
console.log(...msg);
|
||||||
|
};
|
||||||
|
var status = (msg) => dom.fps.innerText = msg;
|
||||||
|
var perf = (msg) => dom.perf.innerText = "tensors:" + human.tf.memory().numTensors.toString() + " | performance: " + JSON.stringify(msg).replace(/"|{|}/g, "").replace(/,/g, " | ");
|
||||||
|
async function detectionLoop() {
|
||||||
|
if (!dom.video.paused) {
|
||||||
|
if (timestamp.start === 0) timestamp.start = human.now();
|
||||||
|
await human.detect(dom.video);
|
||||||
|
const tensors = human.tf.memory().numTensors;
|
||||||
|
if (tensors - timestamp.tensors !== 0) log("allocated tensors:", tensors - timestamp.tensors);
|
||||||
|
timestamp.tensors = tensors;
|
||||||
|
fps.detectFPS = Math.round(1e3 * 1e3 / (human.now() - timestamp.detect)) / 1e3;
|
||||||
|
fps.frames++;
|
||||||
|
fps.averageMs = Math.round(1e3 * (human.now() - timestamp.start) / fps.frames) / 1e3;
|
||||||
|
if (fps.frames % 100 === 0 && !dom.video.paused) log("performance", { ...fps, tensors: timestamp.tensors });
|
||||||
|
}
|
||||||
|
timestamp.detect = human.now();
|
||||||
|
requestAnimationFrame(detectionLoop);
|
||||||
|
}
|
||||||
|
async function drawLoop() {
|
||||||
|
var _a, _b, _c;
|
||||||
|
if (!dom.video.paused) {
|
||||||
|
const interpolated = human.next(human.result);
|
||||||
|
const processed = await human.image(dom.video);
|
||||||
|
human.draw.canvas(processed.canvas, dom.canvas);
|
||||||
|
const opt = { bodyLabels: `person confidence [score] and ${(_c = (_b = (_a = human.result) == null ? void 0 : _a.body) == null ? void 0 : _b[0]) == null ? void 0 : _c.keypoints.length} keypoints` };
|
||||||
|
await human.draw.all(dom.canvas, interpolated, opt);
|
||||||
|
perf(interpolated.performance);
|
||||||
|
}
|
||||||
|
const now = human.now();
|
||||||
|
fps.drawFPS = Math.round(1e3 * 1e3 / (now - timestamp.draw)) / 1e3;
|
||||||
|
timestamp.draw = now;
|
||||||
|
status(dom.video.paused ? "paused" : `fps: ${fps.detectFPS.toFixed(1).padStart(5, " ")} detect | ${fps.drawFPS.toFixed(1).padStart(5, " ")} draw`);
|
||||||
|
setTimeout(drawLoop, 30);
|
||||||
|
}
|
||||||
|
async function webCam() {
|
||||||
|
const devices = await human.webcam.enumerate();
|
||||||
|
const id = devices[0].deviceId;
|
||||||
|
const webcamStatus = await human.webcam.start({ element: dom.video, crop: false, width, id });
|
||||||
|
log(webcamStatus);
|
||||||
|
dom.canvas.width = human.webcam.width;
|
||||||
|
dom.canvas.height = human.webcam.height;
|
||||||
|
dom.canvas.onclick = async () => {
|
||||||
|
if (human.webcam.paused) await human.webcam.play();
|
||||||
|
else human.webcam.pause();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
async function main() {
|
||||||
|
log("human version:", human.version, "| tfjs version:", human.tf.version["tfjs-core"]);
|
||||||
|
log("platform:", human.env.platform, "| agent:", human.env.agent);
|
||||||
|
status("loading...");
|
||||||
|
await human.load();
|
||||||
|
log("backend:", human.tf.getBackend(), "| available:", human.env.backends);
|
||||||
|
log("models stats:", human.models.stats());
|
||||||
|
log("models loaded:", human.models.loaded());
|
||||||
|
log("environment", human.env);
|
||||||
|
status("initializing...");
|
||||||
|
await human.warmup();
|
||||||
|
await webCam();
|
||||||
|
await detectionLoop();
|
||||||
|
await drawLoop();
|
||||||
|
}
|
||||||
|
window.onload = main;
|
||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -536,6 +536,7 @@ var AG = (r15, e, t10, o) => {
|
||||||
};
|
};
|
||||||
var zp = (r15, e, t10) => (t10 = r15 != null ? _G(RG(r15)) : {}, AG(e || !r15 || !r15.__esModule ? QC(t10, "default", { value: r15, enumerable: true }) : t10, r15));
|
var zp = (r15, e, t10) => (t10 = r15 != null ? _G(RG(r15)) : {}, AG(e || !r15 || !r15.__esModule ? QC(t10, "default", { value: r15, enumerable: true }) : t10, r15));
|
||||||
var U0 = Kt((ple, W0) => {
|
var U0 = Kt((ple, W0) => {
|
||||||
|
"use strict";
|
||||||
W0.exports = kt;
|
W0.exports = kt;
|
||||||
var ko = null;
|
var ko = null;
|
||||||
try {
|
try {
|
||||||
|
@ -826,10 +827,13 @@ var U0 = Kt((ple, W0) => {
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
var Ek = Kt(() => {
|
var Ek = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var $k = Kt(() => {
|
var $k = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var o1 = Kt((r1, Ww) => {
|
var o1 = Kt((r1, Ww) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(i) {
|
function o(i) {
|
||||||
var p = this, u = a();
|
var p = this, u = a();
|
||||||
|
@ -869,6 +873,7 @@ var o1 = Kt((r1, Ww) => {
|
||||||
})(r1, typeof Ww == "object" && Ww, typeof define == "function" && define);
|
})(r1, typeof Ww == "object" && Ww, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var s1 = Kt((n1, Uw) => {
|
var s1 = Kt((n1, Uw) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(a) {
|
function o(a) {
|
||||||
var i = this, p = "";
|
var i = this, p = "";
|
||||||
|
@ -900,6 +905,7 @@ var s1 = Kt((n1, Uw) => {
|
||||||
})(n1, typeof Uw == "object" && Uw, typeof define == "function" && define);
|
})(n1, typeof Uw == "object" && Uw, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var i1 = Kt((a1, Gw) => {
|
var i1 = Kt((a1, Gw) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(a) {
|
function o(a) {
|
||||||
var i = this, p = "";
|
var i = this, p = "";
|
||||||
|
@ -931,6 +937,7 @@ var i1 = Kt((a1, Gw) => {
|
||||||
})(a1, typeof Gw == "object" && Gw, typeof define == "function" && define);
|
})(a1, typeof Gw == "object" && Gw, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var p1 = Kt((u1, Hw) => {
|
var p1 = Kt((u1, Hw) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(a) {
|
function o(a) {
|
||||||
var i = this;
|
var i = this;
|
||||||
|
@ -971,6 +978,7 @@ var p1 = Kt((u1, Hw) => {
|
||||||
})(u1, typeof Hw == "object" && Hw, typeof define == "function" && define);
|
})(u1, typeof Hw == "object" && Hw, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var l1 = Kt((c1, Kw) => {
|
var l1 = Kt((c1, Kw) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(a) {
|
function o(a) {
|
||||||
var i = this;
|
var i = this;
|
||||||
|
@ -1009,6 +1017,7 @@ var l1 = Kt((c1, Kw) => {
|
||||||
})(c1, typeof Kw == "object" && Kw, typeof define == "function" && define);
|
})(c1, typeof Kw == "object" && Kw, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var d1 = Kt((m1, qw) => {
|
var d1 = Kt((m1, qw) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
function o(a) {
|
function o(a) {
|
||||||
var i = this, p = "";
|
var i = this, p = "";
|
||||||
|
@ -1040,8 +1049,10 @@ var d1 = Kt((m1, qw) => {
|
||||||
})(m1, typeof qw == "object" && qw, typeof define == "function" && define);
|
})(m1, typeof qw == "object" && qw, typeof define == "function" && define);
|
||||||
});
|
});
|
||||||
var f1 = Kt(() => {
|
var f1 = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var g1 = Kt((h1, Md) => {
|
var g1 = Kt((h1, Md) => {
|
||||||
|
"use strict";
|
||||||
(function(r15, e, t10) {
|
(function(r15, e, t10) {
|
||||||
var o = 256, n = 6, s = 52, a = "random", i = t10.pow(o, n), p = t10.pow(2, s), u = p * 2, c = o - 1, l;
|
var o = 256, n = 6, s = 52, a = "random", i = t10.pow(o, n), p = t10.pow(2, s), u = p * 2, c = o - 1, l;
|
||||||
function m(C, S, k) {
|
function m(C, S, k) {
|
||||||
|
@ -1110,6 +1121,7 @@ var g1 = Kt((h1, Md) => {
|
||||||
})(typeof self != "undefined" ? self : h1, [], Math);
|
})(typeof self != "undefined" ? self : h1, [], Math);
|
||||||
});
|
});
|
||||||
var jw = Kt((s1e, x1) => {
|
var jw = Kt((s1e, x1) => {
|
||||||
|
"use strict";
|
||||||
var Dq = o1(), Aq = s1(), Fq = i1(), Pq = p1(), Oq = l1(), Mq = d1(), Ku = g1();
|
var Dq = o1(), Aq = s1(), Fq = i1(), Pq = p1(), Oq = l1(), Mq = d1(), Ku = g1();
|
||||||
Ku.alea = Dq;
|
Ku.alea = Dq;
|
||||||
Ku.xor128 = Aq;
|
Ku.xor128 = Aq;
|
||||||
|
@ -1120,16 +1132,22 @@ var jw = Kt((s1e, x1) => {
|
||||||
x1.exports = Ku;
|
x1.exports = Ku;
|
||||||
});
|
});
|
||||||
var Vv = Kt(() => {
|
var Vv = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var Wv = Kt(() => {
|
var Wv = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var LB = Kt(() => {
|
var LB = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var BB = Kt(() => {
|
var BB = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var zB = Kt(() => {
|
var zB = Kt(() => {
|
||||||
|
"use strict";
|
||||||
});
|
});
|
||||||
var VB = Kt((Wg, Gv) => {
|
var VB = Kt((Wg, Gv) => {
|
||||||
|
"use strict";
|
||||||
var Uv = (() => {
|
var Uv = (() => {
|
||||||
var r15 = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0;
|
var r15 = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0;
|
||||||
return typeof __filename != "undefined" && (r15 = r15 || __filename), function(e) {
|
return typeof __filename != "undefined" && (r15 = r15 || __filename), function(e) {
|
||||||
|
@ -2088,10 +2106,12 @@ var VB = Kt((Wg, Gv) => {
|
||||||
}) : typeof Wg == "object" && (Wg.WasmBackendModuleThreadedSimd = Uv);
|
}) : typeof Wg == "object" && (Wg.WasmBackendModuleThreadedSimd = Uv);
|
||||||
});
|
});
|
||||||
var UB = Kt((e3t, WB) => {
|
var UB = Kt((e3t, WB) => {
|
||||||
|
"use strict";
|
||||||
WB.exports.wasmWorkerContents = `"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8")+"//# sourceURL="+f)},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"
|
WB.exports.wasmWorkerContents = `"use strict";var Module={};var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";if(ENVIRONMENT_IS_NODE){var nodeWorkerThreads=require("worker_threads");var parentPort=nodeWorkerThreads.parentPort;parentPort.on("message",data=>onmessage({data:data}));var fs=require("fs");Object.assign(global,{self:global,require:require,Module:Module,location:{href:__filename},Worker:nodeWorkerThreads.Worker,importScripts:function(f){(0,eval)(fs.readFileSync(f,"utf8")+"//# sourceURL="+f)},postMessage:function(msg){parentPort.postMessage(msg)},performance:global.performance||{now:function(){return Date.now()}}})}var initializedJS=false;var pendingNotifiedProxyingQueues=[];function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"
|
||||||
");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.startWorker=instance=>{Module=instance;postMessage({"cmd":"loaded"})};self.onmessage=e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;for(const handler of e.data.handlers){Module[handler]=function(){postMessage({cmd:"callHandler",handler:handler,args:[...arguments]})}}Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module)}else if(e.data.cmd==="run"){Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}};`;
|
");return}console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>{var instance=new WebAssembly.Instance(Module["wasmModule"],info);receiveInstance(instance);Module["wasmModule"]=null;return instance.exports};self.onunhandledrejection=e=>{throw e.reason??e};self.startWorker=instance=>{Module=instance;postMessage({"cmd":"loaded"})};self.onmessage=e=>{try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;for(const handler of e.data.handlers){Module[handler]=function(){postMessage({cmd:"callHandler",handler:handler,args:[...arguments]})}}Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob=="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}WasmBackendModuleThreadedSimd(Module)}else if(e.data.cmd==="run"){Module["__emscripten_thread_init"](e.data.pthread_ptr,0,0,1);Module["establishStackSpace"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].threadInitTLS();if(!initializedJS){pendingNotifiedProxyingQueues.forEach(queue=>{Module["executeNotifiedProxyingQueue"](queue)});pendingNotifiedProxyingQueues=[];initializedJS=true}try{Module["invokeEntryPoint"](e.data.start_routine,e.data.arg)}catch(ex){if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["keepRuntimeAlive"]()){}else{Module["__emscripten_thread_exit"](ex.status)}}else{throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["__emscripten_thread_exit"](-1)}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processProxyingQueue"){if(initializedJS){Module["executeNotifiedProxyingQueue"](e.data.queue)}else{pendingNotifiedProxyingQueues.push(e.data.queue)}}else if(e.data.cmd){err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){if(Module["__emscripten_thread_crashed"]){Module["__emscripten_thread_crashed"]()}throw ex}};`;
|
||||||
});
|
});
|
||||||
var GB = Kt((Ug, Kv) => {
|
var GB = Kt((Ug, Kv) => {
|
||||||
|
"use strict";
|
||||||
var Hv = (() => {
|
var Hv = (() => {
|
||||||
var r15 = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0;
|
var r15 = typeof document != "undefined" && document.currentScript ? document.currentScript.src : void 0;
|
||||||
return typeof __filename != "undefined" && (r15 = r15 || __filename), function(e) {
|
return typeof __filename != "undefined" && (r15 = r15 || __filename), function(e) {
|
||||||
|
@ -33502,7 +33522,7 @@ function setModelLoadOptions(config3) {
|
||||||
options.modelBasePath = config3.modelBasePath;
|
options.modelBasePath = config3.modelBasePath;
|
||||||
}
|
}
|
||||||
async function loadModel(modelPath) {
|
async function loadModel(modelPath) {
|
||||||
var _a, _b, _c2, _d2;
|
var _a, _b, _c2, _d2, _e, _f2;
|
||||||
let modelUrl = join(options.modelBasePath, modelPath || "");
|
let modelUrl = join(options.modelBasePath, modelPath || "");
|
||||||
if (!modelUrl.toLowerCase().endsWith(".json")) modelUrl += ".json";
|
if (!modelUrl.toLowerCase().endsWith(".json")) modelUrl += ".json";
|
||||||
const modelPathSegments = modelUrl.includes("/") ? modelUrl.split("/") : modelUrl.split("\\");
|
const modelPathSegments = modelUrl.includes("/") ? modelUrl.split("/") : modelUrl.split("\\");
|
||||||
|
@ -33510,6 +33530,7 @@ async function loadModel(modelPath) {
|
||||||
const cachedModelName = "indexeddb://" + shortModelName;
|
const cachedModelName = "indexeddb://" + shortModelName;
|
||||||
modelStats[shortModelName] = {
|
modelStats[shortModelName] = {
|
||||||
name: shortModelName,
|
name: shortModelName,
|
||||||
|
loaded: false,
|
||||||
sizeFromManifest: 0,
|
sizeFromManifest: 0,
|
||||||
sizeLoadedWeights: 0,
|
sizeLoadedWeights: 0,
|
||||||
sizeDesired: models_exports[shortModelName],
|
sizeDesired: models_exports[shortModelName],
|
||||||
|
@ -33527,7 +33548,7 @@ async function loadModel(modelPath) {
|
||||||
modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl;
|
modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl;
|
||||||
const tfLoadOptions = typeof fetch === "undefined" ? {} : { fetchFunc: (url, init4) => httpHandler(url, init4) };
|
const tfLoadOptions = typeof fetch === "undefined" ? {} : { fetchFunc: (url, init4) => httpHandler(url, init4) };
|
||||||
let model23 = new Bl(modelStats[shortModelName].url, tfLoadOptions);
|
let model23 = new Bl(modelStats[shortModelName].url, tfLoadOptions);
|
||||||
let loaded = false;
|
modelStats[shortModelName].loaded = false;
|
||||||
try {
|
try {
|
||||||
model23.findIOHandler();
|
model23.findIOHandler();
|
||||||
if (options.debug) log("model load handler:", model23["handler"]);
|
if (options.debug) log("model load handler:", model23["handler"]);
|
||||||
|
@ -33539,13 +33560,13 @@ async function loadModel(modelPath) {
|
||||||
modelStats[shortModelName].sizeFromManifest = ((_b = artifacts == null ? void 0 : artifacts.weightData) == null ? void 0 : _b.byteLength) || 0;
|
modelStats[shortModelName].sizeFromManifest = ((_b = artifacts == null ? void 0 : artifacts.weightData) == null ? void 0 : _b.byteLength) || 0;
|
||||||
if (artifacts) model23.loadSync(artifacts);
|
if (artifacts) model23.loadSync(artifacts);
|
||||||
else model23 = await M8(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions);
|
else model23 = await M8(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions);
|
||||||
modelStats[shortModelName].sizeLoadedWeights = ((_d2 = (_c2 = model23.artifacts) == null ? void 0 : _c2.weightData) == null ? void 0 : _d2.byteLength) || 0;
|
modelStats[shortModelName].sizeLoadedWeights = ((_d2 = (_c2 = model23.artifacts) == null ? void 0 : _c2.weightData) == null ? void 0 : _d2.byteLength) || ((_f2 = (_e = model23.artifacts) == null ? void 0 : _e.weightData) == null ? void 0 : _f2[0].byteLength) || 0;
|
||||||
if (options.verbose) log("load:", { model: shortModelName, url: model23["modelUrl"], bytes: modelStats[shortModelName].sizeLoadedWeights });
|
if (options.verbose) log("load:", { model: shortModelName, url: model23["modelUrl"], bytes: modelStats[shortModelName].sizeLoadedWeights });
|
||||||
loaded = true;
|
modelStats[shortModelName].loaded = true;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log("error loading model:", modelUrl, err);
|
log("error loading model:", modelUrl, err);
|
||||||
}
|
}
|
||||||
if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) {
|
if (modelStats[shortModelName].loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) {
|
||||||
try {
|
try {
|
||||||
const saveResult = await model23.save(cachedModelName);
|
const saveResult = await model23.save(cachedModelName);
|
||||||
if (options.debug) log("model saved:", cachedModelName, saveResult);
|
if (options.debug) log("model saved:", cachedModelName, saveResult);
|
||||||
|
@ -45381,13 +45402,13 @@ var Models = class {
|
||||||
let totalSizeWeights = 0;
|
let totalSizeWeights = 0;
|
||||||
let totalSizeLoading = 0;
|
let totalSizeLoading = 0;
|
||||||
for (const m of Object.values(modelStats)) {
|
for (const m of Object.values(modelStats)) {
|
||||||
totalSizeFromManifest += m.sizeFromManifest;
|
totalSizeFromManifest += Number.isNaN(+m.sizeFromManifest) ? 0 : m.sizeFromManifest;
|
||||||
totalSizeWeights += m.sizeLoadedWeights;
|
totalSizeWeights += Number.isNaN(+m.sizeLoadedWeights) ? 0 : m.sizeLoadedWeights;
|
||||||
totalSizeLoading += m.sizeDesired;
|
totalSizeLoading += Number.isNaN(+m.sizeDesired) ? 0 : m.sizeDesired;
|
||||||
}
|
}
|
||||||
const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;
|
const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;
|
||||||
return {
|
return {
|
||||||
numLoadedModels: Object.values(modelStats).length,
|
numLoadedModels: Object.values(modelStats).filter((m) => m == null ? void 0 : m.loaded).length,
|
||||||
numDefinedModels: Object.keys(this.models).length,
|
numDefinedModels: Object.keys(this.models).length,
|
||||||
percentageLoaded,
|
percentageLoaded,
|
||||||
totalSizeFromManifest,
|
totalSizeFromManifest,
|
||||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -4,4 +4,37 @@
|
||||||
author: <https://github.com/vladmandic>'
|
author: <https://github.com/vladmandic>'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var e="4.21.0";var s="4.21.0";var t="4.21.0";var n="4.21.0";var r="4.21.0";var i="4.21.0";var h={tfjs:e,"tfjs-core":e,"tfjs-converter":s,"tfjs-backend-cpu":t,"tfjs-backend-webgl":n,"tfjs-backend-wasm":r,"tfjs-backend-webgpu":i};export{h as version};
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-core/package.json
|
||||||
|
var version = "4.21.0";
|
||||||
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-converter@4.21.0_@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-converter/package.json
|
||||||
|
var version2 = "4.21.0";
|
||||||
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-backend-cpu@4.21.0_@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-backend-cpu/package.json
|
||||||
|
var version3 = "4.21.0";
|
||||||
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-backend-webgl@4.21.0_@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-backend-webgl/package.json
|
||||||
|
var version4 = "4.21.0";
|
||||||
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-backend-wasm@4.21.0_@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-backend-wasm/package.json
|
||||||
|
var version5 = "4.21.0";
|
||||||
|
|
||||||
|
// node_modules/.pnpm/@tensorflow+tfjs-backend-webgpu@4.21.0_@tensorflow+tfjs-core@4.21.0/node_modules/@tensorflow/tfjs-backend-webgpu/package.json
|
||||||
|
var version6 = "4.21.0";
|
||||||
|
|
||||||
|
// tfjs/tf-version.ts
|
||||||
|
var version7 = {
|
||||||
|
tfjs: version,
|
||||||
|
"tfjs-core": version,
|
||||||
|
// 'tfjs-data': tfjsDataVersion,
|
||||||
|
// 'tfjs-layers': tfjsLayersVersion,
|
||||||
|
"tfjs-converter": version2,
|
||||||
|
"tfjs-backend-cpu": version3,
|
||||||
|
"tfjs-backend-webgl": version4,
|
||||||
|
"tfjs-backend-wasm": version5,
|
||||||
|
"tfjs-backend-webgpu": version6
|
||||||
|
};
|
||||||
|
export {
|
||||||
|
version7 as version
|
||||||
|
};
|
||||||
|
|
|
@ -100,13 +100,13 @@ export class Models {
|
||||||
let totalSizeWeights = 0;
|
let totalSizeWeights = 0;
|
||||||
let totalSizeLoading = 0;
|
let totalSizeLoading = 0;
|
||||||
for (const m of Object.values(modelStats)) {
|
for (const m of Object.values(modelStats)) {
|
||||||
totalSizeFromManifest += m.sizeFromManifest;
|
totalSizeFromManifest += Number.isNaN(+m.sizeFromManifest) ? 0 : m.sizeFromManifest;
|
||||||
totalSizeWeights += m.sizeLoadedWeights;
|
totalSizeWeights += Number.isNaN(+m.sizeLoadedWeights) ? 0 : m.sizeLoadedWeights;
|
||||||
totalSizeLoading += m.sizeDesired;
|
totalSizeLoading += Number.isNaN(+m.sizeDesired) ? 0 : m.sizeDesired;
|
||||||
}
|
}
|
||||||
const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;
|
const percentageLoaded = totalSizeLoading > 0 ? totalSizeWeights / totalSizeLoading : 0;
|
||||||
return {
|
return {
|
||||||
numLoadedModels: Object.values(modelStats).length,
|
numLoadedModels: Object.values(modelStats).filter((m) => m?.loaded).length,
|
||||||
numDefinedModels: Object.keys(this.models).length,
|
numDefinedModels: Object.keys(this.models).length,
|
||||||
percentageLoaded,
|
percentageLoaded,
|
||||||
totalSizeFromManifest,
|
totalSizeFromManifest,
|
||||||
|
|
|
@ -14,6 +14,7 @@ const options = {
|
||||||
|
|
||||||
export interface ModelInfo {
|
export interface ModelInfo {
|
||||||
name: string,
|
name: string,
|
||||||
|
loaded: boolean,
|
||||||
inCache: boolean,
|
inCache: boolean,
|
||||||
sizeDesired: number,
|
sizeDesired: number,
|
||||||
sizeFromManifest: number,
|
sizeFromManifest: number,
|
||||||
|
@ -42,6 +43,7 @@ export async function loadModel(modelPath: string | undefined): Promise<GraphMod
|
||||||
const cachedModelName = 'indexeddb://' + shortModelName; // generate short model name for cache
|
const cachedModelName = 'indexeddb://' + shortModelName; // generate short model name for cache
|
||||||
modelStats[shortModelName] = {
|
modelStats[shortModelName] = {
|
||||||
name: shortModelName,
|
name: shortModelName,
|
||||||
|
loaded: false,
|
||||||
sizeFromManifest: 0,
|
sizeFromManifest: 0,
|
||||||
sizeLoadedWeights: 0,
|
sizeLoadedWeights: 0,
|
||||||
sizeDesired: modelsDefs[shortModelName],
|
sizeDesired: modelsDefs[shortModelName],
|
||||||
|
@ -59,7 +61,7 @@ export async function loadModel(modelPath: string | undefined): Promise<GraphMod
|
||||||
modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl;
|
modelStats[shortModelName].url = modelStats[shortModelName].inCache ? cachedModelName : modelUrl;
|
||||||
const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url: string, init?: RequestInit) => httpHandler(url, init) };
|
const tfLoadOptions = typeof fetch === 'undefined' ? {} : { fetchFunc: (url: string, init?: RequestInit) => httpHandler(url, init) };
|
||||||
let model: GraphModel = new tf.GraphModel(modelStats[shortModelName].url, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl
|
let model: GraphModel = new tf.GraphModel(modelStats[shortModelName].url, tfLoadOptions) as unknown as GraphModel; // create model prototype and decide if load from cache or from original modelurl
|
||||||
let loaded = false;
|
modelStats[shortModelName].loaded = false;
|
||||||
try {
|
try {
|
||||||
// @ts-ignore private function
|
// @ts-ignore private function
|
||||||
model.findIOHandler(); // decide how to actually load a model
|
model.findIOHandler(); // decide how to actually load a model
|
||||||
|
@ -74,13 +76,13 @@ export async function loadModel(modelPath: string | undefined): Promise<GraphMod
|
||||||
if (artifacts) model.loadSync(artifacts); // load weights
|
if (artifacts) model.loadSync(artifacts); // load weights
|
||||||
else model = await tf.loadGraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel;
|
else model = await tf.loadGraphModel(modelStats[shortModelName].inCache ? cachedModelName : modelUrl, tfLoadOptions) as unknown as GraphModel;
|
||||||
// @ts-ignore private property
|
// @ts-ignore private property
|
||||||
modelStats[shortModelName].sizeLoadedWeights = model.artifacts?.weightData?.byteLength || 0;
|
modelStats[shortModelName].sizeLoadedWeights = model.artifacts?.weightData?.byteLength || model.artifacts?.weightData?.[0].byteLength || 0;
|
||||||
if (options.verbose) log('load:', { model: shortModelName, url: model['modelUrl'], bytes: modelStats[shortModelName].sizeLoadedWeights });
|
if (options.verbose) log('load:', { model: shortModelName, url: model['modelUrl'], bytes: modelStats[shortModelName].sizeLoadedWeights });
|
||||||
loaded = true;
|
modelStats[shortModelName].loaded = true;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
log('error loading model:', modelUrl, err);
|
log('error loading model:', modelUrl, err);
|
||||||
}
|
}
|
||||||
if (loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { // save model to cache
|
if (modelStats[shortModelName].loaded && options.cacheModels && options.cacheSupported && !modelStats[shortModelName].inCache) { // save model to cache
|
||||||
try {
|
try {
|
||||||
const saveResult = await model.save(cachedModelName);
|
const saveResult = await model.save(cachedModelName);
|
||||||
if (options.debug) log('model saved:', cachedModelName, saveResult);
|
if (options.debug) log('model saved:', cachedModelName, saveResult);
|
||||||
|
|
1533
test/build.log
1533
test/build.log
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue