From ce4182b0f758f5aad2cb147b4a2ba6306fce22e7 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sat, 6 Feb 2021 10:19:45 -0500 Subject: [PATCH] update --- 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 +- package-lock.json | 36 ++++++++++++++++++------------------ package.json | 6 +++--- 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/dist/demo-browser-index.js b/dist/demo-browser-index.js index cbf6a649..646e9370 100644 --- a/dist/demo-browser-index.js +++ b/dist/demo-browser-index.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`,Sne="0.11.2",At=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Tl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Tl(s,i):n[a]=i}),n),{})}var U7=class{constructor(e={}){this.tf=rg,this.version=Sne,this.config=Tl(Nne,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=D2,this.age=Fc,this.gender=Mc,this.emotion=$c,this.body=O2,this.hand=z2}profile(){return this.config.profile?Ine.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let t=Ln().state.numTensors,n=this.numTensors;this.numTensors=t;let r=t-n;r!==0&&Ye(...e,r)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(bn.flags.IS_NODE&&!(e instanceof tt))return"input must be a tensor";try{Gh()}catch(t){return"backend not loaded"}return null}simmilarity(e,t){return this.config.face.embedding.enabled?Dc.simmilarity(e,t):0}async load(e){this.state="load";let t=At();e&&(this.config=Tl(this.config,e)),this.firstRun&&(Ye(`version: ${this.version} TensorFlow/JS version: ${dg}`),await this.checkBackend(!0),bn.flags.IS_BROWSER&&(Ye("configuration:",this.config),Ye("tf flags:",bn.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?D2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Fc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Mc.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?$c.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Dc.load(this.config):null),this.models.posenet||(this.config.body.enabled?O2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?z2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await D2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Fc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Mc.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await $c.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Dc.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await O2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await z2.load(this.config))),this.firstRun&&(Ye("tf engine state:",Ln().state.numBytes,"bytes",Ln().state.numTensors,"tensors"),this.firstRun=!1);let n=Math.trunc(At()-t);n>(this.perf.load||0)&&(this.perf.load=n)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||Gh()!==this.config.backend){let t=At();this.state="backend",Ye("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Ye("settings wasm path:",this.config.wasmPath),Yg(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Ye("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&bne();try{await fg(this.config.backend)}catch(n){Ye("error: cannot set backend:",this.config.backend,n)}if(pg(),Gh()==="webgl"){this.config.deallocate&&(Ye("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),bn.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),bn.set("WEBGL_FORCE_F16_TEXTURES",!0),bn.set("WEBGL_PACK_DEPTHWISECONV",!0);let n=await _f().getGPGPUContext().gl;Ye(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}await mg(),this.perf.backend=Math.trunc(At()-t)}}async detectFace(e){var t;let n,r,a,s,i,o=[];this.state="run:face",n=At();let l=await((t=this.models.facemesh)==null?void 0:t.estimateFaces(e,this.config));this.perf.face=Math.trunc(At()-n);for(let c of l){if(this.analyze("Get Face"),!c.image||c.image.isDisposedInternal){Ye("Face object is disposed:",c.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Fc.predict(c.image,this.config):{}:(this.state="run:age",n=At(),r=this.config.face.age.enabled?await Fc.predict(c.image,this.config):{},this.perf.age=Math.trunc(At()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?Mc.predict(c.image,this.config):{}:(this.state="run:gender",n=At(),a=this.config.face.gender.enabled?await Mc.predict(c.image,this.config):{},this.perf.gender=Math.trunc(At()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?$c.predict(c.image,this.config):{}:(this.state="run:emotion",n=At(),s=this.config.face.emotion.enabled?await $c.predict(c.image,this.config):{},this.perf.emotion=Math.trunc(At()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Dc.predict(c.image,this.config):{}:(this.state="run:embedding",n=At(),i=this.config.face.embedding.enabled?await Dc.predict(c.image,this.config):{},this.perf.embedding=Math.trunc(At()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),c.image.dispose(),this.config.face.iris.enabled||(delete c.annotations.leftEyeIris,delete c.annotations.rightEyeIris);let u=c.annotations.leftEyeIris&&c.annotations.rightEyeIris?11.7*Math.max(Math.abs(c.annotations.leftEyeIris[3][0]-c.annotations.leftEyeIris[1][0]),Math.abs(c.annotations.rightEyeIris[4][1]-c.annotations.rightEyeIris[2][1])):0;o.push({confidence:c.confidence,box:c.box,mesh:c.mesh,boxRaw:c.boxRaw,meshRaw:c.meshRaw,annotations:c.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:u!==0?Math.trunc(u)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(e,t={}){this.state="image",this.config=Tl(this.config,t);let n=V7.process(e,this.config);return n.tensor.dispose(),n.canvas}async detect(e,t={}){return new Promise(async n=>{var r,a,s,i;this.state="config";let o;this.config=Tl(this.config,t),this.state="check";let l=this.sanity(e);l&&(Ye(l,e),n({error:l}));let c,u,h,d=At();await this.checkBackend(),await this.load(),this.config.scoped&&Ln().startScope(),this.analyze("Start Scope:"),o=At();let p=V7.process(e,this.config);if(!p||!p.tensor){Ye("could not convert input to tensor"),n({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(At()-o),this.analyze("Get Image:"),this.config.async?(h=this.config.face.enabled?this.detectFace(p.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",o=At(),h=this.config.face.enabled?await this.detectFace(p.tensor):[],this.perf.face=Math.trunc(At()-o)),this.analyze("Start Body:"),this.config.async?(c=this.config.body.enabled?(r=this.models.posenet)==null?void 0:r.estimatePoses(p.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",o=At(),c=this.config.body.enabled?await((a=this.models.posenet)==null?void 0:a.estimatePoses(p.tensor,this.config)):[],this.perf.body=Math.trunc(At()-o)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(u=this.config.hand.enabled?(s=this.models.handpose)==null?void 0:s.estimateHands(p.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",o=At(),u=this.config.hand.enabled?await((i=this.models.handpose)==null?void 0:i.estimateHands(p.tensor,this.config)):[],this.perf.hand=Math.trunc(At()-o)),this.analyze("End Hand:"),this.config.async&&([h,c,u]=await Promise.all([h,c,u])),p.tensor.dispose(),this.config.scoped&&Ln().endScope(),this.analyze("End Scope:");let f=[];this.config.gesture.enabled&&(o=At(),f=[...Yp.face(h),...Yp.body(c),...Yp.hand(u),...Yp.iris(h)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(At()-o)),this.perf.total=Math.trunc(At()-d),this.state="idle",n({face:h,body:c,hand:u,gesture:f,performance:this.perf,canvas:p.canvas})})}async warmupBitmap(){let e=(r,a="application/octet-stream")=>fetch(`data:${a};base64,${r}`).then(s=>s.blob()),t,n;switch(this.config.warmup){case"face":t=await e(P2);break;case"full":t=await e(L2);break;default:t=null}if(t){let r=await createImageBitmap(t);n=await this.detect(r,this.config),r.close()}return n}async warmupCanvas(){return new Promise(e=>{let t,n=0;switch(this.config.warmup){case"face":n=256,t="data:image/jpeg;base64,"+P2;break;case"full":n=1200,t="data:image/jpeg;base64,"+L2;break;default:t=null}let r=new Image(n,n);r.onload=()=>{let a=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,n):document.createElement("canvas");a.width=n,a.height=n;let s=a.getContext("2d");s.drawImage(r,0,0);let i=s.getImageData(0,0,n,n);this.detect(i,this.config).then(o=>e(o))},t?r.src=t:e(null)})}async warmupNode(){let e=s=>Buffer.from(s,"base64"),t=this.config.warmup==="face"?e(P2):e(L2),n=(void 0).decodeJpeg(t),r=n.expandDims(0);Re(n);let a=await this.detect(r,this.config);return Re(r),a}async warmup(e){let t=At();e&&(this.config=Tl(this.config,e));let n=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await this.warmupBitmap():typeof Image!="undefined"?r=await this.warmupCanvas():r=await this.warmupNode(),this.config.videoOptimized=n;let a=At();return Ye("Warmup",this.config.warmup,Math.round(a-t),"ms",r),r}};async function Tne(e,t,n){if(!e)return;let r=t.getContext("2d");r.font=n.baseFont,r.fillStyle=n.baseLabel;let a=1;for(let s=0;s1&&o[1].length>0){let l=i[1]>0?`#${i[1]}`:"",c=`${i[0]} ${l}: ${o[1]}`;r.fillStyle="black",r.fillText(c,8,2+a*n.baseLineHeight),r.fillStyle=n.baseLabel,r.fillText(c,6,0+a*n.baseLineHeight),a+=1}}}async function Ene(e,t,n,r){if(!e)return;let a=t.getContext("2d");for(let s of e){a.font=n.baseFont,a.strokeStyle=n.baseColor,a.fillStyle=n.baseColor,a.lineWidth=n.baseLineWidth,a.beginPath(),n.drawBoxes&&a.rect(s.box[0],s.box[1],s.box[2],s.box[3]);let i=[];if(s.genderConfidence&&i.push(`${s.gender||""} ${Math.trunc(100*s.genderConfidence)}% confident`),s.age&&i.push(`age: ${s.age||""}`),s.iris&&i.push(`iris distance: ${s.iris}`),s.emotion&&s.emotion.length>0){let o=s.emotion.map(l=>`${Math.trunc(100*l.score)}% ${l.emotion}`);i.push(o.join(" "))}i.length===0&&i.push("face"),a.fillStyle=n.baseLabel;for(let o=0;os.mesh[u]),c=new Path2D;c.moveTo(l[0][0],l[0][1]);for(let u of l)c.lineTo(u[0],u[1]);c.closePath(),a.strokeStyle=n.useDepth?`rgba(${127.5+2*l[0][2]}, ${127.5-2*l[0][2]}, 255, 0.3)`:n.baseColor,a.stroke(c),n.fillPolygons&&(a.fillStyle=n.useDepth?`rgba(${127.5+2*l[0][2]}, ${127.5-2*l[0][2]}, 255, 0.3)`:n.baseColor,a.fill(c))}if(s.annotations&&s.annotations.leftEyeIris){a.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.baseColor,a.beginPath();let o=Math.abs(s.annotations.leftEyeIris[3][0]-s.annotations.leftEyeIris[1][0])/2,l=Math.abs(s.annotations.leftEyeIris[4][1]-s.annotations.leftEyeIris[2][1])/2;a.ellipse(s.annotations.leftEyeIris[0][0],s.annotations.leftEyeIris[0][1],o,l,0,0,2*Math.PI),a.stroke(),n.fillPolygons&&(a.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.baseColor,a.fill())}if(s.annotations&&s.annotations.rightEyeIris){a.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.baseColor,a.beginPath();let o=Math.abs(s.annotations.rightEyeIris[3][0]-s.annotations.rightEyeIris[1][0])/2,l=Math.abs(s.annotations.rightEyeIris[4][1]-s.annotations.rightEyeIris[2][1])/2;a.ellipse(s.annotations.rightEyeIris[0][0],s.annotations.rightEyeIris[0][1],o,l,0,0,2*Math.PI),a.stroke(),n.fillPolygons&&(a.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.baseColor,a.fill())}}}}}var La=[];async function Cne(e,t,n){if(!e)return;let r=t.getContext("2d");r.lineJoin="round";for(let a=0;al.part==="leftShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightShoulder"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightHip"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftHip"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftShoulder"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="leftHip"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="leftKnee"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftAnkle"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="rightHip"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightKnee"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightAnkle"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="leftShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="leftElbow"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftWrist"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="rightShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightElbow"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightWrist"),o&&s.lineTo(o.position.x,o.position.y)),r.stroke(s)}}}async function Rne(e,t,n){if(!e)return;let r=t.getContext("2d");r.lineJoin="round";for(let a of e){if(r.font=n.baseFont,r.lineWidth=n.baseLineWidth,n.drawBoxes&&(r.lineWidth=n.baseLineWidth,r.beginPath(),r.strokeStyle=n.baseColor,r.fillStyle=n.baseColor,r.rect(a.box[0],a.box[1],a.box[2],a.box[3]),r.fillStyle="black",r.fillText("hand",a.box[0]+3,1+a.box[1]+n.baseLineHeight,a.box[2]),r.fillStyle=n.baseLabel,r.fillText("hand",a.box[0]+2,0+a.box[1]+n.baseLineHeight,a.box[2]),r.stroke()),n.drawPoints&&a.landmarks&&a.landmarks.length>0)for(let s of a.landmarks)r.fillStyle=n.useDepth?`rgba(${127.5+2*s[2]}, ${127.5-2*s[2]}, 255, 0.5)`:n.baseColor,r.beginPath(),r.arc(s[0],s[1],2,0,2*Math.PI),r.fill();if(n.drawPolygons){let s=i=>{if(!!i)for(let o=0;o0?o-1:0][0],i[o>0?o-1:0][1]),r.lineTo(i[o][0],i[o][1]),r.stroke()};s(a.annotations.indexFinger),s(a.annotations.middleFinger),s(a.annotations.ringFinger),s(a.annotations.pinky),s(a.annotations.thumb)}}}var Oc={face:Ene,body:Cne,hand:Rne,gesture:Tne};var zc=0,H7=!1,bt={background:"darkslategray",hover:"lightgray",itemBackground:"black",itemColor:"white",buttonBackground:"lightblue",buttonHover:"lightgreen",checkboxOn:"lightgreen",checkboxOff:"lightcoral",rangeBackground:"lightblue",rangeLabel:"white",chartColor:"lightblue"};function Fne(){if(H7)return;let e=` +2Q==`,Sne="0.11.3",At=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Tl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Tl(s,i):n[a]=i}),n),{})}var U7=class{constructor(e={}){this.tf=rg,this.version=Sne,this.config=Tl(Nne,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=D2,this.age=Fc,this.gender=Mc,this.emotion=$c,this.body=O2,this.hand=z2}profile(){return this.config.profile?Ine.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let t=Ln().state.numTensors,n=this.numTensors;this.numTensors=t;let r=t-n;r!==0&&Ye(...e,r)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(bn.flags.IS_NODE&&!(e instanceof tt))return"input must be a tensor";try{Gh()}catch(t){return"backend not loaded"}return null}simmilarity(e,t){return this.config.face.embedding.enabled?Dc.simmilarity(e,t):0}async load(e){this.state="load";let t=At();e&&(this.config=Tl(this.config,e)),this.firstRun&&(Ye(`version: ${this.version} TensorFlow/JS version: ${dg}`),await this.checkBackend(!0),bn.flags.IS_BROWSER&&(Ye("configuration:",this.config),Ye("tf flags:",bn.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?D2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Fc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Mc.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?$c.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Dc.load(this.config):null),this.models.posenet||(this.config.body.enabled?O2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?z2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await D2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Fc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Mc.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await $c.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Dc.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await O2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await z2.load(this.config))),this.firstRun&&(Ye("tf engine state:",Ln().state.numBytes,"bytes",Ln().state.numTensors,"tensors"),this.firstRun=!1);let n=Math.trunc(At()-t);n>(this.perf.load||0)&&(this.perf.load=n)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||Gh()!==this.config.backend){let t=At();this.state="backend",Ye("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Ye("settings wasm path:",this.config.wasmPath),Yg(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Ye("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&bne();try{await fg(this.config.backend)}catch(n){Ye("error: cannot set backend:",this.config.backend,n)}if(pg(),Gh()==="webgl"){this.config.deallocate&&(Ye("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),bn.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),bn.set("WEBGL_FORCE_F16_TEXTURES",!0),bn.set("WEBGL_PACK_DEPTHWISECONV",!0);let n=await _f().getGPGPUContext().gl;Ye(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}await mg(),this.perf.backend=Math.trunc(At()-t)}}async detectFace(e){var t;let n,r,a,s,i,o=[];this.state="run:face",n=At();let l=await((t=this.models.facemesh)==null?void 0:t.estimateFaces(e,this.config));this.perf.face=Math.trunc(At()-n);for(let c of l){if(this.analyze("Get Face"),!c.image||c.image.isDisposedInternal){Ye("Face object is disposed:",c.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Fc.predict(c.image,this.config):{}:(this.state="run:age",n=At(),r=this.config.face.age.enabled?await Fc.predict(c.image,this.config):{},this.perf.age=Math.trunc(At()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?Mc.predict(c.image,this.config):{}:(this.state="run:gender",n=At(),a=this.config.face.gender.enabled?await Mc.predict(c.image,this.config):{},this.perf.gender=Math.trunc(At()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?$c.predict(c.image,this.config):{}:(this.state="run:emotion",n=At(),s=this.config.face.emotion.enabled?await $c.predict(c.image,this.config):{},this.perf.emotion=Math.trunc(At()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Dc.predict(c.image,this.config):{}:(this.state="run:embedding",n=At(),i=this.config.face.embedding.enabled?await Dc.predict(c.image,this.config):{},this.perf.embedding=Math.trunc(At()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),c.image.dispose(),this.config.face.iris.enabled||(delete c.annotations.leftEyeIris,delete c.annotations.rightEyeIris);let u=c.annotations.leftEyeIris&&c.annotations.rightEyeIris?11.7*Math.max(Math.abs(c.annotations.leftEyeIris[3][0]-c.annotations.leftEyeIris[1][0]),Math.abs(c.annotations.rightEyeIris[4][1]-c.annotations.rightEyeIris[2][1])):0;o.push({confidence:c.confidence,box:c.box,mesh:c.mesh,boxRaw:c.boxRaw,meshRaw:c.meshRaw,annotations:c.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:u!==0?Math.trunc(u)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(e,t={}){this.state="image",this.config=Tl(this.config,t);let n=V7.process(e,this.config);return n.tensor.dispose(),n.canvas}async detect(e,t={}){return new Promise(async n=>{var r,a,s,i;this.state="config";let o;this.config=Tl(this.config,t),this.state="check";let l=this.sanity(e);l&&(Ye(l,e),n({error:l}));let c,u,h,d=At();await this.checkBackend(),await this.load(),this.config.scoped&&Ln().startScope(),this.analyze("Start Scope:"),o=At();let p=V7.process(e,this.config);if(!p||!p.tensor){Ye("could not convert input to tensor"),n({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(At()-o),this.analyze("Get Image:"),this.config.async?(h=this.config.face.enabled?this.detectFace(p.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",o=At(),h=this.config.face.enabled?await this.detectFace(p.tensor):[],this.perf.face=Math.trunc(At()-o)),this.analyze("Start Body:"),this.config.async?(c=this.config.body.enabled?(r=this.models.posenet)==null?void 0:r.estimatePoses(p.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",o=At(),c=this.config.body.enabled?await((a=this.models.posenet)==null?void 0:a.estimatePoses(p.tensor,this.config)):[],this.perf.body=Math.trunc(At()-o)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(u=this.config.hand.enabled?(s=this.models.handpose)==null?void 0:s.estimateHands(p.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",o=At(),u=this.config.hand.enabled?await((i=this.models.handpose)==null?void 0:i.estimateHands(p.tensor,this.config)):[],this.perf.hand=Math.trunc(At()-o)),this.analyze("End Hand:"),this.config.async&&([h,c,u]=await Promise.all([h,c,u])),p.tensor.dispose(),this.config.scoped&&Ln().endScope(),this.analyze("End Scope:");let f=[];this.config.gesture.enabled&&(o=At(),f=[...Yp.face(h),...Yp.body(c),...Yp.hand(u),...Yp.iris(h)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(At()-o)),this.perf.total=Math.trunc(At()-d),this.state="idle",n({face:h,body:c,hand:u,gesture:f,performance:this.perf,canvas:p.canvas})})}async warmupBitmap(){let e=(r,a="application/octet-stream")=>fetch(`data:${a};base64,${r}`).then(s=>s.blob()),t,n;switch(this.config.warmup){case"face":t=await e(P2);break;case"full":t=await e(L2);break;default:t=null}if(t){let r=await createImageBitmap(t);n=await this.detect(r,this.config),r.close()}return n}async warmupCanvas(){return new Promise(e=>{let t,n=0;switch(this.config.warmup){case"face":n=256,t="data:image/jpeg;base64,"+P2;break;case"full":n=1200,t="data:image/jpeg;base64,"+L2;break;default:t=null}let r=new Image(n,n);r.onload=()=>{let a=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(n,n):document.createElement("canvas");a.width=n,a.height=n;let s=a.getContext("2d");s.drawImage(r,0,0);let i=s.getImageData(0,0,n,n);this.detect(i,this.config).then(o=>e(o))},t?r.src=t:e(null)})}async warmupNode(){let e=s=>Buffer.from(s,"base64"),t=this.config.warmup==="face"?e(P2):e(L2),n=(void 0).decodeJpeg(t),r=n.expandDims(0);Re(n);let a=await this.detect(r,this.config);return Re(r),a}async warmup(e){let t=At();e&&(this.config=Tl(this.config,e));let n=this.config.videoOptimized;this.config.videoOptimized=!1;let r;typeof createImageBitmap=="function"?r=await this.warmupBitmap():typeof Image!="undefined"?r=await this.warmupCanvas():r=await this.warmupNode(),this.config.videoOptimized=n;let a=At();return Ye("Warmup",this.config.warmup,Math.round(a-t),"ms",r),r}};async function Tne(e,t,n){if(!e)return;let r=t.getContext("2d");r.font=n.baseFont,r.fillStyle=n.baseLabel;let a=1;for(let s=0;s1&&o[1].length>0){let l=i[1]>0?`#${i[1]}`:"",c=`${i[0]} ${l}: ${o[1]}`;r.fillStyle="black",r.fillText(c,8,2+a*n.baseLineHeight),r.fillStyle=n.baseLabel,r.fillText(c,6,0+a*n.baseLineHeight),a+=1}}}async function Ene(e,t,n,r){if(!e)return;let a=t.getContext("2d");for(let s of e){a.font=n.baseFont,a.strokeStyle=n.baseColor,a.fillStyle=n.baseColor,a.lineWidth=n.baseLineWidth,a.beginPath(),n.drawBoxes&&a.rect(s.box[0],s.box[1],s.box[2],s.box[3]);let i=[];if(s.genderConfidence&&i.push(`${s.gender||""} ${Math.trunc(100*s.genderConfidence)}% confident`),s.age&&i.push(`age: ${s.age||""}`),s.iris&&i.push(`iris distance: ${s.iris}`),s.emotion&&s.emotion.length>0){let o=s.emotion.map(l=>`${Math.trunc(100*l.score)}% ${l.emotion}`);i.push(o.join(" "))}i.length===0&&i.push("face"),a.fillStyle=n.baseLabel;for(let o=0;os.mesh[u]),c=new Path2D;c.moveTo(l[0][0],l[0][1]);for(let u of l)c.lineTo(u[0],u[1]);c.closePath(),a.strokeStyle=n.useDepth?`rgba(${127.5+2*l[0][2]}, ${127.5-2*l[0][2]}, 255, 0.3)`:n.baseColor,a.stroke(c),n.fillPolygons&&(a.fillStyle=n.useDepth?`rgba(${127.5+2*l[0][2]}, ${127.5-2*l[0][2]}, 255, 0.3)`:n.baseColor,a.fill(c))}if(s.annotations&&s.annotations.leftEyeIris){a.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.baseColor,a.beginPath();let o=Math.abs(s.annotations.leftEyeIris[3][0]-s.annotations.leftEyeIris[1][0])/2,l=Math.abs(s.annotations.leftEyeIris[4][1]-s.annotations.leftEyeIris[2][1])/2;a.ellipse(s.annotations.leftEyeIris[0][0],s.annotations.leftEyeIris[0][1],o,l,0,0,2*Math.PI),a.stroke(),n.fillPolygons&&(a.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.baseColor,a.fill())}if(s.annotations&&s.annotations.rightEyeIris){a.strokeStyle=n.useDepth?"rgba(255, 200, 255, 0.3)":n.baseColor,a.beginPath();let o=Math.abs(s.annotations.rightEyeIris[3][0]-s.annotations.rightEyeIris[1][0])/2,l=Math.abs(s.annotations.rightEyeIris[4][1]-s.annotations.rightEyeIris[2][1])/2;a.ellipse(s.annotations.rightEyeIris[0][0],s.annotations.rightEyeIris[0][1],o,l,0,0,2*Math.PI),a.stroke(),n.fillPolygons&&(a.fillStyle=n.useDepth?"rgba(255, 255, 200, 0.3)":n.baseColor,a.fill())}}}}}var La=[];async function Cne(e,t,n){if(!e)return;let r=t.getContext("2d");r.lineJoin="round";for(let a=0;al.part==="leftShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightShoulder"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightHip"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftHip"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftShoulder"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="leftHip"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="leftKnee"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftAnkle"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="rightHip"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightKnee"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightAnkle"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="leftShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="leftElbow"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="leftWrist"),o&&s.lineTo(o.position.x,o.position.y)),i=e[a].keypoints.find(l=>l.part==="rightShoulder"),i&&(s.moveTo(i.position.x,i.position.y),o=e[a].keypoints.find(l=>l.part==="rightElbow"),o&&s.lineTo(o.position.x,o.position.y),o=e[a].keypoints.find(l=>l.part==="rightWrist"),o&&s.lineTo(o.position.x,o.position.y)),r.stroke(s)}}}async function Rne(e,t,n){if(!e)return;let r=t.getContext("2d");r.lineJoin="round";for(let a of e){if(r.font=n.baseFont,r.lineWidth=n.baseLineWidth,n.drawBoxes&&(r.lineWidth=n.baseLineWidth,r.beginPath(),r.strokeStyle=n.baseColor,r.fillStyle=n.baseColor,r.rect(a.box[0],a.box[1],a.box[2],a.box[3]),r.fillStyle="black",r.fillText("hand",a.box[0]+3,1+a.box[1]+n.baseLineHeight,a.box[2]),r.fillStyle=n.baseLabel,r.fillText("hand",a.box[0]+2,0+a.box[1]+n.baseLineHeight,a.box[2]),r.stroke()),n.drawPoints&&a.landmarks&&a.landmarks.length>0)for(let s of a.landmarks)r.fillStyle=n.useDepth?`rgba(${127.5+2*s[2]}, ${127.5-2*s[2]}, 255, 0.5)`:n.baseColor,r.beginPath(),r.arc(s[0],s[1],2,0,2*Math.PI),r.fill();if(n.drawPolygons){let s=i=>{if(!!i)for(let o=0;o0?o-1:0][0],i[o>0?o-1:0][1]),r.lineTo(i[o][0],i[o][1]),r.stroke()};s(a.annotations.indexFinger),s(a.annotations.middleFinger),s(a.annotations.ringFinger),s(a.annotations.pinky),s(a.annotations.thumb)}}}var Oc={face:Ene,body:Cne,hand:Rne,gesture:Tne};var zc=0,H7=!1,bt={background:"darkslategray",hover:"lightgray",itemBackground:"black",itemColor:"white",buttonBackground:"lightblue",buttonHover:"lightgreen",checkboxOn:"lightgreen",checkboxOff:"lightcoral",rangeBackground:"lightblue",rangeLabel:"white",chartColor:"lightblue"};function Fne(){if(H7)return;let e=` :root { --rounded: 0.2rem; } .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: ${bt.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 f55391dc..c57fa021 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 pt="0.11.2";var R=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function be(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=be(c,_):n[A]=_}),n),{})}var gt=class{constructor(e={}){this.tf=z,this.version=pt,this.config=be(ut,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=j1,this.hand=N1}profile(){return this.config.profile?bt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=z.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&b(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(z.ENV.flags.IS_NODE&&!(e instanceof z.Tensor))return"input must be a tensor";try{z.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?xe.simmilarity(e,n):0}async load(e){this.state="load";let n=R();e&&(this.config=be(this.config,e)),this.firstRun&&(b(`version: ${this.version} TensorFlow/JS version: ${z.version_core}`),await this.checkBackend(!0),z.ENV.flags.IS_BROWSER&&(b("configuration:",this.config),b("tf flags:",z.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Ee.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?ze.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?Me.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?xe.load(this.config):null),this.models.posenet||(this.config.body.enabled?j1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?N1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await ze.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await Me.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await xe.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await j1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await N1.load(this.config))),this.firstRun&&(b("tf engine state:",z.engine().state.numBytes,"bytes",z.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(R()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||z.getBackend()!==this.config.backend){let n=R();this.state="backend",b("setting backend:",this.config.backend),this.config.backend==="wasm"&&(b("settings wasm path:",this.config.wasmPath),z.setWasmPaths(this.config.wasmPath),await z.env().getAsync("WASM_HAS_SIMD_SUPPORT")||b("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await z.setBackend(this.config.backend)}catch(r){b("error: cannot set backend:",this.config.backend,r)}if(z.enableProdMode(),z.getBackend()==="webgl"){this.config.deallocate&&(b("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),z.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),z.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),z.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await z.backend().getGPGPUContext().gl;b(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await z.ready(),this.perf.backend=Math.trunc(R()-n)}}async detectFace(e){var i;let n,r,A,c,_,h=[];this.state="run:face",n=R();let x=await((i=this.models.facemesh)==null?void 0:i.estimateFaces(e,this.config));this.perf.face=Math.trunc(R()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){b("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:age",n=R(),r=this.config.face.age.enabled?await Ee.predict(y.image,this.config):{},this.perf.age=Math.trunc(R()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(y.image,this.config):{}:(this.state="run:gender",n=R(),A=this.config.face.gender.enabled?await ze.predict(y.image,this.config):{},this.perf.gender=Math.trunc(R()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(y.image,this.config):{}:(this.state="run:emotion",n=R(),c=this.config.face.emotion.enabled?await Me.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(R()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?xe.predict(y.image,this.config):{}:(this.state="run:embedding",n=R(),_=this.config.face.embedding.enabled?await xe.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(R()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let d=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:d!==0?Math.trunc(d)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=be(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var a,s,m,T;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(b(c,e),r({error:c}));let _,h,x,i=R();await this.checkBackend(),await this.load(),this.config.scoped&&z.engine().startScope(),this.analyze("Start Scope:"),A=R();let y=W1.process(e,this.config);if(!y||!y.tensor){b("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(R()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=R(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(R()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=R(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(R()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(m=this.models.handpose)==null?void 0:m.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=R(),h=this.config.hand.enabled?await((T=this.models.handpose)==null?void 0:T.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(R()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&z.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(A=R(),d=[...se.face(x),...se.body(_),...se.hand(h),...se.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(R()-A)),this.perf.total=Math.trunc(R()-i),this.state="idle",r({face:x,body:_,hand:h,gesture:d,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Ke);break;case"full":n=await e(Ue);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Ke;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ue;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Ke):e(Ue),r=z.node.decodeJpeg(n),A=r.expandDims(0);z.dispose(r);let c=await this.detect(A,this.config);return z.dispose(A),c}async warmup(e){let n=R();e&&(this.config=be(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=R();return b("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}};export{gt as default}; +2Q==`;var pt="0.11.3";var R=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function be(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=be(c,_):n[A]=_}),n),{})}var gt=class{constructor(e={}){this.tf=z,this.version=pt,this.config=be(ut,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=j1,this.hand=N1}profile(){return this.config.profile?bt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=z.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&b(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(z.ENV.flags.IS_NODE&&!(e instanceof z.Tensor))return"input must be a tensor";try{z.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?xe.simmilarity(e,n):0}async load(e){this.state="load";let n=R();e&&(this.config=be(this.config,e)),this.firstRun&&(b(`version: ${this.version} TensorFlow/JS version: ${z.version_core}`),await this.checkBackend(!0),z.ENV.flags.IS_BROWSER&&(b("configuration:",this.config),b("tf flags:",z.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Ee.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?ze.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?Me.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?xe.load(this.config):null),this.models.posenet||(this.config.body.enabled?j1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?N1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await ze.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await Me.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await xe.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await j1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await N1.load(this.config))),this.firstRun&&(b("tf engine state:",z.engine().state.numBytes,"bytes",z.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(R()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||z.getBackend()!==this.config.backend){let n=R();this.state="backend",b("setting backend:",this.config.backend),this.config.backend==="wasm"&&(b("settings wasm path:",this.config.wasmPath),z.setWasmPaths(this.config.wasmPath),await z.env().getAsync("WASM_HAS_SIMD_SUPPORT")||b("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await z.setBackend(this.config.backend)}catch(r){b("error: cannot set backend:",this.config.backend,r)}if(z.enableProdMode(),z.getBackend()==="webgl"){this.config.deallocate&&(b("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),z.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),z.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),z.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await z.backend().getGPGPUContext().gl;b(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await z.ready(),this.perf.backend=Math.trunc(R()-n)}}async detectFace(e){var i;let n,r,A,c,_,h=[];this.state="run:face",n=R();let x=await((i=this.models.facemesh)==null?void 0:i.estimateFaces(e,this.config));this.perf.face=Math.trunc(R()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){b("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:age",n=R(),r=this.config.face.age.enabled?await Ee.predict(y.image,this.config):{},this.perf.age=Math.trunc(R()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(y.image,this.config):{}:(this.state="run:gender",n=R(),A=this.config.face.gender.enabled?await ze.predict(y.image,this.config):{},this.perf.gender=Math.trunc(R()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(y.image,this.config):{}:(this.state="run:emotion",n=R(),c=this.config.face.emotion.enabled?await Me.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(R()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?xe.predict(y.image,this.config):{}:(this.state="run:embedding",n=R(),_=this.config.face.embedding.enabled?await xe.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(R()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let d=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:d!==0?Math.trunc(d)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=be(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var a,s,m,T;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(b(c,e),r({error:c}));let _,h,x,i=R();await this.checkBackend(),await this.load(),this.config.scoped&&z.engine().startScope(),this.analyze("Start Scope:"),A=R();let y=W1.process(e,this.config);if(!y||!y.tensor){b("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(R()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=R(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(R()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(a=this.models.posenet)==null?void 0:a.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=R(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(R()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(m=this.models.handpose)==null?void 0:m.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=R(),h=this.config.hand.enabled?await((T=this.models.handpose)==null?void 0:T.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(R()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&z.engine().endScope(),this.analyze("End Scope:");let d=[];this.config.gesture.enabled&&(A=R(),d=[...se.face(x),...se.body(_),...se.hand(h),...se.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(R()-A)),this.perf.total=Math.trunc(R()-i),this.state="idle",r({face:x,body:_,hand:h,gesture:d,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Ke);break;case"full":n=await e(Ue);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Ke;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ue;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Ke):e(Ue),r=z.node.decodeJpeg(n),A=r.expandDims(0);z.dispose(r);let c=await this.detect(A,this.config);return z.dispose(A),c}async warmup(e){let n=R();e&&(this.config=be(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=R();return b("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}};export{gt as default}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm.js b/dist/human.esm.js index 41eb04dc..202b7263 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var p4="0.11.2";var ft=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Jl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Jl(s,i):n[a]=i}),n),{})}var m4=class{constructor(t={}){this.tf=kh,this.version=p4,this.config=Jl(d4,t),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=L2,this.age=Qc,this.gender=eh,this.emotion=th,this.body=W2,this.hand=B2}profile(){return this.config.profile?f4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Fe(...t,a)}sanity(t){if(!this.checkSanity)return null;if(!t)return"input is not defined";if(an.flags.IS_NODE&&!(t instanceof Ke))return"input must be a tensor";try{gd()}catch(n){return"backend not loaded"}return null}simmilarity(t,n){return this.config.face.embedding.enabled?Ka.simmilarity(t,n):0}async load(t){this.state="load";let n=ft();t&&(this.config=Jl(this.config,t)),this.firstRun&&(Fe(`version: ${this.version} TensorFlow/JS version: ${l5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Fe("configuration:",this.config),Fe("tf flags:",an.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?L2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Qc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?eh.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?th.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Ka.load(this.config):null),this.models.posenet||(this.config.body.enabled?W2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?B2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await L2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Qc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await eh.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await th.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Ka.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await W2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await B2.load(this.config))),this.firstRun&&(Fe("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(ft()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Fe("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Fe("settings wasm path:",this.config.wasmPath),Gb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Fe("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&$v();try{await c5(this.config.backend)}catch(r){Fe("error: cannot set backend:",this.config.backend,r)}if(u5(),gd()==="webgl"){this.config.deallocate&&(Fe("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),an.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),an.set("WEBGL_FORCE_F16_TEXTURES",!0),an.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await Nf().getGPGPUContext().gl;Fe(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await h5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.facemesh)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let u of l){if(this.analyze("Get Face"),!u.image||u.image.isDisposedInternal){Fe("Face object is disposed:",u.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(u.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(u.image,this.config):{},this.perf.age=Math.trunc(ft()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?eh.predict(u.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(u.image,this.config):{},this.perf.gender=Math.trunc(ft()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?th.predict(u.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(u.image,this.config):{},this.perf.emotion=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Ka.predict(u.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(u.image,this.config):{},this.perf.embedding=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),u.image.dispose(),this.config.face.iris.enabled||(delete u.annotations.leftEyeIris,delete u.annotations.rightEyeIris);let h=u.annotations.leftEyeIris&&u.annotations.rightEyeIris?11.7*Math.max(Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0]),Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])):0;o.push({confidence:u.confidence,box:u.box,mesh:u.mesh,boxRaw:u.boxRaw,meshRaw:u.meshRaw,annotations:u.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:h!==0?Math.trunc(h)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(t,n={}){this.state="image",this.config=Jl(this.config,n);let r=V2.process(t,this.config);return r.tensor.dispose(),r.canvas}async detect(t,n={}){return new Promise(async r=>{var p,d,f,m;this.state="config";let a;this.config=Jl(this.config,n),this.state="check";let s=this.sanity(t);s&&(Fe(s,t),r({error:s}));let i,o,l,c=ft();await this.checkBackend(),await this.load(),this.config.scoped&&Vn().startScope(),this.analyze("Start Scope:"),a=ft();let u=V2.process(t,this.config);if(!u||!u.tensor){Fe("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(ft()-a),this.analyze("Get Image:"),this.config.async?(l=this.config.face.enabled?this.detectFace(u.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=ft(),l=this.config.face.enabled?await this.detectFace(u.tensor):[],this.perf.face=Math.trunc(ft()-a)),this.analyze("Start Body:"),this.config.async?(i=this.config.body.enabled?(p=this.models.posenet)==null?void 0:p.estimatePoses(u.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=ft(),i=this.config.body.enabled?await((d=this.models.posenet)==null?void 0:d.estimatePoses(u.tensor,this.config)):[],this.perf.body=Math.trunc(ft()-a)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(o=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(u.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=ft(),o=this.config.hand.enabled?await((m=this.models.handpose)==null?void 0:m.estimateHands(u.tensor,this.config)):[],this.perf.hand=Math.trunc(ft()-a)),this.analyze("End Hand:"),this.config.async&&([l,i,o]=await Promise.all([l,i,o])),u.tensor.dispose(),this.config.scoped&&Vn().endScope(),this.analyze("End Scope:");let h=[];this.config.gesture.enabled&&(a=ft(),h=[...Za.face(l),...Za.body(i),...Za.hand(o),...Za.iris(l)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(ft()-a)),this.perf.total=Math.trunc(ft()-c),this.state="idle",r({face:l,body:i,hand:o,gesture:h,performance:this.perf,canvas:u.canvas})})}async warmupBitmap(){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(R0);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}async warmupCanvas(){return new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+R0;break;case"full":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image(r,r);a.onload=()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=r,s.height=r;let i=s.getContext("2d");i.drawImage(a,0,0);let o=i.getImageData(0,0,r,r);this.detect(o,this.config).then(l=>t(l))},n?a.src=n:t(null)})}async warmupNode(){let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(R0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);Ne(r);let s=await this.detect(a,this.config);return Ne(a),s}async warmup(t){let n=ft();t&&(this.config=Jl(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await this.warmupBitmap():typeof Image!="undefined"?a=await this.warmupCanvas():a=await this.warmupNode(),this.config.videoOptimized=r;let s=ft();return Fe("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};export{m4 as default}; +2Q==`;var p4="0.11.3";var ft=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Jl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Jl(s,i):n[a]=i}),n),{})}var m4=class{constructor(t={}){this.tf=kh,this.version=p4,this.config=Jl(d4,t),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=L2,this.age=Qc,this.gender=eh,this.emotion=th,this.body=W2,this.hand=B2}profile(){return this.config.profile?f4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Fe(...t,a)}sanity(t){if(!this.checkSanity)return null;if(!t)return"input is not defined";if(an.flags.IS_NODE&&!(t instanceof Ke))return"input must be a tensor";try{gd()}catch(n){return"backend not loaded"}return null}simmilarity(t,n){return this.config.face.embedding.enabled?Ka.simmilarity(t,n):0}async load(t){this.state="load";let n=ft();t&&(this.config=Jl(this.config,t)),this.firstRun&&(Fe(`version: ${this.version} TensorFlow/JS version: ${l5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Fe("configuration:",this.config),Fe("tf flags:",an.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?L2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Qc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?eh.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?th.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Ka.load(this.config):null),this.models.posenet||(this.config.body.enabled?W2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?B2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await L2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Qc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await eh.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await th.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Ka.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await W2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await B2.load(this.config))),this.firstRun&&(Fe("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(ft()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Fe("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Fe("settings wasm path:",this.config.wasmPath),Gb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Fe("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&$v();try{await c5(this.config.backend)}catch(r){Fe("error: cannot set backend:",this.config.backend,r)}if(u5(),gd()==="webgl"){this.config.deallocate&&(Fe("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),an.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),an.set("WEBGL_FORCE_F16_TEXTURES",!0),an.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await Nf().getGPGPUContext().gl;Fe(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await h5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.facemesh)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let u of l){if(this.analyze("Get Face"),!u.image||u.image.isDisposedInternal){Fe("Face object is disposed:",u.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(u.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(u.image,this.config):{},this.perf.age=Math.trunc(ft()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?eh.predict(u.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(u.image,this.config):{},this.perf.gender=Math.trunc(ft()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?th.predict(u.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(u.image,this.config):{},this.perf.emotion=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Ka.predict(u.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(u.image,this.config):{},this.perf.embedding=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),u.image.dispose(),this.config.face.iris.enabled||(delete u.annotations.leftEyeIris,delete u.annotations.rightEyeIris);let h=u.annotations.leftEyeIris&&u.annotations.rightEyeIris?11.7*Math.max(Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0]),Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])):0;o.push({confidence:u.confidence,box:u.box,mesh:u.mesh,boxRaw:u.boxRaw,meshRaw:u.meshRaw,annotations:u.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:h!==0?Math.trunc(h)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(t,n={}){this.state="image",this.config=Jl(this.config,n);let r=V2.process(t,this.config);return r.tensor.dispose(),r.canvas}async detect(t,n={}){return new Promise(async r=>{var p,d,f,m;this.state="config";let a;this.config=Jl(this.config,n),this.state="check";let s=this.sanity(t);s&&(Fe(s,t),r({error:s}));let i,o,l,c=ft();await this.checkBackend(),await this.load(),this.config.scoped&&Vn().startScope(),this.analyze("Start Scope:"),a=ft();let u=V2.process(t,this.config);if(!u||!u.tensor){Fe("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(ft()-a),this.analyze("Get Image:"),this.config.async?(l=this.config.face.enabled?this.detectFace(u.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=ft(),l=this.config.face.enabled?await this.detectFace(u.tensor):[],this.perf.face=Math.trunc(ft()-a)),this.analyze("Start Body:"),this.config.async?(i=this.config.body.enabled?(p=this.models.posenet)==null?void 0:p.estimatePoses(u.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=ft(),i=this.config.body.enabled?await((d=this.models.posenet)==null?void 0:d.estimatePoses(u.tensor,this.config)):[],this.perf.body=Math.trunc(ft()-a)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(o=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(u.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=ft(),o=this.config.hand.enabled?await((m=this.models.handpose)==null?void 0:m.estimateHands(u.tensor,this.config)):[],this.perf.hand=Math.trunc(ft()-a)),this.analyze("End Hand:"),this.config.async&&([l,i,o]=await Promise.all([l,i,o])),u.tensor.dispose(),this.config.scoped&&Vn().endScope(),this.analyze("End Scope:");let h=[];this.config.gesture.enabled&&(a=ft(),h=[...Za.face(l),...Za.body(i),...Za.hand(o),...Za.iris(l)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(ft()-a)),this.perf.total=Math.trunc(ft()-c),this.state="idle",r({face:l,body:i,hand:o,gesture:h,performance:this.perf,canvas:u.canvas})})}async warmupBitmap(){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(R0);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}async warmupCanvas(){return new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+R0;break;case"full":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image(r,r);a.onload=()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=r,s.height=r;let i=s.getContext("2d");i.drawImage(a,0,0);let o=i.getImageData(0,0,r,r);this.detect(o,this.config).then(l=>t(l))},n?a.src=n:t(null)})}async warmupNode(){let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(R0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);Ne(r);let s=await this.detect(a,this.config);return Ne(a),s}async warmup(t){let n=ft();t&&(this.config=Jl(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await this.warmupBitmap():typeof Image!="undefined"?a=await this.warmupCanvas():a=await this.warmupNode(),this.config.videoOptimized=r;let s=ft();return Fe("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};export{m4 as default}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.js b/dist/human.js index 55ef638a..695ca1ce 100644 --- a/dist/human.js +++ b/dist/human.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var m4="0.11.2";var ft=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Jl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Jl(s,i):n[a]=i}),n),{})}var U2=class{constructor(t={}){this.tf=kh,this.version=m4,this.config=Jl(f4,t),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=L2,this.age=Qc,this.gender=eh,this.emotion=th,this.body=W2,this.hand=B2}profile(){return this.config.profile?A4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Fe(...t,a)}sanity(t){if(!this.checkSanity)return null;if(!t)return"input is not defined";if(an.flags.IS_NODE&&!(t instanceof Ke))return"input must be a tensor";try{gd()}catch(n){return"backend not loaded"}return null}simmilarity(t,n){return this.config.face.embedding.enabled?Ka.simmilarity(t,n):0}async load(t){this.state="load";let n=ft();t&&(this.config=Jl(this.config,t)),this.firstRun&&(Fe(`version: ${this.version} TensorFlow/JS version: ${c5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Fe("configuration:",this.config),Fe("tf flags:",an.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?L2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Qc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?eh.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?th.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Ka.load(this.config):null),this.models.posenet||(this.config.body.enabled?W2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?B2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await L2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Qc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await eh.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await th.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Ka.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await W2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await B2.load(this.config))),this.firstRun&&(Fe("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(ft()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Fe("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Fe("settings wasm path:",this.config.wasmPath),Xb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Fe("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&zv();try{await d5(this.config.backend)}catch(r){Fe("error: cannot set backend:",this.config.backend,r)}if(h5(),gd()==="webgl"){this.config.deallocate&&(Fe("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),an.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),an.set("WEBGL_FORCE_F16_TEXTURES",!0),an.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await Nf().getGPGPUContext().gl;Fe(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await p5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.facemesh)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let u of l){if(this.analyze("Get Face"),!u.image||u.image.isDisposedInternal){Fe("Face object is disposed:",u.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(u.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(u.image,this.config):{},this.perf.age=Math.trunc(ft()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?eh.predict(u.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(u.image,this.config):{},this.perf.gender=Math.trunc(ft()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?th.predict(u.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(u.image,this.config):{},this.perf.emotion=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Ka.predict(u.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(u.image,this.config):{},this.perf.embedding=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),u.image.dispose(),this.config.face.iris.enabled||(delete u.annotations.leftEyeIris,delete u.annotations.rightEyeIris);let h=u.annotations.leftEyeIris&&u.annotations.rightEyeIris?11.7*Math.max(Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0]),Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])):0;o.push({confidence:u.confidence,box:u.box,mesh:u.mesh,boxRaw:u.boxRaw,meshRaw:u.meshRaw,annotations:u.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:h!==0?Math.trunc(h)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(t,n={}){this.state="image",this.config=Jl(this.config,n);let r=V2.process(t,this.config);return r.tensor.dispose(),r.canvas}async detect(t,n={}){return new Promise(async r=>{var p,d,f,m;this.state="config";let a;this.config=Jl(this.config,n),this.state="check";let s=this.sanity(t);s&&(Fe(s,t),r({error:s}));let i,o,l,c=ft();await this.checkBackend(),await this.load(),this.config.scoped&&Vn().startScope(),this.analyze("Start Scope:"),a=ft();let u=V2.process(t,this.config);if(!u||!u.tensor){Fe("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(ft()-a),this.analyze("Get Image:"),this.config.async?(l=this.config.face.enabled?this.detectFace(u.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=ft(),l=this.config.face.enabled?await this.detectFace(u.tensor):[],this.perf.face=Math.trunc(ft()-a)),this.analyze("Start Body:"),this.config.async?(i=this.config.body.enabled?(p=this.models.posenet)==null?void 0:p.estimatePoses(u.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=ft(),i=this.config.body.enabled?await((d=this.models.posenet)==null?void 0:d.estimatePoses(u.tensor,this.config)):[],this.perf.body=Math.trunc(ft()-a)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(o=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(u.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=ft(),o=this.config.hand.enabled?await((m=this.models.handpose)==null?void 0:m.estimateHands(u.tensor,this.config)):[],this.perf.hand=Math.trunc(ft()-a)),this.analyze("End Hand:"),this.config.async&&([l,i,o]=await Promise.all([l,i,o])),u.tensor.dispose(),this.config.scoped&&Vn().endScope(),this.analyze("End Scope:");let h=[];this.config.gesture.enabled&&(a=ft(),h=[...Za.face(l),...Za.body(i),...Za.hand(o),...Za.iris(l)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(ft()-a)),this.perf.total=Math.trunc(ft()-c),this.state="idle",r({face:l,body:i,hand:o,gesture:h,performance:this.perf,canvas:u.canvas})})}async warmupBitmap(){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(R0);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}async warmupCanvas(){return new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+R0;break;case"full":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image(r,r);a.onload=()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=r,s.height=r;let i=s.getContext("2d");i.drawImage(a,0,0);let o=i.getImageData(0,0,r,r);this.detect(o,this.config).then(l=>t(l))},n?a.src=n:t(null)})}async warmupNode(){let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(R0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);Ne(r);let s=await this.detect(a,this.config);return Ne(a),s}async warmup(t){let n=ft();t&&(this.config=Jl(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await this.warmupBitmap():typeof Image!="undefined"?a=await this.warmupCanvas():a=await this.warmupNode(),this.config.videoOptimized=r;let s=ft();return Fe("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};return Hse;})(); +2Q==`;var m4="0.11.3";var ft=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Jl(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=Jl(s,i):n[a]=i}),n),{})}var U2=class{constructor(t={}){this.tf=kh,this.version=m4,this.config=Jl(f4,t),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=L2,this.age=Qc,this.gender=eh,this.emotion=th,this.body=W2,this.hand=B2}profile(){return this.config.profile?A4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Fe(...t,a)}sanity(t){if(!this.checkSanity)return null;if(!t)return"input is not defined";if(an.flags.IS_NODE&&!(t instanceof Ke))return"input must be a tensor";try{gd()}catch(n){return"backend not loaded"}return null}simmilarity(t,n){return this.config.face.embedding.enabled?Ka.simmilarity(t,n):0}async load(t){this.state="load";let n=ft();t&&(this.config=Jl(this.config,t)),this.firstRun&&(Fe(`version: ${this.version} TensorFlow/JS version: ${c5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Fe("configuration:",this.config),Fe("tf flags:",an.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?L2.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Qc.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?eh.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?th.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?Ka.load(this.config):null),this.models.posenet||(this.config.body.enabled?W2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?B2.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await L2.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Qc.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await eh.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await th.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await Ka.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await W2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await B2.load(this.config))),this.firstRun&&(Fe("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(ft()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Fe("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Fe("settings wasm path:",this.config.wasmPath),Xb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Fe("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&zv();try{await d5(this.config.backend)}catch(r){Fe("error: cannot set backend:",this.config.backend,r)}if(h5(),gd()==="webgl"){this.config.deallocate&&(Fe("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),an.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),an.set("WEBGL_FORCE_F16_TEXTURES",!0),an.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await Nf().getGPGPUContext().gl;Fe(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await p5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.facemesh)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let u of l){if(this.analyze("Get Face"),!u.image||u.image.isDisposedInternal){Fe("Face object is disposed:",u.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(u.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(u.image,this.config):{},this.perf.age=Math.trunc(ft()-n)),this.analyze("Start Gender:"),this.config.async?a=this.config.face.gender.enabled?eh.predict(u.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(u.image,this.config):{},this.perf.gender=Math.trunc(ft()-n)),this.analyze("Start Emotion:"),this.config.async?s=this.config.face.emotion.enabled?th.predict(u.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(u.image,this.config):{},this.perf.emotion=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?i=this.config.face.embedding.enabled?Ka.predict(u.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(u.image,this.config):{},this.perf.embedding=Math.trunc(ft()-n)),this.analyze("End Emotion:"),this.config.async&&([r,a,s,i]=await Promise.all([r,a,s,i])),this.analyze("Finish Face:"),u.image.dispose(),this.config.face.iris.enabled||(delete u.annotations.leftEyeIris,delete u.annotations.rightEyeIris);let h=u.annotations.leftEyeIris&&u.annotations.rightEyeIris?11.7*Math.max(Math.abs(u.annotations.leftEyeIris[3][0]-u.annotations.leftEyeIris[1][0]),Math.abs(u.annotations.rightEyeIris[4][1]-u.annotations.rightEyeIris[2][1])):0;o.push({confidence:u.confidence,box:u.box,mesh:u.mesh,boxRaw:u.boxRaw,meshRaw:u.meshRaw,annotations:u.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:h!==0?Math.trunc(h)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),o}async image(t,n={}){this.state="image",this.config=Jl(this.config,n);let r=V2.process(t,this.config);return r.tensor.dispose(),r.canvas}async detect(t,n={}){return new Promise(async r=>{var p,d,f,m;this.state="config";let a;this.config=Jl(this.config,n),this.state="check";let s=this.sanity(t);s&&(Fe(s,t),r({error:s}));let i,o,l,c=ft();await this.checkBackend(),await this.load(),this.config.scoped&&Vn().startScope(),this.analyze("Start Scope:"),a=ft();let u=V2.process(t,this.config);if(!u||!u.tensor){Fe("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(ft()-a),this.analyze("Get Image:"),this.config.async?(l=this.config.face.enabled?this.detectFace(u.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",a=ft(),l=this.config.face.enabled?await this.detectFace(u.tensor):[],this.perf.face=Math.trunc(ft()-a)),this.analyze("Start Body:"),this.config.async?(i=this.config.body.enabled?(p=this.models.posenet)==null?void 0:p.estimatePoses(u.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",a=ft(),i=this.config.body.enabled?await((d=this.models.posenet)==null?void 0:d.estimatePoses(u.tensor,this.config)):[],this.perf.body=Math.trunc(ft()-a)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(o=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(u.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",a=ft(),o=this.config.hand.enabled?await((m=this.models.handpose)==null?void 0:m.estimateHands(u.tensor,this.config)):[],this.perf.hand=Math.trunc(ft()-a)),this.analyze("End Hand:"),this.config.async&&([l,i,o]=await Promise.all([l,i,o])),u.tensor.dispose(),this.config.scoped&&Vn().endScope(),this.analyze("End Scope:");let h=[];this.config.gesture.enabled&&(a=ft(),h=[...Za.face(l),...Za.body(i),...Za.hand(o),...Za.iris(l)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(ft()-a)),this.perf.total=Math.trunc(ft()-c),this.state="idle",r({face:l,body:i,hand:o,gesture:h,performance:this.perf,canvas:u.canvas})})}async warmupBitmap(){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(R0);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}async warmupCanvas(){return new Promise(t=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+R0;break;case"full":r=1200,n="data:image/jpeg;base64,"+F0;break;default:n=null}let a=new Image(r,r);a.onload=()=>{let s=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");s.width=r,s.height=r;let i=s.getContext("2d");i.drawImage(a,0,0);let o=i.getImageData(0,0,r,r);this.detect(o,this.config).then(l=>t(l))},n?a.src=n:t(null)})}async warmupNode(){let t=i=>Buffer.from(i,"base64"),n=this.config.warmup==="face"?t(R0):t(F0),r=(void 0).decodeJpeg(n),a=r.expandDims(0);Ne(r);let s=await this.detect(a,this.config);return Ne(a),s}async warmup(t){let n=ft();t&&(this.config=Jl(this.config,t));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let a;typeof createImageBitmap=="function"?a=await this.warmupBitmap():typeof Image!="undefined"?a=await this.warmupCanvas():a=await this.warmupNode(),this.config.videoOptimized=r;let s=ft();return Fe("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};return Hse;})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.node-gpu.js b/dist/human.node-gpu.js index 393dc8d3..ea8a2105 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 gt="0.11.2";var v=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function pe(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=pe(c,_):n[A]=_}),n),{})}var Pt=class{constructor(e={}){this.tf=E,this.version=gt,this.config=pe(bt,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Re,this.gender=Ee,this.emotion=ze,this.body=N1,this.hand=j1}profile(){return this.config.profile?Tt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=E.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&p(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(E.ENV.flags.IS_NODE&&!(e instanceof E.Tensor))return"input must be a tensor";try{E.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?he.simmilarity(e,n):0}async load(e){this.state="load";let n=v();e&&(this.config=pe(this.config,e)),this.firstRun&&(p(`version: ${this.version} TensorFlow/JS version: ${E.version_core}`),await this.checkBackend(!0),E.ENV.flags.IS_BROWSER&&(p("configuration:",this.config),p("tf flags:",E.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Re.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Ee.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?ze.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?N1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?j1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Re.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await ze.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await N1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await j1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(v()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||E.getBackend()!==this.config.backend){let n=v();this.state="backend",p("setting backend:",this.config.backend),this.config.backend==="wasm"&&(p("settings wasm path:",this.config.wasmPath),E.setWasmPaths(this.config.wasmPath),await E.env().getAsync("WASM_HAS_SIMD_SUPPORT")||p("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await E.setBackend(this.config.backend)}catch(r){p("error: cannot set backend:",this.config.backend,r)}if(E.enableProdMode(),E.getBackend()==="webgl"){this.config.deallocate&&(p("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),E.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),E.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),E.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await E.backend().getGPGPUContext().gl;p(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await E.ready(),this.perf.backend=Math.trunc(v()-n)}}async detectFace(e){var o;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((o=this.models.facemesh)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){p("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Re.predict(y.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Re.predict(y.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await Ee.predict(y.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?ze.predict(y.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await ze.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?he.predict(y.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let a=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:a!==0?Math.trunc(a)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=pe(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,f,g;this.state="config";let A;this.config=pe(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,o=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let y=W1.process(e,this.config);if(!y||!y.tensor){p("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(v()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(w=this.models.posenet)==null?void 0:w.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=v(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(v()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=v(),a=[...xe.face(x),...xe.body(_),...xe.hand(h),...xe.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-A)),this.perf.total=Math.trunc(v()-o),this.state="idle",r({face:x,body:_,hand:h,gesture:a,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Je);break;case"full":n=await e(Ke);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Je;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ke;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Je):e(Ke),r=E.node.decodeJpeg(n),A=r.expandDims(0);E.dispose(r);let c=await this.detect(A,this.config);return E.dispose(A),c}async warmup(e){let n=v();e&&(this.config=pe(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; +2Q==`;var gt="0.11.3";var v=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function pe(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=pe(c,_):n[A]=_}),n),{})}var Pt=class{constructor(e={}){this.tf=E,this.version=gt,this.config=pe(bt,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Re,this.gender=Ee,this.emotion=ze,this.body=N1,this.hand=j1}profile(){return this.config.profile?Tt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=E.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&p(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(E.ENV.flags.IS_NODE&&!(e instanceof E.Tensor))return"input must be a tensor";try{E.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?he.simmilarity(e,n):0}async load(e){this.state="load";let n=v();e&&(this.config=pe(this.config,e)),this.firstRun&&(p(`version: ${this.version} TensorFlow/JS version: ${E.version_core}`),await this.checkBackend(!0),E.ENV.flags.IS_BROWSER&&(p("configuration:",this.config),p("tf flags:",E.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Re.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Ee.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?ze.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?N1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?j1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Re.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await ze.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await N1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await j1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(v()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||E.getBackend()!==this.config.backend){let n=v();this.state="backend",p("setting backend:",this.config.backend),this.config.backend==="wasm"&&(p("settings wasm path:",this.config.wasmPath),E.setWasmPaths(this.config.wasmPath),await E.env().getAsync("WASM_HAS_SIMD_SUPPORT")||p("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await E.setBackend(this.config.backend)}catch(r){p("error: cannot set backend:",this.config.backend,r)}if(E.enableProdMode(),E.getBackend()==="webgl"){this.config.deallocate&&(p("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),E.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),E.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),E.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await E.backend().getGPGPUContext().gl;p(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await E.ready(),this.perf.backend=Math.trunc(v()-n)}}async detectFace(e){var o;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((o=this.models.facemesh)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){p("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Re.predict(y.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Re.predict(y.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await Ee.predict(y.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?ze.predict(y.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await ze.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?he.predict(y.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let a=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:a!==0?Math.trunc(a)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=pe(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,f,g;this.state="config";let A;this.config=pe(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,o=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let y=W1.process(e,this.config);if(!y||!y.tensor){p("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(v()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(w=this.models.posenet)==null?void 0:w.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=v(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(v()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=v(),a=[...xe.face(x),...xe.body(_),...xe.hand(h),...xe.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-A)),this.perf.total=Math.trunc(v()-o),this.state="idle",r({face:x,body:_,hand:h,gesture:a,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Je);break;case"full":n=await e(Ke);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Je;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ke;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Je):e(Ke),r=E.node.decodeJpeg(n),A=r.expandDims(0);E.dispose(r);let c=await this.detect(A,this.config);return E.dispose(A),c}async warmup(e){let n=v();e&&(this.config=pe(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; //# sourceMappingURL=human.node-gpu.js.map diff --git a/dist/human.node.js b/dist/human.node.js index 5ebb8858..c6ab21df 100644 --- a/dist/human.node.js +++ b/dist/human.node.js @@ -731,5 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var gt="0.11.2";var v=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function pe(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=pe(c,_):n[A]=_}),n),{})}var Pt=class{constructor(e={}){this.tf=E,this.version=gt,this.config=pe(bt,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Re,this.gender=Ee,this.emotion=ze,this.body=N1,this.hand=j1}profile(){return this.config.profile?Tt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=E.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&p(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(E.ENV.flags.IS_NODE&&!(e instanceof E.Tensor))return"input must be a tensor";try{E.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?he.simmilarity(e,n):0}async load(e){this.state="load";let n=v();e&&(this.config=pe(this.config,e)),this.firstRun&&(p(`version: ${this.version} TensorFlow/JS version: ${E.version_core}`),await this.checkBackend(!0),E.ENV.flags.IS_BROWSER&&(p("configuration:",this.config),p("tf flags:",E.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Re.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Ee.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?ze.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?N1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?j1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Re.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await ze.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await N1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await j1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(v()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||E.getBackend()!==this.config.backend){let n=v();this.state="backend",p("setting backend:",this.config.backend),this.config.backend==="wasm"&&(p("settings wasm path:",this.config.wasmPath),E.setWasmPaths(this.config.wasmPath),await E.env().getAsync("WASM_HAS_SIMD_SUPPORT")||p("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await E.setBackend(this.config.backend)}catch(r){p("error: cannot set backend:",this.config.backend,r)}if(E.enableProdMode(),E.getBackend()==="webgl"){this.config.deallocate&&(p("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),E.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),E.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),E.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await E.backend().getGPGPUContext().gl;p(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await E.ready(),this.perf.backend=Math.trunc(v()-n)}}async detectFace(e){var o;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((o=this.models.facemesh)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){p("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Re.predict(y.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Re.predict(y.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await Ee.predict(y.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?ze.predict(y.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await ze.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?he.predict(y.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let a=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:a!==0?Math.trunc(a)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=pe(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,f,g;this.state="config";let A;this.config=pe(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,o=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let y=W1.process(e,this.config);if(!y||!y.tensor){p("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(v()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(w=this.models.posenet)==null?void 0:w.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=v(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(v()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=v(),a=[...xe.face(x),...xe.body(_),...xe.hand(h),...xe.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-A)),this.perf.total=Math.trunc(v()-o),this.state="idle",r({face:x,body:_,hand:h,gesture:a,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Je);break;case"full":n=await e(Ke);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Je;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ke;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Je):e(Ke),r=E.node.decodeJpeg(n),A=r.expandDims(0);E.dispose(r);let c=await this.detect(A,this.config);return E.dispose(A),c}async warmup(e){let n=v();e&&(this.config=pe(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; +2Q==`;var gt="0.11.3";var v=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function pe(...t){let e=n=>n&&typeof n=="object";return t.reduce((n,r)=>(Object.keys(r||{}).forEach(A=>{let c=n[A],_=r[A];Array.isArray(c)&&Array.isArray(_)?n[A]=c.concat(..._):e(c)&&e(_)?n[A]=pe(c,_):n[A]=_}),n),{})}var Pt=class{constructor(e={}){this.tf=E,this.version=gt,this.config=pe(bt,e),this.fx=null,this.state="idle",this.numTensors=0,this.analyzeMemoryLeaks=!1,this.checkSanity=!1,this.firstRun=!0,this.perf={},this.models={facemesh:null,posenet:null,handpose:null,iris:null,age:null,gender:null,emotion:null},this.facemesh=M1,this.age=Re,this.gender=Ee,this.emotion=ze,this.body=N1,this.hand=j1}profile(){return this.config.profile?Tt.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let n=E.engine().state.numTensors,r=this.numTensors;this.numTensors=n;let A=n-r;A!==0&&p(...e,A)}sanity(e){if(!this.checkSanity)return null;if(!e)return"input is not defined";if(E.ENV.flags.IS_NODE&&!(e instanceof E.Tensor))return"input must be a tensor";try{E.getBackend()}catch(n){return"backend not loaded"}return null}simmilarity(e,n){return this.config.face.embedding.enabled?he.simmilarity(e,n):0}async load(e){this.state="load";let n=v();e&&(this.config=pe(this.config,e)),this.firstRun&&(p(`version: ${this.version} TensorFlow/JS version: ${E.version_core}`),await this.checkBackend(!0),E.ENV.flags.IS_BROWSER&&(p("configuration:",this.config),p("tf flags:",E.ENV.flags))),this.config.async?[this.models.facemesh,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.facemesh||(this.config.face.enabled?M1.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?Re.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Ee.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?ze.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?N1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?j1.load(this.config):null)]):(this.config.face.enabled&&!this.models.facemesh&&(this.models.facemesh=await M1.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await Re.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Ee.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await ze.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await N1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await j1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(v()-n);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||E.getBackend()!==this.config.backend){let n=v();this.state="backend",p("setting backend:",this.config.backend),this.config.backend==="wasm"&&(p("settings wasm path:",this.config.wasmPath),E.setWasmPaths(this.config.wasmPath),await E.env().getAsync("WASM_HAS_SIMD_SUPPORT")||p("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&k1();try{await E.setBackend(this.config.backend)}catch(r){p("error: cannot set backend:",this.config.backend,r)}if(E.enableProdMode(),E.getBackend()==="webgl"){this.config.deallocate&&(p("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",this.config.deallocate),E.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD",this.config.deallocate?0:-1)),E.ENV.set("WEBGL_FORCE_F16_TEXTURES",!0),E.ENV.set("WEBGL_PACK_DEPTHWISECONV",!0);let r=await E.backend().getGPGPUContext().gl;p(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await E.ready(),this.perf.backend=Math.trunc(v()-n)}}async detectFace(e){var o;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((o=this.models.facemesh)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let y of x){if(this.analyze("Get Face"),!y.image||y.image.isDisposedInternal){p("Face object is disposed:",y.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Re.predict(y.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Re.predict(y.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Ee.predict(y.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await Ee.predict(y.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?ze.predict(y.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await ze.predict(y.image,this.config):{},this.perf.emotion=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?_=this.config.face.embedding.enabled?he.predict(y.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(y.image,this.config):{},this.perf.embedding=Math.trunc(v()-n)),this.analyze("End Emotion:"),this.config.async&&([r,A,c,_]=await Promise.all([r,A,c,_])),this.analyze("Finish Face:"),y.image.dispose(),this.config.face.iris.enabled||(delete y.annotations.leftEyeIris,delete y.annotations.rightEyeIris);let a=y.annotations.leftEyeIris&&y.annotations.rightEyeIris?11.7*Math.max(Math.abs(y.annotations.leftEyeIris[3][0]-y.annotations.leftEyeIris[1][0]),Math.abs(y.annotations.rightEyeIris[4][1]-y.annotations.rightEyeIris[2][1])):0;h.push({confidence:y.confidence,box:y.box,mesh:y.mesh,boxRaw:y.boxRaw,meshRaw:y.meshRaw,annotations:y.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:a!==0?Math.trunc(a)/100:0}),this.analyze("End Face")}return this.analyze("End FaceMesh:"),this.config.async&&(this.perf.face&&delete this.perf.face,this.perf.age&&delete this.perf.age,this.perf.gender&&delete this.perf.gender,this.perf.emotion&&delete this.perf.emotion),h}async image(e,n={}){this.state="image",this.config=pe(this.config,n);let r=W1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,f,g;this.state="config";let A;this.config=pe(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,o=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let y=W1.process(e,this.config);if(!y||!y.tensor){p("could not convert input to tensor"),r({error:"could not convert input to tensor"});return}this.perf.image=Math.trunc(v()-A),this.analyze("Get Image:"),this.config.async?(x=this.config.face.enabled?this.detectFace(y.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(y.tensor):[],this.perf.face=Math.trunc(v()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(w=this.models.posenet)==null?void 0:w.estimatePoses(y.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=v(),_=this.config.body.enabled?await((s=this.models.posenet)==null?void 0:s.estimatePoses(y.tensor,this.config)):[],this.perf.body=Math.trunc(v()-A)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.config.async?(h=this.config.hand.enabled?(f=this.models.handpose)==null?void 0:f.estimateHands(y.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((g=this.models.handpose)==null?void 0:g.estimateHands(y.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),y.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=v(),a=[...xe.face(x),...xe.body(_),...xe.hand(h),...xe.iris(x)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(v()-A)),this.perf.total=Math.trunc(v()-o),this.state="idle",r({face:x,body:_,hand:h,gesture:a,performance:this.perf,canvas:y.canvas})})}async warmupBitmap(){let e=(A,c="application/octet-stream")=>fetch(`data:${c};base64,${A}`).then(_=>_.blob()),n,r;switch(this.config.warmup){case"face":n=await e(Je);break;case"full":n=await e(Ke);break;default:n=null}if(n){let A=await createImageBitmap(n);r=await this.detect(A,this.config),A.close()}return r}async warmupCanvas(){return new Promise(e=>{let n,r=0;switch(this.config.warmup){case"face":r=256,n="data:image/jpeg;base64,"+Je;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ke;break;default:n=null}let A=new Image(r,r);A.onload=()=>{let c=typeof OffscreenCanvas!="undefined"?new OffscreenCanvas(r,r):document.createElement("canvas");c.width=r,c.height=r;let _=c.getContext("2d");_.drawImage(A,0,0);let h=_.getImageData(0,0,r,r);this.detect(h,this.config).then(x=>e(x))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Je):e(Ke),r=E.node.decodeJpeg(n),A=r.expandDims(0);E.dispose(r);let c=await this.detect(A,this.config);return E.dispose(A),c}async warmup(e){let n=v();e&&(this.config=pe(this.config,e));let r=this.config.videoOptimized;this.config.videoOptimized=!1;let A;typeof createImageBitmap=="function"?A=await this.warmupBitmap():typeof Image!="undefined"?A=await this.warmupCanvas():A=await this.warmupNode(),this.config.videoOptimized=r;let c=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; //# sourceMappingURL=human.node.js.map diff --git a/package-lock.json b/package-lock.json index 4c1dc186..de0ea571 100644 --- a/package-lock.json +++ b/package-lock.json @@ -336,9 +336,9 @@ "dev": true }, "@types/node": { - "version": "14.14.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", - "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", + "version": "14.14.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", + "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==", "dev": true }, "@types/node-fetch": { @@ -376,9 +376,9 @@ "dev": true }, "@vladmandic/pilogger": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@vladmandic/pilogger/-/pilogger-0.2.13.tgz", - "integrity": "sha512-EmLlXiPj0y69li6pXA8HhfRsBUEBH+iSxGJK4VPkjAy6q+uDFFt3cfJx6aHh4L7bIBbn0puzFv9OfPqFzRP0XA==", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/@vladmandic/pilogger/-/pilogger-0.2.14.tgz", + "integrity": "sha512-i52up8diG85wYS1iPil3Vjd8LJiFVDVYVUTWjOwROsOh1WStz8hZoBh66ihc4pyYwJj993/IZIng3GAX1beRCA==", "dev": true }, "abbrev": { @@ -821,9 +821,9 @@ } }, "esbuild": { - "version": "0.8.39", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.39.tgz", - "integrity": "sha512-/do5H74a5ChyeKRWfkDh3EpICXpsz6dWTtFFbotb7BlIHvWqnRrZYDb8IBubOHdEtKzuiksilRO19aBtp3/HHQ==", + "version": "0.8.42", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.42.tgz", + "integrity": "sha512-zUtj5RMqROCCCH0vV/a7cd8YQg8I0GWBhV3A3PklWRT+oM/YwVbnrtFnITzE1otGdnXplWHWdZ4OcYiV0PN+JQ==", "dev": true }, "escalade": { @@ -1141,9 +1141,9 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -1352,9 +1352,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", - "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -2285,9 +2285,9 @@ "dev": true }, "simple-git": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.31.0.tgz", - "integrity": "sha512-/+rmE7dYZMbRAfEmn8EUIOwlM2G7UdzpkC60KF86YAfXGnmGtsPrKsym0hKvLBdFLLW019C+aZld1+6iIVy5xA==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.32.0.tgz", + "integrity": "sha512-swz7avV2JADYgTmvs+j/eDBt+gPx3SAyh2MxlDVvxqHzHLkKr6kLr4N62qZCv5LBxc9Wx8TIXVeJKmTTY8UdSQ==", "dev": true, "requires": { "@kwsites/file-exists": "^1.1.1", diff --git a/package.json b/package.json index 90b95b5d..811ad16d 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ "@tensorflow/tfjs-layers": "^3.0.0", "@tensorflow/tfjs-node": "^3.0.0", "@tensorflow/tfjs-node-gpu": "^3.0.0", - "@vladmandic/pilogger": "^0.2.13", + "@vladmandic/pilogger": "^0.2.14", "chokidar": "^3.5.1", "dayjs": "^1.10.4", - "esbuild": "^0.8.39", + "esbuild": "^0.8.42", "eslint": "^7.19.0", "eslint-config-airbnb-base": "^14.2.1", "eslint-plugin-import": "^2.22.1", @@ -44,7 +44,7 @@ "eslint-plugin-promise": "^4.2.1", "rimraf": "^3.0.2", "seedrandom": "^3.0.5", - "simple-git": "^2.31.0" + "simple-git": "^2.32.0" }, "scripts": { "start": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught --no-deprecation src/node.js",