diff --git a/build/package.json b/build/package.json index fd1ed76..7969feb 100644 --- a/build/package.json +++ b/build/package.json @@ -1,10 +1,10 @@ { "name": "@vladmandic/face-api", - "version": "0.7.2", + "version": "0.7.3", "description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS", "main": "dist/face-api.esm.js", "module": "dist/face-api.esm.js", - "browser": "dist/face-api.js", + "browser": "dist/face-api.esm.js", "typings": "build/src/index.d.ts", "engines": { "node": ">=12.0.0" @@ -13,7 +13,8 @@ "scripts": { "build-esm": "esbuild --bundle --format=esm --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.esm.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs src/index.ts", "build-iife": "esbuild --bundle --format=iife --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs --global-name=faceapi src/index.ts", - "build": "rimraf build/* dist/* && tsc && npm run build-esm && npm run build-iife && ls -l dist/" + "build-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.nobundle.js --log-level=error --tsconfig=./tsconfig.json --external:@tensorflow --external:util --external:string_decoder --external:fs --global-name=faceapi src/index.ts", + "build": "rimraf build/* dist/* && tsc && npm run build-esm && npm run build-iife && npm run build-nobundle && ls -l dist/" }, "keywords": [ "tensorflow", diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index 7a037df..f3f3ff0 100644 --- a/dist/face-api.esm.js +++ b/dist/face-api.esm.js @@ -3819,7 +3819,7 @@ return a / b;`,$6=` `)}function l7(r,l,u,p){const g=qt(l),f=p[p.length-1],I=new Array(f).fill(0),S=l.length,x=u==="complex64"?du(r):r;if(S>1)for(let v=0;vfR){const oe=hu*I;let ge=Array.from(r.slice(0,oe)),fe=Array.from(r.slice((S-hu)*I,S*I));return u==="complex64"&&(ge=du(ge),fe=du(fe)),["["+ge.map((Ae,Te)=>uu(Ae,g[Te],u)).join(", ")+", ..., "+fe.map((Ae,Te)=>uu(Ae,g[S-hu+Te],u)).join(", ")+"]"]}const te=u==="complex64"?du(r):Array.from(r);return["["+te.map((oe,ge)=>uu(oe,g[ge],u)).join(", ")+"]"]}const v=l.slice(1),O=p.slice(1),C=p[0]*I,U=[];if(S>fR){for(let te=0;te`Length of values '${p}' does not match the size inferred by the shape '${this.size}'.`)}if(l==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=u||oR(l,this.size),this.strides=lu(r)}set(r,...l){l.length===0&&(l=[0]),Z(l.length===this.rank,()=>`The number of provided coordinates (${l.length}) must match the rank (${this.rank})`);const u=this.locToIndex(l);this.values[u]=r}get(...r){r.length===0&&(r=[0]);let l=0;for(const p of r){if(p<0||p>=this.shape[l]){const g=`Requested out of range element at ${r}. Buffer shape=${this.shape}`;throw new Error(g)}l++}let u=r[r.length-1];for(let p=0;pUS(u))}catch(u){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return r}dataSync(){this.throwIfDisposed();const r=Mi().readSync(this.dataId);if(this.dtype==="string")try{return r.map(l=>US(l))}catch(l){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return r}async bytes(){this.throwIfDisposed();const r=await Mi().read(this.dataId);return this.dtype==="string"?r:new Uint8Array(r.buffer)}dispose(){if(this.isDisposed)return;Mi().disposeTensor(this),this.isDisposedInternal=!0}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(r=!1){return Ic.print(this,r)}clone(){return this.throwIfDisposed(),Ic.clone(this)}toString(r=!1){const l=this.dataSync();return gR(l,this.shape,this.dtype,r)}cast(r){return this.throwIfDisposed(),Ic.cast(this,r)}variable(r=!0,l,u){return this.throwIfDisposed(),Mi().makeVariable(this,r,l,u)}}Object.defineProperty(In,Symbol.hasInstance,{value:r=>!!r&&r.data!=null&&r.dataSync!=null&&r.throwIfDisposed!=null});class If extends In{constructor(r,l,u,p){super(r.shape,r.dtype,r.dataId,p);this.trainable=l,this.name=u}assign(r){if(r.dtype!==this.dtype)throw new Error(`dtype of the new value (${r.dtype}) and previous value (${this.dtype}) must match`);if(!Ho(r.shape,this.shape))throw new Error(`shape of the new value (${r.shape}) and previous value (${this.shape}) must match`);Mi().disposeTensor(this),this.dataId=r.dataId,Mi().incRef(this,null)}dispose(){Mi().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(If,Symbol.hasInstance,{value:r=>r instanceof In&&r.assign!=null&&r.assign instanceof Function});var IR;(function(r){r.R0="R0",r.R1="R1",r.R2="R2",r.R3="R3",r.R4="R4",r.R5="R5",r.R6="R6"})(IR||(IR={}));var MS;(function(r){r.float32="float32",r.int32="int32",r.bool="int32",r.complex64="complex64"})(MS||(MS={}));var PS;(function(r){r.float32="float32",r.int32="int32",r.bool="bool",r.complex64="complex64"})(PS||(PS={}));var zS;(function(r){r.float32="float32",r.int32="float32",r.bool="float32",r.complex64="complex64"})(zS||(zS={}));var GS;(function(r){r.float32="complex64",r.int32="complex64",r.bool="complex64",r.complex64="complex64"})(GS||(GS={}));const u7={float32:zS,int32:MS,bool:PS,complex64:GS};function xR(r,l){if(r==="string"||l==="string"){if(r==="string"&&l==="string")return"string";throw new Error(`Can not upcast ${r} with ${l}`)}return u7[r][l]}function mt(r,l){if(r.dtype===l.dtype)return[r,l];const u=xR(r.dtype,l.dtype);return[r.cast(u),l.cast(u)]}function xf(r){const l=[],u=new Set;return TR(r,l,u),l}function TR(r,l,u){if(r==null)return;if(r instanceof In){l.push(r);return}if(!d7(r))return;const p=r;for(const g in p){const f=p[g];u.has(f)||(u.add(f),TR(f,l,u))}}function d7(r){return Array.isArray(r)||typeof r=="object"}class AR{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null}}dispose(){for(const r in this.registeredVariables)this.registeredVariables[r].dispose()}}class pu{constructor(r){this.ENV=r,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new AR}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;const r=this.getSortedBackends();for(let l=0;l{l.setupFunc!=null&&l.setupFunc(this.backendInstance)})}disposeRegisteredKernels(r){const l=FS(r);l.forEach(u=>{u.disposeFunc!=null&&u.disposeFunc(this.registry[r])})}initializeBackend(r){const l=this.registryFactory[r];if(l==null)throw new Error(`Cannot initialize backend ${r}, no registration found.`);try{const u=l.factory();if(u&&!(u instanceof CC)&&typeof u.then=="function"){const p=++this.pendingBackendInitId,g=u.then(f=>p(pthis.registryFactory[l].priority-this.registryFactory[r].priority)}initializeBackendsAndReturnBest(){const r=this.getSortedBackends();for(let l=0;lthis.startScope(u),()=>this.endScope(p),()=>(p=l(),p instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),p))}scopedRun(r,l,u){r();try{const p=u();return l(),p}catch(p){throw l(),p}}nextTensorId(){return pu.nextTensorId++}nextVariableId(){return pu.nextVariableId++}clone(r){const l=this.makeTensorFromDataId(r.dataId,r.shape,r.dtype),u={x:r},p=f=>({x:()=>{const I="float32",S={x:f},x={dtype:I};return Y.runKernelFunc(v=>v.cast(f,I),S,null,bc,x)}}),g=[];return this.addTapeNode(this.state.activeScope.name,u,[l],p,g,{}),l}runKernel(r,l,u,p,g){const f=null,I=null;return this.runKernelFunc(f,l,I,r,u,p,g)}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(r,l,u){const p=this.backend.numDataIds();let g=0;u.forEach(S=>{g+=S.dtype==="complex64"?3:1});const f=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],I=p-l-g-f;if(I>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${I} data ids) after running '${r}'`)}runKernelFunc(r,l,u,p,g,f,I){let S,x=[];const v=this.isTapeOn();p==null&&(p=this.state.activeScope!=null?this.state.activeScope.name:"");const O=this.state.numBytes,C=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let U;const G=yf(p,this.backendName);let ne;if(G!=null)U=()=>{const oe=this.backend.numDataIds();ne=G.kernelFunc({inputs:l,attrs:g,backend:this.backend});const ge=Array.isArray(ne)?ne:[ne];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,oe,ge);const fe=ge.map(({dataId:Ae,shape:Te,dtype:Ve})=>this.makeTensorFromDataId(Ae,Te,Ve));if(v){let Ae=this.getTensorsForGradient(p,l,fe);if(Ae==null){I==null&&(I=[]);const Te=fe.filter((Ve,rt)=>I[rt]);Ae=(f||[]).slice().concat(Te)}x=this.saveTensorsForBackwardMode(Ae)}return fe};else{const oe=ge=>{if(!v)return;x=ge.map(fe=>this.keep(this.clone(fe)))};U=()=>{const ge=this.backend.numDataIds();ne=this.tidy(()=>r(this.backend,oe));const fe=Array.isArray(ne)?ne:[ne];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,ge,fe),fe}}let te;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?S=U():(te=this.profiler.profileKernel(p,l,()=>U()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(te),S=te.outputs)}),v&&this.addTapeNode(p,l,S,u,x,g),this.state.profiling&&this.state.activeProfile.kernels.push({name:p,bytesAdded:this.state.numBytes-O,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-C,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map(oe=>l[oe]!=null?l[oe].shape:null),outputShapes:S.map(oe=>oe.shape),kernelTimeMs:te.timeMs,extraInfo:te.extraInfo}),Array.isArray(ne)?S:S[0]}saveTensorsForBackwardMode(r){const l=r.map(u=>this.keep(this.clone(u)));return l}getTensorsForGradient(r,l,u){const p=kS(r);if(p!=null){const g=p.inputsToSave||[],f=p.outputsToSave||[];let I;p.saveAllInputs?(Z(Array.isArray(l),()=>"saveAllInputs is true, expected inputs to be an array."),I=Object.keys(l).map(x=>l[x])):I=g.map(x=>l[x]);const S=u.filter((x,v)=>f[v]);return I.concat(S)}return null}makeTensor(r,l,u,p){if(r==null)throw new Error("Values passed to engine.makeTensor() are null");u=u||"float32",p=p||this.backend;let g=r;u==="string"&&au(r[0])&&(g=r.map(S=>uR(S)));const f=p.write(g,l,u),I=new In(l,u,f,this.nextTensorId());if(this.incRef(I,p),u==="string"){const S=this.state.tensorInfo.get(f),x=lR(g);this.state.numBytes+=x-S.bytes,S.bytes=x}return I}makeTensorFromDataId(r,l,u,p){u=u||"float32";const g=new In(l,u,r,this.nextTensorId());return this.incRef(g,p),g}makeVariable(r,l=!0,u,p){u=u||this.nextVariableId().toString(),p!=null&&p!==r.dtype&&(r=r.cast(p));const g=new If(r,l,u,this.nextTensorId());if(this.state.registeredVariables[g.name]!=null)throw new Error(`Variable with name ${g.name} was already registered`);return this.state.registeredVariables[g.name]=g,this.incRef(g,this.backend),g}incRef(r,l){const u=this.state.tensorInfo.has(r.dataId)?this.state.tensorInfo.get(r.dataId).refCount:0;if(this.state.numTensors++,r.dtype==="string"&&this.state.numStringTensors++,u===0){this.state.numDataBuffers++;let p=0;r.dtype!=="complex64"&&r.dtype!=="string"&&(p=r.size*cR(r.dtype)),this.state.tensorInfo.set(r.dataId,{backend:l||this.backend,dtype:r.dtype,shape:r.shape,bytes:p,refCount:0}),this.state.numBytes+=p}this.state.tensorInfo.get(r.dataId).refCount++,r instanceof If||this.track(r)}disposeTensor(r){if(!this.state.tensorInfo.has(r.dataId))return;this.state.numTensors--,r.dtype==="string"&&this.state.numStringTensors--;const l=this.state.tensorInfo.get(r.dataId),u=l.refCount;u<=1?(r.dtype!=="complex64"&&(this.state.numBytes-=l.bytes),this.state.numDataBuffers--,l.backend.disposeData(r.dataId),this.state.tensorInfo.delete(r.dataId)):this.state.tensorInfo.get(r.dataId).refCount--}disposeVariables(){for(const r in this.state.registeredVariables){const l=this.state.registeredVariables[r];this.disposeVariable(l)}}disposeVariable(r){this.disposeTensor(r),this.state.registeredVariables[r.name]!=null&&delete this.state.registeredVariables[r.name]}memory(){const r=this.backend.memory();return r.numTensors=this.state.numTensors,r.numDataBuffers=this.state.numDataBuffers,r.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(r.unreliable=!0,r.reasons==null&&(r.reasons=[]),r.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),r}async profile(r){this.state.profiling=!0;const l=this.state.numBytes,u=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await r(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(p=>p.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-l,this.state.activeProfile.newTensors=this.state.numTensors-u;for(const p of this.state.activeProfile.kernels)p.kernelTimeMs=await p.kernelTimeMs,p.extraInfo=await p.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(r,l,u,p,g,f){const I={id:this.state.nextTapeNodeId++,kernelName:r,inputs:l,outputs:u,saved:g},S=kS(r);S!=null&&(p=S.gradFunc),p!=null&&(I.gradient=x=>(x=x.map((v,O)=>{if(v==null){const C=u[O],U=qo(C.size,C.dtype);return this.makeTensor(U,C.shape,C.dtype)}return v}),p(x.length>1?x:x[0],g,f))),this.state.activeTape.push(I)}keep(r){return r.kept=!0,r}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(r){const l={track:[],name:"unnamed scope",id:this.state.nextScopeId++};r&&(l.name=r),this.state.scopeStack.push(l),this.state.activeScope=l}endScope(r){const l=xf(r),u=new Set(l.map(g=>g.id));for(let g=0;g{!g.kept&&g.scopeId===p.id&&this.track(g)})}gradients(r,l,u,p=!1){if(Z(l.length>0,()=>"gradients() received an empty list of xs."),u!=null&&u.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${u.dtype}'`);const g=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",r));Z(g instanceof In,()=>"The result y returned by f() must be a tensor.");const f=pR(this.state.activeTape,l,g);if(!p&&f.length===0&&l.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{const I={};I[g.id]=u==null?p7(g.shape):u,mR(I,f,x=>this.tidy(x),m7);const S=l.map(x=>I[x.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(x=>{for(const v of x.saved)v.dispose()}),this.state.activeTape=null),{value:g,grads:S}})}customGrad(r){return Z(_S(r),()=>"The f passed in customGrad(f) must be a function."),(...l)=>{Z(l.every(g=>g instanceof In),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let u;const p={};return l.forEach((g,f)=>{p[f]=g}),this.runKernelFunc((g,f)=>(u=r(...l,f),Z(u.value instanceof In,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),Z(_S(u.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),u.value),p,(g,f)=>{const I=u.gradFunc(g,f),S=Array.isArray(I)?I:[I];Z(S.length===l.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),Z(S.every(v=>v instanceof In),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");const x={};return S.forEach((v,O)=>{x[O]=()=>v}),x})}}readSync(r){const l=this.state.tensorInfo.get(r);return l.backend.readSync(r)}read(r){const l=this.state.tensorInfo.get(r);return l.backend.read(r)}async time(r){const l=$S(),u=await this.backend.time(r);return u.wallMs=$S()-l,u}track(r){return this.state.activeScope!=null&&(r.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(r)),r}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new AR;for(const r in this.registry)this.disposeRegisteredKernels(r),this.registry[r].dispose(),delete this.registry[r];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}pu.nextTensorId=0;pu.nextVariableId=0;function p7(r){const l=wf(qt(r),"float32");return Y.makeTensor(l,r,"float32")}function VS(){const r=RS();if(r._tfengine==null){const l=new OC(r);r._tfengine=new pu(l)}return DC(r._tfengine.ENV),wR(()=>r._tfengine),r._tfengine}const Y=VS();function m7(r,l){const u={a:r,b:l};return Y.runKernelFunc((p,g)=>{const f=p.add(r,l);return g([r,l]),f},u,null,yc)}function vR(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}const hr=Cs();hr.registerFlag("DEBUG",()=>!1,r=>{r&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});hr.registerFlag("IS_BROWSER",()=>vR());hr.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");hr.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));hr.registerFlag("PROD",()=>!1);hr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>hr.getBool("DEBUG"));hr.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);hr.registerFlag("IS_TEST",()=>!1);function ur(r,l){let u=r;if(Rs(r))return l==="string"?[]:[r.length];if(!Array.isArray(r))return[];const p=[];for(;Array.isArray(u)||Rs(u)&&l!=="string";)p.push(u.length),u=u[0];return Array.isArray(r)&&Cs().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&NR(r,p,[]),p}function NR(r,l,u){if(u=u||[],!Array.isArray(r)&&!Rs(r)){Z(l.length===0,()=>`Element arr[${u.join("][")}] is a primitive, but should be an array/TypedArray of ${l[0]} elements`);return}Z(l.length>0,()=>`Element arr[${u.join("][")}] should be a primitive, but is an array of ${r.length} elements`),Z(r.length===l[0],()=>`Element arr[${u.join("][")}] should have ${l[0]} elements, but has ${r.length} elements`);const p=l.slice(1);for(let g=0;g=0&&(g=p),CR(p,g,l,u),r==null||!Rs(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="string"){const x=r==null?"null":r.constructor.name;throw new Error(`Argument '${l}' passed to '${u}' must be a Tensor or TensorLike, but got '${x}'`)}const f=ur(r,g);!Rs(r)&&!Array.isArray(r)&&(r=[r]);const I=!0,S=g!=="string"?bf(r,g):Lc(r,[],I);return Y.makeTensor(S,f,g)}function Tf(r,l,u,p="numeric"){if(!Array.isArray(r))throw new Error(`Argument ${l} passed to ${u} must be a \`Tensor[]\` or \`TensorLike[]\``);const g=r;return g.map((f,I)=>M(f,`${l}[${I}]`,u),p)}const RR="__op";function z(r){const l=Object.keys(r);if(l.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${l.length} keys.`);let u=l[0];const p=r[u];u.endsWith("_")&&(u=u.substring(0,u.length-1)),u=u+RR;const g=(...f)=>{Y.startScope(u);try{const I=p(...f);return I instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),Y.endScope(I),I}catch(I){throw Y.endScope(null),I}};return Object.defineProperty(g,"name",{value:u,configurable:!0}),g}function f7(r,l){const u=M(r,"real","complex"),p=M(l,"imag","complex");Zt(u.shape,p.shape,`real and imag shapes, ${u.shape} and ${p.shape}, must match in call to tf.complex().`);const g=I=>I.complex(u,p),f={real:u,imag:p};return Y.runKernelFunc(g,f,null,KC)}const Pi=z({complex_:f7});function zi(r,l,u,p){if(p==null&&(p=cu(r)),p==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!Rs(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(l!=null){Lf(l);const g=qt(l),f=qt(u);Z(g===f,()=>`Based on the provided shape, [${l}], the tensor should have ${g} values but has ${f}`);for(let I=0;I`Error creating a new Tensor. Inferred shape (${u}) does not match the provided shape (${l}). `)}}return!Rs(r)&&!Array.isArray(r)&&(r=[r]),l=l||u,r=p!=="string"?bf(r,p):Lc(r,[],!0),Y.makeTensor(r,l,p)}function YS(r,l,u){const p=ur(r,u);return zi(r,l,p,u)}function mu(r,l="float32",u){return l=l||"float32",Lf(r),new bR(r,l,u)}function g7(r,l){const u=M(r,"x","cast");if(!aR(l))throw new Error(`Failed to cast to unknown dtype ${l}`);if(l==="string"&&u.dtype!=="string"||l!=="string"&&u.dtype==="string")throw new Error("Only strings can be casted to strings");const p={x:u},g={dtype:l};return Y.runKernelFunc(f=>f.cast(u,l),p,null,bc,g)}const Le=z({cast_:g7});function y7(r){const l=M(r,"x","clone",null),u=()=>Y.makeTensorFromDataId(l.dataId,l.shape,l.dtype),p={x:l};return Y.runKernelFunc(u,p,null,Wm)}const pi=z({clone_:y7});function HS(r,l=!1){console.log(r.toString(l))}VS();const b7={buffer:mu,cast:Le,clone:pi,print:HS};LR(b7);function w7(r,l){const u=M(r,"x","reshape",null),p={x:u},g={shape:l},f=(I,S)=>(l=iR(l,u.size),Z(u.size===qt(l),()=>"new shape and old shape must have the same number of elements."),S([u]),I.reshape(u,l));return Y.runKernelFunc(f,p,null,jm,g)}const ie=z({reshape_:w7});function L7(r,l,u=!1,p=!1){let g=M(r,"a","matMul"),f=M(l,"b","matMul");[g,f]=mt(g,f),Z(g.rank>=2&&f.rank>=2&&g.rank===f.rank,()=>`Error in matMul: inputs must have the same rank of at least 2, got ranks ${g.rank} and ${f.rank}.`);const I=u?g.shape[g.rank-2]:g.shape[g.rank-1],S=p?f.shape[f.rank-1]:f.shape[f.rank-2],x=u?g.shape[g.rank-1]:g.shape[g.rank-2],v=p?f.shape[f.rank-2]:f.shape[f.rank-1],O=g.shape.slice(0,-2),C=f.shape.slice(0,-2),U=qt(O),G=qt(C);Z(Ho(O,C),()=>`Error in matMul: outer dimensions (${O}) and (${C}) of Tensors with shapes ${g.shape} and ${f.shape} must match.`),Z(I===S,()=>`Error in matMul: inner shapes (${I}) and (${S}) of Tensors with shapes ${g.shape} and ${f.shape} and transposeA=${u} and transposeB=${p} must match.`);const ne=g.shape.slice(0,-2).concat([x,v]),te=u?ie(g,[U,I,x]):ie(g,[U,x,I]),oe=p?ie(f,[G,v,S]):ie(f,[G,S,v]),ge=(Ve,rt)=>(rt([te,oe]),Ve.batchMatMul(te,oe,u,p)),fe={a:te,b:oe},Ae={transposeA:u,transposeB:p},Te=Y.runKernelFunc(ge,fe,null,Sm,Ae);return ie(Te,ne)}const un=z({matMul_:L7});function S7(r,l){const u=M(r,"x","transpose");if(l==null&&(l=u.shape.map((f,I)=>I).reverse()),Z(u.rank===l.length,()=>`Error in transpose: rank of input ${u.rank} must match length of perm ${l}.`),l.forEach(f=>{Z(f>=0&&f`All entries in 'perm' must be between 0 and ${u.rank-1} but got ${l}`)}),u.rank<=1)return u.clone();const p={x:u},g={perm:l};return Y.runKernelFunc(f=>f.transpose(u,l),p,null,df,g)}const Wt=z({transpose_:S7});function qS(r,l,u){if(wc(r),l!=null&&l.length!==3)throw new Error("tensor3d() requires shape to have three numbers");const p=ur(r,u);if(p.length!==3&&p.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return zi(r,l,p,u)}const jS={};hm(jS,{fromPixels:()=>T7,toPixels:()=>x7});let xc;function I7(r,l=3){if(l>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(r==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let u=!1,p=!1,g=!1,f=!1,I=!1;if(r.data instanceof Uint8Array)u=!0;else if(typeof ImageData!="undefined"&&r instanceof ImageData)p=!0;else if(typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement)g=!0;else if(typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement)f=!0;else if(r.getContext!=null)I=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${r.constructor.name}`);if(g){const G=2;if(g&&r.readyState element.")}const S=yf(ES,Y.backendName);if(S!=null){const G={pixels:r},ne={numChannels:l};return Y.runKernel(ES,G,ne)}const[x,v]=g?[r.videoWidth,r.videoHeight]:[r.width,r.height];let O;I?O=r.getContext("2d").getImageData(0,0,x,v).data:p||u?O=r.data:(f||g)&&(xc==null&&(xc=document.createElement("canvas").getContext("2d")),xc.canvas.width=x,xc.canvas.height=v,xc.drawImage(r,0,0,x,v),O=xc.getImageData(0,0,x,v).data);let C;if(l===4)C=new Int32Array(O);else{const G=x*v;C=new Int32Array(G*l);for(let ne=0;ne4||f===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${f}`);if(u.dtype!=="float32"&&u.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${u.dtype}. Please use float32 or int32 tensors.`);const I=await u.data(),S=u.dtype==="float32"?255:1,x=new Uint8ClampedArray(g*p*4);for(let v=0;v1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${G}.`)}else if(u.dtype==="int32"&&(G<0||G>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${G}.`);f===1?(O[0]=G*S,O[1]=G*S,O[2]=G*S):O[U]=G*S}const C=v*4;x[C+0]=Math.round(O[0]),x[C+1]=Math.round(O[1]),x[C+2]=Math.round(O[2]),x[C+3]=Math.round(O[3])}if(l!=null){l.width=g,l.height=p;const v=l.getContext("2d"),O=new ImageData(x,g,p);v.putImageData(O,0,0)}return u!==r&&u.dispose(),x}const T7=z({fromPixels_:I7});function OR(r,l,u){const p=r.shape.length;Z(p===l.length,()=>`Error in slice${p}D: Length of begin ${l} must match the rank of the array (${p}).`),Z(p===u.length,()=>`Error in slice${p}D: Length of size ${u} must match the rank of the array (${p}).`);for(let g=0;g`Error in slice${p}D: begin[${g}] + size[${g}] (${l[g]+u[g]}) would overflow input.shape[${g}] (${r.shape[g]})`)}function Af(r,l,u){let p;const g=r.shape.length;typeof l=="number"?p=[l,...new Array(g-1).fill(0)]:l.length{Z(I!==-1,()=>"slice() does not support negative begin indexing.")});let f;return u==null?f=new Array(g).fill(-1):typeof u=="number"?f=[u,...new Array(g-1).fill(-1)]:u.lengthI>=0?I:(Z(I===-1,()=>`Negative size values should be exactly -1 but got ${I} for the slice() size at index ${S}.`),r.shape[S]-p[S])),[p,f]}function A7(r){Cs().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(r+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}SR(A7);function ER(r,l){return Y.tidy(r,l)}function DR(r){const l=xf(r);l.forEach(u=>u.dispose())}function v7(r,l){let u=M(r,"a","add"),p=M(l,"b","add");[u,p]=mt(u,p);const g=(I,S)=>{const x=I.add(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,yc)}const Lt=z({add_:v7});function N7(r,l){let u=M(r,"a","floorDiv"),p=M(l,"b","floorDiv");[u,p]=mt(u,p);const g=(I,S)=>{const x=I.floorDiv(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,km)}const KS=z({floorDiv_:N7});function C7(r,l){let u=M(r,"a","div"),p=M(l,"b","div");if([u,p]=mt(u,p),u.dtype==="int32"&&p.dtype==="int32")return KS(u,p);const g=(S,x)=>{const v=S.realDivide(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,Om,I)}const Pe=z({div_:C7});function R7(r,l){let u=M(r,"a","mul"),p=M(l,"b","mul");[u,p]=mt(u,p);const g=(I,S)=>{const x=I.multiply(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Gm)}const ae=z({mul_:R7});function O7(r){const l=M(r,"x","abs"),u={x:l};return Y.runKernelFunc((p,g)=>(g([l]),l.dtype==="complex64"?p.complexAbs(l):p.abs(l)),u,null,Lm)}const Un=z({abs_:O7});function E7(r,l){for(let u=0;ur[f]);return[u,g]}function Zn(r,l){const u=l.map(p=>1);return D7(r,u,l)}function ds(r,l){if(E7(r,l))return null;const u=[];for(let p=0;pu.push(p)),u}function Tc(r){return r.map((l,u)=>[u,l]).sort((l,u)=>l[1]-u[1]).map(l=>l[0])}function Kr(r,l){const u=[];for(let p=l-r;p`The output # of rows (${S}) must be an integer. Change the stride and/or zero pad parameters`);const x=jo((I-l+2*p)/u+1,g);return Z(Qt(x),()=>`The output # of columns (${x}) must be an integer. Change the stride and/or zero pad parameters`),[S,x]}function W7(r,l,u,p,g,f){g==null&&(g=FR(r,l,p));const I=r[0],S=r[1],x=r[2],v=jo((I-l+2*g)/p+1,f);Z(Qt(v),()=>`The output # of depths (${v}) must be an integer. Change the stride and/or zero pad parameters`);const O=jo((S-l+2*g)/p+1,f);Z(Qt(O),()=>`The output # of rows (${O}) must be an integer. Change the stride and/or zero pad parameters`);const C=jo((x-l+2*g)/p+1,f);return Z(Qt(C),()=>`The output # of columns (${C}) must be an integer. Change the stride and/or zero pad parameters`),[v,O,C,u]}function FR(r,l,u,p=1){const g=Ac(l,p);return Math.floor((r[0]*(u-1)-u+g)/2)}function vf(r){return typeof r=="number"?[r,r,r]:r.length===2?[r[0],r[1],1]:r}function XS(r){return typeof r=="number"?[r,r,r]:r}function Ac(r,l){return l<=1?r:r+(r-1)*(l-1)}function k7(r,l,u,p,g,f,I,S,x){let v,O,C;if(typeof r=="number"){const U=r===0?"VALID":"NUMBER";v={top:r,bottom:r,left:r,right:r,type:U};const G=_7([l,u],f,p,r,S);O=G[0],C=G[1]}else if(r==="same"){O=Math.ceil(l/p),C=Math.ceil(u/g);const U=Math.max(0,(O-1)*p+f-l),G=Math.max(0,(C-1)*g+I-u),ne=Math.floor(U/2),te=U-ne,oe=Math.floor(G/2),ge=G-oe;v={top:ne,bottom:te,left:oe,right:ge,type:"SAME"}}else if(r==="valid")v={top:0,bottom:0,left:0,right:0,type:"VALID"},O=Math.ceil((l-f+1)/p),C=Math.ceil((u-I+1)/g);else if(typeof r=="object"){const U=x==="channelsLast"?r[1][0]:r[2][0],G=x==="channelsLast"?r[1][1]:r[2][1],ne=x==="channelsLast"?r[2][0]:r[3][0],te=x==="channelsLast"?r[2][1]:r[3][1],oe=U===0&&G===0&&ne===0&&te===0?"VALID":"EXPLICIT";v={top:U,bottom:G,left:ne,right:te,type:oe},O=jo((l-f+U+G)/p+1,S),C=jo((u-I+ne+te)/g+1,S)}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:v,outHeight:O,outWidth:C}}function F7(r,l,u,p,g,f,I,S,x,v,O){let C,U,G,ne;if(typeof r=="number"){const te=r===0?"VALID":"NUMBER";C={top:r,bottom:r,left:r,right:r,front:r,back:r,type:te};const oe=W7([l,u,p,1],S,1,g,r,O);U=oe[0],G=oe[1],ne=oe[2]}else if(r==="same"){U=Math.ceil(l/g),G=Math.ceil(u/f),ne=Math.ceil(p/I);const te=(U-1)*g+S-l,oe=(G-1)*f+x-u,ge=(ne-1)*I+v-p,fe=Math.floor(te/2),Ae=te-fe,Te=Math.floor(oe/2),Ve=oe-Te,rt=Math.floor(ge/2),vt=ge-rt;C={top:Te,bottom:Ve,left:rt,right:vt,front:fe,back:Ae,type:"SAME"}}else if(r==="valid")C={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},U=Math.ceil((l-S+1)/g),G=Math.ceil((u-x+1)/f),ne=Math.ceil((p-v+1)/I);else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:C,outDepth:U,outHeight:G,outWidth:ne}}function jo(r,l){if(!l)return r;switch(l){case"round":return Math.round(r);case"ceil":return Math.ceil(r);case"floor":return Math.floor(r);default:throw new Error(`Unknown roundingMode ${l}`)}}function Xr(r){const[l,u,p]=vf(r);return l===1&&u===1&&p===1}function Jr(r,l){return Xr(r)||Xr(l)}function vc(r){if(r==="NHWC")return"channelsLast";if(r==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${r}`)}function _R(r,l){const u=r[0].length;r.forEach((g,f)=>{Z(g.length===u,()=>`Error in concat${u}D: rank of tensors[${f}] must be the same as the rank of the rest (${u})`)}),Z(l>=0&&l`Error in concat${u}D: axis must be between 0 and ${u-1}.`);const p=r[0];r.forEach((g,f)=>{for(let I=0;I`Error in concat${u}D: Shape of tensors[${f}] (${g}) does not match the shape of the rest (${p}) along the non-concatenated axis ${f}.`)})}function WR(r,l){const u=r[0].slice();for(let p=1;p=1,()=>"Pass at least one tensor to concat");let u=Tf(r,"tensors","concat");u[0].dtype==="complex64"&&u.forEach(I=>{if(I.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${I.dtype}. `)});const p=(I,S)=>{const x=ht(l,u[0].shape)[0],v=WR(u.map(U=>U.shape),x);if(qt(v)===0)return YS([],v);if(u=u.filter(U=>U.size>0),u.length===1)return u[0];const O=u.map(U=>U.shape);_R(O,x);const C=I.concat(u,x);return S(u),C},g=u,f={axis:l};return Y.runKernelFunc(p,g,null,Tm,f)}const yn=z({concat_:$7});function U7(r){const l=M(r,"x","sigmoid"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sigmoid(l);return g([f]),f},u,null,sf)}const JS=z({sigmoid_:U7});function B7(r,l,u){const p=M(r,"x","slice");if(p.rank===0)throw new Error("Slicing scalar is not possible");const g=(S,x)=>{const[v,O]=Af(p,l,u);return OR(p,v,O),x([p]),S.slice(p,v,O)},f={x:p},I={begin:l,size:u};return Y.runKernelFunc(g,f,null,ef,I)}const Tt=z({slice_:B7});function M7(r,l,u){const p=M(r,"x","batchToSpaceND"),g=l.reduce((x,v)=>x*v);Z(p.rank>=1+l.length,()=>`input rank is ${p.rank} but should be > than blockShape.length ${l.length}`),Z(u.length===l.length,()=>`crops.length is ${u.length} but should be equal to blockShape.length ${l.length}`),Z(p.shape[0]%g===0,()=>`input tensor batch is ${p.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${g}`);const f=x=>x.batchToSpaceND(p,l,u),I={x:p},S={blockShape:l,crops:u};return Y.runKernelFunc(f,I,null,Im,S)}const ZS=z({batchToSpaceND_:M7});function P7(r,l){let u=M(r,"broadcastTo","x");const p=u.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthu.rank){const O=u.shape.slice();for(;O.length=0;O--)if(g[O]===l[O])f[O]=1;else if(u.shape[O]!==1)throw new Error(`broadcastTo(): [${p}] cannot be broadcast to [${l}].`);const I=f.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(I.length===0)return pi(u);const S=O=>O.tile(u,f),x={x:u},v={shape:l,inputShape:g};return Y.runKernelFunc(S,x,null,xm,v)}const Rf=z({broadcastTo_:P7});function z7(r,l,u,p,g="NHWC",f=[1,1],I){const S=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let v=S,O=!1;S.rank===3&&(O=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2]])),Z(v.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${v.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),I!=null&&Z(Qt(p),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${p}.`);const C=g==="NHWC"?v.shape[3]:v.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(Jr(u,f),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${u} and dilations '${f}'`);const U=(oe,ge)=>{const fe=vc(g),Ae=dr(v.shape,x.shape,u,f,p,I,!1,fe),Te=oe.conv2d(v,x,Ae);return ge([v,x]),Te},G={x:v,filter:x},ne={strides:u,pad:p,dataFormat:g,dilations:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,Am,ne);return O?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const QS=z({conv2d_:z7});function G7(r,l,u,p,g,f="NHWC",I){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let S=r,x=l,v=!1;l.rank===3&&(v=!0,x=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]),S=[1,r[0],r[1],r[2]]),Z(S.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${S.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(u.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${u.rank}`);const O=f==="NHWC"?S[3]:S[1],C=f==="NHWC"?x.shape[3]:x.shape[1];Z(O===u.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${u.shape[2]}.`),Z(C===u.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${u.shape[3]}.`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const U=(oe,ge)=>{const fe=1,Ae=vc(f),Te=dr(S,u.shape,p,fe,g,I,!1,Ae),Ve=oe.conv2dDerInput(x,u,Te);return ge([x,u]),Ve},G={dy:x,filter:u},ne={strides:p,pad:g,dataFormat:f,dimRoundingMode:I,inputShape:S},te=Y.runKernelFunc(U,G,null,vm,ne);return v?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const $R=z({conv2DBackpropInput_:G7});function V7(r,l,u,p,g){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let f=r,I=l,S=!1;l.rank===4&&(S=!0,I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),f=[1,r[0],r[1],r[2],r[3]]);const x=f[4],v=I.shape[4];Z(f.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${f.length}.`),Z(I.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${I.rank}`),Z(u.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${u.rank}`),Z(x===u.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${u.shape[3]}.`),Z(v===u.shape[4],()=>`Error in conv3dDerInput: depth of output (${v}) must match output depth for filter ${u.shape[4]}.`);const O=ne=>{const te=1,oe=fu(f,u.shape,p,te,g);return ne.conv3dDerInput(I,u,oe)},C={dy:I},U={pad:g},G=Y.runKernelFunc(O,C,null,QC,U);return S?ie(G,[G.shape[1],G.shape[2],G.shape[3],G.shape[4]]):G}const UR=z({conv3DBackpropInput_:V7});function Y7(r){const l=M(r,"x","cos"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cos(l);return g([l]),f},u,null,Nm)}const gu=z({cos_:Y7});function H7(r){const l=M(r,"x","cosh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cosh(l);return g([l]),f},u,null,Cm)}const eI=z({cosh_:H7});function q7(r,l=0,u=!1,p=!1){const g=M(r,"x","cumsum"),f=(x,v)=>{const O=ds([l],g.rank);let C=g;O!=null&&(C=Wt(g,O));const U=Kr(1,g.rank)[0];let G=x.cumsum(C,U,u,p);if(v([g]),O!=null){const ne=Tc(O);G=Wt(G,ne)}return G},I={x:g},S={axis:l,exclusive:u,reverse:p};return Y.runKernelFunc(f,I,null,Rm,S)}const tI=z({cumsum_:q7});function At(r,l){const u=[];for(let p=0;p1)&&u.unshift(f)}return u}function it(r,l){const u=[],p=Math.max(r.length,l.length);for(let g=0;gI.equal(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,h2)}const nI=z({equal_:j7});function K7(r,l,u){const p=M(l,"a","where"),g=M(u,"b","where"),f=M(r,"condition","where","bool"),I=it(p.shape,g.shape),S=Rf(p,I),x=Rf(g,I);f.rank===1&&Z(f.shape[0]===p.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),f.rank!==1&&Zt(f.shape,x.shape,"Error in where: ");const v=(C,U)=>{const G=C.select(f,S,x);return U([f]),G},O={condition:f,t:S,e:x};return Y.runKernelFunc(v,O,null,Qm)}const Bn=z({where_:K7});function X7(r){const l=M(r,"x","zerosLike"),u={x:l};return Y.runKernelFunc(p=>p.zerosLike(l),u,null,ff)}const qe=z({zerosLike_:X7});function J7(r){const l=M(r,"x","exp"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.exp(l);return g([f]),f},u,null,Em)}const Mn=z({exp_:J7});function Z7(r,l=0){const u=null,p=M(r,"x","expandDims",u);Z(l<=p.rank,()=>"Axis must be <= rank of the tensor");const g=p.shape.slice();return l<0&&(Z(-(p.rank+1)<=l,()=>`Axis must be in the interval [${-(p.rank+1)}, ${p.rank}]`),l=p.rank+l+1),g.splice(l,0,1),ie(p,g)}const Os=z({expandDims_:Z7});function Q7(r,l){const u=null,p=M(r,"x","tile",u);Z(p.rank===l.length,()=>`Error in transpose: rank of input ${p.rank} must match length of reps ${l}.`);const g=(x,v)=>{const O=x.tile(p,l);return v([p]),O},f=[p],I={x:p},S={reps:l};return Y.runKernelFunc(g,I,null,uf,S,f)}const Ko=z({tile_:Q7});function eJ(r,l,u,p="float32"){l==null&&(l=r);const g=mu([r,l],p),f=r<=l?r:l;for(let S=0;Sg.fill(r,l,u),{},null,p2,p)}function tJ(r){const l=M(r,"x","floor"),u={x:l};return Y.runKernelFunc(p=>p.floor(l),u,null,Dm)}const rI=z({floor_:tJ});function BR(r,l,u){const p=r.shape[u],g=[];let f=1,I=1;for(let S=0;S{const O=ht(u,p.shape)[0],C=BR(p,g,O),U=x.gather(p,ie(g,[g.size]),O);return v([p,g]),ie(U,C.outputShape)};return Y.runKernelFunc(S,f,null,Fm,I)}const oI=z({gather_:nJ});function sJ(r,l){let u=M(r,"a","greater"),p=M(l,"b","greater");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.greater(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,g2)}const mi=z({greater_:sJ});function iJ(r,l){let u=M(r,"a","greaterEqual"),p=M(l,"b","greaterEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.greaterEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,_m)}const pr=z({greaterEqual_:iJ});function rJ(r){const l=M(r,"input","imag"),u=g=>g.imag(l),p={input:l};return Y.runKernelFunc(u,p,null,b2)}const yu=z({imag_:rJ});function oJ(r,l){let u=M(r,"a","maximum"),p=M(l,"b","maximum");[u,p]=mt(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.maximum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Mm)}const aI=z({maximum_:oJ});function ke(r,l){if((Rs(r)&&l!=="string"||Array.isArray(r))&&l!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(l==="string"&&Rs(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const u=[],p=[];return zi(r,u,p,l)}function aJ(r,l){let u=M(r,"a","less"),p=M(l,"b","less");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.less(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,I2)}const cI=z({less_:aJ});function cJ(r,l){let u=M(r,"a","lessEqual"),p=M(l,"b","lessEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.lessEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,x2)}const mr=z({lessEqual_:cJ});function lJ(r){const l=M(r,"x","log"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log(l);return g([l]),f},u,null,$m)}const Zr=z({log_:lJ});function hJ(r){const l=M(r,"x","log1p"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log1p(l);return g([l]),f},u,null,Um)}const lI=z({log1p_:hJ});function Of(r){return Y.customGrad(r)}function uJ(r){const l=M(r,"x","neg"),u={x:l};return Y.runKernelFunc(p=>p.neg(l),u,null,Vm)}const yt=z({neg_:uJ});function dJ(r,l=null,u=!1){const p=M(r,"x","max"),g=(S,x)=>{const v=ht(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=Wt(p,C),O=Kr(O.length,U.rank));const G=S.max(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Zn(ne.shape,ht(l,p.shape));ne=ie(ne,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={reductionIndices:l,keepDims:u};return Y.runKernelFunc(g,f,null,Bm,I)}const Xo=z({max_:dJ});function pJ(r,l){let u=M(r,"a","sub"),p=M(l,"b","sub");[u,p]=mt(u,p);const g=(I,S)=>{const x=I.subtract(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,hf)}const Be=z({sub_:pJ});function mJ(r,l=null,u=!1){let p=M(r,"x","sum");p.dtype==="bool"&&(p=Le(p,"int32"));const g=(S,x)=>{x([p]);const v=ht(l,p.shape),O=ds(v,p.rank);let C=v,U=p;O!=null&&(U=Wt(p,O),C=Kr(C.length,p.rank));let G=S.sum(U,C);if(u){const ne=Zn(G.shape,v);G=ie(G,ne)}return G},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,of,I)}const Fe=z({sum_:mJ});function fJ(r,l=null,u=!1){const p=M(r,"x","logSumExp"),g=ht(l,p.shape),f=Xo(p,g,!0),I=Be(p,f),S=Mn(I),x=Fe(S,g),v=Zr(x),O=Lt(ie(f,v.shape),v);if(u){const C=Zn(O.shape,g);return ie(O,C)}return O}const hI=z({logSumExp_:fJ});function gJ(r,l){const u=M(r,"a","logicalAnd","bool"),p=M(l,"b","logicalAnd","bool");it(u.shape,p.shape);const g={a:u,b:p};return Y.runKernelFunc(f=>f.logicalAnd(u,p),g,null,T2)}const Jo=z({logicalAnd_:gJ});function yJ(r){const l=M(r,"x","logicalNot","bool"),u={x:l};return Y.runKernelFunc(p=>p.logicalNot(l),u,null,A2)}const uI=z({logicalNot_:yJ});function Es(r,l="float32"){if(l==="complex64"){const p=Es(r,"float32"),g=Es(r,"float32");return Pi(p,g)}const u=qo(qt(r),l);return Y.makeTensor(u,r,l)}function Gi(r,l="float32"){if(l==="complex64"){const p=Gi(r,"float32"),g=Es(r,"float32");return Pi(p,g)}const u=wf(qt(r),l);return Y.makeTensor(u,r,l)}function bJ(r,l=null,u=!1){const p=M(r,"x","mean"),g=ht(l,p.shape),f=kR(p.shape,g),I=f[1],S=qt(I),x=Of(v=>{const O=ke(S),C=O.dtype===v.dtype?v:Le(v,O.dtype),U=Pe(C,O),G=Fe(U,l,u),ne=te=>{const oe=v.shape.slice();g.forEach(Ae=>{oe[Ae]=1});const ge=ie(te,oe),fe=Pe(ae(ge,Gi(v.shape,"float32")),S);return fe};return{value:G,gradFunc:ne}});return x(p)}const dI=z({mean_:bJ});function wJ(r,l=null,u=!1){const p=M(r,"x","min"),g=(S,x)=>{const v=ht(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=Wt(p,C),O=Kr(O.length,p.rank));const G=S.min(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Zn(ne.shape,v);ne=ie(G,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,Pm,I)}const Ef=z({min_:wJ});function LJ(r,l){let u=M(r,"a","minimum"),p=M(l,"b","minimum");[u,p]=mt(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.minimum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,zm)}const pI=z({minimum_:LJ});function SJ(r){const l=M(r,"x","square"),u={},p=[l],g=[];return Y.runKernelFunc((f,I)=>(I([l]),f.square(l)),{x:l},null,"Square",u,p,g)}const ut=z({square_:SJ});function IJ(r,l){let u=M(r,"a","notEqual"),p=M(l,"b","notEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.notEqual(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,F2)}const mI=z({notEqual_:IJ});function xJ(r){const l=M(r,"input","real"),u=g=>g.real(l),p={input:l};return Y.runKernelFunc(u,p,null,z2)}const Nc=z({real_:xJ});function TJ(r,l,u=0){const p=M(r,"x","pad");if(p.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const g=(S,x)=>(x([p]),S.pad(p,l,u)),f={paddings:l,constantValue:u},I={x:p};return Y.runKernelFunc(g,I,null,Ym,f)}const fI=z({pad_:TJ});function AJ(r,l,u){const p=M(r,"x","spaceToBatchND");Z(p.rank>=1+l.length,()=>`input rank ${p.rank} should be > than [blockShape] ${l.length}`),Z(u.length===l.length,()=>`paddings.shape[0] ${u.length} must be equal to [blockShape] ${l.length}`),Z(p.shape.reduce((S,x,v)=>v>0&&v<=l.length?S&&(x+u[v-1][0]+u[v-1][1])%l[v-1]===0:S,!0),()=>`input spatial dimensions ${p.shape.slice(1)} with paddings ${u.toString()} must be divisible by blockShapes ${l.toString()}`);const g=S=>S.spaceToBatchND(p,l,u),f={x:p},I={blockShape:l,paddings:u};return Y.runKernelFunc(g,f,null,af,I)}const gI=z({spaceToBatchND_:AJ});function vJ(r,l){let u=M(r,"base","pow"),p=M(l,"exp","pow");[u,p]=mt(u,p);const g={a:u,b:p},f=(I,S)=>{const x=I.pow(u,p);return S([u,p,x]),x};return Y.runKernelFunc(f,g,null,Hm)}const Zo=z({pow_:vJ});function Qr(r,l){wc(r);const u=ur(r,l);if(u.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const p=null;return zi(r,p,u,l)}function Df(r,l,u=1,p="float32"){if(u===0)throw new Error("Cannot have a step of zero");const g=()=>{const I=r===l,S=r1;if(I||S||x)return Es([0],p);const v=Math.abs(Math.ceil((l-r)/u)),O=qo(v,p);l(f([l]),l.dtype==="bool"?Le(l,"int32"):g.relu(l)),p={x:l};return Y.runKernelFunc(u,p,null,qm)}const bu=z({relu_:NJ});function CJ(r,l){const u=M(r,"x","reverse"),p=I=>{const S=ht(l,u.shape);if(u.rank===0)return pi(u);const x=I.reverse(u,S);return ie(x,u.shape)},g={x:u},f={dims:l};return Y.runKernelFunc(p,g,null,Jm,f)}const Cc=z({reverse_:CJ});function RJ(r){const l=M(r,"x","rsqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.rsqrt(l);return g([l]),f},u,null,Zm)}const yI=z({rsqrt_:RJ});function OJ(r){const l=M(r,"x","sin"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sin(l);return g([l]),f},u,null,tf)}const bI=z({sin_:OJ});function EJ(r){const l=M(r,"x","sinh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sinh(l);return g([l]),f},u,null,nf)}const wI=z({sinh_:EJ});function DJ(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=r.as2D(g,p),I=u.fft(f);return I.reshape(r.shape)},l,null,d2)}const wu=z({fft_:DJ});function kJ(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=ie(r,[g,p]),I=u.ifft(f);return ie(I,r.shape)},l,null,y2)}const Rc=z({ifft_:kJ});function FJ(r){const l=r.shape[r.shape.length-1],u=r.size/l;let p;if(l<=2){const g=ie(r,[u,l]);p=Rc(g)}else{const g=[u,2*(l-1)],f=ie(Nc(r),[u,l]),I=ie(yu(r),[u,l]),S=Cc(Tt(f,[0,1],[u,l-2]),1),x=ae(Cc(Tt(I,[0,1],[u,l-2]),1),ke(-1)),v=yn([f,S],1),O=yn([I,x],1),C=ie(Pi(v,O),[g[0],g[1]]);p=Rc(C)}if(p=Nc(p),r.rank===3&&r.shape[0]!==0){const g=p,f=r.shape[0];p=ie(p,[f,p.shape[0]/f,p.shape[1]]),g.dispose()}return p}const LI=z({irfft_:FJ});function MR(r,l,u=0){let p=[];if(typeof l=="number")Z(r.shape[u]%l===0,()=>"Number of splits must evenly divide the axis."),p=new Array(l).fill(r.shape[u]/l);else{const g=l.reduce((I,S)=>(S===-1&&(I+=1),I),0);Z(g<=1,()=>"There should be only one negative value in split array.");const f=l.indexOf(-1);if(f!==-1){const I=l.reduce((S,x)=>x>0?S+x:S);l[f]=r.shape[u]-I}Z(r.shape[u]===l.reduce((I,S)=>I+S),()=>"The sum of sizes must match the size of the axis dimension."),p=l}return p}function _J(r,l,u=0){const p=M(r,"x","split"),g=(S,x)=>{const v=ht(u,p.shape)[0],O=MR(p,l,v);return S.split(p,O,v)},f={x:p},I={numOrSizeSplits:l,axis:u};return Y.runKernelFunc(g,f,null,cf,I)}const eo=z({split_:_J});function WJ(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let u=r.shape[r.shape.length-1];const p=r.size/u;let g;if(l!=null&&l0),te=r.shape.map(oe=>oe);te[r.shape.length-1]=l,g=Tt(r,ne,te),u=l}else if(l!=null&&l>u){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-u,g=yn([r,Es(ne)],r.shape.length-1),u=l}else g=r;const f=qe(g),I=ie(Pi(g,f),[p,u]),S=wu(I),x=Math.floor(u/2)+1,v=Nc(S),O=yu(S),C=eo(v,[x,u-x],v.shape.length-1),U=eo(O,[x,u-x],O.shape.length-1),G=g.shape.slice();return G[g.shape.length-1]=x,ie(Pi(C[0],U[0]),G)}const Lu=z({rfft_:WJ});function $J(r){const l=M(r,"x","sqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sqrt(l);return g([l]),f},u,null,rf)}const ps=z({sqrt_:$J});function UJ(r,l){let u=M(r,"a","squaredDifference"),p=M(l,"b","squaredDifference");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(S,x)=>{const v=S.squaredDifference(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,lf,I)}const SI=z({squaredDifference_:UJ});function BJ(r,l){const u=M(r,"x","squeeze");return ie(u,rR(u.shape,l).newShape)}const II=z({squeeze_:BJ});function MJ(r,l=0){const u=Tf(r,"tensors","stack");if(Z(u.length>=1,()=>"Pass at least one tensor to tf.stack"),u.length===1)return Os(u[0],l);const p=u[0].rank,g=u[0].shape,f=u[0].dtype;Z(l<=p,()=>"Axis must be <= rank of the tensor"),u.forEach(S=>{Zt(g,S.shape,"All tensors passed to stack must have matching shapes"),Z(f===S.dtype,()=>"All tensors passed to stack must have matching dtypes")});const I=u.map(S=>Os(S,l));return yn(I,l)}const Vs=z({stack_:MJ});function PJ(r,l=0){const u=M(r,"x","step"),p={x:u},g={alpha:l};return Y.runKernelFunc(f=>f.step(u,l),p,null,gf,g)}const Qo=z({step_:PJ});function ea(r,l,u){if(wc(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const p=ur(r,u);if(p.length!==2&&p.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return zi(r,l,p,u)}function zJ(r,l,u){const p=M(r,"x","unsortedSegmentSum"),g=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(u),()=>"numSegments must be of dtype int");const f={x:p,segmentIds:g},I={numSegments:u},S=(x,v)=>{const O=x.unsortedSegmentSum(p,g,u);return v([g]),O};return Y.runKernelFunc(S,f,null,mf,I)}const xI=z({unsortedSegmentSum_:zJ});function GJ(r,l=0){const u=M(r,"x","unstack");Z(l>=-u.shape.length&&l`Axis = ${l} is not in [-${u.shape.length}, ${u.shape.length})`),l<0&&(l+=u.shape.length);const p={value:u},g={axis:l},f=I=>I.unstack(u,l);return Y.runKernelFunc(f,p,null,pf,g)}const Su=z({unstack_:GJ});function VJ(r,l="euclidean",u=null,p=!1){r=M(r,"x","norm");const g=PR(r,l,u);let f=g.shape;if(p){const I=ht(u,r.shape);f=Zn(g.shape,I)}return ie(g,f)}function PR(r,l,u=null){if(r.rank===0)return Un(r);if(r.rank!==1&&u===null)return PR(ie(r,[-1]),l,u);if(r.rank===1||typeof u=="number"||Array.isArray(u)&&u.length===1){if(l===1)return Fe(Un(r),u);if(l===Infinity)return Xo(Un(r),u);if(l===-Infinity)return Ef(Un(r),u);if(l==="euclidean"||l===2)return ps(Fe(Zo(Un(r),ke(2,"int32")),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(u)&&u.length===2){if(l===1)return Xo(Fe(Un(r),u[0]),u[1]-1);if(l===Infinity)return Xo(Fe(Un(r),u[1]),u[0]);if(l===-Infinity)return Ef(Fe(Un(r),u[1]),u[0]);if(l==="fro"||l==="euclidean")return ps(Fe(ut(r),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${u}`)}const kf=z({norm_:VJ});function zR(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function Ff(r,l,u){const p=1-r%2,g=new Float32Array(r);for(let f=0;f`Error in conv2dDerFilter: input must be rank 4, but got shape ${S.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(u.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${u}.`);const v=f==="NHWC"?S.shape[3]:S.shape[1],O=f==="NHWC"?x.shape[3]:x.shape[1];Z(v===u[2],()=>`Error in conv2dDerFilter: depth of input ${v}) must match input depth in filter (${u[2]}.`),Z(O===u[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${u[3]}).`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const C=ne=>{const te=1,oe=vc(f),ge=dr(S.shape,u,p,te,g,I,!1,oe);return ne.conv2dDerFilter(S,x,ge)},U={x:S,dy:x},G={strides:p,pad:g,dataFormat:f,dimRoundingMode:I};return Y.runKernelFunc(C,U,null,XC,G)}const _f=z({conv2DBackpropFilter_:YJ});function HJ(r,l,u,p){let g=r;r.rank===3&&(g=ie(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let f=l;f.rank===3&&(f=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=x=>x.depthwiseConv2DDerFilter(g,f,p),S={x:g,dy:f};return Y.runKernelFunc(I,S,null,n2)}const GR=z({depthwiseConv2dNativeBackpropFilter_:HJ});function qJ(r,l,u,p){let g=l,f=!1;l.rank===3&&(f=!0,g=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=v=>v.depthwiseConv2DDerInput(g,u,p),S={dy:g},x=Y.runKernelFunc(I,S,null,s2);return f?ie(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const VR=z({depthwiseConv2dNativeBackpropInput_:qJ});function jJ(r){return Ff(r,.54,.46)}const YR=z({hammingWindow_:jJ});function KJ(r){return Ff(r,.5,.5)}const Wf=z({hannWindow_:KJ});function XJ(r,l,u,p=!1,g=0){let f=0;const I=[];for(;f+l<=r.size;)I.push(Tt(r,f,l)),f+=u;if(p)for(;f`Error in cropAndResize: image must be rank 4,but got rank ${I.rank}.`),Z(S.rank===2&&S.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${v},4] but had shape ${S.shape}.`),Z(x.rank===1&&x.shape[0]===v,()=>`Error in cropAndResize: boxInd must be have size [${v}] but had shape ${S.shape}.`),Z(p.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${p.length}.`),Z(p[0]>=1&&p[1]>=1,()=>`cropSize must be atleast [1,1], but was ${p}`),Z(g==="bilinear"||g==="nearest",()=>`method must be bilinear or nearest, but was ${g}`);const O=ne=>ne.cropAndResize(I,S,x,p,g,f),C={image:I,boxes:S,boxInd:x},U={method:g,extrapolationValue:f,cropSize:p},G=Y.runKernelFunc(O,C,null,e2,U);return G}const qR=z({cropAndResize_:ZJ});function QJ(r){const l=M(r,"image","flipLeftRight","float32");Z(l.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${l.rank}.`);const u={image:l},p=Y.runKernel(m2,u,{});return p}const jR=z({flipLeftRight_:QJ});function e9(r,l,u=0,p=.5){const g=M(r,"image","rotateWithOffset","float32");Z(g.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${g.rank}.`);const f={image:g},I={radians:l,fillValue:u,center:p},S=Y.runKernel(tR,f,I);return S}const KR=z({rotateWithOffset_:e9});function Ys(r,l,u,p,g,f){p==null&&(p=.5),g==null&&(g=Number.NEGATIVE_INFINITY),f==null&&(f=0);const I=r.shape[0];return u=Math.min(u,I),Z(0<=p&&p<=1,()=>`iouThreshold must be in [0, 1], but was '${p}'`),Z(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),Z(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),Z(l.rank===1,()=>"scores must be a 1D tensor"),Z(l.shape[0]===I,()=>`scores has incompatible shape with boxes. Expected ${I}, but was ${l.shape[0]}`),Z(0<=f&&f<=1,()=>`softNmsSigma must be in [0, 1], but was '${f}'`),{maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f}}function t9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppression"),I=M(l,"scores","nonMaxSuppression"),S=Ys(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x={maxOutputSize:u,iouThreshold:p,scoreThreshold:g};return Y.runKernelFunc(v=>v.nonMaxSuppression(f,I,u,p,g),{boxes:f,scores:I},null,_2,x)}const XR=z({nonMaxSuppression_:t9});function JR(r,l,u){const p=n9(r,l,u),g=p<0?-(p+1):p;r.splice(g,0,l)}function n9(r,l,u){return i9(r,l,u||s9)}function s9(r,l){return r>l?1:r>>1);const S=u(l,r[f]);S>0?p=f+1:(g=f,I=!S)}return I?p:-p-1}function ZR(r,l,u,p,g){return TI(r,l,u,p,g,0).selectedIndices}function QR(r,l,u,p,g,f){return TI(r,l,u,p,g,0,!1,f,!0)}function eO(r,l,u,p,g,f){return TI(r,l,u,p,g,f,!0)}function TI(r,l,u,p,g,f,I=!1,S=!1,x=!1){const v=[];for(let oe=0;oeg&&v.push({score:l[oe],boxIndex:oe,suppressBeginIndex:0});v.sort(tO);const O=f>0?-.5/f:0,C=[],U=[];for(;C.length0;){const oe=v.pop(),{score:ge,boxIndex:fe,suppressBeginIndex:Ae}=oe;if(ge=Ae;--Ve){const rt=r9(r,fe,C[Ve]);if(rt>=p){Te=!0;break}if(oe.score=oe.score*o9(p,O,rt),oe.score<=g)break}oe.suppressBeginIndex=C.length,Te||(oe.score===ge?(C.push(fe),U.push(oe.score)):oe.score>g&&JR(v,oe,tO))}const G=C.length,ne=u-G;S&&ne>0&&(C.push(...new Array(ne).fill(0)),U.push(...new Array(ne).fill(0)));const te={selectedIndices:Qr(C,"int32")};return I&&(te.selectedScores=Qr(U,"float32")),x&&(te.validOutputs=ke(G,"int32")),te}function r9(r,l,u){const p=r.subarray(l*4,l*4+4),g=r.subarray(u*4,u*4+4),f=Math.min(p[0],p[2]),I=Math.min(p[1],p[3]),S=Math.max(p[0],p[2]),x=Math.max(p[1],p[3]),v=Math.min(g[0],g[2]),O=Math.min(g[1],g[3]),C=Math.max(g[0],g[2]),U=Math.max(g[1],g[3]),G=(S-f)*(x-I),ne=(C-v)*(U-O);if(G<=0||ne<=0)return 0;const te=Math.max(f,v),oe=Math.max(I,O),ge=Math.min(S,C),fe=Math.min(x,U),Ae=Math.max(ge-te,0)*Math.max(fe-oe,0);return Ae/(G+ne-Ae)}function o9(r,l,u){const p=Math.exp(l*u*u);return u<=r?p:0}function tO(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function a9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppressionAsync"),I=M(l,"scores","nonMaxSuppressionAsync"),S=Ys(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x=await Promise.all([f.data(),I.data()]),v=x[0],O=x[1],C=ZR(v,O,u,p,g);return f!==r&&f.dispose(),I!==l&&I.dispose(),C}const nO=a9;function c9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=Ys(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v={boxes:I,scores:S},O={maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f},C=Y.runKernel($2,v,O);return{selectedIndices:C[0],selectedScores:C[1]}}const sO=z({nonMaxSuppressionWithScore_:c9});async function l9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=Ys(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v=await Promise.all([I.data(),S.data()]),O=v[0],C=v[1],U=eO(O,C,u,p,g,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),U}const iO=l9;function h9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=Ys(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,U={boxes:I,scores:S},G={maxOutputSize:v,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:f},ne=Y.runKernel(W2,U,G);return{selectedIndices:ne[0],validOutputs:ne[1]}}const rO=z({nonMaxSuppressionPadded_:h9});async function u9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=Ys(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[U,G]=await Promise.all([I.data(),S.data()]),ne=QR(U,G,v,O,C,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),ne}const oO=u9;function d9(r,l,u=!1){const p=M(r,"images","resizeBilinear");Z(p.rank===3||p.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x=(U,G)=>(G([g]),U.resizeBilinear(g,I,S,u)),v={images:g},O={alignCorners:u,size:l},C=Y.runKernelFunc(x,v,null,Xm,O);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const aO=z({resizeBilinear_:d9});function p9(r,l,u=!1){const p=M(r,"images","resizeNearestNeighbor");Z(p.rank===3||p.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(p.dtype==="float32"||p.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x={images:g},v={alignCorners:u,size:l},O=(U,G)=>(G([g]),U.resizeNearestNeighbor(g,I,S,u)),C=Y.runKernelFunc(O,x,null,Km,v);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const cO=z({resizeNearestNeighbor_:p9});function m9(r,l,u){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(u%1===0,()=>`bandPart(): numUpper must be an integer, got ${u}.`);const p=M(r,"a","bandPart");Z(p.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${p.rank}.`);const g=p.shape,[f,I]=p.shape.slice(-2);if(!(l<=f))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${f}).`);if(!(u<=I))throw new Error(`bandPart(): numUpper (${u}) must not be greater than the number of columns (${I}).`);l<0&&(l=f),u<0&&(u=I);const S=ie(Df(0,f,1,"int32"),[-1,1]),x=Df(0,I,1,"int32"),v=Be(S,x),O=Jo(mr(v,ke(+l,"int32")),pr(v,ke(-u,"int32"))),C=Es([f,I],p.dtype);return ie(Vs(Su(ie(p,[-1,f,I])).map(U=>Bn(O,U,C))),g)}const lO=z({bandPart_:m9});function f9(r){let l;if(Array.isArray(r)){l=!1,Z(r!=null&&r.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");const g=r[0].shape[0];for(let f=1;f`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[f].shape[0]} vs. ${g})`)}else l=!0,r=eo(r,r.shape[0],0).map(g=>II(g,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const u=[],p=r;for(let g=0;g{let f=p[g];if(g>0)for(let I=0;I=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return uO(r,l);{const u=r.shape.slice(0,r.shape.length-2).reduce((x,v)=>x*v),p=Su(ie(r,[u,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),g=[],f=[];p.forEach(x=>{const[v,O]=uO(x,l);g.push(v),f.push(O)});const I=ie(Vs(g,0),r.shape),S=ie(Vs(f,0),r.shape);return[I,S]}}function uO(r,l=!1){return Y.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const u=r.shape[0],p=r.shape[1];let g=sI(u),f=pi(r);const I=ea([[1]],[1,1]);let S=pi(I);const x=u>=p?p:u;for(let v=0;v{const G=Tt(f,[v,v],[u-v,1]),ne=kf(G),te=Tt(f,[v,v],[1,1]),oe=Bn(mi(te,0),ea([[-1]]),ea([[1]])),ge=Be(te,ae(oe,ne)),fe=Pe(G,ge);fe.shape[0]===1?S=pi(I):S=yn([I,Tt(fe,[1,0],[fe.shape[0]-1,fe.shape[1]])],0);const Ae=yt(Pe(un(oe,ge),ne)),Te=Tt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=Wt(S);if(v===0)f=Be(Te,un(Ve,un(rt,Te)));else{const Kt=Be(Te,un(Ve,un(rt,Te)));f=yn([Tt(f,[0,0],[v,p]),Kt],0)}const vt=Wt(Ve),$t=Tt(g,[0,v],[u,g.shape[1]-v]);if(v===0)g=Be($t,un(un($t,S),vt));else{const Kt=Be($t,un(un($t,S),vt));g=yn([Tt(g,[0,0],[u,v]),Kt],1)}return[S,f,g]}),DR([O,C,U])}return!l&&u>p&&(g=Tt(g,[0,0],[u,p]),f=Tt(f,[0,0],[p,p])),[g,f]})}const dO=z({qr_:g9});var jt;(function(r){r[r.NONE=0]="NONE",r[r.MEAN=1]="MEAN",r[r.SUM=2]="SUM",r[r.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(jt||(jt={}));function y9(r,l,u=jt.SUM_BY_NONZERO_WEIGHTS){const p=M(r,"losses","computeWeightedLoss");let g=null;l!=null&&(g=M(l,"weights","computeWeightedLoss"));const f=g==null?p:ae(p,g);if(u===jt.NONE)return f;if(u===jt.SUM)return Fe(f);if(u===jt.MEAN){if(g==null)return dI(f);{const I=p.size/g.size,S=Pe(Fe(f),Fe(g));return I>1?Pe(S,ke(I)):S}}if(u===jt.SUM_BY_NONZERO_WEIGHTS){if(g==null)return Pe(Fe(f),ke(p.size));{const I=ae(g,Gi(p.shape)),S=Le(Fe(mI(I,ke(0))),"float32");return Pe(Fe(f),S)}}throw Error(`Unknown reduction: ${u}`)}const xn=z({computeWeightedLoss_:y9});function b9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","absoluteDifference"),f=M(l,"predictions","absoluteDifference");let I=null;u!=null&&(I=M(u,"weights","absoluteDifference")),Zt(g.shape,f.shape,"Error in absoluteDifference: ");const S=Un(Be(g,f));return xn(S,I,p)}const pO=z({absoluteDifference_:b9});function w9(r,l,u,p,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","cosineDistance"),I=M(l,"predictions","cosineDistance");let S=null;p!=null&&(S=M(p,"weights","cosineDistance")),Zt(f.shape,I.shape,"Error in cosineDistance: ");const x=ke(1),v=Be(x,Fe(ae(f,I),u,!0));return xn(v,S,g)}const mO=z({cosineDistance_:w9});function L9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"labels","hingeLoss");const f=M(l,"predictions","hingeLoss");let I=null;u!=null&&(I=M(u,"weights","hingeLoss")),Zt(g.shape,f.shape,"Error in hingeLoss: ");const S=ke(1);g=Be(ae(ke(2),g),S);const x=bu(Be(S,ae(g,f)));return xn(x,I,p)}const fO=z({hingeLoss_:L9});function S9(r,l,u,p=1,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","huberLoss"),I=M(l,"predictions","huberLoss");let S=null;u!=null&&(S=M(u,"weights","huberLoss")),Zt(f.shape,I.shape,"Error in huberLoss: ");const x=ke(p),v=Un(Be(I,f)),O=pI(v,x),C=Be(v,O),U=Lt(ae(ke(.5),ut(O)),ae(x,C));return xn(U,S,g)}const gO=z({huberLoss_:S9});function I9(r,l,u,p=1e-7,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","logLoss"),I=M(l,"predictions","logLoss");let S=null;u!=null&&(S=M(u,"weights","logLoss")),Zt(f.shape,I.shape,"Error in logLoss: ");const x=ke(1),v=ke(p),O=yt(ae(f,Zr(Lt(I,v)))),C=ae(Be(x,f),Zr(Lt(Be(x,I),v))),U=Be(O,C);return xn(U,S,g)}const yO=z({logLoss_:I9});function x9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","meanSquaredError"),f=M(l,"predictions","meanSquaredError");let I=null;u!=null&&(I=M(u,"weights","meanSquaredError")),Zt(g.shape,f.shape,"Error in meanSquaredError: ");const S=SI(g,f);return xn(S,I,p)}const bO=z({meanSquaredError_:x9});function T9(r,l){const u=M(r,"labels","sigmoidCrossEntropyWithLogits"),p=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(u.shape,p.shape,"Error in sigmoidCrossEntropyWithLogits: ");const g=bu(p),f=ae(p,u),I=lI(Mn(yt(Un(p))));return Lt(Be(g,f),I)}function A9(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"multiClassLabels","sigmoidCrossEntropy");const I=M(l,"logits","sigmoidCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","sigmoidCrossEntropy")),Zt(f.shape,I.shape,"Error in sigmoidCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(.5);f=Lt(ae(f,Be(O,v)),ae(C,v))}const x=T9(f,I);return xn(x,S,g)}const wO=z({sigmoidCrossEntropy_:A9});function v9(r,l,u=-1){if(u===-1&&(u=l.rank-1),u!==l.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${l.rank} and dim was ${u}`);const p=Of((g,f,I)=>{const S=!0,x=hI(f,[u],S),v=Be(Le(f,"float32"),x);I([g,v]);const O=yt(ae(v,g)),C=Fe(O,[u]),U=(G,ne)=>{const[te,oe]=ne,ge=Zn(G.shape,[u]);return[ae(ie(G,ge),Be(Le(te,"float32"),Mn(oe))),ae(ie(G,ge),Be(Mn(oe),Le(te,"float32")))]};return{value:C,gradFunc:U}});return p(r,l)}function N9(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"onehotLabels","softmaxCrossEntropy");const I=M(l,"logits","softmaxCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","softmaxCrossEntropy")),Zt(f.shape,I.shape,"Error in softmaxCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(f.shape[1]);f=Lt(ae(f,Be(O,v)),Pe(v,C))}const x=v9(f,I);return xn(x,S,g)}const LO=z({softmaxCrossEntropy_:N9});const ITe={fft:wu,ifft:Rc,rfft:Lu,irfft:LI},NTe={hammingWindow:YR,hannWindow:Wf,frame:$f,stft:HR},SO={flipLeftRight:jR,resizeNearestNeighbor:cO,resizeBilinear:aO,rotateWithOffset:KR,cropAndResize:qR,nonMaxSuppression:XR,nonMaxSuppressionAsync:nO,nonMaxSuppressionWithScore:sO,nonMaxSuppressionWithScoreAsync:iO,nonMaxSuppressionPadded:rO,nonMaxSuppressionPaddedAsync:oO},zTe={bandPart:lO,gramSchmidt:hO,qr:dO},ZTe={absoluteDifference:pO,computeWeightedLoss:xn,cosineDistance:mO,hingeLoss:fO,huberLoss:gO,logLoss:yO,meanSquaredError:bO,sigmoidCrossEntropy:wO,softmaxCrossEntropy:LO};const IO=1.7580993408473768,xO=1.0507009873554805;const TO={kernelName:Lm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Qo(Le(u,"float32"),-1))}}};const AO={kernelName:kC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ut(Le(u,"float32")),g=ps(Be(ke(1),p));return yt(Pe(r,g))}}}};const vO={kernelName:FC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Be(ut(Le(u,"float32")),1));return Pe(r,p)}}}};const NO={kernelName:yc,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=At(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=At(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,p.shape)};return{a:f,b:I}}};const CO={kernelName:_C,saveAllInputs:!0,gradFunc:(r,l)=>{const u={};return l.forEach((p,g)=>{u[g]=()=>r.clone()}),u}};const RO={kernelName:WC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>qe(u)}}};const OO={kernelName:$C,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>qe(u)}}};const EO={kernelName:UC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ps(Be(ke(1),ut(Le(u,"float32")))))}}};const DO={kernelName:BC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Lt(ke(1),ut(Le(u,"float32"))));return Pe(r,p)}}}};const kO={kernelName:zC,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Lt(ut(u),ut(p));let x=ae(r,Pe(p,S));const v=At(u.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,u.shape)},I=()=>{const S=Lt(ut(u),ut(p));let x=yt(ae(r,Pe(u,S)));const v=At(p.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,p.shape)};return{a:f,b:I}}};const FO={kernelName:MC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(ut(Le(u,"float32")),1))}}};const _O={kernelName:PC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Be(ke(1),ut(Le(u,"float32"))))}}};function C9(r,l,u,p,g=[1,1,1],f,I){const S=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let v=S,O=x,C=!1;x.rank===4&&(C=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2],S.shape[3]]),O=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(v.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${v.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(Jr(p,g),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${p} and dilations '${g}'`),I!=null&&Z(Qt(f),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const U=oe=>{const ge=Cf(O.shape,u,p,g,f,I);return oe.avgPool3dBackprop(v,O,ge)},G={dy:v,input:O},ne={filterSize:u,strides:p,dilations:g,pad:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,HC,ne);return C?ie(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const WO=z({avgPool3dBackprop_:C9});const $O={kernelName:YC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,dilations:I,pad:S,dimRoundingMode:x}=u,v=I==null?[1,1,1]:I;return{x:()=>WO(r,p,g,f,v,S,x)}}};function R9(r,l,u,p,g){const f=M(r,"dy","avgPoolBackprop"),I=M(l,"input","avgPoolBackprop");Z(I.rank===f.rank,()=>`Rank of input (${I.rank}) does not match rank of dy (${f.rank})`);let S=I,x=f,v=!1;I.rank===3&&(v=!0,S=ie(I,[1,I.shape[0],I.shape[1],I.shape[2]]),x=ie(f,[1,f.shape[0],f.shape[1],f.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(S.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${S.rank}.`);const O=ne=>{const te=Nf(S.shape,u,p,1,g);return ne.avgPoolBackprop(x,S,te)},C={dy:x,input:S},U={filterSize:u,strides:p,pad:g},G=Y.runKernelFunc(O,C,null,VC,U);return v?ie(G,[G.shape[1],G.shape[2],G.shape[3]]):G}const UO=z({avgPoolBackprop_:R9});const BO={kernelName:GC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,pad:I}=u;return{x:()=>UO(r,p,g,f,I)}}};const MO={kernelName:Sm,inputsToSave:["a","b"],gradFunc:(r,l,u)=>{const[p,g]=l,{transposeA:f,transposeB:I}=u;return!f&&!I?{a:()=>un(r,g,!1,!0),b:()=>un(p,r,!0,!1)}:!f&&I?{a:()=>un(r,g,!1,!1),b:()=>un(r,p,!0,!1)}:f&&!I?{a:()=>un(g,r,!1,!0),b:()=>un(p,r,!1,!1)}:{a:()=>un(g,r,!0,!0),b:()=>un(r,p,!0,!0)}}};const PO={kernelName:Im,gradFunc:(r,l,u)=>{const{blockShape:p,crops:g}=u;return{x:()=>gI(r,p,g)}}};const zO={kernelName:xm,gradFunc:(r,l,u)=>{const p=u,g=p.inputShape,f=p.shape,I=Array.from(f);for(let x=g.length-1;x>=0;x--)if(g[x]===f[x])I[x]=1;else if(g[x]!==1)throw new Error(`broadcastTo(): [${g}] cannot be broadcast to [${f}].`);const S=[];for(let x=0;x1&&S.push(x);return{x:()=>Fe(r,S,!0)}}};const GO={kernelName:bc,gradFunc:r=>({x:()=>r.clone()})};const VO={kernelName:qC,gradFunc:r=>({x:()=>qe(r)})};const YO={kernelName:jC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{clipValueMin:g,clipValueMax:f}=u;return{x:()=>Bn(Jo(pr(p,g),mr(p,f)),r,qe(r))}}};const HO={kernelName:Tm,saveAllInputs:!0,gradFunc:(r,l,u)=>{const p=l.map(x=>x.shape),{axis:g}=u,f=ht(g,l[0].shape)[0],I=p.map(x=>x[f]),S=eo(r,I,f);return S.map(x=>()=>x)}};const qO={kernelName:Am,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{dilations:f,strides:I,pad:S,dataFormat:x}=u;return Z(Xr(f),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${f}'`),{x:()=>$R(p.shape,r,g,I,S,x),filter:()=>_f(p,r,g.shape,I,S,x)}}};const jO={kernelName:vm,inputsToSave:["dy","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{strides:f,pad:I,dataFormat:S,dimRoundingMode:x}=u;return{dy:()=>QS(r,g,f,I,S,1,x),filter:()=>_f(r,p,g.shape,f,I,S,x)}}};function O9(r,l,u,p,g){let f=r;r.rank===4&&(f=ie(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let I=l;I.rank===4&&(I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(f.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${f.shape}.`),Z(I.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${I.shape}.`),Z(u.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${u}.`),Z(f.shape[4]===u[3],()=>`Error in conv3dDerFilter: depth of input ${f.shape[4]}) must match input depth in filter (${u[3]}.`),Z(I.shape[4]===u[4],()=>`Error in conv3dDerFilter: depth of dy (${I.shape[4]}) must match output depth for filter (${u[4]}).`);const S=O=>{const C=1,U=fu(f.shape,u,p,C,g);return O.conv3dDerFilter(f,I,U)},x={x:f,y:I},v={strides:p,pad:g};return Y.runKernelFunc(S,x,null,ZC,v)}const KO=z({conv3DBackpropFilter_:O9});const XO={kernelName:JC,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f}=u;Z(Xr(p),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${p}'`);const[I,S]=l;return{x:()=>UR(I.shape,r,S,g,f),filter:()=>KO(I,r,S.shape,g,f)}}};const JO={kernelName:Nm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(yt(bI(Le(u,"float32"))),r)}}};const ZO={kernelName:Cm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(wI(Le(u,"float32")),r)}}};const QO={kernelName:Rm,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{axis:g,exclusive:f,reverse:I}=u;return{x:()=>{const S=ds([g],p.rank);let x=tI(r,g,f,!I);return S!=null&&(x=Wt(x,S)),x}}}};const e1={kernelName:t2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f,dimRoundingMode:I}=u,S=p==null?[1,1]:p;Z(Xr(S),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${S}'`);const[x,v]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(v.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${v.rank}.`),Z(x.shape[3]===v.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${v.shape[2]}.`),Z(Jr(g,S),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${g} and dilations '${S}'.`),I!=null&&Z(Qt(f),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=dr(x.shape,v.shape,g,S,f,I,!0);return{x:()=>VR(x.shape,r,v,O),filter:()=>GR(x,r,v.shape,O)}}};const t1={kernelName:i2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,f={x:p,filter:g,dy:r},I={x:p,filter:g,dy:r};return{x:()=>Y.runKernel(r2,f,u),filter:()=>Y.runKernel(o2,I,u)}}};const n1={kernelName:Om,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=At(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=ut(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const s1={kernelName:a2,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l,p=f=>f.eluDer(r,u),g={dy:r,y:u};return{x:()=>Y.runKernelFunc(p,g,null,c2)}}};const i1={kernelName:l2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(Mn(yt(ut(u))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,p)}}};const r1={kernelName:Em,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,u)}}};const o1={kernelName:u2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Mn(u))}}};const a1={kernelName:Dm,gradFunc:r=>({x:()=>qe(r)})};const c1={kernelName:km,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=At(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=ut(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const l1={kernelName:f2,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,u)=>{const{varianceEpsilon:p}=u,[g,f,I,S]=l,x=S==null?ke(1):S,v=At(f.shape,g.shape),O=[];if(f.rank===1){for(let Te=0;Tef.rank===1?ie(ae(ae(r,Ko(ie(G,[1,1,1,f.shape[0]]),O)),x),g.shape):ie(ae(ae(r,G),x),g.shape),oe=()=>{let Te=ae(ae(G,ke(-1)),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},ge=()=>{let Te=ae(ae(ne,C),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},fe=()=>{const Te=ae(C,G);let Ve=ae(r,Te);return f.rank===1&&(Ve=Fe(Ve,v)),ie(Ve,f.shape)},Ae=()=>{let Te=r;return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)};return{x:te,mean:oe,variance:ge,scale:fe,offset:Ae}}};const d1={kernelName:Fm,inputsToSave:["x","indices"],gradFunc:(r,l,u)=>{const[p,g]=l,{axis:f}=u,I=ht(f,p.shape)[0],S=()=>{const x=p.shape,v=g.size,O=x.slice(0,I),C=O.length,U=x.slice(f,x.length).slice(1),G=U.length,ne=h1(0,C),te=h1(C+1,C+1+G),oe=u1([O,[v],U]),ge=ie(r,oe),fe=ie(g,[v]),Ae=u1([[C],ne,te]),Te=Wt(ge,Ae);let Ve=xI(Te,fe,p.shape[I]);const rt=Tc(Ae);return Ve=Wt(Ve,rt),Ve};return{x:S,indices:()=>g}}};function h1(r,l){const u=[];for(let p=r;p{const[u,p]=l;return{a:()=>qe(u),b:()=>qe(p)}}};const m1={kernelName:Wm,gradFunc:r=>({x:()=>Le(r,"float32")})};const f1={kernelName:w2,gradFunc:r=>({x:()=>qe(r)})};const g1={kernelName:L2,gradFunc:r=>({x:()=>qe(r)})};const y1={kernelName:S2,gradFunc:r=>({x:()=>qe(r)})};const b1={kernelName:Um,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(u,1))}}};const w1={kernelName:$m,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Le(u,"float32"))}}};const L1={kernelName:v2,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{axis:g}=u;return{logits:()=>{const f=!0,I=Mn(p);return Be(r,ae(Fe(r,g,f),I))}}}};function E9(r,l,u,p=5,g=1,f=1,I=.5){const S=O=>O.LRNGrad(u,r,l,p,g,f,I),x={x:r,y:l,dy:u},v={depthRadius:p,bias:g,alpha:f,beta:I};return Y.runKernelFunc(S,x,null,C2,v)}const S1=z({localResponseNormalizationBackprop_:E9});const I1={kernelName:N2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{depthRadius:f,bias:I,alpha:S,beta:x}=u;return{x:()=>S1(p,g,r,f,I,S,x)}}};function Uf(r,l,u,p,g){return l.rank{const f=ae(r,Le(nI(u,l),r.dtype));return g==null?f:Wt(f,g)}}}const AI={kernelName:Bm,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{reductionIndices:g}=p,[f,I]=l,S=ht(g,f.shape),x=ds(S,f.rank),v=Uf(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=Wt(O)),O}}}};const x1={kernelName:Mm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(pr(u,p),"float32")),f=()=>ae(r,Le(cI(u,p),"float32"));return{a:g,b:f}}};function D9(r,l,u,p,g,f=[1,1,1],I,S){const x=M(r,"dy","maxPool3dBackprop"),v=M(l,"input","maxPool3dBackprop"),O=M(u,"output","maxPool3dBackprop");let C=x,U=v,G=O,ne=!1;v.rank===4&&(ne=!0,C=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),U=ie(v,[1,v.shape[0],v.shape[1],v.shape[2],v.shape[3]]),G=ie(O,[1,O.shape[0],O.shape[1],O.shape[2],O.shape[3]])),Z(C.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${C.rank}.`),Z(U.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${U.rank}.`),Z(G.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${G.rank}.`),Z(Jr(g,f),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${g} and dilations '${f}'`),S!=null&&Z(Qt(I),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${I}.`);const te=Ae=>{const Te=Cf(U.shape,p,g,f,I,S);return Ae.maxPool3dBackprop(C,U,G,Te)},oe={dy:C,input:U,output:G},ge={filterSize:p,strides:g,dilations:f,pad:I,dimRoundingMode:S},fe=Y.runKernelFunc(te,oe,null,D2,ge);return ne?ie(fe,[fe.shape[1],fe.shape[2],fe.shape[3],fe.shape[4]]):fe}const T1=z({maxPool3dBackprop_:D9});const A1={kernelName:E2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,dilations:S,pad:x,dimRoundingMode:v}=u,O=S==null?[1,1,1]:S;return{x:()=>T1(r,p,g,f,I,O,x,v)}}};function k9(r,l,u,p,g,f,I){const S=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),v=M(u,"output","maxPoolBackprop");Z(x.rank===S.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${S.rank})`),Z(S.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${S.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),I!=null&&Z(Qt(f),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=G=>{const ne=Nf(x.shape,p,g,1,f,I);return G.maxPoolBackprop(S,x,v,ne)},C={dy:S,input:x,output:v},U={filterSize:p,strides:g,pad:f,dimRoundingMode:I};return Y.runKernelFunc(O,C,null,O2,U)}const v1=z({maxPoolBackprop_:k9});const N1={kernelName:R2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,pad:S}=u;return{x:()=>v1(r,p,g,f,I,S)}}};const C1={kernelName:Pm,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{axis:g}=p,[f,I]=l,S=ht(g,f.shape),x=ds(S,f.rank),v=Uf(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=Wt(O)),O}}}};const R1={kernelName:zm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(mr(u,p),"float32")),f=()=>ae(r,Le(mi(u,p),"float32"));return{a:g,b:f}}};const O1={kernelName:k2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=At(u.shape,g);return S.length>0?ie(Fe(r,S),u.shape):r},I=()=>{const S=ae(r,yt(rI(Pe(u,p)))),x=At(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const E1={kernelName:Gm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=ae(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{const S=ae(r,Le(u,"float32")),x=At(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const D1={kernelName:Vm,gradFunc:r=>({x:()=>yt(r)})};const k1={kernelName:B2,inputsToSave:["indices"],gradFunc:(r,l)=>{const u=l[0];return{indices:()=>Es(u.shape,"float32")}}};const F1={kernelName:U2,gradFunc:r=>({x:()=>qe(r)})};const vI={kernelName:Ym,inputsToSave:["x"],gradFunc:(r,l,u)=>{const p=l[0],{paddings:g}=u,f=g.map(I=>I[0]);return{x:()=>Tt(r,f,p.shape)}}};const _1={kernelName:Hm,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[u,p,g]=l,f=u,I=p,S=it(f.shape,I.shape),x=()=>{const O=Le(I,"float32");let C=ae(r,ae(O,Zo(f,Be(O,ke(1)))));const U=At(f.shape,S);return U.length>0&&(C=Fe(C,U)),ie(C,f.shape)},v=()=>{const O=mi(f,0),C=Bn(O,Zr(f),qe(f));let U=ae(r,ae(g,C));const G=At(I.shape,S);return G.length>0&&(U=Fe(U,G)),ie(U,I.shape)};return{a:x,b:v}}};const W1={kernelName:M2,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[u,p]=l,g=mi(u,0);return{x:()=>Bn(g,r,ae(r,p)),alpha:()=>{let f=Bn(g,qe(r),ae(r,u));const I=At(p.shape,r.shape);return I.length>0&&(f=Fe(f,I)),ie(f,p.shape)}}}};const $1={kernelName:G2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,yt(ut(u)))}}};const U1={kernelName:H2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(mr(u,6),Qo(u));return{x:()=>ae(r,Le(p,"float32"))}}};const B1={kernelName:qm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Le(Qo(u),"float32"))}}};const M1={kernelName:jm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ie(r,u.shape)}}};const P1={kernelName:Xm,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeBilinearBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,Y2,u);return{images:I}}};const z1={kernelName:Km,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeNearestNeighborBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,V2,u);return{images:I}}};const G1={kernelName:Jm,gradFunc:(r,l,u)=>{const{dims:p}=u,g=ht(p,r.shape);return{x:()=>Cc(r,g)}}};const V1={kernelName:q2,gradFunc:r=>({x:()=>qe(r)})};const Y1={kernelName:Zm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>yt(Pe(r,ae(Zo(u,1.5),2)))}}};const H1={kernelName:Qm,inputsToSave:["condition"],gradFunc:(r,l)=>{const[u]=l;return{condition:()=>Le(qe(u),"float32"),t:()=>ae(r,Le(u,r.dtype)),e:()=>ae(r,Le(uI(u),r.dtype))}}};const q1={kernelName:j2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=mi(u,ke(0)),g=ke(IO),f=ke(xO),I=ae(r,f),S=ae(ae(r,g),Mn(Le(u,"float32")));return Bn(p,I,S)}}}};const j1={kernelName:sf,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(u,Be(ke(1),u)))}}};const K1={kernelName:K2,gradFunc:r=>({x:()=>qe(r)})};const X1={kernelName:tf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(gu(Le(u,"float32")),r)}}};const J1={kernelName:nf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(eI(Le(u,"float32")),r)}}};const Z1={kernelName:ef,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{begin:g,size:f}=u,I=p.shape,[S,x]=Af(p,g,f),v=[];for(let O=0;OfI(r,v)}}};const Q1={kernelName:J2,outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{dim:g}=u,f=!0,I=ae(r,p);return{logits:()=>Be(I,ae(Fe(I,[g],f),p))}}};const eE={kernelName:X2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,JS(u))}}};const NI={kernelName:af,gradFunc:(r,l,u)=>{const{blockShape:p,paddings:g}=u;return{x:()=>ZS(r,p,g)}}};const CI={kernelName:cf,gradFunc:(r,l,u)=>{const{axis:p}=u;return{x:()=>yn(r,p)}}};const tE={kernelName:rf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ae(ps(Le(u,"float32")),2))}}};const nE={kernelName:Z2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(Le(u,"float32"),2))}}};const sE={kernelName:lf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=ke(2),f=()=>ae(r,ae(g,Be(u,p))),I=()=>ae(r,ae(g,Be(p,u)));return{a:f,b:I}}};const iE={kernelName:gf,gradFunc:r=>({x:()=>qe(r)})};const rE={kernelName:hf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=At(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=At(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(yt(S),p.shape)};return{a:f,b:I}}};const oE={kernelName:of,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,g=p.shape.slice(),{axis:f}=u,I=ht(f,p.shape);I.forEach(v=>{g[v]=1});const S=ie(r,g),x=ae(S,Gi(p.shape,"float32"));return{x:()=>x}}};const aE={kernelName:Q2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ut(gu(u)))}}};const cE={kernelName:eR,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Be(ke(1),ut(u)),r)}}};const lE={kernelName:uf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{reps:g}=u,f=()=>{let I=qe(p);if(p.rank===1)for(let S=0;S{const p=u,{perm:g}=p,f=Tc(g);return{x:()=>Wt(r,f)}}};const uE={kernelName:pf,gradFunc:(r,l,u)=>{const p=u,{axis:g}=p;return{value:()=>Vs(r,g)}}};const dE={kernelName:mf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[u]=l,p=()=>F9(r,u);return{x:p}}};function F9(r,l){const u=aI(l,qe(l)),p=oI(r,u);let g=pr(l,ke(0,"int32"));const f=p.rank-g.rank;for(let S=0;S({x:()=>qe(r)})};const _9=[TO,AO,vO,NO,CO,RO,OO,EO,DO,kO,FO,_O,$O,BO,MO,PO,zO,GO,VO,YO,HO,jO,qO,XO,JO,ZO,QO,e1,t1,n1,s1,i1,r1,o1,c1,a1,l1,d1,p1,m1,f1,g1,y1,b1,w1,L1,I1,AI,AI,x1,A1,N1,C1,R1,O1,E1,D1,k1,F1,vI,vI,_1,W1,$1,U1,B1,M1,P1,z1,G1,V1,Y1,H1,q1,j1,K1,X1,J1,Z1,Q1,eE,NI,NI,CI,CI,tE,sE,nE,iE,rE,oE,aE,cE,lE,hE,uE,dE,pE];for(const r of _9)sR(r);function RI(r,l,u=!1){const{Image:p,Canvas:g}=gt.getEnv();if(!(r instanceof p||r instanceof g))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const f=Yo(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=gc({width:l,height:l}),O=r instanceof g?r:ou(r),C=Math.abs(S-x)/2,U=u&&S{if(lr(u)){this._imageTensors[p]=u,this._inputDimensions[p]=u.shape;return}if(Ns(u)){const f=u.shape[0];if(f!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${f} passed, but not supported in input array`);this._imageTensors[p]=u,this._inputDimensions[p]=u.shape.slice(1);return}const g=u instanceof gt.getEnv().Canvas?u:ou(u);this._canvases[p]=g,this._inputDimensions[p]=[g.height,g.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 Wi(this.batchSize,0,1).map((r,l)=>this.getReshapedInputDimensions(l))}getInput(r){return this.canvases[r]||this.imageTensors[r]}getInputDimensions(r){return this._inputDimensions[r]}getInputHeight(r){return this._inputDimensions[r][0]}getInputWidth(r){return this._inputDimensions[r][1]}getReshapedInputDimensions(r){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");const l=this.getInputWidth(r),u=this.getInputHeight(r);return pS({width:l,height:u},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,ER(()=>{const u=Wi(this.batchSize,0,1).map(g=>{const f=this.getInput(g);if(f instanceof In){let I=Ns(f)?f:f.expandDims();return I=yS(I,l),(I.shape[1]!==r||I.shape[2]!==r)&&(I=SO.resizeBilinear(I,[r,r])),I.as3D(r,r,3)}if(f instanceof gt.getEnv().Canvas)return jS.fromPixels(RI(f,r,l));throw new Error(`toBatchTensor - at batchIdx ${g}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${f}`)}),p=Vs(u.map(g=>Le(g,"float32"))).as4D(this.batchSize,r,r,3);return p})}}async function Rt(r){if(r instanceof to)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const u=g=>Array.isArray(r)?` at input index ${g}:`:"",p=l.map(Vo);return p.forEach((g,f)=>{if(!wm(g)&&!lr(g)&&!Ns(g))throw typeof l[f]=="string"?new Error(`toNetInput -${u(f)} string passed, but could not resolve HTMLElement for element id ${l[f]}`):new Error(`toNetInput -${u(f)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Ns(g)){const I=g.shape[0];if(I!==1)throw new Error(`toNetInput -${u(f)} tf.Tensor4D with batchSize ${I} passed, but not supported in input array`)}}),await Promise.all(p.map(g=>wm(g)&&AS(g))),new to(p,Array.isArray(r))}async function Oc(r,l){const{Canvas:u}=gt.getEnv();let p=r;if(!(r instanceof u)){const I=await Rt(r);if(I.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const S=I.getInput(0);p=S instanceof u?S:await NS(S)}const g=Jn(p),f=l.map(I=>I instanceof Ht?I.forSize(p.width,p.height).box.floor():I).map(I=>I.clipAtImageBorders(p.width,p.height));return f.map(({x:I,y:S,width:x,height:v})=>{const O=gc({width:x,height:v});return Jn(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const Bf=Ke(Xe());async function Ec(r,l){if(!lr(r)&&!Ns(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Ns(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Bf.tidy(()=>{const[u,p,g]=r.shape.slice(Ns(r)?1:0),f=l.map(S=>S instanceof Ht?S.forSize(p,u).box:S).map(S=>S.clipAtImageBorders(p,u)),I=f.map(({x:S,y:x,width:v,height:O})=>Bf.slice3d(r.as3D(u,p,g),[x,S,0],[O,v,g]));return I})}async function ta(r,l){const u=gt.getEnv().fetch,p=await u(r,l);if(!(p.status<400))throw new Error(`failed to fetch: (${p.status}) ${p.statusText}, from url: ${p.url}`);return p}async function W9(r){const l=await ta(r),u=await l.blob();if(!u.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${u.type}, for url: ${l.url}`);return vS(u)}async function OI(r){return(await ta(r)).json()}async function $9(r){return new Float32Array(await(await ta(r)).arrayBuffer())}function Mf(r,l){const u=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:u};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${u}`};const p=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(p,"");const g=r.split("/").filter(S=>S),f=r.endsWith(".json")?g[g.length-1]:u;let I=p+(r.endsWith(".json")?g.slice(0,g.length-1):g).join("/");return I=r.startsWith("/")?`/${I}`:I,{modelBaseUri:I,manifestUri:I==="/"?`/${f}`:`${I}/${f}`}}const mE=Ke(Xe());async function EI(r,l){const{manifestUri:u,modelBaseUri:p}=Mf(r,l);let g=await OI(u);return mE.io.loadWeights(g,p)}function U9(r,l,u=!1){const{width:p,height:g}=u?Yo(l):l;return r.width=p,r.height=g,{width:p,height:g}}const fr=Ke(Xe());class En{constructor(r){this._name=r;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(r){const{obj:l,objProp:u}=this.traversePropertyPath(r);return l[u]}reassignParamFromPath(r,l){const{obj:u,objProp:p}=this.traversePropertyPath(r);u[p].dispose(),u[p]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof fr.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof fr.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const u=fr.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,u)})}dispose(r=!0){this.getParamList().forEach(l=>{if(r&&l.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${l.path}`);l.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:r})=>Array.from(r.dataSync())).reduce((r,l)=>r.concat(l)))}async load(r){if(r instanceof Float32Array){this.extractWeights(r);return}await this.loadFromUri(r)}async loadFromUri(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);const l=await EI(r,this.getDefaultModelName());this.loadFromWeightMap(l)}async loadFromDisk(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);const{readFile:l}=gt.getEnv(),{manifestUri:u,modelBaseUri:p}=Mf(r,this.getDefaultModelName()),g=x=>Promise.all(x.map(v=>l(v).then(O=>O.buffer))),f=fr.io.weightsLoaderFactory(g),I=JSON.parse((await l(u)).toString()),S=await f(I,p);this.loadFromWeightMap(S)}loadFromWeightMap(r){const{paramMappings:l,params:u}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=u}extractWeights(r){const{paramMappings:l,params:u}=this.extractParams(r);this._paramMappings=l,this._params=u}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((g,f)=>{if(!g.nextObj.hasOwnProperty(f))throw new Error(`traversePropertyPath - object does not have property ${f}, for path ${r}`);return{obj:g.nextObj,objProp:f,nextObj:g.nextObj[f]}},{nextObj:this.params}),{obj:u,objProp:p}=l;if(!u||!p||!(u[p]instanceof fr.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:u,objProp:p}}}const Dc=Ke(Xe());function Qn(r,l,u){return Dc.tidy(()=>{let p=Dc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Dc.add(p,l.bias),p})}const Dt=Ke(Xe());function Pf(r,l,u=!1){return Dt.tidy(()=>{const p=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):Qn(r,l.conv0,[2,2])),g=Qn(p,l.conv1,[1,1]),f=Dt.relu(Dt.add(p,g)),I=Qn(f,l.conv2,[1,1]);return Dt.relu(Dt.add(p,Dt.add(g,I)))})}function Iu(r,l,u=!1,p=!0){return Dt.tidy(()=>{const g=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,p?[2,2]:[1,1],"same"),l.conv0.bias):Qn(r,l.conv0,p?[2,2]:[1,1])),f=Qn(g,l.conv1,[1,1]),I=Dt.relu(Dt.add(g,f)),S=Qn(I,l.conv2,[1,1]),x=Dt.relu(Dt.add(g,Dt.add(f,S))),v=Qn(x,l.conv3,[1,1]);return Dt.relu(Dt.add(g,Dt.add(f,Dt.add(S,v))))})}const no=Ke(Xe());function na(r,l,u="same",p=!1){return no.tidy(()=>{const g=no.add(no.conv2d(r,l.filters,[1,1],u),l.bias);return p?no.relu(g):g})}function Pn(r,l){Object.keys(r).forEach(u=>{l.some(p=>p.originalPath===u)||r[u].dispose()})}const zf=Ke(Xe());function kc(r,l){return function(u,p,g,f){const I=zf.tensor4d(r(u*p*g*g),[g,g,u,p]),S=zf.tensor1d(r(p));return l.push({paramPath:`${f}/filters`},{paramPath:`${f}/bias`}),{filters:I,bias:S}}}const Gf=Ke(Xe());function Vf(r,l){return function(u,p,g){const f=Gf.tensor2d(r(u*p),[u,p]),I=Gf.tensor1d(r(p));return l.push({paramPath:`${g}/weights`},{paramPath:`${g}/bias`}),{weights:f,bias:I}}}class DI{constructor(r,l,u){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=u}}const xu=Ke(Xe());function Fc(r,l){return function(u,p,g){const f=xu.tensor4d(r(3*3*u),[3,3,u,1]),I=xu.tensor4d(r(u*p),[1,1,u,p]),S=xu.tensor1d(r(p));return l.push({paramPath:`${g}/depthwise_filter`},{paramPath:`${g}/pointwise_filter`},{paramPath:`${g}/bias`}),new DI(f,I,S)}}function _c(r){return function(l){const u=r(`${l}/depthwise_filter`,4),p=r(`${l}/pointwise_filter`,4),g=r(`${l}/bias`,1);return new DI(u,p,g)}}function ms(r,l){return function(u,p,g){const f=r[u];if(!Bo(f,p))throw new Error(`expected weightMap[${u}] to be a Tensor${p}D, instead have ${f}`);return l.push({originalPath:u,paramPath:g||u}),f}}function zn(r){let l=r;function u(g){const f=l.slice(0,g);return l=l.slice(g),f}function p(){return l}return{extractWeights:u,getRemainingWeights:p}}function Yf(r,l){const u=kc(r,l),p=Fc(r,l);function g(I,S,x,v=!1){const O=v?u(I,S,3,`${x}/conv0`):p(I,S,`${x}/conv0`),C=p(S,S,`${x}/conv1`),U=p(S,S,`${x}/conv2`);return{conv0:O,conv1:C,conv2:U}}function f(I,S,x,v=!1){const{conv0:O,conv1:C,conv2:U}=g(I,S,x,v),G=p(S,S,`${x}/conv3`);return{conv0:O,conv1:C,conv2:U,conv3:G}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:f}}function fE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractDenseBlock4Params:g}=Yf(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2"),x=g(128,256,"dense3");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S,dense3:x}}}function Hf(r){return function(l){const u=r(`${l}/filters`,4),p=r(`${l}/bias`,1);return{filters:u,bias:p}}}function qf(r,l){const u=ms(r,l),p=Hf(u),g=_c(u);function f(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`);return{conv0:v,conv1:O,conv2:C}}function I(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`),U=g(`${S}/conv3`);return{conv0:v,conv1:O,conv2:C,conv3:U}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:I}}function gE(r){const l=[],{extractDenseBlock4Params:u}=qf(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2"),dense3:u("dense3")};return Pn(r,l),{params:p,paramMappings:l}}const Wc=Ke(Xe());class jf extends En{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return Wc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(Wc.scalar(255));let f=Iu(g,l.dense0,!0);return f=Iu(f,l.dense1),f=Iu(f,l.dense2),f=Iu(f,l.dense3),f=Wc.avgPool(f,[7,7],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return gE(r)}extractParams(r){return fE(r)}}const $c=Ke(Xe());function Tu(r,l){return $c.tidy(()=>$c.add($c.matMul(r,l.weights),l.bias))}function yE(r,l,u){const p=[],{extractWeights:g,getRemainingWeights:f}=zn(r),I=Vf(g,p),S=I(l,u,"fc");if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:p,params:{fc:S}}}function bE(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:p("fc")};return Pn(r,l),{params:g,paramMappings:l}}function Kf(r){const l={},u={};return Object.keys(r).forEach(p=>{const g=p.startsWith("fc")?u:l;g[p]=r[p]}),{featureExtractorMap:l,classifierMap:u}}const wE=Ke(Xe());class Xf extends En{constructor(r,l){super(r);this._faceFeatureExtractor=l}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return wE.tidy(()=>{const u=r instanceof to?this.faceFeatureExtractor.forwardInput(r):r;return Tu(u.as2D(u.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return yE(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Kf(r);return this.faceFeatureExtractor.loadFromWeightMap(l),bE(u)}extractParams(r){const l=this.getClassifierChannelsIn(),u=this.getClassifierChannelsOut(),p=u*l+u,g=r.slice(0,r.length-p),f=r.slice(r.length-p);return this.faceFeatureExtractor.extractWeights(g),this.extractClassifierParams(f)}}const kI=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class sa{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);kI.forEach((l,u)=>{this[l]=r[u]})}asSortedArray(){return kI.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Uc=Ke(Xe());class FI extends Xf{constructor(r=new jf){super("FaceExpressionNet",r)}forwardInput(r){return Uc.tidy(()=>Uc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Rt(r))}async predictExpressions(r){const l=await Rt(r),u=await this.forwardInput(l),p=await Promise.all(Uc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new sa(f));return l.isBatchInput?g:g[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function _I(r){return r.expressions instanceof sa}function Jf(r,l){const u={expressions:l};return Object.assign({},r,u)}function B9(r,l,u=.1,p){const g=Array.isArray(l)?l:[l];g.forEach(f=>{const I=f instanceof sa?f:_I(f)?f.expressions:void 0;if(!I)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const S=I.asSortedArray(),x=S.filter(C=>C.probability>u),v=Ui(f)?f.detection.box.bottomLeft:p||new Je(0,0),O=new fc(x.map(C=>`${C.expression} (${Mo(C.probability)})`),v);O.draw(r)})}function ia(r){return Ui(r)&&r.landmarks instanceof Gs&&r.unshiftedLandmarks instanceof Gs&&r.alignedRect instanceof Ht}function Bc(r,l){const{box:u}=r.detection,p=l.shiftBy(u.x,u.y),g=p.align(),{imageDims:f}=r.detection,I=new Ht(r.detection.score,g.rescale(f.reverse()),f),S={landmarks:p,unshiftedLandmarks:l,alignedRect:I};return Object.assign({},r,S)}class LE{constructor(r={}){const{drawLines:l=!0,drawPoints:u=!0,lineWidth:p,lineColor:g,pointSize:f,pointColor:I}=r;this.drawLines=l,this.drawPoints=u,this.lineWidth=p||1,this.pointSize=f||2,this.lineColor=g||"rgba(0, 255, 255, 1)",this.pointColor=I||"rgba(255, 0, 255, 1)"}}class SE{constructor(r,l={}){this.faceLandmarks=r,this.options=new LE(l)}draw(r){const l=Jn(r),{drawLines:u,drawPoints:p,lineWidth:g,lineColor:f,pointSize:I,pointColor:S}=this.options;if(u&&this.faceLandmarks instanceof iu&&(l.strokeStyle=f,l.lineWidth=g,cr(l,this.faceLandmarks.getJawOutline()),cr(l,this.faceLandmarks.getLeftEyeBrow()),cr(l,this.faceLandmarks.getRightEyeBrow()),cr(l,this.faceLandmarks.getNose()),cr(l,this.faceLandmarks.getLeftEye(),!0),cr(l,this.faceLandmarks.getRightEye(),!0),cr(l,this.faceLandmarks.getMouth(),!0)),p){l.strokeStyle=S,l.fillStyle=S;const x=v=>{l.beginPath(),l.arc(v.x,v.y,I,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function M9(r,l){const u=Array.isArray(l)?l:[l];u.forEach(p=>{const g=p instanceof Gs?p:ia(p)?p.landmarks:void 0;if(!g)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new SE(g).draw(r)})}const WI={};hm(WI,{AnchorPosition:()=>Bi,DrawBox:()=>TS,DrawBoxOptions:()=>NC,DrawFaceLandmarks:()=>SE,DrawFaceLandmarksOptions:()=>LE,DrawTextField:()=>fc,DrawTextFieldOptions:()=>ym,drawContour:()=>cr,drawDetections:()=>KX,drawFaceExpressions:()=>B9,drawFaceLandmarks:()=>M9});function P9(r,l){const u=kc(r,l),p=Fc(r,l);function g(I,S,x){const v=p(I,S,`${x}/separable_conv0`),O=p(S,S,`${x}/separable_conv1`),C=u(I,S,1,`${x}/expansion_conv`);return{separable_conv0:v,separable_conv1:O,expansion_conv:C}}function f(I,S){const x=p(I,I,`${S}/separable_conv0`),v=p(I,I,`${S}/separable_conv1`),O=p(I,I,`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:u,extractSeparableConvParams:p,extractReductionBlockParams:g,extractMainBlockParams:f}}function IE(r,l){const u=[],{extractWeights:p,getRemainingWeights:g}=zn(r),{extractConvParams:f,extractSeparableConvParams:I,extractReductionBlockParams:S,extractMainBlockParams:x}=P9(p,u),v=f(3,32,3,"entry_flow/conv_in"),O=S(32,64,"entry_flow/reduction_block_0"),C=S(64,128,"entry_flow/reduction_block_1"),U={conv_in:v,reduction_block_0:O,reduction_block_1:C},G={};Wi(l,0,1).forEach(ge=>{G[`main_block_${ge}`]=x(128,`middle_flow/main_block_${ge}`)});const ne=S(128,256,"exit_flow/reduction_block"),te=I(256,512,"exit_flow/separable_conv"),oe={reduction_block:ne,separable_conv:te};if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:u,params:{entry_flow:U,middle_flow:G,exit_flow:oe}}}function z9(r,l){const u=ms(r,l),p=Hf(u),g=_c(u);function f(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=p(`${S}/expansion_conv`);return{separable_conv0:x,separable_conv1:v,expansion_conv:O}}function I(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=g(`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}}function xE(r,l){const u=[],{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}=z9(r,u),S=p("entry_flow/conv_in"),x=f("entry_flow/reduction_block_0"),v=f("entry_flow/reduction_block_1"),O={conv_in:S,reduction_block_0:x,reduction_block_1:v},C={};Wi(l,0,1).forEach(te=>{C[`main_block_${te}`]=I(`middle_flow/main_block_${te}`)});const U=f("exit_flow/reduction_block"),G=g("exit_flow/separable_conv"),ne={reduction_block:U,separable_conv:G};return Pn(r,u),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:u}}const dn=Ke(Xe());function TE(r,l,u){return dn.add(dn.conv2d(r,l.filters,u,"same"),l.bias)}function $I(r,l,u=!0){let p=u?dn.relu(r):r;return p=Qn(p,l.separable_conv0,[1,1]),p=Qn(dn.relu(p),l.separable_conv1,[1,1]),p=dn.maxPool(p,[3,3],[2,2],"same"),p=dn.add(p,TE(r,l.expansion_conv,[2,2])),p}function G9(r,l){let u=Qn(dn.relu(r),l.separable_conv0,[1,1]);return u=Qn(dn.relu(u),l.separable_conv1,[1,1]),u=Qn(dn.relu(u),l.separable_conv2,[1,1]),u=dn.add(u,r),u}class AE extends En{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return dn.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(dn.scalar(256));let f=dn.relu(TE(g,l.entry_flow.conv_in,[2,2]));return f=$I(f,l.entry_flow.reduction_block_0,!1),f=$I(f,l.entry_flow.reduction_block_1),Wi(this._numMainBlocks,0,1).forEach(I=>{f=G9(f,l.middle_flow[`main_block_${I}`])}),f=$I(f,l.exit_flow.reduction_block),f=dn.relu(Qn(f,l.exit_flow.separable_conv,[1,1])),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return xE(r,this._numMainBlocks)}extractParams(r){return IE(r,this._numMainBlocks)}}function vE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),g=Vf(u,l),f=g(512,1,"fc/age"),I=g(512,2,"fc/gender");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{fc:{age:f,gender:I}}}}function NE(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:{age:p("fc/age"),gender:p("fc/gender")}};return Pn(r,l),{params:g,paramMappings:l}}var gr;(function(r){r.FEMALE="female",r.MALE="male"})(gr||(gr={}));const Vi=Ke(Xe());class UI extends En{constructor(r=new AE(2)){super("AgeGenderNet");this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return Vi.tidy(()=>{const u=r instanceof to?this.faceFeatureExtractor.forwardInput(r):r,p=Vi.avgPool(u,[7,7],[2,2],"valid").as2D(u.shape[0],-1),g=Tu(p,l.fc.age).as1D(),f=Tu(p,l.fc.gender);return{age:g,gender:f}})}forwardInput(r){return Vi.tidy(()=>{const{age:l,gender:u}=this.runNet(r);return{age:l,gender:Vi.softmax(u)}})}async forward(r){return this.forwardInput(await Rt(r))}async predictAgeAndGender(r){const l=await Rt(r),u=await this.forwardInput(l),p=Vi.unstack(u.age),g=Vi.unstack(u.gender),f=p.map((S,x)=>({ageTensor:S,genderTensor:g[x]})),I=await Promise.all(f.map(async({ageTensor:S,genderTensor:x})=>{const v=(await S.data())[0],O=(await x.data())[0],C=O>.5,U=C?gr.MALE:gr.FEMALE,G=C?O:1-O;return S.dispose(),x.dispose(),{age:v,gender:U,genderProbability:G}}));return u.age.dispose(),u.gender.dispose(),l.isBatchInput?I:I[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return vE(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Kf(r);return this.faceFeatureExtractor.loadFromWeightMap(l),NE(u)}extractParams(r){const l=512*1+1+(512*2+2),u=r.slice(0,r.length-l),p=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(u),this.extractClassifierParams(p)}}const fs=Ke(Xe());class Zf extends Xf{postProcess(r,l,u){const p=u.map(({width:f,height:I})=>{const S=l/Math.max(I,f);return{width:f*S,height:I*S}}),g=p.length;return fs.tidy(()=>{const f=(O,C)=>fs.stack([fs.fill([68],O),fs.fill([68],C)],1).as2D(1,136).as1D(),I=(O,C)=>{const{width:U,height:G}=p[O];return C(U,G)?Math.abs(U-G)/2:0},S=O=>I(O,(C,U)=>CI(O,(C,U)=>Uf(S(C),x(C))))).div(fs.stack(Array.from(Array(g),(O,C)=>f(p[C].width,p[C].height))));return v})}forwardInput(r){return fs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([u,p])=>({height:u,width:p})))})}async forward(r){return this.forwardInput(await Rt(r))}async detectLandmarks(r){const l=await Rt(r),u=fs.tidy(()=>fs.unstack(this.forwardInput(l))),p=await Promise.all(u.map(async(g,f)=>{const I=Array.from(await g.data()),S=I.filter((v,O)=>dm(O)),x=I.filter((v,O)=>!dm(O));return new iu(Array(68).fill(0).map((v,O)=>new Je(S[O],x[O])),{height:l.getInputHeight(f),width:l.getInputWidth(f)})}));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getClassifierChannelsOut(){return 136}}class Au extends Zf{constructor(r=new jf){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function CE(r){const l=[],{extractDenseBlock3Params:u}=qf(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2")};return Pn(r,l),{params:p,paramMappings:l}}function RE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractDenseBlock3Params:g}=Yf(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S}}}const Mc=Ke(Xe());class OE extends En{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Mc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(Mc.scalar(255));let f=Pf(g,l.dense0,!0);return f=Pf(f,l.dense1),f=Pf(f,l.dense2),f=Mc.avgPool(f,[14,14],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return CE(r)}extractParams(r){return RE(r)}}class BI extends Zf{constructor(r=new OE){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class V9 extends Au{}const Qf=Ke(Xe());function EE(r,l){return Qf.add(Qf.mul(r,l.weights),l.biases)}const Pc=Ke(Xe());function MI(r,l,u,p,g="same"){const{filters:f,bias:I}=l.conv;let S=Pc.conv2d(r,f,u,g);return S=Pc.add(S,I),S=EE(S,l.scale),p?Pc.relu(S):S}function DE(r,l){return MI(r,l,[1,1],!0)}function PI(r,l){return MI(r,l,[1,1],!1)}function eg(r,l){return MI(r,l,[2,2],!0,"valid")}const gs=Ke(Xe());function Y9(r,l){function u(S,x,v){const O=r(S),C=O.length/(x*v*v);if(dS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${v}`);return gs.tidy(()=>gs.transpose(gs.tensor4d(O,[x,C,v,v]),[2,3,1,0]))}function p(S,x,v,O){const C=u(S,x,v),U=gs.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:U}}function g(S,x){const v=gs.tensor1d(r(S)),O=gs.tensor1d(r(S));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:v,biases:O}}function f(S,x,v,O){const C=p(S,x,v,`${O}/conv`),U=g(x,`${O}/scale`);return{conv:C,scale:U}}function I(S,x,v,O,C=!1){const U=f((C?.5:1)*S,x,v,`${O}/conv1`),G=f(S,x,v,`${O}/conv2`);return{conv1:U,conv2:G}}return{extractConvLayerParams:f,extractResidualLayerParams:I}}function kE(r){const{extractWeights:l,getRemainingWeights:u}=zn(r),p=[],{extractConvLayerParams:g,extractResidualLayerParams:f}=Y9(l,p),I=g(4704,32,7,"conv32_down"),S=f(9216,32,3,"conv32_1"),x=f(9216,32,3,"conv32_2"),v=f(9216,32,3,"conv32_3"),O=f(36864,64,3,"conv64_down",!0),C=f(36864,64,3,"conv64_1"),U=f(36864,64,3,"conv64_2"),G=f(36864,64,3,"conv64_3"),ne=f(147456,128,3,"conv128_down",!0),te=f(147456,128,3,"conv128_1"),oe=f(147456,128,3,"conv128_2"),ge=f(589824,256,3,"conv256_down",!0),fe=f(589824,256,3,"conv256_1"),Ae=f(589824,256,3,"conv256_2"),Te=f(589824,256,3,"conv256_down_out"),Ve=gs.tidy(()=>gs.transpose(gs.tensor2d(l(256*128),[128,256]),[1,0]));if(p.push({paramPath:"fc"}),u().length!==0)throw new Error(`weights remaing after extract: ${u().length}`);const rt={conv32_down:I,conv32_1:S,conv32_2:x,conv32_3:v,conv64_down:O,conv64_1:C,conv64_2:U,conv64_3:G,conv128_down:ne,conv128_1:te,conv128_2:oe,conv256_down:ge,conv256_1:fe,conv256_2:Ae,conv256_down_out:Te,fc:Ve};return{params:rt,paramMappings:p}}function H9(r,l){const u=ms(r,l);function p(I){const S=u(`${I}/scale/weights`,1),x=u(`${I}/scale/biases`,1);return{weights:S,biases:x}}function g(I){const S=u(`${I}/conv/filters`,4),x=u(`${I}/conv/bias`,1),v=p(I);return{conv:{filters:S,bias:x},scale:v}}function f(I){return{conv1:g(`${I}/conv1`),conv2:g(`${I}/conv2`)}}return{extractConvLayerParams:g,extractResidualLayerParams:f}}function FE(r){const l=[],{extractConvLayerParams:u,extractResidualLayerParams:p}=H9(r,l),g=u("conv32_down"),f=p("conv32_1"),I=p("conv32_2"),S=p("conv32_3"),x=p("conv64_down"),v=p("conv64_1"),O=p("conv64_2"),C=p("conv64_3"),U=p("conv128_down"),G=p("conv128_1"),ne=p("conv128_2"),te=p("conv256_down"),oe=p("conv256_1"),ge=p("conv256_2"),fe=p("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!uS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const Te={conv32_down:g,conv32_1:f,conv32_2:I,conv32_3:S,conv64_down:x,conv64_1:v,conv64_2:O,conv64_3:C,conv128_down:U,conv128_1:G,conv128_2:ne,conv256_down:te,conv256_1:oe,conv256_2:ge,conv256_down_out:fe,fc:Ae};return Pn(r,l),{params:Te,paramMappings:l}}const Gn=Ke(Xe());function fi(r,l){let u=DE(r,l.conv1);return u=PI(u,l.conv2),u=Gn.add(u,r),u=Gn.relu(u),u}function vu(r,l){let u=eg(r,l.conv1);u=PI(u,l.conv2);let p=Gn.avgPool(r,2,2,"valid");const g=Gn.zeros(p.shape),f=p.shape[3]!==u.shape[3],I=p.shape[1]!==u.shape[1]||p.shape[2]!==u.shape[2];if(I){const S=[...u.shape];S[1]=1;const x=Gn.zeros(S);u=Gn.concat([u,x],1);const v=[...u.shape];v[2]=1;const O=Gn.zeros(v);u=Gn.concat([u,O],2)}return p=f?Gn.concat([p,g],3):p,u=Gn.add(p,u),u=Gn.relu(u),u}const Ds=Ke(Xe());class Nu extends En{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return Ds.tidy(()=>{const u=Ds.cast(r.toBatchTensor(150,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(Ds.scalar(256));let f=eg(g,l.conv32_down);f=Ds.maxPool(f,3,2,"valid"),f=fi(f,l.conv32_1),f=fi(f,l.conv32_2),f=fi(f,l.conv32_3),f=vu(f,l.conv64_down),f=fi(f,l.conv64_1),f=fi(f,l.conv64_2),f=fi(f,l.conv64_3),f=vu(f,l.conv128_down),f=fi(f,l.conv128_1),f=fi(f,l.conv128_2),f=vu(f,l.conv256_down),f=fi(f,l.conv256_1),f=fi(f,l.conv256_2),f=vu(f,l.conv256_down_out);const I=f.mean([1,2]),S=Ds.matMul(I,l.fc);return S})}async forward(r){return this.forwardInput(await Rt(r))}async computeFaceDescriptor(r){const l=await Rt(r),u=Ds.tidy(()=>Ds.unstack(this.forwardInput(l))),p=await Promise.all(u.map(g=>g.data()));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return FE(r)}extractParams(r){return kE(r)}}function q9(r){const l=new Nu;return l.extractWeights(r),l}function tg(r,l){const u={descriptor:l};return Object.assign({},r,u)}function j9(r){return typeof r.age=="number"}function ng(r,l){const u={age:l};return Object.assign({},r,u)}function K9(r){return(r.gender===gr.MALE||r.gender===gr.FEMALE)&&pc(r.genderProbability)}function sg(r,l,u){const p={gender:l,genderProbability:u};return Object.assign({},r,p)}const gi=Ke(Xe());function X9(r,l){function u(x,v){const O=gi.tensor4d(r(3*3*x),[3,3,x,1]),C=gi.tensor1d(r(x)),U=gi.tensor1d(r(x)),G=gi.tensor1d(r(x)),ne=gi.tensor1d(r(x));return l.push({paramPath:`${v}/filters`},{paramPath:`${v}/batch_norm_scale`},{paramPath:`${v}/batch_norm_offset`},{paramPath:`${v}/batch_norm_mean`},{paramPath:`${v}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:U,batch_norm_mean:G,batch_norm_variance:ne}}function p(x,v,O,C,U){const G=gi.tensor4d(r(x*v*O*O),[O,O,x,v]),ne=gi.tensor1d(r(v));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${U?"batch_norm_offset":"bias"}`}),{filters:G,bias:ne}}function g(x,v,O,C){const{filters:U,bias:G}=p(x,v,O,C,!0);return{filters:U,batch_norm_offset:G}}function f(x,v,O){const C=u(x,`${O}/depthwise_conv`),U=g(x,v,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:U}}function I(){const x=g(3,32,3,"mobilenetv1/conv_0"),v=f(32,64,"mobilenetv1/conv_1"),O=f(64,128,"mobilenetv1/conv_2"),C=f(128,128,"mobilenetv1/conv_3"),U=f(128,256,"mobilenetv1/conv_4"),G=f(256,256,"mobilenetv1/conv_5"),ne=f(256,512,"mobilenetv1/conv_6"),te=f(512,512,"mobilenetv1/conv_7"),oe=f(512,512,"mobilenetv1/conv_8"),ge=f(512,512,"mobilenetv1/conv_9"),fe=f(512,512,"mobilenetv1/conv_10"),Ae=f(512,512,"mobilenetv1/conv_11"),Te=f(512,1024,"mobilenetv1/conv_12"),Ve=f(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,conv_8:oe,conv_9:ge,conv_10:fe,conv_11:Ae,conv_12:Te,conv_13:Ve}}function S(){const x=g(1024,256,1,"prediction_layer/conv_0"),v=g(256,512,3,"prediction_layer/conv_1"),O=g(512,128,1,"prediction_layer/conv_2"),C=g(128,256,3,"prediction_layer/conv_3"),U=g(256,128,1,"prediction_layer/conv_4"),G=g(128,256,3,"prediction_layer/conv_5"),ne=g(256,64,1,"prediction_layer/conv_6"),te=g(64,128,3,"prediction_layer/conv_7"),oe=p(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),ge=p(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),fe=p(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=p(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),Te=p(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Ve=p(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=p(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),vt=p(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),$t=p(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=p(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Dn=p(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Tn=p(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),An={box_encoding_predictor:oe,class_predictor:ge},Ks={box_encoding_predictor:fe,class_predictor:Ae},Li={box_encoding_predictor:Te,class_predictor:Ve},Xs={box_encoding_predictor:rt,class_predictor:vt},la={box_encoding_predictor:$t,class_predictor:Kt},Xc={box_encoding_predictor:Dn,class_predictor:Tn};return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,box_predictor_0:An,box_predictor_1:Ks,box_predictor_2:Li,box_predictor_3:Xs,box_predictor_4:la,box_predictor_5:Xc}}return{extractMobilenetV1Params:I,extractPredictionLayerParams:S}}function _E(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractMobilenetV1Params:g,extractPredictionLayerParams:f}=X9(u,l),I=g(),S=f(),x=gi.tensor3d(u(5118*4),[1,5118,4]),v={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{params:{mobilenetv1:I,prediction_layer:S,output_layer:v},paramMappings:l}}function J9(r,l){const u=ms(r,l);function p(v,O,C){const U=u(`${v}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),G=u(`${v}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:U,batch_norm_offset:G}}function g(v){const O=`mobilenetv1/conv_${v}`,C=`MobilenetV1/Conv2d_${v}_depthwise`,U=`${O}/depthwise_conv`,G=`${O}/pointwise_conv`,ne=u(`${C}/depthwise_weights`,4,`${U}/filters`),te=u(`${C}/BatchNorm/gamma`,1,`${U}/batch_norm_scale`),oe=u(`${C}/BatchNorm/beta`,1,`${U}/batch_norm_offset`),ge=u(`${C}/BatchNorm/moving_mean`,1,`${U}/batch_norm_mean`),fe=u(`${C}/BatchNorm/moving_variance`,1,`${U}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:oe,batch_norm_mean:ge,batch_norm_variance:fe},pointwise_conv:p("MobilenetV1",v,G)}}function f(){return{conv_0:p("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:g(1),conv_2:g(2),conv_3:g(3),conv_4:g(4),conv_5:g(5),conv_6:g(6),conv_7:g(7),conv_8:g(8),conv_9:g(9),conv_10:g(10),conv_11:g(11),conv_12:g(12),conv_13:g(13)}}function I(v,O){const C=u(`${v}/weights`,4,`${O}/filters`),U=u(`${v}/biases`,1,`${O}/bias`);return{filters:C,bias:U}}function S(v){const O=I(`Prediction/BoxPredictor_${v}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${v}/box_encoding_predictor`),C=I(`Prediction/BoxPredictor_${v}/ClassPredictor`,`prediction_layer/box_predictor_${v}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:p("Prediction",0,"prediction_layer/conv_0"),conv_1:p("Prediction",1,"prediction_layer/conv_1"),conv_2:p("Prediction",2,"prediction_layer/conv_2"),conv_3:p("Prediction",3,"prediction_layer/conv_3"),conv_4:p("Prediction",4,"prediction_layer/conv_4"),conv_5:p("Prediction",5,"prediction_layer/conv_5"),conv_6:p("Prediction",6,"prediction_layer/conv_6"),conv_7:p("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:S(0),box_predictor_1:S(1),box_predictor_2:S(2),box_predictor_3:S(3),box_predictor_4:S(4),box_predictor_5:S(5)}}return{extractMobilenetV1Params:f,extractPredictionLayerParams:x}}function WE(r){const l=[],{extractMobilenetV1Params:u,extractPredictionLayerParams:p}=J9(r,l),g=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!lr(g))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${g}`);const f={mobilenetv1:u(),prediction_layer:p(),output_layer:{extra_dim:g}};return Pn(r,l),{params:f,paramMappings:l}}const so=Ke(Xe());function Hs(r,l,u){return so.tidy(()=>{let p=so.conv2d(r,l.filters,u,"same");return p=so.add(p,l.batch_norm_offset),so.clipByValue(p,0,6)})}const yr=Ke(Xe()),Z9=.0010000000474974513;function Q9(r,l,u){return yr.tidy(()=>{let p=yr.depthwiseConv2d(r,l.filters,u,"same");return p=yr.batchNorm(p,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,Z9),yr.clipByValue(p,0,6)})}function eZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function $E(r,l){return yr.tidy(()=>{let u,p=Hs(r,l.conv_0,[2,2]);const g=[l.conv_1,l.conv_2,l.conv_3,l.conv_4,l.conv_5,l.conv_6,l.conv_7,l.conv_8,l.conv_9,l.conv_10,l.conv_11,l.conv_12,l.conv_13];if(g.forEach((f,I)=>{const S=I+1,x=eZ(S);p=Q9(p,f.depthwise_conv,x),p=Hs(p,f.pointwise_conv,[1,1]),S===11&&(u=p)}),u===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:p,conv11:u}})}function UE(r,l,u,p,g){const f=r.shape[0],I=Math.min(u,f),S=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>g).sort((O,C)=>C.score-O.score),x=O=>O<=p?1:0,v=[];return S.forEach(O=>{if(v.length>=I)return;const C=O.score;for(let U=v.length-1;U>=0;--U){const G=tZ(r,O.boxIndex,v[U]);if(G===0)continue;if(O.score*=x(G),O.score<=g)break}C===O.score&&v.push(O.boxIndex)}),v}function tZ(r,l,u){const p=r.arraySync(),g=Math.min(p[l][0],p[l][2]),f=Math.min(p[l][1],p[l][3]),I=Math.max(p[l][0],p[l][2]),S=Math.max(p[l][1],p[l][3]),x=Math.min(p[u][0],p[u][2]),v=Math.min(p[u][1],p[u][3]),O=Math.max(p[u][0],p[u][2]),C=Math.max(p[u][1],p[u][3]),U=(I-g)*(S-f),G=(O-x)*(C-v);if(U<=0||G<=0)return 0;const ne=Math.max(g,x),te=Math.max(f,v),oe=Math.min(I,O),ge=Math.min(S,C),fe=Math.max(oe-ne,0)*Math.max(ge-te,0);return fe/(U+G-fe)}const De=Ke(Xe());function nZ(r){const l=De.unstack(De.transpose(r,[1,0])),u=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],p=[De.add(l[0],De.div(u[0],De.scalar(2))),De.add(l[1],De.div(u[1],De.scalar(2)))];return{sizes:u,centers:p}}function sZ(r,l){const{sizes:u,centers:p}=nZ(r),g=De.unstack(De.transpose(l,[1,0])),f=De.div(De.mul(De.exp(De.div(g[2],De.scalar(5))),u[0]),De.scalar(2)),I=De.add(De.mul(De.div(g[0],De.scalar(10)),u[0]),p[0]),S=De.div(De.mul(De.exp(De.div(g[3],De.scalar(5))),u[1]),De.scalar(2)),x=De.add(De.mul(De.div(g[1],De.scalar(10)),u[1]),p[1]);return De.transpose(De.stack([De.sub(I,f),De.sub(x,S),De.add(I,f),De.add(x,S)]),[1,0])}function BE(r,l,u){return De.tidy(()=>{const p=r.shape[0];let g=sZ(De.reshape(De.tile(u.extra_dim,[p,1,1]),[-1,4]),De.reshape(r,[-1,4]));g=De.reshape(g,[p,g.shape[0]/p,4]);const f=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let I=De.slice(f,[0,0,0],[-1,-1,1]);I=De.reshape(I,[p,I.shape[1]]);const S=De.unstack(g),x=De.unstack(I);return{boxes:S,scores:x}})}const Cu=Ke(Xe());function ra(r,l){return Cu.tidy(()=>{const u=r.shape[0],p=Cu.reshape(na(r,l.box_encoding_predictor),[u,-1,1,4]),g=Cu.reshape(na(r,l.class_predictor),[u,-1,3]);return{boxPredictionEncoding:p,classPrediction:g}})}const Ru=Ke(Xe());function ME(r,l,u){return Ru.tidy(()=>{const p=Hs(r,u.conv_0,[1,1]),g=Hs(p,u.conv_1,[2,2]),f=Hs(g,u.conv_2,[1,1]),I=Hs(f,u.conv_3,[2,2]),S=Hs(I,u.conv_4,[1,1]),x=Hs(S,u.conv_5,[2,2]),v=Hs(x,u.conv_6,[1,1]),O=Hs(v,u.conv_7,[2,2]),C=ra(l,u.box_predictor_0),U=ra(r,u.box_predictor_1),G=ra(g,u.box_predictor_2),ne=ra(I,u.box_predictor_3),te=ra(x,u.box_predictor_4),oe=ra(O,u.box_predictor_5),ge=Ru.concat([C.boxPredictionEncoding,U.boxPredictionEncoding,G.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,oe.boxPredictionEncoding],1),fe=Ru.concat([C.classPrediction,U.classPrediction,G.classPrediction,ne.classPrediction,te.classPrediction,oe.classPrediction],1);return{boxPredictions:ge,classPredictions:fe}})}class yi{constructor({minConfidence:r,maxResults:l}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=r||.5,this._maxResults=l||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}}const bi=Ke(Xe());class zc extends En{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return bi.tidy(()=>{const u=bi.cast(r.toBatchTensor(512,!1),"float32"),p=bi.sub(bi.mul(u,bi.scalar(.007843137718737125)),bi.scalar(1)),g=$E(p,l.mobilenetv1),{boxPredictions:f,classPredictions:I}=ME(g.out,g.conv11,l.prediction_layer);return BE(f,I,l.output_layer)})}async forward(r){return this.forwardInput(await Rt(r))}async locateFaces(r,l={}){const{maxResults:u,minConfidence:p}=new yi(l),g=await Rt(r),{boxes:f,scores:I}=this.forwardInput(g),S=f[0],x=I[0];for(let fe=1;fe{const[Ae,Te]=[Math.max(0,oe[fe][0]),Math.min(1,oe[fe][2])].map(vt=>vt*te),[Ve,rt]=[Math.max(0,oe[fe][1]),Math.min(1,oe[fe][3])].map(vt=>vt*ne);return new Ht(v[fe],new su(Ve,Ae,rt-Ve,Te-Ae),{height:g.getInputHeight(0),width:g.getInputWidth(0)})});return S.dispose(),x.dispose(),ge}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return WE(r)}extractParams(r){return _E(r)}}function PE(r){const l=new zc;return l.extractWeights(r),l}function iZ(r){return PE(r)}class rZ extends zc{}const zE=.4,GE=[new Je(.738768,.874946),new Je(2.42204,2.65704),new Je(4.30971,7.04493),new Je(10.246,4.59428),new Je(12.6868,11.8741)],VE=[new Je(1.603231,2.094468),new Je(6.041143,7.080126),new Je(2.882459,3.518061),new Je(4.266906,5.178857),new Je(9.041765,10.66308)],YE=[117.001,114.697,97.404],HE="tiny_yolov2_model",qE="tiny_yolov2_separable_conv_model";const ig=r=>typeof r=="number";function zI(r){if(!r)throw new Error(`invalid config: ${r}`);if(typeof r.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${r.withSeparableConvs}`);if(!ig(r.iouThreshold)||r.iouThreshold<0||r.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${r.iouThreshold}`);if(!Array.isArray(r.classes)||!r.classes.length||!r.classes.every(l=>typeof l=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(r.classes)}`);if(!Array.isArray(r.anchors)||!r.anchors.length||!r.anchors.map(l=>l||{}).every(l=>ig(l.x)&&ig(l.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(r.anchors)}`);if(r.meanRgb&&(!Array.isArray(r.meanRgb)||r.meanRgb.length!==3||!r.meanRgb.every(ig)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const qs=Ke(Xe());function Gc(r){return qs.tidy(()=>{const l=qs.mul(r,qs.scalar(.10000000149011612));return qs.add(qs.relu(qs.sub(r,l)),l)})}const js=Ke(Xe());function br(r,l){return js.tidy(()=>{let u=js.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=js.conv2d(u,l.conv.filters,[1,1],"valid"),u=js.sub(u,l.bn.sub),u=js.mul(u,l.bn.truediv),u=js.add(u,l.conv.bias),Gc(u)})}const io=Ke(Xe());function wr(r,l){return io.tidy(()=>{let u=io.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=io.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=io.add(u,l.bias),Gc(u)})}const GI=Ke(Xe());function oZ(r,l){const u=kc(r,l);function p(I,S){const x=GI.tensor1d(r(I)),v=GI.tensor1d(r(I));return l.push({paramPath:`${S}/sub`},{paramPath:`${S}/truediv`}),{sub:x,truediv:v}}function g(I,S,x){const v=u(I,S,3,`${x}/conv`),O=p(S,`${x}/bn`);return{conv:v,bn:O}}const f=Fc(r,l);return{extractConvParams:u,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}}function jE(r,l,u,p){const{extractWeights:g,getRemainingWeights:f}=zn(r),I=[],{extractConvParams:S,extractConvWithBatchNormParams:x,extractSeparableConvParams:v}=oZ(g,I);let O;if(l.withSeparableConvs){const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=l.isFirstLayerConv2d?S(C,U,3,"conv0"):v(C,U,"conv0"),Ve=v(U,G,"conv1"),rt=v(G,ne,"conv2"),vt=v(ne,te,"conv3"),$t=v(te,oe,"conv4"),Kt=v(oe,ge,"conv5"),Dn=fe?v(ge,fe,"conv6"):void 0,Tn=Ae?v(fe,Ae,"conv7"):void 0,An=S(Ae||fe||ge,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:vt,conv4:$t,conv5:Kt,conv6:Dn,conv7:Tn,conv8:An}}else{const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=x(C,U,"conv0"),Ve=x(U,G,"conv1"),rt=x(G,ne,"conv2"),vt=x(ne,te,"conv3"),$t=x(te,oe,"conv4"),Kt=x(oe,ge,"conv5"),Dn=x(ge,fe,"conv6"),Tn=x(fe,Ae,"conv7"),An=S(Ae,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:vt,conv4:$t,conv5:Kt,conv6:Dn,conv7:Tn,conv8:An}}if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{params:O,paramMappings:I}}function aZ(r,l){const u=ms(r,l);function p(S){const x=u(`${S}/sub`,1),v=u(`${S}/truediv`,1);return{sub:x,truediv:v}}function g(S){const x=u(`${S}/filters`,4),v=u(`${S}/bias`,1);return{filters:x,bias:v}}function f(S){const x=g(`${S}/conv`),v=p(`${S}/bn`);return{conv:x,bn:v}}const I=_c(u);return{extractConvParams:g,extractConvWithBatchNormParams:f,extractSeparableConvParams:I}}function KE(r,l){const u=[],{extractConvParams:p,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}=aZ(r,u);let I;if(l.withSeparableConvs){const S=l.filterSizes&&l.filterSizes.length||9;I={conv0:l.isFirstLayerConv2d?p("conv0"):f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:S>7?f("conv6"):void 0,conv7:S>8?f("conv7"):void 0,conv8:p("conv8")}}else I={conv0:g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:g("conv6"),conv7:g("conv7"),conv8:p("conv8")};return Pn(r,u),{params:I,paramMappings:u}}var VI;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(VI||(VI={}));class Lr{constructor({inputSize:r,scoreThreshold:l}={}){this._name="TinyYolov2Options";if(this._inputSize=r||416,this._scoreThreshold=l||.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}}const kt=Ke(Xe());class Vc extends En{constructor(r){super("TinyYolov2");zI(r),this._config=r}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(r,l){let u=br(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=br(u,l.conv6),u=br(u,l.conv7),na(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Gc(na(r,l.conv0,"valid",!1)):wr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=l.conv6?wr(u,l.conv6):u,u=l.conv7?wr(u,l.conv7):u,na(u,l.conv8,"valid",!1)}forwardInput(r,l){const{params:u}=this;if(!u)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let p=kt.cast(r.toBatchTensor(l,!1),"float32");return p=this.config.meanRgb?di(p,this.config.meanRgb):p,p=p.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(p,u):this.runTinyYolov2(p,u)})}async forward(r,l){return await this.forwardInput(await Rt(r),l)}async detect(r,l={}){const{inputSize:u,scoreThreshold:p}=new Lr(l),g=await Rt(r),f=await this.forwardInput(g,u),I=kt.tidy(()=>kt.unstack(f)[0].expandDims()),S={width:g.getInputWidth(0),height:g.getInputHeight(0)},x=await this.extractBoxes(I,g.getReshapedInputDimensions(0),p);f.dispose(),I.dispose();const v=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),U=x.map(te=>this.config.classes[te.label]),G=gS(v.map(te=>te.rescale(u)),O,this.config.iouThreshold,!0),ne=G.map(te=>new mc(O[te],C[te],U[te],v[te],S));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return KE(r,this.config)}extractParams(r){const l=this.config.filterSizes||Vc.DEFAULT_FILTER_SIZES,u=l?l.length:void 0;if(u!==7&&u!==8&&u!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${u} filterSizes in config`);return jE(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,u){const{width:p,height:g}=l,f=Math.max(p,g),I=f/p,S=f/g,x=r.shape[1],v=this.config.anchors.length,[O,C,U]=kt.tidy(()=>{const oe=r.reshape([x,x,v,this.boxEncodingSize]),ge=oe.slice([0,0,0,0],[x,x,v,4]),fe=oe.slice([0,0,0,4],[x,x,v,1]),Ae=this.withClassScores?kt.softmax(oe.slice([0,0,0,5],[x,x,v,this.config.classes.length]),3):kt.scalar(0);return[ge,fe,Ae]}),G=[],ne=await C.array(),te=await O.array();for(let oe=0;oeu){const Te=(ge+nu(te[oe][ge][fe][0]))/x*I,Ve=(oe+nu(te[oe][ge][fe][1]))/x*S,rt=Math.exp(te[oe][ge][fe][2])*this.config.anchors[fe].x/x*I,vt=Math.exp(te[oe][ge][fe][3])*this.config.anchors[fe].y/x*S,$t=Te-rt/2,Kt=Ve-vt/2,Dn={row:oe,col:ge,anchor:fe},{classScore:Tn,label:An}=this.withClassScores?await this.extractPredictedClass(U,Dn):{classScore:1,label:0};G.push({box:new tu($t,Kt,$t+rt,Kt+vt),score:Ae,classScore:Ae*Tn,label:An,...Dn})}}return O.dispose(),C.dispose(),U.dispose(),G}async extractPredictedClass(r,l){const{row:u,col:p,anchor:g}=l,f=await r.array();return Array(this.config.classes.length).fill(0).map((I,S)=>f[u][p][g][S]).map((I,S)=>({classScore:I,label:S})).reduce((I,S)=>I.classScore>S.classScore?I:S)}}Vc.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class Ou extends Vc{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:zE,classes:["face"]},r?{anchors:VE,meanRgb:YE}:{anchors:GE,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Ht(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?qE:HE}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function cZ(r,l=!0){const u=new Ou(l);return u.extractWeights(r),u}class YI extends Lr{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class wi{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const HI=Ke(Xe());async function oa(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>ia(x)?g(x):x.detection),I=p||(l instanceof HI.Tensor?await Ec(l,f):await Oc(l,f)),S=await u(I);return I.forEach(x=>x instanceof HI.Tensor&&x.dispose()),S}async function Yc(r,l,u,p,g){return oa([r],l,async f=>u(f[0]),p,g)}const XE=.4,JE=[new Je(1.603231,2.094468),new Je(6.041143,7.080126),new Je(2.882459,3.518061),new Je(4.266906,5.178857),new Je(9.041765,10.66308)],ZE=[117.001,114.697,97.404];class Eu extends Vc{constructor(){const r={withSeparableConvs:!0,iouThreshold:XE,classes:["face"],anchors:JE,meanRgb:ZE,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Ht(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const pt={ssdMobilenetv1:new zc,tinyFaceDetector:new Eu,tinyYolov2:new Ou,faceLandmark68Net:new Au,faceLandmark68TinyNet:new BI,faceRecognitionNet:new Nu,faceExpressionNet:new FI,ageGenderNet:new UI},QE=(r,l)=>pt.ssdMobilenetv1.locateFaces(r,l),lZ=(r,l)=>pt.tinyFaceDetector.locateFaces(r,l),hZ=(r,l)=>pt.tinyYolov2.locateFaces(r,l),eD=r=>pt.faceLandmark68Net.detectLandmarks(r),uZ=r=>pt.faceLandmark68TinyNet.detectLandmarks(r),dZ=r=>pt.faceRecognitionNet.computeFaceDescriptor(r),pZ=r=>pt.faceExpressionNet.predictExpressions(r),mZ=r=>pt.ageGenderNet.predictAgeAndGender(r),tD=r=>pt.ssdMobilenetv1.load(r),fZ=r=>pt.tinyFaceDetector.load(r),gZ=r=>pt.tinyYolov2.load(r),yZ=r=>pt.faceLandmark68Net.load(r),bZ=r=>pt.faceLandmark68TinyNet.load(r),wZ=r=>pt.faceRecognitionNet.load(r),LZ=r=>pt.faceExpressionNet.load(r),SZ=r=>pt.ageGenderNet.load(r),IZ=tD,xZ=QE,TZ=eD;class nD extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Fu extends nD{async run(){const r=await this.parentTask,l=await oa(r,this.input,async u=>await Promise.all(u.map(p=>pt.faceExpressionNet.predictExpressions(p))),this.extractedFaces);return r.map((u,p)=>Jf(u,l[p]))}withAgeAndGender(){return new Du(this,this.input)}}class _u extends nD{async run(){const r=await this.parentTask;if(!r)return;const l=await Yc(r,this.input,u=>pt.faceExpressionNet.predictExpressions(u),this.extractedFaces);return Jf(r,l)}withAgeAndGender(){return new ku(this,this.input)}}class jc extends Fu{withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class Kc extends _u{withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class sD extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Du extends sD{async run(){const r=await this.parentTask,l=await oa(r,this.input,async u=>await Promise.all(u.map(p=>pt.ageGenderNet.predictAgeAndGender(p))),this.extractedFaces);return r.map((u,p)=>{const{age:g,gender:f,genderProbability:I}=l[p];return ng(sg(u,f,I),g)})}withFaceExpressions(){return new Fu(this,this.input)}}class ku extends sD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:u,genderProbability:p}=await Yc(r,this.input,g=>pt.ageGenderNet.predictAgeAndGender(g),this.extractedFaces);return ng(sg(r,u,p),l)}withFaceExpressions(){return new _u(this,this.input)}}class Hc extends Du{withFaceExpressions(){return new jc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class qc extends ku{withFaceExpressions(){return new Kc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class qI extends wi{constructor(r,l){super();this.parentTask=r;this.input=l}}class aa extends qI{async run(){const r=await this.parentTask,l=await oa(r,this.input,u=>Promise.all(u.map(p=>pt.faceRecognitionNet.computeFaceDescriptor(p))),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return l.map((u,p)=>tg(r[p],u))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}}class ca extends qI{async run(){const r=await this.parentTask;if(!r)return;const l=await Yc(r,this.input,u=>pt.faceRecognitionNet.computeFaceDescriptor(u),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return tg(r,l)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}}const Wu=Ke(Xe());class jI extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=u}get landmarkNet(){return this.useTinyLandmarkNet?pt.faceLandmark68TinyNet:pt.faceLandmark68Net}}class KI extends jI{async run(){const r=await this.parentTask,l=r.map(g=>g.detection),u=this.input instanceof Wu.Tensor?await Ec(this.input,l):await Oc(this.input,l),p=await Promise.all(u.map(g=>this.landmarkNet.detectLandmarks(g)));return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),r.map((g,f)=>Bc(g,p[f]))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class XI extends jI{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,u=this.input instanceof Wu.Tensor?await Ec(this.input,[l]):await Oc(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),Bc(r,p)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class JI extends wi{constructor(r,l=new yi){super();this.input=r;this.options=l}}class rg extends JI{async run(){const{input:r,options:l}=this,u=l instanceof YI?p=>pt.tinyFaceDetector.locateFaces(p,l):l instanceof yi?p=>pt.ssdMobilenetv1.locateFaces(p,l):l instanceof Lr?p=>pt.tinyYolov2.locateFaces(p,l):null;if(!u)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return u(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(u=>Go({},u)))})}withFaceLandmarks(r=!1){return new KI(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Fu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Du(this.runAndExtendWithFaceDetections(),this.input)}}class ZI extends JI{async run(){const r=await new rg(this.input,this.options);let l=r[0];return r.forEach(u=>{u.score>l.score&&(l=u)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?Go({},l):void 0)})}withFaceLandmarks(r=!1){return new XI(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new _u(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ku(this.runAndExtendWithFaceDetection(),this.input)}}function AZ(r,l=new yi){return new ZI(r,l)}function og(r,l=new yi){return new rg(r,l)}async function iD(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await og(r,new yi(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function vZ(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await og(r,new Lr(l)).withFaceLandmarks().withFaceDescriptors()}const NZ=iD;function QI(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const u=Array.from(r),p=Array.from(l);return Math.sqrt(u.map((g,f)=>g-p[f]).reduce((g,f)=>g+Math.pow(f,2),0))}class rD{constructor(r,l=.6){this._distanceThreshold=l;const u=Array.isArray(r)?r:[r];if(!u.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let p=1;const g=()=>`person ${p++}`;this._labeledDescriptors=u.map(f=>{if(f instanceof zo)return f;if(f instanceof Float32Array)return new zo(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new zo(g(),[f.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(r,l){return l.map(u=>QI(u,r)).reduce((u,p)=>u+p,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:u})=>new mm(u,this.computeMeanDistance(r,l))).reduce((l,u)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(u=>zo.fromJSON(u));return new rD(l,r.distanceThreshold)}}function CZ(r){const l=new Eu;return l.extractWeights(r),l}function oD(r,l){const{width:u,height:p}=new us(l.width,l.height);if(u<=0||p<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:u,height:p})}`);if(Array.isArray(r))return r.map(g=>oD(g,{width:u,height:p}));if(ia(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Bc(Go(r,g),f)}return Ui(r)?Go(r,r.detection.forSize(u,p)):r instanceof Gs||r instanceof Ht?r.forSize(u,p):r}var aD="0.7.2";const RZ=Ke(Xe()),OZ=typeof process!="undefined",EZ=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",DZ={faceapi:aD,node:OZ,browser:EZ};export{UI as AgeGenderNet,tu as BoundingBox,Ct as Box,wi as ComposableTask,aa as ComputeAllFaceDescriptorsTask,qI as ComputeFaceDescriptorsTaskBase,ca as ComputeSingleFaceDescriptorTask,KI as DetectAllFaceLandmarksTask,rg as DetectAllFacesTask,jI as DetectFaceLandmarksTaskBase,JI as DetectFacesTaskBase,XI as DetectSingleFaceLandmarksTask,ZI as DetectSingleFaceTask,us as Dimensions,kI as FACE_EXPRESSION_LABELS,Ht as FaceDetection,rZ as FaceDetectionNet,FI as FaceExpressionNet,sa as FaceExpressions,Au as FaceLandmark68Net,BI as FaceLandmark68TinyNet,V9 as FaceLandmarkNet,Gs as FaceLandmarks,YX as FaceLandmarks5,iu as FaceLandmarks68,mm as FaceMatch,rD as FaceMatcher,Nu as FaceRecognitionNet,gr as Gender,fm as LabeledBox,zo as LabeledFaceDescriptors,to as NetInput,En as NeuralNetwork,mc as ObjectDetection,Je as Point,HX as PredictedBox,su as Rect,zc as SsdMobilenetv1,yi as SsdMobilenetv1Options,Eu as TinyFaceDetector,YI as TinyFaceDetectorOptions,Ou as TinyYolov2,Lr as TinyYolov2Options,VI as TinyYolov2SizeType,NZ as allFaces,iD as allFacesSsdMobilenetv1,vZ as allFacesTinyYolov2,AS as awaitMediaLoaded,vS as bufferToImage,dZ as computeFaceDescriptor,gc as createCanvas,ou as createCanvasFromMedia,iZ as createFaceDetectionNet,q9 as createFaceRecognitionNet,PE as createSsdMobilenetv1,CZ as createTinyFaceDetector,cZ as createTinyYolov2,og as detectAllFaces,eD as detectFaceLandmarks,uZ as detectFaceLandmarksTiny,TZ as detectLandmarks,AZ as detectSingleFace,WI as draw,gt as env,QI as euclideanDistance,ng as extendWithAge,tg as extendWithFaceDescriptor,Go as extendWithFaceDetection,Jf as extendWithFaceExpressions,Bc as extendWithFaceLandmarks,sg as extendWithGender,Ec as extractFaceTensors,Oc as extractFaces,W9 as fetchImage,OI as fetchJson,$9 as fetchNetWeights,ta as fetchOrThrow,Jn as getContext2dOrThrow,Yo as getMediaDimensions,NS as imageTensorToCanvas,RI as imageToSquare,PX as inverseSigmoid,mS as iou,wm as isMediaElement,ru as isMediaLoaded,j9 as isWithAge,Ui as isWithFaceDetection,_I as isWithFaceExpressions,ia as isWithFaceLandmarks,K9 as isWithGender,SZ as loadAgeGenderModel,IZ as loadFaceDetectionModel,LZ as loadFaceExpressionModel,yZ as loadFaceLandmarkModel,bZ as loadFaceLandmarkTinyModel,wZ as loadFaceRecognitionModel,tD as loadSsdMobilenetv1Model,fZ as loadTinyFaceDetectorModel,gZ as loadTinyYolov2Model,EI as loadWeightMap,xZ as locateFaces,U9 as matchDimensions,fS as minBbox,pt as nets,gS as nonMaxSuppression,di as normalize,yS as padToSquare,mZ as predictAgeAndGender,pZ as recognizeFaceExpressions,oD as resizeResults,Vo as resolveInput,MX as shuffleArray,nu as sigmoid,QE as ssdMobilenetv1,RZ as tf,lZ as tinyFaceDetector,hZ as tinyYolov2,Rt as toNetInput,hS as utils,zI as validateConfig,DZ as version}; + with dtype ${I.dtype}. `)});const p=(I,S)=>{const x=ht(l,u[0].shape)[0],v=WR(u.map(U=>U.shape),x);if(qt(v)===0)return YS([],v);if(u=u.filter(U=>U.size>0),u.length===1)return u[0];const O=u.map(U=>U.shape);_R(O,x);const C=I.concat(u,x);return S(u),C},g=u,f={axis:l};return Y.runKernelFunc(p,g,null,Tm,f)}const yn=z({concat_:$7});function U7(r){const l=M(r,"x","sigmoid"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sigmoid(l);return g([f]),f},u,null,sf)}const JS=z({sigmoid_:U7});function B7(r,l,u){const p=M(r,"x","slice");if(p.rank===0)throw new Error("Slicing scalar is not possible");const g=(S,x)=>{const[v,O]=Af(p,l,u);return OR(p,v,O),x([p]),S.slice(p,v,O)},f={x:p},I={begin:l,size:u};return Y.runKernelFunc(g,f,null,ef,I)}const Tt=z({slice_:B7});function M7(r,l,u){const p=M(r,"x","batchToSpaceND"),g=l.reduce((x,v)=>x*v);Z(p.rank>=1+l.length,()=>`input rank is ${p.rank} but should be > than blockShape.length ${l.length}`),Z(u.length===l.length,()=>`crops.length is ${u.length} but should be equal to blockShape.length ${l.length}`),Z(p.shape[0]%g===0,()=>`input tensor batch is ${p.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${g}`);const f=x=>x.batchToSpaceND(p,l,u),I={x:p},S={blockShape:l,crops:u};return Y.runKernelFunc(f,I,null,Im,S)}const ZS=z({batchToSpaceND_:M7});function P7(r,l){let u=M(r,"broadcastTo","x");const p=u.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthu.rank){const O=u.shape.slice();for(;O.length=0;O--)if(g[O]===l[O])f[O]=1;else if(u.shape[O]!==1)throw new Error(`broadcastTo(): [${p}] cannot be broadcast to [${l}].`);const I=f.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(I.length===0)return pi(u);const S=O=>O.tile(u,f),x={x:u},v={shape:l,inputShape:g};return Y.runKernelFunc(S,x,null,xm,v)}const Rf=z({broadcastTo_:P7});function z7(r,l,u,p,g="NHWC",f=[1,1],I){const S=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let v=S,O=!1;S.rank===3&&(O=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2]])),Z(v.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${v.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),I!=null&&Z(Qt(p),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${p}.`);const C=g==="NHWC"?v.shape[3]:v.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(Jr(u,f),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${u} and dilations '${f}'`);const U=(oe,ge)=>{const fe=vc(g),Ae=dr(v.shape,x.shape,u,f,p,I,!1,fe),Te=oe.conv2d(v,x,Ae);return ge([v,x]),Te},G={x:v,filter:x},ne={strides:u,pad:p,dataFormat:g,dilations:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,Am,ne);return O?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const QS=z({conv2d_:z7});function G7(r,l,u,p,g,f="NHWC",I){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let S=r,x=l,v=!1;l.rank===3&&(v=!0,x=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]),S=[1,r[0],r[1],r[2]]),Z(S.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${S.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(u.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${u.rank}`);const O=f==="NHWC"?S[3]:S[1],C=f==="NHWC"?x.shape[3]:x.shape[1];Z(O===u.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${u.shape[2]}.`),Z(C===u.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${u.shape[3]}.`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const U=(oe,ge)=>{const fe=1,Ae=vc(f),Te=dr(S,u.shape,p,fe,g,I,!1,Ae),Ve=oe.conv2dDerInput(x,u,Te);return ge([x,u]),Ve},G={dy:x,filter:u},ne={strides:p,pad:g,dataFormat:f,dimRoundingMode:I,inputShape:S},te=Y.runKernelFunc(U,G,null,vm,ne);return v?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const $R=z({conv2DBackpropInput_:G7});function V7(r,l,u,p,g){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let f=r,I=l,S=!1;l.rank===4&&(S=!0,I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),f=[1,r[0],r[1],r[2],r[3]]);const x=f[4],v=I.shape[4];Z(f.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${f.length}.`),Z(I.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${I.rank}`),Z(u.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${u.rank}`),Z(x===u.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${u.shape[3]}.`),Z(v===u.shape[4],()=>`Error in conv3dDerInput: depth of output (${v}) must match output depth for filter ${u.shape[4]}.`);const O=ne=>{const te=1,oe=fu(f,u.shape,p,te,g);return ne.conv3dDerInput(I,u,oe)},C={dy:I},U={pad:g},G=Y.runKernelFunc(O,C,null,QC,U);return S?ie(G,[G.shape[1],G.shape[2],G.shape[3],G.shape[4]]):G}const UR=z({conv3DBackpropInput_:V7});function Y7(r){const l=M(r,"x","cos"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cos(l);return g([l]),f},u,null,Nm)}const gu=z({cos_:Y7});function H7(r){const l=M(r,"x","cosh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cosh(l);return g([l]),f},u,null,Cm)}const eI=z({cosh_:H7});function q7(r,l=0,u=!1,p=!1){const g=M(r,"x","cumsum"),f=(x,v)=>{const O=ds([l],g.rank);let C=g;O!=null&&(C=Wt(g,O));const U=Kr(1,g.rank)[0];let G=x.cumsum(C,U,u,p);if(v([g]),O!=null){const ne=Tc(O);G=Wt(G,ne)}return G},I={x:g},S={axis:l,exclusive:u,reverse:p};return Y.runKernelFunc(f,I,null,Rm,S)}const tI=z({cumsum_:q7});function At(r,l){const u=[];for(let p=0;p1)&&u.unshift(f)}return u}function it(r,l){const u=[],p=Math.max(r.length,l.length);for(let g=0;gI.equal(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,h2)}const nI=z({equal_:j7});function K7(r,l,u){const p=M(l,"a","where"),g=M(u,"b","where"),f=M(r,"condition","where","bool"),I=it(p.shape,g.shape),S=Rf(p,I),x=Rf(g,I);f.rank===1&&Z(f.shape[0]===p.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),f.rank!==1&&Zt(f.shape,x.shape,"Error in where: ");const v=(C,U)=>{const G=C.select(f,S,x);return U([f]),G},O={condition:f,t:S,e:x};return Y.runKernelFunc(v,O,null,Qm)}const Bn=z({where_:K7});function X7(r){const l=M(r,"x","zerosLike"),u={x:l};return Y.runKernelFunc(p=>p.zerosLike(l),u,null,ff)}const qe=z({zerosLike_:X7});function J7(r){const l=M(r,"x","exp"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.exp(l);return g([f]),f},u,null,Em)}const Mn=z({exp_:J7});function Z7(r,l=0){const u=null,p=M(r,"x","expandDims",u);Z(l<=p.rank,()=>"Axis must be <= rank of the tensor");const g=p.shape.slice();return l<0&&(Z(-(p.rank+1)<=l,()=>`Axis must be in the interval [${-(p.rank+1)}, ${p.rank}]`),l=p.rank+l+1),g.splice(l,0,1),ie(p,g)}const Os=z({expandDims_:Z7});function Q7(r,l){const u=null,p=M(r,"x","tile",u);Z(p.rank===l.length,()=>`Error in transpose: rank of input ${p.rank} must match length of reps ${l}.`);const g=(x,v)=>{const O=x.tile(p,l);return v([p]),O},f=[p],I={x:p},S={reps:l};return Y.runKernelFunc(g,I,null,uf,S,f)}const Ko=z({tile_:Q7});function eJ(r,l,u,p="float32"){l==null&&(l=r);const g=mu([r,l],p),f=r<=l?r:l;for(let S=0;Sg.fill(r,l,u),{},null,p2,p)}function tJ(r){const l=M(r,"x","floor"),u={x:l};return Y.runKernelFunc(p=>p.floor(l),u,null,Dm)}const rI=z({floor_:tJ});function BR(r,l,u){const p=r.shape[u],g=[];let f=1,I=1;for(let S=0;S{const O=ht(u,p.shape)[0],C=BR(p,g,O),U=x.gather(p,ie(g,[g.size]),O);return v([p,g]),ie(U,C.outputShape)};return Y.runKernelFunc(S,f,null,Fm,I)}const oI=z({gather_:nJ});function sJ(r,l){let u=M(r,"a","greater"),p=M(l,"b","greater");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.greater(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,g2)}const mi=z({greater_:sJ});function iJ(r,l){let u=M(r,"a","greaterEqual"),p=M(l,"b","greaterEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.greaterEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,_m)}const pr=z({greaterEqual_:iJ});function rJ(r){const l=M(r,"input","imag"),u=g=>g.imag(l),p={input:l};return Y.runKernelFunc(u,p,null,b2)}const yu=z({imag_:rJ});function oJ(r,l){let u=M(r,"a","maximum"),p=M(l,"b","maximum");[u,p]=mt(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.maximum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Mm)}const aI=z({maximum_:oJ});function ke(r,l){if((Rs(r)&&l!=="string"||Array.isArray(r))&&l!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(l==="string"&&Rs(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const u=[],p=[];return zi(r,u,p,l)}function aJ(r,l){let u=M(r,"a","less"),p=M(l,"b","less");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.less(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,I2)}const cI=z({less_:aJ});function cJ(r,l){let u=M(r,"a","lessEqual"),p=M(l,"b","lessEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.lessEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,x2)}const mr=z({lessEqual_:cJ});function lJ(r){const l=M(r,"x","log"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log(l);return g([l]),f},u,null,$m)}const Zr=z({log_:lJ});function hJ(r){const l=M(r,"x","log1p"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log1p(l);return g([l]),f},u,null,Um)}const lI=z({log1p_:hJ});function Of(r){return Y.customGrad(r)}function uJ(r){const l=M(r,"x","neg"),u={x:l};return Y.runKernelFunc(p=>p.neg(l),u,null,Vm)}const yt=z({neg_:uJ});function dJ(r,l=null,u=!1){const p=M(r,"x","max"),g=(S,x)=>{const v=ht(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=Wt(p,C),O=Kr(O.length,U.rank));const G=S.max(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Zn(ne.shape,ht(l,p.shape));ne=ie(ne,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={reductionIndices:l,keepDims:u};return Y.runKernelFunc(g,f,null,Bm,I)}const Xo=z({max_:dJ});function pJ(r,l){let u=M(r,"a","sub"),p=M(l,"b","sub");[u,p]=mt(u,p);const g=(I,S)=>{const x=I.subtract(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,hf)}const Be=z({sub_:pJ});function mJ(r,l=null,u=!1){let p=M(r,"x","sum");p.dtype==="bool"&&(p=Le(p,"int32"));const g=(S,x)=>{x([p]);const v=ht(l,p.shape),O=ds(v,p.rank);let C=v,U=p;O!=null&&(U=Wt(p,O),C=Kr(C.length,p.rank));let G=S.sum(U,C);if(u){const ne=Zn(G.shape,v);G=ie(G,ne)}return G},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,of,I)}const Fe=z({sum_:mJ});function fJ(r,l=null,u=!1){const p=M(r,"x","logSumExp"),g=ht(l,p.shape),f=Xo(p,g,!0),I=Be(p,f),S=Mn(I),x=Fe(S,g),v=Zr(x),O=Lt(ie(f,v.shape),v);if(u){const C=Zn(O.shape,g);return ie(O,C)}return O}const hI=z({logSumExp_:fJ});function gJ(r,l){const u=M(r,"a","logicalAnd","bool"),p=M(l,"b","logicalAnd","bool");it(u.shape,p.shape);const g={a:u,b:p};return Y.runKernelFunc(f=>f.logicalAnd(u,p),g,null,T2)}const Jo=z({logicalAnd_:gJ});function yJ(r){const l=M(r,"x","logicalNot","bool"),u={x:l};return Y.runKernelFunc(p=>p.logicalNot(l),u,null,A2)}const uI=z({logicalNot_:yJ});function Es(r,l="float32"){if(l==="complex64"){const p=Es(r,"float32"),g=Es(r,"float32");return Pi(p,g)}const u=qo(qt(r),l);return Y.makeTensor(u,r,l)}function Gi(r,l="float32"){if(l==="complex64"){const p=Gi(r,"float32"),g=Es(r,"float32");return Pi(p,g)}const u=wf(qt(r),l);return Y.makeTensor(u,r,l)}function bJ(r,l=null,u=!1){const p=M(r,"x","mean"),g=ht(l,p.shape),f=kR(p.shape,g),I=f[1],S=qt(I),x=Of(v=>{const O=ke(S),C=O.dtype===v.dtype?v:Le(v,O.dtype),U=Pe(C,O),G=Fe(U,l,u),ne=te=>{const oe=v.shape.slice();g.forEach(Ae=>{oe[Ae]=1});const ge=ie(te,oe),fe=Pe(ae(ge,Gi(v.shape,"float32")),S);return fe};return{value:G,gradFunc:ne}});return x(p)}const dI=z({mean_:bJ});function wJ(r,l=null,u=!1){const p=M(r,"x","min"),g=(S,x)=>{const v=ht(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=Wt(p,C),O=Kr(O.length,p.rank));const G=S.min(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Zn(ne.shape,v);ne=ie(G,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,Pm,I)}const Ef=z({min_:wJ});function LJ(r,l){let u=M(r,"a","minimum"),p=M(l,"b","minimum");[u,p]=mt(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.minimum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,zm)}const pI=z({minimum_:LJ});function SJ(r){const l=M(r,"x","square"),u={},p=[l],g=[];return Y.runKernelFunc((f,I)=>(I([l]),f.square(l)),{x:l},null,"Square",u,p,g)}const ut=z({square_:SJ});function IJ(r,l){let u=M(r,"a","notEqual"),p=M(l,"b","notEqual");[u,p]=mt(u,p),it(u.shape,p.shape);const g=I=>I.notEqual(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,F2)}const mI=z({notEqual_:IJ});function xJ(r){const l=M(r,"input","real"),u=g=>g.real(l),p={input:l};return Y.runKernelFunc(u,p,null,z2)}const Nc=z({real_:xJ});function TJ(r,l,u=0){const p=M(r,"x","pad");if(p.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const g=(S,x)=>(x([p]),S.pad(p,l,u)),f={paddings:l,constantValue:u},I={x:p};return Y.runKernelFunc(g,I,null,Ym,f)}const fI=z({pad_:TJ});function AJ(r,l,u){const p=M(r,"x","spaceToBatchND");Z(p.rank>=1+l.length,()=>`input rank ${p.rank} should be > than [blockShape] ${l.length}`),Z(u.length===l.length,()=>`paddings.shape[0] ${u.length} must be equal to [blockShape] ${l.length}`),Z(p.shape.reduce((S,x,v)=>v>0&&v<=l.length?S&&(x+u[v-1][0]+u[v-1][1])%l[v-1]===0:S,!0),()=>`input spatial dimensions ${p.shape.slice(1)} with paddings ${u.toString()} must be divisible by blockShapes ${l.toString()}`);const g=S=>S.spaceToBatchND(p,l,u),f={x:p},I={blockShape:l,paddings:u};return Y.runKernelFunc(g,f,null,af,I)}const gI=z({spaceToBatchND_:AJ});function vJ(r,l){let u=M(r,"base","pow"),p=M(l,"exp","pow");[u,p]=mt(u,p);const g={a:u,b:p},f=(I,S)=>{const x=I.pow(u,p);return S([u,p,x]),x};return Y.runKernelFunc(f,g,null,Hm)}const Zo=z({pow_:vJ});function Qr(r,l){wc(r);const u=ur(r,l);if(u.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const p=null;return zi(r,p,u,l)}function Df(r,l,u=1,p="float32"){if(u===0)throw new Error("Cannot have a step of zero");const g=()=>{const I=r===l,S=r1;if(I||S||x)return Es([0],p);const v=Math.abs(Math.ceil((l-r)/u)),O=qo(v,p);l(f([l]),l.dtype==="bool"?Le(l,"int32"):g.relu(l)),p={x:l};return Y.runKernelFunc(u,p,null,qm)}const bu=z({relu_:NJ});function CJ(r,l){const u=M(r,"x","reverse"),p=I=>{const S=ht(l,u.shape);if(u.rank===0)return pi(u);const x=I.reverse(u,S);return ie(x,u.shape)},g={x:u},f={dims:l};return Y.runKernelFunc(p,g,null,Jm,f)}const Cc=z({reverse_:CJ});function RJ(r){const l=M(r,"x","rsqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.rsqrt(l);return g([l]),f},u,null,Zm)}const yI=z({rsqrt_:RJ});function OJ(r){const l=M(r,"x","sin"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sin(l);return g([l]),f},u,null,tf)}const bI=z({sin_:OJ});function EJ(r){const l=M(r,"x","sinh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sinh(l);return g([l]),f},u,null,nf)}const wI=z({sinh_:EJ});function DJ(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=r.as2D(g,p),I=u.fft(f);return I.reshape(r.shape)},l,null,d2)}const wu=z({fft_:DJ});function kJ(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=ie(r,[g,p]),I=u.ifft(f);return ie(I,r.shape)},l,null,y2)}const Rc=z({ifft_:kJ});function FJ(r){const l=r.shape[r.shape.length-1],u=r.size/l;let p;if(l<=2){const g=ie(r,[u,l]);p=Rc(g)}else{const g=[u,2*(l-1)],f=ie(Nc(r),[u,l]),I=ie(yu(r),[u,l]),S=Cc(Tt(f,[0,1],[u,l-2]),1),x=ae(Cc(Tt(I,[0,1],[u,l-2]),1),ke(-1)),v=yn([f,S],1),O=yn([I,x],1),C=ie(Pi(v,O),[g[0],g[1]]);p=Rc(C)}if(p=Nc(p),r.rank===3&&r.shape[0]!==0){const g=p,f=r.shape[0];p=ie(p,[f,p.shape[0]/f,p.shape[1]]),g.dispose()}return p}const LI=z({irfft_:FJ});function MR(r,l,u=0){let p=[];if(typeof l=="number")Z(r.shape[u]%l===0,()=>"Number of splits must evenly divide the axis."),p=new Array(l).fill(r.shape[u]/l);else{const g=l.reduce((I,S)=>(S===-1&&(I+=1),I),0);Z(g<=1,()=>"There should be only one negative value in split array.");const f=l.indexOf(-1);if(f!==-1){const I=l.reduce((S,x)=>x>0?S+x:S);l[f]=r.shape[u]-I}Z(r.shape[u]===l.reduce((I,S)=>I+S),()=>"The sum of sizes must match the size of the axis dimension."),p=l}return p}function _J(r,l,u=0){const p=M(r,"x","split"),g=(S,x)=>{const v=ht(u,p.shape)[0],O=MR(p,l,v);return S.split(p,O,v)},f={x:p},I={numOrSizeSplits:l,axis:u};return Y.runKernelFunc(g,f,null,cf,I)}const eo=z({split_:_J});function WJ(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let u=r.shape[r.shape.length-1];const p=r.size/u;let g;if(l!=null&&l0),te=r.shape.map(oe=>oe);te[r.shape.length-1]=l,g=Tt(r,ne,te),u=l}else if(l!=null&&l>u){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-u,g=yn([r,Es(ne)],r.shape.length-1),u=l}else g=r;const f=qe(g),I=ie(Pi(g,f),[p,u]),S=wu(I),x=Math.floor(u/2)+1,v=Nc(S),O=yu(S),C=eo(v,[x,u-x],v.shape.length-1),U=eo(O,[x,u-x],O.shape.length-1),G=g.shape.slice();return G[g.shape.length-1]=x,ie(Pi(C[0],U[0]),G)}const Lu=z({rfft_:WJ});function $J(r){const l=M(r,"x","sqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sqrt(l);return g([l]),f},u,null,rf)}const ps=z({sqrt_:$J});function UJ(r,l){let u=M(r,"a","squaredDifference"),p=M(l,"b","squaredDifference");[u,p]=mt(u,p),it(u.shape,p.shape);const g=(S,x)=>{const v=S.squaredDifference(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,lf,I)}const SI=z({squaredDifference_:UJ});function BJ(r,l){const u=M(r,"x","squeeze");return ie(u,rR(u.shape,l).newShape)}const II=z({squeeze_:BJ});function MJ(r,l=0){const u=Tf(r,"tensors","stack");if(Z(u.length>=1,()=>"Pass at least one tensor to tf.stack"),u.length===1)return Os(u[0],l);const p=u[0].rank,g=u[0].shape,f=u[0].dtype;Z(l<=p,()=>"Axis must be <= rank of the tensor"),u.forEach(S=>{Zt(g,S.shape,"All tensors passed to stack must have matching shapes"),Z(f===S.dtype,()=>"All tensors passed to stack must have matching dtypes")});const I=u.map(S=>Os(S,l));return yn(I,l)}const Vs=z({stack_:MJ});function PJ(r,l=0){const u=M(r,"x","step"),p={x:u},g={alpha:l};return Y.runKernelFunc(f=>f.step(u,l),p,null,gf,g)}const Qo=z({step_:PJ});function ea(r,l,u){if(wc(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const p=ur(r,u);if(p.length!==2&&p.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return zi(r,l,p,u)}function zJ(r,l,u){const p=M(r,"x","unsortedSegmentSum"),g=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(u),()=>"numSegments must be of dtype int");const f={x:p,segmentIds:g},I={numSegments:u},S=(x,v)=>{const O=x.unsortedSegmentSum(p,g,u);return v([g]),O};return Y.runKernelFunc(S,f,null,mf,I)}const xI=z({unsortedSegmentSum_:zJ});function GJ(r,l=0){const u=M(r,"x","unstack");Z(l>=-u.shape.length&&l`Axis = ${l} is not in [-${u.shape.length}, ${u.shape.length})`),l<0&&(l+=u.shape.length);const p={value:u},g={axis:l},f=I=>I.unstack(u,l);return Y.runKernelFunc(f,p,null,pf,g)}const Su=z({unstack_:GJ});function VJ(r,l="euclidean",u=null,p=!1){r=M(r,"x","norm");const g=PR(r,l,u);let f=g.shape;if(p){const I=ht(u,r.shape);f=Zn(g.shape,I)}return ie(g,f)}function PR(r,l,u=null){if(r.rank===0)return Un(r);if(r.rank!==1&&u===null)return PR(ie(r,[-1]),l,u);if(r.rank===1||typeof u=="number"||Array.isArray(u)&&u.length===1){if(l===1)return Fe(Un(r),u);if(l===Infinity)return Xo(Un(r),u);if(l===-Infinity)return Ef(Un(r),u);if(l==="euclidean"||l===2)return ps(Fe(Zo(Un(r),ke(2,"int32")),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(u)&&u.length===2){if(l===1)return Xo(Fe(Un(r),u[0]),u[1]-1);if(l===Infinity)return Xo(Fe(Un(r),u[1]),u[0]);if(l===-Infinity)return Ef(Fe(Un(r),u[1]),u[0]);if(l==="fro"||l==="euclidean")return ps(Fe(ut(r),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${u}`)}const kf=z({norm_:VJ});function zR(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function Ff(r,l,u){const p=1-r%2,g=new Float32Array(r);for(let f=0;f`Error in conv2dDerFilter: input must be rank 4, but got shape ${S.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(u.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${u}.`);const v=f==="NHWC"?S.shape[3]:S.shape[1],O=f==="NHWC"?x.shape[3]:x.shape[1];Z(v===u[2],()=>`Error in conv2dDerFilter: depth of input ${v}) must match input depth in filter (${u[2]}.`),Z(O===u[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${u[3]}).`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const C=ne=>{const te=1,oe=vc(f),ge=dr(S.shape,u,p,te,g,I,!1,oe);return ne.conv2dDerFilter(S,x,ge)},U={x:S,dy:x},G={strides:p,pad:g,dataFormat:f,dimRoundingMode:I};return Y.runKernelFunc(C,U,null,XC,G)}const _f=z({conv2DBackpropFilter_:YJ});function HJ(r,l,u,p){let g=r;r.rank===3&&(g=ie(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let f=l;f.rank===3&&(f=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=x=>x.depthwiseConv2DDerFilter(g,f,p),S={x:g,dy:f};return Y.runKernelFunc(I,S,null,n2)}const GR=z({depthwiseConv2dNativeBackpropFilter_:HJ});function qJ(r,l,u,p){let g=l,f=!1;l.rank===3&&(f=!0,g=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=v=>v.depthwiseConv2DDerInput(g,u,p),S={dy:g},x=Y.runKernelFunc(I,S,null,s2);return f?ie(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const VR=z({depthwiseConv2dNativeBackpropInput_:qJ});function jJ(r){return Ff(r,.54,.46)}const YR=z({hammingWindow_:jJ});function KJ(r){return Ff(r,.5,.5)}const Wf=z({hannWindow_:KJ});function XJ(r,l,u,p=!1,g=0){let f=0;const I=[];for(;f+l<=r.size;)I.push(Tt(r,f,l)),f+=u;if(p)for(;f`Error in cropAndResize: image must be rank 4,but got rank ${I.rank}.`),Z(S.rank===2&&S.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${v},4] but had shape ${S.shape}.`),Z(x.rank===1&&x.shape[0]===v,()=>`Error in cropAndResize: boxInd must be have size [${v}] but had shape ${S.shape}.`),Z(p.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${p.length}.`),Z(p[0]>=1&&p[1]>=1,()=>`cropSize must be atleast [1,1], but was ${p}`),Z(g==="bilinear"||g==="nearest",()=>`method must be bilinear or nearest, but was ${g}`);const O=ne=>ne.cropAndResize(I,S,x,p,g,f),C={image:I,boxes:S,boxInd:x},U={method:g,extrapolationValue:f,cropSize:p},G=Y.runKernelFunc(O,C,null,e2,U);return G}const qR=z({cropAndResize_:ZJ});function QJ(r){const l=M(r,"image","flipLeftRight","float32");Z(l.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${l.rank}.`);const u={image:l},p=Y.runKernel(m2,u,{});return p}const jR=z({flipLeftRight_:QJ});function e9(r,l,u=0,p=.5){const g=M(r,"image","rotateWithOffset","float32");Z(g.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${g.rank}.`);const f={image:g},I={radians:l,fillValue:u,center:p},S=Y.runKernel(tR,f,I);return S}const KR=z({rotateWithOffset_:e9});function Ys(r,l,u,p,g,f){p==null&&(p=.5),g==null&&(g=Number.NEGATIVE_INFINITY),f==null&&(f=0);const I=r.shape[0];return u=Math.min(u,I),Z(0<=p&&p<=1,()=>`iouThreshold must be in [0, 1], but was '${p}'`),Z(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),Z(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),Z(l.rank===1,()=>"scores must be a 1D tensor"),Z(l.shape[0]===I,()=>`scores has incompatible shape with boxes. Expected ${I}, but was ${l.shape[0]}`),Z(0<=f&&f<=1,()=>`softNmsSigma must be in [0, 1], but was '${f}'`),{maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f}}function t9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppression"),I=M(l,"scores","nonMaxSuppression"),S=Ys(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x={maxOutputSize:u,iouThreshold:p,scoreThreshold:g};return Y.runKernelFunc(v=>v.nonMaxSuppression(f,I,u,p,g),{boxes:f,scores:I},null,_2,x)}const XR=z({nonMaxSuppression_:t9});function JR(r,l,u){const p=n9(r,l,u),g=p<0?-(p+1):p;r.splice(g,0,l)}function n9(r,l,u){return i9(r,l,u||s9)}function s9(r,l){return r>l?1:r>>1);const S=u(l,r[f]);S>0?p=f+1:(g=f,I=!S)}return I?p:-p-1}function ZR(r,l,u,p,g){return TI(r,l,u,p,g,0).selectedIndices}function QR(r,l,u,p,g,f){return TI(r,l,u,p,g,0,!1,f,!0)}function eO(r,l,u,p,g,f){return TI(r,l,u,p,g,f,!0)}function TI(r,l,u,p,g,f,I=!1,S=!1,x=!1){const v=[];for(let oe=0;oeg&&v.push({score:l[oe],boxIndex:oe,suppressBeginIndex:0});v.sort(tO);const O=f>0?-.5/f:0,C=[],U=[];for(;C.length0;){const oe=v.pop(),{score:ge,boxIndex:fe,suppressBeginIndex:Ae}=oe;if(ge=Ae;--Ve){const rt=r9(r,fe,C[Ve]);if(rt>=p){Te=!0;break}if(oe.score=oe.score*o9(p,O,rt),oe.score<=g)break}oe.suppressBeginIndex=C.length,Te||(oe.score===ge?(C.push(fe),U.push(oe.score)):oe.score>g&&JR(v,oe,tO))}const G=C.length,ne=u-G;S&&ne>0&&(C.push(...new Array(ne).fill(0)),U.push(...new Array(ne).fill(0)));const te={selectedIndices:Qr(C,"int32")};return I&&(te.selectedScores=Qr(U,"float32")),x&&(te.validOutputs=ke(G,"int32")),te}function r9(r,l,u){const p=r.subarray(l*4,l*4+4),g=r.subarray(u*4,u*4+4),f=Math.min(p[0],p[2]),I=Math.min(p[1],p[3]),S=Math.max(p[0],p[2]),x=Math.max(p[1],p[3]),v=Math.min(g[0],g[2]),O=Math.min(g[1],g[3]),C=Math.max(g[0],g[2]),U=Math.max(g[1],g[3]),G=(S-f)*(x-I),ne=(C-v)*(U-O);if(G<=0||ne<=0)return 0;const te=Math.max(f,v),oe=Math.max(I,O),ge=Math.min(S,C),fe=Math.min(x,U),Ae=Math.max(ge-te,0)*Math.max(fe-oe,0);return Ae/(G+ne-Ae)}function o9(r,l,u){const p=Math.exp(l*u*u);return u<=r?p:0}function tO(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function a9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppressionAsync"),I=M(l,"scores","nonMaxSuppressionAsync"),S=Ys(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x=await Promise.all([f.data(),I.data()]),v=x[0],O=x[1],C=ZR(v,O,u,p,g);return f!==r&&f.dispose(),I!==l&&I.dispose(),C}const nO=a9;function c9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=Ys(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v={boxes:I,scores:S},O={maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f},C=Y.runKernel($2,v,O);return{selectedIndices:C[0],selectedScores:C[1]}}const sO=z({nonMaxSuppressionWithScore_:c9});async function l9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=Ys(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v=await Promise.all([I.data(),S.data()]),O=v[0],C=v[1],U=eO(O,C,u,p,g,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),U}const iO=l9;function h9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=Ys(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,U={boxes:I,scores:S},G={maxOutputSize:v,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:f},ne=Y.runKernel(W2,U,G);return{selectedIndices:ne[0],validOutputs:ne[1]}}const rO=z({nonMaxSuppressionPadded_:h9});async function u9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=Ys(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[U,G]=await Promise.all([I.data(),S.data()]),ne=QR(U,G,v,O,C,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),ne}const oO=u9;function d9(r,l,u=!1){const p=M(r,"images","resizeBilinear");Z(p.rank===3||p.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x=(U,G)=>(G([g]),U.resizeBilinear(g,I,S,u)),v={images:g},O={alignCorners:u,size:l},C=Y.runKernelFunc(x,v,null,Xm,O);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const aO=z({resizeBilinear_:d9});function p9(r,l,u=!1){const p=M(r,"images","resizeNearestNeighbor");Z(p.rank===3||p.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(p.dtype==="float32"||p.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x={images:g},v={alignCorners:u,size:l},O=(U,G)=>(G([g]),U.resizeNearestNeighbor(g,I,S,u)),C=Y.runKernelFunc(O,x,null,Km,v);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const cO=z({resizeNearestNeighbor_:p9});function m9(r,l,u){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(u%1===0,()=>`bandPart(): numUpper must be an integer, got ${u}.`);const p=M(r,"a","bandPart");Z(p.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${p.rank}.`);const g=p.shape,[f,I]=p.shape.slice(-2);if(!(l<=f))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${f}).`);if(!(u<=I))throw new Error(`bandPart(): numUpper (${u}) must not be greater than the number of columns (${I}).`);l<0&&(l=f),u<0&&(u=I);const S=ie(Df(0,f,1,"int32"),[-1,1]),x=Df(0,I,1,"int32"),v=Be(S,x),O=Jo(mr(v,ke(+l,"int32")),pr(v,ke(-u,"int32"))),C=Es([f,I],p.dtype);return ie(Vs(Su(ie(p,[-1,f,I])).map(U=>Bn(O,U,C))),g)}const lO=z({bandPart_:m9});function f9(r){let l;if(Array.isArray(r)){l=!1,Z(r!=null&&r.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");const g=r[0].shape[0];for(let f=1;f`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[f].shape[0]} vs. ${g})`)}else l=!0,r=eo(r,r.shape[0],0).map(g=>II(g,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const u=[],p=r;for(let g=0;g{let f=p[g];if(g>0)for(let I=0;I=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return uO(r,l);{const u=r.shape.slice(0,r.shape.length-2).reduce((x,v)=>x*v),p=Su(ie(r,[u,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),g=[],f=[];p.forEach(x=>{const[v,O]=uO(x,l);g.push(v),f.push(O)});const I=ie(Vs(g,0),r.shape),S=ie(Vs(f,0),r.shape);return[I,S]}}function uO(r,l=!1){return Y.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const u=r.shape[0],p=r.shape[1];let g=sI(u),f=pi(r);const I=ea([[1]],[1,1]);let S=pi(I);const x=u>=p?p:u;for(let v=0;v{const G=Tt(f,[v,v],[u-v,1]),ne=kf(G),te=Tt(f,[v,v],[1,1]),oe=Bn(mi(te,0),ea([[-1]]),ea([[1]])),ge=Be(te,ae(oe,ne)),fe=Pe(G,ge);fe.shape[0]===1?S=pi(I):S=yn([I,Tt(fe,[1,0],[fe.shape[0]-1,fe.shape[1]])],0);const Ae=yt(Pe(un(oe,ge),ne)),Te=Tt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=Wt(S);if(v===0)f=Be(Te,un(Ve,un(rt,Te)));else{const Kt=Be(Te,un(Ve,un(rt,Te)));f=yn([Tt(f,[0,0],[v,p]),Kt],0)}const vt=Wt(Ve),$t=Tt(g,[0,v],[u,g.shape[1]-v]);if(v===0)g=Be($t,un(un($t,S),vt));else{const Kt=Be($t,un(un($t,S),vt));g=yn([Tt(g,[0,0],[u,v]),Kt],1)}return[S,f,g]}),DR([O,C,U])}return!l&&u>p&&(g=Tt(g,[0,0],[u,p]),f=Tt(f,[0,0],[p,p])),[g,f]})}const dO=z({qr_:g9});var jt;(function(r){r[r.NONE=0]="NONE",r[r.MEAN=1]="MEAN",r[r.SUM=2]="SUM",r[r.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(jt||(jt={}));function y9(r,l,u=jt.SUM_BY_NONZERO_WEIGHTS){const p=M(r,"losses","computeWeightedLoss");let g=null;l!=null&&(g=M(l,"weights","computeWeightedLoss"));const f=g==null?p:ae(p,g);if(u===jt.NONE)return f;if(u===jt.SUM)return Fe(f);if(u===jt.MEAN){if(g==null)return dI(f);{const I=p.size/g.size,S=Pe(Fe(f),Fe(g));return I>1?Pe(S,ke(I)):S}}if(u===jt.SUM_BY_NONZERO_WEIGHTS){if(g==null)return Pe(Fe(f),ke(p.size));{const I=ae(g,Gi(p.shape)),S=Le(Fe(mI(I,ke(0))),"float32");return Pe(Fe(f),S)}}throw Error(`Unknown reduction: ${u}`)}const xn=z({computeWeightedLoss_:y9});function b9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","absoluteDifference"),f=M(l,"predictions","absoluteDifference");let I=null;u!=null&&(I=M(u,"weights","absoluteDifference")),Zt(g.shape,f.shape,"Error in absoluteDifference: ");const S=Un(Be(g,f));return xn(S,I,p)}const pO=z({absoluteDifference_:b9});function w9(r,l,u,p,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","cosineDistance"),I=M(l,"predictions","cosineDistance");let S=null;p!=null&&(S=M(p,"weights","cosineDistance")),Zt(f.shape,I.shape,"Error in cosineDistance: ");const x=ke(1),v=Be(x,Fe(ae(f,I),u,!0));return xn(v,S,g)}const mO=z({cosineDistance_:w9});function L9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"labels","hingeLoss");const f=M(l,"predictions","hingeLoss");let I=null;u!=null&&(I=M(u,"weights","hingeLoss")),Zt(g.shape,f.shape,"Error in hingeLoss: ");const S=ke(1);g=Be(ae(ke(2),g),S);const x=bu(Be(S,ae(g,f)));return xn(x,I,p)}const fO=z({hingeLoss_:L9});function S9(r,l,u,p=1,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","huberLoss"),I=M(l,"predictions","huberLoss");let S=null;u!=null&&(S=M(u,"weights","huberLoss")),Zt(f.shape,I.shape,"Error in huberLoss: ");const x=ke(p),v=Un(Be(I,f)),O=pI(v,x),C=Be(v,O),U=Lt(ae(ke(.5),ut(O)),ae(x,C));return xn(U,S,g)}const gO=z({huberLoss_:S9});function I9(r,l,u,p=1e-7,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","logLoss"),I=M(l,"predictions","logLoss");let S=null;u!=null&&(S=M(u,"weights","logLoss")),Zt(f.shape,I.shape,"Error in logLoss: ");const x=ke(1),v=ke(p),O=yt(ae(f,Zr(Lt(I,v)))),C=ae(Be(x,f),Zr(Lt(Be(x,I),v))),U=Be(O,C);return xn(U,S,g)}const yO=z({logLoss_:I9});function x9(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","meanSquaredError"),f=M(l,"predictions","meanSquaredError");let I=null;u!=null&&(I=M(u,"weights","meanSquaredError")),Zt(g.shape,f.shape,"Error in meanSquaredError: ");const S=SI(g,f);return xn(S,I,p)}const bO=z({meanSquaredError_:x9});function T9(r,l){const u=M(r,"labels","sigmoidCrossEntropyWithLogits"),p=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(u.shape,p.shape,"Error in sigmoidCrossEntropyWithLogits: ");const g=bu(p),f=ae(p,u),I=lI(Mn(yt(Un(p))));return Lt(Be(g,f),I)}function A9(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"multiClassLabels","sigmoidCrossEntropy");const I=M(l,"logits","sigmoidCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","sigmoidCrossEntropy")),Zt(f.shape,I.shape,"Error in sigmoidCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(.5);f=Lt(ae(f,Be(O,v)),ae(C,v))}const x=T9(f,I);return xn(x,S,g)}const wO=z({sigmoidCrossEntropy_:A9});function v9(r,l,u=-1){if(u===-1&&(u=l.rank-1),u!==l.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${l.rank} and dim was ${u}`);const p=Of((g,f,I)=>{const S=!0,x=hI(f,[u],S),v=Be(Le(f,"float32"),x);I([g,v]);const O=yt(ae(v,g)),C=Fe(O,[u]),U=(G,ne)=>{const[te,oe]=ne,ge=Zn(G.shape,[u]);return[ae(ie(G,ge),Be(Le(te,"float32"),Mn(oe))),ae(ie(G,ge),Be(Mn(oe),Le(te,"float32")))]};return{value:C,gradFunc:U}});return p(r,l)}function N9(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"onehotLabels","softmaxCrossEntropy");const I=M(l,"logits","softmaxCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","softmaxCrossEntropy")),Zt(f.shape,I.shape,"Error in softmaxCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(f.shape[1]);f=Lt(ae(f,Be(O,v)),Pe(v,C))}const x=v9(f,I);return xn(x,S,g)}const LO=z({softmaxCrossEntropy_:N9});const ITe={fft:wu,ifft:Rc,rfft:Lu,irfft:LI},NTe={hammingWindow:YR,hannWindow:Wf,frame:$f,stft:HR},SO={flipLeftRight:jR,resizeNearestNeighbor:cO,resizeBilinear:aO,rotateWithOffset:KR,cropAndResize:qR,nonMaxSuppression:XR,nonMaxSuppressionAsync:nO,nonMaxSuppressionWithScore:sO,nonMaxSuppressionWithScoreAsync:iO,nonMaxSuppressionPadded:rO,nonMaxSuppressionPaddedAsync:oO},zTe={bandPart:lO,gramSchmidt:hO,qr:dO},ZTe={absoluteDifference:pO,computeWeightedLoss:xn,cosineDistance:mO,hingeLoss:fO,huberLoss:gO,logLoss:yO,meanSquaredError:bO,sigmoidCrossEntropy:wO,softmaxCrossEntropy:LO};const IO=1.7580993408473768,xO=1.0507009873554805;const TO={kernelName:Lm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Qo(Le(u,"float32"),-1))}}};const AO={kernelName:kC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ut(Le(u,"float32")),g=ps(Be(ke(1),p));return yt(Pe(r,g))}}}};const vO={kernelName:FC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Be(ut(Le(u,"float32")),1));return Pe(r,p)}}}};const NO={kernelName:yc,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=At(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=At(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,p.shape)};return{a:f,b:I}}};const CO={kernelName:_C,saveAllInputs:!0,gradFunc:(r,l)=>{const u={};return l.forEach((p,g)=>{u[g]=()=>r.clone()}),u}};const RO={kernelName:WC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>qe(u)}}};const OO={kernelName:$C,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>qe(u)}}};const EO={kernelName:UC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ps(Be(ke(1),ut(Le(u,"float32")))))}}};const DO={kernelName:BC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Lt(ke(1),ut(Le(u,"float32"))));return Pe(r,p)}}}};const kO={kernelName:zC,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Lt(ut(u),ut(p));let x=ae(r,Pe(p,S));const v=At(u.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,u.shape)},I=()=>{const S=Lt(ut(u),ut(p));let x=yt(ae(r,Pe(u,S)));const v=At(p.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,p.shape)};return{a:f,b:I}}};const FO={kernelName:MC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(ut(Le(u,"float32")),1))}}};const _O={kernelName:PC,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Be(ke(1),ut(Le(u,"float32"))))}}};function C9(r,l,u,p,g=[1,1,1],f,I){const S=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let v=S,O=x,C=!1;x.rank===4&&(C=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2],S.shape[3]]),O=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(v.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${v.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(Jr(p,g),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${p} and dilations '${g}'`),I!=null&&Z(Qt(f),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const U=oe=>{const ge=Cf(O.shape,u,p,g,f,I);return oe.avgPool3dBackprop(v,O,ge)},G={dy:v,input:O},ne={filterSize:u,strides:p,dilations:g,pad:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,HC,ne);return C?ie(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const WO=z({avgPool3dBackprop_:C9});const $O={kernelName:YC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,dilations:I,pad:S,dimRoundingMode:x}=u,v=I==null?[1,1,1]:I;return{x:()=>WO(r,p,g,f,v,S,x)}}};function R9(r,l,u,p,g){const f=M(r,"dy","avgPoolBackprop"),I=M(l,"input","avgPoolBackprop");Z(I.rank===f.rank,()=>`Rank of input (${I.rank}) does not match rank of dy (${f.rank})`);let S=I,x=f,v=!1;I.rank===3&&(v=!0,S=ie(I,[1,I.shape[0],I.shape[1],I.shape[2]]),x=ie(f,[1,f.shape[0],f.shape[1],f.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(S.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${S.rank}.`);const O=ne=>{const te=Nf(S.shape,u,p,1,g);return ne.avgPoolBackprop(x,S,te)},C={dy:x,input:S},U={filterSize:u,strides:p,pad:g},G=Y.runKernelFunc(O,C,null,VC,U);return v?ie(G,[G.shape[1],G.shape[2],G.shape[3]]):G}const UO=z({avgPoolBackprop_:R9});const BO={kernelName:GC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,pad:I}=u;return{x:()=>UO(r,p,g,f,I)}}};const MO={kernelName:Sm,inputsToSave:["a","b"],gradFunc:(r,l,u)=>{const[p,g]=l,{transposeA:f,transposeB:I}=u;return!f&&!I?{a:()=>un(r,g,!1,!0),b:()=>un(p,r,!0,!1)}:!f&&I?{a:()=>un(r,g,!1,!1),b:()=>un(r,p,!0,!1)}:f&&!I?{a:()=>un(g,r,!1,!0),b:()=>un(p,r,!1,!1)}:{a:()=>un(g,r,!0,!0),b:()=>un(r,p,!0,!0)}}};const PO={kernelName:Im,gradFunc:(r,l,u)=>{const{blockShape:p,crops:g}=u;return{x:()=>gI(r,p,g)}}};const zO={kernelName:xm,gradFunc:(r,l,u)=>{const p=u,g=p.inputShape,f=p.shape,I=Array.from(f);for(let x=g.length-1;x>=0;x--)if(g[x]===f[x])I[x]=1;else if(g[x]!==1)throw new Error(`broadcastTo(): [${g}] cannot be broadcast to [${f}].`);const S=[];for(let x=0;x1&&S.push(x);return{x:()=>Fe(r,S,!0)}}};const GO={kernelName:bc,gradFunc:r=>({x:()=>r.clone()})};const VO={kernelName:qC,gradFunc:r=>({x:()=>qe(r)})};const YO={kernelName:jC,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{clipValueMin:g,clipValueMax:f}=u;return{x:()=>Bn(Jo(pr(p,g),mr(p,f)),r,qe(r))}}};const HO={kernelName:Tm,saveAllInputs:!0,gradFunc:(r,l,u)=>{const p=l.map(x=>x.shape),{axis:g}=u,f=ht(g,l[0].shape)[0],I=p.map(x=>x[f]),S=eo(r,I,f);return S.map(x=>()=>x)}};const qO={kernelName:Am,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{dilations:f,strides:I,pad:S,dataFormat:x}=u;return Z(Xr(f),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${f}'`),{x:()=>$R(p.shape,r,g,I,S,x),filter:()=>_f(p,r,g.shape,I,S,x)}}};const jO={kernelName:vm,inputsToSave:["dy","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{strides:f,pad:I,dataFormat:S,dimRoundingMode:x}=u;return{dy:()=>QS(r,g,f,I,S,1,x),filter:()=>_f(r,p,g.shape,f,I,S,x)}}};function O9(r,l,u,p,g){let f=r;r.rank===4&&(f=ie(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let I=l;I.rank===4&&(I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(f.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${f.shape}.`),Z(I.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${I.shape}.`),Z(u.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${u}.`),Z(f.shape[4]===u[3],()=>`Error in conv3dDerFilter: depth of input ${f.shape[4]}) must match input depth in filter (${u[3]}.`),Z(I.shape[4]===u[4],()=>`Error in conv3dDerFilter: depth of dy (${I.shape[4]}) must match output depth for filter (${u[4]}).`);const S=O=>{const C=1,U=fu(f.shape,u,p,C,g);return O.conv3dDerFilter(f,I,U)},x={x:f,y:I},v={strides:p,pad:g};return Y.runKernelFunc(S,x,null,ZC,v)}const KO=z({conv3DBackpropFilter_:O9});const XO={kernelName:JC,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f}=u;Z(Xr(p),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${p}'`);const[I,S]=l;return{x:()=>UR(I.shape,r,S,g,f),filter:()=>KO(I,r,S.shape,g,f)}}};const JO={kernelName:Nm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(yt(bI(Le(u,"float32"))),r)}}};const ZO={kernelName:Cm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(wI(Le(u,"float32")),r)}}};const QO={kernelName:Rm,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{axis:g,exclusive:f,reverse:I}=u;return{x:()=>{const S=ds([g],p.rank);let x=tI(r,g,f,!I);return S!=null&&(x=Wt(x,S)),x}}}};const e1={kernelName:t2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f,dimRoundingMode:I}=u,S=p==null?[1,1]:p;Z(Xr(S),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${S}'`);const[x,v]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(v.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${v.rank}.`),Z(x.shape[3]===v.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${v.shape[2]}.`),Z(Jr(g,S),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${g} and dilations '${S}'.`),I!=null&&Z(Qt(f),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=dr(x.shape,v.shape,g,S,f,I,!0);return{x:()=>VR(x.shape,r,v,O),filter:()=>GR(x,r,v.shape,O)}}};const t1={kernelName:i2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,f={x:p,filter:g,dy:r},I={x:p,filter:g,dy:r};return{x:()=>Y.runKernel(r2,f,u),filter:()=>Y.runKernel(o2,I,u)}}};const n1={kernelName:Om,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=At(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=ut(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const s1={kernelName:a2,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l,p=f=>f.eluDer(r,u),g={dy:r,y:u};return{x:()=>Y.runKernelFunc(p,g,null,c2)}}};const i1={kernelName:l2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(Mn(yt(ut(u))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,p)}}};const r1={kernelName:Em,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,u)}}};const o1={kernelName:u2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Mn(u))}}};const a1={kernelName:Dm,gradFunc:r=>({x:()=>qe(r)})};const c1={kernelName:km,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=At(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=ut(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const l1={kernelName:f2,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,u)=>{const{varianceEpsilon:p}=u,[g,f,I,S]=l,x=S==null?ke(1):S,v=At(f.shape,g.shape),O=[];if(f.rank===1){for(let Te=0;Tef.rank===1?ie(ae(ae(r,Ko(ie(G,[1,1,1,f.shape[0]]),O)),x),g.shape):ie(ae(ae(r,G),x),g.shape),oe=()=>{let Te=ae(ae(G,ke(-1)),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},ge=()=>{let Te=ae(ae(ne,C),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},fe=()=>{const Te=ae(C,G);let Ve=ae(r,Te);return f.rank===1&&(Ve=Fe(Ve,v)),ie(Ve,f.shape)},Ae=()=>{let Te=r;return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)};return{x:te,mean:oe,variance:ge,scale:fe,offset:Ae}}};const d1={kernelName:Fm,inputsToSave:["x","indices"],gradFunc:(r,l,u)=>{const[p,g]=l,{axis:f}=u,I=ht(f,p.shape)[0],S=()=>{const x=p.shape,v=g.size,O=x.slice(0,I),C=O.length,U=x.slice(f,x.length).slice(1),G=U.length,ne=h1(0,C),te=h1(C+1,C+1+G),oe=u1([O,[v],U]),ge=ie(r,oe),fe=ie(g,[v]),Ae=u1([[C],ne,te]),Te=Wt(ge,Ae);let Ve=xI(Te,fe,p.shape[I]);const rt=Tc(Ae);return Ve=Wt(Ve,rt),Ve};return{x:S,indices:()=>g}}};function h1(r,l){const u=[];for(let p=r;p{const[u,p]=l;return{a:()=>qe(u),b:()=>qe(p)}}};const m1={kernelName:Wm,gradFunc:r=>({x:()=>Le(r,"float32")})};const f1={kernelName:w2,gradFunc:r=>({x:()=>qe(r)})};const g1={kernelName:L2,gradFunc:r=>({x:()=>qe(r)})};const y1={kernelName:S2,gradFunc:r=>({x:()=>qe(r)})};const b1={kernelName:Um,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(u,1))}}};const w1={kernelName:$m,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Le(u,"float32"))}}};const L1={kernelName:v2,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{axis:g}=u;return{logits:()=>{const f=!0,I=Mn(p);return Be(r,ae(Fe(r,g,f),I))}}}};function E9(r,l,u,p=5,g=1,f=1,I=.5){const S=O=>O.LRNGrad(u,r,l,p,g,f,I),x={x:r,y:l,dy:u},v={depthRadius:p,bias:g,alpha:f,beta:I};return Y.runKernelFunc(S,x,null,C2,v)}const S1=z({localResponseNormalizationBackprop_:E9});const I1={kernelName:N2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{depthRadius:f,bias:I,alpha:S,beta:x}=u;return{x:()=>S1(p,g,r,f,I,S,x)}}};function Uf(r,l,u,p,g){return l.rank{const f=ae(r,Le(nI(u,l),r.dtype));return g==null?f:Wt(f,g)}}}const AI={kernelName:Bm,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{reductionIndices:g}=p,[f,I]=l,S=ht(g,f.shape),x=ds(S,f.rank),v=Uf(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=Wt(O)),O}}}};const x1={kernelName:Mm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(pr(u,p),"float32")),f=()=>ae(r,Le(cI(u,p),"float32"));return{a:g,b:f}}};function D9(r,l,u,p,g,f=[1,1,1],I,S){const x=M(r,"dy","maxPool3dBackprop"),v=M(l,"input","maxPool3dBackprop"),O=M(u,"output","maxPool3dBackprop");let C=x,U=v,G=O,ne=!1;v.rank===4&&(ne=!0,C=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),U=ie(v,[1,v.shape[0],v.shape[1],v.shape[2],v.shape[3]]),G=ie(O,[1,O.shape[0],O.shape[1],O.shape[2],O.shape[3]])),Z(C.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${C.rank}.`),Z(U.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${U.rank}.`),Z(G.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${G.rank}.`),Z(Jr(g,f),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${g} and dilations '${f}'`),S!=null&&Z(Qt(I),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${I}.`);const te=Ae=>{const Te=Cf(U.shape,p,g,f,I,S);return Ae.maxPool3dBackprop(C,U,G,Te)},oe={dy:C,input:U,output:G},ge={filterSize:p,strides:g,dilations:f,pad:I,dimRoundingMode:S},fe=Y.runKernelFunc(te,oe,null,D2,ge);return ne?ie(fe,[fe.shape[1],fe.shape[2],fe.shape[3],fe.shape[4]]):fe}const T1=z({maxPool3dBackprop_:D9});const A1={kernelName:E2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,dilations:S,pad:x,dimRoundingMode:v}=u,O=S==null?[1,1,1]:S;return{x:()=>T1(r,p,g,f,I,O,x,v)}}};function k9(r,l,u,p,g,f,I){const S=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),v=M(u,"output","maxPoolBackprop");Z(x.rank===S.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${S.rank})`),Z(S.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${S.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),I!=null&&Z(Qt(f),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=G=>{const ne=Nf(x.shape,p,g,1,f,I);return G.maxPoolBackprop(S,x,v,ne)},C={dy:S,input:x,output:v},U={filterSize:p,strides:g,pad:f,dimRoundingMode:I};return Y.runKernelFunc(O,C,null,O2,U)}const v1=z({maxPoolBackprop_:k9});const N1={kernelName:R2,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,pad:S}=u;return{x:()=>v1(r,p,g,f,I,S)}}};const C1={kernelName:Pm,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{axis:g}=p,[f,I]=l,S=ht(g,f.shape),x=ds(S,f.rank),v=Uf(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=Wt(O)),O}}}};const R1={kernelName:zm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(mr(u,p),"float32")),f=()=>ae(r,Le(mi(u,p),"float32"));return{a:g,b:f}}};const O1={kernelName:k2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=At(u.shape,g);return S.length>0?ie(Fe(r,S),u.shape):r},I=()=>{const S=ae(r,yt(rI(Pe(u,p)))),x=At(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const E1={kernelName:Gm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=ae(r,Le(p,"float32")),x=At(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{const S=ae(r,Le(u,"float32")),x=At(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const D1={kernelName:Vm,gradFunc:r=>({x:()=>yt(r)})};const k1={kernelName:B2,inputsToSave:["indices"],gradFunc:(r,l)=>{const u=l[0];return{indices:()=>Es(u.shape,"float32")}}};const F1={kernelName:U2,gradFunc:r=>({x:()=>qe(r)})};const vI={kernelName:Ym,inputsToSave:["x"],gradFunc:(r,l,u)=>{const p=l[0],{paddings:g}=u,f=g.map(I=>I[0]);return{x:()=>Tt(r,f,p.shape)}}};const _1={kernelName:Hm,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[u,p,g]=l,f=u,I=p,S=it(f.shape,I.shape),x=()=>{const O=Le(I,"float32");let C=ae(r,ae(O,Zo(f,Be(O,ke(1)))));const U=At(f.shape,S);return U.length>0&&(C=Fe(C,U)),ie(C,f.shape)},v=()=>{const O=mi(f,0),C=Bn(O,Zr(f),qe(f));let U=ae(r,ae(g,C));const G=At(I.shape,S);return G.length>0&&(U=Fe(U,G)),ie(U,I.shape)};return{a:x,b:v}}};const W1={kernelName:M2,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[u,p]=l,g=mi(u,0);return{x:()=>Bn(g,r,ae(r,p)),alpha:()=>{let f=Bn(g,qe(r),ae(r,u));const I=At(p.shape,r.shape);return I.length>0&&(f=Fe(f,I)),ie(f,p.shape)}}}};const $1={kernelName:G2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,yt(ut(u)))}}};const U1={kernelName:H2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(mr(u,6),Qo(u));return{x:()=>ae(r,Le(p,"float32"))}}};const B1={kernelName:qm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Le(Qo(u),"float32"))}}};const M1={kernelName:jm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ie(r,u.shape)}}};const P1={kernelName:Xm,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeBilinearBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,Y2,u);return{images:I}}};const z1={kernelName:Km,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeNearestNeighborBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,V2,u);return{images:I}}};const G1={kernelName:Jm,gradFunc:(r,l,u)=>{const{dims:p}=u,g=ht(p,r.shape);return{x:()=>Cc(r,g)}}};const V1={kernelName:q2,gradFunc:r=>({x:()=>qe(r)})};const Y1={kernelName:Zm,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>yt(Pe(r,ae(Zo(u,1.5),2)))}}};const H1={kernelName:Qm,inputsToSave:["condition"],gradFunc:(r,l)=>{const[u]=l;return{condition:()=>Le(qe(u),"float32"),t:()=>ae(r,Le(u,r.dtype)),e:()=>ae(r,Le(uI(u),r.dtype))}}};const q1={kernelName:j2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=mi(u,ke(0)),g=ke(IO),f=ke(xO),I=ae(r,f),S=ae(ae(r,g),Mn(Le(u,"float32")));return Bn(p,I,S)}}}};const j1={kernelName:sf,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(u,Be(ke(1),u)))}}};const K1={kernelName:K2,gradFunc:r=>({x:()=>qe(r)})};const X1={kernelName:tf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(gu(Le(u,"float32")),r)}}};const J1={kernelName:nf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(eI(Le(u,"float32")),r)}}};const Z1={kernelName:ef,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{begin:g,size:f}=u,I=p.shape,[S,x]=Af(p,g,f),v=[];for(let O=0;OfI(r,v)}}};const Q1={kernelName:J2,outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{dim:g}=u,f=!0,I=ae(r,p);return{logits:()=>Be(I,ae(Fe(I,[g],f),p))}}};const eE={kernelName:X2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,JS(u))}}};const NI={kernelName:af,gradFunc:(r,l,u)=>{const{blockShape:p,paddings:g}=u;return{x:()=>ZS(r,p,g)}}};const CI={kernelName:cf,gradFunc:(r,l,u)=>{const{axis:p}=u;return{x:()=>yn(r,p)}}};const tE={kernelName:rf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ae(ps(Le(u,"float32")),2))}}};const nE={kernelName:Z2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(Le(u,"float32"),2))}}};const sE={kernelName:lf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=ke(2),f=()=>ae(r,ae(g,Be(u,p))),I=()=>ae(r,ae(g,Be(p,u)));return{a:f,b:I}}};const iE={kernelName:gf,gradFunc:r=>({x:()=>qe(r)})};const rE={kernelName:hf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=At(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=At(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(yt(S),p.shape)};return{a:f,b:I}}};const oE={kernelName:of,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,g=p.shape.slice(),{axis:f}=u,I=ht(f,p.shape);I.forEach(v=>{g[v]=1});const S=ie(r,g),x=ae(S,Gi(p.shape,"float32"));return{x:()=>x}}};const aE={kernelName:Q2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ut(gu(u)))}}};const cE={kernelName:eR,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Be(ke(1),ut(u)),r)}}};const lE={kernelName:uf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{reps:g}=u,f=()=>{let I=qe(p);if(p.rank===1)for(let S=0;S{const p=u,{perm:g}=p,f=Tc(g);return{x:()=>Wt(r,f)}}};const uE={kernelName:pf,gradFunc:(r,l,u)=>{const p=u,{axis:g}=p;return{value:()=>Vs(r,g)}}};const dE={kernelName:mf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[u]=l,p=()=>F9(r,u);return{x:p}}};function F9(r,l){const u=aI(l,qe(l)),p=oI(r,u);let g=pr(l,ke(0,"int32"));const f=p.rank-g.rank;for(let S=0;S({x:()=>qe(r)})};const _9=[TO,AO,vO,NO,CO,RO,OO,EO,DO,kO,FO,_O,$O,BO,MO,PO,zO,GO,VO,YO,HO,jO,qO,XO,JO,ZO,QO,e1,t1,n1,s1,i1,r1,o1,c1,a1,l1,d1,p1,m1,f1,g1,y1,b1,w1,L1,I1,AI,AI,x1,A1,N1,C1,R1,O1,E1,D1,k1,F1,vI,vI,_1,W1,$1,U1,B1,M1,P1,z1,G1,V1,Y1,H1,q1,j1,K1,X1,J1,Z1,Q1,eE,NI,NI,CI,CI,tE,sE,nE,iE,rE,oE,aE,cE,lE,hE,uE,dE,pE];for(const r of _9)sR(r);function RI(r,l,u=!1){const{Image:p,Canvas:g}=gt.getEnv();if(!(r instanceof p||r instanceof g))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const f=Yo(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=gc({width:l,height:l}),O=r instanceof g?r:ou(r),C=Math.abs(S-x)/2,U=u&&S{if(lr(u)){this._imageTensors[p]=u,this._inputDimensions[p]=u.shape;return}if(Ns(u)){const f=u.shape[0];if(f!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${f} passed, but not supported in input array`);this._imageTensors[p]=u,this._inputDimensions[p]=u.shape.slice(1);return}const g=u instanceof gt.getEnv().Canvas?u:ou(u);this._canvases[p]=g,this._inputDimensions[p]=[g.height,g.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 Wi(this.batchSize,0,1).map((r,l)=>this.getReshapedInputDimensions(l))}getInput(r){return this.canvases[r]||this.imageTensors[r]}getInputDimensions(r){return this._inputDimensions[r]}getInputHeight(r){return this._inputDimensions[r][0]}getInputWidth(r){return this._inputDimensions[r][1]}getReshapedInputDimensions(r){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");const l=this.getInputWidth(r),u=this.getInputHeight(r);return pS({width:l,height:u},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,ER(()=>{const u=Wi(this.batchSize,0,1).map(g=>{const f=this.getInput(g);if(f instanceof In){let I=Ns(f)?f:f.expandDims();return I=yS(I,l),(I.shape[1]!==r||I.shape[2]!==r)&&(I=SO.resizeBilinear(I,[r,r])),I.as3D(r,r,3)}if(f instanceof gt.getEnv().Canvas)return jS.fromPixels(RI(f,r,l));throw new Error(`toBatchTensor - at batchIdx ${g}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${f}`)}),p=Vs(u.map(g=>Le(g,"float32"))).as4D(this.batchSize,r,r,3);return p})}}async function Rt(r){if(r instanceof to)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const u=g=>Array.isArray(r)?` at input index ${g}:`:"",p=l.map(Vo);return p.forEach((g,f)=>{if(!wm(g)&&!lr(g)&&!Ns(g))throw typeof l[f]=="string"?new Error(`toNetInput -${u(f)} string passed, but could not resolve HTMLElement for element id ${l[f]}`):new Error(`toNetInput -${u(f)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Ns(g)){const I=g.shape[0];if(I!==1)throw new Error(`toNetInput -${u(f)} tf.Tensor4D with batchSize ${I} passed, but not supported in input array`)}}),await Promise.all(p.map(g=>wm(g)&&AS(g))),new to(p,Array.isArray(r))}async function Oc(r,l){const{Canvas:u}=gt.getEnv();let p=r;if(!(r instanceof u)){const I=await Rt(r);if(I.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const S=I.getInput(0);p=S instanceof u?S:await NS(S)}const g=Jn(p),f=l.map(I=>I instanceof Ht?I.forSize(p.width,p.height).box.floor():I).map(I=>I.clipAtImageBorders(p.width,p.height));return f.map(({x:I,y:S,width:x,height:v})=>{const O=gc({width:x,height:v});return Jn(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const Bf=Ke(Xe());async function Ec(r,l){if(!lr(r)&&!Ns(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Ns(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return Bf.tidy(()=>{const[u,p,g]=r.shape.slice(Ns(r)?1:0),f=l.map(S=>S instanceof Ht?S.forSize(p,u).box:S).map(S=>S.clipAtImageBorders(p,u)),I=f.map(({x:S,y:x,width:v,height:O})=>Bf.slice3d(r.as3D(u,p,g),[x,S,0],[O,v,g]));return I})}async function ta(r,l){const u=gt.getEnv().fetch,p=await u(r,l);if(!(p.status<400))throw new Error(`failed to fetch: (${p.status}) ${p.statusText}, from url: ${p.url}`);return p}async function W9(r){const l=await ta(r),u=await l.blob();if(!u.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${u.type}, for url: ${l.url}`);return vS(u)}async function OI(r){return(await ta(r)).json()}async function $9(r){return new Float32Array(await(await ta(r)).arrayBuffer())}function Mf(r,l){const u=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:u};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${u}`};const p=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(p,"");const g=r.split("/").filter(S=>S),f=r.endsWith(".json")?g[g.length-1]:u;let I=p+(r.endsWith(".json")?g.slice(0,g.length-1):g).join("/");return I=r.startsWith("/")?`/${I}`:I,{modelBaseUri:I,manifestUri:I==="/"?`/${f}`:`${I}/${f}`}}const mE=Ke(Xe());async function EI(r,l){const{manifestUri:u,modelBaseUri:p}=Mf(r,l);let g=await OI(u);return mE.io.loadWeights(g,p)}function U9(r,l,u=!1){const{width:p,height:g}=u?Yo(l):l;return r.width=p,r.height=g,{width:p,height:g}}const fr=Ke(Xe());class En{constructor(r){this._name=r;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(r){const{obj:l,objProp:u}=this.traversePropertyPath(r);return l[u]}reassignParamFromPath(r,l){const{obj:u,objProp:p}=this.traversePropertyPath(r);u[p].dispose(),u[p]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof fr.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof fr.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const u=fr.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,u)})}dispose(r=!0){this.getParamList().forEach(l=>{if(r&&l.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${l.path}`);l.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:r})=>Array.from(r.dataSync())).reduce((r,l)=>r.concat(l)))}async load(r){if(r instanceof Float32Array){this.extractWeights(r);return}await this.loadFromUri(r)}async loadFromUri(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);const l=await EI(r,this.getDefaultModelName());this.loadFromWeightMap(l)}async loadFromDisk(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);const{readFile:l}=gt.getEnv(),{manifestUri:u,modelBaseUri:p}=Mf(r,this.getDefaultModelName()),g=x=>Promise.all(x.map(v=>l(v).then(O=>O.buffer))),f=fr.io.weightsLoaderFactory(g),I=JSON.parse((await l(u)).toString()),S=await f(I,p);this.loadFromWeightMap(S)}loadFromWeightMap(r){const{paramMappings:l,params:u}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=u}extractWeights(r){const{paramMappings:l,params:u}=this.extractParams(r);this._paramMappings=l,this._params=u}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((g,f)=>{if(!g.nextObj.hasOwnProperty(f))throw new Error(`traversePropertyPath - object does not have property ${f}, for path ${r}`);return{obj:g.nextObj,objProp:f,nextObj:g.nextObj[f]}},{nextObj:this.params}),{obj:u,objProp:p}=l;if(!u||!p||!(u[p]instanceof fr.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:u,objProp:p}}}const Dc=Ke(Xe());function Qn(r,l,u){return Dc.tidy(()=>{let p=Dc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Dc.add(p,l.bias),p})}const Dt=Ke(Xe());function Pf(r,l,u=!1){return Dt.tidy(()=>{const p=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):Qn(r,l.conv0,[2,2])),g=Qn(p,l.conv1,[1,1]),f=Dt.relu(Dt.add(p,g)),I=Qn(f,l.conv2,[1,1]);return Dt.relu(Dt.add(p,Dt.add(g,I)))})}function Iu(r,l,u=!1,p=!0){return Dt.tidy(()=>{const g=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,p?[2,2]:[1,1],"same"),l.conv0.bias):Qn(r,l.conv0,p?[2,2]:[1,1])),f=Qn(g,l.conv1,[1,1]),I=Dt.relu(Dt.add(g,f)),S=Qn(I,l.conv2,[1,1]),x=Dt.relu(Dt.add(g,Dt.add(f,S))),v=Qn(x,l.conv3,[1,1]);return Dt.relu(Dt.add(g,Dt.add(f,Dt.add(S,v))))})}const no=Ke(Xe());function na(r,l,u="same",p=!1){return no.tidy(()=>{const g=no.add(no.conv2d(r,l.filters,[1,1],u),l.bias);return p?no.relu(g):g})}function Pn(r,l){Object.keys(r).forEach(u=>{l.some(p=>p.originalPath===u)||r[u].dispose()})}const zf=Ke(Xe());function kc(r,l){return function(u,p,g,f){const I=zf.tensor4d(r(u*p*g*g),[g,g,u,p]),S=zf.tensor1d(r(p));return l.push({paramPath:`${f}/filters`},{paramPath:`${f}/bias`}),{filters:I,bias:S}}}const Gf=Ke(Xe());function Vf(r,l){return function(u,p,g){const f=Gf.tensor2d(r(u*p),[u,p]),I=Gf.tensor1d(r(p));return l.push({paramPath:`${g}/weights`},{paramPath:`${g}/bias`}),{weights:f,bias:I}}}class DI{constructor(r,l,u){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=u}}const xu=Ke(Xe());function Fc(r,l){return function(u,p,g){const f=xu.tensor4d(r(3*3*u),[3,3,u,1]),I=xu.tensor4d(r(u*p),[1,1,u,p]),S=xu.tensor1d(r(p));return l.push({paramPath:`${g}/depthwise_filter`},{paramPath:`${g}/pointwise_filter`},{paramPath:`${g}/bias`}),new DI(f,I,S)}}function _c(r){return function(l){const u=r(`${l}/depthwise_filter`,4),p=r(`${l}/pointwise_filter`,4),g=r(`${l}/bias`,1);return new DI(u,p,g)}}function ms(r,l){return function(u,p,g){const f=r[u];if(!Bo(f,p))throw new Error(`expected weightMap[${u}] to be a Tensor${p}D, instead have ${f}`);return l.push({originalPath:u,paramPath:g||u}),f}}function zn(r){let l=r;function u(g){const f=l.slice(0,g);return l=l.slice(g),f}function p(){return l}return{extractWeights:u,getRemainingWeights:p}}function Yf(r,l){const u=kc(r,l),p=Fc(r,l);function g(I,S,x,v=!1){const O=v?u(I,S,3,`${x}/conv0`):p(I,S,`${x}/conv0`),C=p(S,S,`${x}/conv1`),U=p(S,S,`${x}/conv2`);return{conv0:O,conv1:C,conv2:U}}function f(I,S,x,v=!1){const{conv0:O,conv1:C,conv2:U}=g(I,S,x,v),G=p(S,S,`${x}/conv3`);return{conv0:O,conv1:C,conv2:U,conv3:G}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:f}}function fE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractDenseBlock4Params:g}=Yf(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2"),x=g(128,256,"dense3");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S,dense3:x}}}function Hf(r){return function(l){const u=r(`${l}/filters`,4),p=r(`${l}/bias`,1);return{filters:u,bias:p}}}function qf(r,l){const u=ms(r,l),p=Hf(u),g=_c(u);function f(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`);return{conv0:v,conv1:O,conv2:C}}function I(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`),U=g(`${S}/conv3`);return{conv0:v,conv1:O,conv2:C,conv3:U}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:I}}function gE(r){const l=[],{extractDenseBlock4Params:u}=qf(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2"),dense3:u("dense3")};return Pn(r,l),{params:p,paramMappings:l}}const Wc=Ke(Xe());class jf extends En{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return Wc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(Wc.scalar(255));let f=Iu(g,l.dense0,!0);return f=Iu(f,l.dense1),f=Iu(f,l.dense2),f=Iu(f,l.dense3),f=Wc.avgPool(f,[7,7],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return gE(r)}extractParams(r){return fE(r)}}const $c=Ke(Xe());function Tu(r,l){return $c.tidy(()=>$c.add($c.matMul(r,l.weights),l.bias))}function yE(r,l,u){const p=[],{extractWeights:g,getRemainingWeights:f}=zn(r),I=Vf(g,p),S=I(l,u,"fc");if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:p,params:{fc:S}}}function bE(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:p("fc")};return Pn(r,l),{params:g,paramMappings:l}}function Kf(r){const l={},u={};return Object.keys(r).forEach(p=>{const g=p.startsWith("fc")?u:l;g[p]=r[p]}),{featureExtractorMap:l,classifierMap:u}}const wE=Ke(Xe());class Xf extends En{constructor(r,l){super(r);this._faceFeatureExtractor=l}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return wE.tidy(()=>{const u=r instanceof to?this.faceFeatureExtractor.forwardInput(r):r;return Tu(u.as2D(u.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return yE(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Kf(r);return this.faceFeatureExtractor.loadFromWeightMap(l),bE(u)}extractParams(r){const l=this.getClassifierChannelsIn(),u=this.getClassifierChannelsOut(),p=u*l+u,g=r.slice(0,r.length-p),f=r.slice(r.length-p);return this.faceFeatureExtractor.extractWeights(g),this.extractClassifierParams(f)}}const kI=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class sa{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);kI.forEach((l,u)=>{this[l]=r[u]})}asSortedArray(){return kI.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Uc=Ke(Xe());class FI extends Xf{constructor(r=new jf){super("FaceExpressionNet",r)}forwardInput(r){return Uc.tidy(()=>Uc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Rt(r))}async predictExpressions(r){const l=await Rt(r),u=await this.forwardInput(l),p=await Promise.all(Uc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new sa(f));return l.isBatchInput?g:g[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function _I(r){return r.expressions instanceof sa}function Jf(r,l){const u={expressions:l};return Object.assign({},r,u)}function B9(r,l,u=.1,p){const g=Array.isArray(l)?l:[l];g.forEach(f=>{const I=f instanceof sa?f:_I(f)?f.expressions:void 0;if(!I)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const S=I.asSortedArray(),x=S.filter(C=>C.probability>u),v=Ui(f)?f.detection.box.bottomLeft:p||new Je(0,0),O=new fc(x.map(C=>`${C.expression} (${Mo(C.probability)})`),v);O.draw(r)})}function ia(r){return Ui(r)&&r.landmarks instanceof Gs&&r.unshiftedLandmarks instanceof Gs&&r.alignedRect instanceof Ht}function Bc(r,l){const{box:u}=r.detection,p=l.shiftBy(u.x,u.y),g=p.align(),{imageDims:f}=r.detection,I=new Ht(r.detection.score,g.rescale(f.reverse()),f),S={landmarks:p,unshiftedLandmarks:l,alignedRect:I};return Object.assign({},r,S)}class LE{constructor(r={}){const{drawLines:l=!0,drawPoints:u=!0,lineWidth:p,lineColor:g,pointSize:f,pointColor:I}=r;this.drawLines=l,this.drawPoints=u,this.lineWidth=p||1,this.pointSize=f||2,this.lineColor=g||"rgba(0, 255, 255, 1)",this.pointColor=I||"rgba(255, 0, 255, 1)"}}class SE{constructor(r,l={}){this.faceLandmarks=r,this.options=new LE(l)}draw(r){const l=Jn(r),{drawLines:u,drawPoints:p,lineWidth:g,lineColor:f,pointSize:I,pointColor:S}=this.options;if(u&&this.faceLandmarks instanceof iu&&(l.strokeStyle=f,l.lineWidth=g,cr(l,this.faceLandmarks.getJawOutline()),cr(l,this.faceLandmarks.getLeftEyeBrow()),cr(l,this.faceLandmarks.getRightEyeBrow()),cr(l,this.faceLandmarks.getNose()),cr(l,this.faceLandmarks.getLeftEye(),!0),cr(l,this.faceLandmarks.getRightEye(),!0),cr(l,this.faceLandmarks.getMouth(),!0)),p){l.strokeStyle=S,l.fillStyle=S;const x=v=>{l.beginPath(),l.arc(v.x,v.y,I,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function M9(r,l){const u=Array.isArray(l)?l:[l];u.forEach(p=>{const g=p instanceof Gs?p:ia(p)?p.landmarks:void 0;if(!g)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new SE(g).draw(r)})}const WI={};hm(WI,{AnchorPosition:()=>Bi,DrawBox:()=>TS,DrawBoxOptions:()=>NC,DrawFaceLandmarks:()=>SE,DrawFaceLandmarksOptions:()=>LE,DrawTextField:()=>fc,DrawTextFieldOptions:()=>ym,drawContour:()=>cr,drawDetections:()=>KX,drawFaceExpressions:()=>B9,drawFaceLandmarks:()=>M9});function P9(r,l){const u=kc(r,l),p=Fc(r,l);function g(I,S,x){const v=p(I,S,`${x}/separable_conv0`),O=p(S,S,`${x}/separable_conv1`),C=u(I,S,1,`${x}/expansion_conv`);return{separable_conv0:v,separable_conv1:O,expansion_conv:C}}function f(I,S){const x=p(I,I,`${S}/separable_conv0`),v=p(I,I,`${S}/separable_conv1`),O=p(I,I,`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:u,extractSeparableConvParams:p,extractReductionBlockParams:g,extractMainBlockParams:f}}function IE(r,l){const u=[],{extractWeights:p,getRemainingWeights:g}=zn(r),{extractConvParams:f,extractSeparableConvParams:I,extractReductionBlockParams:S,extractMainBlockParams:x}=P9(p,u),v=f(3,32,3,"entry_flow/conv_in"),O=S(32,64,"entry_flow/reduction_block_0"),C=S(64,128,"entry_flow/reduction_block_1"),U={conv_in:v,reduction_block_0:O,reduction_block_1:C},G={};Wi(l,0,1).forEach(ge=>{G[`main_block_${ge}`]=x(128,`middle_flow/main_block_${ge}`)});const ne=S(128,256,"exit_flow/reduction_block"),te=I(256,512,"exit_flow/separable_conv"),oe={reduction_block:ne,separable_conv:te};if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:u,params:{entry_flow:U,middle_flow:G,exit_flow:oe}}}function z9(r,l){const u=ms(r,l),p=Hf(u),g=_c(u);function f(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=p(`${S}/expansion_conv`);return{separable_conv0:x,separable_conv1:v,expansion_conv:O}}function I(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=g(`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}}function xE(r,l){const u=[],{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}=z9(r,u),S=p("entry_flow/conv_in"),x=f("entry_flow/reduction_block_0"),v=f("entry_flow/reduction_block_1"),O={conv_in:S,reduction_block_0:x,reduction_block_1:v},C={};Wi(l,0,1).forEach(te=>{C[`main_block_${te}`]=I(`middle_flow/main_block_${te}`)});const U=f("exit_flow/reduction_block"),G=g("exit_flow/separable_conv"),ne={reduction_block:U,separable_conv:G};return Pn(r,u),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:u}}const dn=Ke(Xe());function TE(r,l,u){return dn.add(dn.conv2d(r,l.filters,u,"same"),l.bias)}function $I(r,l,u=!0){let p=u?dn.relu(r):r;return p=Qn(p,l.separable_conv0,[1,1]),p=Qn(dn.relu(p),l.separable_conv1,[1,1]),p=dn.maxPool(p,[3,3],[2,2],"same"),p=dn.add(p,TE(r,l.expansion_conv,[2,2])),p}function G9(r,l){let u=Qn(dn.relu(r),l.separable_conv0,[1,1]);return u=Qn(dn.relu(u),l.separable_conv1,[1,1]),u=Qn(dn.relu(u),l.separable_conv2,[1,1]),u=dn.add(u,r),u}class AE extends En{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return dn.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(dn.scalar(256));let f=dn.relu(TE(g,l.entry_flow.conv_in,[2,2]));return f=$I(f,l.entry_flow.reduction_block_0,!1),f=$I(f,l.entry_flow.reduction_block_1),Wi(this._numMainBlocks,0,1).forEach(I=>{f=G9(f,l.middle_flow[`main_block_${I}`])}),f=$I(f,l.exit_flow.reduction_block),f=dn.relu(Qn(f,l.exit_flow.separable_conv,[1,1])),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return xE(r,this._numMainBlocks)}extractParams(r){return IE(r,this._numMainBlocks)}}function vE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),g=Vf(u,l),f=g(512,1,"fc/age"),I=g(512,2,"fc/gender");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{fc:{age:f,gender:I}}}}function NE(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:{age:p("fc/age"),gender:p("fc/gender")}};return Pn(r,l),{params:g,paramMappings:l}}var gr;(function(r){r.FEMALE="female",r.MALE="male"})(gr||(gr={}));const Vi=Ke(Xe());class UI extends En{constructor(r=new AE(2)){super("AgeGenderNet");this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return Vi.tidy(()=>{const u=r instanceof to?this.faceFeatureExtractor.forwardInput(r):r,p=Vi.avgPool(u,[7,7],[2,2],"valid").as2D(u.shape[0],-1),g=Tu(p,l.fc.age).as1D(),f=Tu(p,l.fc.gender);return{age:g,gender:f}})}forwardInput(r){return Vi.tidy(()=>{const{age:l,gender:u}=this.runNet(r);return{age:l,gender:Vi.softmax(u)}})}async forward(r){return this.forwardInput(await Rt(r))}async predictAgeAndGender(r){const l=await Rt(r),u=await this.forwardInput(l),p=Vi.unstack(u.age),g=Vi.unstack(u.gender),f=p.map((S,x)=>({ageTensor:S,genderTensor:g[x]})),I=await Promise.all(f.map(async({ageTensor:S,genderTensor:x})=>{const v=(await S.data())[0],O=(await x.data())[0],C=O>.5,U=C?gr.MALE:gr.FEMALE,G=C?O:1-O;return S.dispose(),x.dispose(),{age:v,gender:U,genderProbability:G}}));return u.age.dispose(),u.gender.dispose(),l.isBatchInput?I:I[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return vE(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Kf(r);return this.faceFeatureExtractor.loadFromWeightMap(l),NE(u)}extractParams(r){const l=512*1+1+(512*2+2),u=r.slice(0,r.length-l),p=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(u),this.extractClassifierParams(p)}}const fs=Ke(Xe());class Zf extends Xf{postProcess(r,l,u){const p=u.map(({width:f,height:I})=>{const S=l/Math.max(I,f);return{width:f*S,height:I*S}}),g=p.length;return fs.tidy(()=>{const f=(O,C)=>fs.stack([fs.fill([68],O),fs.fill([68],C)],1).as2D(1,136).as1D(),I=(O,C)=>{const{width:U,height:G}=p[O];return C(U,G)?Math.abs(U-G)/2:0},S=O=>I(O,(C,U)=>CI(O,(C,U)=>Uf(S(C),x(C))))).div(fs.stack(Array.from(Array(g),(O,C)=>f(p[C].width,p[C].height))));return v})}forwardInput(r){return fs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([u,p])=>({height:u,width:p})))})}async forward(r){return this.forwardInput(await Rt(r))}async detectLandmarks(r){const l=await Rt(r),u=fs.tidy(()=>fs.unstack(this.forwardInput(l))),p=await Promise.all(u.map(async(g,f)=>{const I=Array.from(await g.data()),S=I.filter((v,O)=>dm(O)),x=I.filter((v,O)=>!dm(O));return new iu(Array(68).fill(0).map((v,O)=>new Je(S[O],x[O])),{height:l.getInputHeight(f),width:l.getInputWidth(f)})}));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getClassifierChannelsOut(){return 136}}class Au extends Zf{constructor(r=new jf){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function CE(r){const l=[],{extractDenseBlock3Params:u}=qf(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2")};return Pn(r,l),{params:p,paramMappings:l}}function RE(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractDenseBlock3Params:g}=Yf(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S}}}const Mc=Ke(Xe());class OE extends En{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Mc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=di(u,p).div(Mc.scalar(255));let f=Pf(g,l.dense0,!0);return f=Pf(f,l.dense1),f=Pf(f,l.dense2),f=Mc.avgPool(f,[14,14],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return CE(r)}extractParams(r){return RE(r)}}class BI extends Zf{constructor(r=new OE){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class V9 extends Au{}const Qf=Ke(Xe());function EE(r,l){return Qf.add(Qf.mul(r,l.weights),l.biases)}const Pc=Ke(Xe());function MI(r,l,u,p,g="same"){const{filters:f,bias:I}=l.conv;let S=Pc.conv2d(r,f,u,g);return S=Pc.add(S,I),S=EE(S,l.scale),p?Pc.relu(S):S}function DE(r,l){return MI(r,l,[1,1],!0)}function PI(r,l){return MI(r,l,[1,1],!1)}function eg(r,l){return MI(r,l,[2,2],!0,"valid")}const gs=Ke(Xe());function Y9(r,l){function u(S,x,v){const O=r(S),C=O.length/(x*v*v);if(dS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${v}`);return gs.tidy(()=>gs.transpose(gs.tensor4d(O,[x,C,v,v]),[2,3,1,0]))}function p(S,x,v,O){const C=u(S,x,v),U=gs.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:U}}function g(S,x){const v=gs.tensor1d(r(S)),O=gs.tensor1d(r(S));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:v,biases:O}}function f(S,x,v,O){const C=p(S,x,v,`${O}/conv`),U=g(x,`${O}/scale`);return{conv:C,scale:U}}function I(S,x,v,O,C=!1){const U=f((C?.5:1)*S,x,v,`${O}/conv1`),G=f(S,x,v,`${O}/conv2`);return{conv1:U,conv2:G}}return{extractConvLayerParams:f,extractResidualLayerParams:I}}function kE(r){const{extractWeights:l,getRemainingWeights:u}=zn(r),p=[],{extractConvLayerParams:g,extractResidualLayerParams:f}=Y9(l,p),I=g(4704,32,7,"conv32_down"),S=f(9216,32,3,"conv32_1"),x=f(9216,32,3,"conv32_2"),v=f(9216,32,3,"conv32_3"),O=f(36864,64,3,"conv64_down",!0),C=f(36864,64,3,"conv64_1"),U=f(36864,64,3,"conv64_2"),G=f(36864,64,3,"conv64_3"),ne=f(147456,128,3,"conv128_down",!0),te=f(147456,128,3,"conv128_1"),oe=f(147456,128,3,"conv128_2"),ge=f(589824,256,3,"conv256_down",!0),fe=f(589824,256,3,"conv256_1"),Ae=f(589824,256,3,"conv256_2"),Te=f(589824,256,3,"conv256_down_out"),Ve=gs.tidy(()=>gs.transpose(gs.tensor2d(l(256*128),[128,256]),[1,0]));if(p.push({paramPath:"fc"}),u().length!==0)throw new Error(`weights remaing after extract: ${u().length}`);const rt={conv32_down:I,conv32_1:S,conv32_2:x,conv32_3:v,conv64_down:O,conv64_1:C,conv64_2:U,conv64_3:G,conv128_down:ne,conv128_1:te,conv128_2:oe,conv256_down:ge,conv256_1:fe,conv256_2:Ae,conv256_down_out:Te,fc:Ve};return{params:rt,paramMappings:p}}function H9(r,l){const u=ms(r,l);function p(I){const S=u(`${I}/scale/weights`,1),x=u(`${I}/scale/biases`,1);return{weights:S,biases:x}}function g(I){const S=u(`${I}/conv/filters`,4),x=u(`${I}/conv/bias`,1),v=p(I);return{conv:{filters:S,bias:x},scale:v}}function f(I){return{conv1:g(`${I}/conv1`),conv2:g(`${I}/conv2`)}}return{extractConvLayerParams:g,extractResidualLayerParams:f}}function FE(r){const l=[],{extractConvLayerParams:u,extractResidualLayerParams:p}=H9(r,l),g=u("conv32_down"),f=p("conv32_1"),I=p("conv32_2"),S=p("conv32_3"),x=p("conv64_down"),v=p("conv64_1"),O=p("conv64_2"),C=p("conv64_3"),U=p("conv128_down"),G=p("conv128_1"),ne=p("conv128_2"),te=p("conv256_down"),oe=p("conv256_1"),ge=p("conv256_2"),fe=p("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!uS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const Te={conv32_down:g,conv32_1:f,conv32_2:I,conv32_3:S,conv64_down:x,conv64_1:v,conv64_2:O,conv64_3:C,conv128_down:U,conv128_1:G,conv128_2:ne,conv256_down:te,conv256_1:oe,conv256_2:ge,conv256_down_out:fe,fc:Ae};return Pn(r,l),{params:Te,paramMappings:l}}const Gn=Ke(Xe());function fi(r,l){let u=DE(r,l.conv1);return u=PI(u,l.conv2),u=Gn.add(u,r),u=Gn.relu(u),u}function vu(r,l){let u=eg(r,l.conv1);u=PI(u,l.conv2);let p=Gn.avgPool(r,2,2,"valid");const g=Gn.zeros(p.shape),f=p.shape[3]!==u.shape[3],I=p.shape[1]!==u.shape[1]||p.shape[2]!==u.shape[2];if(I){const S=[...u.shape];S[1]=1;const x=Gn.zeros(S);u=Gn.concat([u,x],1);const v=[...u.shape];v[2]=1;const O=Gn.zeros(v);u=Gn.concat([u,O],2)}return p=f?Gn.concat([p,g],3):p,u=Gn.add(p,u),u=Gn.relu(u),u}const Ds=Ke(Xe());class Nu extends En{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return Ds.tidy(()=>{const u=Ds.cast(r.toBatchTensor(150,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(Ds.scalar(256));let f=eg(g,l.conv32_down);f=Ds.maxPool(f,3,2,"valid"),f=fi(f,l.conv32_1),f=fi(f,l.conv32_2),f=fi(f,l.conv32_3),f=vu(f,l.conv64_down),f=fi(f,l.conv64_1),f=fi(f,l.conv64_2),f=fi(f,l.conv64_3),f=vu(f,l.conv128_down),f=fi(f,l.conv128_1),f=fi(f,l.conv128_2),f=vu(f,l.conv256_down),f=fi(f,l.conv256_1),f=fi(f,l.conv256_2),f=vu(f,l.conv256_down_out);const I=f.mean([1,2]),S=Ds.matMul(I,l.fc);return S})}async forward(r){return this.forwardInput(await Rt(r))}async computeFaceDescriptor(r){const l=await Rt(r),u=Ds.tidy(()=>Ds.unstack(this.forwardInput(l))),p=await Promise.all(u.map(g=>g.data()));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return FE(r)}extractParams(r){return kE(r)}}function q9(r){const l=new Nu;return l.extractWeights(r),l}function tg(r,l){const u={descriptor:l};return Object.assign({},r,u)}function j9(r){return typeof r.age=="number"}function ng(r,l){const u={age:l};return Object.assign({},r,u)}function K9(r){return(r.gender===gr.MALE||r.gender===gr.FEMALE)&&pc(r.genderProbability)}function sg(r,l,u){const p={gender:l,genderProbability:u};return Object.assign({},r,p)}const gi=Ke(Xe());function X9(r,l){function u(x,v){const O=gi.tensor4d(r(3*3*x),[3,3,x,1]),C=gi.tensor1d(r(x)),U=gi.tensor1d(r(x)),G=gi.tensor1d(r(x)),ne=gi.tensor1d(r(x));return l.push({paramPath:`${v}/filters`},{paramPath:`${v}/batch_norm_scale`},{paramPath:`${v}/batch_norm_offset`},{paramPath:`${v}/batch_norm_mean`},{paramPath:`${v}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:U,batch_norm_mean:G,batch_norm_variance:ne}}function p(x,v,O,C,U){const G=gi.tensor4d(r(x*v*O*O),[O,O,x,v]),ne=gi.tensor1d(r(v));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${U?"batch_norm_offset":"bias"}`}),{filters:G,bias:ne}}function g(x,v,O,C){const{filters:U,bias:G}=p(x,v,O,C,!0);return{filters:U,batch_norm_offset:G}}function f(x,v,O){const C=u(x,`${O}/depthwise_conv`),U=g(x,v,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:U}}function I(){const x=g(3,32,3,"mobilenetv1/conv_0"),v=f(32,64,"mobilenetv1/conv_1"),O=f(64,128,"mobilenetv1/conv_2"),C=f(128,128,"mobilenetv1/conv_3"),U=f(128,256,"mobilenetv1/conv_4"),G=f(256,256,"mobilenetv1/conv_5"),ne=f(256,512,"mobilenetv1/conv_6"),te=f(512,512,"mobilenetv1/conv_7"),oe=f(512,512,"mobilenetv1/conv_8"),ge=f(512,512,"mobilenetv1/conv_9"),fe=f(512,512,"mobilenetv1/conv_10"),Ae=f(512,512,"mobilenetv1/conv_11"),Te=f(512,1024,"mobilenetv1/conv_12"),Ve=f(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,conv_8:oe,conv_9:ge,conv_10:fe,conv_11:Ae,conv_12:Te,conv_13:Ve}}function S(){const x=g(1024,256,1,"prediction_layer/conv_0"),v=g(256,512,3,"prediction_layer/conv_1"),O=g(512,128,1,"prediction_layer/conv_2"),C=g(128,256,3,"prediction_layer/conv_3"),U=g(256,128,1,"prediction_layer/conv_4"),G=g(128,256,3,"prediction_layer/conv_5"),ne=g(256,64,1,"prediction_layer/conv_6"),te=g(64,128,3,"prediction_layer/conv_7"),oe=p(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),ge=p(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),fe=p(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=p(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),Te=p(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Ve=p(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=p(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),vt=p(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),$t=p(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=p(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Dn=p(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),Tn=p(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),An={box_encoding_predictor:oe,class_predictor:ge},Ks={box_encoding_predictor:fe,class_predictor:Ae},Li={box_encoding_predictor:Te,class_predictor:Ve},Xs={box_encoding_predictor:rt,class_predictor:vt},la={box_encoding_predictor:$t,class_predictor:Kt},Xc={box_encoding_predictor:Dn,class_predictor:Tn};return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,box_predictor_0:An,box_predictor_1:Ks,box_predictor_2:Li,box_predictor_3:Xs,box_predictor_4:la,box_predictor_5:Xc}}return{extractMobilenetV1Params:I,extractPredictionLayerParams:S}}function _E(r){const l=[],{extractWeights:u,getRemainingWeights:p}=zn(r),{extractMobilenetV1Params:g,extractPredictionLayerParams:f}=X9(u,l),I=g(),S=f(),x=gi.tensor3d(u(5118*4),[1,5118,4]),v={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{params:{mobilenetv1:I,prediction_layer:S,output_layer:v},paramMappings:l}}function J9(r,l){const u=ms(r,l);function p(v,O,C){const U=u(`${v}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),G=u(`${v}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:U,batch_norm_offset:G}}function g(v){const O=`mobilenetv1/conv_${v}`,C=`MobilenetV1/Conv2d_${v}_depthwise`,U=`${O}/depthwise_conv`,G=`${O}/pointwise_conv`,ne=u(`${C}/depthwise_weights`,4,`${U}/filters`),te=u(`${C}/BatchNorm/gamma`,1,`${U}/batch_norm_scale`),oe=u(`${C}/BatchNorm/beta`,1,`${U}/batch_norm_offset`),ge=u(`${C}/BatchNorm/moving_mean`,1,`${U}/batch_norm_mean`),fe=u(`${C}/BatchNorm/moving_variance`,1,`${U}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:oe,batch_norm_mean:ge,batch_norm_variance:fe},pointwise_conv:p("MobilenetV1",v,G)}}function f(){return{conv_0:p("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:g(1),conv_2:g(2),conv_3:g(3),conv_4:g(4),conv_5:g(5),conv_6:g(6),conv_7:g(7),conv_8:g(8),conv_9:g(9),conv_10:g(10),conv_11:g(11),conv_12:g(12),conv_13:g(13)}}function I(v,O){const C=u(`${v}/weights`,4,`${O}/filters`),U=u(`${v}/biases`,1,`${O}/bias`);return{filters:C,bias:U}}function S(v){const O=I(`Prediction/BoxPredictor_${v}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${v}/box_encoding_predictor`),C=I(`Prediction/BoxPredictor_${v}/ClassPredictor`,`prediction_layer/box_predictor_${v}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:p("Prediction",0,"prediction_layer/conv_0"),conv_1:p("Prediction",1,"prediction_layer/conv_1"),conv_2:p("Prediction",2,"prediction_layer/conv_2"),conv_3:p("Prediction",3,"prediction_layer/conv_3"),conv_4:p("Prediction",4,"prediction_layer/conv_4"),conv_5:p("Prediction",5,"prediction_layer/conv_5"),conv_6:p("Prediction",6,"prediction_layer/conv_6"),conv_7:p("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:S(0),box_predictor_1:S(1),box_predictor_2:S(2),box_predictor_3:S(3),box_predictor_4:S(4),box_predictor_5:S(5)}}return{extractMobilenetV1Params:f,extractPredictionLayerParams:x}}function WE(r){const l=[],{extractMobilenetV1Params:u,extractPredictionLayerParams:p}=J9(r,l),g=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!lr(g))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${g}`);const f={mobilenetv1:u(),prediction_layer:p(),output_layer:{extra_dim:g}};return Pn(r,l),{params:f,paramMappings:l}}const so=Ke(Xe());function Hs(r,l,u){return so.tidy(()=>{let p=so.conv2d(r,l.filters,u,"same");return p=so.add(p,l.batch_norm_offset),so.clipByValue(p,0,6)})}const yr=Ke(Xe()),Z9=.0010000000474974513;function Q9(r,l,u){return yr.tidy(()=>{let p=yr.depthwiseConv2d(r,l.filters,u,"same");return p=yr.batchNorm(p,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,Z9),yr.clipByValue(p,0,6)})}function eZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function $E(r,l){return yr.tidy(()=>{let u,p=Hs(r,l.conv_0,[2,2]);const g=[l.conv_1,l.conv_2,l.conv_3,l.conv_4,l.conv_5,l.conv_6,l.conv_7,l.conv_8,l.conv_9,l.conv_10,l.conv_11,l.conv_12,l.conv_13];if(g.forEach((f,I)=>{const S=I+1,x=eZ(S);p=Q9(p,f.depthwise_conv,x),p=Hs(p,f.pointwise_conv,[1,1]),S===11&&(u=p)}),u===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:p,conv11:u}})}function UE(r,l,u,p,g){const f=r.shape[0],I=Math.min(u,f),S=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>g).sort((O,C)=>C.score-O.score),x=O=>O<=p?1:0,v=[];return S.forEach(O=>{if(v.length>=I)return;const C=O.score;for(let U=v.length-1;U>=0;--U){const G=tZ(r,O.boxIndex,v[U]);if(G===0)continue;if(O.score*=x(G),O.score<=g)break}C===O.score&&v.push(O.boxIndex)}),v}function tZ(r,l,u){const p=r.arraySync(),g=Math.min(p[l][0],p[l][2]),f=Math.min(p[l][1],p[l][3]),I=Math.max(p[l][0],p[l][2]),S=Math.max(p[l][1],p[l][3]),x=Math.min(p[u][0],p[u][2]),v=Math.min(p[u][1],p[u][3]),O=Math.max(p[u][0],p[u][2]),C=Math.max(p[u][1],p[u][3]),U=(I-g)*(S-f),G=(O-x)*(C-v);if(U<=0||G<=0)return 0;const ne=Math.max(g,x),te=Math.max(f,v),oe=Math.min(I,O),ge=Math.min(S,C),fe=Math.max(oe-ne,0)*Math.max(ge-te,0);return fe/(U+G-fe)}const De=Ke(Xe());function nZ(r){const l=De.unstack(De.transpose(r,[1,0])),u=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],p=[De.add(l[0],De.div(u[0],De.scalar(2))),De.add(l[1],De.div(u[1],De.scalar(2)))];return{sizes:u,centers:p}}function sZ(r,l){const{sizes:u,centers:p}=nZ(r),g=De.unstack(De.transpose(l,[1,0])),f=De.div(De.mul(De.exp(De.div(g[2],De.scalar(5))),u[0]),De.scalar(2)),I=De.add(De.mul(De.div(g[0],De.scalar(10)),u[0]),p[0]),S=De.div(De.mul(De.exp(De.div(g[3],De.scalar(5))),u[1]),De.scalar(2)),x=De.add(De.mul(De.div(g[1],De.scalar(10)),u[1]),p[1]);return De.transpose(De.stack([De.sub(I,f),De.sub(x,S),De.add(I,f),De.add(x,S)]),[1,0])}function BE(r,l,u){return De.tidy(()=>{const p=r.shape[0];let g=sZ(De.reshape(De.tile(u.extra_dim,[p,1,1]),[-1,4]),De.reshape(r,[-1,4]));g=De.reshape(g,[p,g.shape[0]/p,4]);const f=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let I=De.slice(f,[0,0,0],[-1,-1,1]);I=De.reshape(I,[p,I.shape[1]]);const S=De.unstack(g),x=De.unstack(I);return{boxes:S,scores:x}})}const Cu=Ke(Xe());function ra(r,l){return Cu.tidy(()=>{const u=r.shape[0],p=Cu.reshape(na(r,l.box_encoding_predictor),[u,-1,1,4]),g=Cu.reshape(na(r,l.class_predictor),[u,-1,3]);return{boxPredictionEncoding:p,classPrediction:g}})}const Ru=Ke(Xe());function ME(r,l,u){return Ru.tidy(()=>{const p=Hs(r,u.conv_0,[1,1]),g=Hs(p,u.conv_1,[2,2]),f=Hs(g,u.conv_2,[1,1]),I=Hs(f,u.conv_3,[2,2]),S=Hs(I,u.conv_4,[1,1]),x=Hs(S,u.conv_5,[2,2]),v=Hs(x,u.conv_6,[1,1]),O=Hs(v,u.conv_7,[2,2]),C=ra(l,u.box_predictor_0),U=ra(r,u.box_predictor_1),G=ra(g,u.box_predictor_2),ne=ra(I,u.box_predictor_3),te=ra(x,u.box_predictor_4),oe=ra(O,u.box_predictor_5),ge=Ru.concat([C.boxPredictionEncoding,U.boxPredictionEncoding,G.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,oe.boxPredictionEncoding],1),fe=Ru.concat([C.classPrediction,U.classPrediction,G.classPrediction,ne.classPrediction,te.classPrediction,oe.classPrediction],1);return{boxPredictions:ge,classPredictions:fe}})}class yi{constructor({minConfidence:r,maxResults:l}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=r||.5,this._maxResults=l||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}}const bi=Ke(Xe());class zc extends En{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return bi.tidy(()=>{const u=bi.cast(r.toBatchTensor(512,!1),"float32"),p=bi.sub(bi.mul(u,bi.scalar(.007843137718737125)),bi.scalar(1)),g=$E(p,l.mobilenetv1),{boxPredictions:f,classPredictions:I}=ME(g.out,g.conv11,l.prediction_layer);return BE(f,I,l.output_layer)})}async forward(r){return this.forwardInput(await Rt(r))}async locateFaces(r,l={}){const{maxResults:u,minConfidence:p}=new yi(l),g=await Rt(r),{boxes:f,scores:I}=this.forwardInput(g),S=f[0],x=I[0];for(let fe=1;fe{const[Ae,Te]=[Math.max(0,oe[fe][0]),Math.min(1,oe[fe][2])].map(vt=>vt*te),[Ve,rt]=[Math.max(0,oe[fe][1]),Math.min(1,oe[fe][3])].map(vt=>vt*ne);return new Ht(v[fe],new su(Ve,Ae,rt-Ve,Te-Ae),{height:g.getInputHeight(0),width:g.getInputWidth(0)})});return S.dispose(),x.dispose(),ge}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return WE(r)}extractParams(r){return _E(r)}}function PE(r){const l=new zc;return l.extractWeights(r),l}function iZ(r){return PE(r)}class rZ extends zc{}const zE=.4,GE=[new Je(.738768,.874946),new Je(2.42204,2.65704),new Je(4.30971,7.04493),new Je(10.246,4.59428),new Je(12.6868,11.8741)],VE=[new Je(1.603231,2.094468),new Je(6.041143,7.080126),new Je(2.882459,3.518061),new Je(4.266906,5.178857),new Je(9.041765,10.66308)],YE=[117.001,114.697,97.404],HE="tiny_yolov2_model",qE="tiny_yolov2_separable_conv_model";const ig=r=>typeof r=="number";function zI(r){if(!r)throw new Error(`invalid config: ${r}`);if(typeof r.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${r.withSeparableConvs}`);if(!ig(r.iouThreshold)||r.iouThreshold<0||r.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${r.iouThreshold}`);if(!Array.isArray(r.classes)||!r.classes.length||!r.classes.every(l=>typeof l=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(r.classes)}`);if(!Array.isArray(r.anchors)||!r.anchors.length||!r.anchors.map(l=>l||{}).every(l=>ig(l.x)&&ig(l.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(r.anchors)}`);if(r.meanRgb&&(!Array.isArray(r.meanRgb)||r.meanRgb.length!==3||!r.meanRgb.every(ig)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const qs=Ke(Xe());function Gc(r){return qs.tidy(()=>{const l=qs.mul(r,qs.scalar(.10000000149011612));return qs.add(qs.relu(qs.sub(r,l)),l)})}const js=Ke(Xe());function br(r,l){return js.tidy(()=>{let u=js.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=js.conv2d(u,l.conv.filters,[1,1],"valid"),u=js.sub(u,l.bn.sub),u=js.mul(u,l.bn.truediv),u=js.add(u,l.conv.bias),Gc(u)})}const io=Ke(Xe());function wr(r,l){return io.tidy(()=>{let u=io.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=io.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=io.add(u,l.bias),Gc(u)})}const GI=Ke(Xe());function oZ(r,l){const u=kc(r,l);function p(I,S){const x=GI.tensor1d(r(I)),v=GI.tensor1d(r(I));return l.push({paramPath:`${S}/sub`},{paramPath:`${S}/truediv`}),{sub:x,truediv:v}}function g(I,S,x){const v=u(I,S,3,`${x}/conv`),O=p(S,`${x}/bn`);return{conv:v,bn:O}}const f=Fc(r,l);return{extractConvParams:u,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}}function jE(r,l,u,p){const{extractWeights:g,getRemainingWeights:f}=zn(r),I=[],{extractConvParams:S,extractConvWithBatchNormParams:x,extractSeparableConvParams:v}=oZ(g,I);let O;if(l.withSeparableConvs){const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=l.isFirstLayerConv2d?S(C,U,3,"conv0"):v(C,U,"conv0"),Ve=v(U,G,"conv1"),rt=v(G,ne,"conv2"),vt=v(ne,te,"conv3"),$t=v(te,oe,"conv4"),Kt=v(oe,ge,"conv5"),Dn=fe?v(ge,fe,"conv6"):void 0,Tn=Ae?v(fe,Ae,"conv7"):void 0,An=S(Ae||fe||ge,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:vt,conv4:$t,conv5:Kt,conv6:Dn,conv7:Tn,conv8:An}}else{const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=x(C,U,"conv0"),Ve=x(U,G,"conv1"),rt=x(G,ne,"conv2"),vt=x(ne,te,"conv3"),$t=x(te,oe,"conv4"),Kt=x(oe,ge,"conv5"),Dn=x(ge,fe,"conv6"),Tn=x(fe,Ae,"conv7"),An=S(Ae,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:vt,conv4:$t,conv5:Kt,conv6:Dn,conv7:Tn,conv8:An}}if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{params:O,paramMappings:I}}function aZ(r,l){const u=ms(r,l);function p(S){const x=u(`${S}/sub`,1),v=u(`${S}/truediv`,1);return{sub:x,truediv:v}}function g(S){const x=u(`${S}/filters`,4),v=u(`${S}/bias`,1);return{filters:x,bias:v}}function f(S){const x=g(`${S}/conv`),v=p(`${S}/bn`);return{conv:x,bn:v}}const I=_c(u);return{extractConvParams:g,extractConvWithBatchNormParams:f,extractSeparableConvParams:I}}function KE(r,l){const u=[],{extractConvParams:p,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}=aZ(r,u);let I;if(l.withSeparableConvs){const S=l.filterSizes&&l.filterSizes.length||9;I={conv0:l.isFirstLayerConv2d?p("conv0"):f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:S>7?f("conv6"):void 0,conv7:S>8?f("conv7"):void 0,conv8:p("conv8")}}else I={conv0:g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:g("conv6"),conv7:g("conv7"),conv8:p("conv8")};return Pn(r,u),{params:I,paramMappings:u}}var VI;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(VI||(VI={}));class Lr{constructor({inputSize:r,scoreThreshold:l}={}){this._name="TinyYolov2Options";if(this._inputSize=r||416,this._scoreThreshold=l||.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}}const kt=Ke(Xe());class Vc extends En{constructor(r){super("TinyYolov2");zI(r),this._config=r}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(r,l){let u=br(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=br(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=br(u,l.conv6),u=br(u,l.conv7),na(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Gc(na(r,l.conv0,"valid",!1)):wr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=wr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=l.conv6?wr(u,l.conv6):u,u=l.conv7?wr(u,l.conv7):u,na(u,l.conv8,"valid",!1)}forwardInput(r,l){const{params:u}=this;if(!u)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let p=kt.cast(r.toBatchTensor(l,!1),"float32");return p=this.config.meanRgb?di(p,this.config.meanRgb):p,p=p.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(p,u):this.runTinyYolov2(p,u)})}async forward(r,l){return await this.forwardInput(await Rt(r),l)}async detect(r,l={}){const{inputSize:u,scoreThreshold:p}=new Lr(l),g=await Rt(r),f=await this.forwardInput(g,u),I=kt.tidy(()=>kt.unstack(f)[0].expandDims()),S={width:g.getInputWidth(0),height:g.getInputHeight(0)},x=await this.extractBoxes(I,g.getReshapedInputDimensions(0),p);f.dispose(),I.dispose();const v=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),U=x.map(te=>this.config.classes[te.label]),G=gS(v.map(te=>te.rescale(u)),O,this.config.iouThreshold,!0),ne=G.map(te=>new mc(O[te],C[te],U[te],v[te],S));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return KE(r,this.config)}extractParams(r){const l=this.config.filterSizes||Vc.DEFAULT_FILTER_SIZES,u=l?l.length:void 0;if(u!==7&&u!==8&&u!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${u} filterSizes in config`);return jE(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,u){const{width:p,height:g}=l,f=Math.max(p,g),I=f/p,S=f/g,x=r.shape[1],v=this.config.anchors.length,[O,C,U]=kt.tidy(()=>{const oe=r.reshape([x,x,v,this.boxEncodingSize]),ge=oe.slice([0,0,0,0],[x,x,v,4]),fe=oe.slice([0,0,0,4],[x,x,v,1]),Ae=this.withClassScores?kt.softmax(oe.slice([0,0,0,5],[x,x,v,this.config.classes.length]),3):kt.scalar(0);return[ge,fe,Ae]}),G=[],ne=await C.array(),te=await O.array();for(let oe=0;oeu){const Te=(ge+nu(te[oe][ge][fe][0]))/x*I,Ve=(oe+nu(te[oe][ge][fe][1]))/x*S,rt=Math.exp(te[oe][ge][fe][2])*this.config.anchors[fe].x/x*I,vt=Math.exp(te[oe][ge][fe][3])*this.config.anchors[fe].y/x*S,$t=Te-rt/2,Kt=Ve-vt/2,Dn={row:oe,col:ge,anchor:fe},{classScore:Tn,label:An}=this.withClassScores?await this.extractPredictedClass(U,Dn):{classScore:1,label:0};G.push({box:new tu($t,Kt,$t+rt,Kt+vt),score:Ae,classScore:Ae*Tn,label:An,...Dn})}}return O.dispose(),C.dispose(),U.dispose(),G}async extractPredictedClass(r,l){const{row:u,col:p,anchor:g}=l,f=await r.array();return Array(this.config.classes.length).fill(0).map((I,S)=>f[u][p][g][S]).map((I,S)=>({classScore:I,label:S})).reduce((I,S)=>I.classScore>S.classScore?I:S)}}Vc.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class Ou extends Vc{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:zE,classes:["face"]},r?{anchors:VE,meanRgb:YE}:{anchors:GE,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Ht(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?qE:HE}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function cZ(r,l=!0){const u=new Ou(l);return u.extractWeights(r),u}class YI extends Lr{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class wi{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const HI=Ke(Xe());async function oa(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>ia(x)?g(x):x.detection),I=p||(l instanceof HI.Tensor?await Ec(l,f):await Oc(l,f)),S=await u(I);return I.forEach(x=>x instanceof HI.Tensor&&x.dispose()),S}async function Yc(r,l,u,p,g){return oa([r],l,async f=>u(f[0]),p,g)}const XE=.4,JE=[new Je(1.603231,2.094468),new Je(6.041143,7.080126),new Je(2.882459,3.518061),new Je(4.266906,5.178857),new Je(9.041765,10.66308)],ZE=[117.001,114.697,97.404];class Eu extends Vc{constructor(){const r={withSeparableConvs:!0,iouThreshold:XE,classes:["face"],anchors:JE,meanRgb:ZE,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Ht(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const pt={ssdMobilenetv1:new zc,tinyFaceDetector:new Eu,tinyYolov2:new Ou,faceLandmark68Net:new Au,faceLandmark68TinyNet:new BI,faceRecognitionNet:new Nu,faceExpressionNet:new FI,ageGenderNet:new UI},QE=(r,l)=>pt.ssdMobilenetv1.locateFaces(r,l),lZ=(r,l)=>pt.tinyFaceDetector.locateFaces(r,l),hZ=(r,l)=>pt.tinyYolov2.locateFaces(r,l),eD=r=>pt.faceLandmark68Net.detectLandmarks(r),uZ=r=>pt.faceLandmark68TinyNet.detectLandmarks(r),dZ=r=>pt.faceRecognitionNet.computeFaceDescriptor(r),pZ=r=>pt.faceExpressionNet.predictExpressions(r),mZ=r=>pt.ageGenderNet.predictAgeAndGender(r),tD=r=>pt.ssdMobilenetv1.load(r),fZ=r=>pt.tinyFaceDetector.load(r),gZ=r=>pt.tinyYolov2.load(r),yZ=r=>pt.faceLandmark68Net.load(r),bZ=r=>pt.faceLandmark68TinyNet.load(r),wZ=r=>pt.faceRecognitionNet.load(r),LZ=r=>pt.faceExpressionNet.load(r),SZ=r=>pt.ageGenderNet.load(r),IZ=tD,xZ=QE,TZ=eD;class nD extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Fu extends nD{async run(){const r=await this.parentTask,l=await oa(r,this.input,async u=>await Promise.all(u.map(p=>pt.faceExpressionNet.predictExpressions(p))),this.extractedFaces);return r.map((u,p)=>Jf(u,l[p]))}withAgeAndGender(){return new Du(this,this.input)}}class _u extends nD{async run(){const r=await this.parentTask;if(!r)return;const l=await Yc(r,this.input,u=>pt.faceExpressionNet.predictExpressions(u),this.extractedFaces);return Jf(r,l)}withAgeAndGender(){return new ku(this,this.input)}}class jc extends Fu{withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class Kc extends _u{withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class sD extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Du extends sD{async run(){const r=await this.parentTask,l=await oa(r,this.input,async u=>await Promise.all(u.map(p=>pt.ageGenderNet.predictAgeAndGender(p))),this.extractedFaces);return r.map((u,p)=>{const{age:g,gender:f,genderProbability:I}=l[p];return ng(sg(u,f,I),g)})}withFaceExpressions(){return new Fu(this,this.input)}}class ku extends sD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:u,genderProbability:p}=await Yc(r,this.input,g=>pt.ageGenderNet.predictAgeAndGender(g),this.extractedFaces);return ng(sg(r,u,p),l)}withFaceExpressions(){return new _u(this,this.input)}}class Hc extends Du{withFaceExpressions(){return new jc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class qc extends ku{withFaceExpressions(){return new Kc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class qI extends wi{constructor(r,l){super();this.parentTask=r;this.input=l}}class aa extends qI{async run(){const r=await this.parentTask,l=await oa(r,this.input,u=>Promise.all(u.map(p=>pt.faceRecognitionNet.computeFaceDescriptor(p))),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return l.map((u,p)=>tg(r[p],u))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}}class ca extends qI{async run(){const r=await this.parentTask;if(!r)return;const l=await Yc(r,this.input,u=>pt.faceRecognitionNet.computeFaceDescriptor(u),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return tg(r,l)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}}const Wu=Ke(Xe());class jI extends wi{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=u}get landmarkNet(){return this.useTinyLandmarkNet?pt.faceLandmark68TinyNet:pt.faceLandmark68Net}}class KI extends jI{async run(){const r=await this.parentTask,l=r.map(g=>g.detection),u=this.input instanceof Wu.Tensor?await Ec(this.input,l):await Oc(this.input,l),p=await Promise.all(u.map(g=>this.landmarkNet.detectLandmarks(g)));return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),r.map((g,f)=>Bc(g,p[f]))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new aa(this,this.input)}}class XI extends jI{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,u=this.input instanceof Wu.Tensor?await Ec(this.input,[l]):await Oc(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),Bc(r,p)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ca(this,this.input)}}class JI extends wi{constructor(r,l=new yi){super();this.input=r;this.options=l}}class rg extends JI{async run(){const{input:r,options:l}=this,u=l instanceof YI?p=>pt.tinyFaceDetector.locateFaces(p,l):l instanceof yi?p=>pt.ssdMobilenetv1.locateFaces(p,l):l instanceof Lr?p=>pt.tinyYolov2.locateFaces(p,l):null;if(!u)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return u(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(u=>Go({},u)))})}withFaceLandmarks(r=!1){return new KI(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Fu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Du(this.runAndExtendWithFaceDetections(),this.input)}}class ZI extends JI{async run(){const r=await new rg(this.input,this.options);let l=r[0];return r.forEach(u=>{u.score>l.score&&(l=u)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?Go({},l):void 0)})}withFaceLandmarks(r=!1){return new XI(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new _u(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ku(this.runAndExtendWithFaceDetection(),this.input)}}function AZ(r,l=new yi){return new ZI(r,l)}function og(r,l=new yi){return new rg(r,l)}async function iD(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await og(r,new yi(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function vZ(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await og(r,new Lr(l)).withFaceLandmarks().withFaceDescriptors()}const NZ=iD;function QI(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const u=Array.from(r),p=Array.from(l);return Math.sqrt(u.map((g,f)=>g-p[f]).reduce((g,f)=>g+Math.pow(f,2),0))}class rD{constructor(r,l=.6){this._distanceThreshold=l;const u=Array.isArray(r)?r:[r];if(!u.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let p=1;const g=()=>`person ${p++}`;this._labeledDescriptors=u.map(f=>{if(f instanceof zo)return f;if(f instanceof Float32Array)return new zo(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new zo(g(),[f.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(r,l){return l.map(u=>QI(u,r)).reduce((u,p)=>u+p,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:u})=>new mm(u,this.computeMeanDistance(r,l))).reduce((l,u)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(u=>zo.fromJSON(u));return new rD(l,r.distanceThreshold)}}function CZ(r){const l=new Eu;return l.extractWeights(r),l}function oD(r,l){const{width:u,height:p}=new us(l.width,l.height);if(u<=0||p<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:u,height:p})}`);if(Array.isArray(r))return r.map(g=>oD(g,{width:u,height:p}));if(ia(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Bc(Go(r,g),f)}return Ui(r)?Go(r,r.detection.forSize(u,p)):r instanceof Gs||r instanceof Ht?r.forSize(u,p):r}var aD="0.7.3";const RZ=Ke(Xe()),OZ=typeof process!="undefined",EZ=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",DZ={faceapi:aD,node:OZ,browser:EZ};export{UI as AgeGenderNet,tu as BoundingBox,Ct as Box,wi as ComposableTask,aa as ComputeAllFaceDescriptorsTask,qI as ComputeFaceDescriptorsTaskBase,ca as ComputeSingleFaceDescriptorTask,KI as DetectAllFaceLandmarksTask,rg as DetectAllFacesTask,jI as DetectFaceLandmarksTaskBase,JI as DetectFacesTaskBase,XI as DetectSingleFaceLandmarksTask,ZI as DetectSingleFaceTask,us as Dimensions,kI as FACE_EXPRESSION_LABELS,Ht as FaceDetection,rZ as FaceDetectionNet,FI as FaceExpressionNet,sa as FaceExpressions,Au as FaceLandmark68Net,BI as FaceLandmark68TinyNet,V9 as FaceLandmarkNet,Gs as FaceLandmarks,YX as FaceLandmarks5,iu as FaceLandmarks68,mm as FaceMatch,rD as FaceMatcher,Nu as FaceRecognitionNet,gr as Gender,fm as LabeledBox,zo as LabeledFaceDescriptors,to as NetInput,En as NeuralNetwork,mc as ObjectDetection,Je as Point,HX as PredictedBox,su as Rect,zc as SsdMobilenetv1,yi as SsdMobilenetv1Options,Eu as TinyFaceDetector,YI as TinyFaceDetectorOptions,Ou as TinyYolov2,Lr as TinyYolov2Options,VI as TinyYolov2SizeType,NZ as allFaces,iD as allFacesSsdMobilenetv1,vZ as allFacesTinyYolov2,AS as awaitMediaLoaded,vS as bufferToImage,dZ as computeFaceDescriptor,gc as createCanvas,ou as createCanvasFromMedia,iZ as createFaceDetectionNet,q9 as createFaceRecognitionNet,PE as createSsdMobilenetv1,CZ as createTinyFaceDetector,cZ as createTinyYolov2,og as detectAllFaces,eD as detectFaceLandmarks,uZ as detectFaceLandmarksTiny,TZ as detectLandmarks,AZ as detectSingleFace,WI as draw,gt as env,QI as euclideanDistance,ng as extendWithAge,tg as extendWithFaceDescriptor,Go as extendWithFaceDetection,Jf as extendWithFaceExpressions,Bc as extendWithFaceLandmarks,sg as extendWithGender,Ec as extractFaceTensors,Oc as extractFaces,W9 as fetchImage,OI as fetchJson,$9 as fetchNetWeights,ta as fetchOrThrow,Jn as getContext2dOrThrow,Yo as getMediaDimensions,NS as imageTensorToCanvas,RI as imageToSquare,PX as inverseSigmoid,mS as iou,wm as isMediaElement,ru as isMediaLoaded,j9 as isWithAge,Ui as isWithFaceDetection,_I as isWithFaceExpressions,ia as isWithFaceLandmarks,K9 as isWithGender,SZ as loadAgeGenderModel,IZ as loadFaceDetectionModel,LZ as loadFaceExpressionModel,yZ as loadFaceLandmarkModel,bZ as loadFaceLandmarkTinyModel,wZ as loadFaceRecognitionModel,tD as loadSsdMobilenetv1Model,fZ as loadTinyFaceDetectorModel,gZ as loadTinyYolov2Model,EI as loadWeightMap,xZ as locateFaces,U9 as matchDimensions,fS as minBbox,pt as nets,gS as nonMaxSuppression,di as normalize,yS as padToSquare,mZ as predictAgeAndGender,pZ as recognizeFaceExpressions,oD as resizeResults,Vo as resolveInput,MX as shuffleArray,nu as sigmoid,QE as ssdMobilenetv1,RZ as tf,lZ as tinyFaceDetector,hZ as tinyYolov2,Rt as toNetInput,hS as utils,zI as validateConfig,DZ as version}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.js b/dist/face-api.js index 231625d..126c79b 100644 --- a/dist/face-api.js +++ b/dist/face-api.js @@ -3819,7 +3819,7 @@ return a / b;`,LX=` `)}function Y7(r,l,u,p){const g=qt(l),f=p[p.length-1],I=new Array(f).fill(0),S=l.length,x=u==="complex64"?vu(r):r;if(S>1)for(let v=0;voO){const oe=Tu*I;let ge=Array.from(r.slice(0,oe)),fe=Array.from(r.slice((S-Tu)*I,S*I));return u==="complex64"&&(ge=vu(ge),fe=vu(fe)),["["+ge.map((Ae,Te)=>Au(Ae,g[Te],u)).join(", ")+", ..., "+fe.map((Ae,Te)=>Au(Ae,g[S-Tu+Te],u)).join(", ")+"]"]}const te=u==="complex64"?vu(r):Array.from(r);return["["+te.map((oe,ge)=>Au(oe,g[ge],u)).join(", ")+"]"]}const v=l.slice(1),O=p.slice(1),C=p[0]*I,U=[];if(S>oO){for(let te=0;te`Length of values '${p}' does not match the size inferred by the shape '${this.size}'.`)}if(l==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=u||JR(l,this.size),this.strides=xu(r)}set(r,...l){l.length===0&&(l=[0]),Z(l.length===this.rank,()=>`The number of provided coordinates (${l.length}) must match the rank (${this.rank})`);const u=this.locToIndex(l);this.values[u]=r}get(...r){r.length===0&&(r=[0]);let l=0;for(const p of r){if(p<0||p>=this.shape[l]){const g=`Requested out of range element at ${r}. Buffer shape=${this.shape}`;throw new Error(g)}l++}let u=r[r.length-1];for(let p=0;phI(u))}catch(u){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return r}dataSync(){this.throwIfDisposed();const r=zi().readSync(this.dataId);if(this.dtype==="string")try{return r.map(l=>hI(l))}catch(l){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return r}async bytes(){this.throwIfDisposed();const r=await zi().read(this.dataId);return this.dtype==="string"?r:new Uint8Array(r.buffer)}dispose(){if(this.isDisposed)return;zi().disposeTensor(this),this.isDisposedInternal=!0}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(r=!1){return Wc.print(this,r)}clone(){return this.throwIfDisposed(),Wc.clone(this)}toString(r=!1){const l=this.dataSync();return aO(l,this.shape,this.dtype,r)}cast(r){return this.throwIfDisposed(),Wc.cast(this,r)}variable(r=!0,l,u){return this.throwIfDisposed(),zi().makeVariable(this,r,l,u)}}Object.defineProperty(xn,Symbol.hasInstance,{value:r=>!!r&&r.data!=null&&r.dataSync!=null&&r.throwIfDisposed!=null});class ng extends xn{constructor(r,l,u,p){super(r.shape,r.dtype,r.dataId,p);this.trainable=l,this.name=u}assign(r){if(r.dtype!==this.dtype)throw new Error(`dtype of the new value (${r.dtype}) and previous value (${this.dtype}) must match`);if(!sa(r.shape,this.shape))throw new Error(`shape of the new value (${r.shape}) and previous value (${this.shape}) must match`);zi().disposeTensor(this),this.dataId=r.dataId,zi().incRef(this,null)}dispose(){zi().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(ng,Symbol.hasInstance,{value:r=>r instanceof xn&&r.assign!=null&&r.assign instanceof Function});var pO;(function(r){r.R0="R0",r.R1="R1",r.R2="R2",r.R3="R3",r.R4="R4",r.R5="R5",r.R6="R6"})(pO||(pO={}));var dI;(function(r){r.float32="float32",r.int32="int32",r.bool="int32",r.complex64="complex64"})(dI||(dI={}));var pI;(function(r){r.float32="float32",r.int32="int32",r.bool="bool",r.complex64="complex64"})(pI||(pI={}));var mI;(function(r){r.float32="float32",r.int32="float32",r.bool="float32",r.complex64="complex64"})(mI||(mI={}));var fI;(function(r){r.float32="complex64",r.int32="complex64",r.bool="complex64",r.complex64="complex64"})(fI||(fI={}));const q7={float32:mI,int32:dI,bool:pI,complex64:fI};function mO(r,l){if(r==="string"||l==="string"){if(r==="string"&&l==="string")return"string";throw new Error(`Can not upcast ${r} with ${l}`)}return q7[r][l]}function ft(r,l){if(r.dtype===l.dtype)return[r,l];const u=mO(r.dtype,l.dtype);return[r.cast(u),l.cast(u)]}function sg(r){const l=[],u=new Set;return fO(r,l,u),l}function fO(r,l,u){if(r==null)return;if(r instanceof xn){l.push(r);return}if(!j7(r))return;const p=r;for(const g in p){const f=p[g];u.has(f)||(u.add(f),fO(f,l,u))}}function j7(r){return Array.isArray(r)||typeof r=="object"}class gO{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null}}dispose(){for(const r in this.registeredVariables)this.registeredVariables[r].dispose()}}class Nu{constructor(r){this.ENV=r,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new gO}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;const r=this.getSortedBackends();for(let l=0;l{l.setupFunc!=null&&l.setupFunc(this.backendInstance)})}disposeRegisteredKernels(r){const l=oI(r);l.forEach(u=>{u.disposeFunc!=null&&u.disposeFunc(this.registry[r])})}initializeBackend(r){const l=this.registryFactory[r];if(l==null)throw new Error(`Cannot initialize backend ${r}, no registration found.`);try{const u=l.factory();if(u&&!(u instanceof w2)&&typeof u.then=="function"){const p=++this.pendingBackendInitId,g=u.then(f=>p(pthis.registryFactory[l].priority-this.registryFactory[r].priority)}initializeBackendsAndReturnBest(){const r=this.getSortedBackends();for(let l=0;lthis.startScope(u),()=>this.endScope(p),()=>(p=l(),p instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),p))}scopedRun(r,l,u){r();try{const p=u();return l(),p}catch(p){throw l(),p}}nextTensorId(){return Nu.nextTensorId++}nextVariableId(){return Nu.nextVariableId++}clone(r){const l=this.makeTensorFromDataId(r.dataId,r.shape,r.dtype),u={x:r},p=f=>({x:()=>{const I="float32",S={x:f},x={dtype:I};return Y.runKernelFunc(v=>v.cast(f,I),S,null,Dc,x)}}),g=[];return this.addTapeNode(this.state.activeScope.name,u,[l],p,g,{}),l}runKernel(r,l,u,p,g){const f=null,I=null;return this.runKernelFunc(f,l,I,r,u,p,g)}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(r,l,u){const p=this.backend.numDataIds();let g=0;u.forEach(S=>{g+=S.dtype==="complex64"?3:1});const f=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],I=p-l-g-f;if(I>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${I} data ids) after running '${r}'`)}runKernelFunc(r,l,u,p,g,f,I){let S,x=[];const v=this.isTapeOn();p==null&&(p=this.state.activeScope!=null?this.state.activeScope.name:"");const O=this.state.numBytes,C=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let U;const G=Jf(p,this.backendName);let ne;if(G!=null)U=()=>{const oe=this.backend.numDataIds();ne=G.kernelFunc({inputs:l,attrs:g,backend:this.backend});const ge=Array.isArray(ne)?ne:[ne];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,oe,ge);const fe=ge.map(({dataId:Ae,shape:Te,dtype:Ve})=>this.makeTensorFromDataId(Ae,Te,Ve));if(v){let Ae=this.getTensorsForGradient(p,l,fe);if(Ae==null){I==null&&(I=[]);const Te=fe.filter((Ve,rt)=>I[rt]);Ae=(f||[]).slice().concat(Te)}x=this.saveTensorsForBackwardMode(Ae)}return fe};else{const oe=ge=>{if(!v)return;x=ge.map(fe=>this.keep(this.clone(fe)))};U=()=>{const ge=this.backend.numDataIds();ne=this.tidy(()=>r(this.backend,oe));const fe=Array.isArray(ne)?ne:[ne];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,ge,fe),fe}}let te;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?S=U():(te=this.profiler.profileKernel(p,l,()=>U()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(te),S=te.outputs)}),v&&this.addTapeNode(p,l,S,u,x,g),this.state.profiling&&this.state.activeProfile.kernels.push({name:p,bytesAdded:this.state.numBytes-O,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-C,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map(oe=>l[oe]!=null?l[oe].shape:null),outputShapes:S.map(oe=>oe.shape),kernelTimeMs:te.timeMs,extraInfo:te.extraInfo}),Array.isArray(ne)?S:S[0]}saveTensorsForBackwardMode(r){const l=r.map(u=>this.keep(this.clone(u)));return l}getTensorsForGradient(r,l,u){const p=rI(r);if(p!=null){const g=p.inputsToSave||[],f=p.outputsToSave||[];let I;p.saveAllInputs?(Z(Array.isArray(l),()=>"saveAllInputs is true, expected inputs to be an array."),I=Object.keys(l).map(x=>l[x])):I=g.map(x=>l[x]);const S=u.filter((x,v)=>f[v]);return I.concat(S)}return null}makeTensor(r,l,u,p){if(r==null)throw new Error("Values passed to engine.makeTensor() are null");u=u||"float32",p=p||this.backend;let g=r;u==="string"&&Su(r[0])&&(g=r.map(S=>nO(S)));const f=p.write(g,l,u),I=new xn(l,u,f,this.nextTensorId());if(this.incRef(I,p),u==="string"){const S=this.state.tensorInfo.get(f),x=eO(g);this.state.numBytes+=x-S.bytes,S.bytes=x}return I}makeTensorFromDataId(r,l,u,p){u=u||"float32";const g=new xn(l,u,r,this.nextTensorId());return this.incRef(g,p),g}makeVariable(r,l=!0,u,p){u=u||this.nextVariableId().toString(),p!=null&&p!==r.dtype&&(r=r.cast(p));const g=new ng(r,l,u,this.nextTensorId());if(this.state.registeredVariables[g.name]!=null)throw new Error(`Variable with name ${g.name} was already registered`);return this.state.registeredVariables[g.name]=g,this.incRef(g,this.backend),g}incRef(r,l){const u=this.state.tensorInfo.has(r.dataId)?this.state.tensorInfo.get(r.dataId).refCount:0;if(this.state.numTensors++,r.dtype==="string"&&this.state.numStringTensors++,u===0){this.state.numDataBuffers++;let p=0;r.dtype!=="complex64"&&r.dtype!=="string"&&(p=r.size*QR(r.dtype)),this.state.tensorInfo.set(r.dataId,{backend:l||this.backend,dtype:r.dtype,shape:r.shape,bytes:p,refCount:0}),this.state.numBytes+=p}this.state.tensorInfo.get(r.dataId).refCount++,r instanceof ng||this.track(r)}disposeTensor(r){if(!this.state.tensorInfo.has(r.dataId))return;this.state.numTensors--,r.dtype==="string"&&this.state.numStringTensors--;const l=this.state.tensorInfo.get(r.dataId),u=l.refCount;u<=1?(r.dtype!=="complex64"&&(this.state.numBytes-=l.bytes),this.state.numDataBuffers--,l.backend.disposeData(r.dataId),this.state.tensorInfo.delete(r.dataId)):this.state.tensorInfo.get(r.dataId).refCount--}disposeVariables(){for(const r in this.state.registeredVariables){const l=this.state.registeredVariables[r];this.disposeVariable(l)}}disposeVariable(r){this.disposeTensor(r),this.state.registeredVariables[r.name]!=null&&delete this.state.registeredVariables[r.name]}memory(){const r=this.backend.memory();return r.numTensors=this.state.numTensors,r.numDataBuffers=this.state.numDataBuffers,r.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(r.unreliable=!0,r.reasons==null&&(r.reasons=[]),r.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),r}async profile(r){this.state.profiling=!0;const l=this.state.numBytes,u=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await r(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map(p=>p.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-l,this.state.activeProfile.newTensors=this.state.numTensors-u;for(const p of this.state.activeProfile.kernels)p.kernelTimeMs=await p.kernelTimeMs,p.extraInfo=await p.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(r,l,u,p,g,f){const I={id:this.state.nextTapeNodeId++,kernelName:r,inputs:l,outputs:u,saved:g},S=rI(r);S!=null&&(p=S.gradFunc),p!=null&&(I.gradient=x=>(x=x.map((v,O)=>{if(v==null){const C=u[O],U=ia(C.size,C.dtype);return this.makeTensor(U,C.shape,C.dtype)}return v}),p(x.length>1?x:x[0],g,f))),this.state.activeTape.push(I)}keep(r){return r.kept=!0,r}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(r){const l={track:[],name:"unnamed scope",id:this.state.nextScopeId++};r&&(l.name=r),this.state.scopeStack.push(l),this.state.activeScope=l}endScope(r){const l=sg(r),u=new Set(l.map(g=>g.id));for(let g=0;g{!g.kept&&g.scopeId===p.id&&this.track(g)})}gradients(r,l,u,p=!1){if(Z(l.length>0,()=>"gradients() received an empty list of xs."),u!=null&&u.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${u.dtype}'`);const g=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",r));Z(g instanceof xn,()=>"The result y returned by f() must be a tensor.");const f=iO(this.state.activeTape,l,g);if(!p&&f.length===0&&l.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{const I={};I[g.id]=u==null?K7(g.shape):u,rO(I,f,x=>this.tidy(x),X7);const S=l.map(x=>I[x.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(x=>{for(const v of x.saved)v.dispose()}),this.state.activeTape=null),{value:g,grads:S}})}customGrad(r){return Z(aI(r),()=>"The f passed in customGrad(f) must be a function."),(...l)=>{Z(l.every(g=>g instanceof xn),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let u;const p={};return l.forEach((g,f)=>{p[f]=g}),this.runKernelFunc((g,f)=>(u=r(...l,f),Z(u.value instanceof xn,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),Z(aI(u.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),u.value),p,(g,f)=>{const I=u.gradFunc(g,f),S=Array.isArray(I)?I:[I];Z(S.length===l.length,()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."),Z(S.every(v=>v instanceof xn),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");const x={};return S.forEach((v,O)=>{x[O]=()=>v}),x})}}readSync(r){const l=this.state.tensorInfo.get(r);return l.backend.readSync(r)}read(r){const l=this.state.tensorInfo.get(r);return l.backend.read(r)}async time(r){const l=lI(),u=await this.backend.time(r);return u.wallMs=lI()-l,u}track(r){return this.state.activeScope!=null&&(r.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(r)),r}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new gO;for(const r in this.registry)this.disposeRegisteredKernels(r),this.registry[r].dispose(),delete this.registry[r];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}Nu.nextTensorId=0;Nu.nextVariableId=0;function K7(r){const l=Qf(qt(r),"float32");return Y.makeTensor(l,r,"float32")}function gI(){const r=tI();if(r._tfengine==null){const l=new S2(r);r._tfengine=new Nu(l)}return x2(r._tfengine.ENV),hO(()=>r._tfengine),r._tfengine}const Y=gI();function X7(r,l){const u={a:r,b:l};return Y.runKernelFunc((p,g)=>{const f=p.add(r,l);return g([r,l]),f},u,null,Ec)}function yO(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}const pr=Rs();pr.registerFlag("DEBUG",()=>!1,r=>{r&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});pr.registerFlag("IS_BROWSER",()=>yO());pr.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");pr.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));pr.registerFlag("PROD",()=>!1);pr.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>pr.getBool("DEBUG"));pr.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);pr.registerFlag("IS_TEST",()=>!1);function mr(r,l){let u=r;if(Os(r))return l==="string"?[]:[r.length];if(!Array.isArray(r))return[];const p=[];for(;Array.isArray(u)||Os(u)&&l!=="string";)p.push(u.length),u=u[0];return Array.isArray(r)&&Rs().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&bO(r,p,[]),p}function bO(r,l,u){if(u=u||[],!Array.isArray(r)&&!Os(r)){Z(l.length===0,()=>`Element arr[${u.join("][")}] is a primitive, but should be an array/TypedArray of ${l[0]} elements`);return}Z(l.length>0,()=>`Element arr[${u.join("][")}] should be a primitive, but is an array of ${r.length} elements`),Z(r.length===l[0],()=>`Element arr[${u.join("][")}] should have ${l[0]} elements, but has ${r.length} elements`);const p=l.slice(1);for(let g=0;g=0&&(g=p),wO(p,g,l,u),r==null||!Os(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="string"){const x=r==null?"null":r.constructor.name;throw new Error(`Argument '${l}' passed to '${u}' must be a Tensor or TensorLike, but got '${x}'`)}const f=mr(r,g);!Os(r)&&!Array.isArray(r)&&(r=[r]);const I=!0,S=g!=="string"?Zf(r,g):Fc(r,[],I);return Y.makeTensor(S,f,g)}function ig(r,l,u,p="numeric"){if(!Array.isArray(r))throw new Error(`Argument ${l} passed to ${u} must be a \`Tensor[]\` or \`TensorLike[]\``);const g=r;return g.map((f,I)=>M(f,`${l}[${I}]`,u),p)}const LO="__op";function z(r){const l=Object.keys(r);if(l.length!==1)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${l.length} keys.`);let u=l[0];const p=r[u];u.endsWith("_")&&(u=u.substring(0,u.length-1)),u=u+LO;const g=(...f)=>{Y.startScope(u);try{const I=p(...f);return I instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),Y.endScope(I),I}catch(I){throw Y.endScope(null),I}};return Object.defineProperty(g,"name",{value:u,configurable:!0}),g}function J7(r,l){const u=M(r,"real","complex"),p=M(l,"imag","complex");Zt(u.shape,p.shape,`real and imag shapes, ${u.shape} and ${p.shape}, must match in call to tf.complex().`);const g=I=>I.complex(u,p),f={real:u,imag:p};return Y.runKernelFunc(g,f,null,M2)}const Gi=z({complex_:J7});function Vi(r,l,u,p){if(p==null&&(p=Iu(r)),p==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!Os(r)&&!Array.isArray(r)&&typeof r!="number"&&typeof r!="boolean"&&typeof r!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(l!=null){eg(l);const g=qt(l),f=qt(u);Z(g===f,()=>`Based on the provided shape, [${l}], the tensor should have ${g} values but has ${f}`);for(let I=0;I`Error creating a new Tensor. Inferred shape (${u}) does not match the provided shape (${l}). `)}}return!Os(r)&&!Array.isArray(r)&&(r=[r]),l=l||u,r=p!=="string"?Zf(r,p):Fc(r,[],!0),Y.makeTensor(r,l,p)}function yI(r,l,u){const p=mr(r,u);return Vi(r,l,p,u)}function Cu(r,l="float32",u){return l=l||"float32",eg(r),new lO(r,l,u)}function Z7(r,l){const u=M(r,"x","cast");if(!ZR(l))throw new Error(`Failed to cast to unknown dtype ${l}`);if(l==="string"&&u.dtype!=="string"||l!=="string"&&u.dtype==="string")throw new Error("Only strings can be casted to strings");const p={x:u},g={dtype:l};return Y.runKernelFunc(f=>f.cast(u,l),p,null,Dc,g)}const Le=z({cast_:Z7});function Q7(r){const l=M(r,"x","clone",null),u=()=>Y.makeTensorFromDataId(l.dataId,l.shape,l.dtype),p={x:l};return Y.runKernelFunc(u,p,null,yf)}const gi=z({clone_:Q7});function bI(r,l=!1){console.log(r.toString(l))}gI();const eJ={buffer:Cu,cast:Le,clone:gi,print:bI};uO(eJ);function tJ(r,l){const u=M(r,"x","reshape",null),p={x:u},g={shape:l},f=(I,S)=>(l=KR(l,u.size),Z(u.size===qt(l),()=>"new shape and old shape must have the same number of elements."),S([u]),I.reshape(u,l));return Y.runKernelFunc(f,p,null,Rf,g)}const ie=z({reshape_:tJ});function nJ(r,l,u=!1,p=!1){let g=M(r,"a","matMul"),f=M(l,"b","matMul");[g,f]=ft(g,f),Z(g.rank>=2&&f.rank>=2&&g.rank===f.rank,()=>`Error in matMul: inputs must have the same rank of at least 2, got ranks ${g.rank} and ${f.rank}.`);const I=u?g.shape[g.rank-2]:g.shape[g.rank-1],S=p?f.shape[f.rank-1]:f.shape[f.rank-2],x=u?g.shape[g.rank-1]:g.shape[g.rank-2],v=p?f.shape[f.rank-2]:f.shape[f.rank-1],O=g.shape.slice(0,-2),C=f.shape.slice(0,-2),U=qt(O),G=qt(C);Z(sa(O,C),()=>`Error in matMul: outer dimensions (${O}) and (${C}) of Tensors with shapes ${g.shape} and ${f.shape} must match.`),Z(I===S,()=>`Error in matMul: inner shapes (${I}) and (${S}) of Tensors with shapes ${g.shape} and ${f.shape} and transposeA=${u} and transposeB=${p} must match.`);const ne=g.shape.slice(0,-2).concat([x,v]),te=u?ie(g,[U,I,x]):ie(g,[U,x,I]),oe=p?ie(f,[G,v,S]):ie(f,[G,S,v]),ge=(Ve,rt)=>(rt([te,oe]),Ve.batchMatMul(te,oe,u,p)),fe={a:te,b:oe},Ae={transposeA:u,transposeB:p},Te=Y.runKernelFunc(ge,fe,null,tf,Ae);return ie(Te,ne)}const un=z({matMul_:nJ});function sJ(r,l){const u=M(r,"x","transpose");if(l==null&&(l=u.shape.map((f,I)=>I).reverse()),Z(u.rank===l.length,()=>`Error in transpose: rank of input ${u.rank} must match length of perm ${l}.`),l.forEach(f=>{Z(f>=0&&f`All entries in 'perm' must be between 0 and ${u.rank-1} but got ${l}`)}),u.rank<=1)return u.clone();const p={x:u},g={perm:l};return Y.runKernelFunc(f=>f.transpose(u,l),p,null,Hf,g)}const $t=z({transpose_:sJ});function wI(r,l,u){if(kc(r),l!=null&&l.length!==3)throw new Error("tensor3d() requires shape to have three numbers");const p=mr(r,u);if(p.length!==3&&p.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Vi(r,l,p,u)}const LI={};uu(LI,{fromPixels:()=>oJ,toPixels:()=>rJ});let $c;function iJ(r,l=3){if(l>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(r==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let u=!1,p=!1,g=!1,f=!1,I=!1;if(r.data instanceof Uint8Array)u=!0;else if(typeof ImageData!="undefined"&&r instanceof ImageData)p=!0;else if(typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement)g=!0;else if(typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement)f=!0;else if(r.getContext!=null)I=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${r.constructor.name}`);if(g){const G=2;if(g&&r.readyState element.")}const S=Jf(sI,Y.backendName);if(S!=null){const G={pixels:r},ne={numChannels:l};return Y.runKernel(sI,G,ne)}const[x,v]=g?[r.videoWidth,r.videoHeight]:[r.width,r.height];let O;I?O=r.getContext("2d").getImageData(0,0,x,v).data:p||u?O=r.data:(f||g)&&($c==null&&($c=document.createElement("canvas").getContext("2d")),$c.canvas.width=x,$c.canvas.height=v,$c.drawImage(r,0,0,x,v),O=$c.getImageData(0,0,x,v).data);let C;if(l===4)C=new Int32Array(O);else{const G=x*v;C=new Int32Array(G*l);for(let ne=0;ne4||f===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${f}`);if(u.dtype!=="float32"&&u.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${u.dtype}. Please use float32 or int32 tensors.`);const I=await u.data(),S=u.dtype==="float32"?255:1,x=new Uint8ClampedArray(g*p*4);for(let v=0;v1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${G}.`)}else if(u.dtype==="int32"&&(G<0||G>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${G}.`);f===1?(O[0]=G*S,O[1]=G*S,O[2]=G*S):O[U]=G*S}const C=v*4;x[C+0]=Math.round(O[0]),x[C+1]=Math.round(O[1]),x[C+2]=Math.round(O[2]),x[C+3]=Math.round(O[3])}if(l!=null){l.width=g,l.height=p;const v=l.getContext("2d"),O=new ImageData(x,g,p);v.putImageData(O,0,0)}return u!==r&&u.dispose(),x}const oJ=z({fromPixels_:iJ});function SO(r,l,u){const p=r.shape.length;Z(p===l.length,()=>`Error in slice${p}D: Length of begin ${l} must match the rank of the array (${p}).`),Z(p===u.length,()=>`Error in slice${p}D: Length of size ${u} must match the rank of the array (${p}).`);for(let g=0;g`Error in slice${p}D: begin[${g}] + size[${g}] (${l[g]+u[g]}) would overflow input.shape[${g}] (${r.shape[g]})`)}function rg(r,l,u){let p;const g=r.shape.length;typeof l=="number"?p=[l,...new Array(g-1).fill(0)]:l.length{Z(I!==-1,()=>"slice() does not support negative begin indexing.")});let f;return u==null?f=new Array(g).fill(-1):typeof u=="number"?f=[u,...new Array(g-1).fill(-1)]:u.lengthI>=0?I:(Z(I===-1,()=>`Negative size values should be exactly -1 but got ${I} for the slice() size at index ${S}.`),r.shape[S]-p[S])),[p,f]}function aJ(r){Rs().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(r+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}dO(aJ);function IO(r,l){return Y.tidy(r,l)}function xO(r){const l=sg(r);l.forEach(u=>u.dispose())}function cJ(r,l){let u=M(r,"a","add"),p=M(l,"b","add");[u,p]=ft(u,p);const g=(I,S)=>{const x=I.add(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Ec)}const Lt=z({add_:cJ});function lJ(r,l){let u=M(r,"a","floorDiv"),p=M(l,"b","floorDiv");[u,p]=ft(u,p);const g=(I,S)=>{const x=I.floorDiv(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,mf)}const SI=z({floorDiv_:lJ});function hJ(r,l){let u=M(r,"a","div"),p=M(l,"b","div");if([u,p]=ft(u,p),u.dtype==="int32"&&p.dtype==="int32")return SI(u,p);const g=(S,x)=>{const v=S.realDivide(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,uf,I)}const Pe=z({div_:hJ});function uJ(r,l){let u=M(r,"a","mul"),p=M(l,"b","mul");[u,p]=ft(u,p);const g=(I,S)=>{const x=I.multiply(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Tf)}const ae=z({mul_:uJ});function dJ(r){const l=M(r,"x","abs"),u={x:l};return Y.runKernelFunc((p,g)=>(g([l]),l.dtype==="complex64"?p.complexAbs(l):p.abs(l)),u,null,ef)}const Bn=z({abs_:dJ});function pJ(r,l){for(let u=0;ur[f]);return[u,g]}function Qn(r,l){const u=l.map(p=>1);return mJ(r,u,l)}function ds(r,l){if(pJ(r,l))return null;const u=[];for(let p=0;pu.push(p)),u}function Uc(r){return r.map((l,u)=>[u,l]).sort((l,u)=>l[1]-u[1]).map(l=>l[0])}function ro(r,l){const u=[];for(let p=l-r;p`The output # of rows (${S}) must be an integer. Change the stride and/or zero pad parameters`);const x=ra((I-l+2*p)/u+1,g);return Z(Qt(x),()=>`The output # of columns (${x}) must be an integer. Change the stride and/or zero pad parameters`),[S,x]}function bJ(r,l,u,p,g,f){g==null&&(g=AO(r,l,p));const I=r[0],S=r[1],x=r[2],v=ra((I-l+2*g)/p+1,f);Z(Qt(v),()=>`The output # of depths (${v}) must be an integer. Change the stride and/or zero pad parameters`);const O=ra((S-l+2*g)/p+1,f);Z(Qt(O),()=>`The output # of rows (${O}) must be an integer. Change the stride and/or zero pad parameters`);const C=ra((x-l+2*g)/p+1,f);return Z(Qt(C),()=>`The output # of columns (${C}) must be an integer. Change the stride and/or zero pad parameters`),[v,O,C,u]}function AO(r,l,u,p=1){const g=Bc(l,p);return Math.floor((r[0]*(u-1)-u+g)/2)}function og(r){return typeof r=="number"?[r,r,r]:r.length===2?[r[0],r[1],1]:r}function II(r){return typeof r=="number"?[r,r,r]:r}function Bc(r,l){return l<=1?r:r+(r-1)*(l-1)}function fJ(r,l,u,p,g,f,I,S,x){let v,O,C;if(typeof r=="number"){const U=r===0?"VALID":"NUMBER";v={top:r,bottom:r,left:r,right:r,type:U};const G=yJ([l,u],f,p,r,S);O=G[0],C=G[1]}else if(r==="same"){O=Math.ceil(l/p),C=Math.ceil(u/g);const U=Math.max(0,(O-1)*p+f-l),G=Math.max(0,(C-1)*g+I-u),ne=Math.floor(U/2),te=U-ne,oe=Math.floor(G/2),ge=G-oe;v={top:ne,bottom:te,left:oe,right:ge,type:"SAME"}}else if(r==="valid")v={top:0,bottom:0,left:0,right:0,type:"VALID"},O=Math.ceil((l-f+1)/p),C=Math.ceil((u-I+1)/g);else if(typeof r=="object"){const U=x==="channelsLast"?r[1][0]:r[2][0],G=x==="channelsLast"?r[1][1]:r[2][1],ne=x==="channelsLast"?r[2][0]:r[3][0],te=x==="channelsLast"?r[2][1]:r[3][1],oe=U===0&&G===0&&ne===0&&te===0?"VALID":"EXPLICIT";v={top:U,bottom:G,left:ne,right:te,type:oe},O=ra((l-f+U+G)/p+1,S),C=ra((u-I+ne+te)/g+1,S)}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:v,outHeight:O,outWidth:C}}function gJ(r,l,u,p,g,f,I,S,x,v,O){let C,U,G,ne;if(typeof r=="number"){const te=r===0?"VALID":"NUMBER";C={top:r,bottom:r,left:r,right:r,front:r,back:r,type:te};const oe=bJ([l,u,p,1],S,1,g,r,O);U=oe[0],G=oe[1],ne=oe[2]}else if(r==="same"){U=Math.ceil(l/g),G=Math.ceil(u/f),ne=Math.ceil(p/I);const te=(U-1)*g+S-l,oe=(G-1)*f+x-u,ge=(ne-1)*I+v-p,fe=Math.floor(te/2),Ae=te-fe,Te=Math.floor(oe/2),Ve=oe-Te,rt=Math.floor(ge/2),Ct=ge-rt;C={top:Te,bottom:Ve,left:rt,right:Ct,front:fe,back:Ae,type:"SAME"}}else if(r==="valid")C={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},U=Math.ceil((l-S+1)/g),G=Math.ceil((u-x+1)/f),ne=Math.ceil((p-v+1)/I);else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:C,outDepth:U,outHeight:G,outWidth:ne}}function ra(r,l){if(!l)return r;switch(l){case"round":return Math.round(r);case"ceil":return Math.ceil(r);case"floor":return Math.floor(r);default:throw new Error(`Unknown roundingMode ${l}`)}}function oo(r){const[l,u,p]=og(r);return l===1&&u===1&&p===1}function ao(r,l){return oo(r)||oo(l)}function Mc(r){if(r==="NHWC")return"channelsLast";if(r==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${r}`)}function vO(r,l){const u=r[0].length;r.forEach((g,f)=>{Z(g.length===u,()=>`Error in concat${u}D: rank of tensors[${f}] must be the same as the rank of the rest (${u})`)}),Z(l>=0&&l`Error in concat${u}D: axis must be between 0 and ${u-1}.`);const p=r[0];r.forEach((g,f)=>{for(let I=0;I`Error in concat${u}D: Shape of tensors[${f}] (${g}) does not match the shape of the rest (${p}) along the non-concatenated axis ${f}.`)})}function NO(r,l){const u=r[0].slice();for(let p=1;p=1,()=>"Pass at least one tensor to concat");let u=ig(r,"tensors","concat");u[0].dtype==="complex64"&&u.forEach(I=>{if(I.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${I.dtype}. `)});const p=(I,S)=>{const x=ut(l,u[0].shape)[0],v=NO(u.map(U=>U.shape),x);if(qt(v)===0)return yI([],v);if(u=u.filter(U=>U.size>0),u.length===1)return u[0];const O=u.map(U=>U.shape);vO(O,x);const C=I.concat(u,x);return S(u),C},g=u,f={axis:l};return Y.runKernelFunc(p,g,null,rf,f)}const yn=z({concat_:wJ});function LJ(r){const l=M(r,"x","sigmoid"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sigmoid(l);return g([f]),f},u,null,Uf)}const xI=z({sigmoid_:LJ});function SJ(r,l,u){const p=M(r,"x","slice");if(p.rank===0)throw new Error("Slicing scalar is not possible");const g=(S,x)=>{const[v,O]=rg(p,l,u);return SO(p,v,O),x([p]),S.slice(p,v,O)},f={x:p},I={begin:l,size:u};return Y.runKernelFunc(g,f,null,_f,I)}const vt=z({slice_:SJ});function IJ(r,l,u){const p=M(r,"x","batchToSpaceND"),g=l.reduce((x,v)=>x*v);Z(p.rank>=1+l.length,()=>`input rank is ${p.rank} but should be > than blockShape.length ${l.length}`),Z(u.length===l.length,()=>`crops.length is ${u.length} but should be equal to blockShape.length ${l.length}`),Z(p.shape[0]%g===0,()=>`input tensor batch is ${p.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${g}`);const f=x=>x.batchToSpaceND(p,l,u),I={x:p},S={blockShape:l,crops:u};return Y.runKernelFunc(f,I,null,nf,S)}const TI=z({batchToSpaceND_:IJ});function xJ(r,l){let u=M(r,"broadcastTo","x");const p=u.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthu.rank){const O=u.shape.slice();for(;O.length=0;O--)if(g[O]===l[O])f[O]=1;else if(u.shape[O]!==1)throw new Error(`broadcastTo(): [${p}] cannot be broadcast to [${l}].`);const I=f.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(I.length===0)return gi(u);const S=O=>O.tile(u,f),x={x:u},v={shape:l,inputShape:g};return Y.runKernelFunc(S,x,null,sf,v)}const lg=z({broadcastTo_:xJ});function TJ(r,l,u,p,g="NHWC",f=[1,1],I){const S=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let v=S,O=!1;S.rank===3&&(O=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2]])),Z(v.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${v.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),I!=null&&Z(Qt(p),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${p}.`);const C=g==="NHWC"?v.shape[3]:v.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(ao(u,f),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${u} and dilations '${f}'`);const U=(oe,ge)=>{const fe=Mc(g),Ae=fr(v.shape,x.shape,u,f,p,I,!1,fe),Te=oe.conv2d(v,x,Ae);return ge([v,x]),Te},G={x:v,filter:x},ne={strides:u,pad:p,dataFormat:g,dilations:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,of,ne);return O?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const AI=z({conv2d_:TJ});function AJ(r,l,u,p,g,f="NHWC",I){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let S=r,x=l,v=!1;l.rank===3&&(v=!0,x=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]),S=[1,r[0],r[1],r[2]]),Z(S.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${S.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(u.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${u.rank}`);const O=f==="NHWC"?S[3]:S[1],C=f==="NHWC"?x.shape[3]:x.shape[1];Z(O===u.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${u.shape[2]}.`),Z(C===u.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${u.shape[3]}.`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const U=(oe,ge)=>{const fe=1,Ae=Mc(f),Te=fr(S,u.shape,p,fe,g,I,!1,Ae),Ve=oe.conv2dDerInput(x,u,Te);return ge([x,u]),Ve},G={dy:x,filter:u},ne={strides:p,pad:g,dataFormat:f,dimRoundingMode:I,inputShape:S},te=Y.runKernelFunc(U,G,null,af,ne);return v?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const CO=z({conv2DBackpropInput_:AJ});function vJ(r,l,u,p,g){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let f=r,I=l,S=!1;l.rank===4&&(S=!0,I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),f=[1,r[0],r[1],r[2],r[3]]);const x=f[4],v=I.shape[4];Z(f.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${f.length}.`),Z(I.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${I.rank}`),Z(u.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${u.rank}`),Z(x===u.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${u.shape[3]}.`),Z(v===u.shape[4],()=>`Error in conv3dDerInput: depth of output (${v}) must match output depth for filter ${u.shape[4]}.`);const O=ne=>{const te=1,oe=Ru(f,u.shape,p,te,g);return ne.conv3dDerInput(I,u,oe)},C={dy:I},U={pad:g},G=Y.runKernelFunc(O,C,null,V2,U);return S?ie(G,[G.shape[1],G.shape[2],G.shape[3],G.shape[4]]):G}const RO=z({conv3DBackpropInput_:vJ});function NJ(r){const l=M(r,"x","cos"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cos(l);return g([l]),f},u,null,cf)}const Ou=z({cos_:NJ});function CJ(r){const l=M(r,"x","cosh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cosh(l);return g([l]),f},u,null,lf)}const vI=z({cosh_:CJ});function RJ(r,l=0,u=!1,p=!1){const g=M(r,"x","cumsum"),f=(x,v)=>{const O=ds([l],g.rank);let C=g;O!=null&&(C=$t(g,O));const U=ro(1,g.rank)[0];let G=x.cumsum(C,U,u,p);if(v([g]),O!=null){const ne=Uc(O);G=$t(G,ne)}return G},I={x:g},S={axis:l,exclusive:u,reverse:p};return Y.runKernelFunc(f,I,null,hf,S)}const NI=z({cumsum_:RJ});function Nt(r,l){const u=[];for(let p=0;p1)&&u.unshift(f)}return u}function it(r,l){const u=[],p=Math.max(r.length,l.length);for(let g=0;gI.equal(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,tR)}const CI=z({equal_:OJ});function EJ(r,l,u){const p=M(l,"a","where"),g=M(u,"b","where"),f=M(r,"condition","where","bool"),I=it(p.shape,g.shape),S=lg(p,I),x=lg(g,I);f.rank===1&&Z(f.shape[0]===p.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),f.rank!==1&&Zt(f.shape,x.shape,"Error in where: ");const v=(C,U)=>{const G=C.select(f,S,x);return U([f]),G},O={condition:f,t:S,e:x};return Y.runKernelFunc(v,O,null,Ff)}const Mn=z({where_:EJ});function DJ(r){const l=M(r,"x","zerosLike"),u={x:l};return Y.runKernelFunc(p=>p.zerosLike(l),u,null,Kf)}const je=z({zerosLike_:DJ});function kJ(r){const l=M(r,"x","exp"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.exp(l);return g([f]),f},u,null,df)}const Pn=z({exp_:kJ});function FJ(r,l=0){const u=null,p=M(r,"x","expandDims",u);Z(l<=p.rank,()=>"Axis must be <= rank of the tensor");const g=p.shape.slice();return l<0&&(Z(-(p.rank+1)<=l,()=>`Axis must be in the interval [${-(p.rank+1)}, ${p.rank}]`),l=p.rank+l+1),g.splice(l,0,1),ie(p,g)}const Es=z({expandDims_:FJ});function _J(r,l){const u=null,p=M(r,"x","tile",u);Z(p.rank===l.length,()=>`Error in transpose: rank of input ${p.rank} must match length of reps ${l}.`);const g=(x,v)=>{const O=x.tile(p,l);return v([p]),O},f=[p],I={x:p},S={reps:l};return Y.runKernelFunc(g,I,null,Yf,S,f)}const oa=z({tile_:_J});function WJ(r,l,u,p="float32"){l==null&&(l=r);const g=Cu([r,l],p),f=r<=l?r:l;for(let S=0;Sg.fill(r,l,u),{},null,iR,p)}function $J(r){const l=M(r,"x","floor"),u={x:l};return Y.runKernelFunc(p=>p.floor(l),u,null,pf)}const EI=z({floor_:$J});function OO(r,l,u){const p=r.shape[u],g=[];let f=1,I=1;for(let S=0;S{const O=ut(u,p.shape)[0],C=OO(p,g,O),U=x.gather(p,ie(g,[g.size]),O);return v([p,g]),ie(U,C.outputShape)};return Y.runKernelFunc(S,f,null,ff,I)}const DI=z({gather_:UJ});function BJ(r,l){let u=M(r,"a","greater"),p=M(l,"b","greater");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.greater(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,aR)}const yi=z({greater_:BJ});function MJ(r,l){let u=M(r,"a","greaterEqual"),p=M(l,"b","greaterEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.greaterEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,gf)}const gr=z({greaterEqual_:MJ});function PJ(r){const l=M(r,"input","imag"),u=g=>g.imag(l),p={input:l};return Y.runKernelFunc(u,p,null,lR)}const Eu=z({imag_:PJ});function zJ(r,l){let u=M(r,"a","maximum"),p=M(l,"b","maximum");[u,p]=ft(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.maximum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Sf)}const kI=z({maximum_:zJ});function ke(r,l){if((Os(r)&&l!=="string"||Array.isArray(r))&&l!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(l==="string"&&Os(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const u=[],p=[];return Vi(r,u,p,l)}function GJ(r,l){let u=M(r,"a","less"),p=M(l,"b","less");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.less(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,pR)}const FI=z({less_:GJ});function VJ(r,l){let u=M(r,"a","lessEqual"),p=M(l,"b","lessEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.lessEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,mR)}const yr=z({lessEqual_:VJ});function YJ(r){const l=M(r,"x","log"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log(l);return g([l]),f},u,null,bf)}const co=z({log_:YJ});function HJ(r){const l=M(r,"x","log1p"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log1p(l);return g([l]),f},u,null,wf)}const _I=z({log1p_:HJ});function hg(r){return Y.customGrad(r)}function qJ(r){const l=M(r,"x","neg"),u={x:l};return Y.runKernelFunc(p=>p.neg(l),u,null,Af)}const yt=z({neg_:qJ});function jJ(r,l=null,u=!1){const p=M(r,"x","max"),g=(S,x)=>{const v=ut(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=$t(p,C),O=ro(O.length,U.rank));const G=S.max(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Qn(ne.shape,ut(l,p.shape));ne=ie(ne,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={reductionIndices:l,keepDims:u};return Y.runKernelFunc(g,f,null,Lf,I)}const aa=z({max_:jJ});function KJ(r,l){let u=M(r,"a","sub"),p=M(l,"b","sub");[u,p]=ft(u,p);const g=(I,S)=>{const x=I.subtract(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Vf)}const Be=z({sub_:KJ});function XJ(r,l=null,u=!1){let p=M(r,"x","sum");p.dtype==="bool"&&(p=Le(p,"int32"));const g=(S,x)=>{x([p]);const v=ut(l,p.shape),O=ds(v,p.rank);let C=v,U=p;O!=null&&(U=$t(p,O),C=ro(C.length,p.rank));let G=S.sum(U,C);if(u){const ne=Qn(G.shape,v);G=ie(G,ne)}return G},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,Mf,I)}const Fe=z({sum_:XJ});function JJ(r,l=null,u=!1){const p=M(r,"x","logSumExp"),g=ut(l,p.shape),f=aa(p,g,!0),I=Be(p,f),S=Pn(I),x=Fe(S,g),v=co(x),O=Lt(ie(f,v.shape),v);if(u){const C=Qn(O.shape,g);return ie(O,C)}return O}const WI=z({logSumExp_:JJ});function ZJ(r,l){const u=M(r,"a","logicalAnd","bool"),p=M(l,"b","logicalAnd","bool");it(u.shape,p.shape);const g={a:u,b:p};return Y.runKernelFunc(f=>f.logicalAnd(u,p),g,null,fR)}const ca=z({logicalAnd_:ZJ});function QJ(r){const l=M(r,"x","logicalNot","bool"),u={x:l};return Y.runKernelFunc(p=>p.logicalNot(l),u,null,gR)}const $I=z({logicalNot_:QJ});function Ds(r,l="float32"){if(l==="complex64"){const p=Ds(r,"float32"),g=Ds(r,"float32");return Gi(p,g)}const u=ia(qt(r),l);return Y.makeTensor(u,r,l)}function Yi(r,l="float32"){if(l==="complex64"){const p=Yi(r,"float32"),g=Ds(r,"float32");return Gi(p,g)}const u=Qf(qt(r),l);return Y.makeTensor(u,r,l)}function e9(r,l=null,u=!1){const p=M(r,"x","mean"),g=ut(l,p.shape),f=TO(p.shape,g),I=f[1],S=qt(I),x=hg(v=>{const O=ke(S),C=O.dtype===v.dtype?v:Le(v,O.dtype),U=Pe(C,O),G=Fe(U,l,u),ne=te=>{const oe=v.shape.slice();g.forEach(Ae=>{oe[Ae]=1});const ge=ie(te,oe),fe=Pe(ae(ge,Yi(v.shape,"float32")),S);return fe};return{value:G,gradFunc:ne}});return x(p)}const UI=z({mean_:e9});function t9(r,l=null,u=!1){const p=M(r,"x","min"),g=(S,x)=>{const v=ut(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=$t(p,C),O=ro(O.length,p.rank));const G=S.min(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Qn(ne.shape,v);ne=ie(G,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,If,I)}const ug=z({min_:t9});function n9(r,l){let u=M(r,"a","minimum"),p=M(l,"b","minimum");[u,p]=ft(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.minimum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,xf)}const BI=z({minimum_:n9});function s9(r){const l=M(r,"x","square"),u={},p=[l],g=[];return Y.runKernelFunc((f,I)=>(I([l]),f.square(l)),{x:l},null,"Square",u,p,g)}const dt=z({square_:s9});function i9(r,l){let u=M(r,"a","notEqual"),p=M(l,"b","notEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.notEqual(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,AR)}const MI=z({notEqual_:i9});function r9(r){const l=M(r,"input","real"),u=g=>g.real(l),p={input:l};return Y.runKernelFunc(u,p,null,kR)}const Pc=z({real_:r9});function o9(r,l,u=0){const p=M(r,"x","pad");if(p.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const g=(S,x)=>(x([p]),S.pad(p,l,u)),f={paddings:l,constantValue:u},I={x:p};return Y.runKernelFunc(g,I,null,vf,f)}const PI=z({pad_:o9});function a9(r,l,u){const p=M(r,"x","spaceToBatchND");Z(p.rank>=1+l.length,()=>`input rank ${p.rank} should be > than [blockShape] ${l.length}`),Z(u.length===l.length,()=>`paddings.shape[0] ${u.length} must be equal to [blockShape] ${l.length}`),Z(p.shape.reduce((S,x,v)=>v>0&&v<=l.length?S&&(x+u[v-1][0]+u[v-1][1])%l[v-1]===0:S,!0),()=>`input spatial dimensions ${p.shape.slice(1)} with paddings ${u.toString()} must be divisible by blockShapes ${l.toString()}`);const g=S=>S.spaceToBatchND(p,l,u),f={x:p},I={blockShape:l,paddings:u};return Y.runKernelFunc(g,f,null,Pf,I)}const zI=z({spaceToBatchND_:a9});function c9(r,l){let u=M(r,"base","pow"),p=M(l,"exp","pow");[u,p]=ft(u,p);const g={a:u,b:p},f=(I,S)=>{const x=I.pow(u,p);return S([u,p,x]),x};return Y.runKernelFunc(f,g,null,Nf)}const la=z({pow_:c9});function lo(r,l){kc(r);const u=mr(r,l);if(u.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const p=null;return Vi(r,p,u,l)}function dg(r,l,u=1,p="float32"){if(u===0)throw new Error("Cannot have a step of zero");const g=()=>{const I=r===l,S=r1;if(I||S||x)return Ds([0],p);const v=Math.abs(Math.ceil((l-r)/u)),O=ia(v,p);l(f([l]),l.dtype==="bool"?Le(l,"int32"):g.relu(l)),p={x:l};return Y.runKernelFunc(u,p,null,Cf)}const Du=z({relu_:l9});function h9(r,l){const u=M(r,"x","reverse"),p=I=>{const S=ut(l,u.shape);if(u.rank===0)return gi(u);const x=I.reverse(u,S);return ie(x,u.shape)},g={x:u},f={dims:l};return Y.runKernelFunc(p,g,null,Df,f)}const zc=z({reverse_:h9});function u9(r){const l=M(r,"x","rsqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.rsqrt(l);return g([l]),f},u,null,kf)}const GI=z({rsqrt_:u9});function d9(r){const l=M(r,"x","sin"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sin(l);return g([l]),f},u,null,Wf)}const VI=z({sin_:d9});function p9(r){const l=M(r,"x","sinh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sinh(l);return g([l]),f},u,null,$f)}const YI=z({sinh_:p9});function m9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=r.as2D(g,p),I=u.fft(f);return I.reshape(r.shape)},l,null,sR)}const ku=z({fft_:m9});function f9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=ie(r,[g,p]),I=u.ifft(f);return ie(I,r.shape)},l,null,cR)}const Gc=z({ifft_:f9});function g9(r){const l=r.shape[r.shape.length-1],u=r.size/l;let p;if(l<=2){const g=ie(r,[u,l]);p=Gc(g)}else{const g=[u,2*(l-1)],f=ie(Pc(r),[u,l]),I=ie(Eu(r),[u,l]),S=zc(vt(f,[0,1],[u,l-2]),1),x=ae(zc(vt(I,[0,1],[u,l-2]),1),ke(-1)),v=yn([f,S],1),O=yn([I,x],1),C=ie(Gi(v,O),[g[0],g[1]]);p=Gc(C)}if(p=Pc(p),r.rank===3&&r.shape[0]!==0){const g=p,f=r.shape[0];p=ie(p,[f,p.shape[0]/f,p.shape[1]]),g.dispose()}return p}const HI=z({irfft_:g9});function EO(r,l,u=0){let p=[];if(typeof l=="number")Z(r.shape[u]%l===0,()=>"Number of splits must evenly divide the axis."),p=new Array(l).fill(r.shape[u]/l);else{const g=l.reduce((I,S)=>(S===-1&&(I+=1),I),0);Z(g<=1,()=>"There should be only one negative value in split array.");const f=l.indexOf(-1);if(f!==-1){const I=l.reduce((S,x)=>x>0?S+x:S);l[f]=r.shape[u]-I}Z(r.shape[u]===l.reduce((I,S)=>I+S),()=>"The sum of sizes must match the size of the axis dimension."),p=l}return p}function y9(r,l,u=0){const p=M(r,"x","split"),g=(S,x)=>{const v=ut(u,p.shape)[0],O=EO(p,l,v);return S.split(p,O,v)},f={x:p},I={numOrSizeSplits:l,axis:u};return Y.runKernelFunc(g,f,null,zf,I)}const ho=z({split_:y9});function b9(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let u=r.shape[r.shape.length-1];const p=r.size/u;let g;if(l!=null&&l0),te=r.shape.map(oe=>oe);te[r.shape.length-1]=l,g=vt(r,ne,te),u=l}else if(l!=null&&l>u){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-u,g=yn([r,Ds(ne)],r.shape.length-1),u=l}else g=r;const f=je(g),I=ie(Gi(g,f),[p,u]),S=ku(I),x=Math.floor(u/2)+1,v=Pc(S),O=Eu(S),C=ho(v,[x,u-x],v.shape.length-1),U=ho(O,[x,u-x],O.shape.length-1),G=g.shape.slice();return G[g.shape.length-1]=x,ie(Gi(C[0],U[0]),G)}const Fu=z({rfft_:b9});function w9(r){const l=M(r,"x","sqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sqrt(l);return g([l]),f},u,null,Bf)}const ps=z({sqrt_:w9});function L9(r,l){let u=M(r,"a","squaredDifference"),p=M(l,"b","squaredDifference");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(S,x)=>{const v=S.squaredDifference(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,Gf,I)}const qI=z({squaredDifference_:L9});function S9(r,l){const u=M(r,"x","squeeze");return ie(u,XR(u.shape,l).newShape)}const jI=z({squeeze_:S9});function I9(r,l=0){const u=ig(r,"tensors","stack");if(Z(u.length>=1,()=>"Pass at least one tensor to tf.stack"),u.length===1)return Es(u[0],l);const p=u[0].rank,g=u[0].shape,f=u[0].dtype;Z(l<=p,()=>"Axis must be <= rank of the tensor"),u.forEach(S=>{Zt(g,S.shape,"All tensors passed to stack must have matching shapes"),Z(f===S.dtype,()=>"All tensors passed to stack must have matching dtypes")});const I=u.map(S=>Es(S,l));return yn(I,l)}const qs=z({stack_:I9});function x9(r,l=0){const u=M(r,"x","step"),p={x:u},g={alpha:l};return Y.runKernelFunc(f=>f.step(u,l),p,null,Xf,g)}const ha=z({step_:x9});function ua(r,l,u){if(kc(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const p=mr(r,u);if(p.length!==2&&p.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Vi(r,l,p,u)}function T9(r,l,u){const p=M(r,"x","unsortedSegmentSum"),g=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(u),()=>"numSegments must be of dtype int");const f={x:p,segmentIds:g},I={numSegments:u},S=(x,v)=>{const O=x.unsortedSegmentSum(p,g,u);return v([g]),O};return Y.runKernelFunc(S,f,null,jf,I)}const KI=z({unsortedSegmentSum_:T9});function A9(r,l=0){const u=M(r,"x","unstack");Z(l>=-u.shape.length&&l`Axis = ${l} is not in [-${u.shape.length}, ${u.shape.length})`),l<0&&(l+=u.shape.length);const p={value:u},g={axis:l},f=I=>I.unstack(u,l);return Y.runKernelFunc(f,p,null,qf,g)}const _u=z({unstack_:A9});function v9(r,l="euclidean",u=null,p=!1){r=M(r,"x","norm");const g=DO(r,l,u);let f=g.shape;if(p){const I=ut(u,r.shape);f=Qn(g.shape,I)}return ie(g,f)}function DO(r,l,u=null){if(r.rank===0)return Bn(r);if(r.rank!==1&&u===null)return DO(ie(r,[-1]),l,u);if(r.rank===1||typeof u=="number"||Array.isArray(u)&&u.length===1){if(l===1)return Fe(Bn(r),u);if(l===Infinity)return aa(Bn(r),u);if(l===-Infinity)return ug(Bn(r),u);if(l==="euclidean"||l===2)return ps(Fe(la(Bn(r),ke(2,"int32")),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(u)&&u.length===2){if(l===1)return aa(Fe(Bn(r),u[0]),u[1]-1);if(l===Infinity)return aa(Fe(Bn(r),u[1]),u[0]);if(l===-Infinity)return ug(Fe(Bn(r),u[1]),u[0]);if(l==="fro"||l==="euclidean")return ps(Fe(dt(r),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${u}`)}const pg=z({norm_:v9});function kO(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function mg(r,l,u){const p=1-r%2,g=new Float32Array(r);for(let f=0;f`Error in conv2dDerFilter: input must be rank 4, but got shape ${S.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(u.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${u}.`);const v=f==="NHWC"?S.shape[3]:S.shape[1],O=f==="NHWC"?x.shape[3]:x.shape[1];Z(v===u[2],()=>`Error in conv2dDerFilter: depth of input ${v}) must match input depth in filter (${u[2]}.`),Z(O===u[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${u[3]}).`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const C=ne=>{const te=1,oe=Mc(f),ge=fr(S.shape,u,p,te,g,I,!1,oe);return ne.conv2dDerFilter(S,x,ge)},U={x:S,dy:x},G={strides:p,pad:g,dataFormat:f,dimRoundingMode:I};return Y.runKernelFunc(C,U,null,P2,G)}const fg=z({conv2DBackpropFilter_:N9});function C9(r,l,u,p){let g=r;r.rank===3&&(g=ie(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let f=l;f.rank===3&&(f=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=x=>x.depthwiseConv2DDerFilter(g,f,p),S={x:g,dy:f};return Y.runKernelFunc(I,S,null,q2)}const FO=z({depthwiseConv2dNativeBackpropFilter_:C9});function R9(r,l,u,p){let g=l,f=!1;l.rank===3&&(f=!0,g=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=v=>v.depthwiseConv2DDerInput(g,u,p),S={dy:g},x=Y.runKernelFunc(I,S,null,j2);return f?ie(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const _O=z({depthwiseConv2dNativeBackpropInput_:R9});function O9(r){return mg(r,.54,.46)}const WO=z({hammingWindow_:O9});function E9(r){return mg(r,.5,.5)}const gg=z({hannWindow_:E9});function D9(r,l,u,p=!1,g=0){let f=0;const I=[];for(;f+l<=r.size;)I.push(vt(r,f,l)),f+=u;if(p)for(;f`Error in cropAndResize: image must be rank 4,but got rank ${I.rank}.`),Z(S.rank===2&&S.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${v},4] but had shape ${S.shape}.`),Z(x.rank===1&&x.shape[0]===v,()=>`Error in cropAndResize: boxInd must be have size [${v}] but had shape ${S.shape}.`),Z(p.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${p.length}.`),Z(p[0]>=1&&p[1]>=1,()=>`cropSize must be atleast [1,1], but was ${p}`),Z(g==="bilinear"||g==="nearest",()=>`method must be bilinear or nearest, but was ${g}`);const O=ne=>ne.cropAndResize(I,S,x,p,g,f),C={image:I,boxes:S,boxInd:x},U={method:g,extrapolationValue:f,cropSize:p},G=Y.runKernelFunc(O,C,null,Y2,U);return G}const UO=z({cropAndResize_:F9});function _9(r){const l=M(r,"image","flipLeftRight","float32");Z(l.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${l.rank}.`);const u={image:l},p=Y.runKernel(rR,u,{});return p}const BO=z({flipLeftRight_:_9});function W9(r,l,u=0,p=.5){const g=M(r,"image","rotateWithOffset","float32");Z(g.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${g.rank}.`);const f={image:g},I={radians:l,fillValue:u,center:p},S=Y.runKernel(HR,f,I);return S}const MO=z({rotateWithOffset_:W9});function js(r,l,u,p,g,f){p==null&&(p=.5),g==null&&(g=Number.NEGATIVE_INFINITY),f==null&&(f=0);const I=r.shape[0];return u=Math.min(u,I),Z(0<=p&&p<=1,()=>`iouThreshold must be in [0, 1], but was '${p}'`),Z(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),Z(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),Z(l.rank===1,()=>"scores must be a 1D tensor"),Z(l.shape[0]===I,()=>`scores has incompatible shape with boxes. Expected ${I}, but was ${l.shape[0]}`),Z(0<=f&&f<=1,()=>`softNmsSigma must be in [0, 1], but was '${f}'`),{maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f}}function $9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppression"),I=M(l,"scores","nonMaxSuppression"),S=js(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x={maxOutputSize:u,iouThreshold:p,scoreThreshold:g};return Y.runKernelFunc(v=>v.nonMaxSuppression(f,I,u,p,g),{boxes:f,scores:I},null,vR,x)}const PO=z({nonMaxSuppression_:$9});function zO(r,l,u){const p=U9(r,l,u),g=p<0?-(p+1):p;r.splice(g,0,l)}function U9(r,l,u){return M9(r,l,u||B9)}function B9(r,l){return r>l?1:r>>1);const S=u(l,r[f]);S>0?p=f+1:(g=f,I=!S)}return I?p:-p-1}function GO(r,l,u,p,g){return XI(r,l,u,p,g,0).selectedIndices}function VO(r,l,u,p,g,f){return XI(r,l,u,p,g,0,!1,f,!0)}function YO(r,l,u,p,g,f){return XI(r,l,u,p,g,f,!0)}function XI(r,l,u,p,g,f,I=!1,S=!1,x=!1){const v=[];for(let oe=0;oeg&&v.push({score:l[oe],boxIndex:oe,suppressBeginIndex:0});v.sort(HO);const O=f>0?-.5/f:0,C=[],U=[];for(;C.length0;){const oe=v.pop(),{score:ge,boxIndex:fe,suppressBeginIndex:Ae}=oe;if(ge=Ae;--Ve){const rt=P9(r,fe,C[Ve]);if(rt>=p){Te=!0;break}if(oe.score=oe.score*z9(p,O,rt),oe.score<=g)break}oe.suppressBeginIndex=C.length,Te||(oe.score===ge?(C.push(fe),U.push(oe.score)):oe.score>g&&zO(v,oe,HO))}const G=C.length,ne=u-G;S&&ne>0&&(C.push(...new Array(ne).fill(0)),U.push(...new Array(ne).fill(0)));const te={selectedIndices:lo(C,"int32")};return I&&(te.selectedScores=lo(U,"float32")),x&&(te.validOutputs=ke(G,"int32")),te}function P9(r,l,u){const p=r.subarray(l*4,l*4+4),g=r.subarray(u*4,u*4+4),f=Math.min(p[0],p[2]),I=Math.min(p[1],p[3]),S=Math.max(p[0],p[2]),x=Math.max(p[1],p[3]),v=Math.min(g[0],g[2]),O=Math.min(g[1],g[3]),C=Math.max(g[0],g[2]),U=Math.max(g[1],g[3]),G=(S-f)*(x-I),ne=(C-v)*(U-O);if(G<=0||ne<=0)return 0;const te=Math.max(f,v),oe=Math.max(I,O),ge=Math.min(S,C),fe=Math.min(x,U),Ae=Math.max(ge-te,0)*Math.max(fe-oe,0);return Ae/(G+ne-Ae)}function z9(r,l,u){const p=Math.exp(l*u*u);return u<=r?p:0}function HO(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function G9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppressionAsync"),I=M(l,"scores","nonMaxSuppressionAsync"),S=js(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x=await Promise.all([f.data(),I.data()]),v=x[0],O=x[1],C=GO(v,O,u,p,g);return f!==r&&f.dispose(),I!==l&&I.dispose(),C}const qO=G9;function V9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=js(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v={boxes:I,scores:S},O={maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f},C=Y.runKernel(CR,v,O);return{selectedIndices:C[0],selectedScores:C[1]}}const jO=z({nonMaxSuppressionWithScore_:V9});async function Y9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=js(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v=await Promise.all([I.data(),S.data()]),O=v[0],C=v[1],U=YO(O,C,u,p,g,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),U}const KO=Y9;function H9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=js(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,U={boxes:I,scores:S},G={maxOutputSize:v,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:f},ne=Y.runKernel(NR,U,G);return{selectedIndices:ne[0],validOutputs:ne[1]}}const XO=z({nonMaxSuppressionPadded_:H9});async function q9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=js(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[U,G]=await Promise.all([I.data(),S.data()]),ne=VO(U,G,v,O,C,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),ne}const JO=q9;function j9(r,l,u=!1){const p=M(r,"images","resizeBilinear");Z(p.rank===3||p.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x=(U,G)=>(G([g]),U.resizeBilinear(g,I,S,u)),v={images:g},O={alignCorners:u,size:l},C=Y.runKernelFunc(x,v,null,Ef,O);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const ZO=z({resizeBilinear_:j9});function K9(r,l,u=!1){const p=M(r,"images","resizeNearestNeighbor");Z(p.rank===3||p.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(p.dtype==="float32"||p.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x={images:g},v={alignCorners:u,size:l},O=(U,G)=>(G([g]),U.resizeNearestNeighbor(g,I,S,u)),C=Y.runKernelFunc(O,x,null,Of,v);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const QO=z({resizeNearestNeighbor_:K9});function X9(r,l,u){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(u%1===0,()=>`bandPart(): numUpper must be an integer, got ${u}.`);const p=M(r,"a","bandPart");Z(p.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${p.rank}.`);const g=p.shape,[f,I]=p.shape.slice(-2);if(!(l<=f))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${f}).`);if(!(u<=I))throw new Error(`bandPart(): numUpper (${u}) must not be greater than the number of columns (${I}).`);l<0&&(l=f),u<0&&(u=I);const S=ie(dg(0,f,1,"int32"),[-1,1]),x=dg(0,I,1,"int32"),v=Be(S,x),O=ca(yr(v,ke(+l,"int32")),gr(v,ke(-u,"int32"))),C=Ds([f,I],p.dtype);return ie(qs(_u(ie(p,[-1,f,I])).map(U=>Mn(O,U,C))),g)}const e1=z({bandPart_:X9});function J9(r){let l;if(Array.isArray(r)){l=!1,Z(r!=null&&r.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");const g=r[0].shape[0];for(let f=1;f`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[f].shape[0]} vs. ${g})`)}else l=!0,r=ho(r,r.shape[0],0).map(g=>jI(g,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const u=[],p=r;for(let g=0;g{let f=p[g];if(g>0)for(let I=0;I=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return n1(r,l);{const u=r.shape.slice(0,r.shape.length-2).reduce((x,v)=>x*v),p=_u(ie(r,[u,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),g=[],f=[];p.forEach(x=>{const[v,O]=n1(x,l);g.push(v),f.push(O)});const I=ie(qs(g,0),r.shape),S=ie(qs(f,0),r.shape);return[I,S]}}function n1(r,l=!1){return Y.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const u=r.shape[0],p=r.shape[1];let g=RI(u),f=gi(r);const I=ua([[1]],[1,1]);let S=gi(I);const x=u>=p?p:u;for(let v=0;v{const G=vt(f,[v,v],[u-v,1]),ne=pg(G),te=vt(f,[v,v],[1,1]),oe=Mn(yi(te,0),ua([[-1]]),ua([[1]])),ge=Be(te,ae(oe,ne)),fe=Pe(G,ge);fe.shape[0]===1?S=gi(I):S=yn([I,vt(fe,[1,0],[fe.shape[0]-1,fe.shape[1]])],0);const Ae=yt(Pe(un(oe,ge),ne)),Te=vt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=$t(S);if(v===0)f=Be(Te,un(Ve,un(rt,Te)));else{const Kt=Be(Te,un(Ve,un(rt,Te)));f=yn([vt(f,[0,0],[v,p]),Kt],0)}const Ct=$t(Ve),Ut=vt(g,[0,v],[u,g.shape[1]-v]);if(v===0)g=Be(Ut,un(un(Ut,S),Ct));else{const Kt=Be(Ut,un(un(Ut,S),Ct));g=yn([vt(g,[0,0],[u,v]),Kt],1)}return[S,f,g]}),xO([O,C,U])}return!l&&u>p&&(g=vt(g,[0,0],[u,p]),f=vt(f,[0,0],[p,p])),[g,f]})}const s1=z({qr_:Z9});var jt;(function(r){r[r.NONE=0]="NONE",r[r.MEAN=1]="MEAN",r[r.SUM=2]="SUM",r[r.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(jt||(jt={}));function Q9(r,l,u=jt.SUM_BY_NONZERO_WEIGHTS){const p=M(r,"losses","computeWeightedLoss");let g=null;l!=null&&(g=M(l,"weights","computeWeightedLoss"));const f=g==null?p:ae(p,g);if(u===jt.NONE)return f;if(u===jt.SUM)return Fe(f);if(u===jt.MEAN){if(g==null)return UI(f);{const I=p.size/g.size,S=Pe(Fe(f),Fe(g));return I>1?Pe(S,ke(I)):S}}if(u===jt.SUM_BY_NONZERO_WEIGHTS){if(g==null)return Pe(Fe(f),ke(p.size));{const I=ae(g,Yi(p.shape)),S=Le(Fe(MI(I,ke(0))),"float32");return Pe(Fe(f),S)}}throw Error(`Unknown reduction: ${u}`)}const Tn=z({computeWeightedLoss_:Q9});function eZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","absoluteDifference"),f=M(l,"predictions","absoluteDifference");let I=null;u!=null&&(I=M(u,"weights","absoluteDifference")),Zt(g.shape,f.shape,"Error in absoluteDifference: ");const S=Bn(Be(g,f));return Tn(S,I,p)}const i1=z({absoluteDifference_:eZ});function tZ(r,l,u,p,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","cosineDistance"),I=M(l,"predictions","cosineDistance");let S=null;p!=null&&(S=M(p,"weights","cosineDistance")),Zt(f.shape,I.shape,"Error in cosineDistance: ");const x=ke(1),v=Be(x,Fe(ae(f,I),u,!0));return Tn(v,S,g)}const r1=z({cosineDistance_:tZ});function nZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"labels","hingeLoss");const f=M(l,"predictions","hingeLoss");let I=null;u!=null&&(I=M(u,"weights","hingeLoss")),Zt(g.shape,f.shape,"Error in hingeLoss: ");const S=ke(1);g=Be(ae(ke(2),g),S);const x=Du(Be(S,ae(g,f)));return Tn(x,I,p)}const o1=z({hingeLoss_:nZ});function sZ(r,l,u,p=1,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","huberLoss"),I=M(l,"predictions","huberLoss");let S=null;u!=null&&(S=M(u,"weights","huberLoss")),Zt(f.shape,I.shape,"Error in huberLoss: ");const x=ke(p),v=Bn(Be(I,f)),O=BI(v,x),C=Be(v,O),U=Lt(ae(ke(.5),dt(O)),ae(x,C));return Tn(U,S,g)}const a1=z({huberLoss_:sZ});function iZ(r,l,u,p=1e-7,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","logLoss"),I=M(l,"predictions","logLoss");let S=null;u!=null&&(S=M(u,"weights","logLoss")),Zt(f.shape,I.shape,"Error in logLoss: ");const x=ke(1),v=ke(p),O=yt(ae(f,co(Lt(I,v)))),C=ae(Be(x,f),co(Lt(Be(x,I),v))),U=Be(O,C);return Tn(U,S,g)}const c1=z({logLoss_:iZ});function rZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","meanSquaredError"),f=M(l,"predictions","meanSquaredError");let I=null;u!=null&&(I=M(u,"weights","meanSquaredError")),Zt(g.shape,f.shape,"Error in meanSquaredError: ");const S=qI(g,f);return Tn(S,I,p)}const l1=z({meanSquaredError_:rZ});function oZ(r,l){const u=M(r,"labels","sigmoidCrossEntropyWithLogits"),p=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(u.shape,p.shape,"Error in sigmoidCrossEntropyWithLogits: ");const g=Du(p),f=ae(p,u),I=_I(Pn(yt(Bn(p))));return Lt(Be(g,f),I)}function aZ(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"multiClassLabels","sigmoidCrossEntropy");const I=M(l,"logits","sigmoidCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","sigmoidCrossEntropy")),Zt(f.shape,I.shape,"Error in sigmoidCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(.5);f=Lt(ae(f,Be(O,v)),ae(C,v))}const x=oZ(f,I);return Tn(x,S,g)}const h1=z({sigmoidCrossEntropy_:aZ});function cZ(r,l,u=-1){if(u===-1&&(u=l.rank-1),u!==l.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${l.rank} and dim was ${u}`);const p=hg((g,f,I)=>{const S=!0,x=WI(f,[u],S),v=Be(Le(f,"float32"),x);I([g,v]);const O=yt(ae(v,g)),C=Fe(O,[u]),U=(G,ne)=>{const[te,oe]=ne,ge=Qn(G.shape,[u]);return[ae(ie(G,ge),Be(Le(te,"float32"),Pn(oe))),ae(ie(G,ge),Be(Pn(oe),Le(te,"float32")))]};return{value:C,gradFunc:U}});return p(r,l)}function lZ(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"onehotLabels","softmaxCrossEntropy");const I=M(l,"logits","softmaxCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","softmaxCrossEntropy")),Zt(f.shape,I.shape,"Error in softmaxCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(f.shape[1]);f=Lt(ae(f,Be(O,v)),Pe(v,C))}const x=cZ(f,I);return Tn(x,S,g)}const u1=z({softmaxCrossEntropy_:lZ});const zTe={fft:ku,ifft:Gc,rfft:Fu,irfft:HI},qTe={hammingWindow:WO,hannWindow:gg,frame:yg,stft:$O},d1={flipLeftRight:BO,resizeNearestNeighbor:QO,resizeBilinear:ZO,rotateWithOffset:MO,cropAndResize:UO,nonMaxSuppression:PO,nonMaxSuppressionAsync:qO,nonMaxSuppressionWithScore:jO,nonMaxSuppressionWithScoreAsync:KO,nonMaxSuppressionPadded:XO,nonMaxSuppressionPaddedAsync:JO},cAe={bandPart:e1,gramSchmidt:t1,qr:s1},bAe={absoluteDifference:i1,computeWeightedLoss:Tn,cosineDistance:r1,hingeLoss:o1,huberLoss:a1,logLoss:c1,meanSquaredError:l1,sigmoidCrossEntropy:h1,softmaxCrossEntropy:u1};const p1=1.7580993408473768,m1=1.0507009873554805;const f1={kernelName:ef,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ha(Le(u,"float32"),-1))}}};const g1={kernelName:T2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=dt(Le(u,"float32")),g=ps(Be(ke(1),p));return yt(Pe(r,g))}}}};const y1={kernelName:A2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Be(dt(Le(u,"float32")),1));return Pe(r,p)}}}};const b1={kernelName:Ec,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=Nt(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=Nt(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,p.shape)};return{a:f,b:I}}};const w1={kernelName:v2,saveAllInputs:!0,gradFunc:(r,l)=>{const u={};return l.forEach((p,g)=>{u[g]=()=>r.clone()}),u}};const L1={kernelName:N2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>je(u)}}};const S1={kernelName:C2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>je(u)}}};const I1={kernelName:R2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ps(Be(ke(1),dt(Le(u,"float32")))))}}};const x1={kernelName:O2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Lt(ke(1),dt(Le(u,"float32"))));return Pe(r,p)}}}};const T1={kernelName:k2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Lt(dt(u),dt(p));let x=ae(r,Pe(p,S));const v=Nt(u.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,u.shape)},I=()=>{const S=Lt(dt(u),dt(p));let x=yt(ae(r,Pe(u,S)));const v=Nt(p.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,p.shape)};return{a:f,b:I}}};const A1={kernelName:E2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(dt(Le(u,"float32")),1))}}};const v1={kernelName:D2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Be(ke(1),dt(Le(u,"float32"))))}}};function hZ(r,l,u,p,g=[1,1,1],f,I){const S=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let v=S,O=x,C=!1;x.rank===4&&(C=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2],S.shape[3]]),O=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(v.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${v.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(ao(p,g),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${p} and dilations '${g}'`),I!=null&&Z(Qt(f),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const U=oe=>{const ge=cg(O.shape,u,p,g,f,I);return oe.avgPool3dBackprop(v,O,ge)},G={dy:v,input:O},ne={filterSize:u,strides:p,dilations:g,pad:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,$2,ne);return C?ie(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const N1=z({avgPool3dBackprop_:hZ});const C1={kernelName:W2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,dilations:I,pad:S,dimRoundingMode:x}=u,v=I==null?[1,1,1]:I;return{x:()=>N1(r,p,g,f,v,S,x)}}};function uZ(r,l,u,p,g){const f=M(r,"dy","avgPoolBackprop"),I=M(l,"input","avgPoolBackprop");Z(I.rank===f.rank,()=>`Rank of input (${I.rank}) does not match rank of dy (${f.rank})`);let S=I,x=f,v=!1;I.rank===3&&(v=!0,S=ie(I,[1,I.shape[0],I.shape[1],I.shape[2]]),x=ie(f,[1,f.shape[0],f.shape[1],f.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(S.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${S.rank}.`);const O=ne=>{const te=ag(S.shape,u,p,1,g);return ne.avgPoolBackprop(x,S,te)},C={dy:x,input:S},U={filterSize:u,strides:p,pad:g},G=Y.runKernelFunc(O,C,null,_2,U);return v?ie(G,[G.shape[1],G.shape[2],G.shape[3]]):G}const R1=z({avgPoolBackprop_:uZ});const O1={kernelName:F2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,pad:I}=u;return{x:()=>R1(r,p,g,f,I)}}};const E1={kernelName:tf,inputsToSave:["a","b"],gradFunc:(r,l,u)=>{const[p,g]=l,{transposeA:f,transposeB:I}=u;return!f&&!I?{a:()=>un(r,g,!1,!0),b:()=>un(p,r,!0,!1)}:!f&&I?{a:()=>un(r,g,!1,!1),b:()=>un(r,p,!0,!1)}:f&&!I?{a:()=>un(g,r,!1,!0),b:()=>un(p,r,!1,!1)}:{a:()=>un(g,r,!0,!0),b:()=>un(r,p,!0,!0)}}};const D1={kernelName:nf,gradFunc:(r,l,u)=>{const{blockShape:p,crops:g}=u;return{x:()=>zI(r,p,g)}}};const k1={kernelName:sf,gradFunc:(r,l,u)=>{const p=u,g=p.inputShape,f=p.shape,I=Array.from(f);for(let x=g.length-1;x>=0;x--)if(g[x]===f[x])I[x]=1;else if(g[x]!==1)throw new Error(`broadcastTo(): [${g}] cannot be broadcast to [${f}].`);const S=[];for(let x=0;x1&&S.push(x);return{x:()=>Fe(r,S,!0)}}};const F1={kernelName:Dc,gradFunc:r=>({x:()=>r.clone()})};const _1={kernelName:U2,gradFunc:r=>({x:()=>je(r)})};const W1={kernelName:B2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{clipValueMin:g,clipValueMax:f}=u;return{x:()=>Mn(ca(gr(p,g),yr(p,f)),r,je(r))}}};const $1={kernelName:rf,saveAllInputs:!0,gradFunc:(r,l,u)=>{const p=l.map(x=>x.shape),{axis:g}=u,f=ut(g,l[0].shape)[0],I=p.map(x=>x[f]),S=ho(r,I,f);return S.map(x=>()=>x)}};const U1={kernelName:of,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{dilations:f,strides:I,pad:S,dataFormat:x}=u;return Z(oo(f),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${f}'`),{x:()=>CO(p.shape,r,g,I,S,x),filter:()=>fg(p,r,g.shape,I,S,x)}}};const B1={kernelName:af,inputsToSave:["dy","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{strides:f,pad:I,dataFormat:S,dimRoundingMode:x}=u;return{dy:()=>AI(r,g,f,I,S,1,x),filter:()=>fg(r,p,g.shape,f,I,S,x)}}};function dZ(r,l,u,p,g){let f=r;r.rank===4&&(f=ie(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let I=l;I.rank===4&&(I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(f.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${f.shape}.`),Z(I.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${I.shape}.`),Z(u.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${u}.`),Z(f.shape[4]===u[3],()=>`Error in conv3dDerFilter: depth of input ${f.shape[4]}) must match input depth in filter (${u[3]}.`),Z(I.shape[4]===u[4],()=>`Error in conv3dDerFilter: depth of dy (${I.shape[4]}) must match output depth for filter (${u[4]}).`);const S=O=>{const C=1,U=Ru(f.shape,u,p,C,g);return O.conv3dDerFilter(f,I,U)},x={x:f,y:I},v={strides:p,pad:g};return Y.runKernelFunc(S,x,null,G2,v)}const M1=z({conv3DBackpropFilter_:dZ});const P1={kernelName:z2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f}=u;Z(oo(p),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${p}'`);const[I,S]=l;return{x:()=>RO(I.shape,r,S,g,f),filter:()=>M1(I,r,S.shape,g,f)}}};const z1={kernelName:cf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(yt(VI(Le(u,"float32"))),r)}}};const G1={kernelName:lf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(YI(Le(u,"float32")),r)}}};const V1={kernelName:hf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{axis:g,exclusive:f,reverse:I}=u;return{x:()=>{const S=ds([g],p.rank);let x=NI(r,g,f,!I);return S!=null&&(x=$t(x,S)),x}}}};const Y1={kernelName:H2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f,dimRoundingMode:I}=u,S=p==null?[1,1]:p;Z(oo(S),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${S}'`);const[x,v]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(v.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${v.rank}.`),Z(x.shape[3]===v.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${v.shape[2]}.`),Z(ao(g,S),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${g} and dilations '${S}'.`),I!=null&&Z(Qt(f),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=fr(x.shape,v.shape,g,S,f,I,!0);return{x:()=>_O(x.shape,r,v,O),filter:()=>FO(x,r,v.shape,O)}}};const H1={kernelName:K2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,f={x:p,filter:g,dy:r},I={x:p,filter:g,dy:r};return{x:()=>Y.runKernel(X2,f,u),filter:()=>Y.runKernel(J2,I,u)}}};const q1={kernelName:uf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=Nt(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=dt(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const j1={kernelName:Z2,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l,p=f=>f.eluDer(r,u),g={dy:r,y:u};return{x:()=>Y.runKernelFunc(p,g,null,Q2)}}};const K1={kernelName:eR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(Pn(yt(dt(u))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,p)}}};const X1={kernelName:df,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,u)}}};const J1={kernelName:nR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Pn(u))}}};const Z1={kernelName:pf,gradFunc:r=>({x:()=>je(r)})};const Q1={kernelName:mf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=Nt(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=dt(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const eE={kernelName:oR,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,u)=>{const{varianceEpsilon:p}=u,[g,f,I,S]=l,x=S==null?ke(1):S,v=Nt(f.shape,g.shape),O=[];if(f.rank===1){for(let Te=0;Tef.rank===1?ie(ae(ae(r,oa(ie(G,[1,1,1,f.shape[0]]),O)),x),g.shape):ie(ae(ae(r,G),x),g.shape),oe=()=>{let Te=ae(ae(G,ke(-1)),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},ge=()=>{let Te=ae(ae(ne,C),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},fe=()=>{const Te=ae(C,G);let Ve=ae(r,Te);return f.rank===1&&(Ve=Fe(Ve,v)),ie(Ve,f.shape)},Ae=()=>{let Te=r;return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)};return{x:te,mean:oe,variance:ge,scale:fe,offset:Ae}}};const sE={kernelName:ff,inputsToSave:["x","indices"],gradFunc:(r,l,u)=>{const[p,g]=l,{axis:f}=u,I=ut(f,p.shape)[0],S=()=>{const x=p.shape,v=g.size,O=x.slice(0,I),C=O.length,U=x.slice(f,x.length).slice(1),G=U.length,ne=tE(0,C),te=tE(C+1,C+1+G),oe=nE([O,[v],U]),ge=ie(r,oe),fe=ie(g,[v]),Ae=nE([[C],ne,te]),Te=$t(ge,Ae);let Ve=KI(Te,fe,p.shape[I]);const rt=Uc(Ae);return Ve=$t(Ve,rt),Ve};return{x:S,indices:()=>g}}};function tE(r,l){const u=[];for(let p=r;p{const[u,p]=l;return{a:()=>je(u),b:()=>je(p)}}};const rE={kernelName:yf,gradFunc:r=>({x:()=>Le(r,"float32")})};const oE={kernelName:hR,gradFunc:r=>({x:()=>je(r)})};const aE={kernelName:uR,gradFunc:r=>({x:()=>je(r)})};const cE={kernelName:dR,gradFunc:r=>({x:()=>je(r)})};const lE={kernelName:wf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(u,1))}}};const hE={kernelName:bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Le(u,"float32"))}}};const uE={kernelName:yR,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{axis:g}=u;return{logits:()=>{const f=!0,I=Pn(p);return Be(r,ae(Fe(r,g,f),I))}}}};function pZ(r,l,u,p=5,g=1,f=1,I=.5){const S=O=>O.LRNGrad(u,r,l,p,g,f,I),x={x:r,y:l,dy:u},v={depthRadius:p,bias:g,alpha:f,beta:I};return Y.runKernelFunc(S,x,null,wR,v)}const dE=z({localResponseNormalizationBackprop_:pZ});const pE={kernelName:bR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{depthRadius:f,bias:I,alpha:S,beta:x}=u;return{x:()=>dE(p,g,r,f,I,S,x)}}};function bg(r,l,u,p,g){return l.rank{const f=ae(r,Le(CI(u,l),r.dtype));return g==null?f:$t(f,g)}}}const JI={kernelName:Lf,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{reductionIndices:g}=p,[f,I]=l,S=ut(g,f.shape),x=ds(S,f.rank),v=bg(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=$t(O)),O}}}};const mE={kernelName:Sf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(gr(u,p),"float32")),f=()=>ae(r,Le(FI(u,p),"float32"));return{a:g,b:f}}};function mZ(r,l,u,p,g,f=[1,1,1],I,S){const x=M(r,"dy","maxPool3dBackprop"),v=M(l,"input","maxPool3dBackprop"),O=M(u,"output","maxPool3dBackprop");let C=x,U=v,G=O,ne=!1;v.rank===4&&(ne=!0,C=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),U=ie(v,[1,v.shape[0],v.shape[1],v.shape[2],v.shape[3]]),G=ie(O,[1,O.shape[0],O.shape[1],O.shape[2],O.shape[3]])),Z(C.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${C.rank}.`),Z(U.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${U.rank}.`),Z(G.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${G.rank}.`),Z(ao(g,f),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${g} and dilations '${f}'`),S!=null&&Z(Qt(I),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${I}.`);const te=Ae=>{const Te=cg(U.shape,p,g,f,I,S);return Ae.maxPool3dBackprop(C,U,G,Te)},oe={dy:C,input:U,output:G},ge={filterSize:p,strides:g,dilations:f,pad:I,dimRoundingMode:S},fe=Y.runKernelFunc(te,oe,null,xR,ge);return ne?ie(fe,[fe.shape[1],fe.shape[2],fe.shape[3],fe.shape[4]]):fe}const fE=z({maxPool3dBackprop_:mZ});const gE={kernelName:IR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,dilations:S,pad:x,dimRoundingMode:v}=u,O=S==null?[1,1,1]:S;return{x:()=>fE(r,p,g,f,I,O,x,v)}}};function fZ(r,l,u,p,g,f,I){const S=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),v=M(u,"output","maxPoolBackprop");Z(x.rank===S.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${S.rank})`),Z(S.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${S.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),I!=null&&Z(Qt(f),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=G=>{const ne=ag(x.shape,p,g,1,f,I);return G.maxPoolBackprop(S,x,v,ne)},C={dy:S,input:x,output:v},U={filterSize:p,strides:g,pad:f,dimRoundingMode:I};return Y.runKernelFunc(O,C,null,SR,U)}const yE=z({maxPoolBackprop_:fZ});const bE={kernelName:LR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,pad:S}=u;return{x:()=>yE(r,p,g,f,I,S)}}};const wE={kernelName:If,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{axis:g}=p,[f,I]=l,S=ut(g,f.shape),x=ds(S,f.rank),v=bg(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=$t(O)),O}}}};const LE={kernelName:xf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(yr(u,p),"float32")),f=()=>ae(r,Le(yi(u,p),"float32"));return{a:g,b:f}}};const SE={kernelName:TR,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Nt(u.shape,g);return S.length>0?ie(Fe(r,S),u.shape):r},I=()=>{const S=ae(r,yt(EI(Pe(u,p)))),x=Nt(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const IE={kernelName:Tf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=ae(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{const S=ae(r,Le(u,"float32")),x=Nt(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const xE={kernelName:Af,gradFunc:r=>({x:()=>yt(r)})};const TE={kernelName:OR,inputsToSave:["indices"],gradFunc:(r,l)=>{const u=l[0];return{indices:()=>Ds(u.shape,"float32")}}};const AE={kernelName:RR,gradFunc:r=>({x:()=>je(r)})};const ZI={kernelName:vf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const p=l[0],{paddings:g}=u,f=g.map(I=>I[0]);return{x:()=>vt(r,f,p.shape)}}};const vE={kernelName:Nf,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[u,p,g]=l,f=u,I=p,S=it(f.shape,I.shape),x=()=>{const O=Le(I,"float32");let C=ae(r,ae(O,la(f,Be(O,ke(1)))));const U=Nt(f.shape,S);return U.length>0&&(C=Fe(C,U)),ie(C,f.shape)},v=()=>{const O=yi(f,0),C=Mn(O,co(f),je(f));let U=ae(r,ae(g,C));const G=Nt(I.shape,S);return G.length>0&&(U=Fe(U,G)),ie(U,I.shape)};return{a:x,b:v}}};const NE={kernelName:ER,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[u,p]=l,g=yi(u,0);return{x:()=>Mn(g,r,ae(r,p)),alpha:()=>{let f=Mn(g,je(r),ae(r,u));const I=Nt(p.shape,r.shape);return I.length>0&&(f=Fe(f,I)),ie(f,p.shape)}}}};const CE={kernelName:FR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,yt(dt(u)))}}};const RE={kernelName:$R,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(yr(u,6),ha(u));return{x:()=>ae(r,Le(p,"float32"))}}};const OE={kernelName:Cf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Le(ha(u),"float32"))}}};const EE={kernelName:Rf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ie(r,u.shape)}}};const DE={kernelName:Ef,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeBilinearBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,WR,u);return{images:I}}};const kE={kernelName:Of,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeNearestNeighborBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,_R,u);return{images:I}}};const FE={kernelName:Df,gradFunc:(r,l,u)=>{const{dims:p}=u,g=ut(p,r.shape);return{x:()=>zc(r,g)}}};const _E={kernelName:UR,gradFunc:r=>({x:()=>je(r)})};const WE={kernelName:kf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>yt(Pe(r,ae(la(u,1.5),2)))}}};const $E={kernelName:Ff,inputsToSave:["condition"],gradFunc:(r,l)=>{const[u]=l;return{condition:()=>Le(je(u),"float32"),t:()=>ae(r,Le(u,r.dtype)),e:()=>ae(r,Le($I(u),r.dtype))}}};const UE={kernelName:BR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=yi(u,ke(0)),g=ke(p1),f=ke(m1),I=ae(r,f),S=ae(ae(r,g),Pn(Le(u,"float32")));return Mn(p,I,S)}}}};const BE={kernelName:Uf,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(u,Be(ke(1),u)))}}};const ME={kernelName:MR,gradFunc:r=>({x:()=>je(r)})};const PE={kernelName:Wf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Ou(Le(u,"float32")),r)}}};const zE={kernelName:$f,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(vI(Le(u,"float32")),r)}}};const GE={kernelName:_f,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{begin:g,size:f}=u,I=p.shape,[S,x]=rg(p,g,f),v=[];for(let O=0;OPI(r,v)}}};const VE={kernelName:zR,outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{dim:g}=u,f=!0,I=ae(r,p);return{logits:()=>Be(I,ae(Fe(I,[g],f),p))}}};const YE={kernelName:PR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,xI(u))}}};const QI={kernelName:Pf,gradFunc:(r,l,u)=>{const{blockShape:p,paddings:g}=u;return{x:()=>TI(r,p,g)}}};const ex={kernelName:zf,gradFunc:(r,l,u)=>{const{axis:p}=u;return{x:()=>yn(r,p)}}};const HE={kernelName:Bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ae(ps(Le(u,"float32")),2))}}};const qE={kernelName:GR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(Le(u,"float32"),2))}}};const jE={kernelName:Gf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=ke(2),f=()=>ae(r,ae(g,Be(u,p))),I=()=>ae(r,ae(g,Be(p,u)));return{a:f,b:I}}};const KE={kernelName:Xf,gradFunc:r=>({x:()=>je(r)})};const XE={kernelName:Vf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=Nt(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=Nt(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(yt(S),p.shape)};return{a:f,b:I}}};const JE={kernelName:Mf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,g=p.shape.slice(),{axis:f}=u,I=ut(f,p.shape);I.forEach(v=>{g[v]=1});const S=ie(r,g),x=ae(S,Yi(p.shape,"float32"));return{x:()=>x}}};const ZE={kernelName:VR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,dt(Ou(u)))}}};const QE={kernelName:YR,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Be(ke(1),dt(u)),r)}}};const eD={kernelName:Yf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{reps:g}=u,f=()=>{let I=je(p);if(p.rank===1)for(let S=0;S{const p=u,{perm:g}=p,f=Uc(g);return{x:()=>$t(r,f)}}};const nD={kernelName:qf,gradFunc:(r,l,u)=>{const p=u,{axis:g}=p;return{value:()=>qs(r,g)}}};const sD={kernelName:jf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[u]=l,p=()=>gZ(r,u);return{x:p}}};function gZ(r,l){const u=kI(l,je(l)),p=DI(r,u);let g=gr(l,ke(0,"int32"));const f=p.rank-g.rank;for(let S=0;S({x:()=>je(r)})};const yZ=[f1,g1,y1,b1,w1,L1,S1,I1,x1,T1,A1,v1,C1,O1,E1,D1,k1,F1,_1,W1,$1,B1,U1,P1,z1,G1,V1,Y1,H1,q1,j1,K1,X1,J1,Q1,Z1,eE,sE,iE,rE,oE,aE,cE,lE,hE,uE,pE,JI,JI,mE,gE,bE,wE,LE,SE,IE,xE,TE,AE,ZI,ZI,vE,NE,CE,RE,OE,EE,DE,kE,FE,_E,WE,$E,UE,BE,ME,PE,zE,GE,VE,YE,QI,QI,ex,ex,HE,jE,qE,KE,XE,JE,ZE,QE,eD,tD,nD,sD,iD];for(const r of yZ)jR(r);function Gm(r,l,u=!1){const{Image:p,Canvas:g}=mt.getEnv();if(!(r instanceof p||r instanceof g))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const f=to(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=Zo({width:l,height:l}),O=r instanceof g?r:Ac(r),C=Math.abs(S-x)/2,U=u&&S{if(dr(u)){this._imageTensors[p]=u,this._inputDimensions[p]=u.shape;return}if(Cs(u)){const f=u.shape[0];if(f!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${f} passed, but not supported in input array`);this._imageTensors[p]=u,this._inputDimensions[p]=u.shape.slice(1);return}const g=u instanceof mt.getEnv().Canvas?u:Ac(u);this._canvases[p]=g,this._inputDimensions[p]=[g.height,g.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 Bi(this.batchSize,0,1).map((r,l)=>this.getReshapedInputDimensions(l))}getInput(r){return this.canvases[r]||this.imageTensors[r]}getInputDimensions(r){return this._inputDimensions[r]}getInputHeight(r){return this._inputDimensions[r][0]}getInputWidth(r){return this._inputDimensions[r][1]}getReshapedInputDimensions(r){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");const l=this.getInputWidth(r),u=this.getInputHeight(r);return HS({width:l,height:u},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,IO(()=>{const u=Bi(this.batchSize,0,1).map(g=>{const f=this.getInput(g);if(f instanceof xn){let I=Cs(f)?f:f.expandDims();return I=Nm(I,l),(I.shape[1]!==r||I.shape[2]!==r)&&(I=d1.resizeBilinear(I,[r,r])),I.as3D(r,r,3)}if(f instanceof mt.getEnv().Canvas)return LI.fromPixels(Gm(f,r,l));throw new Error(`toBatchTensor - at batchIdx ${g}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${f}`)}),p=qs(u.map(g=>Le(g,"float32"))).as4D(this.batchSize,r,r,3);return p})}}async function Tt(r){if(r instanceof hr)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const u=g=>Array.isArray(r)?` at input index ${g}:`:"",p=l.map(eo);return p.forEach((g,f)=>{if(!bu(g)&&!dr(g)&&!Cs(g))throw typeof l[f]=="string"?new Error(`toNetInput -${u(f)} string passed, but could not resolve HTMLElement for element id ${l[f]}`):new Error(`toNetInput -${u(f)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Cs(g)){const I=g.shape[0];if(I!==1)throw new Error(`toNetInput -${u(f)} tf.Tensor4D with batchSize ${I} passed, but not supported in input array`)}}),await Promise.all(p.map(g=>bu(g)&&qm(g))),new hr(p,Array.isArray(r))}async function Xo(r,l){const{Canvas:u}=mt.getEnv();let p=r;if(!(r instanceof u)){const I=await Tt(r);if(I.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const S=I.getInput(0);p=S instanceof u?S:await Vm(S)}const g=Un(p),f=l.map(I=>I instanceof Wt?I.forSize(p.width,p.height).box.floor():I).map(I=>I.clipAtImageBorders(p.width,p.height));return f.map(({x:I,y:S,width:x,height:v})=>{const O=Zo({width:x,height:v});return Un(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const wg=Xe(Je());async function Jo(r,l){if(!dr(r)&&!Cs(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Cs(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return wg.tidy(()=>{const[u,p,g]=r.shape.slice(Cs(r)?1:0),f=l.map(S=>S instanceof Wt?S.forSize(p,u).box:S).map(S=>S.clipAtImageBorders(p,u)),I=f.map(({x:S,y:x,width:v,height:O})=>wg.slice3d(r.as3D(u,p,g),[x,S,0],[O,v,g]));return I})}async function no(r,l){const u=mt.getEnv().fetch,p=await u(r,l);if(!(p.status<400))throw new Error(`failed to fetch: (${p.status}) ${p.statusText}, from url: ${p.url}`);return p}async function p2(r){const l=await no(r),u=await l.blob();if(!u.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${u.type}, for url: ${l.url}`);return Hm(u)}async function Ym(r){return(await no(r)).json()}async function d2(r){return new Float32Array(await(await no(r)).arrayBuffer())}function Lg(r,l){const u=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:u};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${u}`};const p=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(p,"");const g=r.split("/").filter(S=>S),f=r.endsWith(".json")?g[g.length-1]:u;let I=p+(r.endsWith(".json")?g.slice(0,g.length-1):g).join("/");return I=r.startsWith("/")?`/${I}`:I,{modelBaseUri:I,manifestUri:I==="/"?`/${f}`:`${I}/${f}`}}const rD=Xe(Je());async function zm(r,l){const{manifestUri:u,modelBaseUri:p}=Lg(r,l);let g=await Ym(u);return rD.io.loadWeights(g,p)}function u2(r,l,u=!1){const{width:p,height:g}=u?to(l):l;return r.width=p,r.height=g,{width:p,height:g}}const br=Xe(Je());class In{constructor(r){this._name=r;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(r){const{obj:l,objProp:u}=this.traversePropertyPath(r);return l[u]}reassignParamFromPath(r,l){const{obj:u,objProp:p}=this.traversePropertyPath(r);u[p].dispose(),u[p]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof br.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof br.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const u=br.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,u)})}dispose(r=!0){this.getParamList().forEach(l=>{if(r&&l.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${l.path}`);l.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:r})=>Array.from(r.dataSync())).reduce((r,l)=>r.concat(l)))}async load(r){if(r instanceof Float32Array){this.extractWeights(r);return}await this.loadFromUri(r)}async loadFromUri(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);const l=await zm(r,this.getDefaultModelName());this.loadFromWeightMap(l)}async loadFromDisk(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);const{readFile:l}=mt.getEnv(),{manifestUri:u,modelBaseUri:p}=Lg(r,this.getDefaultModelName()),g=x=>Promise.all(x.map(v=>l(v).then(O=>O.buffer))),f=br.io.weightsLoaderFactory(g),I=JSON.parse((await l(u)).toString()),S=await f(I,p);this.loadFromWeightMap(S)}loadFromWeightMap(r){const{paramMappings:l,params:u}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=u}extractWeights(r){const{paramMappings:l,params:u}=this.extractParams(r);this._paramMappings=l,this._params=u}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((g,f)=>{if(!g.nextObj.hasOwnProperty(f))throw new Error(`traversePropertyPath - object does not have property ${f}, for path ${r}`);return{obj:g.nextObj,objProp:f,nextObj:g.nextObj[f]}},{nextObj:this.params}),{obj:u,objProp:p}=l;if(!u||!p||!(u[p]instanceof br.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:u,objProp:p}}}const Vc=Xe(Je());function es(r,l,u){return Vc.tidy(()=>{let p=Vc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Vc.add(p,l.bias),p})}const Dt=Xe(Je());function Sg(r,l,u=!1){return Dt.tidy(()=>{const p=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):es(r,l.conv0,[2,2])),g=es(p,l.conv1,[1,1]),f=Dt.relu(Dt.add(p,g)),I=es(f,l.conv2,[1,1]);return Dt.relu(Dt.add(p,Dt.add(g,I)))})}function Wu(r,l,u=!1,p=!0){return Dt.tidy(()=>{const g=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,p?[2,2]:[1,1],"same"),l.conv0.bias):es(r,l.conv0,p?[2,2]:[1,1])),f=es(g,l.conv1,[1,1]),I=Dt.relu(Dt.add(g,f)),S=es(I,l.conv2,[1,1]),x=Dt.relu(Dt.add(g,Dt.add(f,S))),v=es(x,l.conv3,[1,1]);return Dt.relu(Dt.add(g,Dt.add(f,Dt.add(S,v))))})}const uo=Xe(Je());function da(r,l,u="same",p=!1){return uo.tidy(()=>{const g=uo.add(uo.conv2d(r,l.filters,[1,1],u),l.bias);return p?uo.relu(g):g})}function zn(r,l){Object.keys(r).forEach(u=>{l.some(p=>p.originalPath===u)||r[u].dispose()})}const Ig=Xe(Je());function Yc(r,l){return function(u,p,g,f){const I=Ig.tensor4d(r(u*p*g*g),[g,g,u,p]),S=Ig.tensor1d(r(p));return l.push({paramPath:`${f}/filters`},{paramPath:`${f}/bias`}),{filters:I,bias:S}}}const xg=Xe(Je());function Tg(r,l){return function(u,p,g){const f=xg.tensor2d(r(u*p),[u,p]),I=xg.tensor1d(r(p));return l.push({paramPath:`${g}/weights`},{paramPath:`${g}/bias`}),{weights:f,bias:I}}}class tx{constructor(r,l,u){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=u}}const $u=Xe(Je());function Hc(r,l){return function(u,p,g){const f=$u.tensor4d(r(3*3*u),[3,3,u,1]),I=$u.tensor4d(r(u*p),[1,1,u,p]),S=$u.tensor1d(r(p));return l.push({paramPath:`${g}/depthwise_filter`},{paramPath:`${g}/pointwise_filter`},{paramPath:`${g}/bias`}),new tx(f,I,S)}}function qc(r){return function(l){const u=r(`${l}/depthwise_filter`,4),p=r(`${l}/pointwise_filter`,4),g=r(`${l}/bias`,1);return new tx(u,p,g)}}function ms(r,l){return function(u,p,g){const f=r[u];if(!ea(f,p))throw new Error(`expected weightMap[${u}] to be a Tensor${p}D, instead have ${f}`);return l.push({originalPath:u,paramPath:g||u}),f}}function Gn(r){let l=r;function u(g){const f=l.slice(0,g);return l=l.slice(g),f}function p(){return l}return{extractWeights:u,getRemainingWeights:p}}function Ag(r,l){const u=Yc(r,l),p=Hc(r,l);function g(I,S,x,v=!1){const O=v?u(I,S,3,`${x}/conv0`):p(I,S,`${x}/conv0`),C=p(S,S,`${x}/conv1`),U=p(S,S,`${x}/conv2`);return{conv0:O,conv1:C,conv2:U}}function f(I,S,x,v=!1){const{conv0:O,conv1:C,conv2:U}=g(I,S,x,v),G=p(S,S,`${x}/conv3`);return{conv0:O,conv1:C,conv2:U,conv3:G}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:f}}function oD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractDenseBlock4Params:g}=Ag(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2"),x=g(128,256,"dense3");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S,dense3:x}}}function vg(r){return function(l){const u=r(`${l}/filters`,4),p=r(`${l}/bias`,1);return{filters:u,bias:p}}}function Ng(r,l){const u=ms(r,l),p=vg(u),g=qc(u);function f(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`);return{conv0:v,conv1:O,conv2:C}}function I(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`),U=g(`${S}/conv3`);return{conv0:v,conv1:O,conv2:C,conv3:U}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:I}}function aD(r){const l=[],{extractDenseBlock4Params:u}=Ng(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2"),dense3:u("dense3")};return zn(r,l),{params:p,paramMappings:l}}const jc=Xe(Je());class Cg extends In{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return jc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(jc.scalar(255));let f=Wu(g,l.dense0,!0);return f=Wu(f,l.dense1),f=Wu(f,l.dense2),f=Wu(f,l.dense3),f=jc.avgPool(f,[7,7],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return aD(r)}extractParams(r){return oD(r)}}const Kc=Xe(Je());function Uu(r,l){return Kc.tidy(()=>Kc.add(Kc.matMul(r,l.weights),l.bias))}function cD(r,l,u){const p=[],{extractWeights:g,getRemainingWeights:f}=Gn(r),I=Tg(g,p),S=I(l,u,"fc");if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:p,params:{fc:S}}}function lD(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:p("fc")};return zn(r,l),{params:g,paramMappings:l}}function Rg(r){const l={},u={};return Object.keys(r).forEach(p=>{const g=p.startsWith("fc")?u:l;g[p]=r[p]}),{featureExtractorMap:l,classifierMap:u}}const hD=Xe(Je());class Og extends In{constructor(r,l){super(r);this._faceFeatureExtractor=l}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return hD.tidy(()=>{const u=r instanceof hr?this.faceFeatureExtractor.forwardInput(r):r;return Uu(u.as2D(u.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return cD(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Rg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),lD(u)}extractParams(r){const l=this.getClassifierChannelsIn(),u=this.getClassifierChannelsOut(),p=u*l+u,g=r.slice(0,r.length-p),f=r.slice(r.length-p);return this.faceFeatureExtractor.extractWeights(g),this.extractClassifierParams(f)}}const Bm=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class Qr{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);Bm.forEach((l,u)=>{this[l]=r[u]})}asSortedArray(){return Bm.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Xc=Xe(Je());class Mm extends Og{constructor(r=new Cg){super("FaceExpressionNet",r)}forwardInput(r){return Xc.tidy(()=>Xc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Tt(r))}async predictExpressions(r){const l=await Tt(r),u=await this.forwardInput(l),p=await Promise.all(Xc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new Qr(f));return l.isBatchInput?g:g[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function $m(r){return r.expressions instanceof Qr}function fu(r,l){const u={expressions:l};return Object.assign({},r,u)}function bZ(r,l,u=.1,p){const g=Array.isArray(l)?l:[l];g.forEach(f=>{const I=f instanceof Qr?f:$m(f)?f.expressions:void 0;if(!I)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const S=I.asSortedArray(),x=S.filter(C=>C.probability>u),v=mi(f)?f.detection.box.bottomLeft:p||new qe(0,0),O=new Oc(x.map(C=>`${C.expression} (${ta(C.probability)})`),v);O.draw(r)})}function Jr(r){return mi(r)&&r.landmarks instanceof Ns&&r.unshiftedLandmarks instanceof Ns&&r.alignedRect instanceof Wt}function Ko(r,l){const{box:u}=r.detection,p=l.shiftBy(u.x,u.y),g=p.align(),{imageDims:f}=r.detection,I=new Wt(r.detection.score,g.rescale(f.reverse()),f),S={landmarks:p,unshiftedLandmarks:l,alignedRect:I};return Object.assign({},r,S)}class uD{constructor(r={}){const{drawLines:l=!0,drawPoints:u=!0,lineWidth:p,lineColor:g,pointSize:f,pointColor:I}=r;this.drawLines=l,this.drawPoints=u,this.lineWidth=p||1,this.pointSize=f||2,this.lineColor=g||"rgba(0, 255, 255, 1)",this.pointColor=I||"rgba(255, 0, 255, 1)"}}class dD{constructor(r,l={}){this.faceLandmarks=r,this.options=new uD(l)}draw(r){const l=Un(r),{drawLines:u,drawPoints:p,lineWidth:g,lineColor:f,pointSize:I,pointColor:S}=this.options;if(u&&this.faceLandmarks instanceof Nc&&(l.strokeStyle=f,l.lineWidth=g,ur(l,this.faceLandmarks.getJawOutline()),ur(l,this.faceLandmarks.getLeftEyeBrow()),ur(l,this.faceLandmarks.getRightEyeBrow()),ur(l,this.faceLandmarks.getNose()),ur(l,this.faceLandmarks.getLeftEye(),!0),ur(l,this.faceLandmarks.getRightEye(),!0),ur(l,this.faceLandmarks.getMouth(),!0)),p){l.strokeStyle=S,l.fillStyle=S;const x=v=>{l.beginPath(),l.arc(v.x,v.y,I,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function wZ(r,l){const u=Array.isArray(l)?l:[l];u.forEach(p=>{const g=p instanceof Ns?p:Jr(p)?p.landmarks:void 0;if(!g)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new dD(g).draw(r)})}const Im={};uu(Im,{AnchorPosition:()=>Pi,DrawBox:()=>QS,DrawBoxOptions:()=>b2,DrawFaceLandmarks:()=>dD,DrawFaceLandmarksOptions:()=>uD,DrawTextField:()=>Oc,DrawTextFieldOptions:()=>Zm,drawContour:()=>ur,drawDetections:()=>E7,drawFaceExpressions:()=>bZ,drawFaceLandmarks:()=>wZ});function LZ(r,l){const u=Yc(r,l),p=Hc(r,l);function g(I,S,x){const v=p(I,S,`${x}/separable_conv0`),O=p(S,S,`${x}/separable_conv1`),C=u(I,S,1,`${x}/expansion_conv`);return{separable_conv0:v,separable_conv1:O,expansion_conv:C}}function f(I,S){const x=p(I,I,`${S}/separable_conv0`),v=p(I,I,`${S}/separable_conv1`),O=p(I,I,`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:u,extractSeparableConvParams:p,extractReductionBlockParams:g,extractMainBlockParams:f}}function pD(r,l){const u=[],{extractWeights:p,getRemainingWeights:g}=Gn(r),{extractConvParams:f,extractSeparableConvParams:I,extractReductionBlockParams:S,extractMainBlockParams:x}=LZ(p,u),v=f(3,32,3,"entry_flow/conv_in"),O=S(32,64,"entry_flow/reduction_block_0"),C=S(64,128,"entry_flow/reduction_block_1"),U={conv_in:v,reduction_block_0:O,reduction_block_1:C},G={};Bi(l,0,1).forEach(ge=>{G[`main_block_${ge}`]=x(128,`middle_flow/main_block_${ge}`)});const ne=S(128,256,"exit_flow/reduction_block"),te=I(256,512,"exit_flow/separable_conv"),oe={reduction_block:ne,separable_conv:te};if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:u,params:{entry_flow:U,middle_flow:G,exit_flow:oe}}}function SZ(r,l){const u=ms(r,l),p=vg(u),g=qc(u);function f(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=p(`${S}/expansion_conv`);return{separable_conv0:x,separable_conv1:v,expansion_conv:O}}function I(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=g(`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}}function mD(r,l){const u=[],{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}=SZ(r,u),S=p("entry_flow/conv_in"),x=f("entry_flow/reduction_block_0"),v=f("entry_flow/reduction_block_1"),O={conv_in:S,reduction_block_0:x,reduction_block_1:v},C={};Bi(l,0,1).forEach(te=>{C[`main_block_${te}`]=I(`middle_flow/main_block_${te}`)});const U=f("exit_flow/reduction_block"),G=g("exit_flow/separable_conv"),ne={reduction_block:U,separable_conv:G};return zn(r,u),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:u}}const dn=Xe(Je());function fD(r,l,u){return dn.add(dn.conv2d(r,l.filters,u,"same"),l.bias)}function nx(r,l,u=!0){let p=u?dn.relu(r):r;return p=es(p,l.separable_conv0,[1,1]),p=es(dn.relu(p),l.separable_conv1,[1,1]),p=dn.maxPool(p,[3,3],[2,2],"same"),p=dn.add(p,fD(r,l.expansion_conv,[2,2])),p}function IZ(r,l){let u=es(dn.relu(r),l.separable_conv0,[1,1]);return u=es(dn.relu(u),l.separable_conv1,[1,1]),u=es(dn.relu(u),l.separable_conv2,[1,1]),u=dn.add(u,r),u}class gD extends In{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return dn.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(dn.scalar(256));let f=dn.relu(fD(g,l.entry_flow.conv_in,[2,2]));return f=nx(f,l.entry_flow.reduction_block_0,!1),f=nx(f,l.entry_flow.reduction_block_1),Bi(this._numMainBlocks,0,1).forEach(I=>{f=IZ(f,l.middle_flow[`main_block_${I}`])}),f=nx(f,l.exit_flow.reduction_block),f=dn.relu(es(f,l.exit_flow.separable_conv,[1,1])),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return mD(r,this._numMainBlocks)}extractParams(r){return pD(r,this._numMainBlocks)}}function yD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),g=Tg(u,l),f=g(512,1,"fc/age"),I=g(512,2,"fc/gender");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{fc:{age:f,gender:I}}}}function bD(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:{age:p("fc/age"),gender:p("fc/gender")}};return zn(r,l),{params:g,paramMappings:l}}var Ui;(function(r){r.FEMALE="female",r.MALE="male"})(Ui||(Ui={}));const Hi=Xe(Je());class jm extends In{constructor(r=new gD(2)){super("AgeGenderNet");this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return Hi.tidy(()=>{const u=r instanceof hr?this.faceFeatureExtractor.forwardInput(r):r,p=Hi.avgPool(u,[7,7],[2,2],"valid").as2D(u.shape[0],-1),g=Uu(p,l.fc.age).as1D(),f=Uu(p,l.fc.gender);return{age:g,gender:f}})}forwardInput(r){return Hi.tidy(()=>{const{age:l,gender:u}=this.runNet(r);return{age:l,gender:Hi.softmax(u)}})}async forward(r){return this.forwardInput(await Tt(r))}async predictAgeAndGender(r){const l=await Tt(r),u=await this.forwardInput(l),p=Hi.unstack(u.age),g=Hi.unstack(u.gender),f=p.map((S,x)=>({ageTensor:S,genderTensor:g[x]})),I=await Promise.all(f.map(async({ageTensor:S,genderTensor:x})=>{const v=(await S.data())[0],O=(await x.data())[0],C=O>.5,U=C?Ui.MALE:Ui.FEMALE,G=C?O:1-O;return S.dispose(),x.dispose(),{age:v,gender:U,genderProbability:G}}));return u.age.dispose(),u.gender.dispose(),l.isBatchInput?I:I[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return yD(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Rg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),bD(u)}extractParams(r){const l=512*1+1+(512*2+2),u=r.slice(0,r.length-l),p=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(u),this.extractClassifierParams(p)}}const fs=Xe(Je());class Eg extends Og{postProcess(r,l,u){const p=u.map(({width:f,height:I})=>{const S=l/Math.max(I,f);return{width:f*S,height:I*S}}),g=p.length;return fs.tidy(()=>{const f=(O,C)=>fs.stack([fs.fill([68],O),fs.fill([68],C)],1).as2D(1,136).as1D(),I=(O,C)=>{const{width:U,height:G}=p[O];return C(U,G)?Math.abs(U-G)/2:0},S=O=>I(O,(C,U)=>CI(O,(C,U)=>Uf(S(C),x(C))))).div(fs.stack(Array.from(Array(g),(O,C)=>f(p[C].width,p[C].height))));return v})}forwardInput(r){return fs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([u,p])=>({height:u,width:p})))})}async forward(r){return this.forwardInput(await Tt(r))}async detectLandmarks(r){const l=await Tt(r),u=fs.tidy(()=>fs.unstack(this.forwardInput(l))),p=await Promise.all(u.map(async(g,f)=>{const I=Array.from(await g.data()),S=I.filter((v,O)=>Km(O)),x=I.filter((v,O)=>!Km(O));return new Nc(Array(68).fill(0).map((v,O)=>new qe(S[O],x[O])),{height:l.getInputHeight(f),width:l.getInputWidth(f)})}));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getClassifierChannelsOut(){return 136}}class xc extends Eg{constructor(r=new Cg){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function wD(r){const l=[],{extractDenseBlock3Params:u}=Ng(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2")};return zn(r,l),{params:p,paramMappings:l}}function LD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractDenseBlock3Params:g}=Ag(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S}}}const Jc=Xe(Je());class SD extends In{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Jc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(Jc.scalar(255));let f=Sg(g,l.dense0,!0);return f=Sg(f,l.dense1),f=Sg(f,l.dense2),f=Jc.avgPool(f,[14,14],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return wD(r)}extractParams(r){return LD(r)}}class Um extends Eg{constructor(r=new SD){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class h2 extends xc{}const Dg=Xe(Je());function ID(r,l){return Dg.add(Dg.mul(r,l.weights),l.biases)}const Zc=Xe(Je());function sx(r,l,u,p,g="same"){const{filters:f,bias:I}=l.conv;let S=Zc.conv2d(r,f,u,g);return S=Zc.add(S,I),S=ID(S,l.scale),p?Zc.relu(S):S}function xD(r,l){return sx(r,l,[1,1],!0)}function ix(r,l){return sx(r,l,[1,1],!1)}function kg(r,l){return sx(r,l,[2,2],!0,"valid")}const gs=Xe(Je());function xZ(r,l){function u(S,x,v){const O=r(S),C=O.length/(x*v*v);if(YS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${v}`);return gs.tidy(()=>gs.transpose(gs.tensor4d(O,[x,C,v,v]),[2,3,1,0]))}function p(S,x,v,O){const C=u(S,x,v),U=gs.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:U}}function g(S,x){const v=gs.tensor1d(r(S)),O=gs.tensor1d(r(S));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:v,biases:O}}function f(S,x,v,O){const C=p(S,x,v,`${O}/conv`),U=g(x,`${O}/scale`);return{conv:C,scale:U}}function I(S,x,v,O,C=!1){const U=f((C?.5:1)*S,x,v,`${O}/conv1`),G=f(S,x,v,`${O}/conv2`);return{conv1:U,conv2:G}}return{extractConvLayerParams:f,extractResidualLayerParams:I}}function TD(r){const{extractWeights:l,getRemainingWeights:u}=Gn(r),p=[],{extractConvLayerParams:g,extractResidualLayerParams:f}=xZ(l,p),I=g(4704,32,7,"conv32_down"),S=f(9216,32,3,"conv32_1"),x=f(9216,32,3,"conv32_2"),v=f(9216,32,3,"conv32_3"),O=f(36864,64,3,"conv64_down",!0),C=f(36864,64,3,"conv64_1"),U=f(36864,64,3,"conv64_2"),G=f(36864,64,3,"conv64_3"),ne=f(147456,128,3,"conv128_down",!0),te=f(147456,128,3,"conv128_1"),oe=f(147456,128,3,"conv128_2"),ge=f(589824,256,3,"conv256_down",!0),fe=f(589824,256,3,"conv256_1"),Ae=f(589824,256,3,"conv256_2"),Te=f(589824,256,3,"conv256_down_out"),Ve=gs.tidy(()=>gs.transpose(gs.tensor2d(l(256*128),[128,256]),[1,0]));if(p.push({paramPath:"fc"}),u().length!==0)throw new Error(`weights remaing after extract: ${u().length}`);const rt={conv32_down:I,conv32_1:S,conv32_2:x,conv32_3:v,conv64_down:O,conv64_1:C,conv64_2:U,conv64_3:G,conv128_down:ne,conv128_1:te,conv128_2:oe,conv256_down:ge,conv256_1:fe,conv256_2:Ae,conv256_down_out:Te,fc:Ve};return{params:rt,paramMappings:p}}function TZ(r,l){const u=ms(r,l);function p(I){const S=u(`${I}/scale/weights`,1),x=u(`${I}/scale/biases`,1);return{weights:S,biases:x}}function g(I){const S=u(`${I}/conv/filters`,4),x=u(`${I}/conv/bias`,1),v=p(I);return{conv:{filters:S,bias:x},scale:v}}function f(I){return{conv1:g(`${I}/conv1`),conv2:g(`${I}/conv2`)}}return{extractConvLayerParams:g,extractResidualLayerParams:f}}function AD(r){const l=[],{extractConvLayerParams:u,extractResidualLayerParams:p}=TZ(r,l),g=u("conv32_down"),f=p("conv32_1"),I=p("conv32_2"),S=p("conv32_3"),x=p("conv64_down"),v=p("conv64_1"),O=p("conv64_2"),C=p("conv64_3"),U=p("conv128_down"),G=p("conv128_1"),ne=p("conv128_2"),te=p("conv256_down"),oe=p("conv256_1"),ge=p("conv256_2"),fe=p("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!VS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const Te={conv32_down:g,conv32_1:f,conv32_2:I,conv32_3:S,conv64_down:x,conv64_1:v,conv64_2:O,conv64_3:C,conv128_down:U,conv128_1:G,conv128_2:ne,conv256_down:te,conv256_1:oe,conv256_2:ge,conv256_down_out:fe,fc:Ae};return zn(r,l),{params:Te,paramMappings:l}}const Vn=Xe(Je());function bi(r,l){let u=xD(r,l.conv1);return u=ix(u,l.conv2),u=Vn.add(u,r),u=Vn.relu(u),u}function Bu(r,l){let u=kg(r,l.conv1);u=ix(u,l.conv2);let p=Vn.avgPool(r,2,2,"valid");const g=Vn.zeros(p.shape),f=p.shape[3]!==u.shape[3],I=p.shape[1]!==u.shape[1]||p.shape[2]!==u.shape[2];if(I){const S=[...u.shape];S[1]=1;const x=Vn.zeros(S);u=Vn.concat([u,x],1);const v=[...u.shape];v[2]=1;const O=Vn.zeros(v);u=Vn.concat([u,O],2)}return p=f?Vn.concat([p,g],3):p,u=Vn.add(p,u),u=Vn.relu(u),u}const ks=Xe(Je());class Ic extends In{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return ks.tidy(()=>{const u=ks.cast(r.toBatchTensor(150,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(ks.scalar(256));let f=kg(g,l.conv32_down);f=ks.maxPool(f,3,2,"valid"),f=bi(f,l.conv32_1),f=bi(f,l.conv32_2),f=bi(f,l.conv32_3),f=Bu(f,l.conv64_down),f=bi(f,l.conv64_1),f=bi(f,l.conv64_2),f=bi(f,l.conv64_3),f=Bu(f,l.conv128_down),f=bi(f,l.conv128_1),f=bi(f,l.conv128_2),f=Bu(f,l.conv256_down),f=bi(f,l.conv256_1),f=bi(f,l.conv256_2),f=Bu(f,l.conv256_down_out);const I=f.mean([1,2]),S=ks.matMul(I,l.fc);return S})}async forward(r){return this.forwardInput(await Tt(r))}async computeFaceDescriptor(r){const l=await Tt(r),u=ks.tidy(()=>ks.unstack(this.forwardInput(l))),p=await Promise.all(u.map(g=>g.data()));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return AD(r)}extractParams(r){return TD(r)}}function l2(r){const l=new Ic;return l.extractWeights(r),l}function gu(r,l){const u={descriptor:l};return Object.assign({},r,u)}function c2(r){return typeof r.age=="number"}function yu(r,l){const u={age:l};return Object.assign({},r,u)}function a2(r){return(r.gender===Ui.MALE||r.gender===Ui.FEMALE)&&Rc(r.genderProbability)}function mu(r,l,u){const p={gender:l,genderProbability:u};return Object.assign({},r,p)}const wi=Xe(Je());function AZ(r,l){function u(x,v){const O=wi.tensor4d(r(3*3*x),[3,3,x,1]),C=wi.tensor1d(r(x)),U=wi.tensor1d(r(x)),G=wi.tensor1d(r(x)),ne=wi.tensor1d(r(x));return l.push({paramPath:`${v}/filters`},{paramPath:`${v}/batch_norm_scale`},{paramPath:`${v}/batch_norm_offset`},{paramPath:`${v}/batch_norm_mean`},{paramPath:`${v}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:U,batch_norm_mean:G,batch_norm_variance:ne}}function p(x,v,O,C,U){const G=wi.tensor4d(r(x*v*O*O),[O,O,x,v]),ne=wi.tensor1d(r(v));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${U?"batch_norm_offset":"bias"}`}),{filters:G,bias:ne}}function g(x,v,O,C){const{filters:U,bias:G}=p(x,v,O,C,!0);return{filters:U,batch_norm_offset:G}}function f(x,v,O){const C=u(x,`${O}/depthwise_conv`),U=g(x,v,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:U}}function I(){const x=g(3,32,3,"mobilenetv1/conv_0"),v=f(32,64,"mobilenetv1/conv_1"),O=f(64,128,"mobilenetv1/conv_2"),C=f(128,128,"mobilenetv1/conv_3"),U=f(128,256,"mobilenetv1/conv_4"),G=f(256,256,"mobilenetv1/conv_5"),ne=f(256,512,"mobilenetv1/conv_6"),te=f(512,512,"mobilenetv1/conv_7"),oe=f(512,512,"mobilenetv1/conv_8"),ge=f(512,512,"mobilenetv1/conv_9"),fe=f(512,512,"mobilenetv1/conv_10"),Ae=f(512,512,"mobilenetv1/conv_11"),Te=f(512,1024,"mobilenetv1/conv_12"),Ve=f(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,conv_8:oe,conv_9:ge,conv_10:fe,conv_11:Ae,conv_12:Te,conv_13:Ve}}function S(){const x=g(1024,256,1,"prediction_layer/conv_0"),v=g(256,512,3,"prediction_layer/conv_1"),O=g(512,128,1,"prediction_layer/conv_2"),C=g(128,256,3,"prediction_layer/conv_3"),U=g(256,128,1,"prediction_layer/conv_4"),G=g(128,256,3,"prediction_layer/conv_5"),ne=g(256,64,1,"prediction_layer/conv_6"),te=g(64,128,3,"prediction_layer/conv_7"),oe=p(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),ge=p(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),fe=p(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=p(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),Te=p(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Ve=p(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=p(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),Ct=p(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),Ut=p(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=p(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Dn=p(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),An=p(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),vn={box_encoding_predictor:oe,class_predictor:ge},Zs={box_encoding_predictor:fe,class_predictor:Ae},Si={box_encoding_predictor:Te,class_predictor:Ve},Qs={box_encoding_predictor:rt,class_predictor:Ct},fa={box_encoding_predictor:Ut,class_predictor:Kt},ol={box_encoding_predictor:Dn,class_predictor:An};return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,box_predictor_0:vn,box_predictor_1:Zs,box_predictor_2:Si,box_predictor_3:Qs,box_predictor_4:fa,box_predictor_5:ol}}return{extractMobilenetV1Params:I,extractPredictionLayerParams:S}}function vD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractMobilenetV1Params:g,extractPredictionLayerParams:f}=AZ(u,l),I=g(),S=f(),x=wi.tensor3d(u(5118*4),[1,5118,4]),v={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{params:{mobilenetv1:I,prediction_layer:S,output_layer:v},paramMappings:l}}function vZ(r,l){const u=ms(r,l);function p(v,O,C){const U=u(`${v}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),G=u(`${v}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:U,batch_norm_offset:G}}function g(v){const O=`mobilenetv1/conv_${v}`,C=`MobilenetV1/Conv2d_${v}_depthwise`,U=`${O}/depthwise_conv`,G=`${O}/pointwise_conv`,ne=u(`${C}/depthwise_weights`,4,`${U}/filters`),te=u(`${C}/BatchNorm/gamma`,1,`${U}/batch_norm_scale`),oe=u(`${C}/BatchNorm/beta`,1,`${U}/batch_norm_offset`),ge=u(`${C}/BatchNorm/moving_mean`,1,`${U}/batch_norm_mean`),fe=u(`${C}/BatchNorm/moving_variance`,1,`${U}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:oe,batch_norm_mean:ge,batch_norm_variance:fe},pointwise_conv:p("MobilenetV1",v,G)}}function f(){return{conv_0:p("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:g(1),conv_2:g(2),conv_3:g(3),conv_4:g(4),conv_5:g(5),conv_6:g(6),conv_7:g(7),conv_8:g(8),conv_9:g(9),conv_10:g(10),conv_11:g(11),conv_12:g(12),conv_13:g(13)}}function I(v,O){const C=u(`${v}/weights`,4,`${O}/filters`),U=u(`${v}/biases`,1,`${O}/bias`);return{filters:C,bias:U}}function S(v){const O=I(`Prediction/BoxPredictor_${v}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${v}/box_encoding_predictor`),C=I(`Prediction/BoxPredictor_${v}/ClassPredictor`,`prediction_layer/box_predictor_${v}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:p("Prediction",0,"prediction_layer/conv_0"),conv_1:p("Prediction",1,"prediction_layer/conv_1"),conv_2:p("Prediction",2,"prediction_layer/conv_2"),conv_3:p("Prediction",3,"prediction_layer/conv_3"),conv_4:p("Prediction",4,"prediction_layer/conv_4"),conv_5:p("Prediction",5,"prediction_layer/conv_5"),conv_6:p("Prediction",6,"prediction_layer/conv_6"),conv_7:p("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:S(0),box_predictor_1:S(1),box_predictor_2:S(2),box_predictor_3:S(3),box_predictor_4:S(4),box_predictor_5:S(5)}}return{extractMobilenetV1Params:f,extractPredictionLayerParams:x}}function ND(r){const l=[],{extractMobilenetV1Params:u,extractPredictionLayerParams:p}=vZ(r,l),g=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!dr(g))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${g}`);const f={mobilenetv1:u(),prediction_layer:p(),output_layer:{extra_dim:g}};return zn(r,l),{params:f,paramMappings:l}}const po=Xe(Je());function Ks(r,l,u){return po.tidy(()=>{let p=po.conv2d(r,l.filters,u,"same");return p=po.add(p,l.batch_norm_offset),po.clipByValue(p,0,6)})}const wr=Xe(Je()),NZ=.0010000000474974513;function CZ(r,l,u){return wr.tidy(()=>{let p=wr.depthwiseConv2d(r,l.filters,u,"same");return p=wr.batchNorm(p,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,NZ),wr.clipByValue(p,0,6)})}function RZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function CD(r,l){return wr.tidy(()=>{let u,p=Ks(r,l.conv_0,[2,2]);const g=[l.conv_1,l.conv_2,l.conv_3,l.conv_4,l.conv_5,l.conv_6,l.conv_7,l.conv_8,l.conv_9,l.conv_10,l.conv_11,l.conv_12,l.conv_13];if(g.forEach((f,I)=>{const S=I+1,x=RZ(S);p=CZ(p,f.depthwise_conv,x),p=Ks(p,f.pointwise_conv,[1,1]),S===11&&(u=p)}),u===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:p,conv11:u}})}function RD(r,l,u,p,g){const f=r.shape[0],I=Math.min(u,f),S=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>g).sort((O,C)=>C.score-O.score),x=O=>O<=p?1:0,v=[];return S.forEach(O=>{if(v.length>=I)return;const C=O.score;for(let U=v.length-1;U>=0;--U){const G=OZ(r,O.boxIndex,v[U]);if(G===0)continue;if(O.score*=x(G),O.score<=g)break}C===O.score&&v.push(O.boxIndex)}),v}function OZ(r,l,u){const p=r.arraySync(),g=Math.min(p[l][0],p[l][2]),f=Math.min(p[l][1],p[l][3]),I=Math.max(p[l][0],p[l][2]),S=Math.max(p[l][1],p[l][3]),x=Math.min(p[u][0],p[u][2]),v=Math.min(p[u][1],p[u][3]),O=Math.max(p[u][0],p[u][2]),C=Math.max(p[u][1],p[u][3]),U=(I-g)*(S-f),G=(O-x)*(C-v);if(U<=0||G<=0)return 0;const ne=Math.max(g,x),te=Math.max(f,v),oe=Math.min(I,O),ge=Math.min(S,C),fe=Math.max(oe-ne,0)*Math.max(ge-te,0);return fe/(U+G-fe)}const De=Xe(Je());function EZ(r){const l=De.unstack(De.transpose(r,[1,0])),u=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],p=[De.add(l[0],De.div(u[0],De.scalar(2))),De.add(l[1],De.div(u[1],De.scalar(2)))];return{sizes:u,centers:p}}function DZ(r,l){const{sizes:u,centers:p}=EZ(r),g=De.unstack(De.transpose(l,[1,0])),f=De.div(De.mul(De.exp(De.div(g[2],De.scalar(5))),u[0]),De.scalar(2)),I=De.add(De.mul(De.div(g[0],De.scalar(10)),u[0]),p[0]),S=De.div(De.mul(De.exp(De.div(g[3],De.scalar(5))),u[1]),De.scalar(2)),x=De.add(De.mul(De.div(g[1],De.scalar(10)),u[1]),p[1]);return De.transpose(De.stack([De.sub(I,f),De.sub(x,S),De.add(I,f),De.add(x,S)]),[1,0])}function OD(r,l,u){return De.tidy(()=>{const p=r.shape[0];let g=DZ(De.reshape(De.tile(u.extra_dim,[p,1,1]),[-1,4]),De.reshape(r,[-1,4]));g=De.reshape(g,[p,g.shape[0]/p,4]);const f=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let I=De.slice(f,[0,0,0],[-1,-1,1]);I=De.reshape(I,[p,I.shape[1]]);const S=De.unstack(g),x=De.unstack(I);return{boxes:S,scores:x}})}const Mu=Xe(Je());function pa(r,l){return Mu.tidy(()=>{const u=r.shape[0],p=Mu.reshape(da(r,l.box_encoding_predictor),[u,-1,1,4]),g=Mu.reshape(da(r,l.class_predictor),[u,-1,3]);return{boxPredictionEncoding:p,classPrediction:g}})}const Pu=Xe(Je());function ED(r,l,u){return Pu.tidy(()=>{const p=Ks(r,u.conv_0,[1,1]),g=Ks(p,u.conv_1,[2,2]),f=Ks(g,u.conv_2,[1,1]),I=Ks(f,u.conv_3,[2,2]),S=Ks(I,u.conv_4,[1,1]),x=Ks(S,u.conv_5,[2,2]),v=Ks(x,u.conv_6,[1,1]),O=Ks(v,u.conv_7,[2,2]),C=pa(l,u.box_predictor_0),U=pa(r,u.box_predictor_1),G=pa(g,u.box_predictor_2),ne=pa(I,u.box_predictor_3),te=pa(x,u.box_predictor_4),oe=pa(O,u.box_predictor_5),ge=Pu.concat([C.boxPredictionEncoding,U.boxPredictionEncoding,G.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,oe.boxPredictionEncoding],1),fe=Pu.concat([C.classPrediction,U.classPrediction,G.classPrediction,ne.classPrediction,te.classPrediction,oe.classPrediction],1);return{boxPredictions:ge,classPredictions:fe}})}class Vs{constructor({minConfidence:r,maxResults:l}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=r||.5,this._maxResults=l||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}}const Li=Xe(Je());class jo extends In{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return Li.tidy(()=>{const u=Li.cast(r.toBatchTensor(512,!1),"float32"),p=Li.sub(Li.mul(u,Li.scalar(.007843137718737125)),Li.scalar(1)),g=CD(p,l.mobilenetv1),{boxPredictions:f,classPredictions:I}=ED(g.out,g.conv11,l.prediction_layer);return OD(f,I,l.output_layer)})}async forward(r){return this.forwardInput(await Tt(r))}async locateFaces(r,l={}){const{maxResults:u,minConfidence:p}=new Vs(l),g=await Tt(r),{boxes:f,scores:I}=this.forwardInput(g),S=f[0],x=I[0];for(let fe=1;fe{const[Ae,Te]=[Math.max(0,oe[fe][0]),Math.min(1,oe[fe][2])].map(Ct=>Ct*te),[Ve,rt]=[Math.max(0,oe[fe][1]),Math.min(1,oe[fe][3])].map(Ct=>Ct*ne);return new Wt(v[fe],new vc(Ve,Ae,rt-Ve,Te-Ae),{height:g.getInputHeight(0),width:g.getInputWidth(0)})});return S.dispose(),x.dispose(),ge}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return ND(r)}extractParams(r){return vD(r)}}function $S(r){const l=new jo;return l.extractWeights(r),l}function UC(r){return $S(r)}class BC extends jo{}const DD=.4,kD=[new qe(.738768,.874946),new qe(2.42204,2.65704),new qe(4.30971,7.04493),new qe(10.246,4.59428),new qe(12.6868,11.8741)],FD=[new qe(1.603231,2.094468),new qe(6.041143,7.080126),new qe(2.882459,3.518061),new qe(4.266906,5.178857),new qe(9.041765,10.66308)],_D=[117.001,114.697,97.404],WD="tiny_yolov2_model",$D="tiny_yolov2_separable_conv_model";const Fg=r=>typeof r=="number";function Tm(r){if(!r)throw new Error(`invalid config: ${r}`);if(typeof r.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${r.withSeparableConvs}`);if(!Fg(r.iouThreshold)||r.iouThreshold<0||r.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${r.iouThreshold}`);if(!Array.isArray(r.classes)||!r.classes.length||!r.classes.every(l=>typeof l=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(r.classes)}`);if(!Array.isArray(r.anchors)||!r.anchors.length||!r.anchors.map(l=>l||{}).every(l=>Fg(l.x)&&Fg(l.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(r.anchors)}`);if(r.meanRgb&&(!Array.isArray(r.meanRgb)||r.meanRgb.length!==3||!r.meanRgb.every(Fg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const Xs=Xe(Je());function Qc(r){return Xs.tidy(()=>{const l=Xs.mul(r,Xs.scalar(.10000000149011612));return Xs.add(Xs.relu(Xs.sub(r,l)),l)})}const Js=Xe(Je());function Lr(r,l){return Js.tidy(()=>{let u=Js.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=Js.conv2d(u,l.conv.filters,[1,1],"valid"),u=Js.sub(u,l.bn.sub),u=Js.mul(u,l.bn.truediv),u=Js.add(u,l.conv.bias),Qc(u)})}const mo=Xe(Je());function Sr(r,l){return mo.tidy(()=>{let u=mo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=mo.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=mo.add(u,l.bias),Qc(u)})}const rx=Xe(Je());function kZ(r,l){const u=Yc(r,l);function p(I,S){const x=rx.tensor1d(r(I)),v=rx.tensor1d(r(I));return l.push({paramPath:`${S}/sub`},{paramPath:`${S}/truediv`}),{sub:x,truediv:v}}function g(I,S,x){const v=u(I,S,3,`${x}/conv`),O=p(S,`${x}/bn`);return{conv:v,bn:O}}const f=Hc(r,l);return{extractConvParams:u,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}}function UD(r,l,u,p){const{extractWeights:g,getRemainingWeights:f}=Gn(r),I=[],{extractConvParams:S,extractConvWithBatchNormParams:x,extractSeparableConvParams:v}=kZ(g,I);let O;if(l.withSeparableConvs){const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=l.isFirstLayerConv2d?S(C,U,3,"conv0"):v(C,U,"conv0"),Ve=v(U,G,"conv1"),rt=v(G,ne,"conv2"),Ct=v(ne,te,"conv3"),Ut=v(te,oe,"conv4"),Kt=v(oe,ge,"conv5"),Dn=fe?v(ge,fe,"conv6"):void 0,An=Ae?v(fe,Ae,"conv7"):void 0,vn=S(Ae||fe||ge,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:Ct,conv4:Ut,conv5:Kt,conv6:Dn,conv7:An,conv8:vn}}else{const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=x(C,U,"conv0"),Ve=x(U,G,"conv1"),rt=x(G,ne,"conv2"),Ct=x(ne,te,"conv3"),Ut=x(te,oe,"conv4"),Kt=x(oe,ge,"conv5"),Dn=x(ge,fe,"conv6"),An=x(fe,Ae,"conv7"),vn=S(Ae,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:Ct,conv4:Ut,conv5:Kt,conv6:Dn,conv7:An,conv8:vn}}if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{params:O,paramMappings:I}}function FZ(r,l){const u=ms(r,l);function p(S){const x=u(`${S}/sub`,1),v=u(`${S}/truediv`,1);return{sub:x,truediv:v}}function g(S){const x=u(`${S}/filters`,4),v=u(`${S}/bias`,1);return{filters:x,bias:v}}function f(S){const x=g(`${S}/conv`),v=p(`${S}/bn`);return{conv:x,bn:v}}const I=qc(u);return{extractConvParams:g,extractConvWithBatchNormParams:f,extractSeparableConvParams:I}}function BD(r,l){const u=[],{extractConvParams:p,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}=FZ(r,u);let I;if(l.withSeparableConvs){const S=l.filterSizes&&l.filterSizes.length||9;I={conv0:l.isFirstLayerConv2d?p("conv0"):f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:S>7?f("conv6"):void 0,conv7:S>8?f("conv7"):void 0,conv8:p("conv8")}}else I={conv0:g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:g("conv6"),conv7:g("conv7"),conv8:p("conv8")};return zn(r,u),{params:I,paramMappings:u}}var Am;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(Am||(Am={}));class $i{constructor({inputSize:r,scoreThreshold:l}={}){this._name="TinyYolov2Options";if(this._inputSize=r||416,this._scoreThreshold=l||.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}}const kt=Xe(Je());class el extends In{constructor(r){super("TinyYolov2");Tm(r),this._config=r}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(r,l){let u=Lr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=Lr(u,l.conv6),u=Lr(u,l.conv7),da(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Qc(da(r,l.conv0,"valid",!1)):Sr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=l.conv6?Sr(u,l.conv6):u,u=l.conv7?Sr(u,l.conv7):u,da(u,l.conv8,"valid",!1)}forwardInput(r,l){const{params:u}=this;if(!u)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let p=kt.cast(r.toBatchTensor(l,!1),"float32");return p=this.config.meanRgb?Ys(p,this.config.meanRgb):p,p=p.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(p,u):this.runTinyYolov2(p,u)})}async forward(r,l){return await this.forwardInput(await Tt(r),l)}async detect(r,l={}){const{inputSize:u,scoreThreshold:p}=new $i(l),g=await Tt(r),f=await this.forwardInput(g,u),I=kt.tidy(()=>kt.unstack(f)[0].expandDims()),S={width:g.getInputWidth(0),height:g.getInputHeight(0)},x=await this.extractBoxes(I,g.getReshapedInputDimensions(0),p);f.dispose(),I.dispose();const v=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),U=x.map(te=>this.config.classes[te.label]),G=Cm(v.map(te=>te.rescale(u)),O,this.config.iouThreshold,!0),ne=G.map(te=>new Qo(O[te],C[te],U[te],v[te],S));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return BD(r,this.config)}extractParams(r){const l=this.config.filterSizes||el.DEFAULT_FILTER_SIZES,u=l?l.length:void 0;if(u!==7&&u!==8&&u!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${u} filterSizes in config`);return UD(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,u){const{width:p,height:g}=l,f=Math.max(p,g),I=f/p,S=f/g,x=r.shape[1],v=this.config.anchors.length,[O,C,U]=kt.tidy(()=>{const oe=r.reshape([x,x,v,this.boxEncodingSize]),ge=oe.slice([0,0,0,0],[x,x,v,4]),fe=oe.slice([0,0,0,4],[x,x,v,1]),Ae=this.withClassScores?kt.softmax(oe.slice([0,0,0,5],[x,x,v,this.config.classes.length]),3):kt.scalar(0);return[ge,fe,Ae]}),G=[],ne=await C.array(),te=await O.array();for(let oe=0;oeu){const Te=(ge+Sc(te[oe][ge][fe][0]))/x*I,Ve=(oe+Sc(te[oe][ge][fe][1]))/x*S,rt=Math.exp(te[oe][ge][fe][2])*this.config.anchors[fe].x/x*I,Ct=Math.exp(te[oe][ge][fe][3])*this.config.anchors[fe].y/x*S,Ut=Te-rt/2,Kt=Ve-Ct/2,Dn={row:oe,col:ge,anchor:fe},{classScore:An,label:vn}=this.withClassScores?await this.extractPredictedClass(U,Dn):{classScore:1,label:0};G.push({box:new Cc(Ut,Kt,Ut+rt,Kt+Ct),score:Ae,classScore:Ae*An,label:vn,...Dn})}}return O.dispose(),C.dispose(),U.dispose(),G}async extractPredictedClass(r,l){const{row:u,col:p,anchor:g}=l,f=await r.array();return Array(this.config.classes.length).fill(0).map((I,S)=>f[u][p][g][S]).map((I,S)=>({classScore:I,label:S})).reduce((I,S)=>I.classScore>S.classScore?I:S)}}el.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class wc extends el{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:DD,classes:["face"]},r?{anchors:FD,meanRgb:_D}:{anchors:kD,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Wt(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?$D:WD}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function WC(r,l=!0){const u=new wc(l);return u.extractWeights(r),u}class vm extends $i{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class Hs{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const ox=Xe(Je());async function ma(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>Jr(x)?g(x):x.detection),I=p||(l instanceof ox.Tensor?await Jo(l,f):await Xo(l,f)),S=await u(I);return I.forEach(x=>x instanceof ox.Tensor&&x.dispose()),S}async function tl(r,l,u,p,g){return ma([r],l,async f=>u(f[0]),p,g)}const MD=.4,PD=[new qe(1.603231,2.094468),new qe(6.041143,7.080126),new qe(2.882459,3.518061),new qe(4.266906,5.178857),new qe(9.041765,10.66308)],zD=[117.001,114.697,97.404];class Lc extends el{constructor(){const r={withSeparableConvs:!0,iouThreshold:MD,classes:["face"],anchors:PD,meanRgb:zD,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Wt(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const ht={ssdMobilenetv1:new jo,tinyFaceDetector:new Lc,tinyYolov2:new wc,faceLandmark68Net:new xc,faceLandmark68TinyNet:new Um,faceRecognitionNet:new Ic,faceExpressionNet:new Mm,ageGenderNet:new jm},BS=(r,l)=>ht.ssdMobilenetv1.locateFaces(r,l),zC=(r,l)=>ht.tinyFaceDetector.locateFaces(r,l),GC=(r,l)=>ht.tinyYolov2.locateFaces(r,l),MS=r=>ht.faceLandmark68Net.detectLandmarks(r),VC=r=>ht.faceLandmark68TinyNet.detectLandmarks(r),YC=r=>ht.faceRecognitionNet.computeFaceDescriptor(r),HC=r=>ht.faceExpressionNet.predictExpressions(r),qC=r=>ht.ageGenderNet.predictAgeAndGender(r),PS=r=>ht.ssdMobilenetv1.load(r),jC=r=>ht.tinyFaceDetector.load(r),KC=r=>ht.tinyYolov2.load(r),XC=r=>ht.faceLandmark68Net.load(r),JC=r=>ht.faceLandmark68TinyNet.load(r),ZC=r=>ht.faceRecognitionNet.load(r),QC=r=>ht.faceExpressionNet.load(r),e2=r=>ht.ageGenderNet.load(r),t2=PS,n2=BS,s2=MS;class GD extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Vu extends GD{async run(){const r=await this.parentTask,l=await ma(r,this.input,async u=>await Promise.all(u.map(p=>ht.faceExpressionNet.predictExpressions(p))),this.extractedFaces);return r.map((u,p)=>fu(u,l[p]))}withAgeAndGender(){return new zu(this,this.input)}}class Yu extends GD{async run(){const r=await this.parentTask;if(!r)return;const l=await tl(r,this.input,u=>ht.faceExpressionNet.predictExpressions(u),this.extractedFaces);return fu(r,l)}withAgeAndGender(){return new Gu(this,this.input)}}class il extends Vu{withAgeAndGender(){return new nl(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class rl extends Yu{withAgeAndGender(){return new sl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class VD extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class zu extends VD{async run(){const r=await this.parentTask,l=await ma(r,this.input,async u=>await Promise.all(u.map(p=>ht.ageGenderNet.predictAgeAndGender(p))),this.extractedFaces);return r.map((u,p)=>{const{age:g,gender:f,genderProbability:I}=l[p];return yu(mu(u,f,I),g)})}withFaceExpressions(){return new Vu(this,this.input)}}class Gu extends VD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:u,genderProbability:p}=await tl(r,this.input,g=>ht.ageGenderNet.predictAgeAndGender(g),this.extractedFaces);return yu(mu(r,u,p),l)}withFaceExpressions(){return new Yu(this,this.input)}}class nl extends zu{withFaceExpressions(){return new il(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class sl extends Gu{withFaceExpressions(){return new rl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class Wm extends Hs{constructor(r,l){super();this.parentTask=r;this.input=l}}class Kr extends Wm{async run(){const r=await this.parentTask,l=await ma(r,this.input,u=>Promise.all(u.map(p=>ht.faceRecognitionNet.computeFaceDescriptor(p))),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return l.map((u,p)=>gu(r[p],u))}withFaceExpressions(){return new il(this,this.input)}withAgeAndGender(){return new nl(this,this.input)}}class Xr extends Wm{async run(){const r=await this.parentTask;if(!r)return;const l=await tl(r,this.input,u=>ht.faceRecognitionNet.computeFaceDescriptor(u),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return gu(r,l)}withFaceExpressions(){return new rl(this,this.input)}withAgeAndGender(){return new sl(this,this.input)}}const Hu=Xe(Je());class km extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=u}get landmarkNet(){return this.useTinyLandmarkNet?ht.faceLandmark68TinyNet:ht.faceLandmark68Net}}class Fm extends km{async run(){const r=await this.parentTask,l=r.map(g=>g.detection),u=this.input instanceof Hu.Tensor?await Jo(this.input,l):await Xo(this.input,l),p=await Promise.all(u.map(g=>this.landmarkNet.detectLandmarks(g)));return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),r.map((g,f)=>Ko(g,p[f]))}withFaceExpressions(){return new il(this,this.input)}withAgeAndGender(){return new nl(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class _m extends km{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,u=this.input instanceof Hu.Tensor?await Jo(this.input,[l]):await Xo(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),Ko(r,p)}withFaceExpressions(){return new rl(this,this.input)}withAgeAndGender(){return new sl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class Em extends Hs{constructor(r,l=new Vs){super();this.input=r;this.options=l}}class pu extends Em{async run(){const{input:r,options:l}=this,u=l instanceof vm?p=>ht.tinyFaceDetector.locateFaces(p,l):l instanceof Vs?p=>ht.ssdMobilenetv1.locateFaces(p,l):l instanceof $i?p=>ht.tinyYolov2.locateFaces(p,l):null;if(!u)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return u(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(u=>Zr({},u)))})}withFaceLandmarks(r=!1){return new Fm(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Vu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new zu(this.runAndExtendWithFaceDetections(),this.input)}}class Dm extends Em{async run(){const r=await new pu(this.input,this.options);let l=r[0];return r.forEach(u=>{u.score>l.score&&(l=u)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?Zr({},l):void 0)})}withFaceLandmarks(r=!1){return new _m(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new Yu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Gu(this.runAndExtendWithFaceDetection(),this.input)}}function i2(r,l=new Vs){return new Dm(r,l)}function du(r,l=new Vs){return new pu(r,l)}async function zS(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await du(r,new Vs(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function r2(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await du(r,new $i(l)).withFaceLandmarks().withFaceDescriptors()}const o2=zS;function Pm(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const u=Array.from(r),p=Array.from(l);return Math.sqrt(u.map((g,f)=>g-p[f]).reduce((g,f)=>g+Math.pow(f,2),0))}class GS{constructor(r,l=.6){this._distanceThreshold=l;const u=Array.isArray(r)?r:[r];if(!u.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let p=1;const g=()=>`person ${p++}`;this._labeledDescriptors=u.map(f=>{if(f instanceof so)return f;if(f instanceof Float32Array)return new so(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new so(g(),[f.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(r,l){return l.map(u=>Pm(u,r)).reduce((u,p)=>u+p,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:u})=>new Lu(u,this.computeMeanDistance(r,l))).reduce((l,u)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(u=>so.fromJSON(u));return new GS(l,r.distanceThreshold)}}function $C(r){const l=new Lc;return l.extractWeights(r),l}function US(r,l){const{width:u,height:p}=new Zn(l.width,l.height);if(u<=0||p<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:u,height:p})}`);if(Array.isArray(r))return r.map(g=>US(g,{width:u,height:p}));if(Jr(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Ko(Zr(r,g),f)}return mi(r)?Zr(r,r.detection.forSize(u,p)):r instanceof Ns||r instanceof Wt?r.forSize(u,p):r}var FC="0.7.2";return g2();})(); + with dtype ${I.dtype}. `)});const p=(I,S)=>{const x=ut(l,u[0].shape)[0],v=NO(u.map(U=>U.shape),x);if(qt(v)===0)return yI([],v);if(u=u.filter(U=>U.size>0),u.length===1)return u[0];const O=u.map(U=>U.shape);vO(O,x);const C=I.concat(u,x);return S(u),C},g=u,f={axis:l};return Y.runKernelFunc(p,g,null,rf,f)}const yn=z({concat_:wJ});function LJ(r){const l=M(r,"x","sigmoid"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sigmoid(l);return g([f]),f},u,null,Uf)}const xI=z({sigmoid_:LJ});function SJ(r,l,u){const p=M(r,"x","slice");if(p.rank===0)throw new Error("Slicing scalar is not possible");const g=(S,x)=>{const[v,O]=rg(p,l,u);return SO(p,v,O),x([p]),S.slice(p,v,O)},f={x:p},I={begin:l,size:u};return Y.runKernelFunc(g,f,null,_f,I)}const vt=z({slice_:SJ});function IJ(r,l,u){const p=M(r,"x","batchToSpaceND"),g=l.reduce((x,v)=>x*v);Z(p.rank>=1+l.length,()=>`input rank is ${p.rank} but should be > than blockShape.length ${l.length}`),Z(u.length===l.length,()=>`crops.length is ${u.length} but should be equal to blockShape.length ${l.length}`),Z(p.shape[0]%g===0,()=>`input tensor batch is ${p.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${g}`);const f=x=>x.batchToSpaceND(p,l,u),I={x:p},S={blockShape:l,crops:u};return Y.runKernelFunc(f,I,null,nf,S)}const TI=z({batchToSpaceND_:IJ});function xJ(r,l){let u=M(r,"broadcastTo","x");const p=u.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthu.rank){const O=u.shape.slice();for(;O.length=0;O--)if(g[O]===l[O])f[O]=1;else if(u.shape[O]!==1)throw new Error(`broadcastTo(): [${p}] cannot be broadcast to [${l}].`);const I=f.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(I.length===0)return gi(u);const S=O=>O.tile(u,f),x={x:u},v={shape:l,inputShape:g};return Y.runKernelFunc(S,x,null,sf,v)}const lg=z({broadcastTo_:xJ});function TJ(r,l,u,p,g="NHWC",f=[1,1],I){const S=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let v=S,O=!1;S.rank===3&&(O=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2]])),Z(v.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${v.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),I!=null&&Z(Qt(p),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${p}.`);const C=g==="NHWC"?v.shape[3]:v.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(ao(u,f),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${u} and dilations '${f}'`);const U=(oe,ge)=>{const fe=Mc(g),Ae=fr(v.shape,x.shape,u,f,p,I,!1,fe),Te=oe.conv2d(v,x,Ae);return ge([v,x]),Te},G={x:v,filter:x},ne={strides:u,pad:p,dataFormat:g,dilations:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,of,ne);return O?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const AI=z({conv2d_:TJ});function AJ(r,l,u,p,g,f="NHWC",I){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let S=r,x=l,v=!1;l.rank===3&&(v=!0,x=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]),S=[1,r[0],r[1],r[2]]),Z(S.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${S.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(u.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${u.rank}`);const O=f==="NHWC"?S[3]:S[1],C=f==="NHWC"?x.shape[3]:x.shape[1];Z(O===u.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${u.shape[2]}.`),Z(C===u.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${u.shape[3]}.`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const U=(oe,ge)=>{const fe=1,Ae=Mc(f),Te=fr(S,u.shape,p,fe,g,I,!1,Ae),Ve=oe.conv2dDerInput(x,u,Te);return ge([x,u]),Ve},G={dy:x,filter:u},ne={strides:p,pad:g,dataFormat:f,dimRoundingMode:I,inputShape:S},te=Y.runKernelFunc(U,G,null,af,ne);return v?ie(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const CO=z({conv2DBackpropInput_:AJ});function vJ(r,l,u,p,g){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let f=r,I=l,S=!1;l.rank===4&&(S=!0,I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),f=[1,r[0],r[1],r[2],r[3]]);const x=f[4],v=I.shape[4];Z(f.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${f.length}.`),Z(I.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${I.rank}`),Z(u.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${u.rank}`),Z(x===u.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${u.shape[3]}.`),Z(v===u.shape[4],()=>`Error in conv3dDerInput: depth of output (${v}) must match output depth for filter ${u.shape[4]}.`);const O=ne=>{const te=1,oe=Ru(f,u.shape,p,te,g);return ne.conv3dDerInput(I,u,oe)},C={dy:I},U={pad:g},G=Y.runKernelFunc(O,C,null,V2,U);return S?ie(G,[G.shape[1],G.shape[2],G.shape[3],G.shape[4]]):G}const RO=z({conv3DBackpropInput_:vJ});function NJ(r){const l=M(r,"x","cos"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cos(l);return g([l]),f},u,null,cf)}const Ou=z({cos_:NJ});function CJ(r){const l=M(r,"x","cosh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.cosh(l);return g([l]),f},u,null,lf)}const vI=z({cosh_:CJ});function RJ(r,l=0,u=!1,p=!1){const g=M(r,"x","cumsum"),f=(x,v)=>{const O=ds([l],g.rank);let C=g;O!=null&&(C=$t(g,O));const U=ro(1,g.rank)[0];let G=x.cumsum(C,U,u,p);if(v([g]),O!=null){const ne=Uc(O);G=$t(G,ne)}return G},I={x:g},S={axis:l,exclusive:u,reverse:p};return Y.runKernelFunc(f,I,null,hf,S)}const NI=z({cumsum_:RJ});function Nt(r,l){const u=[];for(let p=0;p1)&&u.unshift(f)}return u}function it(r,l){const u=[],p=Math.max(r.length,l.length);for(let g=0;gI.equal(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,tR)}const CI=z({equal_:OJ});function EJ(r,l,u){const p=M(l,"a","where"),g=M(u,"b","where"),f=M(r,"condition","where","bool"),I=it(p.shape,g.shape),S=lg(p,I),x=lg(g,I);f.rank===1&&Z(f.shape[0]===p.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),f.rank!==1&&Zt(f.shape,x.shape,"Error in where: ");const v=(C,U)=>{const G=C.select(f,S,x);return U([f]),G},O={condition:f,t:S,e:x};return Y.runKernelFunc(v,O,null,Ff)}const Mn=z({where_:EJ});function DJ(r){const l=M(r,"x","zerosLike"),u={x:l};return Y.runKernelFunc(p=>p.zerosLike(l),u,null,Kf)}const je=z({zerosLike_:DJ});function kJ(r){const l=M(r,"x","exp"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.exp(l);return g([f]),f},u,null,df)}const Pn=z({exp_:kJ});function FJ(r,l=0){const u=null,p=M(r,"x","expandDims",u);Z(l<=p.rank,()=>"Axis must be <= rank of the tensor");const g=p.shape.slice();return l<0&&(Z(-(p.rank+1)<=l,()=>`Axis must be in the interval [${-(p.rank+1)}, ${p.rank}]`),l=p.rank+l+1),g.splice(l,0,1),ie(p,g)}const Es=z({expandDims_:FJ});function _J(r,l){const u=null,p=M(r,"x","tile",u);Z(p.rank===l.length,()=>`Error in transpose: rank of input ${p.rank} must match length of reps ${l}.`);const g=(x,v)=>{const O=x.tile(p,l);return v([p]),O},f=[p],I={x:p},S={reps:l};return Y.runKernelFunc(g,I,null,Yf,S,f)}const oa=z({tile_:_J});function WJ(r,l,u,p="float32"){l==null&&(l=r);const g=Cu([r,l],p),f=r<=l?r:l;for(let S=0;Sg.fill(r,l,u),{},null,iR,p)}function $J(r){const l=M(r,"x","floor"),u={x:l};return Y.runKernelFunc(p=>p.floor(l),u,null,pf)}const EI=z({floor_:$J});function OO(r,l,u){const p=r.shape[u],g=[];let f=1,I=1;for(let S=0;S{const O=ut(u,p.shape)[0],C=OO(p,g,O),U=x.gather(p,ie(g,[g.size]),O);return v([p,g]),ie(U,C.outputShape)};return Y.runKernelFunc(S,f,null,ff,I)}const DI=z({gather_:UJ});function BJ(r,l){let u=M(r,"a","greater"),p=M(l,"b","greater");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.greater(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,aR)}const yi=z({greater_:BJ});function MJ(r,l){let u=M(r,"a","greaterEqual"),p=M(l,"b","greaterEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.greaterEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,gf)}const gr=z({greaterEqual_:MJ});function PJ(r){const l=M(r,"input","imag"),u=g=>g.imag(l),p={input:l};return Y.runKernelFunc(u,p,null,lR)}const Eu=z({imag_:PJ});function zJ(r,l){let u=M(r,"a","maximum"),p=M(l,"b","maximum");[u,p]=ft(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.maximum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Sf)}const kI=z({maximum_:zJ});function ke(r,l){if((Os(r)&&l!=="string"||Array.isArray(r))&&l!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(l==="string"&&Os(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const u=[],p=[];return Vi(r,u,p,l)}function GJ(r,l){let u=M(r,"a","less"),p=M(l,"b","less");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.less(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,pR)}const FI=z({less_:GJ});function VJ(r,l){let u=M(r,"a","lessEqual"),p=M(l,"b","lessEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(I,S)=>{const x=I.lessEqual(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,mR)}const yr=z({lessEqual_:VJ});function YJ(r){const l=M(r,"x","log"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log(l);return g([l]),f},u,null,bf)}const co=z({log_:YJ});function HJ(r){const l=M(r,"x","log1p"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.log1p(l);return g([l]),f},u,null,wf)}const _I=z({log1p_:HJ});function hg(r){return Y.customGrad(r)}function qJ(r){const l=M(r,"x","neg"),u={x:l};return Y.runKernelFunc(p=>p.neg(l),u,null,Af)}const yt=z({neg_:qJ});function jJ(r,l=null,u=!1){const p=M(r,"x","max"),g=(S,x)=>{const v=ut(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=$t(p,C),O=ro(O.length,U.rank));const G=S.max(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Qn(ne.shape,ut(l,p.shape));ne=ie(ne,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={reductionIndices:l,keepDims:u};return Y.runKernelFunc(g,f,null,Lf,I)}const aa=z({max_:jJ});function KJ(r,l){let u=M(r,"a","sub"),p=M(l,"b","sub");[u,p]=ft(u,p);const g=(I,S)=>{const x=I.subtract(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,Vf)}const Be=z({sub_:KJ});function XJ(r,l=null,u=!1){let p=M(r,"x","sum");p.dtype==="bool"&&(p=Le(p,"int32"));const g=(S,x)=>{x([p]);const v=ut(l,p.shape),O=ds(v,p.rank);let C=v,U=p;O!=null&&(U=$t(p,O),C=ro(C.length,p.rank));let G=S.sum(U,C);if(u){const ne=Qn(G.shape,v);G=ie(G,ne)}return G},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,Mf,I)}const Fe=z({sum_:XJ});function JJ(r,l=null,u=!1){const p=M(r,"x","logSumExp"),g=ut(l,p.shape),f=aa(p,g,!0),I=Be(p,f),S=Pn(I),x=Fe(S,g),v=co(x),O=Lt(ie(f,v.shape),v);if(u){const C=Qn(O.shape,g);return ie(O,C)}return O}const WI=z({logSumExp_:JJ});function ZJ(r,l){const u=M(r,"a","logicalAnd","bool"),p=M(l,"b","logicalAnd","bool");it(u.shape,p.shape);const g={a:u,b:p};return Y.runKernelFunc(f=>f.logicalAnd(u,p),g,null,fR)}const ca=z({logicalAnd_:ZJ});function QJ(r){const l=M(r,"x","logicalNot","bool"),u={x:l};return Y.runKernelFunc(p=>p.logicalNot(l),u,null,gR)}const $I=z({logicalNot_:QJ});function Ds(r,l="float32"){if(l==="complex64"){const p=Ds(r,"float32"),g=Ds(r,"float32");return Gi(p,g)}const u=ia(qt(r),l);return Y.makeTensor(u,r,l)}function Yi(r,l="float32"){if(l==="complex64"){const p=Yi(r,"float32"),g=Ds(r,"float32");return Gi(p,g)}const u=Qf(qt(r),l);return Y.makeTensor(u,r,l)}function e9(r,l=null,u=!1){const p=M(r,"x","mean"),g=ut(l,p.shape),f=TO(p.shape,g),I=f[1],S=qt(I),x=hg(v=>{const O=ke(S),C=O.dtype===v.dtype?v:Le(v,O.dtype),U=Pe(C,O),G=Fe(U,l,u),ne=te=>{const oe=v.shape.slice();g.forEach(Ae=>{oe[Ae]=1});const ge=ie(te,oe),fe=Pe(ae(ge,Yi(v.shape,"float32")),S);return fe};return{value:G,gradFunc:ne}});return x(p)}const UI=z({mean_:e9});function t9(r,l=null,u=!1){const p=M(r,"x","min"),g=(S,x)=>{const v=ut(l,p.shape);let O=v;const C=ds(O,p.rank);let U=p;C!=null&&(U=$t(p,C),O=ro(O.length,p.rank));const G=S.min(U,O);C!=null&&U.dispose();let ne=G;if(u){const te=Qn(ne.shape,v);ne=ie(G,te),G.dispose()}return x([p,ne]),ne},f={x:p},I={axis:l,keepDims:u};return Y.runKernelFunc(g,f,null,If,I)}const ug=z({min_:t9});function n9(r,l){let u=M(r,"a","minimum"),p=M(l,"b","minimum");[u,p]=ft(u,p),u.dtype==="bool"&&(u=Le(u,"int32"),p=Le(p,"int32")),it(u.shape,p.shape);const g=(I,S)=>{const x=I.minimum(u,p);return S([u,p]),x},f={a:u,b:p};return Y.runKernelFunc(g,f,null,xf)}const BI=z({minimum_:n9});function s9(r){const l=M(r,"x","square"),u={},p=[l],g=[];return Y.runKernelFunc((f,I)=>(I([l]),f.square(l)),{x:l},null,"Square",u,p,g)}const dt=z({square_:s9});function i9(r,l){let u=M(r,"a","notEqual"),p=M(l,"b","notEqual");[u,p]=ft(u,p),it(u.shape,p.shape);const g=I=>I.notEqual(u,p),f={a:u,b:p};return Y.runKernelFunc(g,f,null,AR)}const MI=z({notEqual_:i9});function r9(r){const l=M(r,"input","real"),u=g=>g.real(l),p={input:l};return Y.runKernelFunc(u,p,null,kR)}const Pc=z({real_:r9});function o9(r,l,u=0){const p=M(r,"x","pad");if(p.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const g=(S,x)=>(x([p]),S.pad(p,l,u)),f={paddings:l,constantValue:u},I={x:p};return Y.runKernelFunc(g,I,null,vf,f)}const PI=z({pad_:o9});function a9(r,l,u){const p=M(r,"x","spaceToBatchND");Z(p.rank>=1+l.length,()=>`input rank ${p.rank} should be > than [blockShape] ${l.length}`),Z(u.length===l.length,()=>`paddings.shape[0] ${u.length} must be equal to [blockShape] ${l.length}`),Z(p.shape.reduce((S,x,v)=>v>0&&v<=l.length?S&&(x+u[v-1][0]+u[v-1][1])%l[v-1]===0:S,!0),()=>`input spatial dimensions ${p.shape.slice(1)} with paddings ${u.toString()} must be divisible by blockShapes ${l.toString()}`);const g=S=>S.spaceToBatchND(p,l,u),f={x:p},I={blockShape:l,paddings:u};return Y.runKernelFunc(g,f,null,Pf,I)}const zI=z({spaceToBatchND_:a9});function c9(r,l){let u=M(r,"base","pow"),p=M(l,"exp","pow");[u,p]=ft(u,p);const g={a:u,b:p},f=(I,S)=>{const x=I.pow(u,p);return S([u,p,x]),x};return Y.runKernelFunc(f,g,null,Nf)}const la=z({pow_:c9});function lo(r,l){kc(r);const u=mr(r,l);if(u.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const p=null;return Vi(r,p,u,l)}function dg(r,l,u=1,p="float32"){if(u===0)throw new Error("Cannot have a step of zero");const g=()=>{const I=r===l,S=r1;if(I||S||x)return Ds([0],p);const v=Math.abs(Math.ceil((l-r)/u)),O=ia(v,p);l(f([l]),l.dtype==="bool"?Le(l,"int32"):g.relu(l)),p={x:l};return Y.runKernelFunc(u,p,null,Cf)}const Du=z({relu_:l9});function h9(r,l){const u=M(r,"x","reverse"),p=I=>{const S=ut(l,u.shape);if(u.rank===0)return gi(u);const x=I.reverse(u,S);return ie(x,u.shape)},g={x:u},f={dims:l};return Y.runKernelFunc(p,g,null,Df,f)}const zc=z({reverse_:h9});function u9(r){const l=M(r,"x","rsqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.rsqrt(l);return g([l]),f},u,null,kf)}const GI=z({rsqrt_:u9});function d9(r){const l=M(r,"x","sin"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sin(l);return g([l]),f},u,null,Wf)}const VI=z({sin_:d9});function p9(r){const l=M(r,"x","sinh"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sinh(l);return g([l]),f},u,null,$f)}const YI=z({sinh_:p9});function m9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=r.as2D(g,p),I=u.fft(f);return I.reshape(r.shape)},l,null,sR)}const ku=z({fft_:m9});function f9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return Y.runKernelFunc(u=>{const p=r.shape[r.shape.length-1],g=r.size/p,f=ie(r,[g,p]),I=u.ifft(f);return ie(I,r.shape)},l,null,cR)}const Gc=z({ifft_:f9});function g9(r){const l=r.shape[r.shape.length-1],u=r.size/l;let p;if(l<=2){const g=ie(r,[u,l]);p=Gc(g)}else{const g=[u,2*(l-1)],f=ie(Pc(r),[u,l]),I=ie(Eu(r),[u,l]),S=zc(vt(f,[0,1],[u,l-2]),1),x=ae(zc(vt(I,[0,1],[u,l-2]),1),ke(-1)),v=yn([f,S],1),O=yn([I,x],1),C=ie(Gi(v,O),[g[0],g[1]]);p=Gc(C)}if(p=Pc(p),r.rank===3&&r.shape[0]!==0){const g=p,f=r.shape[0];p=ie(p,[f,p.shape[0]/f,p.shape[1]]),g.dispose()}return p}const HI=z({irfft_:g9});function EO(r,l,u=0){let p=[];if(typeof l=="number")Z(r.shape[u]%l===0,()=>"Number of splits must evenly divide the axis."),p=new Array(l).fill(r.shape[u]/l);else{const g=l.reduce((I,S)=>(S===-1&&(I+=1),I),0);Z(g<=1,()=>"There should be only one negative value in split array.");const f=l.indexOf(-1);if(f!==-1){const I=l.reduce((S,x)=>x>0?S+x:S);l[f]=r.shape[u]-I}Z(r.shape[u]===l.reduce((I,S)=>I+S),()=>"The sum of sizes must match the size of the axis dimension."),p=l}return p}function y9(r,l,u=0){const p=M(r,"x","split"),g=(S,x)=>{const v=ut(u,p.shape)[0],O=EO(p,l,v);return S.split(p,O,v)},f={x:p},I={numOrSizeSplits:l,axis:u};return Y.runKernelFunc(g,f,null,zf,I)}const ho=z({split_:y9});function b9(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let u=r.shape[r.shape.length-1];const p=r.size/u;let g;if(l!=null&&l0),te=r.shape.map(oe=>oe);te[r.shape.length-1]=l,g=vt(r,ne,te),u=l}else if(l!=null&&l>u){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-u,g=yn([r,Ds(ne)],r.shape.length-1),u=l}else g=r;const f=je(g),I=ie(Gi(g,f),[p,u]),S=ku(I),x=Math.floor(u/2)+1,v=Pc(S),O=Eu(S),C=ho(v,[x,u-x],v.shape.length-1),U=ho(O,[x,u-x],O.shape.length-1),G=g.shape.slice();return G[g.shape.length-1]=x,ie(Gi(C[0],U[0]),G)}const Fu=z({rfft_:b9});function w9(r){const l=M(r,"x","sqrt"),u={x:l};return Y.runKernelFunc((p,g)=>{const f=p.sqrt(l);return g([l]),f},u,null,Bf)}const ps=z({sqrt_:w9});function L9(r,l){let u=M(r,"a","squaredDifference"),p=M(l,"b","squaredDifference");[u,p]=ft(u,p),it(u.shape,p.shape);const g=(S,x)=>{const v=S.squaredDifference(u,p);return x([u,p]),v},f={a:u,b:p},I={};return Y.runKernelFunc(g,f,null,Gf,I)}const qI=z({squaredDifference_:L9});function S9(r,l){const u=M(r,"x","squeeze");return ie(u,XR(u.shape,l).newShape)}const jI=z({squeeze_:S9});function I9(r,l=0){const u=ig(r,"tensors","stack");if(Z(u.length>=1,()=>"Pass at least one tensor to tf.stack"),u.length===1)return Es(u[0],l);const p=u[0].rank,g=u[0].shape,f=u[0].dtype;Z(l<=p,()=>"Axis must be <= rank of the tensor"),u.forEach(S=>{Zt(g,S.shape,"All tensors passed to stack must have matching shapes"),Z(f===S.dtype,()=>"All tensors passed to stack must have matching dtypes")});const I=u.map(S=>Es(S,l));return yn(I,l)}const qs=z({stack_:I9});function x9(r,l=0){const u=M(r,"x","step"),p={x:u},g={alpha:l};return Y.runKernelFunc(f=>f.step(u,l),p,null,Xf,g)}const ha=z({step_:x9});function ua(r,l,u){if(kc(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const p=mr(r,u);if(p.length!==2&&p.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(p.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Vi(r,l,p,u)}function T9(r,l,u){const p=M(r,"x","unsortedSegmentSum"),g=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(u),()=>"numSegments must be of dtype int");const f={x:p,segmentIds:g},I={numSegments:u},S=(x,v)=>{const O=x.unsortedSegmentSum(p,g,u);return v([g]),O};return Y.runKernelFunc(S,f,null,jf,I)}const KI=z({unsortedSegmentSum_:T9});function A9(r,l=0){const u=M(r,"x","unstack");Z(l>=-u.shape.length&&l`Axis = ${l} is not in [-${u.shape.length}, ${u.shape.length})`),l<0&&(l+=u.shape.length);const p={value:u},g={axis:l},f=I=>I.unstack(u,l);return Y.runKernelFunc(f,p,null,qf,g)}const _u=z({unstack_:A9});function v9(r,l="euclidean",u=null,p=!1){r=M(r,"x","norm");const g=DO(r,l,u);let f=g.shape;if(p){const I=ut(u,r.shape);f=Qn(g.shape,I)}return ie(g,f)}function DO(r,l,u=null){if(r.rank===0)return Bn(r);if(r.rank!==1&&u===null)return DO(ie(r,[-1]),l,u);if(r.rank===1||typeof u=="number"||Array.isArray(u)&&u.length===1){if(l===1)return Fe(Bn(r),u);if(l===Infinity)return aa(Bn(r),u);if(l===-Infinity)return ug(Bn(r),u);if(l==="euclidean"||l===2)return ps(Fe(la(Bn(r),ke(2,"int32")),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(u)&&u.length===2){if(l===1)return aa(Fe(Bn(r),u[0]),u[1]-1);if(l===Infinity)return aa(Fe(Bn(r),u[1]),u[0]);if(l===-Infinity)return ug(Fe(Bn(r),u[1]),u[0]);if(l==="fro"||l==="euclidean")return ps(Fe(dt(r),u));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${u}`)}const pg=z({norm_:v9});function kO(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function mg(r,l,u){const p=1-r%2,g=new Float32Array(r);for(let f=0;f`Error in conv2dDerFilter: input must be rank 4, but got shape ${S.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(u.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${u}.`);const v=f==="NHWC"?S.shape[3]:S.shape[1],O=f==="NHWC"?x.shape[3]:x.shape[1];Z(v===u[2],()=>`Error in conv2dDerFilter: depth of input ${v}) must match input depth in filter (${u[2]}.`),Z(O===u[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${u[3]}).`),I!=null&&Z(Qt(g),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${I} but got pad ${g}.`);const C=ne=>{const te=1,oe=Mc(f),ge=fr(S.shape,u,p,te,g,I,!1,oe);return ne.conv2dDerFilter(S,x,ge)},U={x:S,dy:x},G={strides:p,pad:g,dataFormat:f,dimRoundingMode:I};return Y.runKernelFunc(C,U,null,P2,G)}const fg=z({conv2DBackpropFilter_:N9});function C9(r,l,u,p){let g=r;r.rank===3&&(g=ie(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let f=l;f.rank===3&&(f=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=x=>x.depthwiseConv2DDerFilter(g,f,p),S={x:g,dy:f};return Y.runKernelFunc(I,S,null,q2)}const FO=z({depthwiseConv2dNativeBackpropFilter_:C9});function R9(r,l,u,p){let g=l,f=!1;l.rank===3&&(f=!0,g=ie(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const I=v=>v.depthwiseConv2DDerInput(g,u,p),S={dy:g},x=Y.runKernelFunc(I,S,null,j2);return f?ie(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const _O=z({depthwiseConv2dNativeBackpropInput_:R9});function O9(r){return mg(r,.54,.46)}const WO=z({hammingWindow_:O9});function E9(r){return mg(r,.5,.5)}const gg=z({hannWindow_:E9});function D9(r,l,u,p=!1,g=0){let f=0;const I=[];for(;f+l<=r.size;)I.push(vt(r,f,l)),f+=u;if(p)for(;f`Error in cropAndResize: image must be rank 4,but got rank ${I.rank}.`),Z(S.rank===2&&S.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${v},4] but had shape ${S.shape}.`),Z(x.rank===1&&x.shape[0]===v,()=>`Error in cropAndResize: boxInd must be have size [${v}] but had shape ${S.shape}.`),Z(p.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${p.length}.`),Z(p[0]>=1&&p[1]>=1,()=>`cropSize must be atleast [1,1], but was ${p}`),Z(g==="bilinear"||g==="nearest",()=>`method must be bilinear or nearest, but was ${g}`);const O=ne=>ne.cropAndResize(I,S,x,p,g,f),C={image:I,boxes:S,boxInd:x},U={method:g,extrapolationValue:f,cropSize:p},G=Y.runKernelFunc(O,C,null,Y2,U);return G}const UO=z({cropAndResize_:F9});function _9(r){const l=M(r,"image","flipLeftRight","float32");Z(l.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${l.rank}.`);const u={image:l},p=Y.runKernel(rR,u,{});return p}const BO=z({flipLeftRight_:_9});function W9(r,l,u=0,p=.5){const g=M(r,"image","rotateWithOffset","float32");Z(g.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${g.rank}.`);const f={image:g},I={radians:l,fillValue:u,center:p},S=Y.runKernel(HR,f,I);return S}const MO=z({rotateWithOffset_:W9});function js(r,l,u,p,g,f){p==null&&(p=.5),g==null&&(g=Number.NEGATIVE_INFINITY),f==null&&(f=0);const I=r.shape[0];return u=Math.min(u,I),Z(0<=p&&p<=1,()=>`iouThreshold must be in [0, 1], but was '${p}'`),Z(r.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${r.rank}'`),Z(r.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${r.shape[1]}`),Z(l.rank===1,()=>"scores must be a 1D tensor"),Z(l.shape[0]===I,()=>`scores has incompatible shape with boxes. Expected ${I}, but was ${l.shape[0]}`),Z(0<=f&&f<=1,()=>`softNmsSigma must be in [0, 1], but was '${f}'`),{maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f}}function $9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppression"),I=M(l,"scores","nonMaxSuppression"),S=js(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x={maxOutputSize:u,iouThreshold:p,scoreThreshold:g};return Y.runKernelFunc(v=>v.nonMaxSuppression(f,I,u,p,g),{boxes:f,scores:I},null,vR,x)}const PO=z({nonMaxSuppression_:$9});function zO(r,l,u){const p=U9(r,l,u),g=p<0?-(p+1):p;r.splice(g,0,l)}function U9(r,l,u){return M9(r,l,u||B9)}function B9(r,l){return r>l?1:r>>1);const S=u(l,r[f]);S>0?p=f+1:(g=f,I=!S)}return I?p:-p-1}function GO(r,l,u,p,g){return XI(r,l,u,p,g,0).selectedIndices}function VO(r,l,u,p,g,f){return XI(r,l,u,p,g,0,!1,f,!0)}function YO(r,l,u,p,g,f){return XI(r,l,u,p,g,f,!0)}function XI(r,l,u,p,g,f,I=!1,S=!1,x=!1){const v=[];for(let oe=0;oeg&&v.push({score:l[oe],boxIndex:oe,suppressBeginIndex:0});v.sort(HO);const O=f>0?-.5/f:0,C=[],U=[];for(;C.length0;){const oe=v.pop(),{score:ge,boxIndex:fe,suppressBeginIndex:Ae}=oe;if(ge=Ae;--Ve){const rt=P9(r,fe,C[Ve]);if(rt>=p){Te=!0;break}if(oe.score=oe.score*z9(p,O,rt),oe.score<=g)break}oe.suppressBeginIndex=C.length,Te||(oe.score===ge?(C.push(fe),U.push(oe.score)):oe.score>g&&zO(v,oe,HO))}const G=C.length,ne=u-G;S&&ne>0&&(C.push(...new Array(ne).fill(0)),U.push(...new Array(ne).fill(0)));const te={selectedIndices:lo(C,"int32")};return I&&(te.selectedScores=lo(U,"float32")),x&&(te.validOutputs=ke(G,"int32")),te}function P9(r,l,u){const p=r.subarray(l*4,l*4+4),g=r.subarray(u*4,u*4+4),f=Math.min(p[0],p[2]),I=Math.min(p[1],p[3]),S=Math.max(p[0],p[2]),x=Math.max(p[1],p[3]),v=Math.min(g[0],g[2]),O=Math.min(g[1],g[3]),C=Math.max(g[0],g[2]),U=Math.max(g[1],g[3]),G=(S-f)*(x-I),ne=(C-v)*(U-O);if(G<=0||ne<=0)return 0;const te=Math.max(f,v),oe=Math.max(I,O),ge=Math.min(S,C),fe=Math.min(x,U),Ae=Math.max(ge-te,0)*Math.max(fe-oe,0);return Ae/(G+ne-Ae)}function z9(r,l,u){const p=Math.exp(l*u*u);return u<=r?p:0}function HO(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function G9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY){const f=M(r,"boxes","nonMaxSuppressionAsync"),I=M(l,"scores","nonMaxSuppressionAsync"),S=js(f,I,u,p,g);u=S.maxOutputSize,p=S.iouThreshold,g=S.scoreThreshold;const x=await Promise.all([f.data(),I.data()]),v=x[0],O=x[1],C=GO(v,O,u,p,g);return f!==r&&f.dispose(),I!==l&&I.dispose(),C}const qO=G9;function V9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=js(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v={boxes:I,scores:S},O={maxOutputSize:u,iouThreshold:p,scoreThreshold:g,softNmsSigma:f},C=Y.runKernel(CR,v,O);return{selectedIndices:C[0],selectedScores:C[1]}}const jO=z({nonMaxSuppressionWithScore_:V9});async function Y9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=0){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=js(I,S,u,p,g,f);u=x.maxOutputSize,p=x.iouThreshold,g=x.scoreThreshold,f=x.softNmsSigma;const v=await Promise.all([I.data(),S.data()]),O=v[0],C=v[1],U=YO(O,C,u,p,g,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),U}const KO=Y9;function H9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),x=js(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,U={boxes:I,scores:S},G={maxOutputSize:v,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:f},ne=Y.runKernel(NR,U,G);return{selectedIndices:ne[0],validOutputs:ne[1]}}const XO=z({nonMaxSuppressionPadded_:H9});async function q9(r,l,u,p=.5,g=Number.NEGATIVE_INFINITY,f=!1){const I=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),x=js(I,S,u,p,g,null),v=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[U,G]=await Promise.all([I.data(),S.data()]),ne=VO(U,G,v,O,C,f);return I!==r&&I.dispose(),S!==l&&S.dispose(),ne}const JO=q9;function j9(r,l,u=!1){const p=M(r,"images","resizeBilinear");Z(p.rank===3||p.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x=(U,G)=>(G([g]),U.resizeBilinear(g,I,S,u)),v={images:g},O={alignCorners:u,size:l},C=Y.runKernelFunc(x,v,null,Ef,O);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const ZO=z({resizeBilinear_:j9});function K9(r,l,u=!1){const p=M(r,"images","resizeNearestNeighbor");Z(p.rank===3||p.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${p.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(p.dtype==="float32"||p.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let g=p,f=!1;p.rank===3&&(f=!0,g=ie(p,[1,p.shape[0],p.shape[1],p.shape[2]]));const[I,S]=l,x={images:g},v={alignCorners:u,size:l},O=(U,G)=>(G([g]),U.resizeNearestNeighbor(g,I,S,u)),C=Y.runKernelFunc(O,x,null,Of,v);return f?ie(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const QO=z({resizeNearestNeighbor_:K9});function X9(r,l,u){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(u%1===0,()=>`bandPart(): numUpper must be an integer, got ${u}.`);const p=M(r,"a","bandPart");Z(p.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${p.rank}.`);const g=p.shape,[f,I]=p.shape.slice(-2);if(!(l<=f))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${f}).`);if(!(u<=I))throw new Error(`bandPart(): numUpper (${u}) must not be greater than the number of columns (${I}).`);l<0&&(l=f),u<0&&(u=I);const S=ie(dg(0,f,1,"int32"),[-1,1]),x=dg(0,I,1,"int32"),v=Be(S,x),O=ca(yr(v,ke(+l,"int32")),gr(v,ke(-u,"int32"))),C=Ds([f,I],p.dtype);return ie(qs(_u(ie(p,[-1,f,I])).map(U=>Mn(O,U,C))),g)}const e1=z({bandPart_:X9});function J9(r){let l;if(Array.isArray(r)){l=!1,Z(r!=null&&r.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");const g=r[0].shape[0];for(let f=1;f`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[f].shape[0]} vs. ${g})`)}else l=!0,r=ho(r,r.shape[0],0).map(g=>jI(g,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const u=[],p=r;for(let g=0;g{let f=p[g];if(g>0)for(let I=0;I=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return n1(r,l);{const u=r.shape.slice(0,r.shape.length-2).reduce((x,v)=>x*v),p=_u(ie(r,[u,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),g=[],f=[];p.forEach(x=>{const[v,O]=n1(x,l);g.push(v),f.push(O)});const I=ie(qs(g,0),r.shape),S=ie(qs(f,0),r.shape);return[I,S]}}function n1(r,l=!1){return Y.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const u=r.shape[0],p=r.shape[1];let g=RI(u),f=gi(r);const I=ua([[1]],[1,1]);let S=gi(I);const x=u>=p?p:u;for(let v=0;v{const G=vt(f,[v,v],[u-v,1]),ne=pg(G),te=vt(f,[v,v],[1,1]),oe=Mn(yi(te,0),ua([[-1]]),ua([[1]])),ge=Be(te,ae(oe,ne)),fe=Pe(G,ge);fe.shape[0]===1?S=gi(I):S=yn([I,vt(fe,[1,0],[fe.shape[0]-1,fe.shape[1]])],0);const Ae=yt(Pe(un(oe,ge),ne)),Te=vt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=$t(S);if(v===0)f=Be(Te,un(Ve,un(rt,Te)));else{const Kt=Be(Te,un(Ve,un(rt,Te)));f=yn([vt(f,[0,0],[v,p]),Kt],0)}const Ct=$t(Ve),Ut=vt(g,[0,v],[u,g.shape[1]-v]);if(v===0)g=Be(Ut,un(un(Ut,S),Ct));else{const Kt=Be(Ut,un(un(Ut,S),Ct));g=yn([vt(g,[0,0],[u,v]),Kt],1)}return[S,f,g]}),xO([O,C,U])}return!l&&u>p&&(g=vt(g,[0,0],[u,p]),f=vt(f,[0,0],[p,p])),[g,f]})}const s1=z({qr_:Z9});var jt;(function(r){r[r.NONE=0]="NONE",r[r.MEAN=1]="MEAN",r[r.SUM=2]="SUM",r[r.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(jt||(jt={}));function Q9(r,l,u=jt.SUM_BY_NONZERO_WEIGHTS){const p=M(r,"losses","computeWeightedLoss");let g=null;l!=null&&(g=M(l,"weights","computeWeightedLoss"));const f=g==null?p:ae(p,g);if(u===jt.NONE)return f;if(u===jt.SUM)return Fe(f);if(u===jt.MEAN){if(g==null)return UI(f);{const I=p.size/g.size,S=Pe(Fe(f),Fe(g));return I>1?Pe(S,ke(I)):S}}if(u===jt.SUM_BY_NONZERO_WEIGHTS){if(g==null)return Pe(Fe(f),ke(p.size));{const I=ae(g,Yi(p.shape)),S=Le(Fe(MI(I,ke(0))),"float32");return Pe(Fe(f),S)}}throw Error(`Unknown reduction: ${u}`)}const Tn=z({computeWeightedLoss_:Q9});function eZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","absoluteDifference"),f=M(l,"predictions","absoluteDifference");let I=null;u!=null&&(I=M(u,"weights","absoluteDifference")),Zt(g.shape,f.shape,"Error in absoluteDifference: ");const S=Bn(Be(g,f));return Tn(S,I,p)}const i1=z({absoluteDifference_:eZ});function tZ(r,l,u,p,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","cosineDistance"),I=M(l,"predictions","cosineDistance");let S=null;p!=null&&(S=M(p,"weights","cosineDistance")),Zt(f.shape,I.shape,"Error in cosineDistance: ");const x=ke(1),v=Be(x,Fe(ae(f,I),u,!0));return Tn(v,S,g)}const r1=z({cosineDistance_:tZ});function nZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"labels","hingeLoss");const f=M(l,"predictions","hingeLoss");let I=null;u!=null&&(I=M(u,"weights","hingeLoss")),Zt(g.shape,f.shape,"Error in hingeLoss: ");const S=ke(1);g=Be(ae(ke(2),g),S);const x=Du(Be(S,ae(g,f)));return Tn(x,I,p)}const o1=z({hingeLoss_:nZ});function sZ(r,l,u,p=1,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","huberLoss"),I=M(l,"predictions","huberLoss");let S=null;u!=null&&(S=M(u,"weights","huberLoss")),Zt(f.shape,I.shape,"Error in huberLoss: ");const x=ke(p),v=Bn(Be(I,f)),O=BI(v,x),C=Be(v,O),U=Lt(ae(ke(.5),dt(O)),ae(x,C));return Tn(U,S,g)}const a1=z({huberLoss_:sZ});function iZ(r,l,u,p=1e-7,g=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","logLoss"),I=M(l,"predictions","logLoss");let S=null;u!=null&&(S=M(u,"weights","logLoss")),Zt(f.shape,I.shape,"Error in logLoss: ");const x=ke(1),v=ke(p),O=yt(ae(f,co(Lt(I,v)))),C=ae(Be(x,f),co(Lt(Be(x,I),v))),U=Be(O,C);return Tn(U,S,g)}const c1=z({logLoss_:iZ});function rZ(r,l,u,p=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","meanSquaredError"),f=M(l,"predictions","meanSquaredError");let I=null;u!=null&&(I=M(u,"weights","meanSquaredError")),Zt(g.shape,f.shape,"Error in meanSquaredError: ");const S=qI(g,f);return Tn(S,I,p)}const l1=z({meanSquaredError_:rZ});function oZ(r,l){const u=M(r,"labels","sigmoidCrossEntropyWithLogits"),p=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(u.shape,p.shape,"Error in sigmoidCrossEntropyWithLogits: ");const g=Du(p),f=ae(p,u),I=_I(Pn(yt(Bn(p))));return Lt(Be(g,f),I)}function aZ(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"multiClassLabels","sigmoidCrossEntropy");const I=M(l,"logits","sigmoidCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","sigmoidCrossEntropy")),Zt(f.shape,I.shape,"Error in sigmoidCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(.5);f=Lt(ae(f,Be(O,v)),ae(C,v))}const x=oZ(f,I);return Tn(x,S,g)}const h1=z({sigmoidCrossEntropy_:aZ});function cZ(r,l,u=-1){if(u===-1&&(u=l.rank-1),u!==l.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${l.rank} and dim was ${u}`);const p=hg((g,f,I)=>{const S=!0,x=WI(f,[u],S),v=Be(Le(f,"float32"),x);I([g,v]);const O=yt(ae(v,g)),C=Fe(O,[u]),U=(G,ne)=>{const[te,oe]=ne,ge=Qn(G.shape,[u]);return[ae(ie(G,ge),Be(Le(te,"float32"),Pn(oe))),ae(ie(G,ge),Be(Pn(oe),Le(te,"float32")))]};return{value:C,gradFunc:U}});return p(r,l)}function lZ(r,l,u,p=0,g=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"onehotLabels","softmaxCrossEntropy");const I=M(l,"logits","softmaxCrossEntropy");let S=null;if(u!=null&&(S=M(u,"weights","softmaxCrossEntropy")),Zt(f.shape,I.shape,"Error in softmaxCrossEntropy: "),p>0){const v=ke(p),O=ke(1),C=ke(f.shape[1]);f=Lt(ae(f,Be(O,v)),Pe(v,C))}const x=cZ(f,I);return Tn(x,S,g)}const u1=z({softmaxCrossEntropy_:lZ});const zTe={fft:ku,ifft:Gc,rfft:Fu,irfft:HI},qTe={hammingWindow:WO,hannWindow:gg,frame:yg,stft:$O},d1={flipLeftRight:BO,resizeNearestNeighbor:QO,resizeBilinear:ZO,rotateWithOffset:MO,cropAndResize:UO,nonMaxSuppression:PO,nonMaxSuppressionAsync:qO,nonMaxSuppressionWithScore:jO,nonMaxSuppressionWithScoreAsync:KO,nonMaxSuppressionPadded:XO,nonMaxSuppressionPaddedAsync:JO},cAe={bandPart:e1,gramSchmidt:t1,qr:s1},bAe={absoluteDifference:i1,computeWeightedLoss:Tn,cosineDistance:r1,hingeLoss:o1,huberLoss:a1,logLoss:c1,meanSquaredError:l1,sigmoidCrossEntropy:h1,softmaxCrossEntropy:u1};const p1=1.7580993408473768,m1=1.0507009873554805;const f1={kernelName:ef,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ha(Le(u,"float32"),-1))}}};const g1={kernelName:T2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=dt(Le(u,"float32")),g=ps(Be(ke(1),p));return yt(Pe(r,g))}}}};const y1={kernelName:A2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Be(dt(Le(u,"float32")),1));return Pe(r,p)}}}};const b1={kernelName:Ec,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=Nt(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=Nt(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,p.shape)};return{a:f,b:I}}};const w1={kernelName:v2,saveAllInputs:!0,gradFunc:(r,l)=>{const u={};return l.forEach((p,g)=>{u[g]=()=>r.clone()}),u}};const L1={kernelName:N2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>je(u)}}};const S1={kernelName:C2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>je(u)}}};const I1={kernelName:R2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ps(Be(ke(1),dt(Le(u,"float32")))))}}};const x1={kernelName:O2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=ps(Lt(ke(1),dt(Le(u,"float32"))));return Pe(r,p)}}}};const T1={kernelName:k2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Lt(dt(u),dt(p));let x=ae(r,Pe(p,S));const v=Nt(u.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,u.shape)},I=()=>{const S=Lt(dt(u),dt(p));let x=yt(ae(r,Pe(u,S)));const v=Nt(p.shape,g);return v.length>0&&(x=Fe(x,v)),ie(x,p.shape)};return{a:f,b:I}}};const A1={kernelName:E2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(dt(Le(u,"float32")),1))}}};const v1={kernelName:D2,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Be(ke(1),dt(Le(u,"float32"))))}}};function hZ(r,l,u,p,g=[1,1,1],f,I){const S=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let v=S,O=x,C=!1;x.rank===4&&(C=!0,v=ie(S,[1,S.shape[0],S.shape[1],S.shape[2],S.shape[3]]),O=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(v.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${v.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(ao(p,g),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${p} and dilations '${g}'`),I!=null&&Z(Qt(f),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const U=oe=>{const ge=cg(O.shape,u,p,g,f,I);return oe.avgPool3dBackprop(v,O,ge)},G={dy:v,input:O},ne={filterSize:u,strides:p,dilations:g,pad:f,dimRoundingMode:I},te=Y.runKernelFunc(U,G,null,$2,ne);return C?ie(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const N1=z({avgPool3dBackprop_:hZ});const C1={kernelName:W2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,dilations:I,pad:S,dimRoundingMode:x}=u,v=I==null?[1,1,1]:I;return{x:()=>N1(r,p,g,f,v,S,x)}}};function uZ(r,l,u,p,g){const f=M(r,"dy","avgPoolBackprop"),I=M(l,"input","avgPoolBackprop");Z(I.rank===f.rank,()=>`Rank of input (${I.rank}) does not match rank of dy (${f.rank})`);let S=I,x=f,v=!1;I.rank===3&&(v=!0,S=ie(I,[1,I.shape[0],I.shape[1],I.shape[2]]),x=ie(f,[1,f.shape[0],f.shape[1],f.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(S.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${S.rank}.`);const O=ne=>{const te=ag(S.shape,u,p,1,g);return ne.avgPoolBackprop(x,S,te)},C={dy:x,input:S},U={filterSize:u,strides:p,pad:g},G=Y.runKernelFunc(O,C,null,_2,U);return v?ie(G,[G.shape[1],G.shape[2],G.shape[3]]):G}const R1=z({avgPoolBackprop_:uZ});const O1={kernelName:F2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{filterSize:g,strides:f,pad:I}=u;return{x:()=>R1(r,p,g,f,I)}}};const E1={kernelName:tf,inputsToSave:["a","b"],gradFunc:(r,l,u)=>{const[p,g]=l,{transposeA:f,transposeB:I}=u;return!f&&!I?{a:()=>un(r,g,!1,!0),b:()=>un(p,r,!0,!1)}:!f&&I?{a:()=>un(r,g,!1,!1),b:()=>un(r,p,!0,!1)}:f&&!I?{a:()=>un(g,r,!1,!0),b:()=>un(p,r,!1,!1)}:{a:()=>un(g,r,!0,!0),b:()=>un(r,p,!0,!0)}}};const D1={kernelName:nf,gradFunc:(r,l,u)=>{const{blockShape:p,crops:g}=u;return{x:()=>zI(r,p,g)}}};const k1={kernelName:sf,gradFunc:(r,l,u)=>{const p=u,g=p.inputShape,f=p.shape,I=Array.from(f);for(let x=g.length-1;x>=0;x--)if(g[x]===f[x])I[x]=1;else if(g[x]!==1)throw new Error(`broadcastTo(): [${g}] cannot be broadcast to [${f}].`);const S=[];for(let x=0;x1&&S.push(x);return{x:()=>Fe(r,S,!0)}}};const F1={kernelName:Dc,gradFunc:r=>({x:()=>r.clone()})};const _1={kernelName:U2,gradFunc:r=>({x:()=>je(r)})};const W1={kernelName:B2,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{clipValueMin:g,clipValueMax:f}=u;return{x:()=>Mn(ca(gr(p,g),yr(p,f)),r,je(r))}}};const $1={kernelName:rf,saveAllInputs:!0,gradFunc:(r,l,u)=>{const p=l.map(x=>x.shape),{axis:g}=u,f=ut(g,l[0].shape)[0],I=p.map(x=>x[f]),S=ho(r,I,f);return S.map(x=>()=>x)}};const U1={kernelName:of,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{dilations:f,strides:I,pad:S,dataFormat:x}=u;return Z(oo(f),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${f}'`),{x:()=>CO(p.shape,r,g,I,S,x),filter:()=>fg(p,r,g.shape,I,S,x)}}};const B1={kernelName:af,inputsToSave:["dy","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,{strides:f,pad:I,dataFormat:S,dimRoundingMode:x}=u;return{dy:()=>AI(r,g,f,I,S,1,x),filter:()=>fg(r,p,g.shape,f,I,S,x)}}};function dZ(r,l,u,p,g){let f=r;r.rank===4&&(f=ie(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let I=l;I.rank===4&&(I=ie(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(f.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${f.shape}.`),Z(I.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${I.shape}.`),Z(u.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${u}.`),Z(f.shape[4]===u[3],()=>`Error in conv3dDerFilter: depth of input ${f.shape[4]}) must match input depth in filter (${u[3]}.`),Z(I.shape[4]===u[4],()=>`Error in conv3dDerFilter: depth of dy (${I.shape[4]}) must match output depth for filter (${u[4]}).`);const S=O=>{const C=1,U=Ru(f.shape,u,p,C,g);return O.conv3dDerFilter(f,I,U)},x={x:f,y:I},v={strides:p,pad:g};return Y.runKernelFunc(S,x,null,G2,v)}const M1=z({conv3DBackpropFilter_:dZ});const P1={kernelName:z2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f}=u;Z(oo(p),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${p}'`);const[I,S]=l;return{x:()=>RO(I.shape,r,S,g,f),filter:()=>M1(I,r,S.shape,g,f)}}};const z1={kernelName:cf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(yt(VI(Le(u,"float32"))),r)}}};const G1={kernelName:lf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(YI(Le(u,"float32")),r)}}};const V1={kernelName:hf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{axis:g,exclusive:f,reverse:I}=u;return{x:()=>{const S=ds([g],p.rank);let x=NI(r,g,f,!I);return S!=null&&(x=$t(x,S)),x}}}};const Y1={kernelName:H2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const{dilations:p,strides:g,pad:f,dimRoundingMode:I}=u,S=p==null?[1,1]:p;Z(oo(S),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${S}'`);const[x,v]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(v.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${v.rank}.`),Z(x.shape[3]===v.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${v.shape[2]}.`),Z(ao(g,S),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${g} and dilations '${S}'.`),I!=null&&Z(Qt(f),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=fr(x.shape,v.shape,g,S,f,I,!0);return{x:()=>_O(x.shape,r,v,O),filter:()=>FO(x,r,v.shape,O)}}};const H1={kernelName:K2,inputsToSave:["x","filter"],gradFunc:(r,l,u)=>{const[p,g]=l,f={x:p,filter:g,dy:r},I={x:p,filter:g,dy:r};return{x:()=>Y.runKernel(X2,f,u),filter:()=>Y.runKernel(J2,I,u)}}};const q1={kernelName:uf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=Nt(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=dt(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const j1={kernelName:Z2,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l,p=f=>f.eluDer(r,u),g={dy:r,y:u};return{x:()=>Y.runKernelFunc(p,g,null,Q2)}}};const K1={kernelName:eR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(Pn(yt(dt(u))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,p)}}};const X1={kernelName:df,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,u)}}};const J1={kernelName:nR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Pn(u))}}};const Z1={kernelName:pf,gradFunc:r=>({x:()=>je(r)})};const Q1={kernelName:mf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Pe(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{let S=ae(r,Le(u,"float32"));const x=Nt(p.shape,g);x.length>0&&(S=ie(Fe(S,x),p.shape));const v=dt(p);return yt(Pe(S,Le(v,"float32")))};return{a:f,b:I}}};const eE={kernelName:oR,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,u)=>{const{varianceEpsilon:p}=u,[g,f,I,S]=l,x=S==null?ke(1):S,v=Nt(f.shape,g.shape),O=[];if(f.rank===1){for(let Te=0;Tef.rank===1?ie(ae(ae(r,oa(ie(G,[1,1,1,f.shape[0]]),O)),x),g.shape):ie(ae(ae(r,G),x),g.shape),oe=()=>{let Te=ae(ae(G,ke(-1)),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},ge=()=>{let Te=ae(ae(ne,C),U);return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)},fe=()=>{const Te=ae(C,G);let Ve=ae(r,Te);return f.rank===1&&(Ve=Fe(Ve,v)),ie(Ve,f.shape)},Ae=()=>{let Te=r;return f.rank===1&&(Te=Fe(Te,v)),ie(Te,f.shape)};return{x:te,mean:oe,variance:ge,scale:fe,offset:Ae}}};const sE={kernelName:ff,inputsToSave:["x","indices"],gradFunc:(r,l,u)=>{const[p,g]=l,{axis:f}=u,I=ut(f,p.shape)[0],S=()=>{const x=p.shape,v=g.size,O=x.slice(0,I),C=O.length,U=x.slice(f,x.length).slice(1),G=U.length,ne=tE(0,C),te=tE(C+1,C+1+G),oe=nE([O,[v],U]),ge=ie(r,oe),fe=ie(g,[v]),Ae=nE([[C],ne,te]),Te=$t(ge,Ae);let Ve=KI(Te,fe,p.shape[I]);const rt=Uc(Ae);return Ve=$t(Ve,rt),Ve};return{x:S,indices:()=>g}}};function tE(r,l){const u=[];for(let p=r;p{const[u,p]=l;return{a:()=>je(u),b:()=>je(p)}}};const rE={kernelName:yf,gradFunc:r=>({x:()=>Le(r,"float32")})};const oE={kernelName:hR,gradFunc:r=>({x:()=>je(r)})};const aE={kernelName:uR,gradFunc:r=>({x:()=>je(r)})};const cE={kernelName:dR,gradFunc:r=>({x:()=>je(r)})};const lE={kernelName:wf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Lt(u,1))}}};const hE={kernelName:bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,Le(u,"float32"))}}};const uE={kernelName:yR,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{axis:g}=u;return{logits:()=>{const f=!0,I=Pn(p);return Be(r,ae(Fe(r,g,f),I))}}}};function pZ(r,l,u,p=5,g=1,f=1,I=.5){const S=O=>O.LRNGrad(u,r,l,p,g,f,I),x={x:r,y:l,dy:u},v={depthRadius:p,bias:g,alpha:f,beta:I};return Y.runKernelFunc(S,x,null,wR,v)}const dE=z({localResponseNormalizationBackprop_:pZ});const pE={kernelName:bR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{depthRadius:f,bias:I,alpha:S,beta:x}=u;return{x:()=>dE(p,g,r,f,I,S,x)}}};function bg(r,l,u,p,g){return l.rank{const f=ae(r,Le(CI(u,l),r.dtype));return g==null?f:$t(f,g)}}}const JI={kernelName:Lf,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{reductionIndices:g}=p,[f,I]=l,S=ut(g,f.shape),x=ds(S,f.rank),v=bg(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=$t(O)),O}}}};const mE={kernelName:Sf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(gr(u,p),"float32")),f=()=>ae(r,Le(FI(u,p),"float32"));return{a:g,b:f}}};function mZ(r,l,u,p,g,f=[1,1,1],I,S){const x=M(r,"dy","maxPool3dBackprop"),v=M(l,"input","maxPool3dBackprop"),O=M(u,"output","maxPool3dBackprop");let C=x,U=v,G=O,ne=!1;v.rank===4&&(ne=!0,C=ie(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),U=ie(v,[1,v.shape[0],v.shape[1],v.shape[2],v.shape[3]]),G=ie(O,[1,O.shape[0],O.shape[1],O.shape[2],O.shape[3]])),Z(C.rank===5,()=>`Error in maxPool3dBackprop: dy must be rank 5 but got rank ${C.rank}.`),Z(U.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${U.rank}.`),Z(G.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${G.rank}.`),Z(ao(g,f),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${g} and dilations '${f}'`),S!=null&&Z(Qt(I),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${I}.`);const te=Ae=>{const Te=cg(U.shape,p,g,f,I,S);return Ae.maxPool3dBackprop(C,U,G,Te)},oe={dy:C,input:U,output:G},ge={filterSize:p,strides:g,dilations:f,pad:I,dimRoundingMode:S},fe=Y.runKernelFunc(te,oe,null,xR,ge);return ne?ie(fe,[fe.shape[1],fe.shape[2],fe.shape[3],fe.shape[4]]):fe}const fE=z({maxPool3dBackprop_:mZ});const gE={kernelName:IR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,dilations:S,pad:x,dimRoundingMode:v}=u,O=S==null?[1,1,1]:S;return{x:()=>fE(r,p,g,f,I,O,x,v)}}};function fZ(r,l,u,p,g,f,I){const S=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),v=M(u,"output","maxPoolBackprop");Z(x.rank===S.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${S.rank})`),Z(S.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${S.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),I!=null&&Z(Qt(f),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${I} but got pad ${f}.`);const O=G=>{const ne=ag(x.shape,p,g,1,f,I);return G.maxPoolBackprop(S,x,v,ne)},C={dy:S,input:x,output:v},U={filterSize:p,strides:g,pad:f,dimRoundingMode:I};return Y.runKernelFunc(O,C,null,SR,U)}const yE=z({maxPoolBackprop_:fZ});const bE={kernelName:LR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p,g]=l,{filterSize:f,strides:I,pad:S}=u;return{x:()=>yE(r,p,g,f,I,S)}}};const wE={kernelName:If,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,u)=>{const p=u,{axis:g}=p,[f,I]=l,S=ut(g,f.shape),x=ds(S,f.rank),v=bg(r,I,f,S,x);return{x:()=>{let O=v.x();return x!=null&&(O=$t(O)),O}}}};const LE={kernelName:xf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=()=>ae(r,Le(yr(u,p),"float32")),f=()=>ae(r,Le(yi(u,p),"float32"));return{a:g,b:f}}};const SE={kernelName:TR,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=Nt(u.shape,g);return S.length>0?ie(Fe(r,S),u.shape):r},I=()=>{const S=ae(r,yt(EI(Pe(u,p)))),x=Nt(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const IE={kernelName:Tf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{const S=ae(r,Le(p,"float32")),x=Nt(u.shape,g);return x.length>0?ie(Fe(S,x),u.shape):S},I=()=>{const S=ae(r,Le(u,"float32")),x=Nt(p.shape,g);return x.length>0?ie(Fe(S,x),p.shape):S};return{a:f,b:I}}};const xE={kernelName:Af,gradFunc:r=>({x:()=>yt(r)})};const TE={kernelName:OR,inputsToSave:["indices"],gradFunc:(r,l)=>{const u=l[0];return{indices:()=>Ds(u.shape,"float32")}}};const AE={kernelName:RR,gradFunc:r=>({x:()=>je(r)})};const ZI={kernelName:vf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const p=l[0],{paddings:g}=u,f=g.map(I=>I[0]);return{x:()=>vt(r,f,p.shape)}}};const vE={kernelName:Nf,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[u,p,g]=l,f=u,I=p,S=it(f.shape,I.shape),x=()=>{const O=Le(I,"float32");let C=ae(r,ae(O,la(f,Be(O,ke(1)))));const U=Nt(f.shape,S);return U.length>0&&(C=Fe(C,U)),ie(C,f.shape)},v=()=>{const O=yi(f,0),C=Mn(O,co(f),je(f));let U=ae(r,ae(g,C));const G=Nt(I.shape,S);return G.length>0&&(U=Fe(U,G)),ie(U,I.shape)};return{a:x,b:v}}};const NE={kernelName:ER,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[u,p]=l,g=yi(u,0);return{x:()=>Mn(g,r,ae(r,p)),alpha:()=>{let f=Mn(g,je(r),ae(r,u));const I=Nt(p.shape,r.shape);return I.length>0&&(f=Fe(f,I)),ie(f,p.shape)}}}};const CE={kernelName:FR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,yt(dt(u)))}}};const RE={kernelName:$R,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l,p=ae(yr(u,6),ha(u));return{x:()=>ae(r,Le(p,"float32"))}}};const OE={kernelName:Cf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,Le(ha(u),"float32"))}}};const EE={kernelName:Rf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ie(r,u.shape)}}};const DE={kernelName:Ef,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeBilinearBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,WR,u);return{images:I}}};const kE={kernelName:Of,inputsToSave:["images"],gradFunc:(r,l,u)=>{const[p]=l,g=S=>{const{alignCorners:x}=u;return S.resizeNearestNeighborBackprop(r,p,x)},f={images:p},I=()=>Y.runKernelFunc(g,f,null,_R,u);return{images:I}}};const FE={kernelName:Df,gradFunc:(r,l,u)=>{const{dims:p}=u,g=ut(p,r.shape);return{x:()=>zc(r,g)}}};const _E={kernelName:UR,gradFunc:r=>({x:()=>je(r)})};const WE={kernelName:kf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>yt(Pe(r,ae(la(u,1.5),2)))}}};const $E={kernelName:Ff,inputsToSave:["condition"],gradFunc:(r,l)=>{const[u]=l;return{condition:()=>Le(je(u),"float32"),t:()=>ae(r,Le(u,r.dtype)),e:()=>ae(r,Le($I(u),r.dtype))}}};const UE={kernelName:BR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>{const p=yi(u,ke(0)),g=ke(p1),f=ke(m1),I=ae(r,f),S=ae(ae(r,g),Pn(Le(u,"float32")));return Mn(p,I,S)}}}};const BE={kernelName:Uf,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(u,Be(ke(1),u)))}}};const ME={kernelName:MR,gradFunc:r=>({x:()=>je(r)})};const PE={kernelName:Wf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Ou(Le(u,"float32")),r)}}};const zE={kernelName:$f,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(vI(Le(u,"float32")),r)}}};const GE={kernelName:_f,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{begin:g,size:f}=u,I=p.shape,[S,x]=rg(p,g,f),v=[];for(let O=0;OPI(r,v)}}};const VE={kernelName:zR,outputsToSave:[!0],gradFunc:(r,l,u)=>{const[p]=l,{dim:g}=u,f=!0,I=ae(r,p);return{logits:()=>Be(I,ae(Fe(I,[g],f),p))}}};const YE={kernelName:PR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,xI(u))}}};const QI={kernelName:Pf,gradFunc:(r,l,u)=>{const{blockShape:p,paddings:g}=u;return{x:()=>TI(r,p,g)}}};const ex={kernelName:zf,gradFunc:(r,l,u)=>{const{axis:p}=u;return{x:()=>yn(r,p)}}};const HE={kernelName:Bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,ae(ps(Le(u,"float32")),2))}}};const qE={kernelName:GR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(r,ae(Le(u,"float32"),2))}}};const jE={kernelName:Gf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=ke(2),f=()=>ae(r,ae(g,Be(u,p))),I=()=>ae(r,ae(g,Be(p,u)));return{a:f,b:I}}};const KE={kernelName:Xf,gradFunc:r=>({x:()=>je(r)})};const XE={kernelName:Vf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[u,p]=l,g=it(u.shape,p.shape),f=()=>{let S=r;const x=Nt(u.shape,g);return x.length>0&&(S=Fe(S,x)),ie(S,u.shape)},I=()=>{let S=r;const x=Nt(p.shape,g);return x.length>0&&(S=Fe(S,x)),ie(yt(S),p.shape)};return{a:f,b:I}}};const JE={kernelName:Mf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,g=p.shape.slice(),{axis:f}=u,I=ut(f,p.shape);I.forEach(v=>{g[v]=1});const S=ie(r,g),x=ae(S,Yi(p.shape,"float32"));return{x:()=>x}}};const ZE={kernelName:VR,inputsToSave:["x"],gradFunc:(r,l)=>{const[u]=l;return{x:()=>Pe(r,dt(Ou(u)))}}};const QE={kernelName:YR,outputsToSave:[!0],gradFunc:(r,l)=>{const[u]=l;return{x:()=>ae(Be(ke(1),dt(u)),r)}}};const eD={kernelName:Yf,inputsToSave:["x"],gradFunc:(r,l,u)=>{const[p]=l,{reps:g}=u,f=()=>{let I=je(p);if(p.rank===1)for(let S=0;S{const p=u,{perm:g}=p,f=Uc(g);return{x:()=>$t(r,f)}}};const nD={kernelName:qf,gradFunc:(r,l,u)=>{const p=u,{axis:g}=p;return{value:()=>qs(r,g)}}};const sD={kernelName:jf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[u]=l,p=()=>gZ(r,u);return{x:p}}};function gZ(r,l){const u=kI(l,je(l)),p=DI(r,u);let g=gr(l,ke(0,"int32"));const f=p.rank-g.rank;for(let S=0;S({x:()=>je(r)})};const yZ=[f1,g1,y1,b1,w1,L1,S1,I1,x1,T1,A1,v1,C1,O1,E1,D1,k1,F1,_1,W1,$1,B1,U1,P1,z1,G1,V1,Y1,H1,q1,j1,K1,X1,J1,Q1,Z1,eE,sE,iE,rE,oE,aE,cE,lE,hE,uE,pE,JI,JI,mE,gE,bE,wE,LE,SE,IE,xE,TE,AE,ZI,ZI,vE,NE,CE,RE,OE,EE,DE,kE,FE,_E,WE,$E,UE,BE,ME,PE,zE,GE,VE,YE,QI,QI,ex,ex,HE,jE,qE,KE,XE,JE,ZE,QE,eD,tD,nD,sD,iD];for(const r of yZ)jR(r);function Gm(r,l,u=!1){const{Image:p,Canvas:g}=mt.getEnv();if(!(r instanceof p||r instanceof g))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const f=to(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=Zo({width:l,height:l}),O=r instanceof g?r:Ac(r),C=Math.abs(S-x)/2,U=u&&S{if(dr(u)){this._imageTensors[p]=u,this._inputDimensions[p]=u.shape;return}if(Cs(u)){const f=u.shape[0];if(f!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${f} passed, but not supported in input array`);this._imageTensors[p]=u,this._inputDimensions[p]=u.shape.slice(1);return}const g=u instanceof mt.getEnv().Canvas?u:Ac(u);this._canvases[p]=g,this._inputDimensions[p]=[g.height,g.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 Bi(this.batchSize,0,1).map((r,l)=>this.getReshapedInputDimensions(l))}getInput(r){return this.canvases[r]||this.imageTensors[r]}getInputDimensions(r){return this._inputDimensions[r]}getInputHeight(r){return this._inputDimensions[r][0]}getInputWidth(r){return this._inputDimensions[r][1]}getReshapedInputDimensions(r){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");const l=this.getInputWidth(r),u=this.getInputHeight(r);return HS({width:l,height:u},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,IO(()=>{const u=Bi(this.batchSize,0,1).map(g=>{const f=this.getInput(g);if(f instanceof xn){let I=Cs(f)?f:f.expandDims();return I=Nm(I,l),(I.shape[1]!==r||I.shape[2]!==r)&&(I=d1.resizeBilinear(I,[r,r])),I.as3D(r,r,3)}if(f instanceof mt.getEnv().Canvas)return LI.fromPixels(Gm(f,r,l));throw new Error(`toBatchTensor - at batchIdx ${g}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${f}`)}),p=qs(u.map(g=>Le(g,"float32"))).as4D(this.batchSize,r,r,3);return p})}}async function Tt(r){if(r instanceof hr)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const u=g=>Array.isArray(r)?` at input index ${g}:`:"",p=l.map(eo);return p.forEach((g,f)=>{if(!bu(g)&&!dr(g)&&!Cs(g))throw typeof l[f]=="string"?new Error(`toNetInput -${u(f)} string passed, but could not resolve HTMLElement for element id ${l[f]}`):new Error(`toNetInput -${u(f)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Cs(g)){const I=g.shape[0];if(I!==1)throw new Error(`toNetInput -${u(f)} tf.Tensor4D with batchSize ${I} passed, but not supported in input array`)}}),await Promise.all(p.map(g=>bu(g)&&qm(g))),new hr(p,Array.isArray(r))}async function Xo(r,l){const{Canvas:u}=mt.getEnv();let p=r;if(!(r instanceof u)){const I=await Tt(r);if(I.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const S=I.getInput(0);p=S instanceof u?S:await Vm(S)}const g=Un(p),f=l.map(I=>I instanceof Wt?I.forSize(p.width,p.height).box.floor():I).map(I=>I.clipAtImageBorders(p.width,p.height));return f.map(({x:I,y:S,width:x,height:v})=>{const O=Zo({width:x,height:v});return Un(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const wg=Xe(Je());async function Jo(r,l){if(!dr(r)&&!Cs(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Cs(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return wg.tidy(()=>{const[u,p,g]=r.shape.slice(Cs(r)?1:0),f=l.map(S=>S instanceof Wt?S.forSize(p,u).box:S).map(S=>S.clipAtImageBorders(p,u)),I=f.map(({x:S,y:x,width:v,height:O})=>wg.slice3d(r.as3D(u,p,g),[x,S,0],[O,v,g]));return I})}async function no(r,l){const u=mt.getEnv().fetch,p=await u(r,l);if(!(p.status<400))throw new Error(`failed to fetch: (${p.status}) ${p.statusText}, from url: ${p.url}`);return p}async function p2(r){const l=await no(r),u=await l.blob();if(!u.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${u.type}, for url: ${l.url}`);return Hm(u)}async function Ym(r){return(await no(r)).json()}async function d2(r){return new Float32Array(await(await no(r)).arrayBuffer())}function Lg(r,l){const u=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:u};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${u}`};const p=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(p,"");const g=r.split("/").filter(S=>S),f=r.endsWith(".json")?g[g.length-1]:u;let I=p+(r.endsWith(".json")?g.slice(0,g.length-1):g).join("/");return I=r.startsWith("/")?`/${I}`:I,{modelBaseUri:I,manifestUri:I==="/"?`/${f}`:`${I}/${f}`}}const rD=Xe(Je());async function zm(r,l){const{manifestUri:u,modelBaseUri:p}=Lg(r,l);let g=await Ym(u);return rD.io.loadWeights(g,p)}function u2(r,l,u=!1){const{width:p,height:g}=u?to(l):l;return r.width=p,r.height=g,{width:p,height:g}}const br=Xe(Je());class In{constructor(r){this._name=r;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(r){const{obj:l,objProp:u}=this.traversePropertyPath(r);return l[u]}reassignParamFromPath(r,l){const{obj:u,objProp:p}=this.traversePropertyPath(r);u[p].dispose(),u[p]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof br.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof br.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const u=br.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,u)})}dispose(r=!0){this.getParamList().forEach(l=>{if(r&&l.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${l.path}`);l.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:r})=>Array.from(r.dataSync())).reduce((r,l)=>r.concat(l)))}async load(r){if(r instanceof Float32Array){this.extractWeights(r);return}await this.loadFromUri(r)}async loadFromUri(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);const l=await zm(r,this.getDefaultModelName());this.loadFromWeightMap(l)}async loadFromDisk(r){if(r&&typeof r!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);const{readFile:l}=mt.getEnv(),{manifestUri:u,modelBaseUri:p}=Lg(r,this.getDefaultModelName()),g=x=>Promise.all(x.map(v=>l(v).then(O=>O.buffer))),f=br.io.weightsLoaderFactory(g),I=JSON.parse((await l(u)).toString()),S=await f(I,p);this.loadFromWeightMap(S)}loadFromWeightMap(r){const{paramMappings:l,params:u}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=u}extractWeights(r){const{paramMappings:l,params:u}=this.extractParams(r);this._paramMappings=l,this._params=u}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((g,f)=>{if(!g.nextObj.hasOwnProperty(f))throw new Error(`traversePropertyPath - object does not have property ${f}, for path ${r}`);return{obj:g.nextObj,objProp:f,nextObj:g.nextObj[f]}},{nextObj:this.params}),{obj:u,objProp:p}=l;if(!u||!p||!(u[p]instanceof br.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:u,objProp:p}}}const Vc=Xe(Je());function es(r,l,u){return Vc.tidy(()=>{let p=Vc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Vc.add(p,l.bias),p})}const Dt=Xe(Je());function Sg(r,l,u=!1){return Dt.tidy(()=>{const p=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):es(r,l.conv0,[2,2])),g=es(p,l.conv1,[1,1]),f=Dt.relu(Dt.add(p,g)),I=es(f,l.conv2,[1,1]);return Dt.relu(Dt.add(p,Dt.add(g,I)))})}function Wu(r,l,u=!1,p=!0){return Dt.tidy(()=>{const g=Dt.relu(u?Dt.add(Dt.conv2d(r,l.conv0.filters,p?[2,2]:[1,1],"same"),l.conv0.bias):es(r,l.conv0,p?[2,2]:[1,1])),f=es(g,l.conv1,[1,1]),I=Dt.relu(Dt.add(g,f)),S=es(I,l.conv2,[1,1]),x=Dt.relu(Dt.add(g,Dt.add(f,S))),v=es(x,l.conv3,[1,1]);return Dt.relu(Dt.add(g,Dt.add(f,Dt.add(S,v))))})}const uo=Xe(Je());function da(r,l,u="same",p=!1){return uo.tidy(()=>{const g=uo.add(uo.conv2d(r,l.filters,[1,1],u),l.bias);return p?uo.relu(g):g})}function zn(r,l){Object.keys(r).forEach(u=>{l.some(p=>p.originalPath===u)||r[u].dispose()})}const Ig=Xe(Je());function Yc(r,l){return function(u,p,g,f){const I=Ig.tensor4d(r(u*p*g*g),[g,g,u,p]),S=Ig.tensor1d(r(p));return l.push({paramPath:`${f}/filters`},{paramPath:`${f}/bias`}),{filters:I,bias:S}}}const xg=Xe(Je());function Tg(r,l){return function(u,p,g){const f=xg.tensor2d(r(u*p),[u,p]),I=xg.tensor1d(r(p));return l.push({paramPath:`${g}/weights`},{paramPath:`${g}/bias`}),{weights:f,bias:I}}}class tx{constructor(r,l,u){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=u}}const $u=Xe(Je());function Hc(r,l){return function(u,p,g){const f=$u.tensor4d(r(3*3*u),[3,3,u,1]),I=$u.tensor4d(r(u*p),[1,1,u,p]),S=$u.tensor1d(r(p));return l.push({paramPath:`${g}/depthwise_filter`},{paramPath:`${g}/pointwise_filter`},{paramPath:`${g}/bias`}),new tx(f,I,S)}}function qc(r){return function(l){const u=r(`${l}/depthwise_filter`,4),p=r(`${l}/pointwise_filter`,4),g=r(`${l}/bias`,1);return new tx(u,p,g)}}function ms(r,l){return function(u,p,g){const f=r[u];if(!ea(f,p))throw new Error(`expected weightMap[${u}] to be a Tensor${p}D, instead have ${f}`);return l.push({originalPath:u,paramPath:g||u}),f}}function Gn(r){let l=r;function u(g){const f=l.slice(0,g);return l=l.slice(g),f}function p(){return l}return{extractWeights:u,getRemainingWeights:p}}function Ag(r,l){const u=Yc(r,l),p=Hc(r,l);function g(I,S,x,v=!1){const O=v?u(I,S,3,`${x}/conv0`):p(I,S,`${x}/conv0`),C=p(S,S,`${x}/conv1`),U=p(S,S,`${x}/conv2`);return{conv0:O,conv1:C,conv2:U}}function f(I,S,x,v=!1){const{conv0:O,conv1:C,conv2:U}=g(I,S,x,v),G=p(S,S,`${x}/conv3`);return{conv0:O,conv1:C,conv2:U,conv3:G}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:f}}function oD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractDenseBlock4Params:g}=Ag(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2"),x=g(128,256,"dense3");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S,dense3:x}}}function vg(r){return function(l){const u=r(`${l}/filters`,4),p=r(`${l}/bias`,1);return{filters:u,bias:p}}}function Ng(r,l){const u=ms(r,l),p=vg(u),g=qc(u);function f(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`);return{conv0:v,conv1:O,conv2:C}}function I(S,x=!1){const v=x?p(`${S}/conv0`):g(`${S}/conv0`),O=g(`${S}/conv1`),C=g(`${S}/conv2`),U=g(`${S}/conv3`);return{conv0:v,conv1:O,conv2:C,conv3:U}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:I}}function aD(r){const l=[],{extractDenseBlock4Params:u}=Ng(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2"),dense3:u("dense3")};return zn(r,l),{params:p,paramMappings:l}}const jc=Xe(Je());class Cg extends In{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return jc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(jc.scalar(255));let f=Wu(g,l.dense0,!0);return f=Wu(f,l.dense1),f=Wu(f,l.dense2),f=Wu(f,l.dense3),f=jc.avgPool(f,[7,7],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return aD(r)}extractParams(r){return oD(r)}}const Kc=Xe(Je());function Uu(r,l){return Kc.tidy(()=>Kc.add(Kc.matMul(r,l.weights),l.bias))}function cD(r,l,u){const p=[],{extractWeights:g,getRemainingWeights:f}=Gn(r),I=Tg(g,p),S=I(l,u,"fc");if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:p,params:{fc:S}}}function lD(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:p("fc")};return zn(r,l),{params:g,paramMappings:l}}function Rg(r){const l={},u={};return Object.keys(r).forEach(p=>{const g=p.startsWith("fc")?u:l;g[p]=r[p]}),{featureExtractorMap:l,classifierMap:u}}const hD=Xe(Je());class Og extends In{constructor(r,l){super(r);this._faceFeatureExtractor=l}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return hD.tidy(()=>{const u=r instanceof hr?this.faceFeatureExtractor.forwardInput(r):r;return Uu(u.as2D(u.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return cD(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Rg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),lD(u)}extractParams(r){const l=this.getClassifierChannelsIn(),u=this.getClassifierChannelsOut(),p=u*l+u,g=r.slice(0,r.length-p),f=r.slice(r.length-p);return this.faceFeatureExtractor.extractWeights(g),this.extractClassifierParams(f)}}const Bm=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class Qr{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);Bm.forEach((l,u)=>{this[l]=r[u]})}asSortedArray(){return Bm.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Xc=Xe(Je());class Mm extends Og{constructor(r=new Cg){super("FaceExpressionNet",r)}forwardInput(r){return Xc.tidy(()=>Xc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Tt(r))}async predictExpressions(r){const l=await Tt(r),u=await this.forwardInput(l),p=await Promise.all(Xc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new Qr(f));return l.isBatchInput?g:g[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function $m(r){return r.expressions instanceof Qr}function fu(r,l){const u={expressions:l};return Object.assign({},r,u)}function bZ(r,l,u=.1,p){const g=Array.isArray(l)?l:[l];g.forEach(f=>{const I=f instanceof Qr?f:$m(f)?f.expressions:void 0;if(!I)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const S=I.asSortedArray(),x=S.filter(C=>C.probability>u),v=mi(f)?f.detection.box.bottomLeft:p||new qe(0,0),O=new Oc(x.map(C=>`${C.expression} (${ta(C.probability)})`),v);O.draw(r)})}function Jr(r){return mi(r)&&r.landmarks instanceof Ns&&r.unshiftedLandmarks instanceof Ns&&r.alignedRect instanceof Wt}function Ko(r,l){const{box:u}=r.detection,p=l.shiftBy(u.x,u.y),g=p.align(),{imageDims:f}=r.detection,I=new Wt(r.detection.score,g.rescale(f.reverse()),f),S={landmarks:p,unshiftedLandmarks:l,alignedRect:I};return Object.assign({},r,S)}class uD{constructor(r={}){const{drawLines:l=!0,drawPoints:u=!0,lineWidth:p,lineColor:g,pointSize:f,pointColor:I}=r;this.drawLines=l,this.drawPoints=u,this.lineWidth=p||1,this.pointSize=f||2,this.lineColor=g||"rgba(0, 255, 255, 1)",this.pointColor=I||"rgba(255, 0, 255, 1)"}}class dD{constructor(r,l={}){this.faceLandmarks=r,this.options=new uD(l)}draw(r){const l=Un(r),{drawLines:u,drawPoints:p,lineWidth:g,lineColor:f,pointSize:I,pointColor:S}=this.options;if(u&&this.faceLandmarks instanceof Nc&&(l.strokeStyle=f,l.lineWidth=g,ur(l,this.faceLandmarks.getJawOutline()),ur(l,this.faceLandmarks.getLeftEyeBrow()),ur(l,this.faceLandmarks.getRightEyeBrow()),ur(l,this.faceLandmarks.getNose()),ur(l,this.faceLandmarks.getLeftEye(),!0),ur(l,this.faceLandmarks.getRightEye(),!0),ur(l,this.faceLandmarks.getMouth(),!0)),p){l.strokeStyle=S,l.fillStyle=S;const x=v=>{l.beginPath(),l.arc(v.x,v.y,I,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function wZ(r,l){const u=Array.isArray(l)?l:[l];u.forEach(p=>{const g=p instanceof Ns?p:Jr(p)?p.landmarks:void 0;if(!g)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new dD(g).draw(r)})}const Im={};uu(Im,{AnchorPosition:()=>Pi,DrawBox:()=>QS,DrawBoxOptions:()=>b2,DrawFaceLandmarks:()=>dD,DrawFaceLandmarksOptions:()=>uD,DrawTextField:()=>Oc,DrawTextFieldOptions:()=>Zm,drawContour:()=>ur,drawDetections:()=>E7,drawFaceExpressions:()=>bZ,drawFaceLandmarks:()=>wZ});function LZ(r,l){const u=Yc(r,l),p=Hc(r,l);function g(I,S,x){const v=p(I,S,`${x}/separable_conv0`),O=p(S,S,`${x}/separable_conv1`),C=u(I,S,1,`${x}/expansion_conv`);return{separable_conv0:v,separable_conv1:O,expansion_conv:C}}function f(I,S){const x=p(I,I,`${S}/separable_conv0`),v=p(I,I,`${S}/separable_conv1`),O=p(I,I,`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:u,extractSeparableConvParams:p,extractReductionBlockParams:g,extractMainBlockParams:f}}function pD(r,l){const u=[],{extractWeights:p,getRemainingWeights:g}=Gn(r),{extractConvParams:f,extractSeparableConvParams:I,extractReductionBlockParams:S,extractMainBlockParams:x}=LZ(p,u),v=f(3,32,3,"entry_flow/conv_in"),O=S(32,64,"entry_flow/reduction_block_0"),C=S(64,128,"entry_flow/reduction_block_1"),U={conv_in:v,reduction_block_0:O,reduction_block_1:C},G={};Bi(l,0,1).forEach(ge=>{G[`main_block_${ge}`]=x(128,`middle_flow/main_block_${ge}`)});const ne=S(128,256,"exit_flow/reduction_block"),te=I(256,512,"exit_flow/separable_conv"),oe={reduction_block:ne,separable_conv:te};if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:u,params:{entry_flow:U,middle_flow:G,exit_flow:oe}}}function SZ(r,l){const u=ms(r,l),p=vg(u),g=qc(u);function f(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=p(`${S}/expansion_conv`);return{separable_conv0:x,separable_conv1:v,expansion_conv:O}}function I(S){const x=g(`${S}/separable_conv0`),v=g(`${S}/separable_conv1`),O=g(`${S}/separable_conv2`);return{separable_conv0:x,separable_conv1:v,separable_conv2:O}}return{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}}function mD(r,l){const u=[],{extractConvParams:p,extractSeparableConvParams:g,extractReductionBlockParams:f,extractMainBlockParams:I}=SZ(r,u),S=p("entry_flow/conv_in"),x=f("entry_flow/reduction_block_0"),v=f("entry_flow/reduction_block_1"),O={conv_in:S,reduction_block_0:x,reduction_block_1:v},C={};Bi(l,0,1).forEach(te=>{C[`main_block_${te}`]=I(`middle_flow/main_block_${te}`)});const U=f("exit_flow/reduction_block"),G=g("exit_flow/separable_conv"),ne={reduction_block:U,separable_conv:G};return zn(r,u),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:u}}const dn=Xe(Je());function fD(r,l,u){return dn.add(dn.conv2d(r,l.filters,u,"same"),l.bias)}function nx(r,l,u=!0){let p=u?dn.relu(r):r;return p=es(p,l.separable_conv0,[1,1]),p=es(dn.relu(p),l.separable_conv1,[1,1]),p=dn.maxPool(p,[3,3],[2,2],"same"),p=dn.add(p,fD(r,l.expansion_conv,[2,2])),p}function IZ(r,l){let u=es(dn.relu(r),l.separable_conv0,[1,1]);return u=es(dn.relu(u),l.separable_conv1,[1,1]),u=es(dn.relu(u),l.separable_conv2,[1,1]),u=dn.add(u,r),u}class gD extends In{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return dn.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(dn.scalar(256));let f=dn.relu(fD(g,l.entry_flow.conv_in,[2,2]));return f=nx(f,l.entry_flow.reduction_block_0,!1),f=nx(f,l.entry_flow.reduction_block_1),Bi(this._numMainBlocks,0,1).forEach(I=>{f=IZ(f,l.middle_flow[`main_block_${I}`])}),f=nx(f,l.exit_flow.reduction_block),f=dn.relu(es(f,l.exit_flow.separable_conv,[1,1])),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return mD(r,this._numMainBlocks)}extractParams(r){return pD(r,this._numMainBlocks)}}function yD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),g=Tg(u,l),f=g(512,1,"fc/age"),I=g(512,2,"fc/gender");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{fc:{age:f,gender:I}}}}function bD(r){const l=[],u=ms(r,l);function p(f){const I=u(`${f}/weights`,2),S=u(`${f}/bias`,1);return{weights:I,bias:S}}const g={fc:{age:p("fc/age"),gender:p("fc/gender")}};return zn(r,l),{params:g,paramMappings:l}}var Ui;(function(r){r.FEMALE="female",r.MALE="male"})(Ui||(Ui={}));const Hi=Xe(Je());class jm extends In{constructor(r=new gD(2)){super("AgeGenderNet");this._faceFeatureExtractor=r}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(r){const{params:l}=this;if(!l)throw new Error(`${this._name} - load model before inference`);return Hi.tidy(()=>{const u=r instanceof hr?this.faceFeatureExtractor.forwardInput(r):r,p=Hi.avgPool(u,[7,7],[2,2],"valid").as2D(u.shape[0],-1),g=Uu(p,l.fc.age).as1D(),f=Uu(p,l.fc.gender);return{age:g,gender:f}})}forwardInput(r){return Hi.tidy(()=>{const{age:l,gender:u}=this.runNet(r);return{age:l,gender:Hi.softmax(u)}})}async forward(r){return this.forwardInput(await Tt(r))}async predictAgeAndGender(r){const l=await Tt(r),u=await this.forwardInput(l),p=Hi.unstack(u.age),g=Hi.unstack(u.gender),f=p.map((S,x)=>({ageTensor:S,genderTensor:g[x]})),I=await Promise.all(f.map(async({ageTensor:S,genderTensor:x})=>{const v=(await S.data())[0],O=(await x.data())[0],C=O>.5,U=C?Ui.MALE:Ui.FEMALE,G=C?O:1-O;return S.dispose(),x.dispose(),{age:v,gender:U,genderProbability:G}}));return u.age.dispose(),u.gender.dispose(),l.isBatchInput?I:I[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:u}=this.extractClassifierParams(r);this._params=l,this._paramMappings=u}extractClassifierParams(r){return yD(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:u}=Rg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),bD(u)}extractParams(r){const l=512*1+1+(512*2+2),u=r.slice(0,r.length-l),p=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(u),this.extractClassifierParams(p)}}const fs=Xe(Je());class Eg extends Og{postProcess(r,l,u){const p=u.map(({width:f,height:I})=>{const S=l/Math.max(I,f);return{width:f*S,height:I*S}}),g=p.length;return fs.tidy(()=>{const f=(O,C)=>fs.stack([fs.fill([68],O),fs.fill([68],C)],1).as2D(1,136).as1D(),I=(O,C)=>{const{width:U,height:G}=p[O];return C(U,G)?Math.abs(U-G)/2:0},S=O=>I(O,(C,U)=>CI(O,(C,U)=>Uf(S(C),x(C))))).div(fs.stack(Array.from(Array(g),(O,C)=>f(p[C].width,p[C].height))));return v})}forwardInput(r){return fs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([u,p])=>({height:u,width:p})))})}async forward(r){return this.forwardInput(await Tt(r))}async detectLandmarks(r){const l=await Tt(r),u=fs.tidy(()=>fs.unstack(this.forwardInput(l))),p=await Promise.all(u.map(async(g,f)=>{const I=Array.from(await g.data()),S=I.filter((v,O)=>Km(O)),x=I.filter((v,O)=>!Km(O));return new Nc(Array(68).fill(0).map((v,O)=>new qe(S[O],x[O])),{height:l.getInputHeight(f),width:l.getInputWidth(f)})}));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getClassifierChannelsOut(){return 136}}class xc extends Eg{constructor(r=new Cg){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function wD(r){const l=[],{extractDenseBlock3Params:u}=Ng(r,l),p={dense0:u("dense0",!0),dense1:u("dense1"),dense2:u("dense2")};return zn(r,l),{params:p,paramMappings:l}}function LD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractDenseBlock3Params:g}=Ag(u,l),f=g(3,32,"dense0",!0),I=g(32,64,"dense1"),S=g(64,128,"dense2");if(p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{paramMappings:l,params:{dense0:f,dense1:I,dense2:S}}}const Jc=Xe(Je());class SD extends In{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Jc.tidy(()=>{const u=r.toBatchTensor(112,!0),p=[122.782,117.001,104.298],g=Ys(u,p).div(Jc.scalar(255));let f=Sg(g,l.dense0,!0);return f=Sg(f,l.dense1),f=Sg(f,l.dense2),f=Jc.avgPool(f,[14,14],[2,2],"valid"),f})}async forward(r){return this.forwardInput(await Tt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return wD(r)}extractParams(r){return LD(r)}}class Um extends Eg{constructor(r=new SD){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class h2 extends xc{}const Dg=Xe(Je());function ID(r,l){return Dg.add(Dg.mul(r,l.weights),l.biases)}const Zc=Xe(Je());function sx(r,l,u,p,g="same"){const{filters:f,bias:I}=l.conv;let S=Zc.conv2d(r,f,u,g);return S=Zc.add(S,I),S=ID(S,l.scale),p?Zc.relu(S):S}function xD(r,l){return sx(r,l,[1,1],!0)}function ix(r,l){return sx(r,l,[1,1],!1)}function kg(r,l){return sx(r,l,[2,2],!0,"valid")}const gs=Xe(Je());function xZ(r,l){function u(S,x,v){const O=r(S),C=O.length/(x*v*v);if(YS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${v}`);return gs.tidy(()=>gs.transpose(gs.tensor4d(O,[x,C,v,v]),[2,3,1,0]))}function p(S,x,v,O){const C=u(S,x,v),U=gs.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:U}}function g(S,x){const v=gs.tensor1d(r(S)),O=gs.tensor1d(r(S));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:v,biases:O}}function f(S,x,v,O){const C=p(S,x,v,`${O}/conv`),U=g(x,`${O}/scale`);return{conv:C,scale:U}}function I(S,x,v,O,C=!1){const U=f((C?.5:1)*S,x,v,`${O}/conv1`),G=f(S,x,v,`${O}/conv2`);return{conv1:U,conv2:G}}return{extractConvLayerParams:f,extractResidualLayerParams:I}}function TD(r){const{extractWeights:l,getRemainingWeights:u}=Gn(r),p=[],{extractConvLayerParams:g,extractResidualLayerParams:f}=xZ(l,p),I=g(4704,32,7,"conv32_down"),S=f(9216,32,3,"conv32_1"),x=f(9216,32,3,"conv32_2"),v=f(9216,32,3,"conv32_3"),O=f(36864,64,3,"conv64_down",!0),C=f(36864,64,3,"conv64_1"),U=f(36864,64,3,"conv64_2"),G=f(36864,64,3,"conv64_3"),ne=f(147456,128,3,"conv128_down",!0),te=f(147456,128,3,"conv128_1"),oe=f(147456,128,3,"conv128_2"),ge=f(589824,256,3,"conv256_down",!0),fe=f(589824,256,3,"conv256_1"),Ae=f(589824,256,3,"conv256_2"),Te=f(589824,256,3,"conv256_down_out"),Ve=gs.tidy(()=>gs.transpose(gs.tensor2d(l(256*128),[128,256]),[1,0]));if(p.push({paramPath:"fc"}),u().length!==0)throw new Error(`weights remaing after extract: ${u().length}`);const rt={conv32_down:I,conv32_1:S,conv32_2:x,conv32_3:v,conv64_down:O,conv64_1:C,conv64_2:U,conv64_3:G,conv128_down:ne,conv128_1:te,conv128_2:oe,conv256_down:ge,conv256_1:fe,conv256_2:Ae,conv256_down_out:Te,fc:Ve};return{params:rt,paramMappings:p}}function TZ(r,l){const u=ms(r,l);function p(I){const S=u(`${I}/scale/weights`,1),x=u(`${I}/scale/biases`,1);return{weights:S,biases:x}}function g(I){const S=u(`${I}/conv/filters`,4),x=u(`${I}/conv/bias`,1),v=p(I);return{conv:{filters:S,bias:x},scale:v}}function f(I){return{conv1:g(`${I}/conv1`),conv2:g(`${I}/conv2`)}}return{extractConvLayerParams:g,extractResidualLayerParams:f}}function AD(r){const l=[],{extractConvLayerParams:u,extractResidualLayerParams:p}=TZ(r,l),g=u("conv32_down"),f=p("conv32_1"),I=p("conv32_2"),S=p("conv32_3"),x=p("conv64_down"),v=p("conv64_1"),O=p("conv64_2"),C=p("conv64_3"),U=p("conv128_down"),G=p("conv128_1"),ne=p("conv128_2"),te=p("conv256_down"),oe=p("conv256_1"),ge=p("conv256_2"),fe=p("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!VS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const Te={conv32_down:g,conv32_1:f,conv32_2:I,conv32_3:S,conv64_down:x,conv64_1:v,conv64_2:O,conv64_3:C,conv128_down:U,conv128_1:G,conv128_2:ne,conv256_down:te,conv256_1:oe,conv256_2:ge,conv256_down_out:fe,fc:Ae};return zn(r,l),{params:Te,paramMappings:l}}const Vn=Xe(Je());function bi(r,l){let u=xD(r,l.conv1);return u=ix(u,l.conv2),u=Vn.add(u,r),u=Vn.relu(u),u}function Bu(r,l){let u=kg(r,l.conv1);u=ix(u,l.conv2);let p=Vn.avgPool(r,2,2,"valid");const g=Vn.zeros(p.shape),f=p.shape[3]!==u.shape[3],I=p.shape[1]!==u.shape[1]||p.shape[2]!==u.shape[2];if(I){const S=[...u.shape];S[1]=1;const x=Vn.zeros(S);u=Vn.concat([u,x],1);const v=[...u.shape];v[2]=1;const O=Vn.zeros(v);u=Vn.concat([u,O],2)}return p=f?Vn.concat([p,g],3):p,u=Vn.add(p,u),u=Vn.relu(u),u}const ks=Xe(Je());class Ic extends In{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return ks.tidy(()=>{const u=ks.cast(r.toBatchTensor(150,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(ks.scalar(256));let f=kg(g,l.conv32_down);f=ks.maxPool(f,3,2,"valid"),f=bi(f,l.conv32_1),f=bi(f,l.conv32_2),f=bi(f,l.conv32_3),f=Bu(f,l.conv64_down),f=bi(f,l.conv64_1),f=bi(f,l.conv64_2),f=bi(f,l.conv64_3),f=Bu(f,l.conv128_down),f=bi(f,l.conv128_1),f=bi(f,l.conv128_2),f=Bu(f,l.conv256_down),f=bi(f,l.conv256_1),f=bi(f,l.conv256_2),f=Bu(f,l.conv256_down_out);const I=f.mean([1,2]),S=ks.matMul(I,l.fc);return S})}async forward(r){return this.forwardInput(await Tt(r))}async computeFaceDescriptor(r){const l=await Tt(r),u=ks.tidy(()=>ks.unstack(this.forwardInput(l))),p=await Promise.all(u.map(g=>g.data()));return u.forEach(g=>g.dispose()),l.isBatchInput?p:p[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return AD(r)}extractParams(r){return TD(r)}}function l2(r){const l=new Ic;return l.extractWeights(r),l}function gu(r,l){const u={descriptor:l};return Object.assign({},r,u)}function c2(r){return typeof r.age=="number"}function yu(r,l){const u={age:l};return Object.assign({},r,u)}function a2(r){return(r.gender===Ui.MALE||r.gender===Ui.FEMALE)&&Rc(r.genderProbability)}function mu(r,l,u){const p={gender:l,genderProbability:u};return Object.assign({},r,p)}const wi=Xe(Je());function AZ(r,l){function u(x,v){const O=wi.tensor4d(r(3*3*x),[3,3,x,1]),C=wi.tensor1d(r(x)),U=wi.tensor1d(r(x)),G=wi.tensor1d(r(x)),ne=wi.tensor1d(r(x));return l.push({paramPath:`${v}/filters`},{paramPath:`${v}/batch_norm_scale`},{paramPath:`${v}/batch_norm_offset`},{paramPath:`${v}/batch_norm_mean`},{paramPath:`${v}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:U,batch_norm_mean:G,batch_norm_variance:ne}}function p(x,v,O,C,U){const G=wi.tensor4d(r(x*v*O*O),[O,O,x,v]),ne=wi.tensor1d(r(v));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${U?"batch_norm_offset":"bias"}`}),{filters:G,bias:ne}}function g(x,v,O,C){const{filters:U,bias:G}=p(x,v,O,C,!0);return{filters:U,batch_norm_offset:G}}function f(x,v,O){const C=u(x,`${O}/depthwise_conv`),U=g(x,v,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:U}}function I(){const x=g(3,32,3,"mobilenetv1/conv_0"),v=f(32,64,"mobilenetv1/conv_1"),O=f(64,128,"mobilenetv1/conv_2"),C=f(128,128,"mobilenetv1/conv_3"),U=f(128,256,"mobilenetv1/conv_4"),G=f(256,256,"mobilenetv1/conv_5"),ne=f(256,512,"mobilenetv1/conv_6"),te=f(512,512,"mobilenetv1/conv_7"),oe=f(512,512,"mobilenetv1/conv_8"),ge=f(512,512,"mobilenetv1/conv_9"),fe=f(512,512,"mobilenetv1/conv_10"),Ae=f(512,512,"mobilenetv1/conv_11"),Te=f(512,1024,"mobilenetv1/conv_12"),Ve=f(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,conv_8:oe,conv_9:ge,conv_10:fe,conv_11:Ae,conv_12:Te,conv_13:Ve}}function S(){const x=g(1024,256,1,"prediction_layer/conv_0"),v=g(256,512,3,"prediction_layer/conv_1"),O=g(512,128,1,"prediction_layer/conv_2"),C=g(128,256,3,"prediction_layer/conv_3"),U=g(256,128,1,"prediction_layer/conv_4"),G=g(128,256,3,"prediction_layer/conv_5"),ne=g(256,64,1,"prediction_layer/conv_6"),te=g(64,128,3,"prediction_layer/conv_7"),oe=p(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),ge=p(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),fe=p(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=p(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),Te=p(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Ve=p(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),rt=p(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),Ct=p(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),Ut=p(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=p(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Dn=p(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),An=p(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),vn={box_encoding_predictor:oe,class_predictor:ge},Zs={box_encoding_predictor:fe,class_predictor:Ae},Si={box_encoding_predictor:Te,class_predictor:Ve},Qs={box_encoding_predictor:rt,class_predictor:Ct},fa={box_encoding_predictor:Ut,class_predictor:Kt},ol={box_encoding_predictor:Dn,class_predictor:An};return{conv_0:x,conv_1:v,conv_2:O,conv_3:C,conv_4:U,conv_5:G,conv_6:ne,conv_7:te,box_predictor_0:vn,box_predictor_1:Zs,box_predictor_2:Si,box_predictor_3:Qs,box_predictor_4:fa,box_predictor_5:ol}}return{extractMobilenetV1Params:I,extractPredictionLayerParams:S}}function vD(r){const l=[],{extractWeights:u,getRemainingWeights:p}=Gn(r),{extractMobilenetV1Params:g,extractPredictionLayerParams:f}=AZ(u,l),I=g(),S=f(),x=wi.tensor3d(u(5118*4),[1,5118,4]),v={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),p().length!==0)throw new Error(`weights remaing after extract: ${p().length}`);return{params:{mobilenetv1:I,prediction_layer:S,output_layer:v},paramMappings:l}}function vZ(r,l){const u=ms(r,l);function p(v,O,C){const U=u(`${v}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),G=u(`${v}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:U,batch_norm_offset:G}}function g(v){const O=`mobilenetv1/conv_${v}`,C=`MobilenetV1/Conv2d_${v}_depthwise`,U=`${O}/depthwise_conv`,G=`${O}/pointwise_conv`,ne=u(`${C}/depthwise_weights`,4,`${U}/filters`),te=u(`${C}/BatchNorm/gamma`,1,`${U}/batch_norm_scale`),oe=u(`${C}/BatchNorm/beta`,1,`${U}/batch_norm_offset`),ge=u(`${C}/BatchNorm/moving_mean`,1,`${U}/batch_norm_mean`),fe=u(`${C}/BatchNorm/moving_variance`,1,`${U}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:oe,batch_norm_mean:ge,batch_norm_variance:fe},pointwise_conv:p("MobilenetV1",v,G)}}function f(){return{conv_0:p("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:g(1),conv_2:g(2),conv_3:g(3),conv_4:g(4),conv_5:g(5),conv_6:g(6),conv_7:g(7),conv_8:g(8),conv_9:g(9),conv_10:g(10),conv_11:g(11),conv_12:g(12),conv_13:g(13)}}function I(v,O){const C=u(`${v}/weights`,4,`${O}/filters`),U=u(`${v}/biases`,1,`${O}/bias`);return{filters:C,bias:U}}function S(v){const O=I(`Prediction/BoxPredictor_${v}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${v}/box_encoding_predictor`),C=I(`Prediction/BoxPredictor_${v}/ClassPredictor`,`prediction_layer/box_predictor_${v}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:p("Prediction",0,"prediction_layer/conv_0"),conv_1:p("Prediction",1,"prediction_layer/conv_1"),conv_2:p("Prediction",2,"prediction_layer/conv_2"),conv_3:p("Prediction",3,"prediction_layer/conv_3"),conv_4:p("Prediction",4,"prediction_layer/conv_4"),conv_5:p("Prediction",5,"prediction_layer/conv_5"),conv_6:p("Prediction",6,"prediction_layer/conv_6"),conv_7:p("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:S(0),box_predictor_1:S(1),box_predictor_2:S(2),box_predictor_3:S(3),box_predictor_4:S(4),box_predictor_5:S(5)}}return{extractMobilenetV1Params:f,extractPredictionLayerParams:x}}function ND(r){const l=[],{extractMobilenetV1Params:u,extractPredictionLayerParams:p}=vZ(r,l),g=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!dr(g))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${g}`);const f={mobilenetv1:u(),prediction_layer:p(),output_layer:{extra_dim:g}};return zn(r,l),{params:f,paramMappings:l}}const po=Xe(Je());function Ks(r,l,u){return po.tidy(()=>{let p=po.conv2d(r,l.filters,u,"same");return p=po.add(p,l.batch_norm_offset),po.clipByValue(p,0,6)})}const wr=Xe(Je()),NZ=.0010000000474974513;function CZ(r,l,u){return wr.tidy(()=>{let p=wr.depthwiseConv2d(r,l.filters,u,"same");return p=wr.batchNorm(p,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,NZ),wr.clipByValue(p,0,6)})}function RZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function CD(r,l){return wr.tidy(()=>{let u,p=Ks(r,l.conv_0,[2,2]);const g=[l.conv_1,l.conv_2,l.conv_3,l.conv_4,l.conv_5,l.conv_6,l.conv_7,l.conv_8,l.conv_9,l.conv_10,l.conv_11,l.conv_12,l.conv_13];if(g.forEach((f,I)=>{const S=I+1,x=RZ(S);p=CZ(p,f.depthwise_conv,x),p=Ks(p,f.pointwise_conv,[1,1]),S===11&&(u=p)}),u===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:p,conv11:u}})}function RD(r,l,u,p,g){const f=r.shape[0],I=Math.min(u,f),S=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>g).sort((O,C)=>C.score-O.score),x=O=>O<=p?1:0,v=[];return S.forEach(O=>{if(v.length>=I)return;const C=O.score;for(let U=v.length-1;U>=0;--U){const G=OZ(r,O.boxIndex,v[U]);if(G===0)continue;if(O.score*=x(G),O.score<=g)break}C===O.score&&v.push(O.boxIndex)}),v}function OZ(r,l,u){const p=r.arraySync(),g=Math.min(p[l][0],p[l][2]),f=Math.min(p[l][1],p[l][3]),I=Math.max(p[l][0],p[l][2]),S=Math.max(p[l][1],p[l][3]),x=Math.min(p[u][0],p[u][2]),v=Math.min(p[u][1],p[u][3]),O=Math.max(p[u][0],p[u][2]),C=Math.max(p[u][1],p[u][3]),U=(I-g)*(S-f),G=(O-x)*(C-v);if(U<=0||G<=0)return 0;const ne=Math.max(g,x),te=Math.max(f,v),oe=Math.min(I,O),ge=Math.min(S,C),fe=Math.max(oe-ne,0)*Math.max(ge-te,0);return fe/(U+G-fe)}const De=Xe(Je());function EZ(r){const l=De.unstack(De.transpose(r,[1,0])),u=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],p=[De.add(l[0],De.div(u[0],De.scalar(2))),De.add(l[1],De.div(u[1],De.scalar(2)))];return{sizes:u,centers:p}}function DZ(r,l){const{sizes:u,centers:p}=EZ(r),g=De.unstack(De.transpose(l,[1,0])),f=De.div(De.mul(De.exp(De.div(g[2],De.scalar(5))),u[0]),De.scalar(2)),I=De.add(De.mul(De.div(g[0],De.scalar(10)),u[0]),p[0]),S=De.div(De.mul(De.exp(De.div(g[3],De.scalar(5))),u[1]),De.scalar(2)),x=De.add(De.mul(De.div(g[1],De.scalar(10)),u[1]),p[1]);return De.transpose(De.stack([De.sub(I,f),De.sub(x,S),De.add(I,f),De.add(x,S)]),[1,0])}function OD(r,l,u){return De.tidy(()=>{const p=r.shape[0];let g=DZ(De.reshape(De.tile(u.extra_dim,[p,1,1]),[-1,4]),De.reshape(r,[-1,4]));g=De.reshape(g,[p,g.shape[0]/p,4]);const f=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let I=De.slice(f,[0,0,0],[-1,-1,1]);I=De.reshape(I,[p,I.shape[1]]);const S=De.unstack(g),x=De.unstack(I);return{boxes:S,scores:x}})}const Mu=Xe(Je());function pa(r,l){return Mu.tidy(()=>{const u=r.shape[0],p=Mu.reshape(da(r,l.box_encoding_predictor),[u,-1,1,4]),g=Mu.reshape(da(r,l.class_predictor),[u,-1,3]);return{boxPredictionEncoding:p,classPrediction:g}})}const Pu=Xe(Je());function ED(r,l,u){return Pu.tidy(()=>{const p=Ks(r,u.conv_0,[1,1]),g=Ks(p,u.conv_1,[2,2]),f=Ks(g,u.conv_2,[1,1]),I=Ks(f,u.conv_3,[2,2]),S=Ks(I,u.conv_4,[1,1]),x=Ks(S,u.conv_5,[2,2]),v=Ks(x,u.conv_6,[1,1]),O=Ks(v,u.conv_7,[2,2]),C=pa(l,u.box_predictor_0),U=pa(r,u.box_predictor_1),G=pa(g,u.box_predictor_2),ne=pa(I,u.box_predictor_3),te=pa(x,u.box_predictor_4),oe=pa(O,u.box_predictor_5),ge=Pu.concat([C.boxPredictionEncoding,U.boxPredictionEncoding,G.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,oe.boxPredictionEncoding],1),fe=Pu.concat([C.classPrediction,U.classPrediction,G.classPrediction,ne.classPrediction,te.classPrediction,oe.classPrediction],1);return{boxPredictions:ge,classPredictions:fe}})}class Vs{constructor({minConfidence:r,maxResults:l}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=r||.5,this._maxResults=l||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}}const Li=Xe(Je());class jo extends In{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return Li.tidy(()=>{const u=Li.cast(r.toBatchTensor(512,!1),"float32"),p=Li.sub(Li.mul(u,Li.scalar(.007843137718737125)),Li.scalar(1)),g=CD(p,l.mobilenetv1),{boxPredictions:f,classPredictions:I}=ED(g.out,g.conv11,l.prediction_layer);return OD(f,I,l.output_layer)})}async forward(r){return this.forwardInput(await Tt(r))}async locateFaces(r,l={}){const{maxResults:u,minConfidence:p}=new Vs(l),g=await Tt(r),{boxes:f,scores:I}=this.forwardInput(g),S=f[0],x=I[0];for(let fe=1;fe{const[Ae,Te]=[Math.max(0,oe[fe][0]),Math.min(1,oe[fe][2])].map(Ct=>Ct*te),[Ve,rt]=[Math.max(0,oe[fe][1]),Math.min(1,oe[fe][3])].map(Ct=>Ct*ne);return new Wt(v[fe],new vc(Ve,Ae,rt-Ve,Te-Ae),{height:g.getInputHeight(0),width:g.getInputWidth(0)})});return S.dispose(),x.dispose(),ge}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return ND(r)}extractParams(r){return vD(r)}}function $S(r){const l=new jo;return l.extractWeights(r),l}function UC(r){return $S(r)}class BC extends jo{}const DD=.4,kD=[new qe(.738768,.874946),new qe(2.42204,2.65704),new qe(4.30971,7.04493),new qe(10.246,4.59428),new qe(12.6868,11.8741)],FD=[new qe(1.603231,2.094468),new qe(6.041143,7.080126),new qe(2.882459,3.518061),new qe(4.266906,5.178857),new qe(9.041765,10.66308)],_D=[117.001,114.697,97.404],WD="tiny_yolov2_model",$D="tiny_yolov2_separable_conv_model";const Fg=r=>typeof r=="number";function Tm(r){if(!r)throw new Error(`invalid config: ${r}`);if(typeof r.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${r.withSeparableConvs}`);if(!Fg(r.iouThreshold)||r.iouThreshold<0||r.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${r.iouThreshold}`);if(!Array.isArray(r.classes)||!r.classes.length||!r.classes.every(l=>typeof l=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(r.classes)}`);if(!Array.isArray(r.anchors)||!r.anchors.length||!r.anchors.map(l=>l||{}).every(l=>Fg(l.x)&&Fg(l.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(r.anchors)}`);if(r.meanRgb&&(!Array.isArray(r.meanRgb)||r.meanRgb.length!==3||!r.meanRgb.every(Fg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const Xs=Xe(Je());function Qc(r){return Xs.tidy(()=>{const l=Xs.mul(r,Xs.scalar(.10000000149011612));return Xs.add(Xs.relu(Xs.sub(r,l)),l)})}const Js=Xe(Je());function Lr(r,l){return Js.tidy(()=>{let u=Js.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=Js.conv2d(u,l.conv.filters,[1,1],"valid"),u=Js.sub(u,l.bn.sub),u=Js.mul(u,l.bn.truediv),u=Js.add(u,l.conv.bias),Qc(u)})}const mo=Xe(Je());function Sr(r,l){return mo.tidy(()=>{let u=mo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=mo.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=mo.add(u,l.bias),Qc(u)})}const rx=Xe(Je());function kZ(r,l){const u=Yc(r,l);function p(I,S){const x=rx.tensor1d(r(I)),v=rx.tensor1d(r(I));return l.push({paramPath:`${S}/sub`},{paramPath:`${S}/truediv`}),{sub:x,truediv:v}}function g(I,S,x){const v=u(I,S,3,`${x}/conv`),O=p(S,`${x}/bn`);return{conv:v,bn:O}}const f=Hc(r,l);return{extractConvParams:u,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}}function UD(r,l,u,p){const{extractWeights:g,getRemainingWeights:f}=Gn(r),I=[],{extractConvParams:S,extractConvWithBatchNormParams:x,extractSeparableConvParams:v}=kZ(g,I);let O;if(l.withSeparableConvs){const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=l.isFirstLayerConv2d?S(C,U,3,"conv0"):v(C,U,"conv0"),Ve=v(U,G,"conv1"),rt=v(G,ne,"conv2"),Ct=v(ne,te,"conv3"),Ut=v(te,oe,"conv4"),Kt=v(oe,ge,"conv5"),Dn=fe?v(ge,fe,"conv6"):void 0,An=Ae?v(fe,Ae,"conv7"):void 0,vn=S(Ae||fe||ge,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:Ct,conv4:Ut,conv5:Kt,conv6:Dn,conv7:An,conv8:vn}}else{const[C,U,G,ne,te,oe,ge,fe,Ae]=p,Te=x(C,U,"conv0"),Ve=x(U,G,"conv1"),rt=x(G,ne,"conv2"),Ct=x(ne,te,"conv3"),Ut=x(te,oe,"conv4"),Kt=x(oe,ge,"conv5"),Dn=x(ge,fe,"conv6"),An=x(fe,Ae,"conv7"),vn=S(Ae,5*u,1,"conv8");O={conv0:Te,conv1:Ve,conv2:rt,conv3:Ct,conv4:Ut,conv5:Kt,conv6:Dn,conv7:An,conv8:vn}}if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{params:O,paramMappings:I}}function FZ(r,l){const u=ms(r,l);function p(S){const x=u(`${S}/sub`,1),v=u(`${S}/truediv`,1);return{sub:x,truediv:v}}function g(S){const x=u(`${S}/filters`,4),v=u(`${S}/bias`,1);return{filters:x,bias:v}}function f(S){const x=g(`${S}/conv`),v=p(`${S}/bn`);return{conv:x,bn:v}}const I=qc(u);return{extractConvParams:g,extractConvWithBatchNormParams:f,extractSeparableConvParams:I}}function BD(r,l){const u=[],{extractConvParams:p,extractConvWithBatchNormParams:g,extractSeparableConvParams:f}=FZ(r,u);let I;if(l.withSeparableConvs){const S=l.filterSizes&&l.filterSizes.length||9;I={conv0:l.isFirstLayerConv2d?p("conv0"):f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:S>7?f("conv6"):void 0,conv7:S>8?f("conv7"):void 0,conv8:p("conv8")}}else I={conv0:g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:g("conv6"),conv7:g("conv7"),conv8:p("conv8")};return zn(r,u),{params:I,paramMappings:u}}var Am;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(Am||(Am={}));class $i{constructor({inputSize:r,scoreThreshold:l}={}){this._name="TinyYolov2Options";if(this._inputSize=r||416,this._scoreThreshold=l||.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}}const kt=Xe(Je());class el extends In{constructor(r){super("TinyYolov2");Tm(r),this._config=r}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(r,l){let u=Lr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Lr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=Lr(u,l.conv6),u=Lr(u,l.conv7),da(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Qc(da(r,l.conv0,"valid",!1)):Sr(r,l.conv0);return u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv1),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv2),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv3),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv4),u=kt.maxPool(u,[2,2],[2,2],"same"),u=Sr(u,l.conv5),u=kt.maxPool(u,[2,2],[1,1],"same"),u=l.conv6?Sr(u,l.conv6):u,u=l.conv7?Sr(u,l.conv7):u,da(u,l.conv8,"valid",!1)}forwardInput(r,l){const{params:u}=this;if(!u)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let p=kt.cast(r.toBatchTensor(l,!1),"float32");return p=this.config.meanRgb?Ys(p,this.config.meanRgb):p,p=p.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(p,u):this.runTinyYolov2(p,u)})}async forward(r,l){return await this.forwardInput(await Tt(r),l)}async detect(r,l={}){const{inputSize:u,scoreThreshold:p}=new $i(l),g=await Tt(r),f=await this.forwardInput(g,u),I=kt.tidy(()=>kt.unstack(f)[0].expandDims()),S={width:g.getInputWidth(0),height:g.getInputHeight(0)},x=await this.extractBoxes(I,g.getReshapedInputDimensions(0),p);f.dispose(),I.dispose();const v=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),U=x.map(te=>this.config.classes[te.label]),G=Cm(v.map(te=>te.rescale(u)),O,this.config.iouThreshold,!0),ne=G.map(te=>new Qo(O[te],C[te],U[te],v[te],S));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return BD(r,this.config)}extractParams(r){const l=this.config.filterSizes||el.DEFAULT_FILTER_SIZES,u=l?l.length:void 0;if(u!==7&&u!==8&&u!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${u} filterSizes in config`);return UD(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,u){const{width:p,height:g}=l,f=Math.max(p,g),I=f/p,S=f/g,x=r.shape[1],v=this.config.anchors.length,[O,C,U]=kt.tidy(()=>{const oe=r.reshape([x,x,v,this.boxEncodingSize]),ge=oe.slice([0,0,0,0],[x,x,v,4]),fe=oe.slice([0,0,0,4],[x,x,v,1]),Ae=this.withClassScores?kt.softmax(oe.slice([0,0,0,5],[x,x,v,this.config.classes.length]),3):kt.scalar(0);return[ge,fe,Ae]}),G=[],ne=await C.array(),te=await O.array();for(let oe=0;oeu){const Te=(ge+Sc(te[oe][ge][fe][0]))/x*I,Ve=(oe+Sc(te[oe][ge][fe][1]))/x*S,rt=Math.exp(te[oe][ge][fe][2])*this.config.anchors[fe].x/x*I,Ct=Math.exp(te[oe][ge][fe][3])*this.config.anchors[fe].y/x*S,Ut=Te-rt/2,Kt=Ve-Ct/2,Dn={row:oe,col:ge,anchor:fe},{classScore:An,label:vn}=this.withClassScores?await this.extractPredictedClass(U,Dn):{classScore:1,label:0};G.push({box:new Cc(Ut,Kt,Ut+rt,Kt+Ct),score:Ae,classScore:Ae*An,label:vn,...Dn})}}return O.dispose(),C.dispose(),U.dispose(),G}async extractPredictedClass(r,l){const{row:u,col:p,anchor:g}=l,f=await r.array();return Array(this.config.classes.length).fill(0).map((I,S)=>f[u][p][g][S]).map((I,S)=>({classScore:I,label:S})).reduce((I,S)=>I.classScore>S.classScore?I:S)}}el.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class wc extends el{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:DD,classes:["face"]},r?{anchors:FD,meanRgb:_D}:{anchors:kD,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Wt(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?$D:WD}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function WC(r,l=!0){const u=new wc(l);return u.extractWeights(r),u}class vm extends $i{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class Hs{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const ox=Xe(Je());async function ma(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>Jr(x)?g(x):x.detection),I=p||(l instanceof ox.Tensor?await Jo(l,f):await Xo(l,f)),S=await u(I);return I.forEach(x=>x instanceof ox.Tensor&&x.dispose()),S}async function tl(r,l,u,p,g){return ma([r],l,async f=>u(f[0]),p,g)}const MD=.4,PD=[new qe(1.603231,2.094468),new qe(6.041143,7.080126),new qe(2.882459,3.518061),new qe(4.266906,5.178857),new qe(9.041765,10.66308)],zD=[117.001,114.697,97.404];class Lc extends el{constructor(){const r={withSeparableConvs:!0,iouThreshold:MD,classes:["face"],anchors:PD,meanRgb:zD,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const u=await this.detect(r,l);return u.map(p=>new Wt(p.score,p.relativeBox,{width:p.imageWidth,height:p.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const ht={ssdMobilenetv1:new jo,tinyFaceDetector:new Lc,tinyYolov2:new wc,faceLandmark68Net:new xc,faceLandmark68TinyNet:new Um,faceRecognitionNet:new Ic,faceExpressionNet:new Mm,ageGenderNet:new jm},BS=(r,l)=>ht.ssdMobilenetv1.locateFaces(r,l),zC=(r,l)=>ht.tinyFaceDetector.locateFaces(r,l),GC=(r,l)=>ht.tinyYolov2.locateFaces(r,l),MS=r=>ht.faceLandmark68Net.detectLandmarks(r),VC=r=>ht.faceLandmark68TinyNet.detectLandmarks(r),YC=r=>ht.faceRecognitionNet.computeFaceDescriptor(r),HC=r=>ht.faceExpressionNet.predictExpressions(r),qC=r=>ht.ageGenderNet.predictAgeAndGender(r),PS=r=>ht.ssdMobilenetv1.load(r),jC=r=>ht.tinyFaceDetector.load(r),KC=r=>ht.tinyYolov2.load(r),XC=r=>ht.faceLandmark68Net.load(r),JC=r=>ht.faceLandmark68TinyNet.load(r),ZC=r=>ht.faceRecognitionNet.load(r),QC=r=>ht.faceExpressionNet.load(r),e2=r=>ht.ageGenderNet.load(r),t2=PS,n2=BS,s2=MS;class GD extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class Vu extends GD{async run(){const r=await this.parentTask,l=await ma(r,this.input,async u=>await Promise.all(u.map(p=>ht.faceExpressionNet.predictExpressions(p))),this.extractedFaces);return r.map((u,p)=>fu(u,l[p]))}withAgeAndGender(){return new zu(this,this.input)}}class Yu extends GD{async run(){const r=await this.parentTask;if(!r)return;const l=await tl(r,this.input,u=>ht.faceExpressionNet.predictExpressions(u),this.extractedFaces);return fu(r,l)}withAgeAndGender(){return new Gu(this,this.input)}}class il extends Vu{withAgeAndGender(){return new nl(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class rl extends Yu{withAgeAndGender(){return new sl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class VD extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.extractedFaces=u}}class zu extends VD{async run(){const r=await this.parentTask,l=await ma(r,this.input,async u=>await Promise.all(u.map(p=>ht.ageGenderNet.predictAgeAndGender(p))),this.extractedFaces);return r.map((u,p)=>{const{age:g,gender:f,genderProbability:I}=l[p];return yu(mu(u,f,I),g)})}withFaceExpressions(){return new Vu(this,this.input)}}class Gu extends VD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:u,genderProbability:p}=await tl(r,this.input,g=>ht.ageGenderNet.predictAgeAndGender(g),this.extractedFaces);return yu(mu(r,u,p),l)}withFaceExpressions(){return new Yu(this,this.input)}}class nl extends zu{withFaceExpressions(){return new il(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class sl extends Gu{withFaceExpressions(){return new rl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class Wm extends Hs{constructor(r,l){super();this.parentTask=r;this.input=l}}class Kr extends Wm{async run(){const r=await this.parentTask,l=await ma(r,this.input,u=>Promise.all(u.map(p=>ht.faceRecognitionNet.computeFaceDescriptor(p))),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return l.map((u,p)=>gu(r[p],u))}withFaceExpressions(){return new il(this,this.input)}withAgeAndGender(){return new nl(this,this.input)}}class Xr extends Wm{async run(){const r=await this.parentTask;if(!r)return;const l=await tl(r,this.input,u=>ht.faceRecognitionNet.computeFaceDescriptor(u),null,u=>u.landmarks.align(null,{useDlibAlignment:!0}));return gu(r,l)}withFaceExpressions(){return new rl(this,this.input)}withAgeAndGender(){return new sl(this,this.input)}}const Hu=Xe(Je());class km extends Hs{constructor(r,l,u){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=u}get landmarkNet(){return this.useTinyLandmarkNet?ht.faceLandmark68TinyNet:ht.faceLandmark68Net}}class Fm extends km{async run(){const r=await this.parentTask,l=r.map(g=>g.detection),u=this.input instanceof Hu.Tensor?await Jo(this.input,l):await Xo(this.input,l),p=await Promise.all(u.map(g=>this.landmarkNet.detectLandmarks(g)));return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),r.map((g,f)=>Ko(g,p[f]))}withFaceExpressions(){return new il(this,this.input)}withAgeAndGender(){return new nl(this,this.input)}withFaceDescriptors(){return new Kr(this,this.input)}}class _m extends km{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,u=this.input instanceof Hu.Tensor?await Jo(this.input,[l]):await Xo(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),Ko(r,p)}withFaceExpressions(){return new rl(this,this.input)}withAgeAndGender(){return new sl(this,this.input)}withFaceDescriptor(){return new Xr(this,this.input)}}class Em extends Hs{constructor(r,l=new Vs){super();this.input=r;this.options=l}}class pu extends Em{async run(){const{input:r,options:l}=this,u=l instanceof vm?p=>ht.tinyFaceDetector.locateFaces(p,l):l instanceof Vs?p=>ht.ssdMobilenetv1.locateFaces(p,l):l instanceof $i?p=>ht.tinyYolov2.locateFaces(p,l):null;if(!u)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return u(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(u=>Zr({},u)))})}withFaceLandmarks(r=!1){return new Fm(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Vu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new zu(this.runAndExtendWithFaceDetections(),this.input)}}class Dm extends Em{async run(){const r=await new pu(this.input,this.options);let l=r[0];return r.forEach(u=>{u.score>l.score&&(l=u)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?Zr({},l):void 0)})}withFaceLandmarks(r=!1){return new _m(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new Yu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Gu(this.runAndExtendWithFaceDetection(),this.input)}}function i2(r,l=new Vs){return new Dm(r,l)}function du(r,l=new Vs){return new pu(r,l)}async function zS(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await du(r,new Vs(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function r2(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await du(r,new $i(l)).withFaceLandmarks().withFaceDescriptors()}const o2=zS;function Pm(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const u=Array.from(r),p=Array.from(l);return Math.sqrt(u.map((g,f)=>g-p[f]).reduce((g,f)=>g+Math.pow(f,2),0))}class GS{constructor(r,l=.6){this._distanceThreshold=l;const u=Array.isArray(r)?r:[r];if(!u.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let p=1;const g=()=>`person ${p++}`;this._labeledDescriptors=u.map(f=>{if(f instanceof so)return f;if(f instanceof Float32Array)return new so(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new so(g(),[f.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(r,l){return l.map(u=>Pm(u,r)).reduce((u,p)=>u+p,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:u})=>new Lu(u,this.computeMeanDistance(r,l))).reduce((l,u)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(u=>so.fromJSON(u));return new GS(l,r.distanceThreshold)}}function $C(r){const l=new Lc;return l.extractWeights(r),l}function US(r,l){const{width:u,height:p}=new Zn(l.width,l.height);if(u<=0||p<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:u,height:p})}`);if(Array.isArray(r))return r.map(g=>US(g,{width:u,height:p}));if(Jr(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Ko(Zr(r,g),f)}return mi(r)?Zr(r,r.detection.forSize(u,p)):r instanceof Ns||r instanceof Wt?r.forSize(u,p):r}var FC="0.7.3";return g2();})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.nobundle.js b/dist/face-api.nobundle.js new file mode 100644 index 0000000..171420d --- /dev/null +++ b/dist/face-api.nobundle.js @@ -0,0 +1,2 @@ +var fe=Object.defineProperty,pn=Object.prototype.hasOwnProperty,fn=(t,e)=>()=>(e||(e={exports:{}},t(e.exports,e)),e.exports),jr=t=>fe(t,"__esModule",{value:!0}),He=(t,e)=>{jr(t);for(var r in e)fe(t,r,{get:e[r],enumerable:!0})},ln=(t,e)=>{if(jr(t),typeof e=="object"||typeof e=="function")for(let r in e)!pn.call(t,r)&&r!=="default"&&fe(t,r,{get:()=>e[r],enumerable:!0});return t},un=t=>t&&t.__esModule?t:ln(fe({},"default",{value:t,enumerable:!0}),t);var Hr=fn((dn,$r)=>{He(dn,{isNodejs:()=>hn});function hn(){return typeof global=="object"&&!0&&typeof $r!="undefined"&&typeof process!="undefined"&&!!process.version}});function Z(t,e,r=!1){if(t.beginPath(),e.slice(1).forEach(({x:o,y:n},a)=>{const i=e[a];t.moveTo(i.x,i.y),t.lineTo(o,n)}),r){const o=e[e.length-1],n=e[0];if(!o||!n)return;t.moveTo(o.x,o.y),t.lineTo(n.x,n.y)}t.stroke()}class S{constructor(t,e){if(!H(t)||!H(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 S(1/this.width,1/this.height)}}const Ge={};He(Ge,{computeReshapedDimensions:()=>Ve,getCenterPoint:()=>ut,isDimensions:()=>ue,isEven:()=>le,isFloat:()=>Ye,isTensor:()=>ft,isTensor1D:()=>bn,isTensor2D:()=>ze,isTensor3D:()=>K,isTensor4D:()=>W,isValidNumber:()=>H,isValidProbablitiy:()=>Mt,range:()=>X,round:()=>lt});import{Tensor as gn}from"@tensorflow/tfjs/dist/tf.es2017.js";function ft(t,e){return t instanceof gn&&t.shape.length===e}function bn(t){return ft(t,1)}function ze(t){return ft(t,2)}function K(t){return ft(t,3)}function W(t){return ft(t,4)}function Ye(t){return t%1!==0}function le(t){return t%2===0}function lt(t,e=2){const r=Math.pow(10,e);return Math.floor(t*r)/r}function ue(t){return t&&t.width&&t.height}function Ve({width:t,height:e},r){const o=r/Math.max(e,t);return new S(Math.round(t*o),Math.round(e*o))}function ut(t){return t.reduce((e,r)=>e.add(r),new g(0,0)).div(new g(t.length,t.length))}function X(t,e,r){return Array(t).fill(0).map((o,n)=>e+n*r)}function H(t){return!!t&&t!==Infinity&&t!==-Infinity&&!isNaN(t)||t===0}function Mt(t){return H(t)&&0<=t&&t<=1}class g{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new g(this.x+t.x,this.y+t.y)}sub(t){return new g(this.x-t.x,this.y-t.y)}mul(t){return new g(this.x*t.x,this.y*t.y)}div(t){return new g(this.x/t.x,this.y/t.y)}abs(){return new g(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(Math.pow(this.x,2)+Math.pow(this.y,2))}floor(){return new g(Math.floor(this.x),Math.floor(this.y))}}class F{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(H)}static assertIsValidBox(t,e,r=!1){if(!F.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){const r=t||{},o=[r.left,r.top,r.right,r.bottom].every(H),n=[r.x,r.y,r.width,r.height].every(H);if(!n&&!o)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);const[a,i,s,c]=n?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];F.assertIsValidBox({x:a,y:i,width:s,height:c},"Box.constructor",e),this._x=a,this._y=i,this._width=s,this._height=c}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 g(this.left,this.top)}get topRight(){return new g(this.right,this.top)}get bottomLeft(){return new g(this.left,this.bottom)}get bottomRight(){return new g(this.right,this.bottom)}round(){const[t,e,r,o]=[this.x,this.y,this.width,this.height].map(n=>Math.round(n));return new F({x:t,y:e,width:r,height:o})}floor(){const[t,e,r,o]=[this.x,this.y,this.width,this.height].map(n=>Math.floor(n));return new F({x:t,y:e,width:r,height:o})}toSquare(){let{x:t,y:e,width:r,height:o}=this;const n=Math.abs(r-o);return re&&(i=-p+e+r,p=e),f>t&&(s=-f+t+o,f=t),c<1&&(s=2-c,c=1),m<1&&(s=2-m,m=1),{dy:a,edy:s,dx:n,edx:i,y:m,ey:f,x:c,ex:p,w:r,h:o}}calibrate(t){return new F({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()}}class Ut extends F{constructor(t,e,r,o,n=!1){super({left:t,top:e,right:r,bottom:o},n)}}class Ct{constructor(t,e,r,o,n){this._imageDims=new S(n.width,n.height),this._score=t,this._classScore=e,this._className=r,this._box=new F(o).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 F(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new Ct(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}}class _ extends Ct{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){const{score:r,relativeBox:o,imageDims:n}=super.forSize(t,e);return new _(r,o,n)}}function Ue(t,e,r=!0){const o=Math.max(0,Math.min(t.right,e.right)-Math.max(t.left,e.left)),n=Math.max(0,Math.min(t.bottom,e.bottom)-Math.max(t.top,e.top)),a=o*n;return r?a/(t.area+e.area-a):a/Math.min(t.area,e.area)}function Xe(t){const e=t.map(s=>s.x),r=t.map(s=>s.y),o=e.reduce((s,c)=>ccss({score:i,boxIndex:s})).sort((i,s)=>i.score-s.score).map(i=>i.boxIndex);const a=[];for(;n.length>0;){const i=n.pop();a.push(i);const s=n,c=[];for(let m=0;mc[p]<=r)}return a}import{concat as xn,fill as qe,sub as vn,tidy as yn}from"@tensorflow/tfjs/dist/tf.es2017.js";function G(t,e){return yn(()=>{const[r,o,n]=e,a=qe([...t.shape.slice(0,3),1],r),i=qe([...t.shape.slice(0,3),1],o),s=qe([...t.shape.slice(0,3),1],n),c=xn([a,i,s],3);return vn(t,c)})}import{cast as Tn,concat as Fn,fill as wn,tidy as Pn}from"@tensorflow/tfjs/dist/tf.es2017.js";function Ze(t,e=!1){return Pn(()=>{const[r,o]=t.shape.slice(1);if(r===o)return t;const n=Math.abs(r-o),a=Math.round(n*(e?.5:1)),i=r>o?2:1,s=l=>{const u=t.shape.slice();return u[i]=l,wn(u,0)},c=s(a),m=n-c.shape[i],p=e&&m?s(m):null,f=[p,t,c].filter(l=>!!l).map(l=>Tn(l,"float32"));return Fn(f,i)})}function _n(t){const e=t.slice();for(let r=e.length-1;r>0;r--){const o=Math.floor(Math.random()*(r+1)),n=e[r];e[r]=e[o],e[o]=n}return e}function Xt(t){return 1/(1+Math.exp(-t))}function Dn(t){return Math.log(t/(1-t))}class Jt extends F{constructor(t,e,r,o,n=!1){super({x:t,y:e,width:r,height:o},n)}}const En=.5,Mn=.43,Cn=.45;class O{constructor(t,e,r=new g(0,0)){const{width:o,height:n}=e;this._imgDims=new S(o,n),this._shift=r,this._positions=t.map(a=>a.mul(new g(o,n)).add(r))}get shift(){return new g(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 g(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 g(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){const n=t instanceof _?t.box.floor():new F(t);return this.shiftBy(n.x,n.y).align(null,e)}const{useDlibAlignment:r,minBoxPadding:o}=Object.assign({},{useDlibAlignment:!1,minBoxPadding:.2},e);return r?this.alignDlib():this.alignMinBbox(o)}alignDlib(){const t=this.getRefPointsForAlignment(),[e,r,o]=t,n=p=>o.sub(p).magnitude(),a=(n(e)+n(r))/2,i=Math.floor(a/Cn),s=ut(t),c=Math.floor(Math.max(0,s.x-En*i)),m=Math.floor(Math.max(0,s.y-Mn*i));return new Jt(c,m,Math.min(i,this.imageWidth+c),Math.min(i,this.imageHeight+m))}alignMinBbox(t){const e=Xe(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}}class kn extends O{getRefPointsForAlignment(){const t=this.positions;return[t[0],t[1],ut([t[3],t[4]])]}}class qt extends O{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(ut)}}class de{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?` (${lt(this.distance)})`:""}`}}class he extends F{static assertIsValidLabeledBox(t,e){if(F.assertIsValidBox(t,e),!H(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}}class dt{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){const e=t.descriptors.map(r=>new Float32Array(r));return new dt(t.label,e)}}class Nn extends he{static assertIsValidPredictedBox(t,e){if(he.assertIsValidLabeledBox(t,e),!Mt(t.score)||!Mt(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,o){super(t,e);this._score=r,this._classScore=o}get score(){return this._score}get classScore(){return this._classScore}}function J(t){return t.detection instanceof _}function ht(t,e){const r={detection:e};return Object.assign({},t,r)}function Ke(){const t=window.fetch||function(){throw new Error("fetch - missing fetch implementation for browser environment")},e=function(){throw new Error("readFile - filesystem not available for browser environment")};return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:t,readFile:e}}function ge(t){let e="";if(!t)try{t=require("fs")}catch(o){e=o.toString()}const r=t?function(o){return new Promise((n,a)=>{t.readFile(o,function(i,s){return i?a(i):n(s)})})}:function(){throw new Error(`readFile - failed to require fs in nodejs environment with error: ${e}`)};return{readFile:r}}function Qe(){const t=global.Canvas||global.HTMLCanvasElement,e=global.Image||global.HTMLImageElement,r=function(){if(t)return new t;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},o=function(){if(e)return new e;throw new Error("createImageElement - missing Image implementation for nodejs environment")},n=global.fetch||function(){throw new Error("fetch - missing fetch implementation for nodejs environment")},a=ge();return{Canvas:t||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:e||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:r,createImageElement:o,fetch:n,...a}}function tr(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}const er=un(Hr());let D;function Ln(){if(!D)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return D}function rr(t){D=t}function or(){if(tr())return rr(Ke());if(er.isNodejs())return rr(Qe())}function In(t){if(D||or(),!D)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");const{Canvas:e=D.Canvas,Image:r=D.Image}=t;D.Canvas=e,D.Image=r,D.createCanvasElement=t.createCanvasElement||(()=>new e),D.createImageElement=t.createImageElement||(()=>new r),D.ImageData=t.ImageData||D.ImageData,D.Video=t.Video||D.Video,D.fetch=t.fetch||D.fetch,D.readFile=t.readFile||D.readFile}const T={getEnv:Ln,setEnv:rr,initialize:or,createBrowserEnv:Ke,createFileSystem:ge,createNodejsEnv:Qe,monkeyPatch:In,isBrowser:tr,isNodejs:er.isNodejs};or();function gt(t){return!T.isNodejs()&&typeof t=="string"?document.getElementById(t):t}function N(t){const{Canvas:e,CanvasRenderingContext2D:r}=T.getEnv();if(t instanceof r)return t;const o=gt(t);if(!(o instanceof e))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");const n=o.getContext("2d");if(!n)throw new Error("resolveContext2d - canvas 2d context is null");return n}var q;(function(t){t.TOP_LEFT="TOP_LEFT",t.TOP_RIGHT="TOP_RIGHT",t.BOTTOM_LEFT="BOTTOM_LEFT",t.BOTTOM_RIGHT="BOTTOM_RIGHT"})(q||(q={}));class be{constructor(t={}){const{anchorPosition:e,backgroundColor:r,fontColor:o,fontSize:n,fontStyle:a,padding:i}=t;this.anchorPosition=e||q.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=o||"rgba(255, 255, 255, 1)",this.fontSize=n||14,this.fontStyle=a||"Georgia",this.padding=i||4}}class kt{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof kt?t.text:t,this.anchor=e,this.options=new be(r)}measureWidth(t){const{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,o)=>r{const u=s+p.x,v=s+p.y+(l+1)*a;r.fillText(f,u,v)})}}class Gr{constructor(t={}){const{boxColor:e,lineWidth:r,label:o,drawLabelOptions:n}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=o;const a={anchorPosition:q.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new be(Object.assign({},a,n))}}class nr{constructor(t,e={}){this.box=new F(t),this.options=new Gr(e)}draw(t){const e=N(t),{boxColor:r,lineWidth:o}=this.options,{x:n,y:a,width:i,height:s}=this.box;e.strokeStyle=r,e.lineWidth=o,e.strokeRect(n,a,i,s);const{label:c}=this.options;c&&new kt([c],{x:n-o/2,y:a},this.options.drawLabelOptions).draw(t)}}function Sn(t,e){const r=Array.isArray(e)?e:[e];r.forEach(o=>{const n=o instanceof _?o.score:J(o)?o.detection.score:void 0,a=o instanceof _?o.box:J(o)?o.detection.box:new F(o),i=n?`${lt(n)}`:void 0;new nr(a,{label:i}).draw(t)})}function Zt(t){const{Image:e,Video:r}=T.getEnv();return t instanceof e&&t.complete||t instanceof r&&t.readyState>=3}function ar(t){return new Promise((e,r)=>{if(t instanceof T.getEnv().Canvas||Zt(t))return e(null);function o(a){if(!a.currentTarget)return;a.currentTarget.removeEventListener("load",o),a.currentTarget.removeEventListener("error",n),e(a)}function n(a){if(!a.currentTarget)return;a.currentTarget.removeEventListener("load",o),a.currentTarget.removeEventListener("error",n),r(a)}t.addEventListener("load",o),t.addEventListener("error",n)})}function sr(t){return new Promise((e,r)=>{if(!(t instanceof Blob))return r("bufferToImage - expected buf to be of type: Blob");const o=new FileReader;o.onload=()=>{if(typeof o.result!="string")return r("bufferToImage - expected reader.result to be a string, in onload");const n=T.getEnv().createImageElement();n.onload=()=>e(n),n.onerror=r,n.src=o.result},o.onerror=r,o.readAsDataURL(t)})}function bt(t){const{Image:e,Video:r}=T.getEnv();return t instanceof e?new S(t.naturalWidth,t.naturalHeight):t instanceof r?new S(t.videoWidth,t.videoHeight):new S(t.width,t.height)}function Nt({width:t,height:e}){const{createCanvasElement:r}=T.getEnv(),o=r();return o.width=t,o.height=e,o}function Kt(t,e){const{ImageData:r}=T.getEnv();if(!(t instanceof r)&&!Zt(t))throw new Error("createCanvasFromMedia - media has not finished loading yet");const{width:o,height:n}=e||bt(t),a=Nt({width:o,height:n});return t instanceof r?N(a).putImageData(t,0,0):N(a).drawImage(t,0,0,o,n),a}import{browser as An,tidy as Wn}from"@tensorflow/tfjs/dist/tf.es2017.js";async function ir(t,e){const r=e||T.getEnv().createCanvasElement(),[o,n,a]=t.shape.slice(W(t)?1:0),i=Wn(()=>t.as3D(o,n,a).toInt());return await An.toPixels(i,r),i.dispose(),r}function xe(t){const{Image:e,Canvas:r,Video:o}=T.getEnv();return t instanceof e||t instanceof r||t instanceof o}function cr(t,e,r=!1){const{Image:o,Canvas:n}=T.getEnv();if(!(t instanceof o||t instanceof n))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const a=bt(t),i=e/Math.max(a.height,a.width),s=i*a.width,c=i*a.height,m=Nt({width:e,height:e}),p=t instanceof n?t:Kt(t),f=Math.abs(s-c)/2,l=r&&s{if(K(r)){this._imageTensors[o]=r,this._inputDimensions[o]=r.shape;return}if(W(r)){const 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[o]=r,this._inputDimensions[o]=r.shape.slice(1);return}const n=r instanceof T.getEnv().Canvas?r:Kt(r);this._canvases[o]=n,this._inputDimensions[o]=[n.height,n.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 X(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");const e=this.getInputWidth(t),r=this.getInputHeight(t);return Ve({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,Hn(()=>{const r=X(this.batchSize,0,1).map(n=>{const a=this.getInput(n);if(a instanceof Bn){let i=W(a)?a:a.expandDims();return i=Ze(i,e),(i.shape[1]!==t||i.shape[2]!==t)&&(i=jn.resizeBilinear(i,[t,t])),i.as3D(t,t,3)}if(a instanceof T.getEnv().Canvas)return Rn.fromPixels(cr(a,t,e));throw new Error(`toBatchTensor - at batchIdx ${n}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${a}`)}),o=$n(r.map(n=>On(n,"float32"))).as4D(this.batchSize,t,t,3);return o})}}async function w(t){if(t instanceof st)return t;let e=Array.isArray(t)?t:[t];if(!e.length)throw new Error("toNetInput - empty array passed as input");const r=n=>Array.isArray(t)?` at input index ${n}:`:"",o=e.map(gt);return o.forEach((n,a)=>{if(!xe(n)&&!K(n)&&!W(n))throw typeof e[a]=="string"?new Error(`toNetInput -${r(a)} string passed, but could not resolve HTMLElement for element id ${e[a]}`):new Error(`toNetInput -${r(a)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(W(n)){const i=n.shape[0];if(i!==1)throw new Error(`toNetInput -${r(a)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(o.map(n=>xe(n)&&ar(n))),new st(o,Array.isArray(t))}async function Lt(t,e){const{Canvas:r}=T.getEnv();let o=t;if(!(t instanceof r)){const i=await w(t);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const s=i.getInput(0);o=s instanceof r?s:await ir(s)}const n=N(o),a=e.map(i=>i instanceof _?i.forSize(o.width,o.height).box.floor():i).map(i=>i.clipAtImageBorders(o.width,o.height));return a.map(({x:i,y:s,width:c,height:m})=>{const p=Nt({width:c,height:m});return N(p).putImageData(n.getImageData(i,s,c,m),0,0),p})}import{slice3d as Gn,tidy as zn}from"@tensorflow/tfjs/dist/tf.es2017.js";async function It(t,e){if(!K(t)&&!W(t))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(W(t)&&t.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return zn(()=>{const[r,o,n]=t.shape.slice(W(t)?1:0),a=e.map(s=>s instanceof _?s.forSize(o,r).box:s).map(s=>s.clipAtImageBorders(o,r)),i=a.map(({x:s,y:c,width:m,height:p})=>Gn(t.as3D(r,o,n),[c,s,0],[p,m,n]));return i})}async function xt(t,e){const r=T.getEnv().fetch,o=await r(t,e);if(!(o.status<400))throw new Error(`failed to fetch: (${o.status}) ${o.statusText}, from url: ${o.url}`);return o}async function Yn(t){const e=await xt(t),r=await e.blob();if(!r.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${r.type}, for url: ${e.url}`);return sr(r)}async function mr(t){return(await xt(t)).json()}async function Vn(t){return new Float32Array(await(await xt(t)).arrayBuffer())}function ve(t,e){const r=`${e}-weights_manifest.json`;if(!t)return{modelBaseUri:"",manifestUri:r};if(t==="/")return{modelBaseUri:"/",manifestUri:`/${r}`};const o=t.startsWith("http://")?"http://":t.startsWith("https://")?"https://":"";t=t.replace(o,"");const n=t.split("/").filter(s=>s),a=t.endsWith(".json")?n[n.length-1]:r;let i=o+(t.endsWith(".json")?n.slice(0,n.length-1):n).join("/");return i=t.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${a}`:`${i}/${a}`}}import{io as Un}from"@tensorflow/tfjs/dist/tf.es2017.js";async function pr(t,e){const{manifestUri:r,modelBaseUri:o}=ve(t,e);let n=await mr(r);return Un.loadWeights(n,o)}function Xn(t,e,r=!1){const{width:o,height:n}=r?bt(e):e;return t.width=o,t.height=n,{width:o,height:n}}import{Tensor as Jn,Variable as zr,io as qn,tensor as Zn}from"@tensorflow/tfjs/dist/tf.es2017.js";class E{constructor(t){this._name=t;this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){const{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){const{obj:r,objProp:o}=this.traversePropertyPath(t);r[o].dispose(),r[o]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof zr)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof zr))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{const r=Zn(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`);const e=await pr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);const{readFile:e}=T.getEnv(),{manifestUri:r,modelBaseUri:o}=ve(t,this.getDefaultModelName()),n=c=>Promise.all(c.map(m=>e(m).then(p=>p.buffer))),a=qn.weightsLoaderFactory(n),i=JSON.parse((await e(r)).toString()),s=await a(i,o);this.loadFromWeightMap(s)}loadFromWeightMap(t){const{paramMappings:e,params:r}=this.extractParamsFromWeigthMap(t);this._paramMappings=e,this._params=r}extractWeights(t){const{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");const e=t.split("/").reduce((n,a)=>{if(!n.nextObj.hasOwnProperty(a))throw new Error(`traversePropertyPath - object does not have property ${a}, for path ${t}`);return{obj:n.nextObj,objProp:a,nextObj:n.nextObj[a]}},{nextObj:this.params}),{obj:r,objProp:o}=e;if(!r||!o||!(r[o]instanceof Jn))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:o}}}import{add as Kn,separableConv2d as Qn,tidy as ta}from"@tensorflow/tfjs/dist/tf.es2017.js";function L(t,e,r){return ta(()=>{let o=Qn(t,e.depthwise_filter,e.pointwise_filter,r,"same");return o=Kn(o,e.bias),o})}import{add as z,conv2d as Yr,relu as vt,tidy as Vr}from"@tensorflow/tfjs/dist/tf.es2017.js";function ye(t,e,r=!1){return Vr(()=>{const o=vt(r?z(Yr(t,e.conv0.filters,[2,2],"same"),e.conv0.bias):L(t,e.conv0,[2,2])),n=L(o,e.conv1,[1,1]),a=vt(z(o,n)),i=L(a,e.conv2,[1,1]);return vt(z(o,z(n,i)))})}function Qt(t,e,r=!1,o=!0){return Vr(()=>{const n=vt(r?z(Yr(t,e.conv0.filters,o?[2,2]:[1,1],"same"),e.conv0.bias):L(t,e.conv0,o?[2,2]:[1,1])),a=L(n,e.conv1,[1,1]),i=vt(z(n,a)),s=L(i,e.conv2,[1,1]),c=vt(z(n,z(a,s))),m=L(c,e.conv3,[1,1]);return vt(z(n,z(a,z(s,m))))})}import{add as ea,conv2d as ra,relu as oa,tidy as na}from"@tensorflow/tfjs/dist/tf.es2017.js";function yt(t,e,r="same",o=!1){return na(()=>{const n=ea(ra(t,e.filters,[1,1],r),e.bias);return o?oa(n):n})}function M(t,e){Object.keys(t).forEach(r=>{e.some(o=>o.originalPath===r)||t[r].dispose()})}import{tensor1d as aa,tensor4d as sa}from"@tensorflow/tfjs/dist/tf.es2017.js";function St(t,e){return function(r,o,n,a){const i=sa(t(r*o*n*n),[n,n,r,o]),s=aa(t(o));return e.push({paramPath:`${a}/filters`},{paramPath:`${a}/bias`}),{filters:i,bias:s}}}import{tensor1d as ia,tensor2d as ca}from"@tensorflow/tfjs/dist/tf.es2017.js";function Te(t,e){return function(r,o,n){const a=ca(t(r*o),[r,o]),i=ia(t(o));return e.push({paramPath:`${n}/weights`},{paramPath:`${n}/bias`}),{weights:a,bias:i}}}class fr{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}}import{tensor1d as ma,tensor4d as Ur}from"@tensorflow/tfjs/dist/tf.es2017.js";function At(t,e){return function(r,o,n){const a=Ur(t(3*3*r),[3,3,r,1]),i=Ur(t(r*o),[1,1,r,o]),s=ma(t(o));return e.push({paramPath:`${n}/depthwise_filter`},{paramPath:`${n}/pointwise_filter`},{paramPath:`${n}/bias`}),new fr(a,i,s)}}function Wt(t){return function(e){const r=t(`${e}/depthwise_filter`,4),o=t(`${e}/pointwise_filter`,4),n=t(`${e}/bias`,1);return new fr(r,o,n)}}function A(t,e){return function(r,o,n){const a=t[r];if(!ft(a,o))throw new Error(`expected weightMap[${r}] to be a Tensor${o}D, instead have ${a}`);return e.push({originalPath:r,paramPath:n||r}),a}}function C(t){let e=t;function r(n){const a=e.slice(0,n);return e=e.slice(n),a}function o(){return e}return{extractWeights:r,getRemainingWeights:o}}function Fe(t,e){const r=St(t,e),o=At(t,e);function n(i,s,c,m=!1){const p=m?r(i,s,3,`${c}/conv0`):o(i,s,`${c}/conv0`),f=o(s,s,`${c}/conv1`),l=o(s,s,`${c}/conv2`);return{conv0:p,conv1:f,conv2:l}}function a(i,s,c,m=!1){const{conv0:p,conv1:f,conv2:l}=n(i,s,c,m),u=o(s,s,`${c}/conv3`);return{conv0:p,conv1:f,conv2:l,conv3:u}}return{extractDenseBlock3Params:n,extractDenseBlock4Params:a}}function Xr(t){const e=[],{extractWeights:r,getRemainingWeights:o}=C(t),{extractDenseBlock4Params:n}=Fe(r,e),a=n(3,32,"dense0",!0),i=n(32,64,"dense1"),s=n(64,128,"dense2"),c=n(128,256,"dense3");if(o().length!==0)throw new Error(`weights remaing after extract: ${o().length}`);return{paramMappings:e,params:{dense0:a,dense1:i,dense2:s,dense3:c}}}function we(t){return function(e){const r=t(`${e}/filters`,4),o=t(`${e}/bias`,1);return{filters:r,bias:o}}}function Pe(t,e){const r=A(t,e),o=we(r),n=Wt(r);function a(s,c=!1){const m=c?o(`${s}/conv0`):n(`${s}/conv0`),p=n(`${s}/conv1`),f=n(`${s}/conv2`);return{conv0:m,conv1:p,conv2:f}}function i(s,c=!1){const m=c?o(`${s}/conv0`):n(`${s}/conv0`),p=n(`${s}/conv1`),f=n(`${s}/conv2`),l=n(`${s}/conv3`);return{conv0:m,conv1:p,conv2:f,conv3:l}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:i}}function Jr(t){const e=[],{extractDenseBlock4Params:r}=Pe(t,e),o={dense0:r("dense0",!0),dense1:r("dense1"),dense2:r("dense2"),dense3:r("dense3")};return M(t,e),{params:o,paramMappings:e}}import{avgPool as pa,scalar as fa,tidy as la}from"@tensorflow/tfjs/dist/tf.es2017.js";class _e extends E{constructor(){super("FaceFeatureExtractor")}forwardInput(t){const{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return la(()=>{const r=t.toBatchTensor(112,!0),o=[122.782,117.001,104.298],n=G(r,o).div(fa(255));let a=Qt(n,e.dense0,!0);return a=Qt(a,e.dense1),a=Qt(a,e.dense2),a=Qt(a,e.dense3),a=pa(a,[7,7],[2,2],"valid"),a})}async forward(t){return this.forwardInput(await w(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(t){return Jr(t)}extractParams(t){return Xr(t)}}import{add as ua,matMul as da,tidy as ha}from"@tensorflow/tfjs/dist/tf.es2017.js";function te(t,e){return ha(()=>ua(da(t,e.weights),e.bias))}function qr(t,e,r){const o=[],{extractWeights:n,getRemainingWeights:a}=C(t),i=Te(n,o),s=i(e,r,"fc");if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:o,params:{fc:s}}}function Zr(t){const e=[],r=A(t,e);function o(a){const i=r(`${a}/weights`,2),s=r(`${a}/bias`,1);return{weights:i,bias:s}}const n={fc:o("fc")};return M(t,e),{params:n,paramMappings:e}}function De(t){const e={},r={};return Object.keys(t).forEach(o=>{const n=o.startsWith("fc")?r:e;n[o]=t[o]}),{featureExtractorMap:e,classifierMap:r}}import{tidy as ga}from"@tensorflow/tfjs/dist/tf.es2017.js";class Ee extends E{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){const{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return ga(()=>{const r=t instanceof st?this.faceFeatureExtractor.forwardInput(t):t;return te(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){const{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return qr(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(t){const{featureExtractorMap:e,classifierMap:r}=De(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Zr(r)}extractParams(t){const e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),o=r*e+r,n=t.slice(0,t.length-o),a=t.slice(t.length-o);return this.faceFeatureExtractor.extractWeights(n),this.extractClassifierParams(a)}}const lr=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class Tt{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);lr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return lr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}}import{softmax as ba,tidy as xa,unstack as va}from"@tensorflow/tfjs/dist/tf.es2017.js";class ur extends Ee{constructor(t=new _e){super("FaceExpressionNet",t)}forwardInput(t){return xa(()=>ba(this.runNet(t)))}async forward(t){return this.forwardInput(await w(t))}async predictExpressions(t){const e=await w(t),r=await this.forwardInput(e),o=await Promise.all(va(r).map(async a=>{const i=await a.data();return a.dispose(),i}));r.dispose();const n=o.map(a=>new Tt(a));return e.isBatchInput?n:n[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function dr(t){return t.expressions instanceof Tt}function Me(t,e){const r={expressions:e};return Object.assign({},t,r)}function ya(t,e,r=.1,o){const n=Array.isArray(e)?e:[e];n.forEach(a=>{const i=a instanceof Tt?a:dr(a)?a.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const s=i.asSortedArray(),c=s.filter(f=>f.probability>r),m=J(a)?a.detection.box.bottomLeft:o||new g(0,0),p=new kt(c.map(f=>`${f.expression} (${lt(f.probability)})`),m);p.draw(t)})}function Ft(t){return J(t)&&t.landmarks instanceof O&&t.unshiftedLandmarks instanceof O&&t.alignedRect instanceof _}function Bt(t,e){const{box:r}=t.detection,o=e.shiftBy(r.x,r.y),n=o.align(),{imageDims:a}=t.detection,i=new _(t.detection.score,n.rescale(a.reverse()),a),s={landmarks:o,unshiftedLandmarks:e,alignedRect:i};return Object.assign({},t,s)}class Kr{constructor(t={}){const{drawLines:e=!0,drawPoints:r=!0,lineWidth:o,lineColor:n,pointSize:a,pointColor:i}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=o||1,this.pointSize=a||2,this.lineColor=n||"rgba(0, 255, 255, 1)",this.pointColor=i||"rgba(255, 0, 255, 1)"}}class Qr{constructor(t,e={}){this.faceLandmarks=t,this.options=new Kr(e)}draw(t){const e=N(t),{drawLines:r,drawPoints:o,lineWidth:n,lineColor:a,pointSize:i,pointColor:s}=this.options;if(r&&this.faceLandmarks instanceof qt&&(e.strokeStyle=a,e.lineWidth=n,Z(e,this.faceLandmarks.getJawOutline()),Z(e,this.faceLandmarks.getLeftEyeBrow()),Z(e,this.faceLandmarks.getRightEyeBrow()),Z(e,this.faceLandmarks.getNose()),Z(e,this.faceLandmarks.getLeftEye(),!0),Z(e,this.faceLandmarks.getRightEye(),!0),Z(e,this.faceLandmarks.getMouth(),!0)),o){e.strokeStyle=s,e.fillStyle=s;const c=m=>{e.beginPath(),e.arc(m.x,m.y,i,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(c)}}}function Ta(t,e){const r=Array.isArray(e)?e:[e];r.forEach(o=>{const n=o instanceof O?o:Ft(o)?o.landmarks:void 0;if(!n)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Qr(n).draw(t)})}const hr={};He(hr,{AnchorPosition:()=>q,DrawBox:()=>nr,DrawBoxOptions:()=>Gr,DrawFaceLandmarks:()=>Qr,DrawFaceLandmarksOptions:()=>Kr,DrawTextField:()=>kt,DrawTextFieldOptions:()=>be,drawContour:()=>Z,drawDetections:()=>Sn,drawFaceExpressions:()=>ya,drawFaceLandmarks:()=>Ta});function Fa(t,e){const r=St(t,e),o=At(t,e);function n(i,s,c){const m=o(i,s,`${c}/separable_conv0`),p=o(s,s,`${c}/separable_conv1`),f=r(i,s,1,`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:f}}function a(i,s){const c=o(i,i,`${s}/separable_conv0`),m=o(i,i,`${s}/separable_conv1`),p=o(i,i,`${s}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:r,extractSeparableConvParams:o,extractReductionBlockParams:n,extractMainBlockParams:a}}function to(t,e){const r=[],{extractWeights:o,getRemainingWeights:n}=C(t),{extractConvParams:a,extractSeparableConvParams:i,extractReductionBlockParams:s,extractMainBlockParams:c}=Fa(o,r),m=a(3,32,3,"entry_flow/conv_in"),p=s(32,64,"entry_flow/reduction_block_0"),f=s(64,128,"entry_flow/reduction_block_1"),l={conv_in:m,reduction_block_0:p,reduction_block_1:f},u={};X(e,0,1).forEach(x=>{u[`main_block_${x}`]=c(128,`middle_flow/main_block_${x}`)});const v=s(128,256,"exit_flow/reduction_block"),d=i(256,512,"exit_flow/separable_conv"),b={reduction_block:v,separable_conv:d};if(n().length!==0)throw new Error(`weights remaing after extract: ${n().length}`);return{paramMappings:r,params:{entry_flow:l,middle_flow:u,exit_flow:b}}}function wa(t,e){const r=A(t,e),o=we(r),n=Wt(r);function a(s){const c=n(`${s}/separable_conv0`),m=n(`${s}/separable_conv1`),p=o(`${s}/expansion_conv`);return{separable_conv0:c,separable_conv1:m,expansion_conv:p}}function i(s){const c=n(`${s}/separable_conv0`),m=n(`${s}/separable_conv1`),p=n(`${s}/separable_conv2`);return{separable_conv0:c,separable_conv1:m,separable_conv2:p}}return{extractConvParams:o,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:i}}function eo(t,e){const r=[],{extractConvParams:o,extractSeparableConvParams:n,extractReductionBlockParams:a,extractMainBlockParams:i}=wa(t,r),s=o("entry_flow/conv_in"),c=a("entry_flow/reduction_block_0"),m=a("entry_flow/reduction_block_1"),p={conv_in:s,reduction_block_0:c,reduction_block_1:m},f={};X(e,0,1).forEach(d=>{f[`main_block_${d}`]=i(`middle_flow/main_block_${d}`)});const l=a("exit_flow/reduction_block"),u=n("exit_flow/separable_conv"),v={reduction_block:l,separable_conv:u};return M(t,r),{params:{entry_flow:p,middle_flow:f,exit_flow:v},paramMappings:r}}import{add as gr,conv2d as Pa,maxPool as _a,relu as wt,scalar as Da,tidy as Ea}from"@tensorflow/tfjs/dist/tf.es2017.js";function ro(t,e,r){return gr(Pa(t,e.filters,r,"same"),e.bias)}function br(t,e,r=!0){let o=r?wt(t):t;return o=L(o,e.separable_conv0,[1,1]),o=L(wt(o),e.separable_conv1,[1,1]),o=_a(o,[3,3],[2,2],"same"),o=gr(o,ro(t,e.expansion_conv,[2,2])),o}function Ma(t,e){let r=L(wt(t),e.separable_conv0,[1,1]);return r=L(wt(r),e.separable_conv1,[1,1]),r=L(wt(r),e.separable_conv2,[1,1]),r=gr(r,t),r}class oo extends E{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){const{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return Ea(()=>{const r=t.toBatchTensor(112,!0),o=[122.782,117.001,104.298],n=G(r,o).div(Da(256));let a=wt(ro(n,e.entry_flow.conv_in,[2,2]));return a=br(a,e.entry_flow.reduction_block_0,!1),a=br(a,e.entry_flow.reduction_block_1),X(this._numMainBlocks,0,1).forEach(i=>{a=Ma(a,e.middle_flow[`main_block_${i}`])}),a=br(a,e.exit_flow.reduction_block),a=wt(L(a,e.exit_flow.separable_conv,[1,1])),a})}async forward(t){return this.forwardInput(await w(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(t){return eo(t,this._numMainBlocks)}extractParams(t){return to(t,this._numMainBlocks)}}function no(t){const e=[],{extractWeights:r,getRemainingWeights:o}=C(t),n=Te(r,e),a=n(512,1,"fc/age"),i=n(512,2,"fc/gender");if(o().length!==0)throw new Error(`weights remaing after extract: ${o().length}`);return{paramMappings:e,params:{fc:{age:a,gender:i}}}}function ao(t){const e=[],r=A(t,e);function o(a){const i=r(`${a}/weights`,2),s=r(`${a}/bias`,1);return{weights:i,bias:s}}const n={fc:{age:o("fc/age"),gender:o("fc/gender")}};return M(t,e),{params:n,paramMappings:e}}var Q;(function(t){t.FEMALE="female",t.MALE="male"})(Q||(Q={}));import{avgPool as Ca,softmax as ka,tidy as so,unstack as io}from"@tensorflow/tfjs/dist/tf.es2017.js";class xr extends E{constructor(t=new oo(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){const{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return so(()=>{const r=t instanceof st?this.faceFeatureExtractor.forwardInput(t):t,o=Ca(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),n=te(o,e.fc.age).as1D(),a=te(o,e.fc.gender);return{age:n,gender:a}})}forwardInput(t){return so(()=>{const{age:e,gender:r}=this.runNet(t);return{age:e,gender:ka(r)}})}async forward(t){return this.forwardInput(await w(t))}async predictAgeAndGender(t){const e=await w(t),r=await this.forwardInput(e),o=io(r.age),n=io(r.gender),a=o.map((s,c)=>({ageTensor:s,genderTensor:n[c]})),i=await Promise.all(a.map(async({ageTensor:s,genderTensor:c})=>{const m=(await s.data())[0],p=(await c.data())[0],f=p>.5,l=f?Q.MALE:Q.FEMALE,u=f?p:1-p;return s.dispose(),c.dispose(),{age:m,gender:l,genderProbability:u}}));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){const{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return no(t)}extractParamsFromWeigthMap(t){const{featureExtractorMap:e,classifierMap:r}=De(t);return this.faceFeatureExtractor.loadFromWeightMap(e),ao(r)}extractParams(t){const e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),o=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(o)}}import{fill as vr,stack as yr,tidy as Tr,unstack as Na}from"@tensorflow/tfjs/dist/tf.es2017.js";class Ce extends Ee{postProcess(t,e,r){const o=r.map(({width:a,height:i})=>{const s=e/Math.max(i,a);return{width:a*s,height:i*s}}),n=o.length;return Tr(()=>{const a=(p,f)=>yr([vr([68],p),vr([68],f)],1).as2D(1,136).as1D(),i=(p,f)=>{const{width:l,height:u}=o[p];return f(l,u)?Math.abs(l-u)/2:0},s=p=>i(p,(f,l)=>fi(p,(f,l)=>la(s(f),c(f))))).div(yr(Array.from(Array(n),(p,f)=>a(o[f].width,o[f].height))));return m})}forwardInput(t){return Tr(()=>{const e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,o])=>({height:r,width:o})))})}async forward(t){return this.forwardInput(await w(t))}async detectLandmarks(t){const e=await w(t),r=Tr(()=>Na(this.forwardInput(e))),o=await Promise.all(r.map(async(n,a)=>{const i=Array.from(await n.data()),s=i.filter((m,p)=>le(p)),c=i.filter((m,p)=>!le(p));return new qt(Array(68).fill(0).map((m,p)=>new g(s[p],c[p])),{height:e.getInputHeight(a),width:e.getInputWidth(a)})}));return r.forEach(n=>n.dispose()),e.isBatchInput?o:o[0]}getClassifierChannelsOut(){return 136}}class ee extends Ce{constructor(t=new _e){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function co(t){const e=[],{extractDenseBlock3Params:r}=Pe(t,e),o={dense0:r("dense0",!0),dense1:r("dense1"),dense2:r("dense2")};return M(t,e),{params:o,paramMappings:e}}function mo(t){const e=[],{extractWeights:r,getRemainingWeights:o}=C(t),{extractDenseBlock3Params:n}=Fe(r,e),a=n(3,32,"dense0",!0),i=n(32,64,"dense1"),s=n(64,128,"dense2");if(o().length!==0)throw new Error(`weights remaing after extract: ${o().length}`);return{paramMappings:e,params:{dense0:a,dense1:i,dense2:s}}}import{avgPool as La,scalar as Ia,tidy as Sa}from"@tensorflow/tfjs/dist/tf.es2017.js";class po extends E{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){const{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return Sa(()=>{const r=t.toBatchTensor(112,!0),o=[122.782,117.001,104.298],n=G(r,o).div(Ia(255));let a=ye(n,e.dense0,!0);return a=ye(a,e.dense1),a=ye(a,e.dense2),a=La(a,[14,14],[2,2],"valid"),a})}async forward(t){return this.forwardInput(await w(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(t){return co(t)}extractParams(t){return mo(t)}}class Fr extends Ce{constructor(t=new po){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class Aa extends ee{}import{add as Wa,mul as Ba}from"@tensorflow/tfjs/dist/tf.es2017.js";function fo(t,e){return Wa(Ba(t,e.weights),e.biases)}import{add as Ra,conv2d as Oa,relu as ja}from"@tensorflow/tfjs/dist/tf.es2017.js";function wr(t,e,r,o,n="same"){const{filters:a,bias:i}=e.conv;let s=Oa(t,a,r,n);return s=Ra(s,i),s=fo(s,e.scale),o?ja(s):s}function lo(t,e){return wr(t,e,[1,1],!0)}function Pr(t,e){return wr(t,e,[1,1],!1)}function ke(t,e){return wr(t,e,[2,2],!0,"valid")}import{tensor1d as _r,tensor2d as $a,tensor4d as Ha,tidy as uo,transpose as ho}from"@tensorflow/tfjs/dist/tf.es2017.js";function Ga(t,e){function r(s,c,m){const p=t(s),f=p.length/(c*m*m);if(Ye(f))throw new Error(`depth has to be an integer: ${f}, weights.length: ${p.length}, numFilters: ${c}, filterSize: ${m}`);return uo(()=>ho(Ha(p,[c,f,m,m]),[2,3,1,0]))}function o(s,c,m,p){const f=r(s,c,m),l=_r(t(c));return e.push({paramPath:`${p}/filters`},{paramPath:`${p}/bias`}),{filters:f,bias:l}}function n(s,c){const m=_r(t(s)),p=_r(t(s));return e.push({paramPath:`${c}/weights`},{paramPath:`${c}/biases`}),{weights:m,biases:p}}function a(s,c,m,p){const f=o(s,c,m,`${p}/conv`),l=n(c,`${p}/scale`);return{conv:f,scale:l}}function i(s,c,m,p,f=!1){const l=a((f?.5:1)*s,c,m,`${p}/conv1`),u=a(s,c,m,`${p}/conv2`);return{conv1:l,conv2:u}}return{extractConvLayerParams:a,extractResidualLayerParams:i}}function go(t){const{extractWeights:e,getRemainingWeights:r}=C(t),o=[],{extractConvLayerParams:n,extractResidualLayerParams:a}=Ga(e,o),i=n(4704,32,7,"conv32_down"),s=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),f=a(36864,64,3,"conv64_1"),l=a(36864,64,3,"conv64_2"),u=a(36864,64,3,"conv64_3"),v=a(147456,128,3,"conv128_down",!0),d=a(147456,128,3,"conv128_1"),b=a(147456,128,3,"conv128_2"),x=a(589824,256,3,"conv256_down",!0),h=a(589824,256,3,"conv256_1"),P=a(589824,256,3,"conv256_2"),k=a(589824,256,3,"conv256_down_out"),I=uo(()=>ho($a(e(256*128),[128,256]),[1,0]));if(o.push({paramPath:"fc"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);const B={conv32_down:i,conv32_1:s,conv32_2:c,conv32_3:m,conv64_down:p,conv64_1:f,conv64_2:l,conv64_3:u,conv128_down:v,conv128_1:d,conv128_2:b,conv256_down:x,conv256_1:h,conv256_2:P,conv256_down_out:k,fc:I};return{params:B,paramMappings:o}}function za(t,e){const r=A(t,e);function o(i){const s=r(`${i}/scale/weights`,1),c=r(`${i}/scale/biases`,1);return{weights:s,biases:c}}function n(i){const s=r(`${i}/conv/filters`,4),c=r(`${i}/conv/bias`,1),m=o(i);return{conv:{filters:s,bias:c},scale:m}}function a(i){return{conv1:n(`${i}/conv1`),conv2:n(`${i}/conv2`)}}return{extractConvLayerParams:n,extractResidualLayerParams:a}}function bo(t){const e=[],{extractConvLayerParams:r,extractResidualLayerParams:o}=za(t,e),n=r("conv32_down"),a=o("conv32_1"),i=o("conv32_2"),s=o("conv32_3"),c=o("conv64_down"),m=o("conv64_1"),p=o("conv64_2"),f=o("conv64_3"),l=o("conv128_down"),u=o("conv128_1"),v=o("conv128_2"),d=o("conv256_down"),b=o("conv256_1"),x=o("conv256_2"),h=o("conv256_down_out"),P=t.fc;if(e.push({originalPath:"fc",paramPath:"fc"}),!ze(P))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${P}`);const k={conv32_down:n,conv32_1:a,conv32_2:i,conv32_3:s,conv64_down:c,conv64_1:m,conv64_2:p,conv64_3:f,conv128_down:l,conv128_1:u,conv128_2:v,conv256_down:d,conv256_1:b,conv256_2:x,conv256_down_out:h,fc:P};return M(t,e),{params:k,paramMappings:e}}import{add as xo,avgPool as Ya,concat as Dr,relu as vo,zeros as Er}from"@tensorflow/tfjs/dist/tf.es2017.js";function Y(t,e){let r=lo(t,e.conv1);return r=Pr(r,e.conv2),r=xo(r,t),r=vo(r),r}function re(t,e){let r=ke(t,e.conv1);r=Pr(r,e.conv2);let o=Ya(t,2,2,"valid");const n=Er(o.shape),a=o.shape[3]!==r.shape[3],i=o.shape[1]!==r.shape[1]||o.shape[2]!==r.shape[2];if(i){const s=[...r.shape];s[1]=1;const c=Er(s);r=Dr([r,c],1);const m=[...r.shape];m[2]=1;const p=Er(m);r=Dr([r,p],2)}return o=a?Dr([o,n],3):o,r=xo(o,r),r=vo(r),r}import{cast as Va,matMul as Ua,maxPool as Xa,scalar as Ja,tidy as yo,unstack as qa}from"@tensorflow/tfjs/dist/tf.es2017.js";class oe extends E{constructor(){super("FaceRecognitionNet")}forwardInput(t){const{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return yo(()=>{const r=Va(t.toBatchTensor(150,!0),"float32"),o=[122.782,117.001,104.298],n=G(r,o).div(Ja(256));let a=ke(n,e.conv32_down);a=Xa(a,3,2,"valid"),a=Y(a,e.conv32_1),a=Y(a,e.conv32_2),a=Y(a,e.conv32_3),a=re(a,e.conv64_down),a=Y(a,e.conv64_1),a=Y(a,e.conv64_2),a=Y(a,e.conv64_3),a=re(a,e.conv128_down),a=Y(a,e.conv128_1),a=Y(a,e.conv128_2),a=re(a,e.conv256_down),a=Y(a,e.conv256_1),a=Y(a,e.conv256_2),a=re(a,e.conv256_down_out);const i=a.mean([1,2]),s=Ua(i,e.fc);return s})}async forward(t){return this.forwardInput(await w(t))}async computeFaceDescriptor(t){const e=await w(t),r=yo(()=>qa(this.forwardInput(e))),o=await Promise.all(r.map(n=>n.data()));return r.forEach(n=>n.dispose()),e.isBatchInput?o:o[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(t){return bo(t)}extractParams(t){return go(t)}}function Za(t){const e=new oe;return e.extractWeights(t),e}function Ne(t,e){const r={descriptor:e};return Object.assign({},t,r)}function Ka(t){return typeof t.age=="number"}function Le(t,e){const r={age:e};return Object.assign({},t,r)}function Qa(t){return(t.gender===Q.MALE||t.gender===Q.FEMALE)&&Mt(t.genderProbability)}function Ie(t,e,r){const o={gender:e,genderProbability:r};return Object.assign({},t,o)}import{tensor1d as ne,tensor3d as ts,tensor4d as To}from"@tensorflow/tfjs/dist/tf.es2017.js";function es(t,e){function r(c,m){const p=To(t(3*3*c),[3,3,c,1]),f=ne(t(c)),l=ne(t(c)),u=ne(t(c)),v=ne(t(c));return e.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:f,batch_norm_offset:l,batch_norm_mean:u,batch_norm_variance:v}}function o(c,m,p,f,l){const u=To(t(c*m*p*p),[p,p,c,m]),v=ne(t(m));return e.push({paramPath:`${f}/filters`},{paramPath:`${f}/${l?"batch_norm_offset":"bias"}`}),{filters:u,bias:v}}function n(c,m,p,f){const{filters:l,bias:u}=o(c,m,p,f,!0);return{filters:l,batch_norm_offset:u}}function a(c,m,p){const f=r(c,`${p}/depthwise_conv`),l=n(c,m,1,`${p}/pointwise_conv`);return{depthwise_conv:f,pointwise_conv:l}}function i(){const c=n(3,32,3,"mobilenetv1/conv_0"),m=a(32,64,"mobilenetv1/conv_1"),p=a(64,128,"mobilenetv1/conv_2"),f=a(128,128,"mobilenetv1/conv_3"),l=a(128,256,"mobilenetv1/conv_4"),u=a(256,256,"mobilenetv1/conv_5"),v=a(256,512,"mobilenetv1/conv_6"),d=a(512,512,"mobilenetv1/conv_7"),b=a(512,512,"mobilenetv1/conv_8"),x=a(512,512,"mobilenetv1/conv_9"),h=a(512,512,"mobilenetv1/conv_10"),P=a(512,512,"mobilenetv1/conv_11"),k=a(512,1024,"mobilenetv1/conv_12"),I=a(1024,1024,"mobilenetv1/conv_13");return{conv_0:c,conv_1:m,conv_2:p,conv_3:f,conv_4:l,conv_5:u,conv_6:v,conv_7:d,conv_8:b,conv_9:x,conv_10:h,conv_11:P,conv_12:k,conv_13:I}}function s(){const 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"),f=n(128,256,3,"prediction_layer/conv_3"),l=n(256,128,1,"prediction_layer/conv_4"),u=n(128,256,3,"prediction_layer/conv_5"),v=n(256,64,1,"prediction_layer/conv_6"),d=n(64,128,3,"prediction_layer/conv_7"),b=o(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),x=o(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),h=o(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),P=o(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),k=o(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),I=o(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),B=o(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),R=o(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),ot=o(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),nt=o(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),at=o(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),mt=o(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),pt={box_encoding_predictor:b,class_predictor:x},nn={box_encoding_predictor:h,class_predictor:P},an={box_encoding_predictor:k,class_predictor:I},sn={box_encoding_predictor:B,class_predictor:R},cn={box_encoding_predictor:ot,class_predictor:nt},mn={box_encoding_predictor:at,class_predictor:mt};return{conv_0:c,conv_1:m,conv_2:p,conv_3:f,conv_4:l,conv_5:u,conv_6:v,conv_7:d,box_predictor_0:pt,box_predictor_1:nn,box_predictor_2:an,box_predictor_3:sn,box_predictor_4:cn,box_predictor_5:mn}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:s}}function Fo(t){const e=[],{extractWeights:r,getRemainingWeights:o}=C(t),{extractMobilenetV1Params:n,extractPredictionLayerParams:a}=es(r,e),i=n(),s=a(),c=ts(r(5118*4),[1,5118,4]),m={extra_dim:c};if(e.push({paramPath:"output_layer/extra_dim"}),o().length!==0)throw new Error(`weights remaing after extract: ${o().length}`);return{params:{mobilenetv1:i,prediction_layer:s,output_layer:m},paramMappings:e}}function rs(t,e){const r=A(t,e);function o(m,p,f){const l=r(`${m}/Conv2d_${p}_pointwise/weights`,4,`${f}/filters`),u=r(`${m}/Conv2d_${p}_pointwise/convolution_bn_offset`,1,`${f}/batch_norm_offset`);return{filters:l,batch_norm_offset:u}}function n(m){const p=`mobilenetv1/conv_${m}`,f=`MobilenetV1/Conv2d_${m}_depthwise`,l=`${p}/depthwise_conv`,u=`${p}/pointwise_conv`,v=r(`${f}/depthwise_weights`,4,`${l}/filters`),d=r(`${f}/BatchNorm/gamma`,1,`${l}/batch_norm_scale`),b=r(`${f}/BatchNorm/beta`,1,`${l}/batch_norm_offset`),x=r(`${f}/BatchNorm/moving_mean`,1,`${l}/batch_norm_mean`),h=r(`${f}/BatchNorm/moving_variance`,1,`${l}/batch_norm_variance`);return{depthwise_conv:{filters:v,batch_norm_scale:d,batch_norm_offset:b,batch_norm_mean:x,batch_norm_variance:h},pointwise_conv:o("MobilenetV1",m,u)}}function a(){return{conv_0:o("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 i(m,p){const f=r(`${m}/weights`,4,`${p}/filters`),l=r(`${m}/biases`,1,`${p}/bias`);return{filters:f,bias:l}}function s(m){const p=i(`Prediction/BoxPredictor_${m}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${m}/box_encoding_predictor`),f=i(`Prediction/BoxPredictor_${m}/ClassPredictor`,`prediction_layer/box_predictor_${m}/class_predictor`);return{box_encoding_predictor:p,class_predictor:f}}function c(){return{conv_0:o("Prediction",0,"prediction_layer/conv_0"),conv_1:o("Prediction",1,"prediction_layer/conv_1"),conv_2:o("Prediction",2,"prediction_layer/conv_2"),conv_3:o("Prediction",3,"prediction_layer/conv_3"),conv_4:o("Prediction",4,"prediction_layer/conv_4"),conv_5:o("Prediction",5,"prediction_layer/conv_5"),conv_6:o("Prediction",6,"prediction_layer/conv_6"),conv_7:o("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:s(0),box_predictor_1:s(1),box_predictor_2:s(2),box_predictor_3:s(3),box_predictor_4:s(4),box_predictor_5:s(5)}}return{extractMobilenetV1Params:a,extractPredictionLayerParams:c}}function wo(t){const e=[],{extractMobilenetV1Params:r,extractPredictionLayerParams:o}=rs(t,e),n=t["Output/extra_dim"];if(e.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!K(n))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${n}`);const a={mobilenetv1:r(),prediction_layer:o(),output_layer:{extra_dim:n}};return M(t,e),{params:a,paramMappings:e}}import{add as os,clipByValue as ns,conv2d as as,tidy as ss}from"@tensorflow/tfjs/dist/tf.es2017.js";function j(t,e,r){return ss(()=>{let o=as(t,e.filters,r,"same");return o=os(o,e.batch_norm_offset),ns(o,0,6)})}import{batchNorm as is,clipByValue as cs,depthwiseConv2d as ms,tidy as Po}from"@tensorflow/tfjs/dist/tf.es2017.js";const ps=.0010000000474974513;function fs(t,e,r){return Po(()=>{let o=ms(t,e.filters,r,"same");return o=is(o,e.batch_norm_mean,e.batch_norm_variance,e.batch_norm_offset,e.batch_norm_scale,ps),cs(o,0,6)})}function ls(t){return[2,4,6,12].some(e=>e===t)?[2,2]:[1,1]}function _o(t,e){return Po(()=>{let r,o=j(t,e.conv_0,[2,2]);const n=[e.conv_1,e.conv_2,e.conv_3,e.conv_4,e.conv_5,e.conv_6,e.conv_7,e.conv_8,e.conv_9,e.conv_10,e.conv_11,e.conv_12,e.conv_13];if(n.forEach((a,i)=>{const s=i+1,c=ls(s);o=fs(o,a.depthwise_conv,c),o=j(o,a.pointwise_conv,[1,1]),s===11&&(r=o)}),r===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:o,conv11:r}})}function Do(t,e,r,o,n){const a=t.shape[0],i=Math.min(r,a),s=e.map((p,f)=>({score:p,boxIndex:f})).filter(p=>p.score>n).sort((p,f)=>f.score-p.score),c=p=>p<=o?1:0,m=[];return s.forEach(p=>{if(m.length>=i)return;const f=p.score;for(let l=m.length-1;l>=0;--l){const u=us(t,p.boxIndex,m[l]);if(u===0)continue;if(p.score*=c(u),p.score<=n)break}f===p.score&&m.push(p.boxIndex)}),m}function us(t,e,r){const o=t.arraySync(),n=Math.min(o[e][0],o[e][2]),a=Math.min(o[e][1],o[e][3]),i=Math.max(o[e][0],o[e][2]),s=Math.max(o[e][1],o[e][3]),c=Math.min(o[r][0],o[r][2]),m=Math.min(o[r][1],o[r][3]),p=Math.max(o[r][0],o[r][2]),f=Math.max(o[r][1],o[r][3]),l=(i-n)*(s-a),u=(p-c)*(f-m);if(l<=0||u<=0)return 0;const v=Math.max(n,c),d=Math.max(a,m),b=Math.min(i,p),x=Math.min(s,f),h=Math.max(b-v,0)*Math.max(x-d,0);return h/(l+u-h)}import{add as Rt,div as it,exp as Eo,mul as Se,reshape as Ae,scalar as ct,sigmoid as ds,slice as Mo,stack as hs,sub as We,tidy as gs,tile as bs,transpose as Mr,unstack as Be}from"@tensorflow/tfjs/dist/tf.es2017.js";function xs(t){const e=Be(Mr(t,[1,0])),r=[We(e[2],e[0]),We(e[3],e[1])],o=[Rt(e[0],it(r[0],ct(2))),Rt(e[1],it(r[1],ct(2)))];return{sizes:r,centers:o}}function vs(t,e){const{sizes:r,centers:o}=xs(t),n=Be(Mr(e,[1,0])),a=it(Se(Eo(it(n[2],ct(5))),r[0]),ct(2)),i=Rt(Se(it(n[0],ct(10)),r[0]),o[0]),s=it(Se(Eo(it(n[3],ct(5))),r[1]),ct(2)),c=Rt(Se(it(n[1],ct(10)),r[1]),o[1]);return Mr(hs([We(i,a),We(c,s),Rt(i,a),Rt(c,s)]),[1,0])}function Co(t,e,r){return gs(()=>{const o=t.shape[0];let n=vs(Ae(bs(r.extra_dim,[o,1,1]),[-1,4]),Ae(t,[-1,4]));n=Ae(n,[o,n.shape[0]/o,4]);const a=ds(Mo(e,[0,0,1],[-1,-1,-1]));let i=Mo(a,[0,0,0],[-1,-1,1]);i=Ae(i,[o,i.shape[1]]);const s=Be(n),c=Be(i);return{boxes:s,scores:c}})}import{reshape as ko,tidy as ys}from"@tensorflow/tfjs/dist/tf.es2017.js";function Pt(t,e){return ys(()=>{const r=t.shape[0],o=ko(yt(t,e.box_encoding_predictor),[r,-1,1,4]),n=ko(yt(t,e.class_predictor),[r,-1,3]);return{boxPredictionEncoding:o,classPrediction:n}})}import{concat as No,tidy as Ts}from"@tensorflow/tfjs/dist/tf.es2017.js";function Lo(t,e,r){return Ts(()=>{const o=j(t,r.conv_0,[1,1]),n=j(o,r.conv_1,[2,2]),a=j(n,r.conv_2,[1,1]),i=j(a,r.conv_3,[2,2]),s=j(i,r.conv_4,[1,1]),c=j(s,r.conv_5,[2,2]),m=j(c,r.conv_6,[1,1]),p=j(m,r.conv_7,[2,2]),f=Pt(e,r.box_predictor_0),l=Pt(t,r.box_predictor_1),u=Pt(n,r.box_predictor_2),v=Pt(i,r.box_predictor_3),d=Pt(c,r.box_predictor_4),b=Pt(p,r.box_predictor_5),x=No([f.boxPredictionEncoding,l.boxPredictionEncoding,u.boxPredictionEncoding,v.boxPredictionEncoding,d.boxPredictionEncoding,b.boxPredictionEncoding],1),h=No([f.classPrediction,l.classPrediction,u.classPrediction,v.classPrediction,d.classPrediction,b.classPrediction],1);return{boxPredictions:x,classPredictions:h}})}class V{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}}import{cast as Fs,mul as ws,scalar as Io,sub as Ps,tidy as _s}from"@tensorflow/tfjs/dist/tf.es2017.js";class Ot extends E{constructor(){super("SsdMobilenetv1")}forwardInput(t){const{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return _s(()=>{const r=Fs(t.toBatchTensor(512,!1),"float32"),o=Ps(ws(r,Io(.007843137718737125)),Io(1)),n=_o(o,e.mobilenetv1),{boxPredictions:a,classPredictions:i}=Lo(n.out,n.conv11,e.prediction_layer);return Co(a,i,e.output_layer)})}async forward(t){return this.forwardInput(await w(t))}async locateFaces(t,e={}){const{maxResults:r,minConfidence:o}=new V(e),n=await w(t),{boxes:a,scores:i}=this.forwardInput(n),s=a[0],c=i[0];for(let h=1;h{const[P,k]=[Math.max(0,b[h][0]),Math.min(1,b[h][2])].map(R=>R*d),[I,B]=[Math.max(0,b[h][1]),Math.min(1,b[h][3])].map(R=>R*v);return new _(m[h],new Jt(I,P,B-I,k-P),{height:n.getInputHeight(0),width:n.getInputWidth(0)})});return s.dispose(),c.dispose(),x}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(t){return wo(t)}extractParams(t){return Fo(t)}}function So(t){const e=new Ot;return e.extractWeights(t),e}function Ds(t){return So(t)}class Es extends Ot{}const Ao=.4,Wo=[new g(.738768,.874946),new g(2.42204,2.65704),new g(4.30971,7.04493),new g(10.246,4.59428),new g(12.6868,11.8741)],Bo=[new g(1.603231,2.094468),new g(6.041143,7.080126),new g(2.882459,3.518061),new g(4.266906,5.178857),new g(9.041765,10.66308)],Ro=[117.001,114.697,97.404],Oo="tiny_yolov2_model",jo="tiny_yolov2_separable_conv_model";const Re=t=>typeof t=="number";function Cr(t){if(!t)throw new Error(`invalid config: ${t}`);if(typeof t.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${t.withSeparableConvs}`);if(!Re(t.iouThreshold)||t.iouThreshold<0||t.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${t.iouThreshold}`);if(!Array.isArray(t.classes)||!t.classes.length||!t.classes.every(e=>typeof e=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(t.classes)}`);if(!Array.isArray(t.anchors)||!t.anchors.length||!t.anchors.map(e=>e||{}).every(e=>Re(e.x)&&Re(e.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(t.anchors)}`);if(t.meanRgb&&(!Array.isArray(t.meanRgb)||t.meanRgb.length!==3||!t.meanRgb.every(Re)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(t.meanRgb)}`)}import{add as Ms,mul as Cs,relu as ks,scalar as Ns,sub as Ls,tidy as Is}from"@tensorflow/tfjs/dist/tf.es2017.js";function jt(t){return Is(()=>{const e=Cs(t,Ns(.10000000149011612));return Ms(ks(Ls(t,e)),e)})}import{add as Ss,conv2d as As,mul as Ws,pad as Bs,sub as Rs,tidy as Os}from"@tensorflow/tfjs/dist/tf.es2017.js";function tt(t,e){return Os(()=>{let r=Bs(t,[[0,0],[1,1],[1,1],[0,0]]);return r=As(r,e.conv.filters,[1,1],"valid"),r=Rs(r,e.bn.sub),r=Ws(r,e.bn.truediv),r=Ss(r,e.conv.bias),jt(r)})}import{add as js,pad as $s,separableConv2d as Hs,tidy as Gs}from"@tensorflow/tfjs/dist/tf.es2017.js";function et(t,e){return Gs(()=>{let r=$s(t,[[0,0],[1,1],[1,1],[0,0]]);return r=Hs(r,e.depthwise_filter,e.pointwise_filter,[1,1],"valid"),r=js(r,e.bias),jt(r)})}import{tensor1d as $o}from"@tensorflow/tfjs/dist/tf.es2017.js";function zs(t,e){const r=St(t,e);function o(i,s){const c=$o(t(i)),m=$o(t(i));return e.push({paramPath:`${s}/sub`},{paramPath:`${s}/truediv`}),{sub:c,truediv:m}}function n(i,s,c){const m=r(i,s,3,`${c}/conv`),p=o(s,`${c}/bn`);return{conv:m,bn:p}}const a=At(t,e);return{extractConvParams:r,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}}function Ho(t,e,r,o){const{extractWeights:n,getRemainingWeights:a}=C(t),i=[],{extractConvParams:s,extractConvWithBatchNormParams:c,extractSeparableConvParams:m}=zs(n,i);let p;if(e.withSeparableConvs){const[f,l,u,v,d,b,x,h,P]=o,k=e.isFirstLayerConv2d?s(f,l,3,"conv0"):m(f,l,"conv0"),I=m(l,u,"conv1"),B=m(u,v,"conv2"),R=m(v,d,"conv3"),ot=m(d,b,"conv4"),nt=m(b,x,"conv5"),at=h?m(x,h,"conv6"):void 0,mt=P?m(h,P,"conv7"):void 0,pt=s(P||h||x,5*r,1,"conv8");p={conv0:k,conv1:I,conv2:B,conv3:R,conv4:ot,conv5:nt,conv6:at,conv7:mt,conv8:pt}}else{const[f,l,u,v,d,b,x,h,P]=o,k=c(f,l,"conv0"),I=c(l,u,"conv1"),B=c(u,v,"conv2"),R=c(v,d,"conv3"),ot=c(d,b,"conv4"),nt=c(b,x,"conv5"),at=c(x,h,"conv6"),mt=c(h,P,"conv7"),pt=s(P,5*r,1,"conv8");p={conv0:k,conv1:I,conv2:B,conv3:R,conv4:ot,conv5:nt,conv6:at,conv7:mt,conv8:pt}}if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{params:p,paramMappings:i}}function Ys(t,e){const r=A(t,e);function o(s){const c=r(`${s}/sub`,1),m=r(`${s}/truediv`,1);return{sub:c,truediv:m}}function n(s){const c=r(`${s}/filters`,4),m=r(`${s}/bias`,1);return{filters:c,bias:m}}function a(s){const c=n(`${s}/conv`),m=o(`${s}/bn`);return{conv:c,bn:m}}const i=Wt(r);return{extractConvParams:n,extractConvWithBatchNormParams:a,extractSeparableConvParams:i}}function Go(t,e){const r=[],{extractConvParams:o,extractConvWithBatchNormParams:n,extractSeparableConvParams:a}=Ys(t,r);let i;if(e.withSeparableConvs){const s=e.filterSizes&&e.filterSizes.length||9;i={conv0:e.isFirstLayerConv2d?o("conv0"):a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:s>7?a("conv6"):void 0,conv7:s>8?a("conv7"):void 0,conv8:o("conv8")}}else i={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:o("conv8")};return M(t,r),{params:i,paramMappings:r}}var kr;(function(t){t[t.XS=224]="XS",t[t.SM=320]="SM",t[t.MD=416]="MD",t[t.LG=608]="LG"})(kr||(kr={}));class rt{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}}import{cast as Vs,maxPool as $,scalar as zo,softmax as Us,tidy as Nr,unstack as Xs}from"@tensorflow/tfjs/dist/tf.es2017.js";class $t extends E{constructor(t){super("TinyYolov2");Cr(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=tt(t,e.conv0);return r=$(r,[2,2],[2,2],"same"),r=tt(r,e.conv1),r=$(r,[2,2],[2,2],"same"),r=tt(r,e.conv2),r=$(r,[2,2],[2,2],"same"),r=tt(r,e.conv3),r=$(r,[2,2],[2,2],"same"),r=tt(r,e.conv4),r=$(r,[2,2],[2,2],"same"),r=tt(r,e.conv5),r=$(r,[2,2],[1,1],"same"),r=tt(r,e.conv6),r=tt(r,e.conv7),yt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?jt(yt(t,e.conv0,"valid",!1)):et(t,e.conv0);return r=$(r,[2,2],[2,2],"same"),r=et(r,e.conv1),r=$(r,[2,2],[2,2],"same"),r=et(r,e.conv2),r=$(r,[2,2],[2,2],"same"),r=et(r,e.conv3),r=$(r,[2,2],[2,2],"same"),r=et(r,e.conv4),r=$(r,[2,2],[2,2],"same"),r=et(r,e.conv5),r=$(r,[2,2],[1,1],"same"),r=e.conv6?et(r,e.conv6):r,r=e.conv7?et(r,e.conv7):r,yt(r,e.conv8,"valid",!1)}forwardInput(t,e){const{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return Nr(()=>{let o=Vs(t.toBatchTensor(e,!1),"float32");return o=this.config.meanRgb?G(o,this.config.meanRgb):o,o=o.div(zo(256)),this.config.withSeparableConvs?this.runMobilenet(o,r):this.runTinyYolov2(o,r)})}async forward(t,e){return await this.forwardInput(await w(t),e)}async detect(t,e={}){const{inputSize:r,scoreThreshold:o}=new rt(e),n=await w(t),a=await this.forwardInput(n,r),i=Nr(()=>Xs(a)[0].expandDims()),s={width:n.getInputWidth(0),height:n.getInputHeight(0)},c=await this.extractBoxes(i,n.getReshapedInputDimensions(0),o);a.dispose(),i.dispose();const m=c.map(d=>d.box),p=c.map(d=>d.score),f=c.map(d=>d.classScore),l=c.map(d=>this.config.classes[d.label]),u=Je(m.map(d=>d.rescale(r)),p,this.config.iouThreshold,!0),v=u.map(d=>new Ct(p[d],f[d],l[d],m[d],s));return v}getDefaultModelName(){return""}extractParamsFromWeigthMap(t){return Go(t,this.config)}extractParams(t){const e=this.config.filterSizes||$t.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 Ho(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){const{width:o,height:n}=e,a=Math.max(o,n),i=a/o,s=a/n,c=t.shape[1],m=this.config.anchors.length,[p,f,l]=Nr(()=>{const b=t.reshape([c,c,m,this.boxEncodingSize]),x=b.slice([0,0,0,0],[c,c,m,4]),h=b.slice([0,0,0,4],[c,c,m,1]),P=this.withClassScores?Us(b.slice([0,0,0,5],[c,c,m,this.config.classes.length]),3):zo(0);return[x,h,P]}),u=[],v=await f.array(),d=await p.array();for(let b=0;br){const k=(x+Xt(d[b][x][h][0]))/c*i,I=(b+Xt(d[b][x][h][1]))/c*s,B=Math.exp(d[b][x][h][2])*this.config.anchors[h].x/c*i,R=Math.exp(d[b][x][h][3])*this.config.anchors[h].y/c*s,ot=k-B/2,nt=I-R/2,at={row:b,col:x,anchor:h},{classScore:mt,label:pt}=this.withClassScores?await this.extractPredictedClass(l,at):{classScore:1,label:0};u.push({box:new Ut(ot,nt,ot+B,nt+R),score:P,classScore:P*mt,label:pt,...at})}}return p.dispose(),f.dispose(),l.dispose(),u}async extractPredictedClass(t,e){const{row:r,col:o,anchor:n}=e,a=await t.array();return Array(this.config.classes.length).fill(0).map((i,s)=>a[r][o][n][s]).map((i,s)=>({classScore:i,label:s})).reduce((i,s)=>i.classScore>s.classScore?i:s)}}$t.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class ae extends $t{constructor(t=!0){const e=Object.assign({},{withSeparableConvs:t,iouThreshold:Ao,classes:["face"]},t?{anchors:Bo,meanRgb:Ro}:{anchors:Wo,withClassScores:!0});super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){const r=await this.detect(t,e);return r.map(o=>new _(o.score,o.relativeBox,{width:o.imageWidth,height:o.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?jo:Oo}extractParamsFromWeigthMap(t){return super.extractParamsFromWeigthMap(t)}}function Js(t,e=!0){const r=new ae(e);return r.extractWeights(t),r}class Lr extends rt{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class U{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}import{Tensor as Yo}from"@tensorflow/tfjs/dist/tf.es2017.js";async function _t(t,e,r,o,n=({alignedRect:a})=>a){const a=t.map(c=>Ft(c)?n(c):c.detection),i=o||(e instanceof Yo?await It(e,a):await Lt(e,a)),s=await r(i);return i.forEach(c=>c instanceof Yo&&c.dispose()),s}async function Ht(t,e,r,o,n){return _t([t],e,async a=>r(a[0]),o,n)}const Vo=.4,Uo=[new g(1.603231,2.094468),new g(6.041143,7.080126),new g(2.882459,3.518061),new g(4.266906,5.178857),new g(9.041765,10.66308)],Xo=[117.001,114.697,97.404];class se extends $t{constructor(){const t={withSeparableConvs:!0,iouThreshold:Vo,classes:["face"],anchors:Uo,meanRgb:Xo,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){const r=await this.detect(t,e);return r.map(o=>new _(o.score,o.relativeBox,{width:o.imageWidth,height:o.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(t){return super.extractParamsFromWeigthMap(t)}}const y={ssdMobilenetv1:new Ot,tinyFaceDetector:new se,tinyYolov2:new ae,faceLandmark68Net:new ee,faceLandmark68TinyNet:new Fr,faceRecognitionNet:new oe,faceExpressionNet:new ur,ageGenderNet:new xr},Jo=(t,e)=>y.ssdMobilenetv1.locateFaces(t,e),qs=(t,e)=>y.tinyFaceDetector.locateFaces(t,e),Zs=(t,e)=>y.tinyYolov2.locateFaces(t,e),qo=t=>y.faceLandmark68Net.detectLandmarks(t),Ks=t=>y.faceLandmark68TinyNet.detectLandmarks(t),Qs=t=>y.faceRecognitionNet.computeFaceDescriptor(t),ti=t=>y.faceExpressionNet.predictExpressions(t),ei=t=>y.ageGenderNet.predictAgeAndGender(t),Zo=t=>y.ssdMobilenetv1.load(t),ri=t=>y.tinyFaceDetector.load(t),oi=t=>y.tinyYolov2.load(t),ni=t=>y.faceLandmark68Net.load(t),ai=t=>y.faceLandmark68TinyNet.load(t),si=t=>y.faceRecognitionNet.load(t),ii=t=>y.faceExpressionNet.load(t),ci=t=>y.ageGenderNet.load(t),mi=Zo,pi=Jo,fi=qo;class Ko extends U{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}}class me extends Ko{async run(){const t=await this.parentTask,e=await _t(t,this.input,async r=>await Promise.all(r.map(o=>y.faceExpressionNet.predictExpressions(o))),this.extractedFaces);return t.map((r,o)=>Me(r,e[o]))}withAgeAndGender(){return new ie(this,this.input)}}class pe extends Ko{async run(){const t=await this.parentTask;if(!t)return;const e=await Ht(t,this.input,r=>y.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Me(t,e)}withAgeAndGender(){return new ce(this,this.input)}}class Yt extends me{withAgeAndGender(){return new Gt(this,this.input)}withFaceDescriptors(){return new Dt(this,this.input)}}class Vt extends pe{withAgeAndGender(){return new zt(this,this.input)}withFaceDescriptor(){return new Et(this,this.input)}}class Qo extends U{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}}class ie extends Qo{async run(){const t=await this.parentTask,e=await _t(t,this.input,async r=>await Promise.all(r.map(o=>y.ageGenderNet.predictAgeAndGender(o))),this.extractedFaces);return t.map((r,o)=>{const{age:n,gender:a,genderProbability:i}=e[o];return Le(Ie(r,a,i),n)})}withFaceExpressions(){return new me(this,this.input)}}class ce extends Qo{async run(){const t=await this.parentTask;if(!t)return;const{age:e,gender:r,genderProbability:o}=await Ht(t,this.input,n=>y.ageGenderNet.predictAgeAndGender(n),this.extractedFaces);return Le(Ie(t,r,o),e)}withFaceExpressions(){return new pe(this,this.input)}}class Gt extends ie{withFaceExpressions(){return new Yt(this,this.input)}withFaceDescriptors(){return new Dt(this,this.input)}}class zt extends ce{withFaceExpressions(){return new Vt(this,this.input)}withFaceDescriptor(){return new Et(this,this.input)}}class Ir extends U{constructor(t,e){super();this.parentTask=t;this.input=e}}class Dt extends Ir{async run(){const t=await this.parentTask,e=await _t(t,this.input,r=>Promise.all(r.map(o=>y.faceRecognitionNet.computeFaceDescriptor(o))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return e.map((r,o)=>Ne(t[o],r))}withFaceExpressions(){return new Yt(this,this.input)}withAgeAndGender(){return new Gt(this,this.input)}}class Et extends Ir{async run(){const t=await this.parentTask;if(!t)return;const e=await Ht(t,this.input,r=>y.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Ne(t,e)}withFaceExpressions(){return new Vt(this,this.input)}withAgeAndGender(){return new zt(this,this.input)}}import{Tensor as Oe}from"@tensorflow/tfjs/dist/tf.es2017.js";class Sr extends U{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?y.faceLandmark68TinyNet:y.faceLandmark68Net}}class Ar extends Sr{async run(){const t=await this.parentTask,e=t.map(n=>n.detection),r=this.input instanceof Oe?await It(this.input,e):await Lt(this.input,e),o=await Promise.all(r.map(n=>this.landmarkNet.detectLandmarks(n)));return r.forEach(n=>n instanceof Oe&&n.dispose()),t.map((n,a)=>Bt(n,o[a]))}withFaceExpressions(){return new Yt(this,this.input)}withAgeAndGender(){return new Gt(this,this.input)}withFaceDescriptors(){return new Dt(this,this.input)}}class Wr extends Sr{async run(){const t=await this.parentTask;if(!t)return;const{detection:e}=t,r=this.input instanceof Oe?await It(this.input,[e]):await Lt(this.input,[e]),o=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(n=>n instanceof Oe&&n.dispose()),Bt(t,o)}withFaceExpressions(){return new Vt(this,this.input)}withAgeAndGender(){return new zt(this,this.input)}withFaceDescriptor(){return new Et(this,this.input)}}class Br extends U{constructor(t,e=new V){super();this.input=t;this.options=e}}class je extends Br{async run(){const{input:t,options:e}=this,r=e instanceof Lr?o=>y.tinyFaceDetector.locateFaces(o,e):e instanceof V?o=>y.ssdMobilenetv1.locateFaces(o,e):e instanceof rt?o=>y.tinyYolov2.locateFaces(o,e):null;if(!r)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return r(t)}runAndExtendWithFaceDetections(){return new Promise(async t=>{const e=await this.run();return t(e.map(r=>ht({},r)))})}withFaceLandmarks(t=!1){return new Ar(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new me(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new ie(this.runAndExtendWithFaceDetections(),this.input)}}class Rr extends Br{async run(){const t=await new je(this.input,this.options);let e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{const e=await this.run();return t(e?ht({},e):void 0)})}withFaceLandmarks(t=!1){return new Wr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new pe(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new ce(this.runAndExtendWithFaceDetection(),this.input)}}function li(t,e=new V){return new Rr(t,e)}function $e(t,e=new V){return new je(t,e)}async function tn(t,e){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await $e(t,new V(e?{minConfidence:e}:{})).withFaceLandmarks().withFaceDescriptors()}async function ui(t,e={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await $e(t,new rt(e)).withFaceLandmarks().withFaceDescriptors()}const di=tn;function Or(t,e){if(t.length!==e.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const r=Array.from(t),o=Array.from(e);return Math.sqrt(r.map((n,a)=>n-o[a]).reduce((n,a)=>n+Math.pow(a,2),0))}class en{constructor(t,e=.6){this._distanceThreshold=e;const r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let o=1;const n=()=>`person ${o++}`;this._labeledDescriptors=r.map(a=>{if(a instanceof dt)return a;if(a instanceof Float32Array)return new dt(n(),[a]);if(a.descriptor&&a.descriptor instanceof Float32Array)return new dt(n(),[a.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>Or(r,t)).reduce((r,o)=>r+o,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new de(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){const e=t.labeledDescriptors.map(r=>dt.fromJSON(r));return new en(e,t.distanceThreshold)}}function hi(t){const e=new se;return e.extractWeights(t),e}function rn(t,e){const{width:r,height:o}=new S(e.width,e.height);if(r<=0||o<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:r,height:o})}`);if(Array.isArray(t))return t.map(n=>rn(n,{width:r,height:o}));if(Ft(t)){const n=t.detection.forSize(r,o),a=t.unshiftedLandmarks.forSize(n.box.width,n.box.height);return Bt(ht(t,n),a)}return J(t)?ht(t,t.detection.forSize(r,o)):t instanceof O||t instanceof _?t.forSize(r,o):t}var on="0.7.3";import*as gi from"@tensorflow/tfjs/dist/tf.es2017.js";const bi=typeof process!="undefined",xi=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",vi={faceapi:on,node:bi,browser:xi};export{xr as AgeGenderNet,Ut as BoundingBox,F as Box,U as ComposableTask,Dt as ComputeAllFaceDescriptorsTask,Ir as ComputeFaceDescriptorsTaskBase,Et as ComputeSingleFaceDescriptorTask,Ar as DetectAllFaceLandmarksTask,je as DetectAllFacesTask,Sr as DetectFaceLandmarksTaskBase,Br as DetectFacesTaskBase,Wr as DetectSingleFaceLandmarksTask,Rr as DetectSingleFaceTask,S as Dimensions,lr as FACE_EXPRESSION_LABELS,_ as FaceDetection,Es as FaceDetectionNet,ur as FaceExpressionNet,Tt as FaceExpressions,ee as FaceLandmark68Net,Fr as FaceLandmark68TinyNet,Aa as FaceLandmarkNet,O as FaceLandmarks,kn as FaceLandmarks5,qt as FaceLandmarks68,de as FaceMatch,en as FaceMatcher,oe as FaceRecognitionNet,Q as Gender,he as LabeledBox,dt as LabeledFaceDescriptors,st as NetInput,E as NeuralNetwork,Ct as ObjectDetection,g as Point,Nn as PredictedBox,Jt as Rect,Ot as SsdMobilenetv1,V as SsdMobilenetv1Options,se as TinyFaceDetector,Lr as TinyFaceDetectorOptions,ae as TinyYolov2,rt as TinyYolov2Options,kr as TinyYolov2SizeType,di as allFaces,tn as allFacesSsdMobilenetv1,ui as allFacesTinyYolov2,ar as awaitMediaLoaded,sr as bufferToImage,Qs as computeFaceDescriptor,Nt as createCanvas,Kt as createCanvasFromMedia,Ds as createFaceDetectionNet,Za as createFaceRecognitionNet,So as createSsdMobilenetv1,hi as createTinyFaceDetector,Js as createTinyYolov2,$e as detectAllFaces,qo as detectFaceLandmarks,Ks as detectFaceLandmarksTiny,fi as detectLandmarks,li as detectSingleFace,hr as draw,T as env,Or as euclideanDistance,Le as extendWithAge,Ne as extendWithFaceDescriptor,ht as extendWithFaceDetection,Me as extendWithFaceExpressions,Bt as extendWithFaceLandmarks,Ie as extendWithGender,It as extractFaceTensors,Lt as extractFaces,Yn as fetchImage,mr as fetchJson,Vn as fetchNetWeights,xt as fetchOrThrow,N as getContext2dOrThrow,bt as getMediaDimensions,ir as imageTensorToCanvas,cr as imageToSquare,Dn as inverseSigmoid,Ue as iou,xe as isMediaElement,Zt as isMediaLoaded,Ka as isWithAge,J as isWithFaceDetection,dr as isWithFaceExpressions,Ft as isWithFaceLandmarks,Qa as isWithGender,ci as loadAgeGenderModel,mi as loadFaceDetectionModel,ii as loadFaceExpressionModel,ni as loadFaceLandmarkModel,ai as loadFaceLandmarkTinyModel,si as loadFaceRecognitionModel,Zo as loadSsdMobilenetv1Model,ri as loadTinyFaceDetectorModel,oi as loadTinyYolov2Model,pr as loadWeightMap,pi as locateFaces,Xn as matchDimensions,Xe as minBbox,y as nets,Je as nonMaxSuppression,G as normalize,Ze as padToSquare,ei as predictAgeAndGender,ti as recognizeFaceExpressions,rn as resizeResults,gt as resolveInput,_n as shuffleArray,Xt as sigmoid,Jo as ssdMobilenetv1,gi as tf,qs as tinyFaceDetector,Zs as tinyYolov2,w as toNetInput,Ge as utils,Cr as validateConfig,vi as version}; +//# sourceMappingURL=face-api.nobundle.js.map diff --git a/dist/face-api.nobundle.js.map b/dist/face-api.nobundle.js.map new file mode 100644 index 0000000..034ce07 --- /dev/null +++ b/dist/face-api.nobundle.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["src/env/isNodejs.ts", "src/draw/drawContour.ts", "src/classes/Dimensions.ts", "src/utils/index.ts", "src/classes/Point.ts", "src/classes/Box.ts", "src/classes/BoundingBox.ts", "src/classes/ObjectDetection.ts", "src/classes/FaceDetection.ts", "src/ops/iou.ts", "src/ops/minBbox.ts", "src/ops/nonMaxSuppression.ts", "src/ops/normalize.ts", "src/ops/padToSquare.ts", "src/ops/shuffleArray.ts", "src/ops/index.ts", "src/classes/Rect.ts", "src/classes/FaceLandmarks.ts", "src/classes/FaceLandmarks5.ts", "src/classes/FaceLandmarks68.ts", "src/classes/FaceMatch.ts", "src/classes/LabeledBox.ts", "src/classes/LabeledFaceDescriptors.ts", "src/classes/PredictedBox.ts", "src/factories/WithFaceDetection.ts", "src/env/createBrowserEnv.ts", "src/env/createFileSystem.ts", "src/env/createNodejsEnv.ts", "src/env/isBrowser.ts", "src/env/index.ts", "src/dom/resolveInput.ts", "src/dom/getContext2dOrThrow.ts", "src/draw/DrawTextField.ts", "src/draw/DrawBox.ts", "src/draw/drawDetections.ts", "src/dom/isMediaLoaded.ts", "src/dom/awaitMediaLoaded.ts", "src/dom/bufferToImage.ts", "src/dom/getMediaDimensions.ts", "src/dom/createCanvas.ts", "src/dom/imageTensorToCanvas.ts", "src/dom/isMediaElement.ts", "src/dom/imageToSquare.ts", "src/dom/NetInput.ts", "src/dom/toNetInput.ts", "src/dom/extractFaces.ts", "src/dom/extractFaceTensors.ts", "src/dom/fetchOrThrow.ts", "src/dom/fetchImage.ts", "src/dom/fetchJson.ts", "src/dom/fetchNetWeights.ts", "src/common/getModelUris.ts", "src/dom/loadWeightMap.ts", "src/dom/matchDimensions.ts", "src/NeuralNetwork.ts", "src/common/depthwiseSeparableConv.ts", "src/faceFeatureExtractor/denseBlock.ts", "src/common/convLayer.ts", "src/common/disposeUnusedWeightTensors.ts", "src/common/extractConvParamsFactory.ts", "src/common/extractFCParamsFactory.ts", "src/common/types.ts", "src/common/extractSeparableConvParamsFactory.ts", "src/common/extractWeightEntryFactory.ts", "src/common/extractWeightsFactory.ts", "src/faceFeatureExtractor/extractorsFactory.ts", "src/faceFeatureExtractor/extractParams.ts", "src/common/loadConvParamsFactory.ts", "src/faceFeatureExtractor/loadParamsFactory.ts", "src/faceFeatureExtractor/extractParamsFromWeigthMap.ts", "src/faceFeatureExtractor/FaceFeatureExtractor.ts", "src/common/fullyConnectedLayer.ts", "src/faceProcessor/extractParams.ts", "src/faceProcessor/extractParamsFromWeigthMap.ts", "src/faceProcessor/util.ts", "src/faceProcessor/FaceProcessor.ts", "src/faceExpressionNet/FaceExpressions.ts", "src/faceExpressionNet/FaceExpressionNet.ts", "src/factories/WithFaceExpressions.ts", "src/draw/drawFaceExpressions.ts", "src/factories/WithFaceLandmarks.ts", "src/draw/DrawFaceLandmarks.ts", "src/draw/index.ts", "src/xception/extractParams.ts", "src/xception/extractParamsFromWeigthMap.ts", "src/xception/TinyXception.ts", "src/ageGenderNet/extractParams.ts", "src/ageGenderNet/extractParamsFromWeigthMap.ts", "src/ageGenderNet/types.ts", "src/ageGenderNet/AgeGenderNet.ts", "src/faceLandmarkNet/FaceLandmark68NetBase.ts", "src/faceLandmarkNet/FaceLandmark68Net.ts", "src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts", "src/faceFeatureExtractor/extractParamsTiny.ts", "src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts", "src/faceLandmarkNet/FaceLandmark68TinyNet.ts", "src/faceLandmarkNet/index.ts", "src/faceRecognitionNet/scaleLayer.ts", "src/faceRecognitionNet/convLayer.ts", "src/faceRecognitionNet/extractParams.ts", "src/faceRecognitionNet/extractParamsFromWeigthMap.ts", "src/faceRecognitionNet/residualLayer.ts", "src/faceRecognitionNet/FaceRecognitionNet.ts", "src/faceRecognitionNet/index.ts", "src/factories/WithFaceDescriptor.ts", "src/factories/WithAge.ts", "src/factories/WithGender.ts", "src/ssdMobilenetv1/extractParams.ts", "src/ssdMobilenetv1/extractParamsFromWeigthMap.ts", "src/ssdMobilenetv1/pointwiseConvLayer.ts", "src/ssdMobilenetv1/mobileNetV1.ts", "src/ssdMobilenetv1/nonMaxSuppression.ts", "src/ssdMobilenetv1/outputLayer.ts", "src/ssdMobilenetv1/boxPredictionLayer.ts", "src/ssdMobilenetv1/predictionLayer.ts", "src/ssdMobilenetv1/SsdMobilenetv1Options.ts", "src/ssdMobilenetv1/SsdMobilenetv1.ts", "src/ssdMobilenetv1/index.ts", "src/tinyYolov2/const.ts", "src/tinyYolov2/config.ts", "src/tinyYolov2/leaky.ts", "src/tinyYolov2/convWithBatchNorm.ts", "src/tinyYolov2/depthwiseSeparableConv.ts", "src/tinyYolov2/extractParams.ts", "src/tinyYolov2/extractParamsFromWeigthMap.ts", "src/tinyYolov2/TinyYolov2Options.ts", "src/tinyYolov2/TinyYolov2Base.ts", "src/tinyYolov2/TinyYolov2.ts", "src/tinyYolov2/index.ts", "src/tinyFaceDetector/TinyFaceDetectorOptions.ts", "src/globalApi/ComposableTask.ts", "src/globalApi/extractFacesAndComputeResults.ts", "src/tinyFaceDetector/const.ts", "src/tinyFaceDetector/TinyFaceDetector.ts", "src/globalApi/nets.ts", "src/globalApi/PredictFaceExpressionsTask.ts", "src/globalApi/PredictAgeAndGenderTask.ts", "src/globalApi/ComputeFaceDescriptorsTasks.ts", "src/globalApi/DetectFaceLandmarksTasks.ts", "src/globalApi/DetectFacesTasks.ts", "src/globalApi/detectFaces.ts", "src/globalApi/allFaces.ts", "src/euclideanDistance.ts", "src/globalApi/FaceMatcher.ts", "src/tinyFaceDetector/index.ts", "src/resizeResults.ts", "src/index.ts"], + "sourcesContent": ["export function isNodejs(): boolean {\n return typeof global === 'object'\n && typeof require === 'function'\n && typeof module !== 'undefined'\n // issues with gatsby.js: module.exports is undefined\n // && !!module.exports\n && typeof process !== 'undefined' && !!process.version\n}", "import { Point } from '../classes';\n\nexport function drawContour(\n ctx: CanvasRenderingContext2D,\n points: Point[],\n isClosed: boolean = false\n) {\n ctx.beginPath()\n\n points.slice(1).forEach(({ x, y }, prevIdx) => {\n const from = points[prevIdx]\n ctx.moveTo(from.x, from.y)\n ctx.lineTo(x, y)\n })\n\n if (isClosed) {\n const from = points[points.length - 1]\n const to = points[0]\n if (!from || !to) {\n return\n }\n\n ctx.moveTo(from.x, from.y)\n ctx.lineTo(to.x, to.y)\n }\n\n ctx.stroke()\n}", "import { isValidNumber } from '../utils';\n\nexport interface IDimensions {\n width: number\n height: number\n}\n\nexport class Dimensions implements IDimensions {\n\n private _width: number\n private _height: number\n\n constructor(width: number, height: number) {\n if (!isValidNumber(width) || !isValidNumber(height)) {\n throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({ width, height })}`)\n }\n\n this._width = width\n this._height = height\n }\n\n public get width(): number { return this._width }\n public get height(): number { return this._height }\n\n public reverse(): Dimensions {\n return new Dimensions(1 / this.width, 1 / this.height)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { Point } from '../classes';\nimport { Dimensions, IDimensions } from '../classes/Dimensions';\n\nexport function isTensor(tensor: any, dim: number) {\n return tensor instanceof tf.Tensor && tensor.shape.length === dim\n}\n\nexport function isTensor1D(tensor: any): tensor is tf.Tensor1D {\n return isTensor(tensor, 1)\n}\n\nexport function isTensor2D(tensor: any): tensor is tf.Tensor2D {\n return isTensor(tensor, 2)\n}\n\nexport function isTensor3D(tensor: any): tensor is tf.Tensor3D {\n return isTensor(tensor, 3)\n}\n\nexport function isTensor4D(tensor: any): tensor is tf.Tensor4D {\n return isTensor(tensor, 4)\n}\n\nexport function isFloat(num: number) {\n return num % 1 !== 0\n}\n\nexport function isEven(num: number) {\n return num % 2 === 0\n}\n\nexport function round(num: number, prec: number = 2) {\n const f = Math.pow(10, prec)\n return Math.floor(num * f) / f\n}\n\nexport function isDimensions(obj: any): boolean {\n return obj && obj.width && obj.height\n}\n\nexport function computeReshapedDimensions({ width, height }: IDimensions, inputSize: number) {\n const scale = inputSize / Math.max(height, width)\n return new Dimensions(Math.round(width * scale), Math.round(height * scale))\n}\n\nexport function getCenterPoint(pts: Point[]): Point {\n return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0))\n .div(new Point(pts.length, pts.length))\n}\n\nexport function range(num: number, start: number, step: number): number[] {\n return Array(num).fill(0).map((_, i) => start + (i * step))\n}\n\nexport function isValidNumber(num: any) {\n return !!num && num !== Infinity && num !== -Infinity && !isNaN(num) || num === 0\n}\n\nexport function isValidProbablitiy(num: any) {\n return isValidNumber(num) && 0 <= num && num <= 1.0\n}", "export interface IPoint {\n x: number\n y: number\n}\n\nexport class Point implements IPoint {\n private _x: number\n private _y: number\n\n constructor(x: number, y: number) {\n this._x = x\n this._y = y\n }\n\n get x(): number { return this._x }\n get y(): number { return this._y }\n\n public add(pt: IPoint): Point {\n return new Point(this.x + pt.x, this.y + pt.y)\n }\n\n public sub(pt: IPoint): Point {\n return new Point(this.x - pt.x, this.y - pt.y)\n }\n\n public mul(pt: IPoint): Point {\n return new Point(this.x * pt.x, this.y * pt.y)\n }\n\n public div(pt: IPoint): Point {\n return new Point(this.x / pt.x, this.y / pt.y)\n }\n\n public abs(): Point {\n return new Point(Math.abs(this.x), Math.abs(this.y))\n }\n\n public magnitude(): number {\n return Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2))\n }\n\n public floor(): Point {\n return new Point(Math.floor(this.x), Math.floor(this.y))\n }\n}", "import { isDimensions, isValidNumber } from '../utils';\nimport { IBoundingBox } from './BoundingBox';\nimport { IDimensions } from './Dimensions';\nimport { Point } from './Point';\nimport { IRect } from './Rect';\n\nexport class Box implements IBoundingBox, IRect {\n\n public static isRect(rect: any): boolean {\n return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber)\n }\n\n public static assertIsValidBox(box: any, callee: string, allowNegativeDimensions: boolean = false) {\n if (!Box.isRect(box)) {\n throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`)\n }\n\n if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) {\n throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`)\n }\n }\n\n private _x: number\n private _y: number\n private _width: number\n private _height: number\n\n constructor(_box: IBoundingBox | IRect, allowNegativeDimensions: boolean = true) {\n const box = (_box || {}) as any\n\n const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber)\n const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber)\n\n if (!isRect && !isBbox) {\n throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`)\n }\n\n const [x, y, width, height] = isRect\n ? [box.x, box.y, box.width, box.height]\n : [box.left, box.top, box.right - box.left, box.bottom - box.top]\n\n Box.assertIsValidBox({ x, y, width, height }, 'Box.constructor', allowNegativeDimensions)\n\n this._x = x\n this._y = y\n this._width = width\n this._height = height\n }\n\n public get x(): number { return this._x }\n public get y(): number { return this._y }\n public get width(): number { return this._width }\n public get height(): number { return this._height }\n public get left(): number { return this.x }\n public get top(): number { return this.y }\n public get right(): number { return this.x + this.width }\n public get bottom(): number { return this.y + this.height }\n public get area(): number { return this.width * this.height }\n public get topLeft(): Point { return new Point(this.left, this.top) }\n public get topRight(): Point { return new Point(this.right, this.top) }\n public get bottomLeft(): Point { return new Point(this.left, this.bottom) }\n public get bottomRight(): Point { return new Point(this.right, this.bottom) }\n\n public round(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map(val => Math.round(val))\n return new Box({ x, y, width, height })\n }\n\n public floor(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map(val => Math.floor(val))\n return new Box({ x, y, width, height })\n }\n\n public toSquare(): Box {\n let { x, y, width, height } = this\n const diff = Math.abs(width - height)\n if (width < height) {\n x -= (diff / 2)\n width += diff\n }\n if (height < width) {\n y -= (diff / 2)\n height += diff\n }\n\n return new Box({ x, y, width, height })\n }\n\n public rescale(s: IDimensions | number): Box {\n const scaleX = isDimensions(s) ? (s as IDimensions).width : s as number\n const scaleY = isDimensions(s) ? (s as IDimensions).height : s as number\n return new Box({\n x: this.x * scaleX,\n y: this.y * scaleY,\n width: this.width * scaleX,\n height: this.height * scaleY\n })\n }\n\n public pad(padX: number, padY: number): Box {\n let [x, y, width, height] = [\n this.x - (padX / 2),\n this.y - (padY / 2),\n this.width + padX,\n this.height + padY\n ]\n return new Box({ x, y, width, height })\n }\n\n public clipAtImageBorders(imgWidth: number, imgHeight: number): Box {\n const { x, y, right, bottom } = this\n const clippedX = Math.max(x, 0)\n const clippedY = Math.max(y, 0)\n\n const newWidth = right - clippedX\n const newHeight = bottom - clippedY\n const clippedWidth = Math.min(newWidth, imgWidth - clippedX)\n const clippedHeight = Math.min(newHeight, imgHeight - clippedY)\n\n return (new Box({ x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight})).floor()\n }\n\n public shift(sx: number, sy: number): Box {\n const { width, height } = this\n const x = this.x + sx\n const y = this.y + sy\n\n return new Box({ x, y, width, height })\n }\n\n public padAtBorders(imageHeight: number, imageWidth: number) {\n const w = this.width + 1\n const h = this.height + 1\n\n let dx = 1\n let dy = 1\n let edx = w\n let edy = h\n\n let x = this.left\n let y = this.top\n let ex = this.right\n let ey = this.bottom\n\n if (ex > imageWidth) {\n edx = -ex + imageWidth + w\n ex = imageWidth\n }\n if (ey > imageHeight) {\n edy = -ey + imageHeight + h\n ey = imageHeight\n }\n if (x < 1) {\n edy = 2 - x\n x = 1\n }\n if (y < 1) {\n edy = 2 - y\n y = 1\n }\n\n return { dy, edy, dx, edx, y, ey, x, ex, w, h }\n }\n\n public calibrate(region: Box) {\n return new Box({\n left: this.left + (region.left * this.width),\n top: this.top + (region.top * this.height),\n right: this.right + (region.right * this.width),\n bottom: this.bottom + (region.bottom * this.height)\n }).toSquare().round()\n }\n}", "import { Box } from './Box';\n\nexport interface IBoundingBox {\n left: number\n top: number\n right: number\n bottom: number\n}\n\nexport class BoundingBox extends Box implements IBoundingBox {\n constructor(left: number, top: number, right: number, bottom: number, allowNegativeDimensions: boolean = false) {\n super({ left, top, right, bottom }, allowNegativeDimensions)\n }\n}", "import { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { IRect, Rect } from './Rect';\n\nexport class ObjectDetection {\n private _score: number\n private _classScore: number\n private _className: string\n private _box: Rect\n private _imageDims: Dimensions\n\n constructor(\n score: number,\n classScore: number,\n className: string,\n relativeBox: IRect,\n imageDims: IDimensions\n ) {\n this._imageDims = new Dimensions(imageDims.width, imageDims.height)\n this._score = score\n this._classScore = classScore\n this._className = className\n this._box = new Box(relativeBox).rescale(this._imageDims)\n }\n\n public get score(): number { return this._score }\n public get classScore(): number { return this._classScore }\n public get className(): string { return this._className }\n public get box(): Box { return this._box }\n public get imageDims(): Dimensions { return this._imageDims }\n public get imageWidth(): number { return this.imageDims.width }\n public get imageHeight(): number { return this.imageDims.height }\n public get relativeBox(): Box { return new Box(this._box).rescale(this.imageDims.reverse()) }\n\n public forSize(width: number, height: number): ObjectDetection {\n return new ObjectDetection(\n this.score,\n this.classScore,\n this.className,\n this.relativeBox,\n { width, height}\n )\n }\n}", "import { Box } from './Box';\nimport { IDimensions } from './Dimensions';\nimport { ObjectDetection } from './ObjectDetection';\nimport { Rect } from './Rect';\n\nexport interface IFaceDetecion {\n score: number\n box: Box\n}\n\nexport class FaceDetection extends ObjectDetection implements IFaceDetecion {\n constructor(\n score: number,\n relativeBox: Rect,\n imageDims: IDimensions\n ) {\n super(score, score, '', relativeBox, imageDims)\n }\n\n public forSize(width: number, height: number): FaceDetection {\n const { score, relativeBox, imageDims } = super.forSize(width, height)\n return new FaceDetection(score, relativeBox, imageDims)\n }\n}", "import { Box } from '../classes/Box';\n\nexport function iou(box1: Box, box2: Box, isIOU: boolean = true) {\n const width = Math.max(0.0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left))\n const height = Math.max(0.0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top))\n const interSection = width * height\n\n return isIOU\n ? interSection / (box1.area + box2.area - interSection)\n : interSection / Math.min(box1.area, box2.area)\n}", "import { BoundingBox, IPoint } from '../classes';\n\nexport function minBbox(pts: IPoint[]): BoundingBox {\n const xs = pts.map(pt => pt.x)\n const ys = pts.map(pt => pt.y)\n const minX = xs.reduce((min, x) => x < min ? x : min, Infinity)\n const minY = ys.reduce((min, y) => y < min ? y : min, Infinity)\n const maxX = xs.reduce((max, x) => max < x ? x : max, 0)\n const maxY = ys.reduce((max, y) => max < y ? y : max, 0)\n\n return new BoundingBox(minX, minY, maxX, maxY)\n}\n", "import { Box } from '../classes/Box';\nimport { iou } from './iou';\n\nexport function nonMaxSuppression(\n boxes: Box[],\n scores: number[],\n iouThreshold: number,\n isIOU: boolean = true\n): number[] {\n\n let indicesSortedByScore = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .sort((c1, c2) => c1.score - c2.score)\n .map(c => c.boxIndex)\n\n const pick: number[] = []\n\n while(indicesSortedByScore.length > 0) {\n const curr = indicesSortedByScore.pop() as number\n pick.push(curr)\n\n const indices = indicesSortedByScore\n\n const outputs: number[] = []\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i]\n\n const currBox = boxes[curr]\n const idxBox = boxes[idx]\n\n outputs.push(iou(currBox, idxBox, isIOU))\n }\n\n indicesSortedByScore = indicesSortedByScore.filter(\n (_, j) => outputs[j] <= iouThreshold\n )\n }\n\n return pick\n\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nexport function normalize(x: tf.Tensor4D, meanRgb: number[]): tf.Tensor4D {\n return tf.tidy(() => {\n const [r, g, b] = meanRgb\n const avg_r = tf.fill([...x.shape.slice(0, 3), 1], r)\n const avg_g = tf.fill([...x.shape.slice(0, 3), 1], g)\n const avg_b = tf.fill([...x.shape.slice(0, 3), 1], b)\n const avg_rgb = tf.concat([avg_r, avg_g, avg_b], 3)\n\n return tf.sub(x, avg_rgb)\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\n/**\n * Pads the smaller dimension of an image tensor with zeros, such that width === height.\n *\n * @param imgTensor The image tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The padded tensor with width === height.\n */\nexport function padToSquare(\n imgTensor: tf.Tensor4D,\n isCenterImage: boolean = false\n): tf.Tensor4D {\n return tf.tidy(() => {\n\n const [height, width] = imgTensor.shape.slice(1)\n if (height === width) {\n return imgTensor\n }\n\n const dimDiff = Math.abs(height - width)\n const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1))\n const paddingAxis = height > width ? 2 : 1\n\n const createPaddingTensor = (paddingAmount: number): tf.Tensor => {\n const paddingTensorShape = imgTensor.shape.slice()\n paddingTensorShape[paddingAxis] = paddingAmount\n return tf.fill(paddingTensorShape, 0)\n }\n\n const paddingTensorAppend = createPaddingTensor(paddingAmount)\n const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number)\n\n const paddingTensorPrepend = isCenterImage && remainingPaddingAmount\n ? createPaddingTensor(remainingPaddingAmount)\n : null\n\n const tensorsToStack = [\n paddingTensorPrepend,\n imgTensor,\n paddingTensorAppend\n ]\n .filter(t => !!t)\n // .map((t: tf.Tensor) => t.toFloat()) as tf.Tensor4D[]\n .map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[]\n return tf.concat(tensorsToStack, paddingAxis)\n\n })\n}", "export function shuffleArray(inputArray: any[]) {\n const array = inputArray.slice()\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n const x = array[i]\n array[i] = array[j]\n array[j] = x\n }\n return array\n}", "export * from './iou'\nexport * from './minBbox'\nexport * from './nonMaxSuppression'\nexport * from './normalize'\nexport * from './padToSquare'\nexport * from './shuffleArray'\n\nexport function sigmoid(x: number) {\n return 1 / (1 + Math.exp(-x))\n}\n\nexport function inverseSigmoid(x: number) {\n return Math.log(x / (1 - x))\n}", "import { Box } from './Box';\n\nexport interface IRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport class Rect extends Box implements IRect {\n constructor(x: number, y: number, width: number, height: number, allowNegativeDimensions: boolean = false) {\n super({ x, y, width, height }, allowNegativeDimensions)\n }\n}", "import { minBbox } from '../ops';\nimport { getCenterPoint } from '../utils';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { FaceDetection } from './FaceDetection';\nimport { Point } from './Point';\nimport { IRect, Rect } from './Rect';\n\n// face alignment constants\nconst relX = 0.5\nconst relY = 0.43\nconst relScale = 0.45\n\nexport interface IFaceLandmarks {\n positions: Point[]\n shift: Point\n}\n\nexport class FaceLandmarks implements IFaceLandmarks {\n protected _shift: Point\n protected _positions: Point[]\n protected _imgDims: Dimensions\n\n constructor(\n relativeFaceLandmarkPositions: Point[],\n imgDims: IDimensions,\n shift: Point = new Point(0, 0)\n ) {\n const { width, height } = imgDims\n this._imgDims = new Dimensions(width, height)\n this._shift = shift\n this._positions = relativeFaceLandmarkPositions.map(\n pt => pt.mul(new Point(width, height)).add(shift)\n )\n }\n\n public get shift(): Point { return new Point(this._shift.x, this._shift.y) }\n public get imageWidth(): number { return this._imgDims.width }\n public get imageHeight(): number { return this._imgDims.height }\n public get positions(): Point[] { return this._positions }\n public get relativePositions(): Point[] {\n return this._positions.map(\n pt => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight))\n )\n }\n\n public forSize(width: number, height: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n { width, height }\n )\n }\n\n public shiftBy(x: number, y: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n this._imgDims,\n new Point(x, y)\n )\n }\n\n public shiftByPoint(pt: Point): T {\n return this.shiftBy(pt.x, pt.y)\n }\n\n /**\n * Aligns the face landmarks after face detection from the relative positions of the faces\n * bounding box, or it's current shift. This function should be used to align the face images\n * after face detection has been performed, before they are passed to the face recognition net.\n * This will make the computed face descriptor more accurate.\n *\n * @param detection (optional) The bounding box of the face or the face detection result. If\n * no argument was passed the position of the face landmarks are assumed to be relative to\n * it's current shift.\n * @returns The bounding box of the aligned face.\n */\n public align(\n detection?: FaceDetection | IRect | IBoundingBox | null,\n options: { useDlibAlignment?: boolean, minBoxPadding?: number } = { }\n ): Box {\n if (detection) {\n const box = detection instanceof FaceDetection\n ? detection.box.floor()\n : new Box(detection)\n\n return this.shiftBy(box.x, box.y).align(null, options)\n }\n\n const { useDlibAlignment, minBoxPadding } = Object.assign({}, { useDlibAlignment: false, minBoxPadding: 0.2 }, options)\n\n if (useDlibAlignment) {\n return this.alignDlib()\n }\n\n return this.alignMinBbox(minBoxPadding)\n }\n\n private alignDlib(): Box {\n\n const centers = this.getRefPointsForAlignment()\n\n const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers\n const distToMouth = (pt: Point) => mouthCenter.sub(pt).magnitude()\n const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2\n\n const size = Math.floor(eyeToMouthDist / relScale)\n\n const refPoint = getCenterPoint(centers)\n // TODO: pad in case rectangle is out of image bounds\n const x = Math.floor(Math.max(0, refPoint.x - (relX * size)))\n const y = Math.floor(Math.max(0, refPoint.y - (relY * size)))\n\n return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y))\n }\n\n private alignMinBbox(padding: number): Box {\n const box = minBbox(this.positions)\n return box.pad(box.width * padding, box.height * padding)\n }\n\n protected getRefPointsForAlignment(): Point[] {\n throw new Error('getRefPointsForAlignment not implemented by base class')\n }\n}", "import { getCenterPoint } from '../utils';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\n\nexport class FaceLandmarks5 extends FaceLandmarks {\n\n protected getRefPointsForAlignment(): Point[] {\n const pts = this.positions\n return [\n pts[0],\n pts[1],\n getCenterPoint([pts[3], pts[4]])\n ]\n }\n}", "import { getCenterPoint } from '../utils';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks68 extends FaceLandmarks {\n public getJawOutline(): Point[] {\n return this.positions.slice(0, 17)\n }\n\n public getLeftEyeBrow(): Point[] {\n return this.positions.slice(17, 22)\n }\n\n public getRightEyeBrow(): Point[] {\n return this.positions.slice(22, 27)\n }\n\n public getNose(): Point[] {\n return this.positions.slice(27, 36)\n }\n\n public getLeftEye(): Point[] {\n return this.positions.slice(36, 42)\n }\n\n public getRightEye(): Point[] {\n return this.positions.slice(42, 48)\n }\n\n public getMouth(): Point[] {\n return this.positions.slice(48, 68)\n }\n\n protected getRefPointsForAlignment(): Point[] {\n return [\n this.getLeftEye(),\n this.getRightEye(),\n this.getMouth()\n ].map(getCenterPoint)\n }\n}", "import { round } from '../utils';\n\nexport interface IFaceMatch {\n label: string\n distance: number\n}\n\nexport class FaceMatch implements IFaceMatch {\n private _label: string\n private _distance: number\n\n constructor(label: string, distance: number) {\n this._label = label\n this._distance = distance\n }\n\n public get label(): string { return this._label }\n public get distance(): number { return this._distance }\n\n public toString(withDistance: boolean = true): string {\n return `${this.label}${withDistance ? ` (${round(this.distance)})` : ''}`\n }\n}", "import { isValidNumber } from '../utils';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { IRect } from './Rect';\n\nexport class LabeledBox extends Box {\n\n public static assertIsValidLabeledBox(box: any, callee: string) {\n Box.assertIsValidBox(box, callee)\n\n if (!isValidNumber(box.label)) {\n throw new Error(`${callee} - expected property label (${box.label}) to be a number`)\n }\n }\n\n private _label: number\n\n constructor(box: IBoundingBox | IRect | any, label: number) {\n super(box)\n this._label = label\n }\n\n public get label(): number { return this._label }\n\n}", "export class LabeledFaceDescriptors {\n private _label: string\n private _descriptors: Float32Array[]\n\n constructor(label: string, descriptors: Float32Array[]) {\n if (!(typeof label === 'string')) {\n throw new Error('LabeledFaceDescriptors - constructor expected label to be a string')\n }\n\n if (!Array.isArray(descriptors) || descriptors.some(desc => !(desc instanceof Float32Array))) {\n throw new Error('LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array')\n }\n\n this._label = label\n this._descriptors = descriptors\n }\n\n public get label(): string { return this._label }\n public get descriptors(): Float32Array[] { return this._descriptors }\n\n public toJSON(): any {\n return {\n label: this.label,\n descriptors: this.descriptors.map((d) => Array.from(d))\n };\n }\n\n public static fromJSON(json: any): LabeledFaceDescriptors {\n const descriptors = json.descriptors.map((d: any) => {\n return new Float32Array(d);\n });\n return new LabeledFaceDescriptors(json.label, descriptors);\n }\n\n}", "import { isValidProbablitiy } from '../utils';\nimport { IBoundingBox } from './BoundingBox';\nimport { LabeledBox } from './LabeledBox';\nimport { IRect } from './Rect';\n\nexport class PredictedBox extends LabeledBox {\n\n public static assertIsValidPredictedBox(box: any, callee: string) {\n LabeledBox.assertIsValidLabeledBox(box, callee)\n\n if (\n !isValidProbablitiy(box.score)\n || !isValidProbablitiy(box.classScore)\n ) {\n throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`)\n }\n }\n\n private _score: number\n private _classScore: number\n\n constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) {\n super(box, label)\n this._score = score\n this._classScore = classScore\n }\n\n public get score(): number { return this._score }\n public get classScore(): number { return this._classScore }\n\n}", "import { FaceDetection } from '../classes/FaceDetection';\n\nexport type WithFaceDetection = TSource & {\n detection: FaceDetection\n}\n\nexport function isWithFaceDetection(obj: any): obj is WithFaceDetection<{}> {\n return obj['detection'] instanceof FaceDetection\n}\n\nexport function extendWithFaceDetection<\n TSource\n> (\n sourceObj: TSource,\n detection: FaceDetection\n): WithFaceDetection {\n\n const extension = { detection }\n return Object.assign({}, sourceObj, extension)\n}\n", "import { Environment } from './types';\n\nexport function createBrowserEnv(): Environment {\n\n const fetch = window['fetch'] || function() {\n throw new Error('fetch - missing fetch implementation for browser environment')\n }\n\n const readFile = function() {\n throw new Error('readFile - filesystem not available for browser environment')\n }\n\n return {\n Canvas: HTMLCanvasElement,\n CanvasRenderingContext2D: CanvasRenderingContext2D,\n Image: HTMLImageElement,\n ImageData: ImageData,\n Video: HTMLVideoElement,\n createCanvasElement: () => document.createElement('canvas'),\n createImageElement: () => document.createElement('img'),\n fetch,\n readFile\n }\n}", "import { FileSystem } from './types';\n\nexport function createFileSystem(fs?: any): FileSystem {\n\n let requireFsError = ''\n\n if (!fs) {\n try {\n fs = require('fs')\n } catch (err) {\n requireFsError = err.toString()\n }\n }\n\n const readFile = fs\n ? function(filePath: string) {\n return new Promise((res, rej) => {\n fs.readFile(filePath, function(err: any, buffer: Buffer) {\n return err ? rej(err) : res(buffer)\n })\n })\n }\n : function() {\n throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)\n }\n\n return {\n readFile\n }\n}", "import { createFileSystem } from './createFileSystem';\nimport { Environment } from './types';\n\nexport function createNodejsEnv(): Environment {\n\n const Canvas = global['Canvas'] || global['HTMLCanvasElement']\n const Image = global['Image'] || global['HTMLImageElement']\n\n const createCanvasElement = function() {\n if (Canvas) {\n return new Canvas()\n }\n throw new Error('createCanvasElement - missing Canvas implementation for nodejs environment')\n }\n\n const createImageElement = function() {\n if (Image) {\n return new Image()\n }\n throw new Error('createImageElement - missing Image implementation for nodejs environment')\n }\n\n const fetch = global['fetch'] || function() {\n throw new Error('fetch - missing fetch implementation for nodejs environment')\n }\n\n const fileSystem = createFileSystem()\n\n return {\n Canvas: Canvas || class {},\n CanvasRenderingContext2D: global['CanvasRenderingContext2D'] || class {},\n Image: Image || class {},\n ImageData: global['ImageData'] || class {},\n Video: global['HTMLVideoElement'] || class {},\n createCanvasElement,\n createImageElement,\n fetch,\n ...fileSystem\n }\n}", "export function isBrowser(): boolean {\n return typeof window === 'object'\n && typeof document !== 'undefined'\n && typeof HTMLImageElement !== 'undefined'\n && typeof HTMLCanvasElement !== 'undefined'\n && typeof HTMLVideoElement !== 'undefined'\n && typeof ImageData !== 'undefined'\n && typeof CanvasRenderingContext2D !== 'undefined'\n}", "import { createBrowserEnv } from './createBrowserEnv';\nimport { createFileSystem } from './createFileSystem';\nimport { createNodejsEnv } from './createNodejsEnv';\nimport { isBrowser } from './isBrowser';\nimport { isNodejs } from './isNodejs';\nimport { Environment } from './types';\n\nlet environment: Environment | null\n\nfunction getEnv(): Environment {\n if (!environment) {\n throw new Error('getEnv - environment is not defined, check isNodejs() and isBrowser()')\n }\n return environment\n}\n\nfunction setEnv(env: Environment) {\n environment = env\n}\n\nfunction initialize() {\n // check for isBrowser() first to prevent electron renderer process\n // to be initialized with wrong environment due to isNodejs() returning true\n if (isBrowser()) {\n return setEnv(createBrowserEnv())\n }\n if (isNodejs()) {\n return setEnv(createNodejsEnv())\n }\n}\n\nfunction monkeyPatch(env: Partial) {\n if (!environment) {\n initialize()\n }\n\n if (!environment) {\n throw new Error('monkeyPatch - environment is not defined, check isNodejs() and isBrowser()')\n }\n\n const { Canvas = environment.Canvas, Image = environment.Image } = env\n environment.Canvas = Canvas\n environment.Image = Image\n environment.createCanvasElement = env.createCanvasElement || (() => new Canvas())\n environment.createImageElement = env.createImageElement || (() => new Image())\n\n environment.ImageData = env.ImageData || environment.ImageData\n environment.Video = env.Video || environment.Video\n environment.fetch = env.fetch || environment.fetch\n environment.readFile = env.readFile || environment.readFile\n}\n\nexport const env = {\n getEnv,\n setEnv,\n initialize,\n createBrowserEnv,\n createFileSystem,\n createNodejsEnv,\n monkeyPatch,\n isBrowser,\n isNodejs\n}\n\ninitialize()\n\nexport * from './types'\n", "import { env } from '../env';\n\nexport function resolveInput(arg: string | any) {\n if (!env.isNodejs() && typeof arg === 'string') {\n return document.getElementById(arg)\n }\n return arg\n}", "import { env } from '../env';\nimport { resolveInput } from './resolveInput';\n\nexport function getContext2dOrThrow(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D): CanvasRenderingContext2D {\n\n const { Canvas, CanvasRenderingContext2D } = env.getEnv()\n\n if (canvasArg instanceof CanvasRenderingContext2D) {\n return canvasArg\n }\n\n const canvas = resolveInput(canvasArg)\n\n if (!(canvas instanceof Canvas)) {\n throw new Error('resolveContext2d - expected canvas to be of instance of Canvas')\n }\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('resolveContext2d - canvas 2d context is null')\n }\n\n return ctx\n}", "import { IDimensions, IPoint } from '../classes';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { resolveInput } from '../dom/resolveInput';\n\nexport enum AnchorPosition {\n TOP_LEFT = 'TOP_LEFT',\n TOP_RIGHT = 'TOP_RIGHT',\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n BOTTOM_RIGHT = 'BOTTOM_RIGHT'\n}\n\nexport interface IDrawTextFieldOptions {\n anchorPosition?: AnchorPosition\n backgroundColor?: string\n fontColor?: string\n fontSize?: number\n fontStyle?: string\n padding?: number\n}\n\nexport class DrawTextFieldOptions implements IDrawTextFieldOptions {\n public anchorPosition: AnchorPosition\n public backgroundColor: string\n public fontColor: string\n public fontSize: number\n public fontStyle: string\n public padding: number\n\n constructor(options: IDrawTextFieldOptions = {}) {\n const { anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding } = options\n this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT\n this.backgroundColor = backgroundColor || 'rgba(0, 0, 0, 0.5)'\n this.fontColor = fontColor || 'rgba(255, 255, 255, 1)'\n this.fontSize = fontSize || 14\n this.fontStyle = fontStyle || 'Georgia'\n this.padding = padding || 4\n }\n}\n\nexport class DrawTextField {\n public text: string[]\n public anchor : IPoint\n public options: DrawTextFieldOptions\n\n constructor(\n text: string | string[] | DrawTextField,\n anchor: IPoint,\n options: IDrawTextFieldOptions = {}\n ) {\n this.text = typeof text === 'string'\n ? [text]\n : (text instanceof DrawTextField ? text.text : text)\n this.anchor = anchor\n this.options = new DrawTextFieldOptions(options)\n }\n\n measureWidth(ctx: CanvasRenderingContext2D): number {\n const { padding } = this.options\n return this.text.map(l => ctx.measureText(l).width).reduce((w0, w1) => w0 < w1 ? w1 : w0, 0) + (2 * padding)\n }\n\n measureHeight(): number {\n const { fontSize, padding } = this.options\n return this.text.length * fontSize + (2 * padding)\n }\n\n getUpperLeft(ctx: CanvasRenderingContext2D, canvasDims?: IDimensions): IPoint {\n const { anchorPosition } = this.options\n const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT\n const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT\n\n const textFieldWidth = this.measureWidth(ctx)\n const textFieldHeight = this.measureHeight()\n const x = (isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x)\n const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y\n\n // adjust anchor if text box exceeds canvas borders\n if (canvasDims) {\n const { width, height } = canvasDims\n const newX = Math.max(Math.min(x, width - textFieldWidth), 0)\n const newY = Math.max(Math.min(y, height - textFieldHeight), 0)\n return { x: newX, y: newY }\n }\n return { x, y }\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const canvas = resolveInput(canvasArg)\n const ctx = getContext2dOrThrow(canvas)\n\n const { backgroundColor, fontColor, fontSize, fontStyle, padding } = this.options\n\n ctx.font = `${fontSize}px ${fontStyle}`\n const maxTextWidth = this.measureWidth(ctx)\n const textHeight = this.measureHeight()\n\n ctx.fillStyle = backgroundColor\n const upperLeft = this.getUpperLeft(ctx, canvas)\n ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight)\n\n ctx.fillStyle = fontColor;\n this.text.forEach((textLine, i) => {\n const x = padding + upperLeft.x\n const y = padding + upperLeft.y + ((i + 1) * fontSize)\n ctx.fillText(textLine, x, y)\n })\n }\n}", "import { Box, IBoundingBox, IRect } from '../classes';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { AnchorPosition, DrawTextField, DrawTextFieldOptions, IDrawTextFieldOptions } from './DrawTextField';\n\nexport interface IDrawBoxOptions {\n boxColor?: string\n lineWidth?: number\n drawLabelOptions?: IDrawTextFieldOptions\n label?: string\n}\n\nexport class DrawBoxOptions {\n public boxColor: string\n public lineWidth: number\n public drawLabelOptions: DrawTextFieldOptions\n public label?: string\n\n constructor(options: IDrawBoxOptions = {}) {\n const { boxColor, lineWidth, label, drawLabelOptions } = options\n this.boxColor = boxColor || 'rgba(0, 0, 255, 1)'\n this.lineWidth = lineWidth || 2\n this.label = label\n\n const defaultDrawLabelOptions = {\n anchorPosition: AnchorPosition.BOTTOM_LEFT,\n backgroundColor: this.boxColor\n }\n this.drawLabelOptions = new DrawTextFieldOptions(Object.assign({}, defaultDrawLabelOptions, drawLabelOptions))\n }\n}\n\nexport class DrawBox {\n public box: Box\n public options: DrawBoxOptions\n\n constructor(\n box: IBoundingBox | IRect,\n options: IDrawBoxOptions = {}\n ) {\n this.box = new Box(box)\n this.options = new DrawBoxOptions(options)\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg)\n\n const { boxColor, lineWidth } = this.options\n\n const { x, y, width, height } = this.box\n ctx.strokeStyle = boxColor\n ctx.lineWidth = lineWidth\n ctx.strokeRect(x, y, width, height)\n\n const { label } = this.options\n if (label) {\n new DrawTextField([label], { x: x - (lineWidth / 2), y }, this.options.drawLabelOptions).draw(canvasArg)\n }\n }\n}", "import { Box, IBoundingBox, IRect } from '../classes';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { round } from '../utils';\nimport { DrawBox } from './DrawBox';\n\nexport type TDrawDetectionsInput = IRect | IBoundingBox | FaceDetection | WithFaceDetection<{}>\n\nexport function drawDetections(\n canvasArg: string | HTMLCanvasElement,\n detections: TDrawDetectionsInput | Array\n) {\n const detectionsArray = Array.isArray(detections) ? detections : [detections]\n\n detectionsArray.forEach(det => {\n const score = det instanceof FaceDetection\n ? det.score\n : (isWithFaceDetection(det) ? det.detection.score : undefined)\n\n const box = det instanceof FaceDetection\n ? det.box\n : (isWithFaceDetection(det) ? det.detection.box : new Box(det))\n\n const label = score ? `${round(score)}` : undefined\n new DrawBox(box, { label }).draw(canvasArg)\n })\n}", "import { env } from '../env';\n\nexport function isMediaLoaded(media: HTMLImageElement | HTMLVideoElement) : boolean {\n\n const { Image, Video } = env.getEnv()\n\n return (media instanceof Image && media.complete)\n || (media instanceof Video && media.readyState >= 3)\n}\n", "import { env } from '../env';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) {\n\n return new Promise((resolve, reject) => {\n if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) {\n return resolve(null)\n }\n\n function onLoad(e: Event) {\n if (!e.currentTarget) return\n e.currentTarget.removeEventListener('load', onLoad)\n e.currentTarget.removeEventListener('error', onError)\n resolve(e)\n }\n\n function onError(e: Event) {\n if (!e.currentTarget) return\n e.currentTarget.removeEventListener('load', onLoad)\n e.currentTarget.removeEventListener('error', onError)\n reject(e)\n }\n\n media.addEventListener('load', onLoad)\n media.addEventListener('error', onError)\n })\n}", "import { env } from '../env';\n\nexport function bufferToImage(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) {\n return reject('bufferToImage - expected buf to be of type: Blob')\n }\n\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n return reject('bufferToImage - expected reader.result to be a string, in onload')\n }\n\n const img = env.getEnv().createImageElement()\n img.onload = () => resolve(img)\n img.onerror = reject\n img.src = reader.result\n }\n reader.onerror = reject\n reader.readAsDataURL(buf)\n })\n}", "import { Dimensions, IDimensions } from '../classes/Dimensions';\nimport { env } from '../env';\n\nexport function getMediaDimensions(input: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | IDimensions): Dimensions {\n\n const { Image, Video } = env.getEnv()\n\n if (input instanceof Image) {\n return new Dimensions(input.naturalWidth, input.naturalHeight)\n }\n if (input instanceof Video) {\n return new Dimensions(input.videoWidth, input.videoHeight)\n }\n return new Dimensions(input.width, input.height)\n}\n", "import { IDimensions } from '../classes/Dimensions';\nimport { env } from '../env';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function createCanvas({ width, height }: IDimensions): HTMLCanvasElement {\n\n const { createCanvasElement } = env.getEnv()\n const canvas = createCanvasElement()\n canvas.width = width\n canvas.height = height\n return canvas\n}\n\nexport function createCanvasFromMedia(media: HTMLImageElement | HTMLVideoElement | ImageData, dims?: IDimensions): HTMLCanvasElement {\n\n const { ImageData } = env.getEnv()\n\n if (!(media instanceof ImageData) && !isMediaLoaded(media)) {\n throw new Error('createCanvasFromMedia - media has not finished loading yet')\n }\n\n const { width, height } = dims || getMediaDimensions(media)\n const canvas = createCanvas({ width, height })\n\n if (media instanceof ImageData) {\n getContext2dOrThrow(canvas).putImageData(media, 0, 0)\n } else {\n getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height)\n }\n return canvas\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { env } from '../env';\nimport { isTensor4D } from '../utils';\n\nexport async function imageTensorToCanvas(\n imgTensor: tf.Tensor,\n canvas?: HTMLCanvasElement\n): Promise {\n\n const targetCanvas = canvas || env.getEnv().createCanvasElement()\n\n const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0)\n const imgTensor3D = tf.tidy(() => imgTensor.as3D(height, width, numChannels).toInt())\n await tf.browser.toPixels(imgTensor3D, targetCanvas)\n\n imgTensor3D.dispose()\n\n return targetCanvas\n}", "import { env } from '../env';\n\nexport function isMediaElement(input: any) {\n\n const { Image, Canvas, Video } = env.getEnv()\n\n return input instanceof Image\n || input instanceof Canvas\n || input instanceof Video\n}", "import { env } from '../env';\nimport { createCanvas, createCanvasFromMedia } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function imageToSquare(input: HTMLImageElement | HTMLCanvasElement, inputSize: number, centerImage: boolean = false) {\n\n const { Image, Canvas } = env.getEnv()\n\n if (!(input instanceof Image || input instanceof Canvas)) {\n throw new Error('imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement')\n }\n\n const dims = getMediaDimensions(input)\n const scale = inputSize / Math.max(dims.height, dims.width)\n const width = scale * dims.width\n const height = scale * dims.height\n\n const targetCanvas = createCanvas({ width: inputSize, height: inputSize })\n const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input)\n\n const offset = Math.abs(width - height) / 2\n const dx = centerImage && width < height ? offset : 0\n const dy = centerImage && height < width ? offset : 0\n getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height)\n\n return targetCanvas\n}", "import * as tf from '@tensorflow/tfjs-core';\n\nimport { Dimensions } from '../classes/Dimensions';\nimport { env } from '../env';\nimport { padToSquare } from '../ops/padToSquare';\nimport { computeReshapedDimensions, isTensor3D, isTensor4D, range } from '../utils';\nimport { createCanvasFromMedia } from './createCanvas';\nimport { imageToSquare } from './imageToSquare';\nimport { TResolvedNetInput } from './types';\n\nexport class NetInput {\n private _imageTensors: Array = []\n private _canvases: HTMLCanvasElement[] = []\n private _batchSize: number\n private _treatAsBatchInput: boolean = false\n\n private _inputDimensions: number[][] = []\n private _inputSize: number\n\n constructor(\n inputs: Array,\n treatAsBatchInput: boolean = false\n ) {\n if (!Array.isArray(inputs)) {\n throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`)\n }\n\n this._treatAsBatchInput = treatAsBatchInput\n this._batchSize = inputs.length\n\n inputs.forEach((input, idx) => {\n\n if (isTensor3D(input)) {\n this._imageTensors[idx] = input\n this._inputDimensions[idx] = input.shape\n return\n }\n\n if (isTensor4D(input)) {\n const batchSize = (input as any).shape[0]\n if (batchSize !== 1) {\n throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)\n }\n\n this._imageTensors[idx] = input\n this._inputDimensions[idx] = (input as any).shape.slice(1)\n return\n }\n\n const canvas = (input as any) instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input)\n this._canvases[idx] = canvas\n this._inputDimensions[idx] = [canvas.height, canvas.width, 3]\n })\n }\n\n public get imageTensors(): Array {\n return this._imageTensors\n }\n\n public get canvases(): HTMLCanvasElement[] {\n return this._canvases\n }\n\n public get isBatchInput(): boolean {\n return this.batchSize > 1 || this._treatAsBatchInput\n }\n\n public get batchSize(): number {\n return this._batchSize\n }\n\n public get inputDimensions(): number[][] {\n return this._inputDimensions\n }\n\n public get inputSize(): number | undefined {\n return this._inputSize\n }\n\n public get reshapedInputDimensions(): Dimensions[] {\n return range(this.batchSize, 0, 1).map(\n (_, batchIdx) => this.getReshapedInputDimensions(batchIdx)\n )\n }\n\n public getInput(batchIdx: number): tf.Tensor3D | tf.Tensor4D | HTMLCanvasElement {\n return this.canvases[batchIdx] || this.imageTensors[batchIdx]\n }\n\n public getInputDimensions(batchIdx: number): number[] {\n return this._inputDimensions[batchIdx]\n }\n\n public getInputHeight(batchIdx: number): number {\n return this._inputDimensions[batchIdx][0]\n }\n\n public getInputWidth(batchIdx: number): number {\n return this._inputDimensions[batchIdx][1]\n }\n\n public getReshapedInputDimensions(batchIdx: number): Dimensions {\n if (typeof this.inputSize !== 'number') {\n throw new Error('getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet')\n }\n\n const width = this.getInputWidth(batchIdx)\n const height = this.getInputHeight(batchIdx)\n return computeReshapedDimensions({ width, height }, this.inputSize)\n }\n\n /**\n * Create a batch tensor from all input canvases and tensors\n * with size [batchSize, inputSize, inputSize, 3].\n *\n * @param inputSize Height and width of the tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The batch tensor.\n */\n public toBatchTensor(inputSize: number, isCenterInputs: boolean = true): tf.Tensor4D {\n\n this._inputSize = inputSize\n\n return tf.tidy(() => {\n\n const inputTensors = range(this.batchSize, 0, 1).map(batchIdx => {\n const input = this.getInput(batchIdx)\n\n if (input instanceof tf.Tensor) {\n // @ts-ignore: error TS2344: Type 'Rank.R4' does not satisfy the constraint 'Tensor'.\n let imgTensor = isTensor4D(input) ? input : input.expandDims()\n // @ts-ignore: error TS2344: Type 'Rank.R4' does not satisfy the constraint 'Tensor'.\n imgTensor = padToSquare(imgTensor, isCenterInputs)\n\n if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) {\n imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize])\n }\n\n return imgTensor.as3D(inputSize, inputSize, 3)\n }\n\n if (input instanceof env.getEnv().Canvas) {\n return tf.browser.fromPixels(imageToSquare(input, inputSize, isCenterInputs))\n }\n\n throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`)\n })\n\n // const batchTensor = tf.stack(inputTensors.map(t => t.toFloat())).as4D(this.batchSize, inputSize, inputSize, 3)\n const batchTensor = tf.stack(inputTensors.map(t => tf.cast(t, 'float32'))).as4D(this.batchSize, inputSize, inputSize, 3)\n // const batchTensor = tf.stack(inputTensors.map(t => tf.Tensor.as4D(tf.cast(t, 'float32'))), this.batchSize, inputSize, inputSize, 3);\n \n return batchTensor\n })\n }\n}", "import { isTensor3D, isTensor4D } from '../utils';\nimport { awaitMediaLoaded } from './awaitMediaLoaded';\nimport { isMediaElement } from './isMediaElement';\nimport { NetInput } from './NetInput';\nimport { resolveInput } from './resolveInput';\nimport { TNetInput } from './types';\n\n/**\n * Validates the input to make sure, they are valid net inputs and awaits all media elements\n * to be finished loading.\n *\n * @param input The input, which can be a media element or an array of different media elements.\n * @returns A NetInput instance, which can be passed into one of the neural networks.\n */\nexport async function toNetInput(inputs: TNetInput): Promise {\n if (inputs instanceof NetInput) {\n return inputs\n }\n\n let inputArgArray = Array.isArray(inputs)\n ? inputs\n : [inputs]\n\n if (!inputArgArray.length) {\n throw new Error('toNetInput - empty array passed as input')\n }\n\n const getIdxHint = (idx: number) => Array.isArray(inputs) ? ` at input index ${idx}:` : ''\n\n const inputArray = inputArgArray.map(resolveInput)\n\n inputArray.forEach((input, i) => {\n if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) {\n\n if (typeof inputArgArray[i] === 'string') {\n throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`)\n }\n\n throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`)\n }\n\n if (isTensor4D(input)) {\n // if tf.Tensor4D is passed in the input array, the batch size has to be 1\n const batchSize = input.shape[0]\n if (batchSize !== 1) {\n throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`)\n }\n }\n })\n\n // wait for all media elements being loaded\n await Promise.all(\n inputArray.map(input => isMediaElement(input) && awaitMediaLoaded(input))\n )\n\n return new NetInput(inputArray, Array.isArray(inputs))\n}", "import { FaceDetection } from '../classes/FaceDetection';\nimport { Rect } from '../classes/Rect';\nimport { env } from '../env';\nimport { createCanvas } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { imageTensorToCanvas } from './imageTensorToCanvas';\nimport { toNetInput } from './toNetInput';\nimport { TNetInput } from './types';\n\n/**\n * Extracts the image regions containing the detected faces.\n *\n * @param input The image that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns The Canvases of the corresponding image region for each detected face.\n */\nexport async function extractFaces(\n input: TNetInput,\n detections: Array\n): Promise {\n\n const { Canvas } = env.getEnv()\n\n let canvas = input as HTMLCanvasElement\n\n if (!(input instanceof Canvas)) {\n const netInput = await toNetInput(input)\n\n if (netInput.batchSize > 1) {\n throw new Error('extractFaces - batchSize > 1 not supported')\n }\n\n const tensorOrCanvas = netInput.getInput(0)\n canvas = tensorOrCanvas instanceof Canvas\n ? tensorOrCanvas\n : await imageTensorToCanvas(tensorOrCanvas)\n }\n\n const ctx = getContext2dOrThrow(canvas)\n const boxes = detections.map(\n det => det instanceof FaceDetection\n ? det.forSize(canvas.width, canvas.height).box.floor()\n : det\n )\n .map(box => box.clipAtImageBorders(canvas.width, canvas.height))\n\n return boxes.map(({ x, y, width, height }) => {\n const faceImg = createCanvas({ width, height })\n getContext2dOrThrow(faceImg)\n .putImageData(ctx.getImageData(x, y, width, height), 0, 0)\n return faceImg\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { Rect } from '../classes';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isTensor3D, isTensor4D } from '../utils';\n\n/**\n * Extracts the tensors of the image regions containing the detected faces.\n * Useful if you want to compute the face descriptors for the face images.\n * Using this method is faster then extracting a canvas for each face and\n * converting them to tensors individually.\n *\n * @param imageTensor The image tensor that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns Tensors of the corresponding image region for each detected face.\n */\nexport async function extractFaceTensors(\n imageTensor: tf.Tensor3D | tf.Tensor4D,\n detections: Array\n): Promise {\n\n if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {\n throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D')\n }\n\n if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) {\n throw new Error('extractFaceTensors - batchSize > 1 not supported')\n }\n\n return tf.tidy(() => {\n const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0)\n\n const boxes = detections.map(\n det => det instanceof FaceDetection\n ? det.forSize(imgWidth, imgHeight).box\n : det\n )\n .map(box => box.clipAtImageBorders(imgWidth, imgHeight))\n\n const faceTensors = boxes.map(({ x, y, width, height }) =>\n tf.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels])\n )\n\n return faceTensors\n })\n}", "import { env } from '../env';\n\nexport async function fetchOrThrow(\n url: string,\n init?: RequestInit\n): Promise {\n\n const fetch = env.getEnv().fetch\n const res = await fetch(url, init)\n if (!(res.status < 400)) {\n throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`)\n }\n return res\n}", "import { bufferToImage } from './bufferToImage';\nimport { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchImage(uri: string): Promise {\n const res = await fetchOrThrow(uri)\n const blob = await (res).blob()\n\n if (!blob.type.startsWith('image/')) {\n throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`)\n }\n return bufferToImage(blob)\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchJson(uri: string): Promise {\n return (await fetchOrThrow(uri)).json()\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchNetWeights(uri: string): Promise {\n return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer())\n}\n", "export function getModelUris(uri: string | undefined, defaultModelName: string) {\n const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`\n\n if (!uri) {\n return {\n modelBaseUri: '',\n manifestUri: defaultManifestFilename\n }\n }\n\n if (uri === '/') {\n return {\n modelBaseUri: '/',\n manifestUri: `/${defaultManifestFilename}`\n }\n }\n const protocol = uri.startsWith('http://') ? 'http://' : uri.startsWith('https://') ? 'https://' : '';\n uri = uri.replace(protocol, '');\n\n const parts = uri.split('/').filter(s => s)\n\n const manifestFile = uri.endsWith('.json')\n ? parts[parts.length - 1]\n : defaultManifestFilename\n\n let modelBaseUri = protocol + (uri.endsWith('.json') ? parts.slice(0, parts.length - 1) : parts).join('/')\n modelBaseUri = uri.startsWith('/') ? `/${modelBaseUri}` : modelBaseUri\n\n return {\n modelBaseUri,\n manifestUri: modelBaseUri === '/' ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}`\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { getModelUris } from '../common/getModelUris';\nimport { fetchJson } from './fetchJson';\n\nexport async function loadWeightMap(\n uri: string | undefined,\n defaultModelName: string,\n): Promise {\n const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName)\n let manifest = await fetchJson(manifestUri)\n // if (manifest['weightsManifest']) manifest = manifest['weightsManifest'];\n return tf.io.loadWeights(manifest, modelBaseUri)\n}", "import { IDimensions } from '../classes';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function matchDimensions(input: IDimensions, reference: IDimensions, useMediaDimensions: boolean = false) {\n const { width, height } = useMediaDimensions\n ? getMediaDimensions(reference)\n : reference\n input.width = width\n input.height = height\n return { width, height }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ParamMapping } from './common';\nimport { getModelUris } from './common/getModelUris';\nimport { loadWeightMap } from './dom';\nimport { env } from './env';\n\nexport abstract class NeuralNetwork {\n\n protected _params: TNetParams | undefined = undefined\n protected _paramMappings: ParamMapping[] = []\n\n constructor(protected _name: string) {\n /*\n try {\n const testTensor = tf.tensor([0]);\n testTensor.toFloat();\n } catch (err) {\n throw new Error(`tfjs module not loaded: load '@tensorflow/tfjs' or '@tensorflow/tfjs-core' with appropriate backend explicitly`);\n }\n */\n }\n\n public get params(): TNetParams | undefined { return this._params }\n public get paramMappings(): ParamMapping[] { return this._paramMappings }\n public get isLoaded(): boolean { return !!this.params }\n\n public getParamFromPath(paramPath: string): tf.Tensor {\n const { obj, objProp } = this.traversePropertyPath(paramPath)\n return obj[objProp]\n }\n\n public reassignParamFromPath(paramPath: string, tensor: tf.Tensor) {\n const { obj, objProp } = this.traversePropertyPath(paramPath)\n obj[objProp].dispose()\n obj[objProp] = tensor\n }\n\n public getParamList() {\n return this._paramMappings.map(({ paramPath }) => ({\n path: paramPath,\n tensor: this.getParamFromPath(paramPath)\n }))\n }\n\n public getTrainableParams() {\n return this.getParamList().filter(param => param.tensor instanceof tf.Variable)\n }\n\n public getFrozenParams() {\n return this.getParamList().filter(param => !(param.tensor instanceof tf.Variable))\n }\n\n public variable() {\n this.getFrozenParams().forEach(({ path, tensor }) => {\n this.reassignParamFromPath(path, tensor.variable())\n })\n }\n\n public freeze() {\n this.getTrainableParams().forEach(({ path, tensor: variable }) => {\n const tensor = tf.tensor(variable.dataSync())\n variable.dispose()\n this.reassignParamFromPath(path, tensor)\n })\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.getParamList().forEach(param => {\n if (throwOnRedispose && param.tensor.isDisposed) {\n throw new Error(`param tensor has already been disposed for path ${param.path}`)\n }\n param.tensor.dispose()\n })\n this._params = undefined\n }\n\n public serializeParams(): Float32Array {\n return new Float32Array(\n this.getParamList()\n .map(({ tensor }) => Array.from(tensor.dataSync()) as number[])\n .reduce((flat, arr) => flat.concat(arr))\n )\n }\n\n public async load(weightsOrUrl: Float32Array | string | undefined): Promise {\n if (weightsOrUrl instanceof Float32Array) {\n this.extractWeights(weightsOrUrl)\n return\n }\n\n await this.loadFromUri(weightsOrUrl)\n }\n\n public async loadFromUri(uri: string | undefined) {\n if (uri && typeof uri !== 'string') {\n throw new Error(`${this._name}.loadFromUri - expected model uri`)\n }\n\n const weightMap = await loadWeightMap(uri, this.getDefaultModelName())\n this.loadFromWeightMap(weightMap)\n }\n\n public async loadFromDisk(filePath: string | undefined) {\n if (filePath && typeof filePath !== 'string') {\n throw new Error(`${this._name}.loadFromDisk - expected model file path`)\n }\n\n const { readFile } = env.getEnv()\n\n const { manifestUri, modelBaseUri } = getModelUris(filePath, this.getDefaultModelName())\n\n const fetchWeightsFromDisk = (filePaths: string[]) => Promise.all(\n filePaths.map(filePath => readFile(filePath).then(buf => buf.buffer))\n )\n const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)\n const manifest = JSON.parse((await readFile(manifestUri)).toString())\n const weightMap = await loadWeights(manifest, modelBaseUri)\n\n this.loadFromWeightMap(weightMap)\n }\n\n public loadFromWeightMap(weightMap: tf.NamedTensorMap) {\n const {\n paramMappings,\n params\n } = this.extractParamsFromWeigthMap(weightMap)\n\n this._paramMappings = paramMappings\n this._params = params\n }\n\n public extractWeights(weights: Float32Array) {\n const {\n paramMappings,\n params\n } = this.extractParams(weights)\n\n this._paramMappings = paramMappings\n this._params = params\n }\n\n private traversePropertyPath(paramPath: string) {\n if (!this.params) {\n throw new Error(`traversePropertyPath - model has no loaded params`)\n }\n\n const result = paramPath.split('/').reduce((res: { nextObj: any, obj?: any, objProp?: string }, objProp) => {\n if (!res.nextObj.hasOwnProperty(objProp)) {\n throw new Error(`traversePropertyPath - object does not have property ${objProp}, for path ${paramPath}`)\n }\n\n return { obj: res.nextObj, objProp, nextObj: res.nextObj[objProp] }\n }, { nextObj: this.params })\n\n const { obj, objProp } = result\n if (!obj || !objProp || !(obj[objProp] instanceof tf.Tensor)) {\n throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`)\n }\n\n return { obj, objProp }\n }\n\n protected abstract getDefaultModelName(): string\n protected abstract extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TNetParams, paramMappings: ParamMapping[] }\n protected abstract extractParams(weights: Float32Array): { params: TNetParams, paramMappings: ParamMapping[] }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { SeparableConvParams } from './types';\n\nexport function depthwiseSeparableConv(\n x: tf.Tensor4D,\n params: SeparableConvParams,\n stride: [number, number]\n): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, 'same')\n out = tf.add(out, params.bias)\n return out\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams, SeparableConvParams } from '../common';\nimport { depthwiseSeparableConv } from '../common/depthwiseSeparableConv';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function denseBlock3(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock3Params,\n isFirstLayer: boolean = false\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, [2, 2], 'same'),\n denseBlockParams.conv0.bias\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, [2, 2])\n ) as tf.Tensor4D\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1])\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1])\n\n return tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D\n })\n}\n\nexport function denseBlock4(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock4Params,\n isFirstLayer: boolean = false,\n isScaleDown: boolean = true\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'),\n denseBlockParams.conv0.bias\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, isScaleDown ? [2, 2] : [1, 1])\n ) as tf.Tensor4D\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1])\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1])\n\n const in4 = tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D\n const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1])\n\n return tf.relu(tf.add(out1, tf.add(out2, tf.add(out3, out4)))) as tf.Tensor4D\n })\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams } from './types';\n\nexport function convLayer(\n x: tf.Tensor4D,\n params: ConvParams,\n padding: 'valid' | 'same' = 'same',\n withRelu: boolean = false\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out = tf.add(\n tf.conv2d(x, params.filters, [1, 1], padding),\n params.bias\n ) as tf.Tensor4D\n\n return withRelu ? tf.relu(out) : out\n })\n}", "import { ParamMapping } from './types';\n\nexport function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]) {\n Object.keys(weightMap).forEach(path => {\n if (!paramMappings.some(pm => pm.originalPath === path)) {\n weightMap[path].dispose()\n }\n })\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';\n\nexport function extractConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[]\n) {\n\n return function(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string\n ): ConvParams {\n\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut]\n )\n const bias = tf.tensor1d(extractWeights(channelsOut))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` }\n )\n\n return { filters, bias }\n }\n\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ExtractWeightsFunction, FCParams, ParamMapping } from './types';\n\n\nexport function extractFCParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[]\n) {\n\n return function(\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string\n ): FCParams {\n\n const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut])\n const fc_bias = tf.tensor1d(extractWeights(channelsOut))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/bias` }\n )\n\n return {\n weights: fc_weights,\n bias: fc_bias\n }\n }\n\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nexport type ExtractWeightsFunction = (numWeights: number) => Float32Array\n\nexport type ParamMapping = {\n originalPath?: string\n paramPath: string\n}\n\nexport type ConvParams = {\n filters: tf.Tensor4D\n bias: tf.Tensor1D\n}\n\nexport type FCParams = {\n weights: tf.Tensor2D\n bias: tf.Tensor1D\n}\n\nexport class SeparableConvParams {\n constructor(\n public depthwise_filter: tf.Tensor4D,\n public pointwise_filter: tf.Tensor4D,\n public bias: tf.Tensor1D\n ) {}\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types';\n\nexport function extractSeparableConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[]\n) {\n\n return function(channelsIn: number, channelsOut: number, mappedPrefix: string): SeparableConvParams {\n const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1])\n const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut])\n const bias = tf.tensor1d(extractWeights(channelsOut))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/depthwise_filter` },\n { paramPath: `${mappedPrefix}/pointwise_filter` },\n { paramPath: `${mappedPrefix}/bias` }\n )\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias\n )\n }\n\n}\n\nexport function loadSeparableConvParamsFactory(\n extractWeightEntry: (originalPath: string, paramRank: number) => T\n) {\n\n return function (prefix: string): SeparableConvParams {\n const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4)\n const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4)\n const bias = extractWeightEntry(`${prefix}/bias`, 1)\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias\n )\n }\n\n}\n", "import { isTensor } from '../utils';\nimport { ParamMapping } from './types';\n\nexport function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n return function (originalPath: string, paramRank: number, mappedPath?: string): T {\n const tensor = weightMap[originalPath]\n\n if (!isTensor(tensor, paramRank)) {\n throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor}`)\n }\n\n paramMappings.push(\n { originalPath, paramPath: mappedPath || originalPath }\n )\n\n return tensor\n }\n\n}\n", "export function extractWeightsFactory(weights: Float32Array) {\n let remainingWeights = weights\n\n function extractWeights(numWeights: number): Float32Array {\n const ret = remainingWeights.slice(0, numWeights)\n remainingWeights = remainingWeights.slice(numWeights)\n return ret\n }\n\n function getRemainingWeights(): Float32Array {\n return remainingWeights\n }\n\n return {\n extractWeights,\n getRemainingWeights\n }\n}", "import {\n extractConvParamsFactory,\n extractSeparableConvParamsFactory,\n ExtractWeightsFunction,\n ParamMapping,\n} from '../common';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings)\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings)\n\n function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n\n const conv0 = isFirstLayer\n ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`)\n : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`)\n const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`)\n const conv2 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`)\n\n return { conv0, conv1, conv2 }\n }\n\n function extractDenseBlock4Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n\n const { conv0, conv1, conv2 } = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer)\n const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`)\n\n return { conv0, conv1, conv2, conv3 }\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params\n }\n\n}", "import { extractWeightsFactory, ParamMapping } from '../common';\nimport { extractorsFactory } from './extractorsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\n\nexport function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const {\n extractDenseBlock4Params\n } = extractorsFactory(extractWeights, paramMappings)\n\n const dense0 = extractDenseBlock4Params(3, 32, 'dense0', true)\n const dense1 = extractDenseBlock4Params(32, 64, 'dense1')\n const dense2 = extractDenseBlock4Params(64, 128, 'dense2')\n const dense3 = extractDenseBlock4Params(128, 256, 'dense3')\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n paramMappings,\n params: { dense0, dense1, dense2, dense3 }\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams } from './types';\n\nexport function loadConvParamsFactory(extractWeightEntry: (originalPath: string, paramRank: number) => T) {\n return function(prefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/filters`, 4)\n const bias = extractWeightEntry(`${prefix}/bias`, 1)\n\n return { filters, bias }\n }\n}", "import { extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry)\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry)\n\n function extractDenseBlock3Params(prefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`)\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`)\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`)\n\n return { conv0, conv1, conv2 }\n }\n\n function extractDenseBlock4Params(prefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`)\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`)\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`)\n const conv3 = extractSeparableConvParams(`${prefix}/conv3`)\n\n return { conv0, conv1, conv2, conv3 }\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap\n): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractDenseBlock4Params\n } = loadParamsFactory(weightMap, paramMappings)\n\n const params = {\n dense0: extractDenseBlock4Params('dense0', true),\n dense1: extractDenseBlock4Params('dense1'),\n dense2: extractDenseBlock4Params('dense2'),\n dense3: extractDenseBlock4Params('dense3')\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops';\nimport { denseBlock4 } from './denseBlock';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor } from './types';\n\nexport class FaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n\n constructor() {\n super('FaceFeatureExtractor')\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n\n const { params } = this\n\n if (!params) {\n throw new Error('FaceFeatureExtractor - load model before inference')\n }\n\n return tf.tidy(() => {\n const batchTensor = input.toBatchTensor(112, true)\n const meanRgb = [122.782, 117.001, 104.298]\n const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(255)) as tf.Tensor4D\n\n let out = denseBlock4(normalized, params.dense0, true)\n out = denseBlock4(out, params.dense1)\n out = denseBlock4(out, params.dense2)\n out = denseBlock4(out, params.dense3)\n out = tf.avgPool(out, [7, 7], [2, 2], 'valid')\n\n return out\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMap(weightMap)\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FCParams } from './types';\n\nexport function fullyConnectedLayer(\n x: tf.Tensor2D,\n params: FCParams\n): tf.Tensor2D {\n return tf.tidy(() =>\n tf.add(\n tf.matMul(x, params.weights),\n params.bias\n )\n )\n}", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings)\n\n const fc = extractFCParams(channelsIn, channelsOut, 'fc')\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n paramMappings,\n params: { fc }\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap\n): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2)\n const bias = extractWeightEntry(`${prefix}/bias`, 1)\n return { weights, bias }\n }\n\n const params = {\n fc: extractFcParams('fc')\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nexport function seperateWeightMaps(weightMap: tf.NamedTensorMap) {\n\n const featureExtractorMap: tf.NamedTensorMap = {}\n const classifierMap: tf.NamedTensorMap = {}\n\n Object.keys(weightMap).forEach(key => {\n const map = key.startsWith('fc') ? classifierMap : featureExtractorMap\n map[key] = weightMap[key]\n })\n\n return { featureExtractorMap, classifierMap }\n\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { NetInput } from '../dom';\nimport {\n FaceFeatureExtractorParams,\n IFaceFeatureExtractor,\n TinyFaceFeatureExtractorParams,\n} from '../faceFeatureExtractor/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { NetParams } from './types';\nimport { seperateWeightMaps } from './util';\n\nexport abstract class FaceProcessor<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends NeuralNetwork {\n\n protected _faceFeatureExtractor: IFaceFeatureExtractor\n\n constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor) {\n super(_name)\n this._faceFeatureExtractor = faceFeatureExtractor\n }\n\n public get faceFeatureExtractor(): IFaceFeatureExtractor {\n return this._faceFeatureExtractor\n }\n\n protected abstract getDefaultModelName(): string\n protected abstract getClassifierChannelsIn(): number\n protected abstract getClassifierChannelsOut(): number\n\n public runNet(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n\n const { params } = this\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`)\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input\n return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc)\n })\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose)\n super.dispose(throwOnRedispose)\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights)\n this._params = params\n this._paramMappings = paramMappings\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut())\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap)\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap)\n\n return extractParamsFromWeigthMap(classifierMap)\n }\n\n protected extractParams(weights: Float32Array) {\n\n const cIn = this.getClassifierChannelsIn()\n const cOut = this.getClassifierChannelsOut()\n const classifierWeightSize = (cOut * cIn ) + cOut\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize)\n const classifierWeights = weights.slice(weights.length - classifierWeightSize)\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights)\n return this.extractClassifierParams(classifierWeights)\n }\n}", "export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised']\n\nexport class FaceExpressions {\n public neutral: number\n public happy: number\n public sad: number\n public angry: number\n public fearful: number\n public disgusted: number\n public surprised: number\n\n constructor(probabilities: number[] | Float32Array) {\n if (probabilities.length !== 7) {\n throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`)\n }\n\n FACE_EXPRESSION_LABELS.forEach((expression, idx) => {\n this[expression] = probabilities[idx]\n })\n }\n\n asSortedArray() {\n return FACE_EXPRESSION_LABELS\n .map(expression => ({ expression, probability: this[expression] as number }))\n .sort((e0, e1) => e1.probability - e0.probability)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { FaceExpressions } from './FaceExpressions';\n\nexport class FaceExpressionNet extends FaceProcessor {\n\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceExpressionNet', faceFeatureExtractor)\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n return tf.tidy(() => tf.softmax(this.runNet(input)))\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n public async predictExpressions(input: TNetInput) {\n const netInput = await toNetInput(input)\n const out = await this.forwardInput(netInput)\n const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async t => {\n const data = await t.data()\n t.dispose()\n return data\n }))\n out.dispose()\n\n const predictionsByBatch = probabilitesByBatch\n .map(probabilites => new FaceExpressions(probabilites as Float32Array))\n\n return netInput.isBatchInput\n ? predictionsByBatch\n : predictionsByBatch[0]\n }\n\n protected getDefaultModelName(): string {\n return 'face_expression_model'\n }\n\n protected getClassifierChannelsIn(): number {\n return 256\n }\n\n protected getClassifierChannelsOut(): number {\n return 7\n }\n}", "import { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\n\nexport type WithFaceExpressions = TSource & {\n expressions: FaceExpressions\n}\n\nexport function isWithFaceExpressions(obj: any): obj is WithFaceExpressions<{}> {\n return obj['expressions'] instanceof FaceExpressions\n}\n\nexport function extendWithFaceExpressions<\n TSource\n> (\n sourceObj: TSource,\n expressions: FaceExpressions\n): WithFaceExpressions {\n\n const extension = { expressions }\n return Object.assign({}, sourceObj, extension)\n}", "import { IPoint, Point } from '../classes';\nimport { FaceExpressions } from '../faceExpressionNet';\nimport { isWithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { round } from '../utils';\nimport { DrawTextField } from './DrawTextField';\n\nexport type DrawFaceExpressionsInput = FaceExpressions | WithFaceExpressions<{}>\n\nexport function drawFaceExpressions(\n canvasArg: string | HTMLCanvasElement,\n faceExpressions: DrawFaceExpressionsInput | Array,\n minConfidence = 0.1,\n textFieldAnchor?: IPoint\n) {\n const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions]\n\n faceExpressionsArray.forEach(e => {\n const expr = e instanceof FaceExpressions\n ? e\n : (isWithFaceExpressions(e) ? e.expressions : undefined)\n if (!expr) {\n throw new Error('drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof')\n }\n\n const sorted = expr.asSortedArray()\n const resultsToDisplay = sorted.filter(expr => expr.probability > minConfidence)\n\n const anchor = isWithFaceDetection(e)\n ? e.detection.box.bottomLeft\n : (textFieldAnchor || new Point(0, 0))\n\n const drawTextField = new DrawTextField(\n resultsToDisplay.map(expr => `${expr.expression} (${round(expr.probability)})`),\n anchor\n )\n drawTextField.draw(canvasArg)\n })\n}", "import { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { isWithFaceDetection, WithFaceDetection } from './WithFaceDetection';\n\nexport type WithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68\n> = TSource & {\n landmarks: TFaceLandmarks\n unshiftedLandmarks: TFaceLandmarks\n alignedRect: FaceDetection\n}\n\nexport function isWithFaceLandmarks(obj: any): obj is WithFaceLandmarks, FaceLandmarks> {\n return isWithFaceDetection(obj)\n && obj['landmarks'] instanceof FaceLandmarks\n && obj['unshiftedLandmarks'] instanceof FaceLandmarks\n && obj['alignedRect'] instanceof FaceDetection\n}\n\nexport function extendWithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68\n> (\n sourceObj: TSource,\n unshiftedLandmarks: TFaceLandmarks\n): WithFaceLandmarks {\n\n const { box: shift } = sourceObj.detection\n const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y)\n\n const rect = landmarks.align()\n const { imageDims } = sourceObj.detection\n const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims)\n\n const extension = {\n landmarks,\n unshiftedLandmarks,\n alignedRect\n }\n\n return Object.assign({}, sourceObj, extension)\n}", "import { IPoint } from '../classes';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { drawContour } from './drawContour';\n\nexport interface IDrawFaceLandmarksOptions {\n drawLines?: boolean\n drawPoints?: boolean\n lineWidth?: number\n pointSize?: number\n lineColor?: string\n pointColor?: string\n}\n\nexport class DrawFaceLandmarksOptions {\n public drawLines: boolean\n public drawPoints: boolean\n public lineWidth: number\n public pointSize: number\n public lineColor: string\n public pointColor: string\n\n constructor(options: IDrawFaceLandmarksOptions = {}) {\n const { drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor } = options\n this.drawLines = drawLines\n this.drawPoints = drawPoints\n this.lineWidth = lineWidth || 1\n this.pointSize = pointSize || 2\n this.lineColor = lineColor || 'rgba(0, 255, 255, 1)'\n this.pointColor = pointColor || 'rgba(255, 0, 255, 1)'\n }\n}\n\nexport class DrawFaceLandmarks {\n public faceLandmarks: FaceLandmarks\n public options: DrawFaceLandmarksOptions\n\n constructor(\n faceLandmarks: FaceLandmarks,\n options: IDrawFaceLandmarksOptions = {}\n ) {\n this.faceLandmarks = faceLandmarks\n this.options = new DrawFaceLandmarksOptions(options)\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg)\n\n const { drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor } = this.options\n\n if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) {\n ctx.strokeStyle = lineColor\n ctx.lineWidth = lineWidth\n drawContour(ctx, this.faceLandmarks.getJawOutline())\n drawContour(ctx, this.faceLandmarks.getLeftEyeBrow())\n drawContour(ctx, this.faceLandmarks.getRightEyeBrow())\n drawContour(ctx, this.faceLandmarks.getNose())\n drawContour(ctx, this.faceLandmarks.getLeftEye(), true)\n drawContour(ctx, this.faceLandmarks.getRightEye(), true)\n drawContour(ctx, this.faceLandmarks.getMouth(), true)\n }\n\n if (drawPoints) {\n ctx.strokeStyle = pointColor\n ctx.fillStyle = pointColor\n\n const drawPoint = (pt: IPoint) => {\n ctx.beginPath()\n ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI)\n ctx.fill()\n }\n this.faceLandmarks.positions.forEach(drawPoint)\n }\n }\n}\n\nexport type DrawFaceLandmarksInput = FaceLandmarks | WithFaceLandmarks>\n\nexport function drawFaceLandmarks(\n canvasArg: string | HTMLCanvasElement,\n faceLandmarks: DrawFaceLandmarksInput | Array\n) {\n const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks]\n faceLandmarksArray.forEach(f => {\n const landmarks = f instanceof FaceLandmarks\n ? f\n : (isWithFaceLandmarks(f) ? f.landmarks : undefined)\n if (!landmarks) {\n throw new Error('drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof')\n }\n\n new DrawFaceLandmarks(landmarks).draw(canvasArg)\n })\n}", "export * from './drawContour'\nexport * from './drawDetections'\nexport * from './drawFaceExpressions'\nexport * from './DrawBox'\nexport * from './DrawFaceLandmarks'\nexport * from './DrawTextField'", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, extractWeightsFactory } from '../common';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { range } from '../utils';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings)\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings)\n\n function extractReductionBlockParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ReductionBlockParams {\n\n const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`)\n const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`)\n const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`)\n\n return { separable_conv0, separable_conv1, expansion_conv }\n }\n\n function extractMainBlockParams(channels: number, mappedPrefix: string): MainBlockParams {\n\n const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`)\n const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`)\n const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`)\n\n return { separable_conv0, separable_conv1, separable_conv2 }\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams\n }\n\n}\n\nexport function extractParams(weights: Float32Array, numMainBlocks: number): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams\n } = extractorsFactory(extractWeights, paramMappings)\n\n const entry_flow_conv_in = extractConvParams(3, 32, 3, 'entry_flow/conv_in')\n const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, 'entry_flow/reduction_block_0')\n const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, 'entry_flow/reduction_block_1')\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1\n }\n\n const middle_flow = {}\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`)\n })\n\n const exit_flow_reduction_block = extractReductionBlockParams(128, 256, 'exit_flow/reduction_block')\n const exit_flow_separable_conv = extractSeparableConvParams(256, 512, 'exit_flow/separable_conv')\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv\n }\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n paramMappings,\n params: { entry_flow, middle_flow, exit_flow }\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport {\n disposeUnusedWeightTensors,\n extractWeightEntryFactory,\n loadSeparableConvParamsFactory,\n ParamMapping,\n} from '../common';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { range } from '../utils';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry)\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry)\n\n function extractReductionBlockParams(mappedPrefix: string): ReductionBlockParams {\n\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`)\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`)\n const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`)\n\n return { separable_conv0, separable_conv1, expansion_conv }\n }\n\n function extractMainBlockParams(mappedPrefix: string): MainBlockParams {\n\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`)\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`)\n const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`)\n\n return { separable_conv0, separable_conv1, separable_conv2 }\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams\n }\n}\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n numMainBlocks: number\n): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams\n } = loadParamsFactory(weightMap, paramMappings)\n\n const entry_flow_conv_in = extractConvParams('entry_flow/conv_in')\n const entry_flow_reduction_block_0 = extractReductionBlockParams('entry_flow/reduction_block_0')\n const entry_flow_reduction_block_1 = extractReductionBlockParams('entry_flow/reduction_block_1')\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1\n }\n\n const middle_flow = {}\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`)\n })\n\n const exit_flow_reduction_block = extractReductionBlockParams('exit_flow/reduction_block')\n const exit_flow_separable_conv = extractSeparableConvParams('exit_flow/separable_conv')\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params: { entry_flow, middle_flow, exit_flow }, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams, depthwiseSeparableConv } from '../common';\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops';\nimport { range } from '../utils';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction conv(x: tf.Tensor4D, params: ConvParams, stride: [number, number]): tf.Tensor4D {\n return tf.add(tf.conv2d(x, params.filters, stride, 'same'), params.bias)\n}\n\nfunction reductionBlock(x: tf.Tensor4D, params: ReductionBlockParams, isActivateInput: boolean = true): tf.Tensor4D {\n let out = isActivateInput ? tf.relu(x) : x\n out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1])\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1])\n out = tf.maxPool(out, [3, 3], [2, 2], 'same')\n out = tf.add(out, conv(x, params.expansion_conv, [2, 2]))\n return out\n}\n\nfunction mainBlock(x: tf.Tensor4D, params: MainBlockParams): tf.Tensor4D {\n let out = depthwiseSeparableConv(tf.relu(x), params.separable_conv0, [1, 1])\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1])\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv2, [1, 1])\n out = tf.add(out, x)\n return out\n}\n\nexport class TinyXception extends NeuralNetwork {\n\n private _numMainBlocks: number\n\n constructor(numMainBlocks: number) {\n super('TinyXception')\n this._numMainBlocks = numMainBlocks\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n\n const { params } = this\n\n if (!params) {\n throw new Error('TinyXception - load model before inference')\n }\n\n return tf.tidy(() => {\n const batchTensor = input.toBatchTensor(112, true)\n const meanRgb = [122.782, 117.001, 104.298]\n const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(256)) as tf.Tensor4D\n\n let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]))\n out = reductionBlock(out, params.entry_flow.reduction_block_0, false)\n out = reductionBlock(out, params.entry_flow.reduction_block_1)\n\n range(this._numMainBlocks, 0, 1).forEach((idx) => {\n out = mainBlock(out, params.middle_flow[`main_block_${idx}`])\n })\n\n out = reductionBlock(out, params.exit_flow.reduction_block)\n out = tf.relu(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1]))\n return out\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_xception_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMap(weightMap, this._numMainBlocks)\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights, this._numMainBlocks)\n }\n}", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings)\n\n const age = extractFCParams(512, 1, 'fc/age')\n const gender = extractFCParams(512, 2, 'fc/gender')\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n paramMappings,\n params: { fc: { age, gender } }\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap\n): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2)\n const bias = extractWeightEntry(`${prefix}/bias`, 1)\n return { weights, bias }\n }\n\n const params = {\n fc: {\n age: extractFcParams('fc/age'),\n gender: extractFcParams('fc/gender')\n }\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FCParams } from '../common';\n\nexport type AgeAndGenderPrediction = {\n age: number\n gender: Gender\n genderProbability: number\n}\n\nexport enum Gender {\n FEMALE = 'female',\n MALE = 'male'\n}\n\nexport type NetOutput = { age: tf.Tensor1D, gender: tf.Tensor2D }\n\nexport type NetParams = {\n fc: {\n age: FCParams\n gender: FCParams\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { seperateWeightMaps } from '../faceProcessor/util';\nimport { TinyXception } from '../xception/TinyXception';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { AgeAndGenderPrediction, Gender, NetOutput, NetParams } from './types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { NetInput, TNetInput, toNetInput } from '../dom';\n\nexport class AgeGenderNet extends NeuralNetwork {\n\n private _faceFeatureExtractor: TinyXception\n\n constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) {\n super('AgeGenderNet')\n this._faceFeatureExtractor = faceFeatureExtractor\n }\n\n public get faceFeatureExtractor(): TinyXception {\n return this._faceFeatureExtractor\n }\n\n public runNet(input: NetInput | tf.Tensor4D): NetOutput {\n\n const { params } = this\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`)\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input\n\n const pooled = tf.avgPool(bottleneckFeatures, [7, 7], [2, 2], 'valid').as2D(bottleneckFeatures.shape[0], -1)\n const age = fullyConnectedLayer(pooled, params.fc.age).as1D()\n const gender = fullyConnectedLayer(pooled, params.fc.gender)\n return { age, gender }\n })\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): NetOutput {\n return tf.tidy(() => {\n const { age, gender } = this.runNet(input)\n return { age, gender: tf.softmax(gender) }\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n public async predictAgeAndGender(input: TNetInput): Promise {\n const netInput = await toNetInput(input)\n const out = await this.forwardInput(netInput)\n\n const ages = tf.unstack(out.age)\n const genders = tf.unstack(out.gender)\n const ageAndGenderTensors = ages.map((ageTensor, i) => ({\n ageTensor,\n genderTensor: genders[i]\n }))\n\n const predictionsByBatch = await Promise.all(\n ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {\n const age = (await ageTensor.data())[0]\n const probMale = (await genderTensor.data())[0]\n const isMale = probMale > 0.5\n const gender = isMale ? Gender.MALE : Gender.FEMALE\n const genderProbability = isMale ? probMale : (1 - probMale)\n\n ageTensor.dispose()\n genderTensor.dispose()\n return { age, gender, genderProbability }\n })\n )\n out.age.dispose()\n out.gender.dispose()\n\n return netInput.isBatchInput ? predictionsByBatch as AgeAndGenderPrediction[] : predictionsByBatch[0] as AgeAndGenderPrediction\n }\n\n protected getDefaultModelName(): string {\n return 'age_gender_model'\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose)\n super.dispose(throwOnRedispose)\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights)\n this._params = params\n this._paramMappings = paramMappings\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights)\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap)\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap)\n\n return extractParamsFromWeigthMap(classifierMap)\n }\n\n protected extractParams(weights: Float32Array) {\n\n const classifierWeightSize = (512 * 1 + 1) + (512 * 2 + 2)\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize)\n const classifierWeights = weights.slice(weights.length - classifierWeightSize)\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights)\n return this.extractClassifierParams(classifierWeights)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { IDimensions, Point } from '../classes';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { FaceFeatureExtractorParams, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { isEven } from '../utils';\n\nexport abstract class FaceLandmark68NetBase<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends FaceProcessor {\n\n public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {\n\n const inputDimensions = originalDimensions.map(({ width, height }) => {\n const scale = inputSize / Math.max(height, width)\n return {\n width: width * scale,\n height: height * scale\n }\n })\n\n const batchSize = inputDimensions.length\n\n return tf.tidy(() => {\n const createInterleavedTensor = (fillX: number, fillY: number) =>\n tf.stack([\n tf.fill([68], fillX),\n tf.fill([68], fillY)\n ], 1).as2D(1, 136).as1D()\n\n const getPadding = (batchIdx: number, cond: (w: number, h: number) => boolean): number => {\n const { width, height } = inputDimensions[batchIdx]\n return cond(width, height) ? Math.abs(width - height) / 2 : 0\n }\n const getPaddingX = (batchIdx: number) => getPadding(batchIdx, (w, h) => w < h)\n const getPaddingY = (batchIdx: number) => getPadding(batchIdx, (w, h) => h < w)\n\n const landmarkTensors = output\n .mul(tf.fill([batchSize, 136], inputSize))\n .sub(tf.stack(Array.from(Array(batchSize), (_, batchIdx) =>\n createInterleavedTensor(\n getPaddingX(batchIdx),\n getPaddingY(batchIdx)\n )\n )))\n .div(tf.stack(Array.from(Array(batchSize), (_, batchIdx) =>\n createInterleavedTensor(\n inputDimensions[batchIdx].width,\n inputDimensions[batchIdx].height\n )\n )))\n\n return landmarkTensors as tf.Tensor2D\n })\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n return tf.tidy(() => {\n const out = this.runNet(input)\n return this.postProcess(\n out,\n input.inputSize as number,\n input.inputDimensions.map(([height, width]) => ({ height, width }))\n )\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n public async detectLandmarks(input: TNetInput): Promise {\n const netInput = await toNetInput(input)\n const landmarkTensors = tf.tidy(\n () => tf.unstack(this.forwardInput(netInput))\n )\n\n const landmarksForBatch = await Promise.all(landmarkTensors.map(\n async (landmarkTensor, batchIdx) => {\n const landmarksArray = Array.from(await landmarkTensor.data())\n const xCoords = landmarksArray.filter((_, i) => isEven(i))\n const yCoords = landmarksArray.filter((_, i) => !isEven(i))\n\n return new FaceLandmarks68(\n Array(68).fill(0).map((_, i) => new Point(xCoords[i] as number, yCoords[i] as number)),\n {\n height: netInput.getInputHeight(batchIdx),\n width : netInput.getInputWidth(batchIdx),\n }\n )\n }\n ))\n\n landmarkTensors.forEach(t => t.dispose())\n\n return netInput.isBatchInput ? landmarksForBatch as FaceLandmarks68[] : landmarksForBatch[0] as FaceLandmarks68;\n }\n\n protected getClassifierChannelsOut(): number {\n return 136\n }\n}", "import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68Net extends FaceLandmark68NetBase {\n\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceLandmark68Net', faceFeatureExtractor)\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_model'\n }\n\n protected getClassifierChannelsIn(): number {\n return 256\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeigthMapTiny(\n weightMap: tf.NamedTensorMap\n): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractDenseBlock3Params\n } = loadParamsFactory(weightMap, paramMappings)\n\n const params = {\n dense0: extractDenseBlock3Params('dense0', true),\n dense1: extractDenseBlock3Params('dense1'),\n dense2: extractDenseBlock3Params('dense2')\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import { extractWeightsFactory, ParamMapping } from '../common';\nimport { extractorsFactory } from './extractorsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\n\n\nexport function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const {\n extractDenseBlock3Params\n } = extractorsFactory(extractWeights, paramMappings)\n\n const dense0 = extractDenseBlock3Params(3, 32, 'dense0', true)\n const dense1 = extractDenseBlock3Params(32, 64, 'dense1')\n const dense2 = extractDenseBlock3Params(64, 128, 'dense2')\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n paramMappings,\n params: { dense0, dense1, dense2 }\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops';\nimport { denseBlock3 } from './denseBlock';\nimport { extractParamsFromWeigthMapTiny } from './extractParamsFromWeigthMapTiny';\nimport { extractParamsTiny } from './extractParamsTiny';\nimport { IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from './types';\n\nexport class TinyFaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n\n constructor() {\n super('TinyFaceFeatureExtractor')\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n\n const { params } = this\n\n if (!params) {\n throw new Error('TinyFaceFeatureExtractor - load model before inference')\n }\n\n return tf.tidy(() => {\n const batchTensor = input.toBatchTensor(112, true)\n const meanRgb = [122.782, 117.001, 104.298]\n const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(255)) as tf.Tensor4D\n\n let out = denseBlock3(normalized, params.dense0, true)\n out = denseBlock3(out, params.dense1)\n out = denseBlock3(out, params.dense2)\n out = tf.avgPool(out, [14, 14], [2, 2], 'valid')\n\n return out\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_tiny_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMapTiny(weightMap)\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParamsTiny(weights)\n }\n}", "import { TinyFaceFeatureExtractor } from '../faceFeatureExtractor/TinyFaceFeatureExtractor';\nimport { TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68TinyNet extends FaceLandmark68NetBase {\n\n constructor(faceFeatureExtractor: TinyFaceFeatureExtractor = new TinyFaceFeatureExtractor()) {\n super('FaceLandmark68TinyNet', faceFeatureExtractor)\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_tiny_model'\n }\n\n protected getClassifierChannelsIn(): number {\n return 128\n }\n}", "import { FaceLandmark68Net } from './FaceLandmark68Net';\n\nexport * from './FaceLandmark68Net';\nexport * from './FaceLandmark68TinyNet';\n\nexport class FaceLandmarkNet extends FaceLandmark68Net {}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ScaleLayerParams } from './types';\n\nexport function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D {\n return tf.add(tf.mul(x, params.weights), params.biases)\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { scale } from './scaleLayer';\nimport { ConvLayerParams } from './types';\n\n\nfunction convLayer(\n x: tf.Tensor4D,\n params: ConvLayerParams,\n strides: [number, number],\n withRelu: boolean,\n padding: 'valid' | 'same' = 'same'\n): tf.Tensor4D {\n const { filters, bias } = params.conv\n\n let out = tf.conv2d(x, filters, strides, padding)\n out = tf.add(out, bias)\n out = scale(out, params.scale)\n return withRelu ? tf.relu(out) : out\n}\n\nexport function conv(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], true)\n}\n\nexport function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], false)\n}\n\nexport function convDown(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [2, 2], true, 'valid')\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from '../common';\nimport { isFloat } from '../utils';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n\n function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {\n const weights = extractWeights(numFilterValues)\n const depth = weights.length / (numFilters * filterSize * filterSize)\n\n if (isFloat(depth)) {\n throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`)\n }\n\n return tf.tidy(\n () => tf.transpose(\n tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),\n [2, 3, 1, 0]\n )\n )\n }\n\n function extractConvParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string\n ): ConvParams {\n\n const filters = extractFilterValues(numFilterValues, numFilters, filterSize)\n const bias = tf.tensor1d(extractWeights(numFilters))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` }\n )\n\n return { filters, bias }\n }\n\n function extractScaleLayerParams(numWeights: number, mappedPrefix: string): ScaleLayerParams {\n\n const weights = tf.tensor1d(extractWeights(numWeights))\n const biases = tf.tensor1d(extractWeights(numWeights))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/biases` }\n )\n\n return {\n weights,\n biases\n }\n }\n\n function extractConvLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string\n ): ConvLayerParams {\n\n const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`)\n const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`)\n\n return { conv, scale }\n }\n\n function extractResidualLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n isDown: boolean = false\n ): ResidualLayerParams {\n\n const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`)\n const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`)\n\n return { conv1, conv2 }\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams\n }\n\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams\n } = extractorsFactory(extractWeights, paramMappings)\n\n const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down')\n const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1')\n const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2')\n const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3')\n\n const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true)\n const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1')\n const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2')\n const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3')\n\n const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true)\n const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1')\n const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2')\n\n const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true)\n const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1')\n const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2')\n const conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out')\n\n const fc = tf.tidy(\n () => tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0])\n )\n paramMappings.push({ paramPath: `fc` })\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc\n }\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common';\nimport { isTensor2D } from '../utils';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n function extractScaleLayerParams(prefix: string): ScaleLayerParams {\n\n const weights = extractWeightEntry(`${prefix}/scale/weights`, 1)\n const biases = extractWeightEntry(`${prefix}/scale/biases`, 1)\n\n return { weights, biases }\n }\n\n function extractConvLayerParams(prefix: string): ConvLayerParams {\n\n const filters = extractWeightEntry(`${prefix}/conv/filters`, 4)\n const bias = extractWeightEntry(`${prefix}/conv/bias`, 1)\n const scale = extractScaleLayerParams(prefix)\n\n return { conv: { filters, bias }, scale }\n }\n\n function extractResidualLayerParams(prefix: string): ResidualLayerParams {\n return {\n conv1: extractConvLayerParams(`${prefix}/conv1`),\n conv2: extractConvLayerParams(`${prefix}/conv2`)\n }\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams\n }\n\n}\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap\n): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams\n } = extractorsFactory(weightMap, paramMappings)\n\n const conv32_down = extractConvLayerParams('conv32_down')\n const conv32_1 = extractResidualLayerParams('conv32_1')\n const conv32_2 = extractResidualLayerParams('conv32_2')\n const conv32_3 = extractResidualLayerParams('conv32_3')\n\n const conv64_down = extractResidualLayerParams('conv64_down')\n const conv64_1 = extractResidualLayerParams('conv64_1')\n const conv64_2 = extractResidualLayerParams('conv64_2')\n const conv64_3 = extractResidualLayerParams('conv64_3')\n\n const conv128_down = extractResidualLayerParams('conv128_down')\n const conv128_1 = extractResidualLayerParams('conv128_1')\n const conv128_2 = extractResidualLayerParams('conv128_2')\n\n const conv256_down = extractResidualLayerParams('conv256_down')\n const conv256_1 = extractResidualLayerParams('conv256_1')\n const conv256_2 = extractResidualLayerParams('conv256_2')\n const conv256_down_out = extractResidualLayerParams('conv256_down_out')\n\n const fc = weightMap['fc']\n paramMappings.push({ originalPath: 'fc', paramPath: 'fc' })\n\n if (!isTensor2D(fc)) {\n throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`)\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { conv, convDown, convNoRelu } from './convLayer';\nimport { ResidualLayerParams } from './types';\n\nexport function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = conv(x, params.conv1)\n out = convNoRelu(out, params.conv2)\n out = tf.add(out, x)\n out = tf.relu(out)\n return out\n}\n\nexport function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = convDown(x, params.conv1)\n out = convNoRelu(out, params.conv2)\n\n let pooled = tf.avgPool(x, 2, 2, 'valid') as tf.Tensor4D\n const zeros = tf.zeros(pooled.shape)\n const isPad = pooled.shape[3] !== out.shape[3]\n const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]\n\n if (isAdjustShape) {\n const padShapeX = [...out.shape] as [number, number, number, number]\n padShapeX[1] = 1\n const zerosW = tf.zeros(padShapeX)\n out = tf.concat([out, zerosW], 1)\n\n const padShapeY = [...out.shape] as [number, number, number, number]\n padShapeY[2] = 1\n const zerosH = tf.zeros(padShapeY)\n out = tf.concat([out, zerosH], 2)\n }\n\n pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled\n out = tf.add(pooled, out) as tf.Tensor4D\n\n out = tf.relu(out)\n return out\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops';\nimport { convDown } from './convLayer';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { residual, residualDown } from './residualLayer';\nimport { NetParams } from './types';\n\n\nexport class FaceRecognitionNet extends NeuralNetwork {\n\n constructor() {\n super('FaceRecognitionNet')\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n\n const { params } = this\n\n if (!params) {\n throw new Error('FaceRecognitionNet - load model before inference')\n }\n\n return tf.tidy(() => {\n // const batchTensor = input.toBatchTensor(150, true).toFloat()\n const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');\n\n const meanRgb = [122.782, 117.001, 104.298]\n const normalized = normalize(batchTensor, meanRgb).div(tf.scalar(256)) as tf.Tensor4D\n\n let out = convDown(normalized, params.conv32_down)\n out = tf.maxPool(out, 3, 2, 'valid')\n\n out = residual(out, params.conv32_1)\n out = residual(out, params.conv32_2)\n out = residual(out, params.conv32_3)\n\n out = residualDown(out, params.conv64_down)\n out = residual(out, params.conv64_1)\n out = residual(out, params.conv64_2)\n out = residual(out, params.conv64_3)\n\n out = residualDown(out, params.conv128_down)\n out = residual(out, params.conv128_1)\n out = residual(out, params.conv128_2)\n\n out = residualDown(out, params.conv256_down)\n out = residual(out, params.conv256_1)\n out = residual(out, params.conv256_2)\n out = residualDown(out, params.conv256_down_out)\n\n const globalAvg = out.mean([1, 2]) as tf.Tensor2D\n const fullyConnected = tf.matMul(globalAvg, params.fc)\n\n return fullyConnected\n })\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input))\n }\n\n public async computeFaceDescriptor(input: TNetInput): Promise {\n const netInput = await toNetInput(input)\n\n const faceDescriptorTensors = tf.tidy(\n () => tf.unstack(this.forwardInput(netInput))\n )\n\n const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map(\n t => t.data()\n )) as Float32Array[]\n\n faceDescriptorTensors.forEach(t => t.dispose())\n\n return netInput.isBatchInput\n ? faceDescriptorsForBatch\n : faceDescriptorsForBatch[0]\n }\n\n protected getDefaultModelName(): string {\n return 'face_recognition_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMap(weightMap)\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights)\n }\n}", "import { FaceRecognitionNet } from './FaceRecognitionNet';\n\nexport * from './FaceRecognitionNet';\n\nexport function createFaceRecognitionNet(weights: Float32Array) {\n const net = new FaceRecognitionNet()\n net.extractWeights(weights)\n return net\n}", "export type WithFaceDescriptor = TSource & {\n descriptor: Float32Array\n}\n\nexport function extendWithFaceDescriptor<\n TSource\n> (\n sourceObj: TSource,\n descriptor: Float32Array\n): WithFaceDescriptor {\n\n const extension = { descriptor }\n return Object.assign({}, sourceObj, extension)\n}\n\n", "export type WithAge = TSource & {\n age: number\n}\n\nexport function isWithAge(obj: any): obj is WithAge<{}> {\n return typeof obj['age'] === 'number'\n}\n\nexport function extendWithAge<\n TSource\n> (\n sourceObj: TSource,\n age: number\n): WithAge {\n\n const extension = { age }\n return Object.assign({}, sourceObj, extension)\n}", "import { Gender } from '../ageGenderNet/types';\nimport { isValidProbablitiy } from '../utils';\n\nexport type WithGender = TSource & {\n gender: Gender\n genderProbability: number\n}\n\nexport function isWithGender(obj: any): obj is WithGender<{}> {\n return (obj['gender'] === Gender.MALE || obj['gender'] === Gender.FEMALE)\n && isValidProbablitiy(obj['genderProbability'])\n}\n\nexport function extendWithGender<\n TSource\n> (\n sourceObj: TSource,\n gender: Gender,\n genderProbability: number\n): WithGender {\n\n const extension = { gender, genderProbability }\n return Object.assign({}, sourceObj, extension)\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory } from '../common';\nimport { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n\n function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {\n\n const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1])\n const batch_norm_scale = tf.tensor1d(extractWeights(numChannels))\n const batch_norm_offset = tf.tensor1d(extractWeights(numChannels))\n const batch_norm_mean = tf.tensor1d(extractWeights(numChannels))\n const batch_norm_variance = tf.tensor1d(extractWeights(numChannels))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/batch_norm_scale` },\n { paramPath: `${mappedPrefix}/batch_norm_offset` },\n { paramPath: `${mappedPrefix}/batch_norm_mean` },\n { paramPath: `${mappedPrefix}/batch_norm_variance` }\n )\n\n return {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance\n }\n }\n\n function extractConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n isPointwiseConv?: boolean\n ): ConvParams {\n\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut]\n )\n const bias = tf.tensor1d(extractWeights(channelsOut))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` }\n )\n\n return { filters, bias }\n }\n\n function extractPointwiseConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string\n ): PointwiseConvParams {\n\n const {\n filters,\n bias\n } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true)\n\n return {\n filters,\n batch_norm_offset: bias\n }\n }\n\n function extractConvPairParams(\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string\n ): MobileNetV1.ConvPairParams {\n\n const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`)\n const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`)\n\n return { depthwise_conv, pointwise_conv }\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n\n const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0')\n\n const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1')\n const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2')\n const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3')\n const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4')\n const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5')\n const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6')\n const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7')\n const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8')\n const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9')\n const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10')\n const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11')\n const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12')\n const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13')\n\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n conv_8,\n conv_9,\n conv_10,\n conv_11,\n conv_12,\n conv_13\n }\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0')\n const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1')\n const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2')\n const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3')\n const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4')\n const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5')\n const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6')\n const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7')\n\n const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor')\n const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor')\n const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor')\n const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor')\n const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor')\n const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor')\n const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor')\n const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor')\n const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor')\n const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor')\n const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor')\n const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor')\n\n const box_predictor_0 = {\n box_encoding_predictor: box_encoding_0_predictor,\n class_predictor: class_predictor_0\n }\n const box_predictor_1 = {\n box_encoding_predictor: box_encoding_1_predictor,\n class_predictor: class_predictor_1\n }\n const box_predictor_2 = {\n box_encoding_predictor: box_encoding_2_predictor,\n class_predictor: class_predictor_2\n }\n const box_predictor_3 = {\n box_encoding_predictor: box_encoding_3_predictor,\n class_predictor: class_predictor_3\n }\n const box_predictor_4 = {\n box_encoding_predictor: box_encoding_4_predictor,\n class_predictor: class_predictor_4\n }\n const box_predictor_5 = {\n box_encoding_predictor: box_encoding_5_predictor,\n class_predictor: class_predictor_5\n }\n\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n box_predictor_0,\n box_predictor_1,\n box_predictor_2,\n box_predictor_3,\n box_predictor_4,\n box_predictor_5\n }\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams\n }\n\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams\n } = extractorsFactory(extractWeights, paramMappings)\n\n const mobilenetv1 = extractMobilenetV1Params()\n const prediction_layer = extractPredictionLayerParams()\n const extra_dim = tf.tensor3d(\n extractWeights(5118 * 4),\n [1, 5118, 4]\n )\n const output_layer = {\n extra_dim\n }\n\n paramMappings.push({ paramPath: 'output_layer/extra_dim' })\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n return {\n params: {\n mobilenetv1,\n prediction_layer,\n output_layer\n },\n paramMappings\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common';\nimport { isTensor3D } from '../utils';\nimport { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {\n\n const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`)\n const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`)\n\n return { filters, batch_norm_offset }\n }\n\n function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {\n\n const mappedPrefix = `mobilenetv1/conv_${idx}`\n const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`\n const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`\n const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`\n\n const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`)\n const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`)\n const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`)\n const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`)\n const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`)\n\n return {\n depthwise_conv: {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance\n },\n pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv)\n }\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n return {\n conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),\n conv_1: extractConvPairParams(1),\n conv_2: extractConvPairParams(2),\n conv_3: extractConvPairParams(3),\n conv_4: extractConvPairParams(4),\n conv_5: extractConvPairParams(5),\n conv_6: extractConvPairParams(6),\n conv_7: extractConvPairParams(7),\n conv_8: extractConvPairParams(8),\n conv_9: extractConvPairParams(9),\n conv_10: extractConvPairParams(10),\n conv_11: extractConvPairParams(11),\n conv_12: extractConvPairParams(12),\n conv_13: extractConvPairParams(13)\n }\n }\n\n function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`)\n const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`)\n\n return { filters, bias }\n }\n\n function extractBoxPredictorParams(idx: number): BoxPredictionParams {\n\n const box_encoding_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,\n `prediction_layer/box_predictor_${idx}/box_encoding_predictor`\n )\n const class_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/ClassPredictor`,\n `prediction_layer/box_predictor_${idx}/class_predictor`\n )\n\n return { box_encoding_predictor, class_predictor }\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n return {\n conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),\n conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),\n conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),\n conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),\n conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),\n conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),\n conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),\n conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),\n box_predictor_0: extractBoxPredictorParams(0),\n box_predictor_1: extractBoxPredictorParams(1),\n box_predictor_2: extractBoxPredictorParams(2),\n box_predictor_3: extractBoxPredictorParams(3),\n box_predictor_4: extractBoxPredictorParams(4),\n box_predictor_5: extractBoxPredictorParams(5)\n }\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams\n }\n}\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap\n): { params: NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams\n } = extractorsFactory(weightMap, paramMappings)\n\n const extra_dim = weightMap['Output/extra_dim']\n paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' })\n\n if (!isTensor3D(extra_dim)) {\n throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`)\n }\n\n const params = {\n mobilenetv1: extractMobilenetV1Params(),\n prediction_layer: extractPredictionLayerParams(),\n output_layer: {\n extra_dim\n }\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { PointwiseConvParams } from './types';\n\nexport function pointwiseConvLayer(\n x: tf.Tensor4D,\n params: PointwiseConvParams,\n strides: [number, number]\n) {\n return tf.tidy(() => {\n\n let out = tf.conv2d(x, params.filters, strides, 'same')\n out = tf.add(out, params.batch_norm_offset)\n return tf.clipByValue(out, 0, 6)\n\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { MobileNetV1 } from './types';\n\nconst epsilon = 0.0010000000474974513\n\nfunction depthwiseConvLayer(\n x: tf.Tensor4D,\n params: MobileNetV1.DepthwiseConvParams,\n strides: [number, number]\n) {\n return tf.tidy(() => {\n\n let out = tf.depthwiseConv2d(x, params.filters, strides, 'same')\n out = tf.batchNorm(\n out,\n params.batch_norm_mean,\n params.batch_norm_variance,\n params.batch_norm_offset,\n params.batch_norm_scale,\n epsilon\n )\n return tf.clipByValue(out, 0, 6)\n\n })\n}\n\nfunction getStridesForLayerIdx(layerIdx: number): [number, number] {\n return [2, 4, 6, 12].some(idx => idx === layerIdx) ? [2, 2] : [1, 1]\n}\n\nexport function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {\n return tf.tidy(() => {\n\n let conv11;\n let out = pointwiseConvLayer(x, params.conv_0, [2, 2])\n\n const convPairParams = [\n params.conv_1,\n params.conv_2,\n params.conv_3,\n params.conv_4,\n params.conv_5,\n params.conv_6,\n params.conv_7,\n params.conv_8,\n params.conv_9,\n params.conv_10,\n params.conv_11,\n params.conv_12,\n params.conv_13\n ]\n\n convPairParams.forEach((param, i) => {\n const layerIdx = i + 1\n const depthwiseConvStrides = getStridesForLayerIdx(layerIdx)\n out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides)\n out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1])\n if (layerIdx === 11) {\n conv11 = out\n }\n })\n\n if (conv11 === null) {\n throw new Error('mobileNetV1 - output of conv layer 11 is null')\n }\n\n return {\n out,\n conv11: conv11 as any\n }\n\n })\n}", "import * as tf from '@tensorflow/tfjs'\n\nexport function nonMaxSuppression(\n boxes: tf.Tensor2D,\n scores: number[],\n maxOutputSize: number,\n iouThreshold: number,\n scoreThreshold: number\n): number[] {\n\n const numBoxes = boxes.shape[0]\n const outputSize = Math.min(\n maxOutputSize,\n numBoxes\n )\n\n const candidates = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .filter(c => c.score > scoreThreshold)\n .sort((c1, c2) => c2.score - c1.score)\n\n const suppressFunc = (x: number) => x <= iouThreshold ? 1 : 0\n\n const selected: number[] = []\n\n candidates.forEach(c => {\n if (selected.length >= outputSize) {\n return\n }\n const originalScore = c.score\n\n for (let j = selected.length - 1; j >= 0; --j) {\n const iou = IOU(boxes, c.boxIndex, selected[j])\n if (iou === 0.0) {\n continue\n }\n c.score *= suppressFunc(iou)\n if (c.score <= scoreThreshold) {\n break\n }\n }\n\n if (originalScore === c.score) {\n selected.push(c.boxIndex)\n }\n })\n\n return selected\n}\n\nfunction IOU(boxes: tf.Tensor2D, i: number, j: number) {\n const boxesData = boxes.arraySync()\n const yminI = Math.min(boxesData[i][0], boxesData[i][2])\n const xminI = Math.min(boxesData[i][1], boxesData[i][3])\n const ymaxI = Math.max(boxesData[i][0], boxesData[i][2])\n const xmaxI = Math.max(boxesData[i][1], boxesData[i][3])\n const yminJ = Math.min(boxesData[j][0], boxesData[j][2])\n const xminJ = Math.min(boxesData[j][1], boxesData[j][3])\n const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2])\n const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3])\n const areaI = (ymaxI - yminI) * (xmaxI - xminI)\n const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ)\n if (areaI <= 0 || areaJ <= 0) {\n return 0.0\n }\n const intersectionYmin = Math.max(yminI, yminJ)\n const intersectionXmin = Math.max(xminI, xminJ)\n const intersectionYmax = Math.min(ymaxI, ymaxJ)\n const intersectionXmax = Math.min(xmaxI, xmaxJ)\n const intersectionArea =\n Math.max(intersectionYmax - intersectionYmin, 0.0) *\n Math.max(intersectionXmax - intersectionXmin, 0.0)\n return intersectionArea / (areaI + areaJ - intersectionArea)\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { OutputLayerParams } from './types';\n\n\nfunction getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) {\n const vec = tf.unstack(tf.transpose(x, [1, 0]))\n\n const sizes = [\n tf.sub(vec[2], vec[0]),\n tf.sub(vec[3], vec[1])\n ]\n\n const centers = [\n tf.add(vec[0], tf.div(sizes[0], tf.scalar(2))),\n tf.add(vec[1], tf.div(sizes[1], tf.scalar(2)))\n ]\n\n return {\n sizes,\n centers\n }\n}\n\nfunction decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) {\n const {\n sizes,\n centers\n } = getCenterCoordinatesAndSizesLayer(x0)\n\n const vec = tf.unstack(tf.transpose(x1, [1, 0]))\n\n const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], tf.scalar(5))), sizes[0]), tf.scalar(2))\n const add0_out = tf.add(tf.mul(tf.div(vec[0], tf.scalar(10)), sizes[0]), centers[0])\n\n const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], tf.scalar(5))), sizes[1]), tf.scalar(2))\n const add1_out = tf.add(tf.mul(tf.div(vec[1], tf.scalar(10)), sizes[1]), centers[1])\n\n return tf.transpose(\n tf.stack([\n tf.sub(add0_out, div0_out),\n tf.sub(add1_out, div1_out),\n tf.add(add0_out, div0_out),\n tf.add(add1_out, div1_out)\n ]),\n [1, 0]\n )\n}\n\nexport function outputLayer(\n boxPredictions: tf.Tensor4D,\n classPredictions: tf.Tensor4D,\n params: OutputLayerParams\n) {\n return tf.tidy(() => {\n\n const batchSize = boxPredictions.shape[0]\n\n let boxes = decodeBoxesLayer(\n tf.reshape(tf.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]) as tf.Tensor2D,\n tf.reshape(boxPredictions, [-1, 4]) as tf.Tensor2D\n )\n boxes = tf.reshape(\n boxes,\n [batchSize, (boxes.shape[0] / batchSize), 4]\n )\n\n const scoresAndClasses = tf.sigmoid(tf.slice(classPredictions, [0, 0, 1], [-1, -1, -1]))\n let scores = tf.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]) as tf.Tensor\n\n scores = tf.reshape(\n scores,\n [batchSize, scores.shape[1] as number]\n )\n\n const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[]\n const scoresByBatch = tf.unstack(scores) as tf.Tensor1D[]\n\n return {\n boxes: boxesByBatch,\n scores: scoresByBatch\n }\n\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { convLayer } from '../common';\nimport { BoxPredictionParams } from './types';\n\n\nexport function boxPredictionLayer(\n x: tf.Tensor4D,\n params: BoxPredictionParams\n) {\n return tf.tidy(() => {\n\n const batchSize = x.shape[0]\n\n const boxPredictionEncoding = tf.reshape(\n convLayer(x, params.box_encoding_predictor),\n [batchSize, -1, 1, 4]\n )\n const classPrediction = tf.reshape(\n convLayer(x, params.class_predictor),\n [batchSize, -1, 3]\n )\n\n return {\n boxPredictionEncoding,\n classPrediction\n }\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { boxPredictionLayer } from './boxPredictionLayer';\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { PredictionLayerParams } from './types';\n\nexport function predictionLayer(\n x: tf.Tensor4D,\n conv11: tf.Tensor4D,\n params: PredictionLayerParams\n) {\n return tf.tidy(() => {\n\n const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1])\n const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2])\n const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1])\n const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2])\n const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1])\n const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2])\n const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1])\n const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2])\n\n const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0)\n const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1)\n const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2)\n const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3)\n const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4)\n const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5)\n\n const boxPredictions = tf.concat([\n boxPrediction0.boxPredictionEncoding,\n boxPrediction1.boxPredictionEncoding,\n boxPrediction2.boxPredictionEncoding,\n boxPrediction3.boxPredictionEncoding,\n boxPrediction4.boxPredictionEncoding,\n boxPrediction5.boxPredictionEncoding\n ], 1) as tf.Tensor4D\n\n const classPredictions = tf.concat([\n boxPrediction0.classPrediction,\n boxPrediction1.classPrediction,\n boxPrediction2.classPrediction,\n boxPrediction3.classPrediction,\n boxPrediction4.classPrediction,\n boxPrediction5.classPrediction\n ], 1) as tf.Tensor4D\n\n return {\n boxPredictions,\n classPredictions\n }\n })\n}", "export interface ISsdMobilenetv1Options {\n minConfidence?: number\n maxResults?: number\n}\n\nexport class SsdMobilenetv1Options {\n protected _name: string = 'SsdMobilenetv1Options'\n\n private _minConfidence: number\n private _maxResults: number\n\n constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) {\n this._minConfidence = minConfidence || 0.5\n this._maxResults = maxResults || 100\n\n if (typeof this._minConfidence !== 'number' || this._minConfidence <= 0 || this._minConfidence >= 1) {\n throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`)\n }\n\n if (typeof this._maxResults !== 'number') {\n throw new Error(`${this._name} - expected maxResults to be a number`)\n }\n }\n\n get minConfidence(): number { return this._minConfidence }\n get maxResults(): number { return this._maxResults }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { Rect } from '../classes';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { NetInput, TNetInput, toNetInput } from '../dom';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { mobileNetV1 } from './mobileNetV1';\nimport { nonMaxSuppression } from './nonMaxSuppression';\nimport { outputLayer } from './outputLayer';\nimport { predictionLayer } from './predictionLayer';\nimport { ISsdMobilenetv1Options, SsdMobilenetv1Options } from './SsdMobilenetv1Options';\nimport { NetParams } from './types';\n\n\nexport class SsdMobilenetv1 extends NeuralNetwork {\n\n constructor() {\n super('SsdMobilenetv1')\n }\n\n public forwardInput(input: NetInput) {\n\n const { params } = this\n\n if (!params) {\n throw new Error('SsdMobilenetv1 - load model before inference')\n }\n\n return tf.tidy(() => {\n // const batchTensor = input.toBatchTensor(512, false).toFloat()\n const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');\n\n const x = tf.sub(tf.mul(batchTensor, tf.scalar(0.007843137718737125)), tf.scalar(1)) as tf.Tensor4D\n const features = mobileNetV1(x, params.mobilenetv1)\n\n const {\n boxPredictions,\n classPredictions\n } = predictionLayer(features.out, features.conv11, params.prediction_layer)\n\n return outputLayer(boxPredictions, classPredictions, params.output_layer)\n })\n }\n\n public async forward(input: TNetInput) {\n return this.forwardInput(await toNetInput(input))\n }\n\n public async locateFaces(\n input: TNetInput,\n options: ISsdMobilenetv1Options = {}\n ): Promise {\n\n const { maxResults, minConfidence } = new SsdMobilenetv1Options(options)\n\n const netInput = await toNetInput(input)\n\n const {\n boxes: _boxes,\n scores: _scores\n } = this.forwardInput(netInput)\n\n\n // TODO batches\n const boxes = _boxes[0]\n const scores = _scores[0]\n for (let i = 1; i < _boxes.length; i++) {\n _boxes[i].dispose()\n _scores[i].dispose()\n }\n\n // TODO find a better way to filter by minConfidence\n const scoresData = Array.from(await scores.data())\n\n const iouThreshold = 0.5\n const indices = nonMaxSuppression(\n boxes,\n scoresData as number[],\n maxResults,\n iouThreshold,\n minConfidence\n )\n\n const reshapedDims = netInput.getReshapedInputDimensions(0)\n const inputSize = netInput.inputSize as number\n const padX = inputSize / reshapedDims.width\n const padY = inputSize / reshapedDims.height\n\n const boxesData = boxes.arraySync()\n const results = indices\n .map(idx => {\n const [top, bottom] = [\n Math.max(0, boxesData[idx][0]),\n Math.min(1.0, boxesData[idx][2])\n ].map(val => val * padY)\n const [left, right] = [\n Math.max(0, boxesData[idx][1]),\n Math.min(1.0, boxesData[idx][3])\n ].map(val => val * padX)\n return new FaceDetection(\n scoresData[idx] as number,\n new Rect(\n left,\n top,\n right - left,\n bottom - top\n ),\n {\n height: netInput.getInputHeight(0),\n width: netInput.getInputWidth(0)\n }\n )\n })\n\n boxes.dispose()\n scores.dispose()\n\n return results\n }\n\n protected getDefaultModelName(): string {\n return 'ssd_mobilenetv1_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMap(weightMap)\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights)\n }\n}", "import { SsdMobilenetv1 } from './SsdMobilenetv1';\n\nexport * from './SsdMobilenetv1';\nexport * from './SsdMobilenetv1Options';\n\nexport function createSsdMobilenetv1(weights: Float32Array) {\n const net = new SsdMobilenetv1()\n net.extractWeights(weights)\n return net\n}\n\nexport function createFaceDetectionNet(weights: Float32Array) {\n return createSsdMobilenetv1(weights)\n}\n\n// alias for backward compatibily\nexport class FaceDetectionNet extends SsdMobilenetv1 {}", "import { Point } from '../classes';\n\nexport const IOU_THRESHOLD = 0.4\n\nexport const BOX_ANCHORS = [\n new Point(0.738768, 0.874946),\n new Point(2.42204, 2.65704),\n new Point(4.30971, 7.04493),\n new Point(10.246, 4.59428),\n new Point(12.6868, 11.8741)\n]\n\nexport const BOX_ANCHORS_SEPARABLE = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308)\n]\n\nexport const MEAN_RGB_SEPARABLE: [number, number, number] = [117.001, 114.697, 97.404]\n\nexport const DEFAULT_MODEL_NAME = 'tiny_yolov2_model'\nexport const DEFAULT_MODEL_NAME_SEPARABLE_CONV = 'tiny_yolov2_separable_conv_model'", "import { Point } from '../classes/Point';\n\nexport type TinyYolov2Config = {\n withSeparableConvs: boolean\n iouThreshold: number\n anchors: Point[]\n classes: string[]\n meanRgb?: [number, number, number]\n withClassScores?: boolean,\n filterSizes?: number[]\n isFirstLayerConv2d?: boolean\n}\n\nconst isNumber = (arg: any) => typeof arg === 'number'\n\nexport function validateConfig(config: any) {\n if (!config) {\n throw new Error(`invalid config: ${config}`)\n }\n\n if (typeof config.withSeparableConvs !== 'boolean') {\n throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`)\n }\n\n if (!isNumber(config.iouThreshold) || config.iouThreshold < 0 || config.iouThreshold > 1.0) {\n throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`)\n }\n\n if (\n !Array.isArray(config.classes)\n || !config.classes.length\n || !config.classes.every((c: any) => typeof c === 'string')\n ) {\n\n throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`)\n }\n\n if (\n !Array.isArray(config.anchors)\n || !config.anchors.length\n || !config.anchors.map((a: any) => a || {}).every((a: any) => isNumber(a.x) && isNumber(a.y))\n ) {\n\n throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config.anchors)}`)\n }\n\n if (config.meanRgb && (\n !Array.isArray(config.meanRgb)\n || config.meanRgb.length !== 3\n || !config.meanRgb.every(isNumber)\n )) {\n\n throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nexport function leaky(x: tf.Tensor4D): tf.Tensor4D {\n return tf.tidy(() => {\n const min = tf.mul(x, tf.scalar(0.10000000149011612))\n return tf.add(tf.relu(tf.sub(x, min)), min)\n //return tf.maximum(x, min)\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { leaky } from './leaky';\nimport { ConvWithBatchNorm } from './types';\n\nexport function convWithBatchNorm(x: tf.Tensor4D, params: ConvWithBatchNorm): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D\n\n out = tf.conv2d(out, params.conv.filters, [1, 1], 'valid')\n out = tf.sub(out, params.bn.sub)\n out = tf.mul(out, params.bn.truediv)\n out = tf.add(out, params.conv.bias)\n\n return leaky(out)\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { SeparableConvParams } from '../common/types';\nimport { leaky } from './leaky';\n\nexport function depthwiseSeparableConv(x: tf.Tensor4D, params: SeparableConvParams): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D\n\n out = tf.separableConv2d(out, params.depthwise_filter, params.pointwise_filter, [1, 1], 'valid')\n out = tf.add(out, params.bias)\n\n return leaky(out)\n })\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { extractConvParamsFactory } from '../common';\nimport { extractSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightsFactory } from '../common/extractWeightsFactory';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings)\n\n function extractBatchNormParams(size: number, mappedPrefix: string): BatchNorm {\n\n const sub = tf.tensor1d(extractWeights(size))\n const truediv = tf.tensor1d(extractWeights(size))\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/sub` },\n { paramPath: `${mappedPrefix}/truediv` }\n )\n\n return { sub, truediv }\n }\n\n function extractConvWithBatchNormParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ConvWithBatchNorm {\n\n const conv = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`)\n const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`)\n\n return { conv, bn }\n }\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings)\n\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams\n }\n\n}\n\nexport function extractParams(\n weights: Float32Array,\n config: TinyYolov2Config,\n boxEncodingSize: number,\n filterSizes: number[]\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n\n const {\n extractWeights,\n getRemainingWeights\n } = extractWeightsFactory(weights)\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams\n } = extractorsFactory(extractWeights, paramMappings)\n\n let params: TinyYolov2NetParams\n\n if (config.withSeparableConvs) {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes\n\n const conv0 = config.isFirstLayerConv2d\n ? extractConvParams(s0, s1, 3, 'conv0')\n : extractSeparableConvParams(s0, s1, 'conv0')\n const conv1 = extractSeparableConvParams(s1, s2, 'conv1')\n const conv2 = extractSeparableConvParams(s2, s3, 'conv2')\n const conv3 = extractSeparableConvParams(s3, s4, 'conv3')\n const conv4 = extractSeparableConvParams(s4, s5, 'conv4')\n const conv5 = extractSeparableConvParams(s5, s6, 'conv5')\n const conv6 = s7 ? extractSeparableConvParams(s6, s7, 'conv6') : undefined\n const conv7 = s8 ? extractSeparableConvParams(s7, s8, 'conv7') : undefined\n const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, 'conv8')\n params = { conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8 }\n } else {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes\n const conv0 = extractConvWithBatchNormParams(s0, s1, 'conv0',)\n const conv1 = extractConvWithBatchNormParams(s1, s2, 'conv1')\n const conv2 = extractConvWithBatchNormParams(s2, s3, 'conv2')\n const conv3 = extractConvWithBatchNormParams(s3, s4, 'conv3')\n const conv4 = extractConvWithBatchNormParams(s4, s5, 'conv4')\n const conv5 = extractConvWithBatchNormParams(s5, s6, 'conv5')\n const conv6 = extractConvWithBatchNormParams(s6, s7, 'conv6')\n const conv7 = extractConvWithBatchNormParams(s7, s8, 'conv7')\n const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, 'conv8')\n params = { conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8 }\n }\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`)\n }\n\n\n return { params, paramMappings }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { ConvParams } from '../common';\nimport { disposeUnusedWeightTensors } from '../common/disposeUnusedWeightTensors';\nimport { loadSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightEntryFactory } from '../common/extractWeightEntryFactory';\nimport { ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)\n\n function extractBatchNormParams(prefix: string): BatchNorm {\n const sub = extractWeightEntry(`${prefix}/sub`, 1)\n const truediv = extractWeightEntry(`${prefix}/truediv`, 1)\n return { sub, truediv }\n }\n\n function extractConvParams(prefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/filters`, 4)\n const bias = extractWeightEntry(`${prefix}/bias`, 1)\n return { filters, bias }\n }\n\n function extractConvWithBatchNormParams(prefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(`${prefix}/conv`)\n const bn = extractBatchNormParams(`${prefix}/bn`)\n return { conv, bn }\n }\n\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry)\n\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams\n }\n\n}\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n config: TinyYolov2Config\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n\n const paramMappings: ParamMapping[] = []\n\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams\n } = extractorsFactory(weightMap, paramMappings)\n\n let params: TinyYolov2NetParams\n\n if (config.withSeparableConvs) {\n const numFilters = (config.filterSizes && config.filterSizes.length || 9)\n params = {\n conv0: config.isFirstLayerConv2d ? extractConvParams('conv0') : extractSeparableConvParams('conv0'),\n conv1: extractSeparableConvParams('conv1'),\n conv2: extractSeparableConvParams('conv2'),\n conv3: extractSeparableConvParams('conv3'),\n conv4: extractSeparableConvParams('conv4'),\n conv5: extractSeparableConvParams('conv5'),\n conv6: numFilters > 7 ? extractSeparableConvParams('conv6') : undefined,\n conv7: numFilters > 8 ? extractSeparableConvParams('conv7') : undefined,\n conv8: extractConvParams('conv8')\n }\n } else {\n params = {\n conv0: extractConvWithBatchNormParams('conv0'),\n conv1: extractConvWithBatchNormParams('conv1'),\n conv2: extractConvWithBatchNormParams('conv2'),\n conv3: extractConvWithBatchNormParams('conv3'),\n conv4: extractConvWithBatchNormParams('conv4'),\n conv5: extractConvWithBatchNormParams('conv5'),\n conv6: extractConvWithBatchNormParams('conv6'),\n conv7: extractConvWithBatchNormParams('conv7'),\n conv8: extractConvParams('conv8')\n }\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings)\n\n return { params, paramMappings }\n}", "export enum TinyYolov2SizeType {\n XS = 224,\n SM = 320,\n MD = 416,\n LG = 608\n}\n\nexport interface ITinyYolov2Options {\n inputSize?: number\n scoreThreshold?: number\n}\n\nexport class TinyYolov2Options {\n protected _name: string = 'TinyYolov2Options'\n\n private _inputSize: number\n private _scoreThreshold: number\n\n constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) {\n this._inputSize = inputSize || 416\n this._scoreThreshold = scoreThreshold || 0.5\n\n if (typeof this._inputSize !== 'number' || this._inputSize % 32 !== 0) {\n throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`)\n }\n\n if (typeof this._scoreThreshold !== 'number' || this._scoreThreshold <= 0 || this._scoreThreshold >= 1) {\n throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)\n }\n }\n\n get inputSize(): number { return this._inputSize }\n get scoreThreshold(): number { return this._scoreThreshold }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { BoundingBox } from '../classes/BoundingBox';\nimport { Dimensions } from '../classes/Dimensions';\nimport { ObjectDetection } from '../classes/ObjectDetection';\nimport { convLayer } from '../common';\nimport { ConvParams, SeparableConvParams } from '../common/types';\nimport { toNetInput } from '../dom';\nimport { NetInput } from '../dom/NetInput';\nimport { TNetInput } from '../dom/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { sigmoid } from '../ops';\nimport { nonMaxSuppression } from '../ops/nonMaxSuppression';\nimport { normalize } from '../ops/normalize';\nimport { TinyYolov2Config, validateConfig } from './config';\nimport { convWithBatchNorm } from './convWithBatchNorm';\nimport { depthwiseSeparableConv } from './depthwiseSeparableConv';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { leaky } from './leaky';\nimport { ITinyYolov2Options, TinyYolov2Options } from './TinyYolov2Options';\nimport { DefaultTinyYolov2NetParams, MobilenetParams, TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2Base extends NeuralNetwork {\n\n public static DEFAULT_FILTER_SIZES = [\n 3, 16, 32, 64, 128, 256, 512, 1024, 1024\n ]\n\n private _config: TinyYolov2Config\n\n constructor(config: TinyYolov2Config) {\n super('TinyYolov2')\n validateConfig(config)\n this._config = config\n }\n\n public get config(): TinyYolov2Config {\n return this._config\n }\n\n public get withClassScores(): boolean {\n return this.config.withClassScores || this.config.classes.length > 1\n }\n\n public get boxEncodingSize(): number {\n return 5 + (this.withClassScores ? this.config.classes.length : 0)\n }\n\n public runTinyYolov2(x: tf.Tensor4D, params: DefaultTinyYolov2NetParams): tf.Tensor4D {\n\n let out = convWithBatchNorm(x, params.conv0)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = convWithBatchNorm(out, params.conv1)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = convWithBatchNorm(out, params.conv2)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = convWithBatchNorm(out, params.conv3)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = convWithBatchNorm(out, params.conv4)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = convWithBatchNorm(out, params.conv5)\n out = tf.maxPool(out, [2, 2], [1, 1], 'same')\n out = convWithBatchNorm(out, params.conv6)\n out = convWithBatchNorm(out, params.conv7)\n\n return convLayer(out, params.conv8, 'valid', false)\n }\n\n public runMobilenet(x: tf.Tensor4D, params: MobilenetParams): tf.Tensor4D {\n\n let out = this.config.isFirstLayerConv2d\n ? leaky(convLayer(x, params.conv0 as ConvParams, 'valid', false))\n : depthwiseSeparableConv(x, params.conv0 as SeparableConvParams)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = depthwiseSeparableConv(out, params.conv1)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = depthwiseSeparableConv(out, params.conv2)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = depthwiseSeparableConv(out, params.conv3)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = depthwiseSeparableConv(out, params.conv4)\n out = tf.maxPool(out, [2, 2], [2, 2], 'same')\n out = depthwiseSeparableConv(out, params.conv5)\n out = tf.maxPool(out, [2, 2], [1, 1], 'same')\n out = params.conv6 ? depthwiseSeparableConv(out, params.conv6) : out\n out = params.conv7 ? depthwiseSeparableConv(out, params.conv7) : out\n\n return convLayer(out, params.conv8, 'valid', false)\n }\n\n public forwardInput(input: NetInput, inputSize: number): tf.Tensor4D {\n\n const { params } = this\n\n if (!params) {\n throw new Error('TinyYolov2 - load model before inference')\n }\n\n return tf.tidy(() => {\n\n // let batchTensor = input.toBatchTensor(inputSize, false).toFloat()\n let batchTensor = tf.cast(input.toBatchTensor(inputSize, false), 'float32');\n batchTensor = this.config.meanRgb\n ? normalize(batchTensor, this.config.meanRgb)\n : batchTensor\n batchTensor = batchTensor.div(tf.scalar(256)) as tf.Tensor4D\n\n return this.config.withSeparableConvs\n ? this.runMobilenet(batchTensor, params as MobilenetParams)\n : this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams)\n })\n }\n\n public async forward(input: TNetInput, inputSize: number): Promise {\n return await this.forwardInput(await toNetInput(input), inputSize)\n }\n\n public async detect(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise {\n\n const { inputSize, scoreThreshold } = new TinyYolov2Options(forwardParams)\n\n const netInput = await toNetInput(input)\n const out = await this.forwardInput(netInput, inputSize)\n const out0 = tf.tidy(() => tf.unstack(out)[0].expandDims()) as tf.Tensor4D\n\n const inputDimensions = {\n width: netInput.getInputWidth(0),\n height: netInput.getInputHeight(0)\n }\n\n const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold)\n out.dispose()\n out0.dispose()\n\n const boxes = results.map(res => res.box)\n const scores = results.map(res => res.score)\n const classScores = results.map(res => res.classScore)\n const classNames = results.map(res => this.config.classes[res.label])\n\n const indices = nonMaxSuppression(\n boxes.map(box => box.rescale(inputSize)),\n scores,\n this.config.iouThreshold,\n true\n )\n\n const detections = indices.map(idx =>\n new ObjectDetection(\n scores[idx],\n classScores[idx],\n classNames[idx],\n boxes[idx],\n inputDimensions\n )\n )\n\n return detections\n }\n\n protected getDefaultModelName(): string {\n return ''\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeigthMap(weightMap, this.config)\n }\n\n protected extractParams(weights: Float32Array) {\n const filterSizes = this.config.filterSizes || TinyYolov2Base.DEFAULT_FILTER_SIZES\n\n const numFilters = filterSizes ? filterSizes.length : undefined\n if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) {\n throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`)\n }\n return extractParams(weights, this.config, this.boxEncodingSize, filterSizes)\n }\n\n protected async extractBoxes(\n outputTensor: tf.Tensor4D,\n inputBlobDimensions: Dimensions,\n scoreThreshold?: number\n ) {\n\n const { width, height } = inputBlobDimensions\n const inputSize = Math.max(width, height)\n const correctionFactorX = inputSize / width\n const correctionFactorY = inputSize / height\n\n const numCells = outputTensor.shape[1]\n const numBoxes = this.config.anchors.length\n\n const [boxesTensor, scoresTensor, classScoresTensor] = tf.tidy(() => {\n const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize])\n\n const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4])\n const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1])\n const classScores = this.withClassScores\n ? tf.softmax(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3)\n : tf.scalar(0)\n return [boxes, scores, classScores]\n })\n\n const results = [] as any;\n\n const scoresData = await scoresTensor.array()\n const boxesData = await boxesTensor.array()\n for (let row = 0; row < numCells; row ++) {\n for (let col = 0; col < numCells; col ++) {\n for (let anchor = 0; anchor < numBoxes; anchor ++) {\n\n const score = sigmoid(scoresData[row][col][anchor][0]);\n if (!scoreThreshold || score > scoreThreshold) {\n const ctX = ((col + sigmoid(boxesData[row][col][anchor][0])) / numCells) * correctionFactorX\n const ctY = ((row + sigmoid(boxesData[row][col][anchor][1])) / numCells) * correctionFactorY\n const width = ((Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x) / numCells) * correctionFactorX\n const height = ((Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y) / numCells) * correctionFactorY\n\n const x = (ctX - (width / 2))\n const y = (ctY - (height / 2))\n\n const pos = { row, col, anchor }\n const { classScore, label } = this.withClassScores\n ? await this.extractPredictedClass(classScoresTensor as tf.Tensor4D, pos)\n : { classScore: 1, label: 0 }\n\n results.push({\n box: new BoundingBox(x, y, x + width, y + height),\n score: score,\n classScore: score * classScore,\n label,\n ...pos\n })\n }\n }\n }\n }\n\n boxesTensor.dispose()\n scoresTensor.dispose()\n classScoresTensor.dispose()\n\n return results\n }\n\n private async extractPredictedClass(classesTensor: tf.Tensor4D, pos: { row: number, col: number, anchor: number },) {\n const { row, col, anchor } = pos\n const classesData = await classesTensor.array()\n return Array(this.config.classes.length).fill(0)\n .map((_, i) => classesData[row][col][anchor][i])\n .map((classScore, label) => ({\n classScore,\n label\n }))\n .reduce((max, curr) => max.classScore > curr.classScore ? max : curr)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FaceDetection, Point } from '../classes';\nimport { ParamMapping } from '../common/types';\nimport { TNetInput } from '../dom/types';\nimport {\n BOX_ANCHORS,\n BOX_ANCHORS_SEPARABLE,\n DEFAULT_MODEL_NAME,\n DEFAULT_MODEL_NAME_SEPARABLE_CONV,\n IOU_THRESHOLD,\n MEAN_RGB_SEPARABLE,\n} from './const';\nimport { TinyYolov2Base } from './TinyYolov2Base';\nimport { ITinyYolov2Options } from './TinyYolov2Options';\nimport { TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2 extends TinyYolov2Base {\n\n constructor(withSeparableConvs: boolean = true) {\n const config = Object.assign({}, {\n withSeparableConvs,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face']\n },\n withSeparableConvs\n ? {\n anchors: BOX_ANCHORS_SEPARABLE,\n meanRgb: MEAN_RGB_SEPARABLE\n }\n : {\n anchors: BOX_ANCHORS,\n withClassScores: true\n }\n )\n\n super(config)\n }\n\n public get withSeparableConvs(): boolean {\n return this.config.withSeparableConvs\n }\n\n public get anchors(): Point[] {\n return this.config.anchors\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams)\n return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }))\n }\n\n protected getDefaultModelName(): string {\n return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeigthMap(weightMap)\n }\n}", "import { TinyYolov2 } from './TinyYolov2';\n\nexport * from './TinyYolov2Options';\n\nexport * from './config'\nexport * from './types'\n\nexport { TinyYolov2 }\n\nexport function createTinyYolov2(weights: Float32Array, withSeparableConvs: boolean = true) {\n const net = new TinyYolov2(withSeparableConvs)\n net.extractWeights(weights)\n return net\n}", "import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2';\n\nexport interface ITinyFaceDetectorOptions extends ITinyYolov2Options {}\n\nexport class TinyFaceDetectorOptions extends TinyYolov2Options {\n protected _name: string = 'TinyFaceDetectorOptions'\n}", "export class ComposableTask {\n\n public async then(\n onfulfilled: (value: T) => T | PromiseLike\n ): Promise {\n return onfulfilled(await this.run())\n }\n\n public async run(): Promise {\n throw new Error('ComposableTask - run is not implemented')\n }\n}\n", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\n\nexport async function extractAllFacesAndComputeResults, TResult>(\n parentResults: TSource[],\n input: TNetInput,\n computeResults: (faces: Array) => Promise,\n extractedFaces?: Array | null,\n getRectForAlignment: (parentResult: WithFaceLandmarks) => FaceDetection = ({ alignedRect }) => alignedRect\n) {\n const faceBoxes = parentResults.map(parentResult =>\n isWithFaceLandmarks(parentResult)\n ? getRectForAlignment(parentResult)\n : parentResult.detection\n )\n const faces: Array = extractedFaces || (\n input instanceof tf.Tensor\n ? await extractFaceTensors(input, faceBoxes)\n : await extractFaces(input, faceBoxes)\n )\n\n const results = await computeResults(faces)\n\n faces.forEach(f => f instanceof tf.Tensor && f.dispose())\n\n return results\n}\n\nexport async function extractSingleFaceAndComputeResult, TResult>(\n parentResult: TSource,\n input: TNetInput,\n computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise,\n extractedFaces?: Array | null,\n getRectForAlignment?: (parentResult: WithFaceLandmarks) => FaceDetection\n) {\n return extractAllFacesAndComputeResults(\n [parentResult],\n input,\n async faces => computeResult(faces[0]),\n extractedFaces,\n getRectForAlignment\n )\n}", "import { Point } from '../classes'\n\nexport const IOU_THRESHOLD = 0.4\n\nexport const BOX_ANCHORS = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308)\n]\n\nexport const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404]", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FaceDetection, Point } from '../classes';\nimport { ParamMapping } from '../common';\nimport { TNetInput } from '../dom';\nimport { ITinyYolov2Options } from '../tinyYolov2';\nimport { TinyYolov2Base } from '../tinyYolov2/TinyYolov2Base';\nimport { TinyYolov2NetParams } from '../tinyYolov2/types';\nimport { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';\n\nexport class TinyFaceDetector extends TinyYolov2Base {\n\n constructor() {\n const config = {\n withSeparableConvs: true,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n anchors: BOX_ANCHORS,\n meanRgb: MEAN_RGB,\n isFirstLayerConv2d: true,\n filterSizes: [3, 16, 32, 64, 128, 256, 512]\n }\n\n super(config)\n }\n\n public get anchors(): Point[] {\n return this.config.anchors\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams)\n return objectDetections.map(det => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }))\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_face_detector_model'\n }\n\n protected extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeigthMap(weightMap)\n }\n}", "import { AgeGenderNet } from '../ageGenderNet/AgeGenderNet';\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks5 } from '../classes/FaceLandmarks5';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { TNetInput } from '../dom';\nimport { FaceExpressionNet } from '../faceExpressionNet/FaceExpressionNet';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2';\n\nexport const nets = {\n ssdMobilenetv1: new SsdMobilenetv1(),\n tinyFaceDetector: new TinyFaceDetector(),\n tinyYolov2: new TinyYolov2(),\n faceLandmark68Net: new FaceLandmark68Net(),\n faceLandmark68TinyNet: new FaceLandmark68TinyNet(),\n faceRecognitionNet: new FaceRecognitionNet(),\n faceExpressionNet: new FaceExpressionNet(),\n ageGenderNet: new AgeGenderNet()\n}\n\n/**\n * Attempts to detect all faces in an image using SSD Mobilenetv1 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const ssdMobilenetv1 = (input: TNetInput, options: SsdMobilenetv1Options): Promise =>\n nets.ssdMobilenetv1.locateFaces(input, options)\n\n/**\n * Attempts to detect all faces in an image using the Tiny Face Detector.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyFaceDetectorOptions constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOptions): Promise =>\n nets.tinyFaceDetector.locateFaces(input, options)\n\n/**\n * Attempts to detect all faces in an image using the Tiny Yolov2 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyYolov2Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyYolov2 = (input: TNetInput, options: ITinyYolov2Options): Promise =>\n nets.tinyYolov2.locateFaces(input, options)\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarks = (input: TNetInput): Promise =>\n nets.faceLandmark68Net.detectLandmarks(input)\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image\n * using a tinier version of the 68 point face landmark model, which is slightly\n * faster at inference, but also slightly less accurate.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarksTiny = (input: TNetInput): Promise =>\n nets.faceLandmark68TinyNet.detectLandmarks(input)\n\n/**\n * Computes a 128 entry vector (face descriptor / face embeddings) from the face shown in an image,\n * which uniquely represents the features of that persons face. The computed face descriptor can\n * be used to measure the similarity between faces, by computing the euclidean distance of two\n * face descriptors.\n *\n * @param inputs The face image extracted from the aligned bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Face descriptor with 128 entries or array thereof in case of batch input.\n */\nexport const computeFaceDescriptor = (input: TNetInput): Promise =>\n nets.faceRecognitionNet.computeFaceDescriptor(input)\n\n\n/**\n * Recognizes the facial expressions from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Facial expressions with corresponding probabilities or array thereof in case of batch input.\n */\nexport const recognizeFaceExpressions = (input: TNetInput): Promise =>\n nets.faceExpressionNet.predictExpressions(input)\n\n/**\n * Predicts age and gender from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Predictions with age, gender and gender probability or array thereof in case of batch input.\n */\nexport const predictAgeAndGender = (input: TNetInput): Promise =>\n nets.ageGenderNet.predictAgeAndGender(input)\n\nexport const loadSsdMobilenetv1Model = (url: string) => nets.ssdMobilenetv1.load(url)\nexport const loadTinyFaceDetectorModel = (url: string) => nets.tinyFaceDetector.load(url)\nexport const loadTinyYolov2Model = (url: string) => nets.tinyYolov2.load(url)\nexport const loadFaceLandmarkModel = (url: string) => nets.faceLandmark68Net.load(url)\nexport const loadFaceLandmarkTinyModel = (url: string) => nets.faceLandmark68TinyNet.load(url)\nexport const loadFaceRecognitionModel = (url: string) => nets.faceRecognitionNet.load(url)\nexport const loadFaceExpressionModel = (url: string) => nets.faceExpressionNet.load(url)\nexport const loadAgeGenderModel = (url: string) => nets.ageGenderNet.load(url)\n\n// backward compatibility\nexport const loadFaceDetectionModel = loadSsdMobilenetv1Model\nexport const locateFaces = ssdMobilenetv1\nexport const detectLandmarks = detectFaceLandmarks", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { TNetInput } from '../dom';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport {\n PredictAllAgeAndGenderTask,\n PredictAllAgeAndGenderWithFaceAlignmentTask,\n PredictSingleAgeAndGenderTask,\n PredictSingleAgeAndGenderWithFaceAlignmentTask,\n} from './PredictAgeAndGenderTask';\n\nexport class PredictFaceExpressionsTaskBase extends ComposableTask {\n constructor(\n protected parentTask: ComposableTask | Promise,\n protected input: TNetInput,\n protected extractedFaces?: Array\n ) {\n super()\n }\n}\n\nexport class PredictAllFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase[], TSource[]> {\n\n public async run(): Promise[]> {\n\n const parentResults = await this.parentTask\n\n const faceExpressionsByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async faces => await Promise.all(faces.map(\n face => nets.faceExpressionNet.predictExpressions(face) as Promise\n )),\n this.extractedFaces\n )\n\n return parentResults.map(\n (parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i])\n )\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(this, this.input)\n }\n}\n\nexport class PredictSingleFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase | undefined, TSource | undefined> {\n\n public async run(): Promise | undefined> {\n\n const parentResult = await this.parentTask\n if (!parentResult) {\n return\n }\n\n const faceExpressions = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n face => nets.faceExpressionNet.predictExpressions(face) as Promise,\n this.extractedFaces\n )\n\n return extendWithFaceExpressions(parentResult, faceExpressions)\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(this, this.input)\n }\n}\n\nexport class PredictAllFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllFaceExpressionsTask {\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input)\n }\n}\n\nexport class PredictSingleFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleFaceExpressionsTask {\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { TNetInput } from '../dom';\nimport { extendWithAge, WithAge } from '../factories/WithAge';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { extendWithGender, WithGender } from '../factories/WithGender';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport {\n PredictAllFaceExpressionsTask,\n PredictAllFaceExpressionsWithFaceAlignmentTask,\n PredictSingleFaceExpressionsTask,\n PredictSingleFaceExpressionsWithFaceAlignmentTask,\n} from './PredictFaceExpressionsTask';\n\nexport class PredictAgeAndGenderTaskBase extends ComposableTask {\n constructor(\n protected parentTask: ComposableTask | Promise,\n protected input: TNetInput,\n protected extractedFaces?: Array\n ) {\n super()\n }\n}\n\nexport class PredictAllAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase>[], TSource[]> {\n\n public async run(): Promise>[]> {\n\n const parentResults = await this.parentTask\n\n const ageAndGenderByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async faces => await Promise.all(faces.map(\n face => nets.ageGenderNet.predictAgeAndGender(face) as Promise\n )),\n this.extractedFaces\n )\n\n return parentResults.map((parentResult, i) => {\n const { age, gender, genderProbability } = ageAndGenderByFace[i]\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age)\n })\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(this, this.input)\n }\n}\n\nexport class PredictSingleAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase> | undefined, TSource | undefined> {\n\n public async run(): Promise> | undefined> {\n\n const parentResult = await this.parentTask\n if (!parentResult) {\n return\n }\n\n const { age, gender, genderProbability } = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n face => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n this.extractedFaces\n )\n\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age)\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(this, this.input)\n }\n}\n\nexport class PredictAllAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllAgeAndGenderTask {\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input)\n }\n}\n\nexport class PredictSingleAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleAgeAndGenderTask {\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input)\n }\n}", "import { TNetInput } from '../dom';\nimport { extendWithFaceDescriptor, WithFaceDescriptor } from '../factories/WithFaceDescriptor';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport {\n PredictAllAgeAndGenderWithFaceAlignmentTask,\n PredictSingleAgeAndGenderWithFaceAlignmentTask,\n} from './PredictAgeAndGenderTask';\nimport {\n PredictAllFaceExpressionsWithFaceAlignmentTask,\n PredictSingleFaceExpressionsWithFaceAlignmentTask,\n} from './PredictFaceExpressionsTask';\n\nexport class ComputeFaceDescriptorsTaskBase extends ComposableTask {\n constructor(\n protected parentTask: ComposableTask | Promise,\n protected input: TNetInput\n ) {\n super()\n }\n}\n\nexport class ComputeAllFaceDescriptorsTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase[], TSource[]> {\n\n public async run(): Promise[]> {\n\n const parentResults = await this.parentTask\n\n const descriptors = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n faces => Promise.all(faces.map(face =>\n nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise\n )),\n null,\n parentResult => parentResult.landmarks.align(null, { useDlibAlignment: true })\n )\n\n return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor))\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n}\n\nexport class ComputeSingleFaceDescriptorTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase | undefined, TSource | undefined> {\n\n public async run(): Promise | undefined> {\n\n const parentResult = await this.parentTask\n if (!parentResult) {\n return\n }\n const descriptor = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n face => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise,\n null,\n parentResult => parentResult.landmarks.align(null, { useDlibAlignment: true })\n )\n\n return extendWithFaceDescriptor(parentResult, descriptor)\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n}", "import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { nets } from './nets';\nimport {\n PredictAllAgeAndGenderWithFaceAlignmentTask,\n PredictSingleAgeAndGenderWithFaceAlignmentTask,\n} from './PredictAgeAndGenderTask';\nimport {\n PredictAllFaceExpressionsWithFaceAlignmentTask,\n PredictSingleFaceExpressionsWithFaceAlignmentTask,\n} from './PredictFaceExpressionsTask';\n\nexport class DetectFaceLandmarksTaskBase extends ComposableTask {\n constructor(\n protected parentTask: ComposableTask | Promise,\n protected input: TNetInput,\n protected useTinyLandmarkNet: boolean\n ) {\n super()\n }\n\n protected get landmarkNet(): FaceLandmark68Net | FaceLandmark68TinyNet {\n return this.useTinyLandmarkNet\n ? nets.faceLandmark68TinyNet\n : nets.faceLandmark68Net\n }\n}\n\nexport class DetectAllFaceLandmarksTask<\n TSource extends WithFaceDetection<{}>\n> extends DetectFaceLandmarksTaskBase[], TSource[]> {\n\n public async run(): Promise[]> {\n\n const parentResults = await this.parentTask\n const detections = parentResults.map(res => res.detection)\n\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, detections)\n : await extractFaces(this.input, detections)\n\n const faceLandmarksByFace = await Promise.all(faces.map(\n face => this.landmarkNet.detectLandmarks(face)\n )) as FaceLandmarks68[]\n\n faces.forEach(f => f instanceof tf.Tensor && f.dispose())\n\n return parentResults.map((parentResult, i) =>\n extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i])\n )\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input)\n }\n}\n\nexport class DetectSingleFaceLandmarksTask<\n TSource extends WithFaceDetection<{}>\n> extends DetectFaceLandmarksTaskBase | undefined, TSource | undefined> {\n\n public async run(): Promise | undefined> {\n\n const parentResult = await this.parentTask\n if (!parentResult) {\n return\n }\n\n const { detection } = parentResult\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, [detection])\n : await extractFaces(this.input, [detection])\n\n const landmarks = await this.landmarkNet.detectLandmarks(faces[0]) as FaceLandmarks68\n\n faces.forEach(f => f instanceof tf.Tensor && f.dispose())\n\n return extendWithFaceLandmarks(parentResult, landmarks)\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input)\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input)\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input)\n }\n}", "import { FaceDetection } from '../classes/FaceDetection';\nimport { TNetInput } from '../dom';\nimport { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { TinyYolov2Options } from '../tinyYolov2';\nimport { ComposableTask } from './ComposableTask';\nimport { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictSingleAgeAndGenderTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionsTask } from './PredictFaceExpressionsTask';\nimport { FaceDetectionOptions } from './types';\n\nexport class DetectFacesTaskBase extends ComposableTask {\n constructor(\n protected input: TNetInput,\n protected options: FaceDetectionOptions = new SsdMobilenetv1Options()\n ) {\n super()\n }\n}\n\nexport class DetectAllFacesTask extends DetectFacesTaskBase {\n\n public async run(): Promise {\n\n const { input, options } = this\n\n const faceDetectionFunction = options instanceof TinyFaceDetectorOptions\n ? (input: TNetInput) => nets.tinyFaceDetector.locateFaces(input, options)\n : (\n options instanceof SsdMobilenetv1Options\n ? (input: TNetInput) => nets.ssdMobilenetv1.locateFaces(input, options)\n : (\n options instanceof TinyYolov2Options\n ? (input: TNetInput) => nets.tinyYolov2.locateFaces(input, options)\n : null\n )\n )\n\n if (!faceDetectionFunction) {\n throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options')\n }\n\n return faceDetectionFunction(input)\n }\n\n private runAndExtendWithFaceDetections(): Promise[]> {\n return new Promise[]>(async res => {\n const detections = await this.run()\n return res(detections.map(detection => extendWithFaceDetection({}, detection)))\n })\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectAllFaceLandmarksTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n useTinyLandmarkNet\n )\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask (\n this.runAndExtendWithFaceDetections(),\n this.input\n )\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(\n this.runAndExtendWithFaceDetections(),\n this.input\n )\n }\n}\n\nexport class DetectSingleFaceTask extends DetectFacesTaskBase {\n\n public async run(): Promise {\n const faceDetections = await new DetectAllFacesTask(this.input, this.options);\n let faceDetectionWithHighestScore = faceDetections[0];\n faceDetections.forEach(faceDetection => {\n if (faceDetection.score > faceDetectionWithHighestScore.score) {\n faceDetectionWithHighestScore = faceDetection;\n }\n });\n return faceDetectionWithHighestScore;\n }\n\n private runAndExtendWithFaceDetection(): Promise | undefined> {\n return new Promise | undefined>(async res => {\n const detection = await this.run()\n return res(detection ? extendWithFaceDetection<{}>({}, detection) : undefined)\n })\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectSingleFaceLandmarksTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n useTinyLandmarkNet\n )\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(\n this.runAndExtendWithFaceDetection(),\n this.input\n )\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(\n this.runAndExtendWithFaceDetection(),\n this.input\n )\n }\n}", "import { TNetInput } from '../dom';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';\nimport { FaceDetectionOptions } from './types';\n\nexport function detectSingleFace(\n input: TNetInput,\n options: FaceDetectionOptions = new SsdMobilenetv1Options()\n): DetectSingleFaceTask {\n return new DetectSingleFaceTask(input, options)\n}\n\nexport function detectAllFaces(\n input: TNetInput,\n options: FaceDetectionOptions = new SsdMobilenetv1Options()\n): DetectAllFacesTask {\n return new DetectAllFacesTask(input, options)\n}", "import { TNetInput } from '../dom';\nimport { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1';\nimport { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2';\nimport { detectAllFaces } from './detectFaces';\n\n// export allFaces API for backward compatibility\n\nexport async function allFacesSsdMobilenetv1(\n input: TNetInput,\n minConfidence?: number\n): Promise>>[]> {\n console.warn('allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead')\n return await detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))\n .withFaceLandmarks()\n .withFaceDescriptors()\n}\n\nexport async function allFacesTinyYolov2(\n input: TNetInput,\n forwardParams: ITinyYolov2Options = {}\n): Promise>>[]> {\n console.warn('allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead')\n return await detectAllFaces(input, new TinyYolov2Options(forwardParams))\n .withFaceLandmarks()\n .withFaceDescriptors()\n}\n\nexport const allFaces = allFacesSsdMobilenetv1\n", "export function euclideanDistance(arr1: number[] | Float32Array, arr2: number[] | Float32Array) {\n if (arr1.length !== arr2.length)\n throw new Error('euclideanDistance: arr1.length !== arr2.length')\n\n const desc1 = Array.from(arr1)\n const desc2 = Array.from(arr2)\n\n return Math.sqrt(\n desc1\n .map((val, i) => val - desc2[i])\n .reduce((res, diff) => res + Math.pow(diff, 2), 0)\n )\n}", "import { FaceMatch } from '../classes/FaceMatch';\nimport { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors';\nimport { euclideanDistance } from '../euclideanDistance';\nimport { WithFaceDescriptor } from '../factories';\n\nexport class FaceMatcher {\n\n private _labeledDescriptors: LabeledFaceDescriptors[]\n private _distanceThreshold: number\n\n constructor(\n inputs: LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>,\n distanceThreshold: number = 0.6\n ) {\n\n this._distanceThreshold = distanceThreshold\n\n const inputArray = Array.isArray(inputs) ? inputs : [inputs]\n\n if (!inputArray.length) {\n throw new Error(`FaceRecognizer.constructor - expected atleast one input`)\n }\n\n let count = 1\n const createUniqueLabel = () => `person ${count++}`\n\n this._labeledDescriptors = inputArray.map((desc) => {\n if (desc instanceof LabeledFaceDescriptors) {\n return desc\n }\n\n if (desc instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc])\n }\n\n if (desc.descriptor && desc.descriptor instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor])\n }\n\n throw new Error(`FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>`)\n })\n }\n\n public get labeledDescriptors(): LabeledFaceDescriptors[] { return this._labeledDescriptors }\n public get distanceThreshold(): number { return this._distanceThreshold }\n\n public computeMeanDistance(queryDescriptor: Float32Array, descriptors: Float32Array[]): number {\n return descriptors\n .map(d => euclideanDistance(d, queryDescriptor))\n .reduce((d1, d2) => d1 + d2, 0)\n / (descriptors.length || 1)\n }\n\n public matchDescriptor(queryDescriptor: Float32Array): FaceMatch {\n return this.labeledDescriptors\n .map(({ descriptors, label }) => new FaceMatch(\n label,\n this.computeMeanDistance(queryDescriptor, descriptors)\n ))\n .reduce((best, curr) => best.distance < curr.distance ? best : curr)\n }\n\n public findBestMatch(queryDescriptor: Float32Array): FaceMatch {\n const bestMatch = this.matchDescriptor(queryDescriptor)\n return bestMatch.distance < this.distanceThreshold\n ? bestMatch\n : new FaceMatch('unknown', bestMatch.distance)\n }\n\n public toJSON(): any {\n return {\n distanceThreshold: this.distanceThreshold,\n labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON())\n };\n }\n\n public static fromJSON(json: any): FaceMatcher {\n const labeledDescriptors = json.labeledDescriptors\n .map((ld: any) => LabeledFaceDescriptors.fromJSON(ld));\n return new FaceMatcher(labeledDescriptors, json.distanceThreshold);\n }\n\n}", "import { TinyFaceDetector } from './TinyFaceDetector';\n\nexport * from './TinyFaceDetector';\nexport * from './TinyFaceDetectorOptions';\n\nexport function createTinyFaceDetector(weights: Float32Array) {\n const net = new TinyFaceDetector()\n net.extractWeights(weights)\n return net\n}", "import { Dimensions, IDimensions } from './classes';\nimport { FaceDetection } from './classes/FaceDetection';\nimport { FaceLandmarks } from './classes/FaceLandmarks';\nimport { extendWithFaceDetection, isWithFaceDetection } from './factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, isWithFaceLandmarks } from './factories/WithFaceLandmarks';\n\nexport function resizeResults(results: T, dimensions: IDimensions): T {\n\n const { width, height } = new Dimensions(dimensions.width, dimensions.height)\n\n if (width <= 0 || height <= 0) {\n throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({ width, height })}`)\n }\n\n if (Array.isArray(results)) {\n // return results.map(obj => resizeResults(obj, { width, height })) as any as T\n return (results as Array).map(obj => resizeResults(obj, { width, height } as IDimensions)) as any as T\n }\n\n if (isWithFaceLandmarks(results)) {\n const resizedDetection = results.detection.forSize(width, height)\n const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height)\n return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks)\n }\n\n if (isWithFaceDetection(results)) {\n return extendWithFaceDetection(results, results.detection.forSize(width, height))\n }\n\n if (results instanceof FaceLandmarks || results instanceof FaceDetection) {\n return (results as any).forSize(width, height)\n }\n\n return results\n}", "// import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\nimport * as tf from '@tensorflow/tfjs/dist/tf.es2017.js';\n// const tf = require('@tensorflow/tfjs-core/dist/tf-core.es2017.js');\n// require('@tensorflow/tfjs-backend-cpu/dist/tf-backend-cpu.es2017.js');\n// require('@tensorflow/tfjs-backend-webgl/dist/tf-backend-webgl.es2017.js');\nimport * as draw from './draw';\nimport * as utils from './utils';\nexport { tf, draw, utils };\n\nexport * from './ageGenderNet/index';\nexport * from './classes/index';\nexport * from './dom/index'\nexport * from './env/index';\nexport * from './faceExpressionNet/index';\nexport * from './faceLandmarkNet/index';\nexport * from './faceRecognitionNet/index';\nexport * from './factories/index';\nexport * from './globalApi/index';\nexport * from './ops/index';\nexport * from './ssdMobilenetv1/index';\nexport * from './tinyFaceDetector/index';\nexport * from './tinyYolov2/index';\nexport * from './euclideanDistance';\nexport * from './NeuralNetwork';\nexport * from './resizeResults';\n\nimport * as pkg from '../package.json';\nconst node = (typeof process !== 'undefined');\nconst browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');\nexport const version = { faceapi: pkg.version, node, browser };\n\n// import { PlatformBrowser } from './Platform';\n// if (!tf.env().platform && tf.env().get('IS_BROWSER')) tf.env().setPlatform('browser', new PlatformBrowser);\n// tf.setBackend('cpu');\n\n// import {MathBackendCPU} from '@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js';\n// export {MathBackendCPU};\n// tf.registerBackend('cpu', () => new MathBackendCPU(), 1 /* priority */);\n"], + "mappings": "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", + "names": [] +} diff --git a/package.json b/package.json index 9bd5bef..ffba38d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "scripts": { "build-esm": "esbuild --bundle --format=esm --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.esm.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs src/index.ts", "build-iife": "esbuild --bundle --format=iife --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs --global-name=faceapi src/index.ts", - "build": "rimraf build/* dist/* && tsc && npm run build-esm && npm run build-iife && ls -l dist/" + "build-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.nobundle.js --log-level=error --tsconfig=./tsconfig.json --external:@tensorflow --external:util --external:string_decoder --external:fs --global-name=faceapi src/index.ts", + "build": "rimraf build/* dist/* && tsc && npm run build-esm && npm run build-iife && npm run build-nobundle && ls -l dist/" }, "keywords": [ "tensorflow",