@vladmandic/face-api
Version:
FaceAPI: AI-powered Face Detection & Rotation Tracking, Face Description & Recognition, Age & Gender & Emotion Prediction for Browser and NodeJS using TensorFlow/JS
7 lines (6 loc) • 86.2 kB
JavaScript
/*
Face-API
homepage: <https://github.com/vladmandic/face-api>
author: <https://github.com/vladmandic>'
*/
"use strict";var ln=Object.create;var tr=Object.defineProperty;var dn=Object.getOwnPropertyDescriptor;var hn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,gn=Object.prototype.hasOwnProperty;var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Sr=(o,t)=>{for(var e in t)tr(o,e,{get:t[e],enumerable:!0})},_o=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of hn(t))!gn.call(o,n)&&n!==e&&tr(o,n,{get:()=>t[n],enumerable:!(r=dn(t,n))||r.enumerable});return o};var v=(o,t,e)=>(e=o!=null?ln(bn(o)):{},_o(t||!o||!o.__esModule?tr(e,"default",{value:o,enumerable:!0}):e,o)),vn=o=>_o(tr({},"__esModule",{value:!0}),o);var x=xn((Ya,Br)=>{"use strict";var Wr=Object.defineProperty,yn=Object.getOwnPropertyDescriptor,_n=Object.getOwnPropertyNames,Tn=Object.prototype.hasOwnProperty,Pn=(o,t)=>{for(var e in t)Wr(o,e,{get:t[e],enumerable:!0})},Ar=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of _n(t))!Tn.call(o,n)&&n!==e&&Wr(o,n,{get:()=>t[n],enumerable:!(r=yn(t,n))||r.enumerable});return o},wn=(o,t,e)=>(Ar(o,t,"default"),e&&Ar(e,t,"default")),Fn=o=>Ar(Wr({},"__esModule",{value:!0}),o),kr={};Pn(kr,{version:()=>In});Br.exports=Fn(kr);wn(kr,require("@tensorflow/tfjs-node-gpu"),Br.exports);var To="4.22.0",Dn="4.22.0",En="4.22.0",Mn="4.22.0",Cn="4.22.0",In={tfjs:To,"tfjs-core":To,"tfjs-converter":Dn,"tfjs-backend-cpu":En,"tfjs-backend-webgl":Mn,"tfjs-backend-wasm":Cn}});var Ba={};Sr(Ba,{AgeGenderNet:()=>He,BoundingBox:()=>Ot,Box:()=>L,ComposableTask:()=>J,ComputeAllFaceDescriptorsTask:()=>_t,ComputeFaceDescriptorsTaskBase:()=>Ue,ComputeSingleFaceDescriptorTask:()=>Tt,DetectAllFaceLandmarksTask:()=>qe,DetectAllFacesTask:()=>Ie,DetectFaceLandmarksTaskBase:()=>Je,DetectFacesTaskBase:()=>Ke,DetectSingleFaceLandmarksTask:()=>Ze,DetectSingleFaceTask:()=>Qe,Dimensions:()=>R,FACE_EXPRESSION_LABELS:()=>so,FaceDetection:()=>M,FaceDetectionNet:()=>lo,FaceExpressionNet:()=>Oe,FaceExpressions:()=>gt,FaceLandmark68Net:()=>Zt,FaceLandmark68TinyNet:()=>ze,FaceLandmarkNet:()=>po,FaceLandmarks:()=>H,FaceLandmarks5:()=>jr,FaceLandmarks68:()=>Yt,FaceMatch:()=>me,FaceMatcher:()=>vo,FaceRecognitionNet:()=>Kt,Gender:()=>_r,LabeledBox:()=>pe,LabeledFaceDescriptors:()=>Et,NetInput:()=>ut,NeuralNetwork:()=>A,ObjectDetection:()=>Ht,Point:()=>_,PredictedBox:()=>Ur,Rect:()=>zt,SsdMobilenetv1:()=>It,SsdMobilenetv1Options:()=>X,TinyFaceDetector:()=>re,TinyFaceDetectorOptions:()=>je,TinyYolov2:()=>te,TinyYolov2Options:()=>st,allFaces:()=>Sa,allFacesSsdMobilenetv1:()=>un,allFacesTinyYolov2:()=>La,awaitMediaLoaded:()=>to,bufferToImage:()=>eo,computeFaceDescriptor:()=>xa,createCanvas:()=>Xt,createCanvasFromMedia:()=>We,createFaceDetectionNet:()=>ua,createFaceRecognitionNet:()=>ta,createSsdMobilenetv1:()=>Jo,createTinyFaceDetector:()=>Aa,createTinyYolov2:()=>da,detectAllFaces:()=>Lr,detectFaceLandmarks:()=>mn,detectFaceLandmarksTiny:()=>ga,detectLandmarks:()=>Ia,detectSingleFace:()=>Na,draw:()=>co,env:()=>w,euclideanDistance:()=>xo,extendWithAge:()=>Dr,extendWithFaceDescriptor:()=>Fr,extendWithFaceDetection:()=>Vt,extendWithFaceExpressions:()=>gr,extendWithFaceLandmarks:()=>Pe,extendWithGender:()=>Er,extractFaceTensors:()=>le,extractFaces:()=>fe,fetchImage:()=>On,fetchJson:()=>no,fetchNetWeights:()=>Hn,fetchOrThrow:()=>ht,fetchVideo:()=>zn,getContext2dOrThrow:()=>$,getMediaDimensions:()=>Ut,imageTensorToCanvas:()=>ro,imageToSquare:()=>oo,inverseSigmoid:()=>Sn,iou:()=>zr,isMediaElement:()=>sr,isMediaLoaded:()=>Ae,isWithAge:()=>ea,isWithFaceDetection:()=>pt,isWithFaceExpressions:()=>io,isWithFaceLandmarks:()=>qt,isWithGender:()=>ra,loadAgeGenderModel:()=>Ea,loadFaceDetectionModel:()=>Ma,loadFaceExpressionModel:()=>Da,loadFaceLandmarkModel:()=>Pa,loadFaceLandmarkTinyModel:()=>wa,loadFaceRecognitionModel:()=>Fa,loadSsdMobilenetv1Model:()=>pn,loadTinyFaceDetectorModel:()=>_a,loadTinyYolov2Model:()=>Ta,loadWeightMap:()=>ao,locateFaces:()=>Ca,matchDimensions:()=>Yn,minBbox:()=>Yr,nets:()=>F,nonMaxSuppression:()=>Vr,normalize:()=>rt,padToSquare:()=>Gr,predictAgeAndGender:()=>ya,recognizeFaceExpressions:()=>va,resizeResults:()=>fn,resolveInput:()=>Gt,shuffleArray:()=>Ln,sigmoid:()=>Ne,ssdMobilenetv1:()=>cn,tf:()=>Wa,tinyFaceDetector:()=>ha,tinyYolov2:()=>ba,toNetInput:()=>D,utils:()=>Hr,validateConfig:()=>ho,version:()=>ka});module.exports=vn(Ba);var Wa=v(x());var co={};Sr(co,{AnchorPosition:()=>Qr,DrawBox:()=>Se,DrawBoxOptions:()=>nr,DrawFaceLandmarks:()=>vr,DrawFaceLandmarksOptions:()=>xr,DrawTextField:()=>jt,DrawTextFieldOptions:()=>ue,drawContour:()=>lt,drawDetections:()=>$n,drawFaceExpressions:()=>Vn,drawFaceLandmarks:()=>jn});function lt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},s)=>{let a=t[s];o.moveTo(a.x,a.y),o.lineTo(r,n)}),e){let r=t[t.length-1],n=t[0];if(!r||!n)return;o.moveTo(r.x,r.y),o.lineTo(n.x,n.y)}o.stroke()}var Hr={};Sr(Hr,{computeReshapedDimensions:()=>Or,getCenterPoint:()=>$t,isDimensions:()=>rr,isEven:()=>er,isFloat:()=>$r,isTensor:()=>Bt,isTensor1D:()=>Nn,isTensor2D:()=>Rr,isTensor3D:()=>dt,isTensor4D:()=>U,isValidNumber:()=>et,isValidProbablitiy:()=>ce,range:()=>ct,round:()=>Rt});var Po=v(x());var R=class o{constructor(t,e){if(!et(t)||!et(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new o(1/this.width,1/this.height)}};function Bt(o,t){return o instanceof Po.Tensor&&o.shape.length===t}function Nn(o){return Bt(o,1)}function Rr(o){return Bt(o,2)}function dt(o){return Bt(o,3)}function U(o){return Bt(o,4)}function $r(o){return o%1!==0}function er(o){return o%2===0}function Rt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function rr(o){return o&&o.width&&o.height}function Or({width:o,height:t},e){let r=e/Math.max(t,o);return new R(Math.round(o*r),Math.round(t*r))}function $t(o){return o.reduce((t,e)=>t.add(e),new _(0,0)).div(new _(o.length,o.length))}function ct(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==1/0&&o!==-1/0&&!Number.isNaN(o)||o===0}function ce(o){return et(o)&&o>=0&&o<=1}var _=class o{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new o(this.x+t.x,this.y+t.y)}sub(t){return new o(this.x-t.x,this.y-t.y)}mul(t){return new o(this.x*t.x,this.y*t.y)}div(t){return new o(this.x/t.x,this.y/t.y)}abs(){return new o(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new o(Math.floor(this.x),Math.floor(this.y))}};var L=class o{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!o.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},n=[r.left,r.top,r.right,r.bottom].every(et),s=[r.x,r.y,r.width,r.height].every(et);if(!s&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[a,i,c,m]=s?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];o.assertIsValidBox({x:a,y:i,width:c,height:m},"Box.constructor",e),this._x=a,this._y=i,this._width=c,this._height=m}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new _(this.left,this.top)}get topRight(){return new _(this.right,this.top)}get bottomLeft(){return new _(this.left,this.bottom)}get bottomRight(){return new _(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new o({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new o({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,s=Math.abs(r-n);return r<n&&(t-=s/2,r+=s),n<r&&(e-=s/2,n+=s),new o({x:t,y:e,width:r,height:n})}rescale(t){let e=rr(t)?t.width:t,r=rr(t)?t.height:t;return new o({x:this.x*e,y:this.y*r,width:this.width*e,height:this.height*r})}pad(t,e){let[r,n,s,a]=[this.x-t/2,this.y-e/2,this.width+t,this.height+e];return new o({x:r,y:n,width:s,height:a})}clipAtImageBorders(t,e){let{x:r,y:n,right:s,bottom:a}=this,i=Math.max(r,0),c=Math.max(n,0),m=s-i,p=a-c,u=Math.min(m,t-i),f=Math.min(p,e-c);return new o({x:i,y:c,width:u,height:f}).floor()}shift(t,e){let{width:r,height:n}=this,s=this.x+t,a=this.y+e;return new o({x:s,y:a,width:r,height:n})}padAtBorders(t,e){let r=this.width+1,n=this.height+1,s=1,a=1,i=r,c=n,m=this.left,p=this.top,u=this.right,f=this.bottom;return u>e&&(i=-u+e+r,u=e),f>t&&(c=-f+t+n,f=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:a,edy:c,dx:s,edx:i,y:p,ey:f,x:m,ex:u,w:r,h:n}}calibrate(t){return new o({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Ot=class extends L{constructor(t,e,r,n,s=!1){super({left:t,top:e,right:r,bottom:n},s)}};var Ht=class o{constructor(t,e,r,n,s){this._imageDims=new R(s.width,s.height),this._score=t,this._classScore=e,this._className=r,this._box=new L(n).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new L(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new o(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class o extends Ht{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:s}=super.forSize(t,e);return new o(r,n,s)}};function zr(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),n=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),s=r*n;return e?s/(o.area+t.area-s):s/Math.min(o.area,t.area)}function Yr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>c<i?c:i,1/0),n=e.reduce((i,c)=>c<i?c:i,1/0),s=t.reduce((i,c)=>i<c?c:i,0),a=e.reduce((i,c)=>i<c?c:i,0);return new Ot(r,n,s,a)}function Vr(o,t,e,r=!0){let n=t.map((a,i)=>({score:a,boxIndex:i})).sort((a,i)=>a.score-i.score).map(a=>a.boxIndex),s=[];for(;n.length>0;){let a=n.pop();s.push(a);let i=n,c=[];for(let m=0;m<i.length;m++){let p=i[m],u=o[a],f=o[p];c.push(zr(u,f,r))}n=n.filter((m,p)=>c[p]<=e)}return s}var mt=v(x());function rt(o,t){return mt.tidy(()=>{let[e,r,n]=t,s=mt.fill([...o.shape.slice(0,3),1],e,"float32"),a=mt.fill([...o.shape.slice(0,3),1],r,"float32"),i=mt.fill([...o.shape.slice(0,3),1],n,"float32"),c=mt.concat([s,a,i],3);return mt.sub(o,c)})}var Dt=v(x());function Gr(o,t=!1){return Dt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),s=Math.round(n*(t?.5:1)),a=e>r?2:1,i=f=>{let l=o.shape.slice();return l[a]=f,Dt.fill(l,0,"float32")},c=i(s),m=n-c.shape[a],u=[t&&m?i(m):null,o,c].filter(f=>!!f).map(f=>Dt.cast(f,"float32"));return Dt.concat(u,a)})}function Ln(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Ne(o){return 1/(1+Math.exp(-o))}function Sn(o){return Math.log(o/(1-o))}var zt=class extends L{constructor(t,e,r,n,s=!1){super({x:t,y:e,width:r,height:n},s)}};var An=.5,Wn=.43,kn=.45,H=class{constructor(t,e,r=new _(0,0)){let{width:n,height:s}=e;this._imgDims=new R(n,s),this._shift=r,this._positions=t.map(a=>a.mul(new _(n,s)).add(r))}get shift(){return new _(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new _(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new _(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let s=t instanceof M?t.box.floor():new L(t);return this.shiftBy(s.x,s.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:n}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(n)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,n]=t,s=u=>n.sub(u).magnitude(),a=(s(e)+s(r))/2,i=Math.floor(a/kn),c=$t(t),m=Math.floor(Math.max(0,c.x-An*i)),p=Math.floor(Math.max(0,c.y-Wn*i));return new zt(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=Yr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var jr=class extends H{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],$t([t[3],t[4]])]}};var Yt=class extends H{getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map($t)}};var me=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${Rt(this.distance)})`:""}`}};var pe=class extends L{static assertIsValidLabeledBox(t,e){if(L.assertIsValidBox(t,e),!et(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t),this._label=e}get label(){return this._label}};var Et=class o{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new o(t.label,e)}};var Ur=class extends pe{static assertIsValidPredictedBox(t,e){if(pe.assertIsValidLabeledBox(t,e),!ce(t.score)||!ce(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,n){super(t,e),this._score=r,this._classScore=n}get score(){return this._score}get classScore(){return this._classScore}};function pt(o){return o.detection instanceof M}function Vt(o,t){return{...o,...{detection:t}}}function Xr(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),createVideoElement:()=>document.createElement("video"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Le(){return typeof global=="object"&&typeof process!="undefined"&&process.versions!=null&&process.versions.node!=null}function or(o){let t="";if(!o&&Le())try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,s)=>{o.readFile(r,(a,i)=>a?s(a):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Jr(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=global.Video||global.HTMLVideoElement,r=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},n=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},s=()=>{if(e)return new e;throw new Error("createVideoElement - missing Video implementation for nodejs environment")},a=global.fetch,i=or();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:n,createVideoElement:s,fetch:a,...i}}function qr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var S;function Bn(){if(!S)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return S}function Zr(o){S=o}function Kr(){return qr()?Zr(Xr()):Le()?Zr(Jr()):null}function Rn(o){if(S||Kr(),!S)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=S.Canvas,Image:e=S.Image}=o;S.Canvas=t,S.Image=e,S.createCanvasElement=o.createCanvasElement||(()=>new t),S.createImageElement=o.createImageElement||(()=>new e),S.ImageData=o.ImageData||S.ImageData,S.Video=o.Video||S.Video,S.fetch=o.fetch||S.fetch,S.readFile=o.readFile||S.readFile}var w={getEnv:Bn,setEnv:Zr,initialize:Kr,createBrowserEnv:Xr,createFileSystem:or,createNodejsEnv:Jr,monkeyPatch:Rn,isBrowser:qr,isNodejs:Le};Kr();function Gt(o){return!w.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function $(o){let{Canvas:t,CanvasRenderingContext2D:e}=w.getEnv();if(o instanceof e)return o;let r=Gt(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d",{willReadFrequently:!0});if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var Qr=(n=>(n.TOP_LEFT="TOP_LEFT",n.TOP_RIGHT="TOP_RIGHT",n.BOTTOM_LEFT="BOTTOM_LEFT",n.BOTTOM_RIGHT="BOTTOM_RIGHT",n))(Qr||{}),ue=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:s,fontStyle:a,padding:i}=t;this.anchorPosition=e||"TOP_LEFT",this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=a||"Georgia",this.padding=i||4}},jt=class o{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof o?t.text:t,this.anchor=e,this.options=new ue(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,n)=>r<n?n:r,0)+2*e}measureHeight(){let{fontSize:t,padding:e}=this.options;return this.text.length*t+2*e}getUpperLeft(t,e){let{anchorPosition:r}=this.options,n=r==="BOTTOM_RIGHT"||r==="TOP_RIGHT",s=r==="BOTTOM_LEFT"||r==="BOTTOM_RIGHT",a=this.measureWidth(t),i=this.measureHeight(),c=n?this.anchor.x-a:this.anchor.x,m=s?this.anchor.y-i:this.anchor.y;if(e){let{width:p,height:u}=e,f=Math.max(Math.min(c,p-a),0),l=Math.max(Math.min(m,u-i),0);return{x:f,y:l}}return{x:c,y:m}}draw(t){let e=Gt(t),r=$(e),{backgroundColor:n,fontColor:s,fontSize:a,fontStyle:i,padding:c}=this.options;r.font=`${a}px ${i}`;let m=this.measureWidth(r),p=this.measureHeight();r.fillStyle=n;let u=this.getUpperLeft(r,e);r.fillRect(u.x,u.y,m,p),r.fillStyle=s,this.text.forEach((f,l)=>{let b=c+u.x,T=c+u.y+(l+1)*a;r.fillText(f,b,T)})}};var nr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:s}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let a={anchorPosition:"BOTTOM_LEFT",backgroundColor:this.boxColor};this.drawLabelOptions=new ue({...a,...s})}},Se=class{constructor(t,e={}){this.box=new L(t),this.options=new nr(e)}draw(t){let e=$(t),{boxColor:r,lineWidth:n}=this.options,{x:s,y:a,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(s,a,i,c);let{label:m}=this.options;m&&new jt([m],{x:s-n/2,y:a},this.options.drawLabelOptions).draw(t)}};function $n(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:pt(r)?r.detection.score:void 0,s=r instanceof M?r.box:pt(r)?r.detection.box:new L(r),a=n?`${Rt(n)}`:void 0;new Se(s,{label:a}).draw(o)})}var Te=v(x());function Ae(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function to(o){return new Promise((t,e)=>{if(o instanceof w.getEnv().Canvas||Ae(o)){t(null);return}function r(s){s.currentTarget&&(s.currentTarget.removeEventListener("load",n),s.currentTarget.removeEventListener("error",r),e(s))}function n(s){s.currentTarget&&(s.currentTarget.removeEventListener("load",n),s.currentTarget.removeEventListener("error",r),t(s))}o.addEventListener("load",n),o.addEventListener("error",r)})}function eo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let n=w.getEnv().createImageElement();n.onload=()=>t(n),n.onerror=e,n.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Ut(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t?new R(o.naturalWidth,o.naturalHeight):o instanceof e?new R(o.videoWidth,o.videoHeight):new R(o.width,o.height)}function Xt({width:o,height:t}){let{createCanvasElement:e}=w.getEnv(),r=e();return r.width=o,r.height=t,r}function We(o,t){let{ImageData:e}=w.getEnv();if(!(o instanceof e)&&!Ae(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Ut(o),s=Xt({width:r,height:n});return o instanceof e?$(s).putImageData(o,0,0):$(s).drawImage(o,0,0,r,n),s}var ar=v(x());async function ro(o,t){let e=t||w.getEnv().createCanvasElement(),[r,n,s]=o.shape.slice(U(o)?1:0),a=ar.tidy(()=>o.as3D(r,n,s).toInt());return await ar.browser.toPixels(a,e),a.dispose(),e}function sr(o){let{Image:t,Canvas:e,Video:r}=w.getEnv();return o instanceof t||o instanceof e||o instanceof r}var z=v(x());function oo(o,t,e=!1){let{Image:r,Canvas:n}=w.getEnv();if(!(o instanceof r||o instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Xt({width:1,height:1});let s=Ut(o),a=t/Math.max(s.height,s.width),i=a*s.width,c=a*s.height,m=Xt({width:t,height:t}),p=o instanceof n?o:We(o),u=Math.abs(i-c)/2,f=e&&i<c?u:0,l=e&&c<i?u:0;return p.width>0&&p.height>0&&$(m).drawImage(p,f,l,i,c),m}var ut=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];this._inputSize=0;if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,n)=>{if(dt(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(U(r)){let a=r.shape[0];if(a!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${a} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let s=r instanceof w.getEnv().Canvas?r:We(r);this._canvases[n]=s,this._inputDimensions[n]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return ct(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Or({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,z.tidy(()=>{let r=ct(this.batchSize,0,1).map(s=>{let a=this.getInput(s);if(a instanceof z.Tensor){let i=U(a)?a:z.expandDims(a);return i=Gr(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=z.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(a instanceof w.getEnv().Canvas)return z.browser.fromPixels(oo(a,t,e));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${a}`)});return z.stack(r.map(s=>z.cast(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function D(o){if(o instanceof ut)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=n=>Array.isArray(o)?` at input index ${n}:`:"",r=t.map(Gt);return r.forEach((n,s)=>{if(!sr(n)&&!dt(n)&&!U(n))throw typeof t[s]=="string"?new Error(`toNetInput -${e(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${e(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(U(n)){let a=n.shape[0];if(a!==1)throw new Error(`toNetInput -${e(s)} tf.Tensor4D with batchSize ${a} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>sr(n)&&to(n))),new ut(r,Array.isArray(o))}async function fe(o,t){let{Canvas:e}=w.getEnv(),r=o;if(!(o instanceof e)){let a=await D(o);if(a.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=a.getInput(0);r=i instanceof e?i:await ro(i)}let n=$(r);return t.map(a=>a instanceof M?a.forSize(r.width,r.height).box.floor():a).map(a=>a.clipAtImageBorders(r.width,r.height)).map(({x:a,y:i,width:c,height:m})=>{let p=Xt({width:c,height:m});return c>0&&m>0&&$(p).putImageData(n.getImageData(a,i,c,m),0,0),p})}var ir=v(x());async function le(o,t){if(!dt(o)&&!U(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(U(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return ir.tidy(()=>{let[e,r,n]=o.shape.slice(U(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).filter(i=>i.width>0&&i.height>0).map(({x:i,y:c,width:m,height:p})=>ir.slice3d(o.as3D(e,r,n),[c,i,0],[p,m,n]))})}async function ht(o,t){let{fetch:e}=w.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function On(o){let t=await ht(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return eo(e)}async function no(o){return(await ht(o)).json()}async function Hn(o){return new Float32Array(await(await ht(o)).arrayBuffer())}function wo(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToVideo - expected buf to be of type: Blob"));let r=w.getEnv().createVideoElement();r.oncanplay=()=>t(r),r.onerror=e,r.playsInline=!0,r.muted=!0,r.src=URL.createObjectURL(o),r.play()})}async function zn(o){let t=await ht(o),e=await t.blob();if(!e.type.startsWith("video/"))throw new Error(`fetchVideo - expected blob type to be of type video/*, instead have: ${e.type}, for url: ${t.url}`);return wo(e)}var Fo=v(x());function cr(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let n=o.split("/").filter(i=>i),s=o.endsWith(".json")?n[n.length-1]:e,a=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return a=o.startsWith("/")?`/${a}`:a,{modelBaseUri:a,manifestUri:a==="/"?`/${s}`:`${a}/${s}`}}async function ao(o,t){let{manifestUri:e,modelBaseUri:r}=cr(o,t),n=await no(e);return Fo.io.loadWeights(n,r)}function Yn(o,t,e=!1){let{width:r,height:n}=e?Ut(t):t;return o.width=r,o.height=n,{width:r,height:n}}var ve=v(x());var bt=v(x());var A=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:n}=this.traversePropertyPath(t);r[n].dispose(),r[n]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof bt.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof bt.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=bt.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await ao(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=w.getEnv(),{manifestUri:r,modelBaseUri:n}=cr(t,this.getDefaultModelName()),s=m=>Promise.all(m.map(p=>e(p).then(u=>typeof u=="string"?Buffer.from(u):u.buffer))),a=bt.io.weightsLoaderFactory(s),i=JSON.parse((await e(r)).toString()),c=await a(i,n);this.loadFromWeightMap(c)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((s,a)=>{if(!s.nextObj.hasOwnProperty(a))throw new Error(`traversePropertyPath - object does not have property ${a}, for path ${t}`);return{obj:s.nextObj,objProp:a,nextObj:s.nextObj[a]}},{nextObj:this.params}),{obj:r,objProp:n}=e;if(!r||!n||!(r[n]instanceof bt.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:n}}};var E=v(x());var de=v(x());function O(o,t,e){return de.tidy(()=>{let r=de.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=de.add(r,t.bias),r})}function mr(o,t,e=!1){return E.tidy(()=>{let r=E.relu(e?E.add(E.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),s=E.relu(E.add(r,n)),a=O(s,t.conv2,[1,1]);return E.relu(E.add(r,E.add(n,a)))})}function ke(o,t,e=!1,r=!0){return E.tidy(()=>{let n=E.relu(e?E.add(E.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),s=O(n,t.conv1,[1,1]),a=E.relu(E.add(n,s)),i=O(a,t.conv2,[1,1]),c=E.relu(E.add(n,E.add(s,i))),m=O(c,t.conv3,[1,1]);return E.relu(E.add(n,E.add(s,E.add(i,m))))})}var Mt=v(x());function Jt(o,t,e="same",r=!1){return Mt.tidy(()=>{let n=Mt.add(Mt.conv2d(o,t.filters,[1,1],e),t.bias);return r?Mt.relu(n):n})}function W(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}var pr=v(x());function he(o,t){return(e,r,n,s)=>{let a=pr.tensor4d(o(e*r*n*n),[n,n,e,r]),i=pr.tensor1d(o(r));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:a,bias:i}}}var ur=v(x());function fr(o,t){return(e,r,n)=>{let s=ur.tensor2d(o(e*r),[e,r]),a=ur.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:s,bias:a}}}var Re=v(x());var Be=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function be(o,t){return(e,r,n)=>{let s=Re.tensor4d(o(9*e),[3,3,e,1]),a=Re.tensor4d(o(e*r),[1,1,e,r]),i=Re.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new Be(s,a,i)}}function ge(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new Be(e,r,n)}}function Y(o,t){return(e,r,n)=>{let s=o[e];if(!Bt(s,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${s}`);return t.push({originalPath:e,paramPath:n||e}),s}}function k(o){let t=o;function e(n){let s=t.slice(0,n);return t=t.slice(n),s}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function lr(o,t){let e=he(o,t),r=be(o,t);function n(a,i,c,m=!1){let p=m?e(a,i,3,`${c}/conv0`):r(a,i,`${c}/conv0`),u=r(i,i,`${c}/conv1`),f=r(i,i,`${c}/conv2`);return{conv0:p,conv1:u,conv2:f}}function s(a,i,c,m=!1){let{conv0:p,conv1:u,conv2:f}=n(a,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:u,conv2:f,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:s}}function Do(o){let t=[],{extractWeights:e,getRemainingWeights:r}=k(o),{extractDenseBlock4Params:n}=lr(e,t),s=n(3,32,"dense0",!0),a=n(32,64,"dense1"),i=n(64,128,"dense2"),c=n(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:a,dense2:i,dense3:c}}}function dr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function hr(o,t){let e=Y(o,t),r=dr(e),n=ge(e);function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:u}}function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),u=n(`${i}/conv2`),f=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:u,conv3:f}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:a}}function Eo(o){let t=[],{extractDenseBlock4Params:e}=hr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return W(o,t),{params:r,paramMappings:t}}var xe=class extends A{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return ve.tidy(()=>{let r=ve.cast(t.toBatchTensor(112,!0),"float32"),s=rt(r,[122.782,117.001,104.298]).div(255),a=ke(s,e.dense0,!0);return a=ke(a,e.dense1),a=ke(a,e.dense2),a=ke(a,e.dense3),a=ve.avgPool(a,[7,7],[2,2],"valid"),a})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return Eo(t)}extractParams(t){return Do(t)}};var Io=v(x());var ye=v(x());function $e(o,t){return ye.tidy(()=>ye.add(ye.matMul(o,t.weights),t.bias))}function Mo(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:s}=k(o),i=fr(n,r)(t,e,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:r,params:{fc:i}}}function Co(o){let t=[],e=Y(o,t);function r(s){let a=e(`${s}/weights`,2),i=e(`${s}/bias`,1);return{weights:a,bias:i}}let n={fc:r("fc")};return W(o,t),{params:n,paramMappings:t}}function br(o){let t={},e={};return Object.keys(o).forEach(r=>{let n=r.startsWith("fc")?e:t;n[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var _e=class extends A{constructor(t,e){super(t),this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return Io.tidy(()=>{let r=t instanceof ut?this.faceFeatureExtractor.forwardInput(t):t;return $e(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Mo(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=br(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Co(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,s=t.slice(0,t.length-n),a=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(a)}};var so=["neutral","happy","sad","angry","fearful","disgusted","surprised"],gt=class{constructor(t){this.neutral=0;this.happy=0;this.sad=0;this.angry=0;this.fearful=0;this.disgusted=0;this.surprised=0;if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);so.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return so.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Oe=class extends _e{constructor(t=new xe){super("FaceExpressionNet",t)}forwardInput(t){return Te.tidy(()=>Te.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await D(t))}async predictExpressions(t){let e=await D(t),r=await this.forwardInput(e),n=await Promise.all(Te.unstack(r).map(async a=>{let i=a.dataSync();return a.dispose(),i}));r.dispose();let s=n.map(a=>new gt(a));return e.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function io(o){return o.expressions instanceof gt}function gr(o,t){return{...o,...{expressions:t}}}function Vn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(s=>{let a=s instanceof gt?s:io(s)?s.expressions:void 0;if(!a)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=a.asSortedArray().filter(u=>u.probability>e),m=pt(s)?s.detection.box.bottomLeft:r||new _(0,0);new jt(c.map(u=>`${u.expression} (${Rt(u.probability)})`),m).draw(o)})}function qt(o){return pt(o)&&o.landmarks instanceof H&&o.unshiftedLandmarks instanceof H&&o.alignedRect instanceof M}function Gn(o){let t=c=>c*180/Math.PI,e=(c,m)=>Math.sqrt((c.x-m.x)**2+(c.y-m.y)**2),r={roll:void 0,pitch:void 0,yaw:void 0},n=(c,m,p)=>{let u=Math.floor(c.x-m.x),f=Math.floor(m.x-p.x);return u-f},s=(c,m)=>{let p=Math.hypot(m.x-c.x,m.y-c.y),u=m.y-c.y,f=Math.asin(u/p),l=t(f),b=Math.floor(90-l),T=m.x-c.x<0?-1:1;return b*T},a=(c,m,p)=>{let u=e(c,p),f=new _((c.x+p.x)/2,(c.y+p.y)/2),l=e(m,f),b=Math.atan(l/u),T=Math.floor(t(b)),h=f.y-m.y<0?-1:1;return T*h};if(!o||!o.positions||o.positions.length!==68)return r;let i=o.positions;return r.roll=s(i[27],i[66]),r.pitch=a(i[14],i[30],i[2]),r.yaw=n(i[14],i[33],i[2]),r}function Pe(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:s}=o.detection,a=new M(o.detection.score,n.rescale(s.reverse()),s),i=Gn(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:a,angle:i}}}var xr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:s,pointSize:a,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=a||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},vr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new xr(e)}draw(t){let e=$(t),{drawLines:r,drawPoints:n,lineWidth:s,lineColor:a,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof Yt&&(e.strokeStyle=a,e.lineWidth=s,lt(e,this.faceLandmarks.getJawOutline()),lt(e,this.faceLandmarks.getLeftEyeBrow()),lt(e,this.faceLandmarks.getRightEyeBrow()),lt(e,this.faceLandmarks.getNose()),lt(e,this.faceLandmarks.getLeftEye(),!0),lt(e,this.faceLandmarks.getRightEye(),!0),lt(e,this.faceLandmarks.getMouth(),!0)),n){e.strokeStyle=c,e.fillStyle=c;let m=p=>{e.beginPath(),e.arc(p.x,p.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(m)}}};function jn(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof H?r:qt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks<WithFaceDetection<{}>> or array thereof");new vr(n).draw(o)})}var No="1.7.15";var ft=v(x());var N=v(x());function Jn(o,t){let e=he(o,t),r=be(o,t);function n(a,i,c){let m=r(a,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),u=e(a,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:u}}function s(a,i){let c=r(a,a,`${i}/separable_conv0`),m=r(a,a,`${i}/separable_conv1`),p=r(a,a,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:s}}function Lo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=k(o),{extractConvParams:s,extractSeparableConvParams:a,extractReductionBlockParams:i,extractMainBlockParams:c}=Jn(r,e),m=s(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),u=i(64,128,"entry_flow/reduction_block_1"),f={conv_in:m,reduction_block_0:p,reduction_block_1:u},l={};ct(t,0,1).forEach(g=>{l[`main_block_${g}`]=c(128,`middle_flow/main_block_${g}`)});let b=i(128,256,"exit_flow/reduction_block"),T=a(256,512,"exit_flow/separable_conv"),h={reduction_block:b,separable_conv:T};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:f,middle_flow:l,exit_flow:h}}}function qn(o,t){let e=Y(o,t),r=dr(e),n=ge(e);function s(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=r(`${i}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function a(i){let c=n(`${i}/separable_conv0`),m=n(`${i}/separable_conv1`),p=n(`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:s,extractMainBlockParams:a}}function So(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:s,extractMainBlockParams:a}=qn(o,e),i=r("entry_flow/conv_in"),c=s("entry_flow/reduction_block_0"),m=s("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},u={};ct(t,0,1).forEach(T=>{u[`main_block_${T}`]=a(`middle_flow/main_block_${T}`)});let f=s("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),b={reduction_block:f,separable_conv:l};return W(o,e),{params:{entry_flow:p,middle_flow:u,exit_flow:b},paramMappings:e}}function Ao(o,t,e){return N.add(N.conv2d(o,t.filters,e,"same"),t.bias)}function mo(o,t,e=!0){let r=e?N.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(N.relu(r),t.separable_conv1,[1,1]),r=N.maxPool(r,[3,3],[2,2],"same"),r=N.add(r,Ao(o,t.expansion_conv,[2,2])),r}function Zn(o,t){let e=O(N.relu(o),t.separable_conv0,[1,1]);return e=O(N.relu(e),t.separable_conv1,[1,1]),e=O(N.relu(e),t.separable_conv2,[1,1]),e=N.add(e,o),e}var yr=class extends A{constructor(t){super("TinyXception"),this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return N.tidy(()=>{let r=N.cast(t.toBatchTensor(112,!0),"float32"),s=rt(r,[122.782,117.001,104.298]).div(255),a=N.relu(Ao(s,e.entry_flow.conv_in,[2,2]));return a=mo(a,e.entry_flow.reduction_block_0,!1),a=mo(a,e.entry_flow.reduction_block_1),ct(this._numMainBlocks,0,1).forEach(i=>{a=Zn(a,e.middle_flow[`main_block_${i}`])}),a=mo(a,e.exit_flow.reduction_block),a=N.relu(O(a,e.exit_flow.separable_conv,[1,1])),a})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return So(t,this._numMainBlocks)}extractParams(t){return Lo(t,this._numMainBlocks)}};function Wo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=k(o),n=fr(e,t),s=n(512,1,"fc/age"),a=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:s,gender:a}}}}function ko(o){let t=[],e=Y(o,t);function r(s){let a=e(`${s}/weights`,2),i=e(`${s}/bias`,1);return{weights:a,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return W(o,t),{params:n,paramMappings:t}}var _r=(e=>(e.FEMALE="female",e.MALE="male",e))(_r||{});var He=class extends A{constructor(t=new yr(2)){super("AgeGenderNet"),this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return ft.tidy(()=>{let r=t instanceof ut?this.faceFeatureExtractor.forwardInput(t):t,n=ft.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),s=$e(n,e.fc.age).as1D(),a=$e(n,e.fc.gender);return{age:s,gender:a}})}forwardInput(t){return ft.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:ft.softmax(r)}})}async forward(t){return this.forwardInput(await D(t))}async predictAgeAndGender(t){let e=await D(t),r=await this.forwardInput(e),n=ft.unstack(r.age),s=ft.unstack(r.gender),a=n.map((c,m)=>({ageTensor:c,genderTensor:s[m]})),i=await Promise.all(a.map(async({ageTensor:c,genderTensor:m})=>{let p=c.dataSync()[0],u=m.dataSync()[0],f=u>.5,l=f?"male":"female",b=f?u:1-u;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:b}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?i:i[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Wo(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=br(t);return this.faceFeatureExtractor.loadFromWeightMap(e),ko(r)}extractParams(t){let r=t.slice(0,t.length-1539),n=t.slice(t.length-1539);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var V=v(x());var we=class extends _e{postProcess(t,e,r){let n=r.map(({width:a,height:i})=>{let c=e/Math.max(i,a);return{width:a*c,height:i*c}}),s=n.length;return V.tidy(()=>{let a=(u,f)=>V.stack([V.fill([68],u,"float32"),V.fill([68],f,"float32")],1).as2D(1,136).as1D(),i=(u,f)=>{let{width:l,height:b}=n[u];return f(l,b)?Math.abs(l-b)/2:0},c=u=>i(u,(f,l)=>f<l),m=u=>i(u,(f,l)=>l<f);return t.mul(V.fill([s,136],e,"float32")).sub(V.stack(Array.from(Array(s),(u,f)=>a(c(f),m(f))))).div(V.stack(Array.from(Array(s),(u,f)=>a(n[f].width,n[f].height))))})}forwardInput(t){return V.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,n])=>({height:r,width:n})))})}async forward(t){return this.forwardInput(await D(t))}async detectLandmarks(t){let e=await D(t),r=V.tidy(()=>V.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(s,a)=>{let i=Array.from(s.dataSync()),c=i.filter((p,u)=>er(u)),m=i.filter((p,u)=>!er(u));return new Yt(Array(68).fill(0).map((p,u)=>new _(c[u],m[u])),{height:e.getInputHeight(a),width:e.getInputWidth(a)})}));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var Zt=class extends we{constructor(t=new xe){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var Fe=v(x());function Bo(o){let t=[],{extractDenseBlock3Params:e}=hr(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return W(o,t),{params:r,paramMappings:t}}function Ro(o){let t=[],{extractWeights:e,getRemainingWeights:r}=k(o),{extractDenseBlock3Params:n}=lr(e,t),s=n(3,32,"dense0",!0),a=n(32,64,"dense1"),i=n(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:a,dense2:i}}}var Tr=class extends A{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Fe.tidy(()=>{let r=Fe.cast(t.toBatchTensor(112,!0),"float32"),s=rt(r,[122.782,117.001,104.298]).div(255),a=mr(s,e.dense0,!0);return a=mr(a,e.dense1),a=mr(a,e.dense2),a=Fe.avgPool(a,[14,14],[2,2],"valid"),a})}async forward(t){return this.forwardInput(await D(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Bo(t)}extractParams(t){return Ro(t)}};var ze=class extends we{constructor(t=new Tr){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var po=class extends Zt{};var nt=v(x());var De=v(x());var Pr=v(x());function $o(o,t){return Pr.add(Pr.mul(o,t.weights),t.biases)}function uo(o,t,e,r,n="same"){let{filters:s,bias:a}=t.conv,i=De.conv2d(o,s,e,n);return i=De.add(i,a),i=$o(i,t.scale),r?De.relu(i):i}function Oo(o,t){return uo(o,t,[1,1],!0)}function fo(o,t){return uo(o,t,[1,1],!1)}function wr(o,t){return uo(o,t,[2,2],!0,"valid")}var G=v(x());function Kn(o,t){function e(i,c,m){let p=o(i),u=p.length/(c*m*m);if($r(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,u,m,m]),[2,3,1,0]))}function r(i,c,m,p){let u=e(i,c,m),f=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:u,bias:f}}function n(i,c){let m=G.t