diff --git a/dist/demo-browser-index.js b/dist/demo-browser-index.js index 6904e96c..1917558e 100644 --- a/dist/demo-browser-index.js +++ b/dist/demo-browser-index.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`,Ene="0.11.4",At=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Cl(...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]=Cl(s,i):n[a]=i}),n),{})}var U7=class{constructor(e={}){this.tf=ng,this.version=Ene,this.config=Cl(Tne,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=L7,this.age=Fc,this.gender=Mc,this.emotion=$c,this.body=D2,this.hand=O2}profile(){return this.config.profile?Sne.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let t=Ln().state.numTensors,n=this.numTensors;this.numTensors=t;let r=t-n;r!==0&&je(...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=Cl(this.config,e)),this.firstRun&&(je(`version: ${this.version} TensorFlow/JS version: ${hg}`),await this.checkBackend(!0),bn.flags.IS_BROWSER&&(je("configuration:",this.config),je("tf flags:",bn.flags)));let n=this.config.face.detector.modelPath.includes("faceboxes")?kne:L7;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?n.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?D2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?O2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await n.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 D2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await O2.load(this.config))),this.firstRun&&(je("tf engine state:",Ln().state.numBytes,"bytes",Ln().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(At()-t);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||Gh()!==this.config.backend){let t=At();this.state="backend",je("setting backend:",this.config.backend),this.config.backend==="wasm"&&(je("settings wasm path:",this.config.wasmPath),Zg(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||je("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&vne();try{await pg(this.config.backend)}catch(n){je("error: cannot set backend:",this.config.backend,n)}if(dg(),Gh()==="webgl"){this.config.deallocate&&(je("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;je(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}await fg(),this.perf.backend=Math.trunc(At()-t)}}async detectFace(e){var t,n,r,a,s,i;let o,l,c,u,h,d=[];this.state="run:face",o=At();let p=await((t=this.models.face)==null?void 0:t.estimateFaces(e,this.config));this.perf.face=Math.trunc(At()-o);for(let f of p){if(this.analyze("Get Face"),!f.image||f.image.isDisposedInternal){je("Face object is disposed:",f.image);continue}this.analyze("Start Age:"),this.config.async?l=this.config.face.age.enabled?Fc.predict(f.image,this.config):{}:(this.state="run:age",o=At(),l=this.config.face.age.enabled?await Fc.predict(f.image,this.config):{},this.perf.age=Math.trunc(At()-o)),this.analyze("Start Gender:"),this.config.async?c=this.config.face.gender.enabled?Mc.predict(f.image,this.config):{}:(this.state="run:gender",o=At(),c=this.config.face.gender.enabled?await Mc.predict(f.image,this.config):{},this.perf.gender=Math.trunc(At()-o)),this.analyze("Start Emotion:"),this.config.async?u=this.config.face.emotion.enabled?$c.predict(f.image,this.config):{}:(this.state="run:emotion",o=At(),u=this.config.face.emotion.enabled?await $c.predict(f.image,this.config):{},this.perf.emotion=Math.trunc(At()-o)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?h=this.config.face.embedding.enabled?Dc.predict(f.image,this.config):{}:(this.state="run:embedding",o=At(),h=this.config.face.embedding.enabled?await Dc.predict(f.image,this.config):{},this.perf.embedding=Math.trunc(At()-o)),this.analyze("End Emotion:"),this.config.async&&([l,c,u,h]=await Promise.all([l,c,u,h])),this.analyze("Finish Face:"),!this.config.face.iris.enabled&&((n=f==null?void 0:f.annotations)==null?void 0:n.leftEyeIris)&&((r=f==null?void 0:f.annotations)==null?void 0:r.rightEyeIris)&&(delete f.annotations.leftEyeIris,delete f.annotations.rightEyeIris);let m=((a=f.annotations)==null?void 0:a.leftEyeIris)&&((s=f.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(f.annotations.leftEyeIris[3][0]-f.annotations.leftEyeIris[1][0]),Math.abs(f.annotations.rightEyeIris[4][1]-f.annotations.rightEyeIris[2][1])):0;d.push({confidence:f.confidence,box:f.box,mesh:f.mesh,boxRaw:f.boxRaw,meshRaw:f.meshRaw,annotations:f.annotations,age:l.age,gender:c.gender,genderConfidence:c.confidence,emotion:u,embedding:h,iris:m!==0?Math.trunc(m)/100:0,image:f.image.toInt().squeeze()}),(i=f.image)==null||i.dispose(),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),d}async image(e,t={}){this.state="image",this.config=Cl(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=Cl(this.config,t),this.state="check";let l=this.sanity(e);l&&(je(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){je("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(z2);break;case"full":t=await e(P2);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,"+z2;break;case"full":n=1200,t="data:image/jpeg;base64,"+P2;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(z2):e(P2),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=Cl(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 je("Warmup",this.config.warmup,Math.round(a-t),"ms",r),r}};async function Cne(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 Rne(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 Fne(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 Mne(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:Rne,body:Fne,hand:Mne,gesture:Cne};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 $ne(){if(H7)return;let e=` +2Q==`,Ene="0.11.5",At=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function Cl(...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]=Cl(s,i):n[a]=i}),n),{})}var U7=class{constructor(e={}){this.tf=ng,this.version=Ene,this.config=Cl(Tne,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=L7,this.age=Fc,this.gender=Mc,this.emotion=$c,this.body=D2,this.hand=O2}profile(){return this.config.profile?Sne.data:{}}analyze(...e){if(!this.analyzeMemoryLeaks)return;let t=Ln().state.numTensors,n=this.numTensors;this.numTensors=t;let r=t-n;r!==0&&je(...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=Cl(this.config,e)),this.firstRun&&(je(`version: ${this.version} TensorFlow/JS version: ${hg}`),await this.checkBackend(!0),bn.flags.IS_BROWSER&&(je("configuration:",this.config),je("tf flags:",bn.flags)));let n=this.config.face.detector.modelPath.includes("faceboxes")?kne:L7;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?n.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?D2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?O2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await n.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 D2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await O2.load(this.config))),this.firstRun&&(je("tf engine state:",Ln().state.numBytes,"bytes",Ln().state.numTensors,"tensors"),this.firstRun=!1);let r=Math.trunc(At()-t);r>(this.perf.load||0)&&(this.perf.load=r)}async checkBackend(e){if(this.config.backend&&this.config.backend!==""&&e||Gh()!==this.config.backend){let t=At();this.state="backend",je("setting backend:",this.config.backend),this.config.backend==="wasm"&&(je("settings wasm path:",this.config.wasmPath),Zg(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||je("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&vne();try{await pg(this.config.backend)}catch(n){je("error: cannot set backend:",this.config.backend,n)}if(dg(),Gh()==="webgl"){this.config.deallocate&&(je("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;je(`gl version:${n.getParameter(n.VERSION)} renderer:${n.getParameter(n.RENDERER)}`)}await fg(),this.perf.backend=Math.trunc(At()-t)}}async detectFace(e){var t,n,r,a,s,i;let o,l,c,u,h,d=[];this.state="run:face",o=At();let p=await((t=this.models.face)==null?void 0:t.estimateFaces(e,this.config));this.perf.face=Math.trunc(At()-o);for(let f of p){if(this.analyze("Get Face"),!f.image||f.image.isDisposedInternal){je("Face object is disposed:",f.image);continue}this.analyze("Start Age:"),this.config.async?l=this.config.face.age.enabled?Fc.predict(f.image,this.config):{}:(this.state="run:age",o=At(),l=this.config.face.age.enabled?await Fc.predict(f.image,this.config):{},this.perf.age=Math.trunc(At()-o)),this.analyze("Start Gender:"),this.config.async?c=this.config.face.gender.enabled?Mc.predict(f.image,this.config):{}:(this.state="run:gender",o=At(),c=this.config.face.gender.enabled?await Mc.predict(f.image,this.config):{},this.perf.gender=Math.trunc(At()-o)),this.analyze("Start Emotion:"),this.config.async?u=this.config.face.emotion.enabled?$c.predict(f.image,this.config):{}:(this.state="run:emotion",o=At(),u=this.config.face.emotion.enabled?await $c.predict(f.image,this.config):{},this.perf.emotion=Math.trunc(At()-o)),this.analyze("End Emotion:"),this.analyze("Start Embedding:"),this.config.async?h=this.config.face.embedding.enabled?Dc.predict(f.image,this.config):{}:(this.state="run:embedding",o=At(),h=this.config.face.embedding.enabled?await Dc.predict(f.image,this.config):{},this.perf.embedding=Math.trunc(At()-o)),this.analyze("End Emotion:"),this.config.async&&([l,c,u,h]=await Promise.all([l,c,u,h])),this.analyze("Finish Face:"),!this.config.face.iris.enabled&&((n=f==null?void 0:f.annotations)==null?void 0:n.leftEyeIris)&&((r=f==null?void 0:f.annotations)==null?void 0:r.rightEyeIris)&&(delete f.annotations.leftEyeIris,delete f.annotations.rightEyeIris);let m=((a=f.annotations)==null?void 0:a.leftEyeIris)&&((s=f.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(f.annotations.leftEyeIris[3][0]-f.annotations.leftEyeIris[1][0]),Math.abs(f.annotations.rightEyeIris[4][1]-f.annotations.rightEyeIris[2][1])):0;d.push({confidence:f.confidence,box:f.box,mesh:f.mesh,boxRaw:f.boxRaw,meshRaw:f.meshRaw,annotations:f.annotations,age:l.age,gender:c.gender,genderConfidence:c.confidence,emotion:u,embedding:h,iris:m!==0?Math.trunc(m)/100:0,image:f.image.toInt().squeeze()}),(i=f.image)==null||i.dispose(),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),d}async image(e,t={}){this.state="image",this.config=Cl(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=Cl(this.config,t),this.state="check";let l=this.sanity(e);l&&(je(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){je("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(z2);break;case"full":t=await e(P2);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,"+z2;break;case"full":n=1200,t="data:image/jpeg;base64,"+P2;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(z2):e(P2),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=Cl(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 je("Warmup",this.config.warmup,Math.round(a-t),"ms",r),r}};async function Cne(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 Rne(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 Fne(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 Mne(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:Rne,body:Fne,hand:Mne,gesture:Cne};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 $ne(){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 570ab0f6..521b785a 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.4";var R=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function ge(...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]=ge(c,_):n[A]=_}),n),{})}var Et=class{constructor(e={}){this.tf=z,this.version=Pt,this.config=ge(Tt,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=vt,this.age=ze,this.gender=Me,this.emotion=je,this.body=S1,this.hand=W1}profile(){return this.config.profile?Rt.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?se.simmilarity(e,n):0}async load(e){this.state="load";let n=R();e&&(this.config=ge(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?jn:vt;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?ze.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Me.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?je.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?se.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await ze.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Me.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await je.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await se.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(b("tf engine state:",z.engine().state.numBytes,"bytes",z.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(R()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&L1();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 o,i,a,d,x,u;let n,r,A,c,_,h=[];this.state="run:face",n=R();let s=await((o=this.models.face)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(R()-n);for(let l of s){if(this.analyze("Get Face"),!l.image||l.image.isDisposedInternal){b("Face object is disposed:",l.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?ze.predict(l.image,this.config):{}:(this.state="run:age",n=R(),r=this.config.face.age.enabled?await ze.predict(l.image,this.config):{},this.perf.age=Math.trunc(R()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Me.predict(l.image,this.config):{}:(this.state="run:gender",n=R(),A=this.config.face.gender.enabled?await Me.predict(l.image,this.config):{},this.perf.gender=Math.trunc(R()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?je.predict(l.image,this.config):{}:(this.state="run:emotion",n=R(),c=this.config.face.emotion.enabled?await je.predict(l.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?se.predict(l.image,this.config):{}:(this.state="run:embedding",n=R(),_=this.config.face.embedding.enabled?await se.predict(l.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:"),!this.config.face.iris.enabled&&((i=l==null?void 0:l.annotations)==null?void 0:i.leftEyeIris)&&((a=l==null?void 0:l.annotations)==null?void 0:a.rightEyeIris)&&(delete l.annotations.leftEyeIris,delete l.annotations.rightEyeIris);let k=((d=l.annotations)==null?void 0:d.leftEyeIris)&&((x=l.annotations)==null?void 0:x.rightEyeIris)?11.7*Math.max(Math.abs(l.annotations.leftEyeIris[3][0]-l.annotations.leftEyeIris[1][0]),Math.abs(l.annotations.rightEyeIris[4][1]-l.annotations.rightEyeIris[2][1])):0;h.push({confidence:l.confidence,box:l.box,mesh:l.mesh,boxRaw:l.boxRaw,meshRaw:l.meshRaw,annotations:l.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:k!==0?Math.trunc(k)/100:0,image:l.image.toInt().squeeze()}),(u=l.image)==null||u.dispose(),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=ge(this.config,n);let r=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var d,x,u,l;this.state="config";let A;this.config=ge(this.config,n),this.state="check";let c=this.sanity(e);c&&(b(c,e),r({error:c}));let _,h,s,o=R();await this.checkBackend(),await this.load(),this.config.scoped&&z.engine().startScope(),this.analyze("Start Scope:"),A=R();let i=O1.process(e,this.config);if(!i||!i.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?(s=this.config.face.enabled?this.detectFace(i.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=R(),s=this.config.face.enabled?await this.detectFace(i.tensor):[],this.perf.face=Math.trunc(R()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(d=this.models.posenet)==null?void 0:d.estimatePoses(i.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=R(),_=this.config.body.enabled?await((x=this.models.posenet)==null?void 0:x.estimatePoses(i.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?(u=this.models.handpose)==null?void 0:u.estimateHands(i.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=R(),h=this.config.hand.enabled?await((l=this.models.handpose)==null?void 0:l.estimateHands(i.tensor,this.config)):[],this.perf.hand=Math.trunc(R()-A)),this.analyze("End Hand:"),this.config.async&&([s,_,h]=await Promise.all([s,_,h])),i.tensor.dispose(),this.config.scoped&&z.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=R(),a=[...xe.face(s),...xe.body(_),...xe.hand(h),...xe.iris(s)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(R()-A)),this.perf.total=Math.trunc(R()-o),this.state="idle",r({face:s,body:_,hand:h,gesture:a,performance:this.perf,canvas:i.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(Ue);break;case"full":n=await e(Ce);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,"+Ue;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ce;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(s=>e(s))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Ue):e(Ce),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=ge(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{Et as default}; +2Q==`;var Pt="0.11.5";var R=()=>typeof performance!="undefined"?performance.now():parseInt(Number(process.hrtime.bigint())/1e3/1e3);function ge(...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]=ge(c,_):n[A]=_}),n),{})}var Et=class{constructor(e={}){this.tf=z,this.version=Pt,this.config=ge(Tt,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=vt,this.age=ze,this.gender=Me,this.emotion=je,this.body=S1,this.hand=W1}profile(){return this.config.profile?Rt.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?se.simmilarity(e,n):0}async load(e){this.state="load";let n=R();e&&(this.config=ge(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?jn:vt;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.load(this.config):null),this.models.age||(this.config.face.enabled&&this.config.face.age.enabled?ze.load(this.config):null),this.models.gender||(this.config.face.enabled&&this.config.face.gender.enabled?Me.load(this.config):null),this.models.emotion||(this.config.face.enabled&&this.config.face.emotion.enabled?je.load(this.config):null),this.models.embedding||(this.config.face.enabled&&this.config.face.embedding.enabled?se.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.load(this.config)),this.config.face.enabled&&this.config.face.age.enabled&&!this.models.age&&(this.models.age=await ze.load(this.config)),this.config.face.enabled&&this.config.face.gender.enabled&&!this.models.gender&&(this.models.gender=await Me.load(this.config)),this.config.face.enabled&&this.config.face.emotion.enabled&&!this.models.emotion&&(this.models.emotion=await je.load(this.config)),this.config.face.enabled&&this.config.face.embedding.enabled&&!this.models.embedding&&(this.models.embedding=await se.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(b("tf engine state:",z.engine().state.numBytes,"bytes",z.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(R()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&L1();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 o,i,a,d,x,u;let n,r,A,c,_,h=[];this.state="run:face",n=R();let s=await((o=this.models.face)==null?void 0:o.estimateFaces(e,this.config));this.perf.face=Math.trunc(R()-n);for(let l of s){if(this.analyze("Get Face"),!l.image||l.image.isDisposedInternal){b("Face object is disposed:",l.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?ze.predict(l.image,this.config):{}:(this.state="run:age",n=R(),r=this.config.face.age.enabled?await ze.predict(l.image,this.config):{},this.perf.age=Math.trunc(R()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?Me.predict(l.image,this.config):{}:(this.state="run:gender",n=R(),A=this.config.face.gender.enabled?await Me.predict(l.image,this.config):{},this.perf.gender=Math.trunc(R()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?je.predict(l.image,this.config):{}:(this.state="run:emotion",n=R(),c=this.config.face.emotion.enabled?await je.predict(l.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?se.predict(l.image,this.config):{}:(this.state="run:embedding",n=R(),_=this.config.face.embedding.enabled?await se.predict(l.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:"),!this.config.face.iris.enabled&&((i=l==null?void 0:l.annotations)==null?void 0:i.leftEyeIris)&&((a=l==null?void 0:l.annotations)==null?void 0:a.rightEyeIris)&&(delete l.annotations.leftEyeIris,delete l.annotations.rightEyeIris);let k=((d=l.annotations)==null?void 0:d.leftEyeIris)&&((x=l.annotations)==null?void 0:x.rightEyeIris)?11.7*Math.max(Math.abs(l.annotations.leftEyeIris[3][0]-l.annotations.leftEyeIris[1][0]),Math.abs(l.annotations.rightEyeIris[4][1]-l.annotations.rightEyeIris[2][1])):0;h.push({confidence:l.confidence,box:l.box,mesh:l.mesh,boxRaw:l.boxRaw,meshRaw:l.meshRaw,annotations:l.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:k!==0?Math.trunc(k)/100:0,image:l.image.toInt().squeeze()}),(u=l.image)==null||u.dispose(),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=ge(this.config,n);let r=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var d,x,u,l;this.state="config";let A;this.config=ge(this.config,n),this.state="check";let c=this.sanity(e);c&&(b(c,e),r({error:c}));let _,h,s,o=R();await this.checkBackend(),await this.load(),this.config.scoped&&z.engine().startScope(),this.analyze("Start Scope:"),A=R();let i=O1.process(e,this.config);if(!i||!i.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?(s=this.config.face.enabled?this.detectFace(i.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=R(),s=this.config.face.enabled?await this.detectFace(i.tensor):[],this.perf.face=Math.trunc(R()-A)),this.analyze("Start Body:"),this.config.async?(_=this.config.body.enabled?(d=this.models.posenet)==null?void 0:d.estimatePoses(i.tensor,this.config):[],this.perf.body&&delete this.perf.body):(this.state="run:body",A=R(),_=this.config.body.enabled?await((x=this.models.posenet)==null?void 0:x.estimatePoses(i.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?(u=this.models.handpose)==null?void 0:u.estimateHands(i.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=R(),h=this.config.hand.enabled?await((l=this.models.handpose)==null?void 0:l.estimateHands(i.tensor,this.config)):[],this.perf.hand=Math.trunc(R()-A)),this.analyze("End Hand:"),this.config.async&&([s,_,h]=await Promise.all([s,_,h])),i.tensor.dispose(),this.config.scoped&&z.engine().endScope(),this.analyze("End Scope:");let a=[];this.config.gesture.enabled&&(A=R(),a=[...xe.face(s),...xe.body(_),...xe.hand(h),...xe.iris(s)],this.config.async?this.perf.gesture&&delete this.perf.gesture:this.perf.gesture=Math.trunc(R()-A)),this.perf.total=Math.trunc(R()-o),this.state="idle",r({face:s,body:_,hand:h,gesture:a,performance:this.perf,canvas:i.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(Ue);break;case"full":n=await e(Ce);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,"+Ue;break;case"full":r=1200,n="data:image/jpeg;base64,"+Ce;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(s=>e(s))},n?A.src=n:e(null)})}async warmupNode(){let e=_=>Buffer.from(_,"base64"),n=this.config.warmup==="face"?e(Ue):e(Ce),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=ge(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{Et as default}; //# sourceMappingURL=human.esm-nobundle.js.map diff --git a/dist/human.esm.js b/dist/human.esm.js index f0a85eac..43d16649 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var A4="0.11.4";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 x4=class{constructor(t={}){this.tf=kh,this.version=A4,this.config=Jl(m4,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=y4,this.age=Qc,this.gender=eh,this.emotion=th,this.body=B2,this.hand=V2}profile(){return this.config.profile?g4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Te(...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&&(Te(`version: ${this.version} TensorFlow/JS version: ${u5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Te("configuration:",this.config),Te("tf flags:",an.flags)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Zse:y4;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?B2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?V2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 B2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await V2.load(this.config))),this.firstRun&&(Te("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let a=Math.trunc(ft()-n);a>(this.perf.load||0)&&(this.perf.load=a)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Te("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Te("settings wasm path:",this.config.wasmPath),qb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Te("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&Dv();try{await h5(this.config.backend)}catch(r){Te("error: cannot set backend:",this.config.backend,r)}if(c5(),gd()==="webgl"){this.config.deallocate&&(Te("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;Te(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await d5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c,u,h,p,d,f;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.face)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let m of l){if(this.analyze("Get Face"),!m.image||m.image.isDisposedInternal){Te("Face object is disposed:",m.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(m.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(m.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(m.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(m.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(m.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(m.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(m.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(m.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:"),!this.config.face.iris.enabled&&((u=m==null?void 0:m.annotations)==null?void 0:u.leftEyeIris)&&((h=m==null?void 0:m.annotations)==null?void 0:h.rightEyeIris)&&(delete m.annotations.leftEyeIris,delete m.annotations.rightEyeIris);let A=((p=m.annotations)==null?void 0:p.leftEyeIris)&&((d=m.annotations)==null?void 0:d.rightEyeIris)?11.7*Math.max(Math.abs(m.annotations.leftEyeIris[3][0]-m.annotations.leftEyeIris[1][0]),Math.abs(m.annotations.rightEyeIris[4][1]-m.annotations.rightEyeIris[2][1])):0;o.push({confidence:m.confidence,box:m.box,mesh:m.mesh,boxRaw:m.boxRaw,meshRaw:m.meshRaw,annotations:m.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:A!==0?Math.trunc(A)/100:0,image:m.image.toInt().squeeze()}),(f=m.image)==null||f.dispose(),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=U2.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&&(Te(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=U2.process(t,this.config);if(!u||!u.tensor){Te("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 Te("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};export{x4 as default}; +2Q==`;var A4="0.11.5";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 x4=class{constructor(t={}){this.tf=kh,this.version=A4,this.config=Jl(m4,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=y4,this.age=Qc,this.gender=eh,this.emotion=th,this.body=B2,this.hand=V2}profile(){return this.config.profile?g4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Te(...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&&(Te(`version: ${this.version} TensorFlow/JS version: ${u5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Te("configuration:",this.config),Te("tf flags:",an.flags)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Zse:y4;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?B2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?V2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 B2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await V2.load(this.config))),this.firstRun&&(Te("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let a=Math.trunc(ft()-n);a>(this.perf.load||0)&&(this.perf.load=a)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Te("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Te("settings wasm path:",this.config.wasmPath),qb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Te("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&Dv();try{await h5(this.config.backend)}catch(r){Te("error: cannot set backend:",this.config.backend,r)}if(c5(),gd()==="webgl"){this.config.deallocate&&(Te("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;Te(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await d5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c,u,h,p,d,f;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.face)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let m of l){if(this.analyze("Get Face"),!m.image||m.image.isDisposedInternal){Te("Face object is disposed:",m.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(m.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(m.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(m.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(m.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(m.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(m.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(m.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(m.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:"),!this.config.face.iris.enabled&&((u=m==null?void 0:m.annotations)==null?void 0:u.leftEyeIris)&&((h=m==null?void 0:m.annotations)==null?void 0:h.rightEyeIris)&&(delete m.annotations.leftEyeIris,delete m.annotations.rightEyeIris);let A=((p=m.annotations)==null?void 0:p.leftEyeIris)&&((d=m.annotations)==null?void 0:d.rightEyeIris)?11.7*Math.max(Math.abs(m.annotations.leftEyeIris[3][0]-m.annotations.leftEyeIris[1][0]),Math.abs(m.annotations.rightEyeIris[4][1]-m.annotations.rightEyeIris[2][1])):0;o.push({confidence:m.confidence,box:m.box,mesh:m.mesh,boxRaw:m.boxRaw,meshRaw:m.meshRaw,annotations:m.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:A!==0?Math.trunc(A)/100:0,image:m.image.toInt().squeeze()}),(f=m.image)==null||f.dispose(),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=U2.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&&(Te(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=U2.process(t,this.config);if(!u||!u.tensor){Te("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 Te("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};export{x4 as default}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.js b/dist/human.js index 86047de6..444ae65f 100644 --- a/dist/human.js +++ b/dist/human.js @@ -4771,7 +4771,7 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var g4="0.11.4";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 j2=class{constructor(t={}){this.tf=kh,this.version=g4,this.config=Jl(y4,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=x4,this.age=Qc,this.gender=eh,this.emotion=th,this.body=B2,this.hand=V2}profile(){return this.config.profile?w4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Te(...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&&(Te(`version: ${this.version} TensorFlow/JS version: ${h5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Te("configuration:",this.config),Te("tf flags:",an.flags)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Yse:x4;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?B2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?V2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 B2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await V2.load(this.config))),this.firstRun&&(Te("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let a=Math.trunc(ft()-n);a>(this.perf.load||0)&&(this.perf.load=a)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Te("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Te("settings wasm path:",this.config.wasmPath),Kb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Te("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&Pv();try{await p5(this.config.backend)}catch(r){Te("error: cannot set backend:",this.config.backend,r)}if(d5(),gd()==="webgl"){this.config.deallocate&&(Te("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;Te(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await f5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c,u,h,p,d,f;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.face)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let m of l){if(this.analyze("Get Face"),!m.image||m.image.isDisposedInternal){Te("Face object is disposed:",m.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(m.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(m.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(m.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(m.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(m.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(m.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(m.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(m.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:"),!this.config.face.iris.enabled&&((u=m==null?void 0:m.annotations)==null?void 0:u.leftEyeIris)&&((h=m==null?void 0:m.annotations)==null?void 0:h.rightEyeIris)&&(delete m.annotations.leftEyeIris,delete m.annotations.rightEyeIris);let A=((p=m.annotations)==null?void 0:p.leftEyeIris)&&((d=m.annotations)==null?void 0:d.rightEyeIris)?11.7*Math.max(Math.abs(m.annotations.leftEyeIris[3][0]-m.annotations.leftEyeIris[1][0]),Math.abs(m.annotations.rightEyeIris[4][1]-m.annotations.rightEyeIris[2][1])):0;o.push({confidence:m.confidence,box:m.box,mesh:m.mesh,boxRaw:m.boxRaw,meshRaw:m.meshRaw,annotations:m.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:A!==0?Math.trunc(A)/100:0,image:m.image.toInt().squeeze()}),(f=m.image)==null||f.dispose(),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=U2.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&&(Te(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=U2.process(t,this.config);if(!u||!u.tensor){Te("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 Te("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};return Zse;})(); +2Q==`;var g4="0.11.5";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 j2=class{constructor(t={}){this.tf=kh,this.version=g4,this.config=Jl(y4,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=x4,this.age=Qc,this.gender=eh,this.emotion=th,this.body=B2,this.hand=V2}profile(){return this.config.profile?w4.data:{}}analyze(...t){if(!this.analyzeMemoryLeaks)return;let n=Vn().state.numTensors,r=this.numTensors;this.numTensors=n;let a=n-r;a!==0&&Te(...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&&(Te(`version: ${this.version} TensorFlow/JS version: ${h5}`),await this.checkBackend(!0),an.flags.IS_BROWSER&&(Te("configuration:",this.config),Te("tf flags:",an.flags)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Yse:x4;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?B2.load(this.config):null),this.models.handpose||(this.config.hand.enabled?V2.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 B2.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await V2.load(this.config))),this.firstRun&&(Te("tf engine state:",Vn().state.numBytes,"bytes",Vn().state.numTensors,"tensors"),this.firstRun=!1);let a=Math.trunc(ft()-n);a>(this.perf.load||0)&&(this.perf.load=a)}async checkBackend(t){if(this.config.backend&&this.config.backend!==""&&t||gd()!==this.config.backend){let n=ft();this.state="backend",Te("setting backend:",this.config.backend),this.config.backend==="wasm"&&(Te("settings wasm path:",this.config.wasmPath),Kb(this.config.wasmPath),await Q().getAsync("WASM_HAS_SIMD_SUPPORT")||Te("warning: wasm simd support is not enabled")),this.config.backend==="humangl"&&Pv();try{await p5(this.config.backend)}catch(r){Te("error: cannot set backend:",this.config.backend,r)}if(d5(),gd()==="webgl"){this.config.deallocate&&(Te("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;Te(`gl version:${r.getParameter(r.VERSION)} renderer:${r.getParameter(r.RENDERER)}`)}await f5(),this.perf.backend=Math.trunc(ft()-n)}}async detectFace(t){var c,u,h,p,d,f;let n,r,a,s,i,o=[];this.state="run:face",n=ft();let l=await((c=this.models.face)==null?void 0:c.estimateFaces(t,this.config));this.perf.face=Math.trunc(ft()-n);for(let m of l){if(this.analyze("Get Face"),!m.image||m.image.isDisposedInternal){Te("Face object is disposed:",m.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Qc.predict(m.image,this.config):{}:(this.state="run:age",n=ft(),r=this.config.face.age.enabled?await Qc.predict(m.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(m.image,this.config):{}:(this.state="run:gender",n=ft(),a=this.config.face.gender.enabled?await eh.predict(m.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(m.image,this.config):{}:(this.state="run:emotion",n=ft(),s=this.config.face.emotion.enabled?await th.predict(m.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(m.image,this.config):{}:(this.state="run:embedding",n=ft(),i=this.config.face.embedding.enabled?await Ka.predict(m.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:"),!this.config.face.iris.enabled&&((u=m==null?void 0:m.annotations)==null?void 0:u.leftEyeIris)&&((h=m==null?void 0:m.annotations)==null?void 0:h.rightEyeIris)&&(delete m.annotations.leftEyeIris,delete m.annotations.rightEyeIris);let A=((p=m.annotations)==null?void 0:p.leftEyeIris)&&((d=m.annotations)==null?void 0:d.rightEyeIris)?11.7*Math.max(Math.abs(m.annotations.leftEyeIris[3][0]-m.annotations.leftEyeIris[1][0]),Math.abs(m.annotations.rightEyeIris[4][1]-m.annotations.rightEyeIris[2][1])):0;o.push({confidence:m.confidence,box:m.box,mesh:m.mesh,boxRaw:m.boxRaw,meshRaw:m.meshRaw,annotations:m.annotations,age:r.age,gender:a.gender,genderConfidence:a.confidence,emotion:s,embedding:i,iris:A!==0?Math.trunc(A)/100:0,image:m.image.toInt().squeeze()}),(f=m.image)==null||f.dispose(),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=U2.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&&(Te(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=U2.process(t,this.config);if(!u||!u.tensor){Te("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 Te("Warmup",this.config.warmup,Math.round(s-n),"ms",a),a}};return Zse;})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/human.node-gpu.js b/dist/human.node-gpu.js index 3fa29af8..98138b77 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 Rt="0.11.4";var v=()=>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 Mt=class{constructor(e={}){this.tf=E,this.version=Rt,this.config=be(vt,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=Et,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=S1,this.hand=W1}profile(){return this.config.profile?zt.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=be(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Mn:Et;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&F1();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 y,o,i,w,s,m;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((y=this.models.face)==null?void 0:y.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let d of x){if(this.analyze("Get Face"),!d.image||d.image.isDisposedInternal){p("Face object is disposed:",d.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(d.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Ee.predict(d.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(d.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await ze.predict(d.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(d.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await Me.predict(d.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(d.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(d.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:"),!this.config.face.iris.enabled&&((o=d==null?void 0:d.annotations)==null?void 0:o.leftEyeIris)&&((i=d==null?void 0:d.annotations)==null?void 0:i.rightEyeIris)&&(delete d.annotations.leftEyeIris,delete d.annotations.rightEyeIris);let V=((w=d.annotations)==null?void 0:w.leftEyeIris)&&((s=d.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(d.annotations.leftEyeIris[3][0]-d.annotations.leftEyeIris[1][0]),Math.abs(d.annotations.rightEyeIris[4][1]-d.annotations.rightEyeIris[2][1])):0;h.push({confidence:d.confidence,box:d.box,mesh:d.mesh,boxRaw:d.boxRaw,meshRaw:d.meshRaw,annotations:d.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:V!==0?Math.trunc(V)/100:0,image:d.image.toInt().squeeze()}),(m=d.image)==null||m.dispose(),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=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,m,d;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,y=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let o=O1.process(e,this.config);if(!o||!o.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(o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(o.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(o.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(o.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?(m=this.models.handpose)==null?void 0:m.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((d=this.models.handpose)==null?void 0:d.estimateHands(o.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),o.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let i=[];this.config.gesture.enabled&&(A=v(),i=[...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()-y),this.state="idle",r({face:x,body:_,hand:h,gesture:i,performance:this.perf,canvas:o.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=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=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=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; +2Q==`;var Rt="0.11.5";var v=()=>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 Mt=class{constructor(e={}){this.tf=E,this.version=Rt,this.config=be(vt,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=Et,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=S1,this.hand=W1}profile(){return this.config.profile?zt.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=be(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Mn:Et;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&F1();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 y,o,i,w,s,m;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((y=this.models.face)==null?void 0:y.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let d of x){if(this.analyze("Get Face"),!d.image||d.image.isDisposedInternal){p("Face object is disposed:",d.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(d.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Ee.predict(d.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(d.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await ze.predict(d.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(d.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await Me.predict(d.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(d.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(d.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:"),!this.config.face.iris.enabled&&((o=d==null?void 0:d.annotations)==null?void 0:o.leftEyeIris)&&((i=d==null?void 0:d.annotations)==null?void 0:i.rightEyeIris)&&(delete d.annotations.leftEyeIris,delete d.annotations.rightEyeIris);let V=((w=d.annotations)==null?void 0:w.leftEyeIris)&&((s=d.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(d.annotations.leftEyeIris[3][0]-d.annotations.leftEyeIris[1][0]),Math.abs(d.annotations.rightEyeIris[4][1]-d.annotations.rightEyeIris[2][1])):0;h.push({confidence:d.confidence,box:d.box,mesh:d.mesh,boxRaw:d.boxRaw,meshRaw:d.meshRaw,annotations:d.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:V!==0?Math.trunc(V)/100:0,image:d.image.toInt().squeeze()}),(m=d.image)==null||m.dispose(),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=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,m,d;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,y=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let o=O1.process(e,this.config);if(!o||!o.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(o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(o.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(o.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(o.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?(m=this.models.handpose)==null?void 0:m.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((d=this.models.handpose)==null?void 0:d.estimateHands(o.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),o.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let i=[];this.config.gesture.enabled&&(A=v(),i=[...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()-y),this.state="idle",r({face:x,body:_,hand:h,gesture:i,performance:this.perf,canvas:o.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=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=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=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 756e7d7d..f8de1fb6 100644 --- a/dist/human.node.js +++ b/dist/human.node.js @@ -731,5 +731,5 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;var Rt="0.11.4";var v=()=>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 Mt=class{constructor(e={}){this.tf=E,this.version=Rt,this.config=be(vt,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=Et,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=S1,this.hand=W1}profile(){return this.config.profile?zt.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=be(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Mn:Et;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&F1();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 y,o,i,w,s,m;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((y=this.models.face)==null?void 0:y.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let d of x){if(this.analyze("Get Face"),!d.image||d.image.isDisposedInternal){p("Face object is disposed:",d.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(d.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Ee.predict(d.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(d.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await ze.predict(d.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(d.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await Me.predict(d.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(d.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(d.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:"),!this.config.face.iris.enabled&&((o=d==null?void 0:d.annotations)==null?void 0:o.leftEyeIris)&&((i=d==null?void 0:d.annotations)==null?void 0:i.rightEyeIris)&&(delete d.annotations.leftEyeIris,delete d.annotations.rightEyeIris);let V=((w=d.annotations)==null?void 0:w.leftEyeIris)&&((s=d.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(d.annotations.leftEyeIris[3][0]-d.annotations.leftEyeIris[1][0]),Math.abs(d.annotations.rightEyeIris[4][1]-d.annotations.rightEyeIris[2][1])):0;h.push({confidence:d.confidence,box:d.box,mesh:d.mesh,boxRaw:d.boxRaw,meshRaw:d.meshRaw,annotations:d.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:V!==0?Math.trunc(V)/100:0,image:d.image.toInt().squeeze()}),(m=d.image)==null||m.dispose(),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=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,m,d;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,y=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let o=O1.process(e,this.config);if(!o||!o.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(o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(o.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(o.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(o.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?(m=this.models.handpose)==null?void 0:m.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((d=this.models.handpose)==null?void 0:d.estimateHands(o.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),o.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let i=[];this.config.gesture.enabled&&(A=v(),i=[...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()-y),this.state="idle",r({face:x,body:_,hand:h,gesture:i,performance:this.perf,canvas:o.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=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=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=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; +2Q==`;var Rt="0.11.5";var v=()=>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 Mt=class{constructor(e={}){this.tf=E,this.version=Rt,this.config=be(vt,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=Et,this.age=Ee,this.gender=ze,this.emotion=Me,this.body=S1,this.hand=W1}profile(){return this.config.profile?zt.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=be(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)));let r=this.config.face.detector.modelPath.includes("faceboxes")?Mn:Et;this.config.async?[this.models.face,this.models.age,this.models.gender,this.models.emotion,this.models.embedding,this.models.posenet,this.models.handpose]=await Promise.all([this.models.face||(this.config.face.enabled?r.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?he.load(this.config):null),this.models.posenet||(this.config.body.enabled?S1.load(this.config):null),this.models.handpose||(this.config.hand.enabled?W1.load(this.config):null)]):(this.config.face.enabled&&!this.models.face&&(this.models.face=await r.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 he.load(this.config)),this.config.body.enabled&&!this.models.posenet&&(this.models.posenet=await S1.load(this.config)),this.config.hand.enabled&&!this.models.handpose&&(this.models.handpose=await W1.load(this.config))),this.firstRun&&(p("tf engine state:",E.engine().state.numBytes,"bytes",E.engine().state.numTensors,"tensors"),this.firstRun=!1);let A=Math.trunc(v()-n);A>(this.perf.load||0)&&(this.perf.load=A)}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"&&F1();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 y,o,i,w,s,m;let n,r,A,c,_,h=[];this.state="run:face",n=v();let x=await((y=this.models.face)==null?void 0:y.estimateFaces(e,this.config));this.perf.face=Math.trunc(v()-n);for(let d of x){if(this.analyze("Get Face"),!d.image||d.image.isDisposedInternal){p("Face object is disposed:",d.image);continue}this.analyze("Start Age:"),this.config.async?r=this.config.face.age.enabled?Ee.predict(d.image,this.config):{}:(this.state="run:age",n=v(),r=this.config.face.age.enabled?await Ee.predict(d.image,this.config):{},this.perf.age=Math.trunc(v()-n)),this.analyze("Start Gender:"),this.config.async?A=this.config.face.gender.enabled?ze.predict(d.image,this.config):{}:(this.state="run:gender",n=v(),A=this.config.face.gender.enabled?await ze.predict(d.image,this.config):{},this.perf.gender=Math.trunc(v()-n)),this.analyze("Start Emotion:"),this.config.async?c=this.config.face.emotion.enabled?Me.predict(d.image,this.config):{}:(this.state="run:emotion",n=v(),c=this.config.face.emotion.enabled?await Me.predict(d.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(d.image,this.config):{}:(this.state="run:embedding",n=v(),_=this.config.face.embedding.enabled?await he.predict(d.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:"),!this.config.face.iris.enabled&&((o=d==null?void 0:d.annotations)==null?void 0:o.leftEyeIris)&&((i=d==null?void 0:d.annotations)==null?void 0:i.rightEyeIris)&&(delete d.annotations.leftEyeIris,delete d.annotations.rightEyeIris);let V=((w=d.annotations)==null?void 0:w.leftEyeIris)&&((s=d.annotations)==null?void 0:s.rightEyeIris)?11.7*Math.max(Math.abs(d.annotations.leftEyeIris[3][0]-d.annotations.leftEyeIris[1][0]),Math.abs(d.annotations.rightEyeIris[4][1]-d.annotations.rightEyeIris[2][1])):0;h.push({confidence:d.confidence,box:d.box,mesh:d.mesh,boxRaw:d.boxRaw,meshRaw:d.meshRaw,annotations:d.annotations,age:r.age,gender:A.gender,genderConfidence:A.confidence,emotion:c,embedding:_,iris:V!==0?Math.trunc(V)/100:0,image:d.image.toInt().squeeze()}),(m=d.image)==null||m.dispose(),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=O1.process(e,this.config);return r.tensor.dispose(),r.canvas}async detect(e,n={}){return new Promise(async r=>{var w,s,m,d;this.state="config";let A;this.config=be(this.config,n),this.state="check";let c=this.sanity(e);c&&(p(c,e),r({error:c}));let _,h,x,y=v();await this.checkBackend(),await this.load(),this.config.scoped&&E.engine().startScope(),this.analyze("Start Scope:"),A=v();let o=O1.process(e,this.config);if(!o||!o.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(o.tensor):[],this.perf.face&&delete this.perf.face):(this.state="run:face",A=v(),x=this.config.face.enabled?await this.detectFace(o.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(o.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(o.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?(m=this.models.handpose)==null?void 0:m.estimateHands(o.tensor,this.config):[],this.perf.hand&&delete this.perf.hand):(this.state="run:hand",A=v(),h=this.config.hand.enabled?await((d=this.models.handpose)==null?void 0:d.estimateHands(o.tensor,this.config)):[],this.perf.hand=Math.trunc(v()-A)),this.analyze("End Hand:"),this.config.async&&([x,_,h]=await Promise.all([x,_,h])),o.tensor.dispose(),this.config.scoped&&E.engine().endScope(),this.analyze("End Scope:");let i=[];this.config.gesture.enabled&&(A=v(),i=[...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()-y),this.state="idle",r({face:x,body:_,hand:h,gesture:i,performance:this.perf,canvas:o.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=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=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=v();return p("Warmup",this.config.warmup,Math.round(c-n),"ms",A),A}}; //# sourceMappingURL=human.node.js.map diff --git a/wiki b/wiki index 0fa077bf..d8804390 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 0fa077bf63fa7a3f26826eb9c88fd837e3728be7 +Subproject commit d88043901df1d671a0897275bae8d0f537b84ff5