face-api/dist/face-api.node.js

10 lines
83 KiB
JavaScript

/*
Face-API
homepage: <https://github.com/vladmandic/face-api>
author: <https://github.com/vladmandic>'
*/
var dn=Object.create,Ye=Object.defineProperty,un=Object.getPrototypeOf,ln=Object.prototype.hasOwnProperty,fn=Object.getOwnPropertyNames,hn=Object.getOwnPropertyDescriptor;var lo=o=>Ye(o,"__esModule",{value:!0});var xn=(o,t)=>()=>(t||o((t={exports:{}}).exports,t),t.exports),Dr=(o,t)=>{for(var e in t)Ye(o,e,{get:t[e],enumerable:!0})},bn=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of fn(t))!ln.call(o,r)&&r!=="default"&&Ye(o,r,{get:()=>t[r],enumerable:!(e=hn(t,r))||e.enumerable});return o},y=o=>bn(lo(Ye(o!=null?dn(un(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);var b=xn(Er=>{var gn=Object.create,Mr=Object.defineProperty,vn=Object.getPrototypeOf,yn=Object.prototype.hasOwnProperty,Fn=Object.getOwnPropertyNames,Tn=Object.getOwnPropertyDescriptor,fo=o=>Mr(o,"__esModule",{value:!0}),ho=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Fn(t))!yn.call(o,r)&&r!=="default"&&Mr(o,r,{get:()=>t[r],enumerable:!(e=Tn(t,r))||e.enumerable});return o},_n=o=>ho(fo(Mr(o!=null?gn(vn(o)):{},"default",o&&o.__esModule&&"default"in o?{get:()=>o.default,enumerable:!0}:{value:o,enumerable:!0})),o);fo(Er);ho(Er,_n(require("@tensorflow/tfjs-node")))});lo(exports);Dr(exports,{AgeGenderNet:()=>mr,BoundingBox:()=>te,Box:()=>D,ComposableTask:()=>Q,ComputeAllFaceDescriptorsTask:()=>kt,ComputeFaceDescriptorsTaskBase:()=>gr,ComputeSingleFaceDescriptorTask:()=>St,DetectAllFaceLandmarksTask:()=>yr,DetectAllFacesTask:()=>He,DetectFaceLandmarksTaskBase:()=>vr,DetectFacesTaskBase:()=>Tr,DetectSingleFaceLandmarksTask:()=>Fr,DetectSingleFaceTask:()=>_r,Dimensions:()=>A,FACE_EXPRESSION_LABELS:()=>Jr,FaceDetection:()=>M,FaceDetectionNet:()=>Uo,FaceExpressionNet:()=>ir,FaceExpressions:()=>Ct,FaceLandmark68Net:()=>le,FaceLandmark68TinyNet:()=>pr,FaceLandmarkNet:()=>Ao,FaceLandmarks:()=>U,FaceLandmarks5:()=>go,FaceLandmarks68:()=>re,FaceMatch:()=>Ee,FaceMatcher:()=>wr,FaceRecognitionNet:()=>xe,Gender:()=>gt,LabeledBox:()=>Me,LabeledFaceDescriptors:()=>ht,NetInput:()=>xt,NeuralNetwork:()=>S,ObjectDetection:()=>wt,Point:()=>x,PredictedBox:()=>vo,Rect:()=>ee,SsdMobilenetv1:()=>Vt,SsdMobilenetv1Options:()=>q,TinyFaceDetector:()=>Fe,TinyFaceDetectorOptions:()=>br,TinyYolov2:()=>ve,TinyYolov2Options:()=>ut,allFaces:()=>_a,allFacesSsdMobilenetv1:()=>mn,allFacesTinyYolov2:()=>Ta,awaitMediaLoaded:()=>Yr,bufferToImage:()=>Gr,computeFaceDescriptor:()=>ca,createCanvas:()=>jt,createCanvasFromMedia:()=>Ie,createFaceDetectionNet:()=>ea,createFaceRecognitionNet:()=>Gn,createSsdMobilenetv1:()=>Vo,createTinyFaceDetector:()=>Pa,createTinyYolov2:()=>na,detectAllFaces:()=>Pr,detectFaceLandmarks:()=>sn,detectFaceLandmarksTiny:()=>ia,detectLandmarks:()=>ya,detectSingleFace:()=>Fa,draw:()=>Do,env:()=>w,euclideanDistance:()=>po,extendWithAge:()=>fr,extendWithFaceDescriptor:()=>lr,extendWithFaceDetection:()=>Rt,extendWithFaceExpressions:()=>cr,extendWithFaceLandmarks:()=>ue,extendWithGender:()=>hr,extractFaceTensors:()=>ne,extractFaces:()=>oe,fetchImage:()=>kn,fetchJson:()=>Ur,fetchNetWeights:()=>Sn,fetchOrThrow:()=>Ht,getContext2dOrThrow:()=>$,getMediaDimensions:()=>Ot,imageTensorToCanvas:()=>zr,imageToSquare:()=>Vr,inverseSigmoid:()=>Dn,iou:()=>Lr,isMediaElement:()=>Je,isMediaLoaded:()=>Ne,isWithAge:()=>zn,isWithFaceDetection:()=>mt,isWithFaceExpressions:()=>qr,isWithFaceLandmarks:()=>Gt,isWithGender:()=>Vn,loadAgeGenderModel:()=>ba,loadFaceDetectionModel:()=>ga,loadFaceExpressionModel:()=>xa,loadFaceLandmarkModel:()=>la,loadFaceLandmarkTinyModel:()=>fa,loadFaceRecognitionModel:()=>ha,loadSsdMobilenetv1Model:()=>cn,loadTinyFaceDetectorModel:()=>da,loadTinyYolov2Model:()=>ua,loadWeightMap:()=>Xr,locateFaces:()=>va,matchDimensions:()=>An,minBbox:()=>kr,nets:()=>_,nonMaxSuppression:()=>Sr,normalize:()=>rt,padToSquare:()=>Ar,predictAgeAndGender:()=>pa,recognizeFaceExpressions:()=>ma,resizeResults:()=>pn,resolveInput:()=>$t,shuffleArray:()=>wn,sigmoid:()=>De,ssdMobilenetv1:()=>an,tf:()=>wa,tinyFaceDetector:()=>aa,tinyYolov2:()=>sa,toNetInput:()=>E,utils:()=>xo,validateConfig:()=>no,version:()=>Ma});var wa=y(b());var Do={};Dr(Do,{AnchorPosition:()=>pt,DrawBox:()=>Ue,DrawBoxOptions:()=>Hr,DrawFaceLandmarks:()=>Kr,DrawFaceLandmarksOptions:()=>Zr,DrawTextField:()=>Et,DrawTextFieldOptions:()=>Ce,drawContour:()=>lt,drawDetections:()=>Ln,drawFaceExpressions:()=>Wn,drawFaceLandmarks:()=>Rn});function lt(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:n},a)=>{let s=t[a];o.moveTo(s.x,s.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 xo={};Dr(xo,{computeReshapedDimensions:()=>Ir,getCenterPoint:()=>Bt,isDimensions:()=>ze,isEven:()=>Ge,isFloat:()=>Nr,isTensor:()=>At,isTensor1D:()=>Pn,isTensor2D:()=>Cr,isTensor3D:()=>ft,isTensor4D:()=>V,isValidNumber:()=>et,isValidProbablitiy:()=>Qt,range:()=>it,round:()=>Wt});var bo=y(b());var A=class{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 A(1/this.width,1/this.height)}};function At(o,t){return o instanceof bo.Tensor&&o.shape.length===t}function Pn(o){return At(o,1)}function Cr(o){return At(o,2)}function ft(o){return At(o,3)}function V(o){return At(o,4)}function Nr(o){return o%1!=0}function Ge(o){return o%2==0}function Wt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ze(o){return o&&o.width&&o.height}function Ir({width:o,height:t},e){let r=e/Math.max(t,o);return new A(Math.round(o*r),Math.round(t*r))}function Bt(o){return o.reduce((t,e)=>t.add(e),new x(0,0)).div(new x(o.length,o.length))}function it(o,t,e){return Array(o).fill(0).map((r,n)=>t+n*e)}function et(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function Qt(o){return et(o)&&o>=0&&o<=1}var x=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new x(this.x+t.x,this.y+t.y)}sub(t){return new x(this.x-t.x,this.y-t.y)}mul(t){return new x(this.x*t.x,this.y*t.y)}div(t){return new x(this.x/t.x,this.y/t.y)}abs(){return new x(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new x(Math.floor(this.x),Math.floor(this.y))}};var D=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(et)}static assertIsValidBox(t,e,r=!1){if(!D.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),a=[r.x,r.y,r.width,r.height].every(et);if(!a&&!n)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[s,i,c,m]=a?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];D.assertIsValidBox({x:s,y:i,width:c,height:m},"Box.constructor",e),this._x=s,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 x(this.left,this.top)}get topRight(){return new x(this.right,this.top)}get bottomLeft(){return new x(this.left,this.bottom)}get bottomRight(){return new x(this.right,this.bottom)}round(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.round(a));return new D({x:t,y:e,width:r,height:n})}floor(){let[t,e,r,n]=[this.x,this.y,this.width,this.height].map(a=>Math.floor(a));return new D({x:t,y:e,width:r,height:n})}toSquare(){let{x:t,y:e,width:r,height:n}=this,a=Math.abs(r-n);return r<n&&(t-=a/2,r+=a),n<r&&(e-=a/2,n+=a),new D({x:t,y:e,width:r,height:n})}rescale(t){let e=ze(t)?t.width:t,r=ze(t)?t.height:t;return new D({x:this.x*e,y:this.y*r,width:this.width*e,height:this.height*r})}pad(t,e){let[r,n,a,s]=[this.x-t/2,this.y-e/2,this.width+t,this.height+e];return new D({x:r,y:n,width:a,height:s})}clipAtImageBorders(t,e){let{x:r,y:n,right:a,bottom:s}=this,i=Math.max(r,0),c=Math.max(n,0),m=a-i,p=s-c,d=Math.min(m,t-i),u=Math.min(p,e-c);return new D({x:i,y:c,width:d,height:u}).floor()}shift(t,e){let{width:r,height:n}=this,a=this.x+t,s=this.y+e;return new D({x:a,y:s,width:r,height:n})}padAtBorders(t,e){let r=this.width+1,n=this.height+1,a=1,s=1,i=r,c=n,m=this.left,p=this.top,d=this.right,u=this.bottom;return d>e&&(i=-d+e+r,d=e),u>t&&(c=-u+t+n,u=t),m<1&&(c=2-m,m=1),p<1&&(c=2-p,p=1),{dy:s,edy:c,dx:a,edx:i,y:p,ey:u,x:m,ex:d,w:r,h:n}}calibrate(t){return new D({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 te=class extends D{constructor(t,e,r,n,a=!1){super({left:t,top:e,right:r,bottom:n},a)}};var wt=class{constructor(t,e,r,n,a){this._imageDims=new A(a.width,a.height),this._score=t,this._classScore=e,this._className=r,this._box=new D(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 D(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new wt(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var M=class extends wt{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:n,imageDims:a}=super.forSize(t,e);return new M(r,n,a)}};function Lr(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)),a=r*n;return e?a/(o.area+t.area-a):a/Math.min(o.area,t.area)}function kr(o){let t=o.map(i=>i.x),e=o.map(i=>i.y),r=t.reduce((i,c)=>c<i?c:i,Infinity),n=e.reduce((i,c)=>c<i?c:i,Infinity),a=t.reduce((i,c)=>i<c?c:i,0),s=e.reduce((i,c)=>i<c?c:i,0);return new te(r,n,a,s)}function Sr(o,t,e,r=!0){let n=t.map((s,i)=>({score:s,boxIndex:i})).sort((s,i)=>s.score-i.score).map(s=>s.boxIndex),a=[];for(;n.length>0;){let s=n.pop();a.push(s);let i=n,c=[];for(let m=0;m<i.length;m++){let p=i[m],d=o[s],u=o[p];c.push(Lr(d,u,r))}n=n.filter((m,p)=>c[p]<=e)}return a}var ct=y(b());function rt(o,t){return ct.tidy(()=>{let[e,r,n]=t,a=ct.fill([...o.shape.slice(0,3),1],e,"float32"),s=ct.fill([...o.shape.slice(0,3),1],r,"float32"),i=ct.fill([...o.shape.slice(0,3),1],n,"float32"),c=ct.concat([a,s,i],3);return ct.sub(o,c)})}var Dt=y(b());function Ar(o,t=!1){return Dt.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let n=Math.abs(e-r),a=Math.round(n*(t?.5:1)),s=e>r?2:1,i=u=>{let l=o.shape.slice();return l[s]=u,Dt.fill(l,0,"float32")},c=i(a),m=n-c.shape[s],d=[t&&m?i(m):null,o,c].filter(u=>!!u).map(u=>Dt.cast(u,"float32"));return Dt.concat(d,s)})}function wn(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 De(o){return 1/(1+Math.exp(-o))}function Dn(o){return Math.log(o/(1-o))}var ee=class extends D{constructor(t,e,r,n,a=!1){super({x:t,y:e,width:r,height:n},a)}};var En=.5,Mn=.43,Cn=.45,U=class{constructor(t,e,r=new x(0,0)){let{width:n,height:a}=e;this._imgDims=new A(n,a),this._shift=r,this._positions=t.map(s=>s.mul(new x(n,a)).add(r))}get shift(){return new x(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 x(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 x(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let a=t instanceof M?t.box.floor():new D(t);return this.shiftBy(a.x,a.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,a=d=>n.sub(d).magnitude(),s=(a(e)+a(r))/2,i=Math.floor(s/Cn),c=Bt(t),m=Math.floor(Math.max(0,c.x-En*i)),p=Math.floor(Math.max(0,c.y-Mn*i));return new ee(m,p,Math.min(i,this.imageWidth+m),Math.min(i,this.imageHeight+p))}alignMinBbox(t){let e=kr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var go=class extends U{getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],Bt([t[3],t[4]])]}};var re=class extends U{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(Bt)}};var Ee=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?` (${Wt(this.distance)})`:""}`}};var Me=class extends D{static assertIsValidLabeledBox(t,e){if(D.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 ht=class{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 ht(t.label,e)}};var vo=class extends Me{static assertIsValidPredictedBox(t,e){if(Me.assertIsValidLabeledBox(t,e),!Qt(t.score)||!Qt(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 mt(o){return o.detection instanceof M}function Rt(o,t){return{...o,...{detection:t}}}function Wr(){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"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function Ve(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((n,a)=>{o.readFile(r,(s,i)=>s?a(s):n(i))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Br(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch,a=Ve();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:n,...a}}function Rr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}function $r(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}var k;function Nn(){if(!k)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return k}function Or(o){k=o}function jr(){return Rr()?Or(Wr()):$r()?Or(Br()):null}function In(o){if(k||jr(),!k)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=k.Canvas,Image:e=k.Image}=o;k.Canvas=t,k.Image=e,k.createCanvasElement=o.createCanvasElement||(()=>new t),k.createImageElement=o.createImageElement||(()=>new e),k.ImageData=o.ImageData||k.ImageData,k.Video=o.Video||k.Video,k.fetch=o.fetch||k.fetch,k.readFile=o.readFile||k.readFile}var w={getEnv:Nn,setEnv:Or,initialize:jr,createBrowserEnv:Wr,createFileSystem:Ve,createNodejsEnv:Br,monkeyPatch:In,isBrowser:Rr,isNodejs:$r};jr();function $t(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=$t(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let n=r.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var pt;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(pt||(pt={}));var Ce=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:n,fontSize:a,fontStyle:s,padding:i}=t;this.anchorPosition=e||pt.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=n||"rgba(255, 255, 255, 1)",this.fontSize=a||14,this.fontStyle=s||"Georgia",this.padding=i||4}},Et=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof Et?t.text:t,this.anchor=e,this.options=new Ce(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===pt.BOTTOM_RIGHT||r===pt.TOP_RIGHT,a=r===pt.BOTTOM_LEFT||r===pt.BOTTOM_RIGHT,s=this.measureWidth(t),i=this.measureHeight(),c=n?this.anchor.x-s:this.anchor.x,m=a?this.anchor.y-i:this.anchor.y;if(e){let{width:p,height:d}=e,u=Math.max(Math.min(c,p-s),0),l=Math.max(Math.min(m,d-i),0);return{x:u,y:l}}return{x:c,y:m}}draw(t){let e=$t(t),r=$(e),{backgroundColor:n,fontColor:a,fontSize:s,fontStyle:i,padding:c}=this.options;r.font=`${s}px ${i}`;let m=this.measureWidth(r),p=this.measureHeight();r.fillStyle=n;let d=this.getUpperLeft(r,e);r.fillRect(d.x,d.y,m,p),r.fillStyle=a,this.text.forEach((u,l)=>{let g=c+d.x,P=c+d.y+(l+1)*s;r.fillText(u,g,P)})}};var Hr=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:n,drawLabelOptions:a}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=n;let s={anchorPosition:pt.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Ce({...s,...a})}},Ue=class{constructor(t,e={}){this.box=new D(t),this.options=new Hr(e)}draw(t){let e=$(t),{boxColor:r,lineWidth:n}=this.options,{x:a,y:s,width:i,height:c}=this.box;e.strokeStyle=r,e.lineWidth=n,e.strokeRect(a,s,i,c);let{label:m}=this.options;m&&new Et([m],{x:a-n/2,y:s},this.options.drawLabelOptions).draw(t)}};function Ln(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof M?r.score:mt(r)?r.detection.score:void 0,a=r instanceof M?r.box:mt(r)?r.detection.box:new D(r),s=n?`${Wt(n)}`:void 0;new Ue(a,{label:s}).draw(o)})}var de=y(b());function Ne(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function Yr(o){return new Promise((t,e)=>{if(o instanceof w.getEnv().Canvas||Ne(o))return t(null);function r(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),e(a))}function n(a){!a.currentTarget||(a.currentTarget.removeEventListener("load",n),a.currentTarget.removeEventListener("error",r),t(a))}o.addEventListener("load",n),o.addEventListener("error",r)})}function Gr(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 Ot(o){let{Image:t,Video:e}=w.getEnv();return o instanceof t?new A(o.naturalWidth,o.naturalHeight):o instanceof e?new A(o.videoWidth,o.videoHeight):new A(o.width,o.height)}function jt({width:o,height:t}){let{createCanvasElement:e}=w.getEnv(),r=e();return r.width=o,r.height=t,r}function Ie(o,t){let{ImageData:e}=w.getEnv();if(!(o instanceof e)&&!Ne(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:n}=t||Ot(o),a=jt({width:r,height:n});return o instanceof e?$(a).putImageData(o,0,0):$(a).drawImage(o,0,0,r,n),a}var Xe=y(b());async function zr(o,t){let e=t||w.getEnv().createCanvasElement(),[r,n,a]=o.shape.slice(V(o)?1:0),s=Xe.tidy(()=>o.as3D(r,n,a).toInt());return await Xe.browser.toPixels(s,e),s.dispose(),e}function Je(o){let{Image:t,Canvas:e,Video:r}=w.getEnv();return o instanceof t||o instanceof e||o instanceof r}var j=y(b());function Vr(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 jt({width:1,height:1});let a=Ot(o),s=t/Math.max(a.height,a.width),i=s*a.width,c=s*a.height,m=jt({width:t,height:t}),p=o instanceof n?o:Ie(o),d=Math.abs(i-c)/2,u=e&&i<c?d:0,l=e&&c<i?d:0;return p.width>0&&p.height>0&&$(m).drawImage(p,u,l,i,c),m}var xt=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];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(ft(r)){this._imageTensors[n]=r,this._inputDimensions[n]=r.shape;return}if(V(r)){let s=r.shape[0];if(s!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${s} passed, but not supported in input array`);this._imageTensors[n]=r,this._inputDimensions[n]=r.shape.slice(1);return}let a=r instanceof w.getEnv().Canvas?r:Ie(r);this._canvases[n]=a,this._inputDimensions[n]=[a.height,a.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 it(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 Ir({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,j.tidy(()=>{let r=it(this.batchSize,0,1).map(a=>{let s=this.getInput(a);if(s instanceof j.Tensor){let i=V(s)?s:j.expandDims(s);return i=Ar(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=j.image.resizeBilinear(i,[t,t],!1,!1)),i.as3D(t,t,3)}if(s instanceof w.getEnv().Canvas)return j.browser.fromPixels(Vr(s,t,e));throw new Error(`toBatchTensor - at batchIdx ${a}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${s}`)});return j.stack(r.map(a=>j.cast(a,"float32"))).as4D(this.batchSize,t,t,3)})}};async function E(o){if(o instanceof xt)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($t);return r.forEach((n,a)=>{if(!Je(n)&&!ft(n)&&!V(n))throw typeof t[a]=="string"?new Error(`toNetInput -${e(a)} string passed, but could not resolve HTMLElement for element id ${t[a]}`):new Error(`toNetInput -${e(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(V(n)){let s=n.shape[0];if(s!==1)throw new Error(`toNetInput -${e(a)} tf.Tensor4D with batchSize ${s} passed, but not supported in input array`)}}),await Promise.all(r.map(n=>Je(n)&&Yr(n))),new xt(r,Array.isArray(o))}async function oe(o,t){let{Canvas:e}=w.getEnv(),r=o;if(!(o instanceof e)){let s=await E(o);if(s.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let i=s.getInput(0);r=i instanceof e?i:await zr(i)}let n=$(r);return t.map(s=>s instanceof M?s.forSize(r.width,r.height).box.floor():s).map(s=>s.clipAtImageBorders(r.width,r.height)).map(({x:s,y:i,width:c,height:m})=>{let p=jt({width:c,height:m});return c>0&&m>0&&$(p).putImageData(n.getImageData(s,i,c,m),0,0),p})}var qe=y(b());async function ne(o,t){if(!ft(o)&&!V(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(V(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return qe.tidy(()=>{let[e,r,n]=o.shape.slice(V(o)?1:0);return t.map(i=>i instanceof M?i.forSize(r,e).box:i).map(i=>i.clipAtImageBorders(r,e)).map(({x:i,y:c,width:m,height:p})=>qe.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 kn(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 Gr(e)}async function Ur(o){return(await Ht(o)).json()}async function Sn(o){return new Float32Array(await(await Ht(o)).arrayBuffer())}var yo=y(b());function Ze(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),a=o.endsWith(".json")?n[n.length-1]:e,s=r+(o.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return s=o.startsWith("/")?`/${s}`:s,{modelBaseUri:s,manifestUri:s==="/"?`/${a}`:`${s}/${a}`}}async function Xr(o,t){let{manifestUri:e,modelBaseUri:r}=Ze(o,t),n=await Ur(e);return yo.io.loadWeights(n,r)}function An(o,t,e=!1){let{width:r,height:n}=e?Ot(t):t;return o.width=r,o.height=n,{width:r,height:n}}var me=y(b());var bt=y(b());var S=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 Xr(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}=Ze(t,this.getDefaultModelName()),a=m=>Promise.all(m.map(p=>e(p).then(d=>d.buffer))),s=bt.io.weightsLoaderFactory(a),i=JSON.parse((await e(r)).toString()),c=await s(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((a,s)=>{if(!a.nextObj.hasOwnProperty(s))throw new Error(`traversePropertyPath - object does not have property ${s}, for path ${t}`);return{obj:a.nextObj,objProp:s,nextObj:a.nextObj[s]}},{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 C=y(b());var ae=y(b());function O(o,t,e){return ae.tidy(()=>{let r=ae.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=ae.add(r,t.bias),r})}function Ke(o,t,e=!1){return C.tidy(()=>{let r=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):O(o,t.conv0,[2,2])),n=O(r,t.conv1,[1,1]),a=C.relu(C.add(r,n)),s=O(a,t.conv2,[1,1]);return C.relu(C.add(r,C.add(n,s)))})}function Le(o,t,e=!1,r=!0){return C.tidy(()=>{let n=C.relu(e?C.add(C.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):O(o,t.conv0,r?[2,2]:[1,1])),a=O(n,t.conv1,[1,1]),s=C.relu(C.add(n,a)),i=O(s,t.conv2,[1,1]),c=C.relu(C.add(n,C.add(a,i))),m=O(c,t.conv3,[1,1]);return C.relu(C.add(n,C.add(a,C.add(i,m))))})}var Mt=y(b());function Yt(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 Qe=y(b());function se(o,t){return(e,r,n,a)=>{let s=Qe.tensor4d(o(e*r*n*n),[n,n,e,r]),i=Qe.tensor1d(o(r));return t.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:s,bias:i}}}var tr=y(b());function er(o,t){return(e,r,n)=>{let a=tr.tensor2d(o(e*r),[e,r]),s=tr.tensor1d(o(r));return t.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:s}}}var ke=y(b());var rr=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function ie(o,t){return(e,r,n)=>{let a=ke.tensor4d(o(3*3*e),[3,3,e,1]),s=ke.tensor4d(o(e*r),[1,1,e,r]),i=ke.tensor1d(o(r));return t.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new rr(a,s,i)}}function ce(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),n=o(`${t}/bias`,1);return new rr(e,r,n)}}function H(o,t){return(e,r,n)=>{let a=o[e];if(!At(a,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${a}`);return t.push({originalPath:e,paramPath:n||e}),a}}function B(o){let t=o;function e(n){let a=t.slice(0,n);return t=t.slice(n),a}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function or(o,t){let e=se(o,t),r=ie(o,t);function n(s,i,c,m=!1){let p=m?e(s,i,3,`${c}/conv0`):r(s,i,`${c}/conv0`),d=r(i,i,`${c}/conv1`),u=r(i,i,`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function a(s,i,c,m=!1){let{conv0:p,conv1:d,conv2:u}=n(s,i,c,m),l=r(i,i,`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Fo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractDenseBlock4Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=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:a,dense1:s,dense2:i,dense3:c}}}function nr(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function ar(o,t){let e=H(o,t),r=nr(e),n=ce(e);function a(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`);return{conv0:m,conv1:p,conv2:d}}function s(i,c=!1){let m=c?r(`${i}/conv0`):n(`${i}/conv0`),p=n(`${i}/conv1`),d=n(`${i}/conv2`),u=n(`${i}/conv3`);return{conv0:m,conv1:p,conv2:d,conv3:u}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function To(o){let t=[],{extractDenseBlock4Params:e}=ar(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 Se=class extends S{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return me.tidy(()=>{let r=me.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Le(a,e.dense0,!0);return s=Le(s,e.dense1),s=Le(s,e.dense2),s=Le(s,e.dense3),s=me.avgPool(s,[7,7],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return To(t)}extractParams(t){return Fo(t)}};var wo=y(b());var pe=y(b());function Ae(o,t){return pe.tidy(()=>pe.add(pe.matMul(o,t.weights),t.bias))}function _o(o,t,e){let r=[],{extractWeights:n,getRemainingWeights:a}=B(o),i=er(n,r)(t,e,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:r,params:{fc:i}}}function Po(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:r("fc")};return W(o,t),{params:n,paramMappings:t}}function sr(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 We=class extends S{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 wo.tidy(()=>{let r=t instanceof xt?this.faceFeatureExtractor.forwardInput(t):t;return Ae(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 _o(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Po(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),n=r*e+r,a=t.slice(0,t.length-n),s=t.slice(t.length-n);return this.faceFeatureExtractor.extractWeights(a),this.extractClassifierParams(s)}};var Jr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],Ct=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Jr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Jr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var ir=class extends We{constructor(t=new Se){super("FaceExpressionNet",t)}forwardInput(t){return de.tidy(()=>de.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await E(t))}async predictExpressions(t){let e=await E(t),r=await this.forwardInput(e),n=await Promise.all(de.unstack(r).map(async s=>{let i=s.dataSync();return s.dispose(),i}));r.dispose();let a=n.map(s=>new Ct(s));return e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function qr(o){return o.expressions instanceof Ct}function cr(o,t){return{...o,...{expressions:t}}}function Wn(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(a=>{let s=a instanceof Ct?a:qr(a)?a.expressions:void 0;if(!s)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let c=s.asSortedArray().filter(d=>d.probability>e),m=mt(a)?a.detection.box.bottomLeft:r||new x(0,0);new Et(c.map(d=>`${d.expression} (${Wt(d.probability)})`),m).draw(o)})}function Gt(o){return mt(o)&&o.landmarks instanceof U&&o.unshiftedLandmarks instanceof U&&o.alignedRect instanceof M}function Bn(o){let t=(i,c,m,p)=>Math.atan2(p-c,m-i)%Math.PI,e=i=>i*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let n=o._positions;r.roll=-t(n[36]._x,n[36]._y,n[45]._x,n[45]._y),r.pitch=t(0,Math.abs(n[0]._x-n[30]._x)/n[30]._x,Math.PI,Math.abs(n[16]._x-n[30]._x)/n[30]._x);let a=n.reduce((i,c)=>i<c._y?i:c._y,Infinity),s=n.reduce((i,c)=>i>c._y?i:c._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(s-a)/1.4-1),r}function ue(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),n=r.align(),{imageDims:a}=o.detection,s=new M(o.detection.score,n.rescale(a.reverse()),a),i=Bn(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:s,angle:i}}}var Zr=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:n,lineColor:a,pointSize:s,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=n||1,this.pointSize=s||2,this.lineColor=a||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}},Kr=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new Zr(e)}draw(t){let e=$(t),{drawLines:r,drawPoints:n,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=this.options;if(r&&this.faceLandmarks instanceof re&&(e.strokeStyle=s,e.lineWidth=a,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 Rn(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let n=r instanceof U?r:Gt(r)?r.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks<WithFaceDetection<{}>> or array thereof");new Kr(n).draw(o)})}var Eo="1.1.6";var dt=y(b());var L=y(b());function $n(o,t){let e=se(o,t),r=ie(o,t);function n(s,i,c){let m=r(s,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=e(s,i,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function a(s,i){let c=r(s,s,`${i}/separable_conv0`),m=r(s,s,`${i}/separable_conv1`),p=r(s,s,`${i}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:n,extractMainBlockParams:a}}function Mo(o,t){let e=[],{extractWeights:r,getRemainingWeights:n}=B(o),{extractConvParams:a,extractSeparableConvParams:s,extractReductionBlockParams:i,extractMainBlockParams:c}=$n(r,e),m=a(3,32,3,"entry_flow/conv_in"),p=i(32,64,"entry_flow/reduction_block_0"),d=i(64,128,"entry_flow/reduction_block_1"),u={conv_in:m,reduction_block_0:p,reduction_block_1:d},l={};it(t,0,1).forEach(v=>{l[`main_block_${v}`]=c(128,`middle_flow/main_block_${v}`)});let g=i(128,256,"exit_flow/reduction_block"),P=s(256,512,"exit_flow/separable_conv"),h={reduction_block:g,separable_conv:P};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:e,params:{entry_flow:u,middle_flow:l,exit_flow:h}}}function On(o,t){let e=H(o,t),r=nr(e),n=ce(e);function a(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 s(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:a,extractMainBlockParams:s}}function Co(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:s}=On(o,e),i=r("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:i,reduction_block_0:c,reduction_block_1:m},d={};it(t,0,1).forEach(P=>{d[`main_block_${P}`]=s(`middle_flow/main_block_${P}`)});let u=a("exit_flow/reduction_block"),l=n("exit_flow/separable_conv"),g={reduction_block:u,separable_conv:l};return W(o,e),{params:{entry_flow:p,middle_flow:d,exit_flow:g},paramMappings:e}}function No(o,t,e){return L.add(L.conv2d(o,t.filters,e,"same"),t.bias)}function Qr(o,t,e=!0){let r=e?L.relu(o):o;return r=O(r,t.separable_conv0,[1,1]),r=O(L.relu(r),t.separable_conv1,[1,1]),r=L.maxPool(r,[3,3],[2,2],"same"),r=L.add(r,No(o,t.expansion_conv,[2,2])),r}function jn(o,t){let e=O(L.relu(o),t.separable_conv0,[1,1]);return e=O(L.relu(e),t.separable_conv1,[1,1]),e=O(L.relu(e),t.separable_conv2,[1,1]),e=L.add(e,o),e}var to=class extends S{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return L.tidy(()=>{let r=L.cast(t.toBatchTensor(112,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=L.relu(No(a,e.entry_flow.conv_in,[2,2]));return s=Qr(s,e.entry_flow.reduction_block_0,!1),s=Qr(s,e.entry_flow.reduction_block_1),it(this._numMainBlocks,0,1).forEach(i=>{s=jn(s,e.middle_flow[`main_block_${i}`])}),s=Qr(s,e.exit_flow.reduction_block),s=L.relu(O(s,e.exit_flow.separable_conv,[1,1])),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return Co(t,this._numMainBlocks)}extractParams(t){return Mo(t,this._numMainBlocks)}};function Io(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),n=er(e,t),a=n(512,1,"fc/age"),s=n(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:a,gender:s}}}}function Lo(o){let t=[],e=H(o,t);function r(a){let s=e(`${a}/weights`,2),i=e(`${a}/bias`,1);return{weights:s,bias:i}}let n={fc:{age:r("fc/age"),gender:r("fc/gender")}};return W(o,t),{params:n,paramMappings:t}}var gt;(function(o){o.FEMALE="female",o.MALE="male"})(gt||(gt={}));var mr=class extends S{constructor(t=new to(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 dt.tidy(()=>{let r=t instanceof xt?this.faceFeatureExtractor.forwardInput(t):t,n=dt.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),a=Ae(n,e.fc.age).as1D(),s=Ae(n,e.fc.gender);return{age:a,gender:s}})}forwardInput(t){return dt.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:dt.softmax(r)}})}async forward(t){return this.forwardInput(await E(t))}async predictAgeAndGender(t){let e=await E(t),r=await this.forwardInput(e),n=dt.unstack(r.age),a=dt.unstack(r.gender),s=n.map((c,m)=>({ageTensor:c,genderTensor:a[m]})),i=await Promise.all(s.map(async({ageTensor:c,genderTensor:m})=>{let p=c.dataSync()[0],d=m.dataSync()[0],u=d>.5,l=u?gt.MALE:gt.FEMALE,g=u?d:1-d;return c.dispose(),m.dispose(),{age:p,gender:l,genderProbability:g}}));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 Io(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=sr(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Lo(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),n=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(n)}};var Y=y(b());var Be=class extends We{postProcess(t,e,r){let n=r.map(({width:s,height:i})=>{let c=e/Math.max(i,s);return{width:s*c,height:i*c}}),a=n.length;return Y.tidy(()=>{let s=(d,u)=>Y.stack([Y.fill([68],d,"float32"),Y.fill([68],u,"float32")],1).as2D(1,136).as1D(),i=(d,u)=>{let{width:l,height:g}=n[d];return u(l,g)?Math.abs(l-g)/2:0},c=d=>i(d,(u,l)=>u<l),m=d=>i(d,(u,l)=>l<u);return t.mul(Y.fill([a,136],e,"float32")).sub(Y.stack(Array.from(Array(a),(d,u)=>s(c(u),m(u))))).div(Y.stack(Array.from(Array(a),(d,u)=>s(n[u].width,n[u].height))))})}forwardInput(t){return Y.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 E(t))}async detectLandmarks(t){let e=await E(t),r=Y.tidy(()=>Y.unstack(this.forwardInput(e))),n=await Promise.all(r.map(async(a,s)=>{let i=Array.from(a.dataSync()),c=i.filter((p,d)=>Ge(d)),m=i.filter((p,d)=>!Ge(d));return new re(Array(68).fill(0).map((p,d)=>new x(c[d],m[d])),{height:e.getInputHeight(s),width:e.getInputWidth(s)})}));return r.forEach(a=>a.dispose()),e.isBatchInput?n:n[0]}getClassifierChannelsOut(){return 136}};var le=class extends Be{constructor(t=new Se){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var fe=y(b());function ko(o){let t=[],{extractDenseBlock3Params:e}=ar(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return W(o,t),{params:r,paramMappings:t}}function So(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractDenseBlock3Params:n}=or(e,t),a=n(3,32,"dense0",!0),s=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:a,dense1:s,dense2:i}}}var eo=class extends S{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"),a=rt(r,[122.782,117.001,104.298]).div(255),s=Ke(a,e.dense0,!0);return s=Ke(s,e.dense1),s=Ke(s,e.dense2),s=fe.avgPool(s,[14,14],[2,2],"valid"),s})}async forward(t){return this.forwardInput(await E(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return ko(t)}extractParams(t){return So(t)}};var pr=class extends Be{constructor(t=new eo){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Ao=class extends le{};var nt=y(b());var he=y(b());var dr=y(b());function Wo(o,t){return dr.add(dr.mul(o,t.weights),t.biases)}function ro(o,t,e,r,n="same"){let{filters:a,bias:s}=t.conv,i=he.conv2d(o,a,e,n);return i=he.add(i,s),i=Wo(i,t.scale),r?he.relu(i):i}function Bo(o,t){return ro(o,t,[1,1],!0)}function oo(o,t){return ro(o,t,[1,1],!1)}function ur(o,t){return ro(o,t,[2,2],!0,"valid")}var G=y(b());function Hn(o,t){function e(i,c,m){let p=o(i),d=p.length/(c*m*m);if(Nr(d))throw new Error(`depth has to be an integer: ${d}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return G.tidy(()=>G.transpose(G.tensor4d(p,[c,d,m,m]),[2,3,1,0]))}function r(i,c,m,p){let d=e(i,c,m),u=G.tensor1d(o(c));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:d,bias:u}}function n(i,c){let m=G.tensor1d(o(i)),p=G.tensor1d(o(i));return t.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(i,c,m,p){let d=r(i,c,m,`${p}/conv`),u=n(c,`${p}/scale`);return{conv:d,scale:u}}function s(i,c,m,p,d=!1){let u=a((d?.5:1)*i,c,m,`${p}/conv1`),l=a(i,c,m,`${p}/conv2`);return{conv1:u,conv2:l}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function Ro(o){let{extractWeights:t,getRemainingWeights:e}=B(o),r=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Hn(t,r),s=n(4704,32,7,"conv32_down"),i=a(9216,32,3,"conv32_1"),c=a(9216,32,3,"conv32_2"),m=a(9216,32,3,"conv32_3"),p=a(36864,64,3,"conv64_down",!0),d=a(36864,64,3,"conv64_1"),u=a(36864,64,3,"conv64_2"),l=a(36864,64,3,"conv64_3"),g=a(147456,128,3,"conv128_down",!0),P=a(147456,128,3,"conv128_1"),h=a(147456,128,3,"conv128_2"),v=a(589824,256,3,"conv256_down",!0),T=a(589824,256,3,"conv256_1"),F=a(589824,256,3,"conv256_2"),I=a(589824,256,3,"conv256_down_out"),z=G.tidy(()=>G.transpose(G.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:s,conv32_1:i,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:d,conv64_2:u,conv64_3:l,conv128_down:g,conv128_1:P,conv128_2:h,conv256_down:v,conv256_1:T,conv256_2:F,conv256_down_out:I,fc:z},paramMappings:r}}function Yn(o,t){let e=H(o,t);function r(s){let i=e(`${s}/scale/weights`,1),c=e(`${s}/scale/biases`,1);return{weights:i,biases:c}}function n(s){let i=e(`${s}/conv/filters`,4),c=e(`${s}/conv/bias`,1),m=r(s);return{conv:{filters:i,bias:c},scale:m}}function a(s){return{conv1:n(`${s}/conv1`),conv2:n(`${s}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function $o(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Yn(o,t),n=e("conv32_down"),a=r("conv32_1"),s=r("conv32_2"),i=r("conv32_3"),c=r("conv64_down"),m=r("conv64_1"),p=r("conv64_2"),d=r("conv64_3"),u=r("conv128_down"),l=r("conv128_1"),g=r("conv128_2"),P=r("conv256_down"),h=r("conv256_1"),v=r("conv256_2"),T=r("conv256_down_out"),{fc:F}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!Cr(F))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${F}`);let I={conv32_down:n,conv32_1:a,conv32_2:s,conv32_3:i,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:d,conv128_down:u,conv128_1:l,conv128_2:g,conv256_down:P,conv256_1:h,conv256_2:v,conv256_down_out:T,fc:F};return W(o,t),{params:I,paramMappings:t}}var R=y(b());function ot(o,t){let e=Bo(o,t.conv1);return e=oo(e,t.conv2),e=R.add(e,o),e=R.relu(e),e}function Re(o,t){let e=ur(o,t.conv1);e=oo(e,t.conv2);let r=R.avgPool(o,2,2,"valid"),n=R.zeros(r.shape),a=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let i=[...e.shape];i[1]=1;let c=R.zeros(i);e=R.concat([e,c],1);let m=[...e.shape];m[2]=1;let p=R.zeros(m);e=R.concat([e,p],2)}return r=a?R.concat([r,n],3):r,e=R.add(r,e),e=R.relu(e),e}var xe=class extends S{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return nt.tidy(()=>{let r=nt.cast(t.toBatchTensor(150,!0),"float32"),a=rt(r,[122.782,117.001,104.298]).div(255),s=ur(a,e.conv32_down);s=nt.maxPool(s,3,2,"valid"),s=ot(s,e.conv32_1),s=ot(s,e.conv32_2),s=ot(s,e.conv32_3),s=Re(s,e.conv64_down),s=ot(s,e.conv64_1),s=ot(s,e.conv64_2),s=ot(s,e.conv64_3),s=Re(s,e.conv128_down),s=ot(s,e.conv128_1),s=ot(s,e.conv128_2),s=Re(s,e.conv256_down),s=ot(s,e.conv256_1),s=ot(s,e.conv256_2),s=Re(s,e.conv256_down_out);let i=s.mean([1,2]);return nt.matMul(i,e.fc)})}async forward(t){return this.forwardInput(await E(t))}async computeFaceDescriptor(t){var a;if((a=t==null?void 0:t.shape)==null?void 0:a.some(s=>s<=0))return new Float32Array(128);let e=await E(t),r=nt.tidy(()=>nt.unstack(this.forwardInput(e))),n=await Promise.all(r.map(s=>s.data()));return r.forEach(s=>s.dispose()),e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return $o(t)}extractParams(t){return Ro(t)}};function Gn(o){let t=new xe;return t.extractWeights(o),t}function lr(o,t){return{...o,...{descriptor:t}}}function zn(o){return typeof o.age=="number"}function fr(o,t){return{...o,...{age:t}}}function Vn(o){return(o.gender===gt.MALE||o.gender===gt.FEMALE)&&Qt(o.genderProbability)}function hr(o,t,e){return{...o,...{gender:t,genderProbability:e}}}var It=y(b());var at=y(b());function Un(o,t){function e(c,m){let p=at.tensor4d(o(3*3*c),[3,3,c,1]),d=at.tensor1d(o(c)),u=at.tensor1d(o(c)),l=at.tensor1d(o(c)),g=at.tensor1d(o(c));return t.push({paramPath:`${m}/filters`},{paramPath:`${m}/batch_norm_scale`},{paramPath:`${m}/batch_norm_offset`},{paramPath:`${m}/batch_norm_mean`},{paramPath:`${m}/batch_norm_variance`}),{filters:p,batch_norm_scale:d,batch_norm_offset:u,batch_norm_mean:l,batch_norm_variance:g}}function r(c,m,p,d,u){let l=at.tensor4d(o(c*m*p*p),[p,p,c,m]),g=at.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/${u?"batch_norm_offset":"bias"}`}),{filters:l,bias:g}}function n(c,m,p,d){let{filters:u,bias:l}=r(c,m,p,d,!0);return{filters:u,batch_norm_offset:l}}function a(c,m,p){let d=e(c,`${p}/depthwise_conv`),u=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:d,pointwise_conv:u}}function s(){let c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),d=a(128,128,"mobilenetv1/conv_3"),u=a(128,256,"mobilenetv1/conv_4"),l=a(256,256,"mobilenetv1/conv_5"),g=a(256,512,"mobilenetv1/conv_6"),P=a(512,512,"mobilenetv1/conv_7"),h=a(512,512,"mobilenetv1/conv_8"),v=a(512,512,"mobilenetv1/conv_9"),T=a(512,512,"mobilenetv1/conv_10"),F=a(512,512,"mobilenetv1/conv_11"),I=a(512,1024,"mobilenetv1/conv_12"),z=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:P,conv_8:h,conv_9:v,conv_10:T,conv_11:F,conv_12:I,conv_13:z}}function i(){let c=n(1024,256,1,"prediction_layer/conv_0"),m=n(256,512,3,"prediction_layer/conv_1"),p=n(512,128,1,"prediction_layer/conv_2"),d=n(128,256,3,"prediction_layer/conv_3"),u=n(256,128,1,"prediction_layer/conv_4"),l=n(128,256,3,"prediction_layer/conv_5"),g=n(256,64,1,"prediction_layer/conv_6"),P=n(64,128,3,"prediction_layer/conv_7"),h=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),v=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),T=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),F=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),I=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),z=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),tt=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),st=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),X=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Tt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),_t=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Pt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:c,conv_1:m,conv_2:p,conv_3:d,conv_4:u,conv_5:l,conv_6:g,conv_7:P,box_predictor_0:{box_encoding_predictor:h,class_predictor:v},box_predictor_1:{box_encoding_predictor:T,class_predictor:F},box_predictor_2:{box_encoding_predictor:I,class_predictor:z},box_predictor_3:{box_encoding_predictor:tt,class_predictor:st},box_predictor_4:{box_encoding_predictor:X,class_predictor:Tt},box_predictor_5:{box_encoding_predictor:_t,class_predictor:Pt}}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:i}}function Oo(o){let t=[],{extractWeights:e,getRemainingWeights:r}=B(o),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=Un(e,t),s=n(),i=a(),m={extra_dim:at.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:s,prediction_layer:i,output_layer:m},paramMappings:t}}function Xn(o,t){let e=H(o,t);function r(m,p,d){let u=e(`${m}/Conv2d_${p}_pointwise/weights`,4,`${d}/filters`),l=e(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${d}/batch_norm_offset`);return{filters:u,batch_norm_offset:l}}function n(m){let p=`mobilenetv1/conv_${m}`,d=`MobilenetV1/Conv2d_${m}_depthwise`,u=`${p}/depthwise_conv`,l=`${p}/pointwise_conv`,g=e(`${d}/depthwise_weights`,4,`${u}/filters`),P=e(`${d}/BatchNorm/gamma`,1,`${u}/batch_norm_scale`),h=e(`${d}/BatchNorm/beta`,1,`${u}/batch_norm_offset`),v=e(`${d}/BatchNorm/moving_mean`,1,`${u}/batch_norm_mean`),T=e(`${d}/BatchNorm/moving_variance`,1,`${u}/batch_norm_variance`);return{depthwise_conv:{filters:g,batch_norm_scale:P,batch_norm_offset:h,batch_norm_mean:v,batch_norm_variance:T},pointwise_conv:r("MobilenetV1",m,l)}}function a(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:n(1),conv_2:n(2),conv_3:n(3),conv_4:n(4),conv_5:n(5),conv_6:n(6),conv_7:n(7),conv_8:n(8),conv_9:n(9),conv_10:n(10),conv_11:n(11),conv_12:n(12),conv_13:n(13)}}function s(m,p){let d=e(`${m}/weights`,4,`${p}/filters`),u=e(`${m}/biases`,1,`${p}/bias`);return{filters:d,bias:u}}function i(m){let p=s(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),d=s(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:d}}function c(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:i(0),box_predictor_1:i(1),box_predictor_2:i(2),box_predictor_3:i(3),box_predictor_4:i(4),box_predictor_5:i(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function jo(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=Xn(o,t),n=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!ft(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);let a={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:n}};return W(o,t),{params:a,paramMappings:t}}var vt=y(b());var Nt=y(b());function J(o,t,e){return Nt.tidy(()=>{let r=Nt.conv2d(o,t.filters,e,"same");return r=Nt.add(r,t.batch_norm_offset),Nt.clipByValue(r,0,6)})}var Jn=.0010000000474974513;function qn(o,t,e){return vt.tidy(()=>{let r=vt.depthwiseConv2d(o,t.filters,e,"same");return r=vt.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Jn),vt.clipByValue(r,0,6)})}function Zn(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Ho(o,t){return vt.tidy(()=>{let e,r=J(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((a,s)=>{let i=s+1,c=Zn(i);r=qn(r,a.depthwise_conv,c),r=J(r,a.pointwise_conv,[1,1]),i===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function Kn(o,t,e){let r=o.arraySync(),n=Math.min(r[t][0],r[t][2]),a=Math.min(r[t][1],r[t][3]),s=Math.max(r[t][0],r[t][2]),i=Math.max(r[t][1],r[t][3]),c=Math.min(r[e][0],r[e][2]),m=Math.min(r[e][1],r[e][3]),p=Math.max(r[e][0],r[e][2]),d=Math.max(r[e][1],r[e][3]),u=(s-n)*(i-a),l=(p-c)*(d-m);if(u<=0||l<=0)return 0;let g=Math.max(n,c),P=Math.max(a,m),h=Math.min(s,p),v=Math.min(i,d),T=Math.max(h-g,0)*Math.max(v-P,0);return T/(u+l-T)}function Yo(o,t,e,r,n){let a=o.shape[0],s=Math.min(e,a),i=t.map((p,d)=>({score:p,boxIndex:d})).filter(p=>p.score>n).sort((p,d)=>d.score-p.score),c=p=>p<=r?1:0,m=[];return i.forEach(p=>{if(m.length>=s)return;let d=p.score;for(let u=m.length-1;u>=0;--u){let l=Kn(o,p.boxIndex,m[u]);if(l!==0&&(p.score*=c(l),p.score<=n))break}d===p.score&&m.push(p.boxIndex)}),m}var f=y(b());function Qn(o){let t=f.unstack(f.transpose(o,[1,0])),e=[f.sub(t[2],t[0]),f.sub(t[3],t[1])],r=[f.add(t[0],f.div(e[0],2)),f.add(t[1],f.div(e[1],2))];return{sizes:e,centers:r}}function ta(o,t){let{sizes:e,centers:r}=Qn(o),n=f.unstack(f.transpose(t,[1,0])),a=f.div(f.mul(f.exp(f.div(n[2],5)),e[0]),2),s=f.add(f.mul(f.div(n[0],10),e[0]),r[0]),i=f.div(f.mul(f.exp(f.div(n[3],5)),e[1]),2),c=f.add(f.mul(f.div(n[1],10),e[1]),r[1]);return f.transpose(f.stack([f.sub(s,a),f.sub(c,i),f.add(s,a),f.add(c,i)]),[1,0])}function Go(o,t,e){return f.tidy(()=>{let r=o.shape[0],n=ta(f.reshape(f.tile(e.extra_dim,[r,1,1]),[-1,4]),f.reshape(o,[-1,4]));n=f.reshape(n,[r,n.shape[0]/r,4]);let a=f.sigmoid(f.slice(t,[0,0,1],[-1,-1,-1])),s=f.slice(a,[0,0,0],[-1,-1,1]);s=f.reshape(s,[r,s.shape[1]]);let i=f.unstack(n),c=f.unstack(s);return{boxes:i,scores:c}})}var Oe=y(b());var $e=y(b());function zt(o,t){return $e.tidy(()=>{let e=o.shape[0],r=$e.reshape(Yt(o,t.box_encoding_predictor),[e,-1,1,4]),n=$e.reshape(Yt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:n}})}function zo(o,t,e){return Oe.tidy(()=>{let r=J(o,e.conv_0,[1,1]),n=J(r,e.conv_1,[2,2]),a=J(n,e.conv_2,[1,1]),s=J(a,e.conv_3,[2,2]),i=J(s,e.conv_4,[1,1]),c=J(i,e.conv_5,[2,2]),m=J(c,e.conv_6,[1,1]),p=J(m,e.conv_7,[2,2]),d=zt(t,e.box_predictor_0),u=zt(o,e.box_predictor_1),l=zt(n,e.box_predictor_2),g=zt(s,e.box_predictor_3),P=zt(c,e.box_predictor_4),h=zt(p,e.box_predictor_5),v=Oe.concat([d.boxPredictionEncoding,u.boxPredictionEncoding,l.boxPredictionEncoding,g.boxPredictionEncoding,P.boxPredictionEncoding,h.boxPredictionEncoding],1),T=Oe.concat([d.classPrediction,u.classPrediction,l.classPrediction,g.classPrediction,P.classPrediction,h.classPrediction],1);return{boxPredictions:v,classPredictions:T}})}var q=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var Vt=class extends S{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return It.tidy(()=>{let r=It.cast(t.toBatchTensor(512,!1),"float32"),n=It.sub(It.div(r,127.5),1),a=Ho(n,e.mobilenetv1),{boxPredictions:s,classPredictions:i}=zo(a.out,a.conv11,e.prediction_layer);return Go(s,i,e.output_layer)})}async forward(t){return this.forwardInput(await E(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:n}=new q(e),a=await E(t),{boxes:s,scores:i}=this.forwardInput(a),c=s[0],m=i[0];for(let F=1;F<s.length;F++)s[F].dispose(),i[F].dispose();let p=Array.from(m.dataSync()),u=Yo(c,p,r,.5,n),l=a.getReshapedInputDimensions(0),g=a.inputSize,P=g/l.width,h=g/l.height,v=c.arraySync(),T=u.map(F=>{let[I,z]=[Math.max(0,v[F][0]),Math.min(1,v[F][2])].map(X=>X*h),[tt,st]=[Math.max(0,v[F][1]),Math.min(1,v[F][3])].map(X=>X*P);return new M(p[F],new ee(tt,I,st-tt,z-I),{height:a.getInputHeight(0),width:a.getInputWidth(0)})});return c.dispose(),m.dispose(),T}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return jo(t)}extractParams(t){return Oo(t)}};function Vo(o){let t=new Vt;return t.extractWeights(o),t}function ea(o){return Vo(o)}var Uo=class extends Vt{};var Xo=.4,Jo=[new x(.738768,.874946),new x(2.42204,2.65704),new x(4.30971,7.04493),new x(10.246,4.59428),new x(12.6868,11.8741)],qo=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],Zo=[117.001,114.697,97.404],Ko="tiny_yolov2_model",Qo="tiny_yolov2_separable_conv_model";var N=y(b());var xr=o=>typeof o=="number";function no(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!xr(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>xr(t.x)&&xr(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(xr)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}var K=y(b());var Z=y(b());function be(o){return Z.tidy(()=>{let t=Z.mul(o,Z.scalar(.10000000149011612));return Z.add(Z.relu(Z.sub(o,t)),t)})}function yt(o,t){return K.tidy(()=>{let e=K.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=K.conv2d(e,t.conv.filters,[1,1],"valid"),e=K.sub(e,t.bn.sub),e=K.mul(e,t.bn.truediv),e=K.add(e,t.conv.bias),be(e)})}var Lt=y(b());function Ft(o,t){return Lt.tidy(()=>{let e=Lt.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=Lt.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=Lt.add(e,t.bias),be(e)})}var ao=y(b());function ra(o,t){let e=se(o,t);function r(s,i){let c=ao.tensor1d(o(s)),m=ao.tensor1d(o(s));return t.push({paramPath:`${i}/sub`},{paramPath:`${i}/truediv`}),{sub:c,truediv:m}}function n(s,i,c){let m=e(s,i,3,`${c}/conv`),p=r(i,`${c}/bn`);return{conv:m,bn:p}}let a=ie(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function tn(o,t,e,r){let{extractWeights:n,getRemainingWeights:a}=B(o),s=[],{extractConvParams:i,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=ra(n,s),p;if(t.withSeparableConvs){let[d,u,l,g,P,h,v,T,F]=r,I=t.isFirstLayerConv2d?i(d,u,3,"conv0"):m(d,u,"conv0"),z=m(u,l,"conv1"),tt=m(l,g,"conv2"),st=m(g,P,"conv3"),X=m(P,h,"conv4"),Tt=m(h,v,"conv5"),_t=T?m(v,T,"conv6"):void 0,Pt=F?m(T,F,"conv7"):void 0,Kt=i(F||T||v,5*e,1,"conv8");p={conv0:I,conv1:z,conv2:tt,conv3:st,conv4:X,conv5:Tt,conv6:_t,conv7:Pt,conv8:Kt}}else{let[d,u,l,g,P,h,v,T,F]=r,I=c(d,u,"conv0"),z=c(u,l,"conv1"),tt=c(l,g,"conv2"),st=c(g,P,"conv3"),X=c(P,h,"conv4"),Tt=c(h,v,"conv5"),_t=c(v,T,"conv6"),Pt=c(T,F,"conv7"),Kt=i(F,5*e,1,"conv8");p={conv0:I,conv1:z,conv2:tt,conv3:st,conv4:X,conv5:Tt,conv6:_t,conv7:Pt,conv8:Kt}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:s}}function oa(o,t){let e=H(o,t);function r(i){let c=e(`${i}/sub`,1),m=e(`${i}/truediv`,1);return{sub:c,truediv:m}}function n(i){let c=e(`${i}/filters`,4),m=e(`${i}/bias`,1);return{filters:c,bias:m}}function a(i){let c=n(`${i}/conv`),m=r(`${i}/bn`);return{conv:c,bn:m}}let s=ce(e);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function en(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=oa(o,e),s;if(t.withSeparableConvs){let i=t.filterSizes&&t.filterSizes.length||9;s={conv0:t.isFirstLayerConv2d?r("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:i>7?a("conv6"):void 0,conv7:i>8?a("conv7"):void 0,conv8:r("conv8")}}else s={conv0:n("conv0"),conv1:n("conv1"),conv2:n("conv2"),conv3:n("conv3"),conv4:n("conv4"),conv5:n("conv5"),conv6:n("conv6"),conv7:n("conv7"),conv8:r("conv8")};return W(o,e),{params:s,paramMappings:e}}var ut=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var so=class extends S{constructor(t){super("TinyYolov2");no(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=yt(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=yt(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=yt(r,e.conv6),r=yt(r,e.conv7),Yt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?be(Yt(t,e.conv0,"valid",!1)):Ft(t,e.conv0);return r=N.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv1),r=N.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv2),r=N.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv3),r=N.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv4),r=N.maxPool(r,[2,2],[2,2],"same"),r=Ft(r,e.conv5),r=N.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?Ft(r,e.conv6):r,r=e.conv7?Ft(r,e.conv7):r,Yt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return N.tidy(()=>{let n=N.cast(t.toBatchTensor(e,!1),"float32");return n=this.config.meanRgb?rt(n,this.config.meanRgb):n,n=n.div(255),this.config.withSeparableConvs?this.runMobilenet(n,r):this.runTinyYolov2(n,r)})}async forward(t,e){return this.forwardInput(await E(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:n}=new ut(e),a=await E(t),s=await this.forwardInput(a,r),i=N.tidy(()=>N.unstack(s)[0].expandDims()),c={width:a.getInputWidth(0),height:a.getInputHeight(0)},m=await this.extractBoxes(i,a.getReshapedInputDimensions(0),n);s.dispose(),i.dispose();let p=m.map(h=>h.box),d=m.map(h=>h.score),u=m.map(h=>h.classScore),l=m.map(h=>this.config.classes[h.label]);return Sr(p.map(h=>h.rescale(r)),d,this.config.iouThreshold,!0).map(h=>new wt(d[h],u[h],l[h],p[h],c))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return en(t,this.config)}extractParams(t){let e=this.config.filterSizes||so.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return tn(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:n,height:a}=e,s=Math.max(n,a),i=s/n,c=s/a,m=t.shape[1],p=this.config.anchors.length,[d,u,l]=N.tidy(()=>{let v=t.reshape([m,m,p,this.boxEncodingSize]),T=v.slice([0,0,0,0],[m,m,p,4]),F=v.slice([0,0,0,4],[m,m,p,1]),I=this.withClassScores?N.softmax(v.slice([0,0,0,5],[m,m,p,this.config.classes.length]),3):N.scalar(0);return[T,F,I]}),g=[],P=await u.array(),h=await d.array();for(let v=0;v<m;v++)for(let T=0;T<m;T++)for(let F=0;F<p;F++){let I=De(P[v][T][F][0]);if(!r||I>r){let z=(T+De(h[v][T][F][0]))/m*i,tt=(v+De(h[v][T][F][1]))/m*c,st=Math.exp(h[v][T][F][2])*this.config.anchors[F].x/m*i,X=Math.exp(h[v][T][F][3])*this.config.anchors[F].y/m*c,Tt=z-st/2,_t=tt-X/2,Pt={row:v,col:T,anchor:F},{classScore:Kt,label:uo}=this.withClassScores?await this.extractPredictedClass(l,Pt):{classScore:1,label:0};g.push({box:new te(Tt,_t,Tt+st,_t+X),score:I,classScore:I*Kt,label:uo,...Pt})}}return d.dispose(),u.dispose(),l.dispose(),g}async extractPredictedClass(t,e){let{row:r,col:n,anchor:a}=e,s=await t.array();return Array(this.config.classes.length).fill(0).map((i,c)=>s[r][n][a][c]).map((i,c)=>({classScore:i,label:c})).reduce((i,c)=>i.classScore>c.classScore?i:c)}},ge=so;ge.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var ve=class extends ge{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Xo,classes:["face"],...t?{anchors:qo,meanRgb:Zo}:{anchors:Jo,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?Qo:Ko}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function na(o,t=!0){let e=new ve(t);return e.extractWeights(o),e}var br=class extends ut{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var Q=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var je=y(b());var io=y(b());async function Ut(o,t,e,r,n=({alignedRect:a})=>a){let a=o.map(c=>Gt(c)?n(c):c.detection),s=r||(t instanceof io.Tensor?await ne(t,a):await oe(t,a)),i=await e(s);return s.forEach(c=>c instanceof io.Tensor&&c.dispose()),i}async function ye(o,t,e,r,n){return Ut([o],t,async a=>e(a[0]),r,n)}var rn=.4,on=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],nn=[117.001,114.697,97.404];var Fe=class extends ge{constructor(){let t={withSeparableConvs:!0,iouThreshold:rn,classes:["face"],anchors:on,meanRgb:nn,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(n=>new M(n.score,n.relativeBox,{width:n.imageWidth,height:n.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var _={ssdMobilenetv1:new Vt,tinyFaceDetector:new Fe,tinyYolov2:new ve,faceLandmark68Net:new le,faceLandmark68TinyNet:new pr,faceRecognitionNet:new xe,faceExpressionNet:new ir,ageGenderNet:new mr},an=(o,t)=>_.ssdMobilenetv1.locateFaces(o,t),aa=(o,t)=>_.tinyFaceDetector.locateFaces(o,t),sa=(o,t)=>_.tinyYolov2.locateFaces(o,t),sn=o=>_.faceLandmark68Net.detectLandmarks(o),ia=o=>_.faceLandmark68TinyNet.detectLandmarks(o),ca=o=>_.faceRecognitionNet.computeFaceDescriptor(o),ma=o=>_.faceExpressionNet.predictExpressions(o),pa=o=>_.ageGenderNet.predictAgeAndGender(o),cn=o=>_.ssdMobilenetv1.load(o),da=o=>_.tinyFaceDetector.load(o),ua=o=>_.tinyYolov2.load(o),la=o=>_.faceLandmark68Net.load(o),fa=o=>_.faceLandmark68TinyNet.load(o),ha=o=>_.faceRecognitionNet.load(o),xa=o=>_.faceExpressionNet.load(o),ba=o=>_.ageGenderNet.load(o),ga=cn,va=an,ya=sn;var co=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Pe=class extends co{async run(){let t=await this.parentTask,e=await Ut(t,this.input,async r=>Promise.all(r.map(n=>_.faceExpressionNet.predictExpressions(n))),this.extractedFaces);return t.map((r,n)=>cr(r,e[n]))}withAgeAndGender(){return new Te(this,this.input)}},we=class extends co{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>_.faceExpressionNet.predictExpressions(r),this.extractedFaces);return cr(t,e)}withAgeAndGender(){return new _e(this,this.input)}},qt=class extends Pe{withAgeAndGender(){return new Xt(this,this.input)}withFaceDescriptors(){return new kt(this,this.input)}},Zt=class extends we{withAgeAndGender(){return new Jt(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var mo=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},Te=class extends mo{async run(){let t=await this.parentTask,e=await Ut(t,this.input,async r=>Promise.all(r.map(n=>_.ageGenderNet.predictAgeAndGender(n))),this.extractedFaces);return t.map((r,n)=>{let{age:a,gender:s,genderProbability:i}=e[n];return fr(hr(r,s,i),a)})}withFaceExpressions(){return new Pe(this,this.input)}},_e=class extends mo{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:n}=await ye(t,this.input,a=>_.ageGenderNet.predictAgeAndGender(a),this.extractedFaces);return fr(hr(t,r,n),e)}withFaceExpressions(){return new we(this,this.input)}},Xt=class extends Te{withFaceExpressions(){return new qt(this,this.input)}withFaceDescriptors(){return new kt(this,this.input)}},Jt=class extends _e{withFaceExpressions(){return new Zt(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var gr=class extends Q{constructor(t,e){super();this.parentTask=t;this.input=e}},kt=class extends gr{async run(){let t=await this.parentTask;return(await Ut(t,this.input,r=>Promise.all(r.map(n=>_.faceRecognitionNet.computeFaceDescriptor(n))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,n)=>lr(t[n],r))}withFaceExpressions(){return new qt(this,this.input)}withAgeAndGender(){return new Xt(this,this.input)}},St=class extends gr{async run(){let t=await this.parentTask;if(!t)return;let e=await ye(t,this.input,r=>_.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return lr(t,e)}withFaceExpressions(){return new Zt(this,this.input)}withAgeAndGender(){return new Jt(this,this.input)}};var vr=class extends Q{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?_.faceLandmark68TinyNet:_.faceLandmark68Net}},yr=class extends vr{async run(){let t=await this.parentTask,e=t.map(a=>a.detection),r=this.input instanceof je.Tensor?await ne(this.input,e):await oe(this.input,e),n=await Promise.all(r.map(a=>this.landmarkNet.detectLandmarks(a)));return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),t.map((a,s)=>ue(a,n[s]))}withFaceExpressions(){return new qt(this,this.input)}withAgeAndGender(){return new Xt(this,this.input)}withFaceDescriptors(){return new kt(this,this.input)}},Fr=class extends vr{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof je.Tensor?await ne(this.input,[e]):await oe(this.input,[e]),n=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(a=>a instanceof je.Tensor&&a.dispose()),ue(t,n)}withFaceExpressions(){return new Zt(this,this.input)}withAgeAndGender(){return new Jt(this,this.input)}withFaceDescriptor(){return new St(this,this.input)}};var Tr=class extends Q{constructor(t,e=new q){super();this.input=t;this.options=e}},He=class extends Tr{async run(){let{input:t,options:e}=this,r;if(e instanceof br)r=_.tinyFaceDetector.locateFaces(t,e);else if(e instanceof q)r=_.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof ut)r=_.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>Rt({},r)))})}withFaceLandmarks(t=!1){return new yr(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new Pe(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Te(this.runAndExtendWithFaceDetections(),this.input)}},_r=class extends Tr{async run(){let t=await new He(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?Rt({},e):void 0)})}withFaceLandmarks(t=!1){return new Fr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new we(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new _e(this.runAndExtendWithFaceDetection(),this.input)}};function Fa(o,t=new q){return new _r(o,t)}function Pr(o,t=new q){return new He(o,t)}async function mn(o,t){return Pr(o,new q(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function Ta(o,t={}){return Pr(o,new ut(t)).withFaceLandmarks().withFaceDescriptors()}var _a=mn;function po(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((n,a)=>n-r[a]).reduce((n,a)=>n+a**2,0))}var wr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let n=1,a=()=>`person ${n++}`;this._labeledDescriptors=r.map(s=>{if(s instanceof ht)return s;if(s instanceof Float32Array)return new ht(a(),[s]);if(s.descriptor&&s.descriptor instanceof Float32Array)return new ht(a(),[s.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array | Array<LabeledFaceDescriptors | WithFaceDescriptor<any> | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>po(r,t)).reduce((r,n)=>r+n,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new Ee(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distance<r.distance?e:r)}findBestMatch(t){let e=this.matchDescriptor(t);return e.distance<this.distanceThreshold?e:new Ee("unknown",e.distance)}toJSON(){return{distanceThreshold:this.distanceThreshold,labeledDescriptors:this.labeledDescriptors.map(t=>t.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>ht.fromJSON(r));return new wr(e,t.distanceThreshold)}};function Pa(o){let t=new Fe;return t.extractWeights(o),t}function pn(o,t){let{width:e,height:r}=new A(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(n=>pn(n,{width:e,height:r}));if(Gt(o)){let n=o.detection.forSize(e,r),a=o.unshiftedLandmarks.forSize(n.box.width,n.box.height);return ue(Rt(o,n),a)}return mt(o)?Rt(o,o.detection.forSize(e,r)):o instanceof U||o instanceof M?o.forSize(e,r):o}var Da=typeof process!="undefined",Ea=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",Ma={faceapi:Eo,node:Da,browser:Ea};0&&(module.exports={AgeGenderNet,BoundingBox,Box,ComposableTask,ComputeAllFaceDescriptorsTask,ComputeFaceDescriptorsTaskBase,ComputeSingleFaceDescriptorTask,DetectAllFaceLandmarksTask,DetectAllFacesTask,DetectFaceLandmarksTaskBase,DetectFacesTaskBase,DetectSingleFaceLandmarksTask,DetectSingleFaceTask,Dimensions,FACE_EXPRESSION_LABELS,FaceDetection,FaceDetectionNet,FaceExpressionNet,FaceExpressions,FaceLandmark68Net,FaceLandmark68TinyNet,FaceLandmarkNet,FaceLandmarks,FaceLandmarks5,FaceLandmarks68,FaceMatch,FaceMatcher,FaceRecognitionNet,Gender,LabeledBox,LabeledFaceDescriptors,NetInput,NeuralNetwork,ObjectDetection,Point,PredictedBox,Rect,SsdMobilenetv1,SsdMobilenetv1Options,TinyFaceDetector,TinyFaceDetectorOptions,TinyYolov2,TinyYolov2Options,allFaces,allFacesSsdMobilenetv1,allFacesTinyYolov2,awaitMediaLoaded,bufferToImage,computeFaceDescriptor,createCanvas,createCanvasFromMedia,createFaceDetectionNet,createFaceRecognitionNet,createSsdMobilenetv1,createTinyFaceDetector,createTinyYolov2,detectAllFaces,detectFaceLandmarks,detectFaceLandmarksTiny,detectLandmarks,detectSingleFace,draw,env,euclideanDistance,extendWithAge,extendWithFaceDescriptor,extendWithFaceDetection,extendWithFaceExpressions,extendWithFaceLandmarks,extendWithGender,extractFaceTensors,extractFaces,fetchImage,fetchJson,fetchNetWeights,fetchOrThrow,getContext2dOrThrow,getMediaDimensions,imageTensorToCanvas,imageToSquare,inverseSigmoid,iou,isMediaElement,isMediaLoaded,isWithAge,isWithFaceDetection,isWithFaceExpressions,isWithFaceLandmarks,isWithGender,loadAgeGenderModel,loadFaceDetectionModel,loadFaceExpressionModel,loadFaceLandmarkModel,loadFaceLandmarkTinyModel,loadFaceRecognitionModel,loadSsdMobilenetv1Model,loadTinyFaceDetectorModel,loadTinyYolov2Model,loadWeightMap,locateFaces,matchDimensions,minBbox,nets,nonMaxSuppression,normalize,padToSquare,predictAgeAndGender,recognizeFaceExpressions,resizeResults,resolveInput,shuffleArray,sigmoid,ssdMobilenetv1,tf,tinyFaceDetector,tinyYolov2,toNetInput,utils,validateConfig,version});
//# sourceMappingURL=face-api.node.js.map