From 8c27f377f790c34db541fc7cdc286c7d44263bcc Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 25 Mar 2021 08:50:41 -0400 Subject: [PATCH] update --- CHANGELOG.md | 5 +++-- dist/demo-browser-index.js | 2 +- dist/human.esm-nobundle.js | 2 +- dist/human.esm.js | 2 +- dist/human.js | 2 +- dist/human.node-gpu.js | 2 +- dist/human.node.js | 2 +- 7 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bc82c19..84327e95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/human -Version: **1.2.4** +Version: **1.2.5** Description: **Human: AI-powered 3D Face Detection, Face Description & Recognition, Body Pose Tracking, Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction & Gesture Recognition** Author: **Vladimir Mandic ** @@ -9,8 +9,9 @@ Repository: **** ## Changelog -### **HEAD -> main** 2021/03/24 mandic00@live.com +### **1.2.5** 2021/03/25 mandic00@live.com +- fix broken exports - added face matching example to docs - improve fact matching diff --git a/dist/demo-browser-index.js b/dist/demo-browser-index.js index 1aedb1bd..cf15e8cd 100644 --- a/dist/demo-browser-index.js +++ b/dist/demo-browser-index.js @@ -4889,7 +4889,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var S4="1.2.4";var su,Qc,eh,Wi,G0,th,q0,X0,K0,O2=class{constructor(t={}){su.set(this,void 0);Qc.set(this,void 0);eh.set(this,void 0);Wi.set(this,void 0);this.analyze=(...t)=>{if(!ar(this,Qc))return;let n=this.tf.engine().state.numTensors,r=ar(this,su);cs(this,su,n);let a=n-r;a!==0&&Ee(...t,a)};G0.set(this,t=>{if(!ar(this,eh))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof He))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});th.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=et();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ee("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ee("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ee(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ee("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&C6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ee("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ee("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ee(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(et()-n)}});q0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(j0);break;case"full":n=await t(H0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});X0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+j0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+H0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));K0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(j0):t(H0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Th,this.draw=$2,this.version=S4,this.config=eo(mt,t),this.state="idle",cs(this,su,0),cs(this,Qc,!1),cs(this,eh,!1),cs(this,Wi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>M2(n,this.config),this.classes={facemesh:r2,age:Mg,gender:Dg,emotion:Wg,faceres:Gg,body:this.config.body.modelPath.includes("posenet")?m2:N2,hand:_2,nanodet:E2},this.sysinfo=Z2()}profileData(){return this.config.profile?Fg:{}}similarity(t,n){return this.config.face.description.enabled?Xg(t,n):this.config.face.embedding.enabled?R6(t,n):0}enhance(t){return Kg(t)}match(t,n,r=0){return F6(t,n,r)}async load(t={}){this.state="load";let n=et();t&&(this.config=eo(this.config,t)),ar(this,Wi)&&(this.config.debug&&Ee(`version: ${this.version}`),this.config.debug&&Ee(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ee("platform:",this.sysinfo.platform),this.config.debug&&Ee("agent:",this.sysinfo.agent),await ar(this,th).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ee("configuration:",this.config),this.config.debug&&Ee("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?s2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?$g(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Lg(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?Ug(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?jg(this.config):null),this.models.handpose||(this.config.hand.enabled?I2(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?y2(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?S2(this.config):null),this.models.nanodet||(this.config.object.enabled?R2(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?qg(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await s2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await $g(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Lg(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await Ug(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await jg(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await I2(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await y2(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await S2(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await R2(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await qg(this.config))),ar(this,Wi)&&(this.config.debug&&Ee("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),cs(this,Wi,!1));let r=Math.trunc(et()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=eo(this.config,n),this.state="check";let s=ar(this,G0).call(this,t);s&&(Ee(s,t),r({error:s}));let i=et();await ar(this,th).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=et();let o=M2(t,this.config);if(!o||!o.tensor){Ee("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(et()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?Zg(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=et(),u=this.config.face.enabled?await Zg(this,o.tensor):[],d=Math.trunc(et()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?T2(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=et(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await T2(o.tensor,this.config):[],d=Math.trunc(et()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=et(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(et()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?F2(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=et(),h=this.config.object.enabled?await F2(o.tensor,this.config):[],d=Math.trunc(et()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=et(),p=[...g4(u),...y4(l),...w4(c),...x4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(et()-a)),this.perf.total=Math.trunc(et()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=et();t&&(this.config=eo(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await ar(this,q0).call(this):typeof Image!="undefined"?a=await ar(this,X0).call(this):a=await ar(this,K0).call(this),this.config.videoOptimized=r;let s=et();return this.config.debug&&Ee("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};su=new WeakMap,Qc=new WeakMap,eh=new WeakMap,Wi=new WeakMap,G0=new WeakMap,th=new WeakMap,q0=new WeakMap,X0=new WeakMap,K0=new WeakMap;var nh=0,T4=!1,_t={background:"darkslategray",hover:"lightgray",itemBackground:"black",itemColor:"white",buttonBackground:"lightblue",buttonHover:"lightgreen",checkboxOn:"lightgreen",checkboxOff:"lightcoral",rangeBackground:"lightblue",rangeLabel:"white",chartColor:"lightblue"};function Qae(){if(T4)return;let e=` +2Q==`;var S4="1.2.5";var su,Qc,eh,Wi,G0,th,q0,X0,K0,O2=class{constructor(t={}){su.set(this,void 0);Qc.set(this,void 0);eh.set(this,void 0);Wi.set(this,void 0);this.analyze=(...t)=>{if(!ar(this,Qc))return;let n=this.tf.engine().state.numTensors,r=ar(this,su);cs(this,su,n);let a=n-r;a!==0&&Ee(...t,a)};G0.set(this,t=>{if(!ar(this,eh))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof He))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});th.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=et();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ee("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ee("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ee(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ee("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&C6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ee("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ee("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ee(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(et()-n)}});q0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(j0);break;case"full":n=await t(H0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});X0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+j0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+H0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));K0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(j0):t(H0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Th,this.draw=$2,this.version=S4,this.config=eo(mt,t),this.state="idle",cs(this,su,0),cs(this,Qc,!1),cs(this,eh,!1),cs(this,Wi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>M2(n,this.config),this.classes={facemesh:r2,age:Mg,gender:Dg,emotion:Wg,faceres:Gg,body:this.config.body.modelPath.includes("posenet")?m2:N2,hand:_2,nanodet:E2},this.sysinfo=Z2()}profileData(){return this.config.profile?Fg:{}}similarity(t,n){return this.config.face.description.enabled?Xg(t,n):this.config.face.embedding.enabled?R6(t,n):0}enhance(t){return Kg(t)}match(t,n,r=0){return F6(t,n,r)}async load(t={}){this.state="load";let n=et();t&&(this.config=eo(this.config,t)),ar(this,Wi)&&(this.config.debug&&Ee(`version: ${this.version}`),this.config.debug&&Ee(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ee("platform:",this.sysinfo.platform),this.config.debug&&Ee("agent:",this.sysinfo.agent),await ar(this,th).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ee("configuration:",this.config),this.config.debug&&Ee("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?s2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?$g(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Lg(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?Ug(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?jg(this.config):null),this.models.handpose||(this.config.hand.enabled?I2(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?y2(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?S2(this.config):null),this.models.nanodet||(this.config.object.enabled?R2(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?qg(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await s2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await $g(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Lg(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await Ug(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await jg(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await I2(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await y2(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await S2(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await R2(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await qg(this.config))),ar(this,Wi)&&(this.config.debug&&Ee("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),cs(this,Wi,!1));let r=Math.trunc(et()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=eo(this.config,n),this.state="check";let s=ar(this,G0).call(this,t);s&&(Ee(s,t),r({error:s}));let i=et();await ar(this,th).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=et();let o=M2(t,this.config);if(!o||!o.tensor){Ee("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(et()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?Zg(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=et(),u=this.config.face.enabled?await Zg(this,o.tensor):[],d=Math.trunc(et()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?T2(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=et(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await T2(o.tensor,this.config):[],d=Math.trunc(et()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=et(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(et()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?F2(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=et(),h=this.config.object.enabled?await F2(o.tensor,this.config):[],d=Math.trunc(et()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=et(),p=[...g4(u),...y4(l),...w4(c),...x4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(et()-a)),this.perf.total=Math.trunc(et()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=et();t&&(this.config=eo(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await ar(this,q0).call(this):typeof Image!="undefined"?a=await ar(this,X0).call(this):a=await ar(this,K0).call(this),this.config.videoOptimized=r;let s=et();return this.config.debug&&Ee("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};su=new WeakMap,Qc=new WeakMap,eh=new WeakMap,Wi=new WeakMap,G0=new WeakMap,th=new WeakMap,q0=new WeakMap,X0=new WeakMap,K0=new WeakMap;var nh=0,T4=!1,_t={background:"darkslategray",hover:"lightgray",itemBackground:"black",itemColor:"white",buttonBackground:"lightblue",buttonHover:"lightgreen",checkboxOn:"lightgreen",checkboxOff:"lightcoral",rangeBackground:"lightblue",rangeLabel:"white",chartColor:"lightblue"};function Qae(){if(T4)return;let e=` :root { --rounded: 0.1rem; } .menu { position: absolute; top: 0rem; right: 0; width: max-content; padding: 0 0.2rem 0 0.2rem; line-height: 1.8rem; z-index: 10; box-shadow: 0 0 8px dimgrey; background: ${_t.background}; border-radius: var(--rounded); border-color: black; border-style: solid; border-width: thin; } diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index afc5386c..d62a9f13 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -731,5 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var n0="1.2.4";var ie,we,le,te,Be,de,Ce,Ye,Je,r0=class{constructor(e={}){ie.set(this,void 0);we.set(this,void 0);le.set(this,void 0);te.set(this,void 0);this.analyze=(...e)=>{if(!L(this,we))return;let n=this.tf.engine().state.numTensors,c=L(this,ie);Q(this,ie,n);let r=n-c;r!==0&&g(...e,r)};Be.set(this,e=>{if(!L(this,le))return null;if(!e)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(e instanceof o.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});de.set(this,async(e=!1)=>{if(this.config.backend&&this.config.backend!==""&&e||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&g("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&g("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let c=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&g(`wasm execution: ${c?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),c||g("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&At();try{await this.tf.setBackend(this.config.backend)}catch(c){g("error: cannot set backend:",this.config.backend,c)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(g("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let c=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&g(`gl version:${c.getParameter(c.VERSION)} renderer:${c.getParameter(c.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});Ce.set(this,async()=>{let e=(r,A="application/octet-stream")=>fetch(`data:${A};base64,${r}`).then(_=>_.blob()),n,c;switch(this.config.warmup){case"face":n=await e(Fe);break;case"full":n=await e(qe);break;default:n=null}if(n){let r=await createImageBitmap(n);c=await this.detect(r,this.config),r.close()}return c});Ye.set(this,async()=>new Promise(e=>{let n,c=0;switch(this.config.warmup){case"face":c=256,n="data:image/jpeg;base64,"+Fe;break;case"full":case"body":c=1200,n="data:image/jpeg;base64,"+qe;break;default:n=null}let r=new Image;r.onload=async()=>{let A=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(c,c):document.createElement("canvas");A.width=r.naturalWidth,A.height=r.naturalHeight;let _=A.getContext("2d");_==null||_.drawImage(r,0,0);let s=await this.detect(A,this.config);e(s)},n?r.src=n:e(null)}));Je.set(this,async()=>{let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Fe):e(qe),c=o.node.decodeJpeg(n),r=c.expandDims(0);this.tf.dispose(c);let A=await this.detect(r,this.config);return this.tf.dispose(r),A});this.tf=o,this.draw=D1,this.version=n0,this.config=ne(E,e),this.state="idle",Q(this,ie,0),Q(this,we,!1),Q(this,le,!1),Q(this,te,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>U1(n,this.config),this.classes={facemesh:p1,age:Ue,gender:Ge,emotion:n1,faceres:s1,body:this.config.body.modelPath.includes("posenet")?j1:F1,hand:L1,nanodet:C1},this.sysinfo=ct()}profileData(){return this.config.profile?Ke:{}}similarity(e,n){return this.config.face.description.enabled?i1(e,n):this.config.face.embedding.enabled?_t(e,n):0}enhance(e){return a1(e)}match(e,n,c=0){return ot(e,n,c)}async load(e={}){this.state="load";let n=v();e&&(this.config=ne(this.config,e)),L(this,te)&&(this.config.debug&&g(`version: ${this.version}`),this.config.debug&&g(`tfjs version: ${this.tf.version_core}`),this.config.debug&&g("platform:",this.sysinfo.platform),this.config.debug&&g("agent:",this.sysinfo.agent),await L(this,de).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&g("configuration:",this.config),this.config.debug&&g("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?b1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?De(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?t1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?A1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?_1(this.config):null),this.models.handpose||(this.config.hand.enabled?X1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?N1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?q1(this.config):null),this.models.nanodet||(this.config.object.enabled?J1(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?h1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await b1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await De(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await t1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await A1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await _1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await X1(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await N1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await q1(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await J1(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await h1(this.config))),L(this,te)&&(this.config.debug&&g("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),Q(this,te,!1));let c=Math.trunc(v()-n);c>(this.perf.load||0)&&(this.perf.load=c)}async detect(e,n={}){return new Promise(async c=>{var x,z,T,S;this.state="config";let r;this.config=ne(this.config,n),this.state="check";let A=L(this,Be).call(this,e);A&&(g(A,e),c({error:A}));let _=v();await L(this,de).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let s=U1(e,this.config);if(!s||!s.tensor){g("could not convert input to tensor"),c({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let h,a,y,i,l;this.config.async?(y=this.config.face.enabled?x1(this,s.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),y=this.config.face.enabled?await x1(this,s.tensor):[],l=Math.trunc(v()-r),l>0&&(this.perf.face=l)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?h=this.config.body.enabled?(x=this.models.posenet)==null?void 0:x.estimatePoses(s.tensor,this.config):[]:h=this.config.body.enabled?B1(s.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?h=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(s.tensor,this.config)):[]:h=this.config.body.enabled?await B1(s.tensor,this.config):[],l=Math.trunc(v()-r),l>0&&(this.perf.body=l)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(a=this.config.hand.enabled?(T=this.models.handpose)==null?void 0:T.estimateHands(s.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),a=this.config.hand.enabled?await((S=this.models.handpose)==null?void 0:S.estimateHands(s.tensor,this.config)):[],l=Math.trunc(v()-r),l>0&&(this.perf.hand=l)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(i=this.config.object.enabled?K1(s.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),i=this.config.object.enabled?await K1(s.tensor,this.config):[],l=Math.trunc(v()-r),l>0&&(this.perf.object=l)),this.analyze("End Object:"),this.config.async&&([y,h,a,i]=await Promise.all([y,h,a,i])),s.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let m=[];this.config.gesture.enabled&&(r=v(),m=[...Jt(y),...Yt(h),...Ut(a),...Kt(y)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let p={face:y,body:h,hand:a,gesture:m,object:i,performance:this.perf,canvas:s.canvas};c(p)})}async warmup(e={}){let n=v();e&&(this.config=ne(this.config,e));let c=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await L(this,Ce).call(this):typeof Image!="undefined"?r=await L(this,Ye).call(this):r=await L(this,Je).call(this),this.config.videoOptimized=c;let A=v();return this.config.debug&&g("Warmup",this.config.warmup,Math.round(A-n),"ms",r),r}};ie=new WeakMap,we=new WeakMap,le=new WeakMap,te=new WeakMap,Be=new WeakMap,de=new WeakMap,Ce=new WeakMap,Ye=new WeakMap,Je=new WeakMap;export{r0 as Human,r0 as default}; +2Q==`;var n0="1.2.5";var ie,we,le,te,Be,de,Ce,Ye,Je,r0=class{constructor(e={}){ie.set(this,void 0);we.set(this,void 0);le.set(this,void 0);te.set(this,void 0);this.analyze=(...e)=>{if(!L(this,we))return;let n=this.tf.engine().state.numTensors,c=L(this,ie);Q(this,ie,n);let r=n-c;r!==0&&g(...e,r)};Be.set(this,e=>{if(!L(this,le))return null;if(!e)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(e instanceof o.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});de.set(this,async(e=!1)=>{if(this.config.backend&&this.config.backend!==""&&e||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&g("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&g("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let c=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&g(`wasm execution: ${c?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),c||g("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&At();try{await this.tf.setBackend(this.config.backend)}catch(c){g("error: cannot set backend:",this.config.backend,c)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(g("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let c=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&g(`gl version:${c.getParameter(c.VERSION)} renderer:${c.getParameter(c.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});Ce.set(this,async()=>{let e=(r,A="application/octet-stream")=>fetch(`data:${A};base64,${r}`).then(_=>_.blob()),n,c;switch(this.config.warmup){case"face":n=await e(Fe);break;case"full":n=await e(qe);break;default:n=null}if(n){let r=await createImageBitmap(n);c=await this.detect(r,this.config),r.close()}return c});Ye.set(this,async()=>new Promise(e=>{let n,c=0;switch(this.config.warmup){case"face":c=256,n="data:image/jpeg;base64,"+Fe;break;case"full":case"body":c=1200,n="data:image/jpeg;base64,"+qe;break;default:n=null}let r=new Image;r.onload=async()=>{let A=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(c,c):document.createElement("canvas");A.width=r.naturalWidth,A.height=r.naturalHeight;let _=A.getContext("2d");_==null||_.drawImage(r,0,0);let s=await this.detect(A,this.config);e(s)},n?r.src=n:e(null)}));Je.set(this,async()=>{let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Fe):e(qe),c=o.node.decodeJpeg(n),r=c.expandDims(0);this.tf.dispose(c);let A=await this.detect(r,this.config);return this.tf.dispose(r),A});this.tf=o,this.draw=D1,this.version=n0,this.config=ne(E,e),this.state="idle",Q(this,ie,0),Q(this,we,!1),Q(this,le,!1),Q(this,te,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>U1(n,this.config),this.classes={facemesh:p1,age:Ue,gender:Ge,emotion:n1,faceres:s1,body:this.config.body.modelPath.includes("posenet")?j1:F1,hand:L1,nanodet:C1},this.sysinfo=ct()}profileData(){return this.config.profile?Ke:{}}similarity(e,n){return this.config.face.description.enabled?i1(e,n):this.config.face.embedding.enabled?_t(e,n):0}enhance(e){return a1(e)}match(e,n,c=0){return ot(e,n,c)}async load(e={}){this.state="load";let n=v();e&&(this.config=ne(this.config,e)),L(this,te)&&(this.config.debug&&g(`version: ${this.version}`),this.config.debug&&g(`tfjs version: ${this.tf.version_core}`),this.config.debug&&g("platform:",this.sysinfo.platform),this.config.debug&&g("agent:",this.sysinfo.agent),await L(this,de).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&g("configuration:",this.config),this.config.debug&&g("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?b1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?De(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?t1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?A1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?_1(this.config):null),this.models.handpose||(this.config.hand.enabled?X1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?N1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?q1(this.config):null),this.models.nanodet||(this.config.object.enabled?J1(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?h1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await b1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await De(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await t1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await A1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await _1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await X1(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await N1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await q1(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await J1(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await h1(this.config))),L(this,te)&&(this.config.debug&&g("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),Q(this,te,!1));let c=Math.trunc(v()-n);c>(this.perf.load||0)&&(this.perf.load=c)}async detect(e,n={}){return new Promise(async c=>{var x,z,T,S;this.state="config";let r;this.config=ne(this.config,n),this.state="check";let A=L(this,Be).call(this,e);A&&(g(A,e),c({error:A}));let _=v();await L(this,de).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let s=U1(e,this.config);if(!s||!s.tensor){g("could not convert input to tensor"),c({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let h,a,y,i,l;this.config.async?(y=this.config.face.enabled?x1(this,s.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),y=this.config.face.enabled?await x1(this,s.tensor):[],l=Math.trunc(v()-r),l>0&&(this.perf.face=l)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?h=this.config.body.enabled?(x=this.models.posenet)==null?void 0:x.estimatePoses(s.tensor,this.config):[]:h=this.config.body.enabled?B1(s.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?h=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(s.tensor,this.config)):[]:h=this.config.body.enabled?await B1(s.tensor,this.config):[],l=Math.trunc(v()-r),l>0&&(this.perf.body=l)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(a=this.config.hand.enabled?(T=this.models.handpose)==null?void 0:T.estimateHands(s.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),a=this.config.hand.enabled?await((S=this.models.handpose)==null?void 0:S.estimateHands(s.tensor,this.config)):[],l=Math.trunc(v()-r),l>0&&(this.perf.hand=l)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(i=this.config.object.enabled?K1(s.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),i=this.config.object.enabled?await K1(s.tensor,this.config):[],l=Math.trunc(v()-r),l>0&&(this.perf.object=l)),this.analyze("End Object:"),this.config.async&&([y,h,a,i]=await Promise.all([y,h,a,i])),s.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let m=[];this.config.gesture.enabled&&(r=v(),m=[...Jt(y),...Yt(h),...Ut(a),...Kt(y)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let p={face:y,body:h,hand:a,gesture:m,object:i,performance:this.perf,canvas:s.canvas};c(p)})}async warmup(e={}){let n=v();e&&(this.config=ne(this.config,e));let c=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await L(this,Ce).call(this):typeof Image!="undefined"?r=await L(this,Ye).call(this):r=await L(this,Je).call(this),this.config.videoOptimized=c;let A=v();return this.config.debug&&g("Warmup",this.config.warmup,Math.round(A-n),"ms",r),r}};ie=new WeakMap,we=new WeakMap,le=new WeakMap,te=new WeakMap,Be=new WeakMap,de=new WeakMap,Ce=new WeakMap,Ye=new WeakMap,Je=new WeakMap;export{r0 as Human,r0 as default}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm.js b/dist/human.esm.js index 7f4e50e5..34769ffb 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -4889,7 +4889,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var c4="1.2.4";var Zl,jc,Hc,Mi,$0,Gc,D0,O0,z0,h4=class{constructor(t={}){Zl.set(this,void 0);jc.set(this,void 0);Hc.set(this,void 0);Mi.set(this,void 0);this.analyze=(...t)=>{if(!Jn(this,jc))return;let n=this.tf.engine().state.numTensors,r=Jn(this,Zl);ns(this,Zl,n);let a=n-r;a!==0&&Ne(...t,a)};$0.set(this,t=>{if(!Jn(this,Hc))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof Ve))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Gc.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=Ye();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ne("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ne("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ne(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ne("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&p6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ne("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ne("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ne(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(Ye()-n)}});D0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(M0);break;case"full":n=await t(F0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});O0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+M0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));z0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(M0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Ah,this.draw=gg,this.version=c4,this.config=Hi(dt,t),this.state="idle",ns(this,Zl,0),ns(this,jc,!1),ns(this,Hc,!1),ns(this,Mi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>yg(n,this.config),this.classes={facemesh:B2,age:y2,gender:x2,emotion:k2,faceres:E2,body:this.config.body.modelPath.includes("posenet")?Q2:cg,hand:ig,nanodet:pg},this.sysinfo=Fg()}profileData(){return this.config.profile?A2:{}}similarity(t,n){return this.config.face.description.enabled?M2(t,n):this.config.face.embedding.enabled?f6(t,n):0}enhance(t){return F2(t)}match(t,n,r=0){return m6(t,n,r)}async load(t={}){this.state="load";let n=Ye();t&&(this.config=Hi(this.config,t)),Jn(this,Mi)&&(this.config.debug&&Ne(`version: ${this.version}`),this.config.debug&&Ne(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ne("platform:",this.sysinfo.platform),this.config.debug&&Ne("agent:",this.sysinfo.agent),await Jn(this,Gc).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ne("configuration:",this.config),this.config.debug&&Ne("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?U2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?g2(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?v2(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?S2(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T2(this.config):null),this.models.handpose||(this.config.hand.enabled?ug(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?tg(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?hg(this.config):null),this.models.nanodet||(this.config.object.enabled?mg(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?R2(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await U2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await g2(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await v2(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await S2(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T2(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await ug(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await tg(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await hg(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await mg(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await R2(this.config))),Jn(this,Mi)&&(this.config.debug&&Ne("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ns(this,Mi,!1));let r=Math.trunc(Ye()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=Hi(this.config,n),this.state="check";let s=Jn(this,$0).call(this,t);s&&(Ne(s,t),r({error:s}));let i=Ye();await Jn(this,Gc).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=Ye();let o=yg(t,this.config);if(!o||!o.tensor){Ne("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(Ye()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?$2(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=Ye(),u=this.config.face.enabled?await $2(this,o.tensor):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?dg(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=Ye(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await dg(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=Ye(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?Ag(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=Ye(),h=this.config.object.enabled?await Ag(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=Ye(),p=[...t4(u),...e4(l),...r4(c),...n4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(Ye()-a)),this.perf.total=Math.trunc(Ye()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=Ye();t&&(this.config=Hi(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await Jn(this,D0).call(this):typeof Image!="undefined"?a=await Jn(this,O0).call(this):a=await Jn(this,z0).call(this),this.config.videoOptimized=r;let s=Ye();return this.config.debug&&Ne("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};Zl=new WeakMap,jc=new WeakMap,Hc=new WeakMap,Mi=new WeakMap,$0=new WeakMap,Gc=new WeakMap,D0=new WeakMap,O0=new WeakMap,z0=new WeakMap;export{h4 as Human,h4 as default}; +2Q==`;var c4="1.2.5";var Zl,jc,Hc,Mi,$0,Gc,D0,O0,z0,h4=class{constructor(t={}){Zl.set(this,void 0);jc.set(this,void 0);Hc.set(this,void 0);Mi.set(this,void 0);this.analyze=(...t)=>{if(!Jn(this,jc))return;let n=this.tf.engine().state.numTensors,r=Jn(this,Zl);ns(this,Zl,n);let a=n-r;a!==0&&Ne(...t,a)};$0.set(this,t=>{if(!Jn(this,Hc))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof Ve))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Gc.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=Ye();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ne("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ne("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ne(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ne("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&p6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ne("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ne("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ne(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(Ye()-n)}});D0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(M0);break;case"full":n=await t(F0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});O0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+M0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));z0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(M0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Ah,this.draw=gg,this.version=c4,this.config=Hi(dt,t),this.state="idle",ns(this,Zl,0),ns(this,jc,!1),ns(this,Hc,!1),ns(this,Mi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>yg(n,this.config),this.classes={facemesh:B2,age:y2,gender:x2,emotion:k2,faceres:E2,body:this.config.body.modelPath.includes("posenet")?Q2:cg,hand:ig,nanodet:pg},this.sysinfo=Fg()}profileData(){return this.config.profile?A2:{}}similarity(t,n){return this.config.face.description.enabled?M2(t,n):this.config.face.embedding.enabled?f6(t,n):0}enhance(t){return F2(t)}match(t,n,r=0){return m6(t,n,r)}async load(t={}){this.state="load";let n=Ye();t&&(this.config=Hi(this.config,t)),Jn(this,Mi)&&(this.config.debug&&Ne(`version: ${this.version}`),this.config.debug&&Ne(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ne("platform:",this.sysinfo.platform),this.config.debug&&Ne("agent:",this.sysinfo.agent),await Jn(this,Gc).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ne("configuration:",this.config),this.config.debug&&Ne("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?U2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?g2(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?v2(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?S2(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T2(this.config):null),this.models.handpose||(this.config.hand.enabled?ug(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?tg(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?hg(this.config):null),this.models.nanodet||(this.config.object.enabled?mg(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?R2(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await U2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await g2(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await v2(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await S2(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T2(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await ug(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await tg(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await hg(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await mg(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await R2(this.config))),Jn(this,Mi)&&(this.config.debug&&Ne("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ns(this,Mi,!1));let r=Math.trunc(Ye()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=Hi(this.config,n),this.state="check";let s=Jn(this,$0).call(this,t);s&&(Ne(s,t),r({error:s}));let i=Ye();await Jn(this,Gc).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=Ye();let o=yg(t,this.config);if(!o||!o.tensor){Ne("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(Ye()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?$2(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=Ye(),u=this.config.face.enabled?await $2(this,o.tensor):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?dg(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=Ye(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await dg(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=Ye(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?Ag(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=Ye(),h=this.config.object.enabled?await Ag(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=Ye(),p=[...t4(u),...e4(l),...r4(c),...n4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(Ye()-a)),this.perf.total=Math.trunc(Ye()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=Ye();t&&(this.config=Hi(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await Jn(this,D0).call(this):typeof Image!="undefined"?a=await Jn(this,O0).call(this):a=await Jn(this,z0).call(this),this.config.videoOptimized=r;let s=Ye();return this.config.debug&&Ne("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};Zl=new WeakMap,jc=new WeakMap,Hc=new WeakMap,Mi=new WeakMap,$0=new WeakMap,Gc=new WeakMap,D0=new WeakMap,O0=new WeakMap,z0=new WeakMap;export{h4 as Human,h4 as default}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.js b/dist/human.js index 5284b026..2a02fc86 100644 --- a/dist/human.js +++ b/dist/human.js @@ -4889,7 +4889,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var h4="1.2.4";var Zl,jc,Hc,Mi,$0,Gc,D0,O0,z0,wg=class{constructor(t={}){Zl.set(this,void 0);jc.set(this,void 0);Hc.set(this,void 0);Mi.set(this,void 0);this.analyze=(...t)=>{if(!Qn(this,jc))return;let n=this.tf.engine().state.numTensors,r=Qn(this,Zl);ns(this,Zl,n);let a=n-r;a!==0&&Ne(...t,a)};$0.set(this,t=>{if(!Qn(this,Hc))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof Ve))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Gc.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=Ye();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ne("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ne("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ne(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ne("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&f6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ne("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ne("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ne(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(Ye()-n)}});D0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(M0);break;case"full":n=await t(F0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});O0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+M0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));z0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(M0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Ah,this.draw=gg,this.version=h4,this.config=Hi(dt,t),this.state="idle",ns(this,Zl,0),ns(this,jc,!1),ns(this,Hc,!1),ns(this,Mi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>yg(n,this.config),this.classes={facemesh:B2,age:y2,gender:x2,emotion:k2,faceres:E2,body:this.config.body.modelPath.includes("posenet")?Q2:cg,hand:ig,nanodet:pg},this.sysinfo=$g()}profileData(){return this.config.profile?A2:{}}similarity(t,n){return this.config.face.description.enabled?M2(t,n):this.config.face.embedding.enabled?m6(t,n):0}enhance(t){return F2(t)}match(t,n,r=0){return A6(t,n,r)}async load(t={}){this.state="load";let n=Ye();t&&(this.config=Hi(this.config,t)),Qn(this,Mi)&&(this.config.debug&&Ne(`version: ${this.version}`),this.config.debug&&Ne(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ne("platform:",this.sysinfo.platform),this.config.debug&&Ne("agent:",this.sysinfo.agent),await Qn(this,Gc).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ne("configuration:",this.config),this.config.debug&&Ne("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?U2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?g2(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?v2(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?S2(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T2(this.config):null),this.models.handpose||(this.config.hand.enabled?ug(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?tg(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?hg(this.config):null),this.models.nanodet||(this.config.object.enabled?mg(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?R2(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await U2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await g2(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await v2(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await S2(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T2(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await ug(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await tg(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await hg(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await mg(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await R2(this.config))),Qn(this,Mi)&&(this.config.debug&&Ne("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ns(this,Mi,!1));let r=Math.trunc(Ye()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=Hi(this.config,n),this.state="check";let s=Qn(this,$0).call(this,t);s&&(Ne(s,t),r({error:s}));let i=Ye();await Qn(this,Gc).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=Ye();let o=yg(t,this.config);if(!o||!o.tensor){Ne("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(Ye()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?$2(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=Ye(),u=this.config.face.enabled?await $2(this,o.tensor):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?dg(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=Ye(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await dg(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=Ye(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?Ag(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=Ye(),h=this.config.object.enabled?await Ag(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=Ye(),p=[...n4(u),...t4(l),...a4(c),...r4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(Ye()-a)),this.perf.total=Math.trunc(Ye()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=Ye();t&&(this.config=Hi(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await Qn(this,D0).call(this):typeof Image!="undefined"?a=await Qn(this,O0).call(this):a=await Qn(this,z0).call(this),this.config.videoOptimized=r;let s=Ye();return this.config.debug&&Ne("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};Zl=new WeakMap,jc=new WeakMap,Hc=new WeakMap,Mi=new WeakMap,$0=new WeakMap,Gc=new WeakMap,D0=new WeakMap,O0=new WeakMap,z0=new WeakMap;return Eae;})(); +2Q==`;var h4="1.2.5";var Zl,jc,Hc,Mi,$0,Gc,D0,O0,z0,wg=class{constructor(t={}){Zl.set(this,void 0);jc.set(this,void 0);Hc.set(this,void 0);Mi.set(this,void 0);this.analyze=(...t)=>{if(!Qn(this,jc))return;let n=this.tf.engine().state.numTensors,r=Qn(this,Zl);ns(this,Zl,n);let a=n-r;a!==0&&Ne(...t,a)};$0.set(this,t=>{if(!Qn(this,Hc))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof Ve))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Gc.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=Ye();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&Ne("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&Ne("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let r=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),a=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&Ne(`wasm execution: ${r?"SIMD":"no SIMD"} ${a?"multithreaded":"singlethreaded"}`),r||Ne("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&f6();try{await this.tf.setBackend(this.config.backend)}catch(r){Ne("error: cannot set backend:",this.config.backend,r)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(Ne("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let r=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&Ne(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(Ye()-n)}});D0.set(this,async()=>{let t=(a,s="application/octet-stream")=>fetch(`data:${s};base64,${a}`).then(i=>i.blob()),n,r;switch(this.config.warmup){case"face":n=await t(M0);break;case"full":n=await t(F0);break;default:n=null}if(n){let a=await createImageBitmap(n);r=await this.detect(a,this.config),a.close()}return r});O0.set(this,async()=>new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+M0;break;case"full":case"body":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image;a.onload=async()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=a.naturalWidth,s.height=a.naturalHeight;let i=s.getContext("2d");i==null||i.drawImage(a,0,0);let o=await this.detect(s,this.config);t(o)},n?a.src=n:t(null)}));z0.set(this,async()=>{let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(M0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);this.tf.dispose(r);let s=await this.detect(a,this.config);return this.tf.dispose(a),s});this.tf=Ah,this.draw=gg,this.version=h4,this.config=Hi(dt,t),this.state="idle",ns(this,Zl,0),ns(this,jc,!1),ns(this,Hc,!1),ns(this,Mi,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>yg(n,this.config),this.classes={facemesh:B2,age:y2,gender:x2,emotion:k2,faceres:E2,body:this.config.body.modelPath.includes("posenet")?Q2:cg,hand:ig,nanodet:pg},this.sysinfo=$g()}profileData(){return this.config.profile?A2:{}}similarity(t,n){return this.config.face.description.enabled?M2(t,n):this.config.face.embedding.enabled?m6(t,n):0}enhance(t){return F2(t)}match(t,n,r=0){return A6(t,n,r)}async load(t={}){this.state="load";let n=Ye();t&&(this.config=Hi(this.config,t)),Qn(this,Mi)&&(this.config.debug&&Ne(`version: ${this.version}`),this.config.debug&&Ne(`tfjs version: ${this.tf.version_core}`),this.config.debug&&Ne("platform:",this.sysinfo.platform),this.config.debug&&Ne("agent:",this.sysinfo.agent),await Qn(this,Gc).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&Ne("configuration:",this.config),this.config.debug&&Ne("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?U2(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?g2(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?v2(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?S2(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T2(this.config):null),this.models.handpose||(this.config.hand.enabled?ug(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?tg(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?hg(this.config):null),this.models.nanodet||(this.config.object.enabled?mg(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?R2(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await U2(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await g2(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await v2(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await S2(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T2(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await ug(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await tg(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await hg(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await mg(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await R2(this.config))),Qn(this,Mi)&&(this.config.debug&&Ne("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ns(this,Mi,!1));let r=Math.trunc(Ye()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async detect(t,n={}){return new Promise(async r=>{var m,A,y,g;this.state="config";let a;this.config=Hi(this.config,n),this.state="check";let s=Qn(this,$0).call(this,t);s&&(Ne(s,t),r({error:s}));let i=Ye();await Qn(this,Gc).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),a=Ye();let o=yg(t,this.config);if(!o||!o.tensor){Ne("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(Ye()-a),this.analyze("Get Image:");let l,c,u,h,d;this.config.async?(u=this.config.face.enabled?$2(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=Ye(),u=this.config.face.enabled?await $2(this,o.tensor):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.face=d)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?(m=this.models.posenet)==null?void 0:m.estimatePoses(o.tensor,this.config):[]:l=this.config.body.enabled?dg(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=Ye(),this.config.body.modelPath.includes("posenet")?l=this.config.body.enabled?await((A=this.models.posenet)==null?void 0:A.estimatePoses(o.tensor,this.config)):[]:l=this.config.body.enabled?await dg(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.body=d)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(c=this.config.hand.enabled?(y=this.models.handpose)==null?void 0:y.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=Ye(),c=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(o.tensor,this.config)):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.hand=d)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?Ag(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",a=Ye(),h=this.config.object.enabled?await Ag(o.tensor,this.config):[],d=Math.trunc(Ye()-a),d>0&&(this.perf.object=d)),this.analyze("End Object:"),this.config.async&&([u,l,c,h]=await Promise.all([u,l,c,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let p=[];this.config.gesture.enabled&&(a=Ye(),p=[...n4(u),...t4(l),...a4(c),...r4(u)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(Ye()-a)),this.perf.total=Math.trunc(Ye()-i),this.state="idle";let f={face:u,body:l,hand:c,gesture:p,object:h,performance:this.perf,canvas:o.canvas};r(f)})}async warmup(t={}){let n=Ye();t&&(this.config=Hi(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await Qn(this,D0).call(this):typeof Image!="undefined"?a=await Qn(this,O0).call(this):a=await Qn(this,z0).call(this),this.config.videoOptimized=r;let s=Ye();return this.config.debug&&Ne("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};Zl=new WeakMap,jc=new WeakMap,Hc=new WeakMap,Mi=new WeakMap,$0=new WeakMap,Gc=new WeakMap,D0=new WeakMap,O0=new WeakMap,z0=new WeakMap;return Eae;})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.node-gpu.js b/dist/human.node-gpu.js index 9709c4e0..5488aef6 100644 --- a/dist/human.node-gpu.js +++ b/dist/human.node-gpu.js @@ -731,5 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var E0="1.2.4";var Te,Me,Re,we,c1,Ee,_1,o1,s1,mt=class{constructor(t={}){Te.set(this,void 0);Me.set(this,void 0);Re.set(this,void 0);we.set(this,void 0);this.analyze=(...t)=>{if(!J(this,Me))return;let n=this.tf.engine().state.numTensors,A=J(this,Te);ae(this,Te,n);let r=n-A;r!==0&&u(...t,r)};c1.set(this,t=>{if(!J(this,Re))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof ft.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Ee.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&u("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&u("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let A=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&u(`wasm execution: ${A?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),A||u("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&Rt();try{await this.tf.setBackend(this.config.backend)}catch(A){u("error: cannot set backend:",this.config.backend,A)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let A=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&u(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});_1.set(this,async()=>{let t=(r,c="application/octet-stream")=>fetch(`data:${c};base64,${r}`).then(_=>_.blob()),n,A;switch(this.config.warmup){case"face":n=await t(r1);break;case"full":n=await t(A1);break;default:n=null}if(n){let r=await createImageBitmap(n);A=await this.detect(r,this.config),r.close()}return A});o1.set(this,async()=>new Promise(t=>{let n,A=0;switch(this.config.warmup){case"face":A=256,n="data:image/jpeg;base64,"+r1;break;case"full":case"body":A=1200,n="data:image/jpeg;base64,"+A1;break;default:n=null}let r=new Image;r.onload=async()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,A):document.createElement("canvas");c.width=r.naturalWidth,c.height=r.naturalHeight;let _=c.getContext("2d");_==null||_.drawImage(r,0,0);let o=await this.detect(c,this.config);t(o)},n?r.src=n:t(null)}));s1.set(this,async()=>{let t=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?t(r1):t(A1),A=ft.node.decodeJpeg(n),r=A.expandDims(0);this.tf.dispose(A);let c=await this.detect(r,this.config);return this.tf.dispose(r),c});this.tf=ft,this.draw=lt,this.version=E0,this.config=le(S,t),this.state="idle",ae(this,Te,0),ae(this,Me,!1),ae(this,Re,!1),ae(this,we,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>wt(n,this.config),this.classes={facemesh:I1,age:x1,gender:w1,emotion:p1,faceres:v1,body:this.config.body.modelPath.includes("posenet")?U1:ot,hand:nt,nanodet:it},this.sysinfo=vt()}profileData(){return this.config.profile?a1:{}}similarity(t,n){return this.config.face.description.enabled?M1(t,n):this.config.face.embedding.enabled?Et(t,n):0}enhance(t){return R1(t)}match(t,n,A=0){return St(t,n,A)}async load(t={}){this.state="load";let n=v();t&&(this.config=le(this.config,t)),J(this,we)&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version_core}`),this.config.debug&&u("platform:",this.sysinfo.platform),this.config.debug&&u("agent:",this.sysinfo.agent),await J(this,Ee).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?V1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?y1(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?m1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?g1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T1(this.config):null),this.models.handpose||(this.config.hand.enabled?_t(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?G1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?st(this.config):null),this.models.nanodet||(this.config.object.enabled?xt(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?z1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await V1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await y1(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await m1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await g1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await _t(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await G1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await st(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await xt(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await z1(this.config))),J(this,we)&&(this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ae(this,we,!1));let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}async detect(t,n={}){return new Promise(async A=>{var a,z,b,j;this.state="config";let r;this.config=le(this.config,n),this.state="check";let c=J(this,c1).call(this,t);c&&(u(c,t),A({error:c}));let _=v();await J(this,Ee).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let o=wt(t,this.config);if(!o||!o.tensor){u("could not convert input to tensor"),A({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let s,i,x,h,y;this.config.async?(x=this.config.face.enabled?E1(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),x=this.config.face.enabled?await E1(this,o.tensor):[],y=Math.trunc(v()-r),y>0&&(this.perf.face=y)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(o.tensor,this.config):[]:s=this.config.body.enabled?ht(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(o.tensor,this.config)):[]:s=this.config.body.enabled?await ht(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.body=y)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(i=this.config.hand.enabled?(b=this.models.handpose)==null?void 0:b.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),i=this.config.hand.enabled?await((j=this.models.handpose)==null?void 0:j.estimateHands(o.tensor,this.config)):[],y=Math.trunc(v()-r),y>0&&(this.perf.hand=y)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?yt(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),h=this.config.object.enabled?await yt(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.object=y)),this.analyze("End Object:"),this.config.async&&([x,s,i,h]=await Promise.all([x,s,i,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(r=v(),d=[...u0(x),...p0(s),...g0(i),...b0(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let f={face:x,body:s,hand:i,gesture:d,object:h,performance:this.perf,canvas:o.canvas};A(f)})}async warmup(t={}){let n=v();t&&(this.config=le(this.config,t));let A=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await J(this,_1).call(this):typeof Image!="undefined"?r=await J(this,o1).call(this):r=await J(this,s1).call(this),this.config.videoOptimized=A;let c=v();return this.config.debug&&u("Warmup",this.config.warmup,Math.round(c-n),"ms",r),r}};Te=new WeakMap,Me=new WeakMap,Re=new WeakMap,we=new WeakMap,c1=new WeakMap,Ee=new WeakMap,_1=new WeakMap,o1=new WeakMap,s1=new WeakMap;0&&(module.exports={Human}); +2Q==`;var E0="1.2.5";var Te,Me,Re,we,c1,Ee,_1,o1,s1,mt=class{constructor(t={}){Te.set(this,void 0);Me.set(this,void 0);Re.set(this,void 0);we.set(this,void 0);this.analyze=(...t)=>{if(!J(this,Me))return;let n=this.tf.engine().state.numTensors,A=J(this,Te);ae(this,Te,n);let r=n-A;r!==0&&u(...t,r)};c1.set(this,t=>{if(!J(this,Re))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof ft.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Ee.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&u("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&u("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let A=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&u(`wasm execution: ${A?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),A||u("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&Rt();try{await this.tf.setBackend(this.config.backend)}catch(A){u("error: cannot set backend:",this.config.backend,A)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let A=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&u(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});_1.set(this,async()=>{let t=(r,c="application/octet-stream")=>fetch(`data:${c};base64,${r}`).then(_=>_.blob()),n,A;switch(this.config.warmup){case"face":n=await t(r1);break;case"full":n=await t(A1);break;default:n=null}if(n){let r=await createImageBitmap(n);A=await this.detect(r,this.config),r.close()}return A});o1.set(this,async()=>new Promise(t=>{let n,A=0;switch(this.config.warmup){case"face":A=256,n="data:image/jpeg;base64,"+r1;break;case"full":case"body":A=1200,n="data:image/jpeg;base64,"+A1;break;default:n=null}let r=new Image;r.onload=async()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,A):document.createElement("canvas");c.width=r.naturalWidth,c.height=r.naturalHeight;let _=c.getContext("2d");_==null||_.drawImage(r,0,0);let o=await this.detect(c,this.config);t(o)},n?r.src=n:t(null)}));s1.set(this,async()=>{let t=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?t(r1):t(A1),A=ft.node.decodeJpeg(n),r=A.expandDims(0);this.tf.dispose(A);let c=await this.detect(r,this.config);return this.tf.dispose(r),c});this.tf=ft,this.draw=lt,this.version=E0,this.config=le(S,t),this.state="idle",ae(this,Te,0),ae(this,Me,!1),ae(this,Re,!1),ae(this,we,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>wt(n,this.config),this.classes={facemesh:I1,age:x1,gender:w1,emotion:p1,faceres:v1,body:this.config.body.modelPath.includes("posenet")?U1:ot,hand:nt,nanodet:it},this.sysinfo=vt()}profileData(){return this.config.profile?a1:{}}similarity(t,n){return this.config.face.description.enabled?M1(t,n):this.config.face.embedding.enabled?Et(t,n):0}enhance(t){return R1(t)}match(t,n,A=0){return St(t,n,A)}async load(t={}){this.state="load";let n=v();t&&(this.config=le(this.config,t)),J(this,we)&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version_core}`),this.config.debug&&u("platform:",this.sysinfo.platform),this.config.debug&&u("agent:",this.sysinfo.agent),await J(this,Ee).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?V1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?y1(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?m1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?g1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T1(this.config):null),this.models.handpose||(this.config.hand.enabled?_t(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?G1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?st(this.config):null),this.models.nanodet||(this.config.object.enabled?xt(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?z1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await V1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await y1(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await m1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await g1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await _t(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await G1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await st(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await xt(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await z1(this.config))),J(this,we)&&(this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ae(this,we,!1));let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}async detect(t,n={}){return new Promise(async A=>{var a,z,b,j;this.state="config";let r;this.config=le(this.config,n),this.state="check";let c=J(this,c1).call(this,t);c&&(u(c,t),A({error:c}));let _=v();await J(this,Ee).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let o=wt(t,this.config);if(!o||!o.tensor){u("could not convert input to tensor"),A({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let s,i,x,h,y;this.config.async?(x=this.config.face.enabled?E1(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),x=this.config.face.enabled?await E1(this,o.tensor):[],y=Math.trunc(v()-r),y>0&&(this.perf.face=y)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(o.tensor,this.config):[]:s=this.config.body.enabled?ht(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(o.tensor,this.config)):[]:s=this.config.body.enabled?await ht(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.body=y)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(i=this.config.hand.enabled?(b=this.models.handpose)==null?void 0:b.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),i=this.config.hand.enabled?await((j=this.models.handpose)==null?void 0:j.estimateHands(o.tensor,this.config)):[],y=Math.trunc(v()-r),y>0&&(this.perf.hand=y)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?yt(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),h=this.config.object.enabled?await yt(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.object=y)),this.analyze("End Object:"),this.config.async&&([x,s,i,h]=await Promise.all([x,s,i,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(r=v(),d=[...u0(x),...p0(s),...g0(i),...b0(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let f={face:x,body:s,hand:i,gesture:d,object:h,performance:this.perf,canvas:o.canvas};A(f)})}async warmup(t={}){let n=v();t&&(this.config=le(this.config,t));let A=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await J(this,_1).call(this):typeof Image!="undefined"?r=await J(this,o1).call(this):r=await J(this,s1).call(this),this.config.videoOptimized=A;let c=v();return this.config.debug&&u("Warmup",this.config.warmup,Math.round(c-n),"ms",r),r}};Te=new WeakMap,Me=new WeakMap,Re=new WeakMap,we=new WeakMap,c1=new WeakMap,Ee=new WeakMap,_1=new WeakMap,o1=new WeakMap,s1=new WeakMap;0&&(module.exports={Human}); //# sourceMappingURL=human.node-gpu.js.map diff --git a/dist/human.node.js b/dist/human.node.js index 8e67a8e3..ba4fc964 100644 --- a/dist/human.node.js +++ b/dist/human.node.js @@ -731,5 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var E0="1.2.4";var Te,Me,Re,we,c1,Ee,_1,o1,s1,mt=class{constructor(t={}){Te.set(this,void 0);Me.set(this,void 0);Re.set(this,void 0);we.set(this,void 0);this.analyze=(...t)=>{if(!J(this,Me))return;let n=this.tf.engine().state.numTensors,A=J(this,Te);ae(this,Te,n);let r=n-A;r!==0&&u(...t,r)};c1.set(this,t=>{if(!J(this,Re))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof ft.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Ee.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&u("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&u("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let A=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&u(`wasm execution: ${A?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),A||u("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&Rt();try{await this.tf.setBackend(this.config.backend)}catch(A){u("error: cannot set backend:",this.config.backend,A)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let A=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&u(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});_1.set(this,async()=>{let t=(r,c="application/octet-stream")=>fetch(`data:${c};base64,${r}`).then(_=>_.blob()),n,A;switch(this.config.warmup){case"face":n=await t(r1);break;case"full":n=await t(A1);break;default:n=null}if(n){let r=await createImageBitmap(n);A=await this.detect(r,this.config),r.close()}return A});o1.set(this,async()=>new Promise(t=>{let n,A=0;switch(this.config.warmup){case"face":A=256,n="data:image/jpeg;base64,"+r1;break;case"full":case"body":A=1200,n="data:image/jpeg;base64,"+A1;break;default:n=null}let r=new Image;r.onload=async()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,A):document.createElement("canvas");c.width=r.naturalWidth,c.height=r.naturalHeight;let _=c.getContext("2d");_==null||_.drawImage(r,0,0);let o=await this.detect(c,this.config);t(o)},n?r.src=n:t(null)}));s1.set(this,async()=>{let t=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?t(r1):t(A1),A=ft.node.decodeJpeg(n),r=A.expandDims(0);this.tf.dispose(A);let c=await this.detect(r,this.config);return this.tf.dispose(r),c});this.tf=ft,this.draw=lt,this.version=E0,this.config=le(S,t),this.state="idle",ae(this,Te,0),ae(this,Me,!1),ae(this,Re,!1),ae(this,we,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>wt(n,this.config),this.classes={facemesh:I1,age:x1,gender:w1,emotion:p1,faceres:v1,body:this.config.body.modelPath.includes("posenet")?U1:ot,hand:nt,nanodet:it},this.sysinfo=vt()}profileData(){return this.config.profile?a1:{}}similarity(t,n){return this.config.face.description.enabled?M1(t,n):this.config.face.embedding.enabled?Et(t,n):0}enhance(t){return R1(t)}match(t,n,A=0){return St(t,n,A)}async load(t={}){this.state="load";let n=v();t&&(this.config=le(this.config,t)),J(this,we)&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version_core}`),this.config.debug&&u("platform:",this.sysinfo.platform),this.config.debug&&u("agent:",this.sysinfo.agent),await J(this,Ee).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?V1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?y1(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?m1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?g1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T1(this.config):null),this.models.handpose||(this.config.hand.enabled?_t(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?G1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?st(this.config):null),this.models.nanodet||(this.config.object.enabled?xt(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?z1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await V1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await y1(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await m1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await g1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await _t(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await G1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await st(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await xt(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await z1(this.config))),J(this,we)&&(this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ae(this,we,!1));let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}async detect(t,n={}){return new Promise(async A=>{var a,z,b,j;this.state="config";let r;this.config=le(this.config,n),this.state="check";let c=J(this,c1).call(this,t);c&&(u(c,t),A({error:c}));let _=v();await J(this,Ee).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let o=wt(t,this.config);if(!o||!o.tensor){u("could not convert input to tensor"),A({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let s,i,x,h,y;this.config.async?(x=this.config.face.enabled?E1(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),x=this.config.face.enabled?await E1(this,o.tensor):[],y=Math.trunc(v()-r),y>0&&(this.perf.face=y)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(o.tensor,this.config):[]:s=this.config.body.enabled?ht(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(o.tensor,this.config)):[]:s=this.config.body.enabled?await ht(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.body=y)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(i=this.config.hand.enabled?(b=this.models.handpose)==null?void 0:b.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),i=this.config.hand.enabled?await((j=this.models.handpose)==null?void 0:j.estimateHands(o.tensor,this.config)):[],y=Math.trunc(v()-r),y>0&&(this.perf.hand=y)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?yt(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),h=this.config.object.enabled?await yt(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.object=y)),this.analyze("End Object:"),this.config.async&&([x,s,i,h]=await Promise.all([x,s,i,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(r=v(),d=[...u0(x),...p0(s),...g0(i),...b0(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let f={face:x,body:s,hand:i,gesture:d,object:h,performance:this.perf,canvas:o.canvas};A(f)})}async warmup(t={}){let n=v();t&&(this.config=le(this.config,t));let A=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await J(this,_1).call(this):typeof Image!="undefined"?r=await J(this,o1).call(this):r=await J(this,s1).call(this),this.config.videoOptimized=A;let c=v();return this.config.debug&&u("Warmup",this.config.warmup,Math.round(c-n),"ms",r),r}};Te=new WeakMap,Me=new WeakMap,Re=new WeakMap,we=new WeakMap,c1=new WeakMap,Ee=new WeakMap,_1=new WeakMap,o1=new WeakMap,s1=new WeakMap;0&&(module.exports={Human}); +2Q==`;var E0="1.2.5";var Te,Me,Re,we,c1,Ee,_1,o1,s1,mt=class{constructor(t={}){Te.set(this,void 0);Me.set(this,void 0);Re.set(this,void 0);we.set(this,void 0);this.analyze=(...t)=>{if(!J(this,Me))return;let n=this.tf.engine().state.numTensors,A=J(this,Te);ae(this,Te,n);let r=n-A;r!==0&&u(...t,r)};c1.set(this,t=>{if(!J(this,Re))return null;if(!t)return"input is not defined";if(this.tf.ENV.flags.IS_NODE&&!(t instanceof ft.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});Ee.set(this,async(t=!1)=>{if(this.config.backend&&this.config.backend!==""&&t||this.tf.getBackend()!==this.config.backend){let n=v();if(this.state="backend",this.config.backend&&this.config.backend!==""){if(this.tf.ENV.flags.IS_BROWSER&&this.config.backend==="tensorflow"&&(this.config.backend="webgl"),this.tf.ENV.flags.IS_NODE&&(this.config.backend==="webgl"||this.config.backend==="wasm")&&(this.config.backend="tensorflow"),this.config.debug&&u("setting backend:",this.config.backend),this.config.backend==="wasm"){this.config.debug&&u("wasm path:",this.config.wasmPath),this.tf.setWasmPaths(this.config.wasmPath);let A=await this.tf.env().getAsync("WASM_HAS_SIMD_SUPPORT"),r=await this.tf.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT");this.config.debug&&u(`wasm execution: ${A?"SIMD":"no SIMD"} ${r?"multithreaded":"singlethreaded"}`),A||u("warning: wasm simd support is not enabled")}this.config.backend==="humangl"&&Rt();try{await this.tf.setBackend(this.config.backend)}catch(A){u("error: cannot set backend:",this.config.backend,A)}}if(this.tf.enableProdMode(),this.tf.getBackend()==="webgl"){this.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),this.tf.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1));let A=await this.tf.backend().getGPGPUContext().gl;this.config.debug&&u(`gl version:${A.getParameter(A.VERSION)} renderer:${A.getParameter(A.RENDERER)}`)}await this.tf.ready(),this.perf.backend=Math.trunc(v()-n)}});_1.set(this,async()=>{let t=(r,c="application/octet-stream")=>fetch(`data:${c};base64,${r}`).then(_=>_.blob()),n,A;switch(this.config.warmup){case"face":n=await t(r1);break;case"full":n=await t(A1);break;default:n=null}if(n){let r=await createImageBitmap(n);A=await this.detect(r,this.config),r.close()}return A});o1.set(this,async()=>new Promise(t=>{let n,A=0;switch(this.config.warmup){case"face":A=256,n="data:image/jpeg;base64,"+r1;break;case"full":case"body":A=1200,n="data:image/jpeg;base64,"+A1;break;default:n=null}let r=new Image;r.onload=async()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(A,A):document.createElement("canvas");c.width=r.naturalWidth,c.height=r.naturalHeight;let _=c.getContext("2d");_==null||_.drawImage(r,0,0);let o=await this.detect(c,this.config);t(o)},n?r.src=n:t(null)}));s1.set(this,async()=>{let t=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?t(r1):t(A1),A=ft.node.decodeJpeg(n),r=A.expandDims(0);this.tf.dispose(A);let c=await this.detect(r,this.config);return this.tf.dispose(r),c});this.tf=ft,this.draw=lt,this.version=E0,this.config=le(S,t),this.state="idle",ae(this,Te,0),ae(this,Me,!1),ae(this,Re,!1),ae(this,we,!0),this.perf={},this.models={face:null,posenet:null,blazepose:null,handpose:null,iris:null,age:null,gender:null,emotion:null,embedding:null,nanodet:null,faceres:null},this.image=n=>wt(n,this.config),this.classes={facemesh:I1,age:x1,gender:w1,emotion:p1,faceres:v1,body:this.config.body.modelPath.includes("posenet")?U1:ot,hand:nt,nanodet:it},this.sysinfo=vt()}profileData(){return this.config.profile?a1:{}}similarity(t,n){return this.config.face.description.enabled?M1(t,n):this.config.face.embedding.enabled?Et(t,n):0}enhance(t){return R1(t)}match(t,n,A=0){return St(t,n,A)}async load(t={}){this.state="load";let n=v();t&&(this.config=le(this.config,t)),J(this,we)&&(this.config.debug&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version_core}`),this.config.debug&&u("platform:",this.sysinfo.platform),this.config.debug&&u("agent:",this.sysinfo.agent),await J(this,Ee).call(this,!0),this.tf.ENV.flags.IS_BROWSER&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.handpose,this.models.posenet,this.models.blazepose,this.models.nanodet,this.models.faceres]=await Promise.all([this.models.face||(this.config.face.enabled?V1(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?y1(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?m1(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?g1(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?T1(this.config):null),this.models.handpose||(this.config.hand.enabled?_t(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("posenet")?G1(this.config):null),this.models.posenet||(this.config.body.enabled&&this.config.body.modelPath.includes("blazepose")?st(this.config):null),this.models.nanodet||(this.config.object.enabled?xt(this.config):null),this.models.faceres||(this.config.face.enabled&&this.config.face.description.enabled?z1(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await V1(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await y1(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await m1(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await g1(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await T1(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await _t(this.config)),this.config.body.enabled&&!this.models.posenet&&this.config.body.modelPath.includes("posenet")&&(this.models.posenet=await G1(this.config)),this.config.body.enabled&&!this.models.blazepose&&this.config.body.modelPath.includes("blazepose")&&(this.models.blazepose=await st(this.config)),this.config.object.enabled&&!this.models.nanodet&&(this.models.nanodet=await xt(this.config)),this.config.face.enabled&&this.config.face.description.enabled&&!this.models.faceres&&(this.models.faceres=await z1(this.config))),J(this,we)&&(this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),ae(this,we,!1));let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}async detect(t,n={}){return new Promise(async A=>{var a,z,b,j;this.state="config";let r;this.config=le(this.config,n),this.state="check";let c=J(this,c1).call(this,t);c&&(u(c,t),A({error:c}));let _=v();await J(this,Ee).call(this),await this.load(),this.config.scoped&&this.tf.engine().startScope(),this.analyze("Start Scope:"),r=v();let o=wt(t,this.config);if(!o||!o.tensor){u("could not convert input to tensor"),A({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-r),this.analyze("Get Image:");let s,i,x,h,y;this.config.async?(x=this.config.face.enabled?E1(this,o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",r=v(),x=this.config.face.enabled?await E1(this,o.tensor):[],y=Math.trunc(v()-r),y>0&&(this.perf.face=y)),this.analyze("Start Body:"),this.config.async?(this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(o.tensor,this.config):[]:s=this.config.body.enabled?ht(o.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",r=v(),this.config.body.modelPath.includes("posenet")?s=this.config.body.enabled?await((z=this.models.posenet)==null?void 0:z.estimatePoses(o.tensor,this.config)):[]:s=this.config.body.enabled?await ht(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.body=y)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(i=this.config.hand.enabled?(b=this.models.handpose)==null?void 0:b.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",r=v(),i=this.config.hand.enabled?await((j=this.models.handpose)==null?void 0:j.estimateHands(o.tensor,this.config)):[],y=Math.trunc(v()-r),y>0&&(this.perf.hand=y)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.config.async?(h=this.config.object.enabled?yt(o.tensor,this.config):[],this.perf.object&&delete this.perf.object):(this.state="run:object",r=v(),h=this.config.object.enabled?await yt(o.tensor,this.config):[],y=Math.trunc(v()-r),y>0&&(this.perf.object=y)),this.analyze("End Object:"),this.config.async&&([x,s,i,h]=await Promise.all([x,s,i,h])),o.tensor.dispose(),this.config.scoped&&this.tf.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(r=v(),d=[...u0(x),...p0(s),...g0(i),...b0(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-r)),this.perf.total=Math.trunc(v()-_),this.state="idle";let f={face:x,body:s,hand:i,gesture:d,object:h,performance:this.perf,canvas:o.canvas};A(f)})}async warmup(t={}){let n=v();t&&(this.config=le(this.config,t));let A=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await J(this,_1).call(this):typeof Image!="undefined"?r=await J(this,o1).call(this):r=await J(this,s1).call(this),this.config.videoOptimized=A;let c=v();return this.config.debug&&u("Warmup",this.config.warmup,Math.round(c-n),"ms",r),r}};Te=new WeakMap,Me=new WeakMap,Re=new WeakMap,we=new WeakMap,c1=new WeakMap,Ee=new WeakMap,_1=new WeakMap,o1=new WeakMap,s1=new WeakMap;0&&(module.exports={Human}); //# sourceMappingURL=human.node.js.map