diff --git a/README.md b/README.md index 97c9f10..a54eebd 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,9 @@ Which means valid models are **tinyFaceDetector** and **mobileNetv1** Face-API ships with several pre-build versions of the library: - `dist/face-api.js`: IIFE format for client-side Browser exeuction - `dist/face-api.esm.js`: ESM format for client-side Browser execution with TFJS pre-bundled -- `dist/face-api.nobundle.js`: ESM format for client-side Browser execution without TFJS and not minified +- `dist/face-api.esm.nobundle.js`: ESM format for client-side Browser execution without TFJS and not minified - `dist/face-api.node.js`: CommonJS format for server-side NodeJS execution with TFJS pre-bundled -- `dist/face-api.nobundle.js`: CommonJS format for server-side NodeJS execution without TFJS and not minified +- `dist/face-api.node.nobundle.js`: CommonJS format for server-side NodeJS execution without TFJS and not minified Defaults are: ```json @@ -136,7 +136,7 @@ And then use with: ``` or if you want to force CommonJS module instead of relying on `recommended` field: ```js - const faceapi = require('@vladmandic/face-api/dist/face-api.cjs'); + const faceapi = require('@vladmandic/face-api/dist/face-api.node.js'); ``` or if you want to use a non-bundled version: Install with: @@ -147,7 +147,7 @@ Install with: And then use with: ```js const tf = require('@tensorflow/tfjs'); - const faceapi = require('@vladmandic/face-api/dist/face-api.nobundle.cjs'); + const faceapi = require('@vladmandic/face-api/dist/face-api.node.nobundle.js'); ``` ### 4. Import Sources diff --git a/build/package.json b/build/package.json index 88b9928..dbcbc5c 100644 --- a/build/package.json +++ b/build/package.json @@ -1,6 +1,6 @@ { "name": "@vladmandic/face-api", - "version": "0.8.3", + "version": "0.8.4", "description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS", "main": "dist/face-api.node.js", "module": "dist/face-api.esm.js", @@ -12,10 +12,10 @@ "type": "module", "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-esm-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --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-esm-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --sourcemap --outfile=./dist/face-api.esm.nobundle.js --log-level=error --tsconfig=./tsconfig.json --external:@tensorflow --external:util --external:string_decoder --external:fs --global-name=faceapi 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-node": "esbuild --bundle --format=cjs --target=es2018 --platform=node --minify --sourcemap --outfile=./dist/face-api.node.js --log-level=error --tsconfig=./tsconfig.json src/index.ts", - "build-node-nobundle": "esbuild --bundle --format=cjs --target=es2018 --platform=node --sourcemap --outfile=./dist/face-api.nobundle.js --external:@tensorflow --log-level=error --tsconfig=./tsconfig.json src/index.ts", + "build-node-nobundle": "esbuild --bundle --format=cjs --target=es2018 --platform=node --sourcemap --outfile=./dist/face-api.node.nobundle.js --external:@tensorflow --log-level=error --tsconfig=./tsconfig.json src/index.ts", "build": "rimraf build/* dist/* && tsc && npm run build-iife && npm run build-esm && npm run build-esm-nobundle && npm run build-node && npm run build-node-nobundle && ls -l dist/" }, "keywords": [ diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index 5f3840b..930db2b 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 Tc.print(this,r)}clone(){return this.throwIfDisposed(),Tc.clone(this)}toString(r=!1){const l=this.dataSync();return gR(l,this.shape,this.dtype,r)}cast(r){return this.throwIfDisposed(),Tc.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(!jo(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,Lc,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=Ko(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,wc)}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):Ic(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):Ic(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,Lc,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(jo(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 dn=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(Sc(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 Ac;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)&&(Ac==null&&(Ac=document.createElement("canvas").getContext("2d")),Ac.canvas.width=x,Ac.canvas.height=v,Ac.drawImage(r,0,0,x,v),O=Ac.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,wc)}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 vc(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=Xo((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=Xo((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=Xo((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=Xo((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=Nc(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 Nc(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=Xo((l-f+U+G)/p+1,S),C=Xo((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 Xo(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 Cc(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=Cc(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=Cc(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=vc(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 Jo=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 Zo=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=Zo(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 Qo=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=Ko(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 Rc=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 ea=z({pow_:vJ});function Qr(r,l){Sc(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=Ko(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 Oc=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 Ec=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=Ec(g)}else{const g=[u,2*(l-1)],f=ie(Rc(r),[u,l]),I=ie(yu(r),[u,l]),S=Oc(Tt(f,[0,1],[u,l-2]),1),x=ae(Oc(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=Ec(C)}if(p=Rc(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=Rc(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 ta=z({step_:PJ});function na(r,l,u){if(Sc(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 Zo(Un(r),u);if(l===-Infinity)return Ef(Un(r),u);if(l==="euclidean"||l===2)return ps(Fe(ea(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 Zo(Fe(Un(r),u[0]),u[1]-1);if(l===Infinity)return Zo(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=Cc(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=Qo(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=na([[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),na([[-1]]),na([[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(dn(oe,ge),ne)),Te=Tt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=Wt(S);if(v===0)f=Be(Te,dn(Ve,dn(rt,Te)));else{const Kt=Be(Te,dn(Ve,dn(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,dn(dn($t,S),vt));else{const Kt=Be($t,dn(dn($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:Ec,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,ta(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:wc,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:()=>dn(r,g,!1,!0),b:()=>dn(p,r,!0,!1)}:!f&&I?{a:()=>dn(r,g,!1,!1),b:()=>dn(r,p,!0,!1)}:f&&!I?{a:()=>dn(g,r,!1,!0),b:()=>dn(p,r,!1,!1)}:{a:()=>dn(g,r,!0,!0),b:()=>dn(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:Lc,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(Qo(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,Jo(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=vc(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,ea(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),ta(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(ta(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:()=>Oc(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(ea(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=vc(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=qo(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=bc({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(Ho);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 Dc(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=bc({width:x,height:v});return Jn(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const Bf=Ke(Xe());async function kc(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 sa(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 sa(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 sa(r)).json()}async function $9(r){return new Float32Array(await(await sa(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?qo(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 Fc=Ke(Xe());function Qn(r,l,u){return Fc.tidy(()=>{let p=Fc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Fc.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 ia(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 _c(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 Wc(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(!Po(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=_c(r,l),p=Wc(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 so=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 so.tidy(()=>{const u=so.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(so.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=so.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 Uc=Ke(Xe());function Tu(r,l){return Uc.tidy(()=>Uc.add(Uc.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 ra{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 Bc=Ke(Xe());class FI extends Xf{constructor(r=new jf){super("FaceExpressionNet",r)}forwardInput(r){return Bc.tidy(()=>Bc.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(Bc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new ra(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 ra}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 ra?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 yc(x.map(C=>`${C.expression} (${zo(C.probability)})`),v);O.draw(r)})}function oa(r){return Ui(r)&&r.landmarks instanceof Gs&&r.unshiftedLandmarks instanceof Gs&&r.alignedRect instanceof Ht}function Mc(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:oa(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:()=>yc,DrawTextFieldOptions:()=>ym,drawContour:()=>cr,drawDetections:()=>KX,drawFaceExpressions:()=>B9,drawFaceLandmarks:()=>M9});function P9(r,l){const u=_c(r,l),p=Wc(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 tn=Ke(Xe());function TE(r,l,u){return tn.add(tn.conv2d(r,l.filters,u,"same"),l.bias)}function $I(r,l,u=!0){let p=u?tn.relu(r):r;return p=Qn(p,l.separable_conv0,[1,1]),p=Qn(tn.relu(p),l.separable_conv1,[1,1]),p=tn.maxPool(p,[3,3],[2,2],"same"),p=tn.add(p,TE(r,l.expansion_conv,[2,2])),p}function G9(r,l){let u=Qn(tn.relu(r),l.separable_conv0,[1,1]);return u=Qn(tn.relu(u),l.separable_conv1,[1,1]),u=Qn(tn.relu(u),l.separable_conv2,[1,1]),u=tn.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 tn.tidy(()=>{const u=tn.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(tn.scalar(256));let f=tn.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=tn.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,"float32"),fs.fill([68],C,"float32")],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 io=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 io.tidy(()=>{const u=io.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(io.scalar(255));let f=Pf(g,l.dense0,!0);return f=Pf(f,l.dense1),f=Pf(f,l.dense2),f=io.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)&&fc(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},ua={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:ua,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 ro=Ke(Xe());function Hs(r,l,u){return ro.tidy(()=>{let p=ro.conv2d(r,l.filters,u,"same");return p=ro.add(p,l.batch_norm_offset),ro.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 aa(r,l){return Cu.tidy(()=>{const u=r.shape[0],p=Cu.reshape(ia(r,l.box_encoding_predictor),[u,-1,1,4]),g=Cu.reshape(ia(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=aa(l,u.box_predictor_0),U=aa(r,u.box_predictor_1),G=aa(g,u.box_predictor_2),ne=aa(I,u.box_predictor_3),te=aa(x,u.box_predictor_4),oe=aa(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 oo=Ke(Xe());function wr(r,l){return oo.tidy(()=>{let u=oo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=oo.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=oo.add(u,l.bias),Gc(u)})}const GI=Ke(Xe());function oZ(r,l){const u=_c(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=Wc(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),ia(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Gc(ia(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,ia(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 gc(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 ca(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>oa(x)?g(x):x.detection),I=p||(l instanceof HI.Tensor?await kc(l,f):await Dc(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 ca([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 ca(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 la(this,this.input)}}class Kc extends _u{withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ha(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 ca(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 la(this,this.input)}}class qc extends ku{withFaceExpressions(){return new Kc(this,this.input)}withFaceDescriptor(){return new ha(this,this.input)}}class qI extends wi{constructor(r,l){super();this.parentTask=r;this.input=l}}class la extends qI{async run(){const r=await this.parentTask,l=await ca(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 ha 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 kc(this.input,l):await Dc(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)=>Mc(g,p[f]))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new la(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 kc(this.input,[l]):await Dc(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),Mc(r,p)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ha(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=>Yo({},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?Yo({},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 Vo)return f;if(f instanceof Float32Array)return new Vo(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new Vo(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=>Vo.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(oa(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Mc(Yo(r,g),f)}return Ui(r)?Yo(r,r.detection.forSize(u,p)):r instanceof Gs||r instanceof Ht?r.forSize(u,p):r}var aD="0.8.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,la as ComputeAllFaceDescriptorsTask,qI as ComputeFaceDescriptorsTaskBase,ha 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,ra 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,Vo as LabeledFaceDescriptors,to as NetInput,En as NeuralNetwork,gc 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,bc 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,Yo as extendWithFaceDetection,Jf as extendWithFaceExpressions,Mc as extendWithFaceLandmarks,sg as extendWithGender,kc as extractFaceTensors,Dc as extractFaces,W9 as fetchImage,OI as fetchJson,$9 as fetchNetWeights,sa as fetchOrThrow,Jn as getContext2dOrThrow,qo 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,oa 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,Ho 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=Cc(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=Cc(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=vc(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 Jo=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 Zo=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=Zo(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 Qo=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=Ko(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 Rc=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 ea=z({pow_:vJ});function Qr(r,l){Sc(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=Ko(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 Oc=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 Ec=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=Ec(g)}else{const g=[u,2*(l-1)],f=ie(Rc(r),[u,l]),I=ie(yu(r),[u,l]),S=Oc(Tt(f,[0,1],[u,l-2]),1),x=ae(Oc(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=Ec(C)}if(p=Rc(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=Rc(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 ta=z({step_:PJ});function na(r,l,u){if(Sc(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 Zo(Un(r),u);if(l===-Infinity)return Ef(Un(r),u);if(l==="euclidean"||l===2)return ps(Fe(ea(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 Zo(Fe(Un(r),u[0]),u[1]-1);if(l===Infinity)return Zo(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=Cc(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=Qo(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=na([[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),na([[-1]]),na([[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(dn(oe,ge),ne)),Te=Tt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=Wt(S);if(v===0)f=Be(Te,dn(Ve,dn(rt,Te)));else{const Kt=Be(Te,dn(Ve,dn(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,dn(dn($t,S),vt));else{const Kt=Be($t,dn(dn($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:Ec,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,ta(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:wc,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:()=>dn(r,g,!1,!0),b:()=>dn(p,r,!0,!1)}:!f&&I?{a:()=>dn(r,g,!1,!1),b:()=>dn(r,p,!0,!1)}:f&&!I?{a:()=>dn(g,r,!1,!0),b:()=>dn(p,r,!1,!1)}:{a:()=>dn(g,r,!0,!0),b:()=>dn(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:Lc,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(Qo(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,Jo(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=vc(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,ea(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),ta(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(ta(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:()=>Oc(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(ea(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=vc(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=qo(r),I=l/Math.max(f.height,f.width),S=I*f.width,x=I*f.height,v=bc({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(Ho);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 Dc(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=bc({width:x,height:v});return Jn(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const Bf=Ke(Xe());async function kc(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 sa(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 sa(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 sa(r)).json()}async function $9(r){return new Float32Array(await(await sa(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?qo(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 Fc=Ke(Xe());function Qn(r,l,u){return Fc.tidy(()=>{let p=Fc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Fc.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 ia(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 _c(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 Wc(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(!Po(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=_c(r,l),p=Wc(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 so=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 so.tidy(()=>{const u=so.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(so.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=so.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 Uc=Ke(Xe());function Tu(r,l){return Uc.tidy(()=>Uc.add(Uc.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 ra{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 Bc=Ke(Xe());class FI extends Xf{constructor(r=new jf){super("FaceExpressionNet",r)}forwardInput(r){return Bc.tidy(()=>Bc.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(Bc.unstack(u).map(async f=>{const I=await f.data();return f.dispose(),I}));u.dispose();const g=p.map(f=>new ra(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 ra}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 ra?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 yc(x.map(C=>`${C.expression} (${zo(C.probability)})`),v);O.draw(r)})}function oa(r){return Ui(r)&&r.landmarks instanceof Gs&&r.unshiftedLandmarks instanceof Gs&&r.alignedRect instanceof Ht}function Mc(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:oa(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:()=>yc,DrawTextFieldOptions:()=>ym,drawContour:()=>cr,drawDetections:()=>KX,drawFaceExpressions:()=>B9,drawFaceLandmarks:()=>M9});function P9(r,l){const u=_c(r,l),p=Wc(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 tn=Ke(Xe());function TE(r,l,u){return tn.add(tn.conv2d(r,l.filters,u,"same"),l.bias)}function $I(r,l,u=!0){let p=u?tn.relu(r):r;return p=Qn(p,l.separable_conv0,[1,1]),p=Qn(tn.relu(p),l.separable_conv1,[1,1]),p=tn.maxPool(p,[3,3],[2,2],"same"),p=tn.add(p,TE(r,l.expansion_conv,[2,2])),p}function G9(r,l){let u=Qn(tn.relu(r),l.separable_conv0,[1,1]);return u=Qn(tn.relu(u),l.separable_conv1,[1,1]),u=Qn(tn.relu(u),l.separable_conv2,[1,1]),u=tn.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 tn.tidy(()=>{const u=tn.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(tn.scalar(256));let f=tn.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=tn.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,"float32"),fs.fill([68],C,"float32")],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 io=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 io.tidy(()=>{const u=io.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=di(u,p).div(io.scalar(255));let f=Pf(g,l.dense0,!0);return f=Pf(f,l.dense1),f=Pf(f,l.dense2),f=io.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)&&fc(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},ua={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:ua,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 ro=Ke(Xe());function Hs(r,l,u){return ro.tidy(()=>{let p=ro.conv2d(r,l.filters,u,"same");return p=ro.add(p,l.batch_norm_offset),ro.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 aa(r,l){return Cu.tidy(()=>{const u=r.shape[0],p=Cu.reshape(ia(r,l.box_encoding_predictor),[u,-1,1,4]),g=Cu.reshape(ia(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=aa(l,u.box_predictor_0),U=aa(r,u.box_predictor_1),G=aa(g,u.box_predictor_2),ne=aa(I,u.box_predictor_3),te=aa(x,u.box_predictor_4),oe=aa(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 oo=Ke(Xe());function wr(r,l){return oo.tidy(()=>{let u=oo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=oo.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=oo.add(u,l.bias),Gc(u)})}const GI=Ke(Xe());function oZ(r,l){const u=_c(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=Wc(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),ia(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Gc(ia(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,ia(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 gc(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 ca(r,l,u,p,g=({alignedRect:f})=>f){const f=r.map(x=>oa(x)?g(x):x.detection),I=p||(l instanceof HI.Tensor?await kc(l,f):await Dc(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 ca([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 ca(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 la(this,this.input)}}class Kc extends _u{withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ha(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 ca(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 la(this,this.input)}}class qc extends ku{withFaceExpressions(){return new Kc(this,this.input)}withFaceDescriptor(){return new ha(this,this.input)}}class qI extends wi{constructor(r,l){super();this.parentTask=r;this.input=l}}class la extends qI{async run(){const r=await this.parentTask,l=await ca(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 ha 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 kc(this.input,l):await Dc(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)=>Mc(g,p[f]))}withFaceExpressions(){return new jc(this,this.input)}withAgeAndGender(){return new Hc(this,this.input)}withFaceDescriptors(){return new la(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 kc(this.input,[l]):await Dc(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Wu.Tensor&&g.dispose()),Mc(r,p)}withFaceExpressions(){return new Kc(this,this.input)}withAgeAndGender(){return new qc(this,this.input)}withFaceDescriptor(){return new ha(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=>Yo({},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?Yo({},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 Vo)return f;if(f instanceof Float32Array)return new Vo(g(),[f]);if(f.descriptor&&f.descriptor instanceof Float32Array)return new Vo(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=>Vo.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(oa(r)){const g=r.detection.forSize(u,p),f=r.unshiftedLandmarks.forSize(g.box.width,g.box.height);return Mc(Yo(r,g),f)}return Ui(r)?Yo(r,r.detection.forSize(u,p)):r instanceof Gs||r instanceof Ht?r.forSize(u,p):r}var aD="0.8.4";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,la as ComputeAllFaceDescriptorsTask,qI as ComputeFaceDescriptorsTaskBase,ha 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,ra 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,Vo as LabeledFaceDescriptors,to as NetInput,En as NeuralNetwork,gc 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,bc 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,Yo as extendWithFaceDetection,Jf as extendWithFaceExpressions,Mc as extendWithFaceLandmarks,sg as extendWithGender,kc as extractFaceTensors,Dc as extractFaces,W9 as fetchImage,OI as fetchJson,$9 as fetchNetWeights,sa as fetchOrThrow,Jn as getContext2dOrThrow,qo 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,oa 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,Ho 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.esm.nobundle.js b/dist/face-api.esm.nobundle.js new file mode 100644 index 0000000..8818586 --- /dev/null +++ b/dist/face-api.esm.nobundle.js @@ -0,0 +1,4614 @@ +var __defineProperty = Object.defineProperty; +var __hasOwnProperty = Object.prototype.hasOwnProperty; +var __commonJS = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __markAsModule = (target) => { + return __defineProperty(target, "__esModule", {value: true}); +}; +var __export = (target, all) => { + __markAsModule(target); + for (var name in all) + __defineProperty(target, name, {get: all[name], enumerable: true}); +}; +var __exportStar = (target, module) => { + __markAsModule(target); + if (typeof module === "object" || typeof module === "function") { + for (let key in module) + if (!__hasOwnProperty.call(target, key) && key !== "default") + __defineProperty(target, key, {get: () => module[key], enumerable: true}); + } + return target; +}; +var __toModule = (module) => { + if (module && module.__esModule) + return module; + return __exportStar(__defineProperty({}, "default", {value: module, enumerable: true}), module); +}; + +// src/env/isNodejs.ts +var require_isNodejs = __commonJS((exports, module) => { + __export(exports, { + isNodejs: () => isNodejs3 + }); + function isNodejs3() { + return typeof global === "object" && true && typeof module !== "undefined" && typeof process !== "undefined" && !!process.version; + } +}); + +// src/draw/drawContour.ts +function drawContour(ctx, points, isClosed = false) { + ctx.beginPath(); + points.slice(1).forEach(({x, y}, prevIdx) => { + const from = points[prevIdx]; + ctx.moveTo(from.x, from.y); + ctx.lineTo(x, y); + }); + if (isClosed) { + const from = points[points.length - 1]; + const to = points[0]; + if (!from || !to) { + return; + } + ctx.moveTo(from.x, from.y); + ctx.lineTo(to.x, to.y); + } + ctx.stroke(); +} + +// src/classes/Dimensions.ts +class Dimensions { + constructor(width, height) { + if (!isValidNumber(width) || !isValidNumber(height)) { + throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width, height})}`); + } + this._width = width; + this._height = height; + } + get width() { + return this._width; + } + get height() { + return this._height; + } + reverse() { + return new Dimensions(1 / this.width, 1 / this.height); + } +} + +// src/utils/index.ts +const utils_exports = {}; +__export(utils_exports, { + computeReshapedDimensions: () => computeReshapedDimensions, + getCenterPoint: () => getCenterPoint, + isDimensions: () => isDimensions, + isEven: () => isEven, + isFloat: () => isFloat, + isTensor: () => isTensor, + isTensor1D: () => isTensor1D, + isTensor2D: () => isTensor2D, + isTensor3D: () => isTensor3D, + isTensor4D: () => isTensor4D, + isValidNumber: () => isValidNumber, + isValidProbablitiy: () => isValidProbablitiy, + range: () => range, + round: () => round +}); +import { + Tensor +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function isTensor(tensor2, dim) { + return tensor2 instanceof Tensor && tensor2.shape.length === dim; +} +function isTensor1D(tensor2) { + return isTensor(tensor2, 1); +} +function isTensor2D(tensor2) { + return isTensor(tensor2, 2); +} +function isTensor3D(tensor2) { + return isTensor(tensor2, 3); +} +function isTensor4D(tensor2) { + return isTensor(tensor2, 4); +} +function isFloat(num) { + return num % 1 !== 0; +} +function isEven(num) { + return num % 2 === 0; +} +function round(num, prec = 2) { + const f = Math.pow(10, prec); + return Math.floor(num * f) / f; +} +function isDimensions(obj) { + return obj && obj.width && obj.height; +} +function computeReshapedDimensions({width, height}, inputSize) { + const scale2 = inputSize / Math.max(height, width); + return new Dimensions(Math.round(width * scale2), Math.round(height * scale2)); +} +function getCenterPoint(pts) { + return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0)).div(new Point(pts.length, pts.length)); +} +function range(num, start, step) { + return Array(num).fill(0).map((_, i) => start + i * step); +} +function isValidNumber(num) { + return !!num && num !== Infinity && num !== -Infinity && !isNaN(num) || num === 0; +} +function isValidProbablitiy(num) { + return isValidNumber(num) && 0 <= num && num <= 1; +} + +// src/classes/Point.ts +class Point { + constructor(x, y) { + this._x = x; + this._y = y; + } + get x() { + return this._x; + } + get y() { + return this._y; + } + add(pt) { + return new Point(this.x + pt.x, this.y + pt.y); + } + sub(pt) { + return new Point(this.x - pt.x, this.y - pt.y); + } + mul(pt) { + return new Point(this.x * pt.x, this.y * pt.y); + } + div(pt) { + return new Point(this.x / pt.x, this.y / pt.y); + } + abs() { + return new Point(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 Point(Math.floor(this.x), Math.floor(this.y)); + } +} + +// src/classes/Box.ts +class Box { + static isRect(rect) { + return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber); + } + static assertIsValidBox(box, callee, allowNegativeDimensions = false) { + if (!Box.isRect(box)) { + throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`); + } + if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) { + throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`); + } + } + constructor(_box, allowNegativeDimensions = true) { + const box = _box || {}; + const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber); + const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber); + if (!isRect && !isBbox) { + throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`); + } + const [x, y, width, height] = isRect ? [box.x, box.y, box.width, box.height] : [box.left, box.top, box.right - box.left, box.bottom - box.top]; + Box.assertIsValidBox({x, y, width, height}, "Box.constructor", allowNegativeDimensions); + this._x = x; + this._y = y; + this._width = width; + this._height = height; + } + 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 Point(this.left, this.top); + } + get topRight() { + return new Point(this.right, this.top); + } + get bottomLeft() { + return new Point(this.left, this.bottom); + } + get bottomRight() { + return new Point(this.right, this.bottom); + } + round() { + const [x, y, width, height] = [this.x, this.y, this.width, this.height].map((val) => Math.round(val)); + return new Box({x, y, width, height}); + } + floor() { + const [x, y, width, height] = [this.x, this.y, this.width, this.height].map((val) => Math.floor(val)); + return new Box({x, y, width, height}); + } + toSquare() { + let {x, y, width, height} = this; + const diff = Math.abs(width - height); + if (width < height) { + x -= diff / 2; + width += diff; + } + if (height < width) { + y -= diff / 2; + height += diff; + } + return new Box({x, y, width, height}); + } + rescale(s) { + const scaleX = isDimensions(s) ? s.width : s; + const scaleY = isDimensions(s) ? s.height : s; + return new Box({ + x: this.x * scaleX, + y: this.y * scaleY, + width: this.width * scaleX, + height: this.height * scaleY + }); + } + pad(padX, padY) { + let [x, y, width, height] = [ + this.x - padX / 2, + this.y - padY / 2, + this.width + padX, + this.height + padY + ]; + return new Box({x, y, width, height}); + } + clipAtImageBorders(imgWidth, imgHeight) { + const {x, y, right, bottom} = this; + const clippedX = Math.max(x, 0); + const clippedY = Math.max(y, 0); + const newWidth = right - clippedX; + const newHeight = bottom - clippedY; + const clippedWidth = Math.min(newWidth, imgWidth - clippedX); + const clippedHeight = Math.min(newHeight, imgHeight - clippedY); + return new Box({x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight}).floor(); + } + shift(sx, sy) { + const {width, height} = this; + const x = this.x + sx; + const y = this.y + sy; + return new Box({x, y, width, height}); + } + padAtBorders(imageHeight, imageWidth) { + const w = this.width + 1; + const h = this.height + 1; + let dx = 1; + let dy = 1; + let edx = w; + let edy = h; + let x = this.left; + let y = this.top; + let ex = this.right; + let ey = this.bottom; + if (ex > imageWidth) { + edx = -ex + imageWidth + w; + ex = imageWidth; + } + if (ey > imageHeight) { + edy = -ey + imageHeight + h; + ey = imageHeight; + } + if (x < 1) { + edy = 2 - x; + x = 1; + } + if (y < 1) { + edy = 2 - y; + y = 1; + } + return {dy, edy, dx, edx, y, ey, x, ex, w, h}; + } + calibrate(region) { + return new Box({ + left: this.left + region.left * this.width, + top: this.top + region.top * this.height, + right: this.right + region.right * this.width, + bottom: this.bottom + region.bottom * this.height + }).toSquare().round(); + } +} + +// src/classes/BoundingBox.ts +class BoundingBox extends Box { + constructor(left, top, right, bottom, allowNegativeDimensions = false) { + super({left, top, right, bottom}, allowNegativeDimensions); + } +} + +// src/classes/ObjectDetection.ts +class ObjectDetection { + constructor(score, classScore, className, relativeBox, imageDims) { + this._imageDims = new Dimensions(imageDims.width, imageDims.height); + this._score = score; + this._classScore = classScore; + this._className = className; + this._box = new Box(relativeBox).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 Box(this._box).rescale(this.imageDims.reverse()); + } + forSize(width, height) { + return new ObjectDetection(this.score, this.classScore, this.className, this.relativeBox, {width, height}); + } +} + +// src/classes/FaceDetection.ts +class FaceDetection extends ObjectDetection { + constructor(score, relativeBox, imageDims) { + super(score, score, "", relativeBox, imageDims); + } + forSize(width, height) { + const {score, relativeBox, imageDims} = super.forSize(width, height); + return new FaceDetection(score, relativeBox, imageDims); + } +} + +// src/ops/iou.ts +function iou(box1, box2, isIOU = true) { + const width = Math.max(0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left)); + const height = Math.max(0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top)); + const interSection = width * height; + return isIOU ? interSection / (box1.area + box2.area - interSection) : interSection / Math.min(box1.area, box2.area); +} + +// src/ops/minBbox.ts +function minBbox(pts) { + const xs = pts.map((pt) => pt.x); + const ys = pts.map((pt) => pt.y); + const minX = xs.reduce((min, x) => x < min ? x : min, Infinity); + const minY = ys.reduce((min, y) => y < min ? y : min, Infinity); + const maxX = xs.reduce((max, x) => max < x ? x : max, 0); + const maxY = ys.reduce((max, y) => max < y ? y : max, 0); + return new BoundingBox(minX, minY, maxX, maxY); +} + +// src/ops/nonMaxSuppression.ts +function nonMaxSuppression(boxes, scores, iouThreshold, isIOU = true) { + let indicesSortedByScore = scores.map((score, boxIndex) => ({score, boxIndex})).sort((c1, c2) => c1.score - c2.score).map((c) => c.boxIndex); + const pick = []; + while (indicesSortedByScore.length > 0) { + const curr = indicesSortedByScore.pop(); + pick.push(curr); + const indices = indicesSortedByScore; + const outputs = []; + for (let i = 0; i < indices.length; i++) { + const idx = indices[i]; + const currBox = boxes[curr]; + const idxBox = boxes[idx]; + outputs.push(iou(currBox, idxBox, isIOU)); + } + indicesSortedByScore = indicesSortedByScore.filter((_, j) => outputs[j] <= iouThreshold); + } + return pick; +} + +// src/ops/normalize.ts +import { + concat, + fill, + sub, + tidy +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function normalize(x, meanRgb) { + return tidy(() => { + const [r, g, b] = meanRgb; + const avg_r = fill([...x.shape.slice(0, 3), 1], r, "float32"); + const avg_g = fill([...x.shape.slice(0, 3), 1], g, "float32"); + const avg_b = fill([...x.shape.slice(0, 3), 1], b, "float32"); + const avg_rgb = concat([avg_r, avg_g, avg_b], 3); + return sub(x, avg_rgb); + }); +} + +// src/ops/padToSquare.ts +import { + cast, + concat as concat2, + fill as fill2, + tidy as tidy2 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function padToSquare(imgTensor, isCenterImage = false) { + return tidy2(() => { + const [height, width] = imgTensor.shape.slice(1); + if (height === width) { + return imgTensor; + } + const dimDiff = Math.abs(height - width); + const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); + const paddingAxis = height > width ? 2 : 1; + const createPaddingTensor = (paddingAmount2) => { + const paddingTensorShape = imgTensor.shape.slice(); + paddingTensorShape[paddingAxis] = paddingAmount2; + return fill2(paddingTensorShape, 0, "float32"); + }; + const paddingTensorAppend = createPaddingTensor(paddingAmount); + const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; + const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; + const tensorsToStack = [ + paddingTensorPrepend, + imgTensor, + paddingTensorAppend + ].filter((t) => !!t).map((t) => cast(t, "float32")); + return concat2(tensorsToStack, paddingAxis); + }); +} + +// src/ops/shuffleArray.ts +function shuffleArray(inputArray) { + const array = inputArray.slice(); + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const x = array[i]; + array[i] = array[j]; + array[j] = x; + } + return array; +} + +// src/ops/index.ts +function sigmoid(x) { + return 1 / (1 + Math.exp(-x)); +} +function inverseSigmoid(x) { + return Math.log(x / (1 - x)); +} + +// src/classes/Rect.ts +class Rect extends Box { + constructor(x, y, width, height, allowNegativeDimensions = false) { + super({x, y, width, height}, allowNegativeDimensions); + } +} + +// src/classes/FaceLandmarks.ts +const relX = 0.5; +const relY = 0.43; +const relScale = 0.45; +class FaceLandmarks { + constructor(relativeFaceLandmarkPositions, imgDims, shift = new Point(0, 0)) { + const {width, height} = imgDims; + this._imgDims = new Dimensions(width, height); + this._shift = shift; + this._positions = relativeFaceLandmarkPositions.map((pt) => pt.mul(new Point(width, height)).add(shift)); + } + get shift() { + return new Point(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((pt) => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight))); + } + forSize(width, height) { + return new this.constructor(this.relativePositions, {width, height}); + } + shiftBy(x, y) { + return new this.constructor(this.relativePositions, this._imgDims, new Point(x, y)); + } + shiftByPoint(pt) { + return this.shiftBy(pt.x, pt.y); + } + align(detection, options = {}) { + if (detection) { + const box = detection instanceof FaceDetection ? detection.box.floor() : new Box(detection); + return this.shiftBy(box.x, box.y).align(null, options); + } + const {useDlibAlignment, minBoxPadding} = Object.assign({}, {useDlibAlignment: false, minBoxPadding: 0.2}, options); + if (useDlibAlignment) { + return this.alignDlib(); + } + return this.alignMinBbox(minBoxPadding); + } + alignDlib() { + const centers = this.getRefPointsForAlignment(); + const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers; + const distToMouth = (pt) => mouthCenter.sub(pt).magnitude(); + const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2; + const size = Math.floor(eyeToMouthDist / relScale); + const refPoint = getCenterPoint(centers); + const x = Math.floor(Math.max(0, refPoint.x - relX * size)); + const y = Math.floor(Math.max(0, refPoint.y - relY * size)); + return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y)); + } + alignMinBbox(padding) { + const box = minBbox(this.positions); + return box.pad(box.width * padding, box.height * padding); + } + getRefPointsForAlignment() { + throw new Error("getRefPointsForAlignment not implemented by base class"); + } +} + +// src/classes/FaceLandmarks5.ts +class FaceLandmarks5 extends FaceLandmarks { + getRefPointsForAlignment() { + const pts = this.positions; + return [ + pts[0], + pts[1], + getCenterPoint([pts[3], pts[4]]) + ]; + } +} + +// src/classes/FaceLandmarks68.ts +class FaceLandmarks68 extends FaceLandmarks { + 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(getCenterPoint); + } +} + +// src/classes/FaceMatch.ts +class FaceMatch { + constructor(label, distance) { + this._label = label; + this._distance = distance; + } + get label() { + return this._label; + } + get distance() { + return this._distance; + } + toString(withDistance = true) { + return `${this.label}${withDistance ? ` (${round(this.distance)})` : ""}`; + } +} + +// src/classes/LabeledBox.ts +class LabeledBox extends Box { + static assertIsValidLabeledBox(box, callee) { + Box.assertIsValidBox(box, callee); + if (!isValidNumber(box.label)) { + throw new Error(`${callee} - expected property label (${box.label}) to be a number`); + } + } + constructor(box, label) { + super(box); + this._label = label; + } + get label() { + return this._label; + } +} + +// src/classes/LabeledFaceDescriptors.ts +class LabeledFaceDescriptors { + constructor(label, descriptors) { + if (!(typeof label === "string")) { + throw new Error("LabeledFaceDescriptors - constructor expected label to be a string"); + } + if (!Array.isArray(descriptors) || descriptors.some((desc) => !(desc instanceof Float32Array))) { + throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array"); + } + this._label = label; + this._descriptors = descriptors; + } + get label() { + return this._label; + } + get descriptors() { + return this._descriptors; + } + toJSON() { + return { + label: this.label, + descriptors: this.descriptors.map((d) => Array.from(d)) + }; + } + static fromJSON(json) { + const descriptors = json.descriptors.map((d) => { + return new Float32Array(d); + }); + return new LabeledFaceDescriptors(json.label, descriptors); + } +} + +// src/classes/PredictedBox.ts +class PredictedBox extends LabeledBox { + static assertIsValidPredictedBox(box, callee) { + LabeledBox.assertIsValidLabeledBox(box, callee); + if (!isValidProbablitiy(box.score) || !isValidProbablitiy(box.classScore)) { + throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`); + } + } + constructor(box, label, score, classScore) { + super(box, label); + this._score = score; + this._classScore = classScore; + } + get score() { + return this._score; + } + get classScore() { + return this._classScore; + } +} + +// src/classes/index.ts + +// src/factories/WithFaceDetection.ts +function isWithFaceDetection(obj) { + return obj["detection"] instanceof FaceDetection; +} +function extendWithFaceDetection(sourceObj, detection) { + const extension = {detection}; + return Object.assign({}, sourceObj, extension); +} + +// src/env/createBrowserEnv.ts +function createBrowserEnv() { + const fetch = window["fetch"] || function() { + throw new Error("fetch - missing fetch implementation for browser environment"); + }; + const readFile = 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, + readFile + }; +} + +// src/env/createFileSystem.ts +function createFileSystem(fs) { + let requireFsError = ""; + if (!fs) { + try { + fs = require("fs"); + } catch (err) { + requireFsError = err.toString(); + } + } + const readFile = fs ? function(filePath) { + return new Promise((res, rej) => { + fs.readFile(filePath, function(err, buffer) { + return err ? rej(err) : res(buffer); + }); + }); + } : function() { + throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`); + }; + return { + readFile + }; +} + +// src/env/createNodejsEnv.ts +function createNodejsEnv() { + const Canvas = global["Canvas"] || global["HTMLCanvasElement"]; + const Image = global["Image"] || global["HTMLImageElement"]; + const createCanvasElement = function() { + if (Canvas) { + return new Canvas(); + } + throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment"); + }; + const createImageElement = function() { + if (Image) { + return new Image(); + } + throw new Error("createImageElement - missing Image implementation for nodejs environment"); + }; + const fetch = global["fetch"] || function() { + throw new Error("fetch - missing fetch implementation for nodejs environment"); + }; + const fileSystem = createFileSystem(); + return { + Canvas: Canvas || class { + }, + CanvasRenderingContext2D: global["CanvasRenderingContext2D"] || class { + }, + Image: Image || class { + }, + ImageData: global["ImageData"] || class { + }, + Video: global["HTMLVideoElement"] || class { + }, + createCanvasElement, + createImageElement, + fetch, + ...fileSystem + }; +} + +// src/env/isBrowser.ts +function isBrowser() { + return typeof window === "object" && typeof document !== "undefined" && typeof HTMLImageElement !== "undefined" && typeof HTMLCanvasElement !== "undefined" && typeof HTMLVideoElement !== "undefined" && typeof ImageData !== "undefined" && typeof CanvasRenderingContext2D !== "undefined"; +} + +// src/env/types.ts + +// src/env/index.ts +const isNodejs = __toModule(require_isNodejs()); +let environment; +function getEnv() { + if (!environment) { + throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()"); + } + return environment; +} +function setEnv(env16) { + environment = env16; +} +function initialize() { + if (isBrowser()) { + return setEnv(createBrowserEnv()); + } + if (isNodejs.isNodejs()) { + return setEnv(createNodejsEnv()); + } +} +function monkeyPatch(env16) { + if (!environment) { + initialize(); + } + if (!environment) { + throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()"); + } + const {Canvas = environment.Canvas, Image = environment.Image} = env16; + environment.Canvas = Canvas; + environment.Image = Image; + environment.createCanvasElement = env16.createCanvasElement || (() => new Canvas()); + environment.createImageElement = env16.createImageElement || (() => new Image()); + environment.ImageData = env16.ImageData || environment.ImageData; + environment.Video = env16.Video || environment.Video; + environment.fetch = env16.fetch || environment.fetch; + environment.readFile = env16.readFile || environment.readFile; +} +const env = { + getEnv, + setEnv, + initialize, + createBrowserEnv, + createFileSystem, + createNodejsEnv, + monkeyPatch, + isBrowser, + isNodejs: isNodejs.isNodejs +}; +initialize(); + +// src/dom/resolveInput.ts +function resolveInput(arg) { + if (!env.isNodejs() && typeof arg === "string") { + return document.getElementById(arg); + } + return arg; +} + +// src/dom/getContext2dOrThrow.ts +function getContext2dOrThrow(canvasArg) { + const {Canvas, CanvasRenderingContext2D: CanvasRenderingContext2D2} = env.getEnv(); + if (canvasArg instanceof CanvasRenderingContext2D2) { + return canvasArg; + } + const canvas = resolveInput(canvasArg); + if (!(canvas instanceof Canvas)) { + throw new Error("resolveContext2d - expected canvas to be of instance of Canvas"); + } + const ctx = canvas.getContext("2d"); + if (!ctx) { + throw new Error("resolveContext2d - canvas 2d context is null"); + } + return ctx; +} + +// src/draw/DrawTextField.ts +var AnchorPosition; +(function(AnchorPosition2) { + AnchorPosition2["TOP_LEFT"] = "TOP_LEFT"; + AnchorPosition2["TOP_RIGHT"] = "TOP_RIGHT"; + AnchorPosition2["BOTTOM_LEFT"] = "BOTTOM_LEFT"; + AnchorPosition2["BOTTOM_RIGHT"] = "BOTTOM_RIGHT"; +})(AnchorPosition || (AnchorPosition = {})); +class DrawTextFieldOptions { + constructor(options = {}) { + const {anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding} = options; + this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT; + this.backgroundColor = backgroundColor || "rgba(0, 0, 0, 0.5)"; + this.fontColor = fontColor || "rgba(255, 255, 255, 1)"; + this.fontSize = fontSize || 14; + this.fontStyle = fontStyle || "Georgia"; + this.padding = padding || 4; + } +} +class DrawTextField { + constructor(text, anchor, options = {}) { + this.text = typeof text === "string" ? [text] : text instanceof DrawTextField ? text.text : text; + this.anchor = anchor; + this.options = new DrawTextFieldOptions(options); + } + measureWidth(ctx) { + const {padding} = this.options; + return this.text.map((l) => ctx.measureText(l).width).reduce((w0, w1) => w0 < w1 ? w1 : w0, 0) + 2 * padding; + } + measureHeight() { + const {fontSize, padding} = this.options; + return this.text.length * fontSize + 2 * padding; + } + getUpperLeft(ctx, canvasDims) { + const {anchorPosition} = this.options; + const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT; + const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT; + const textFieldWidth = this.measureWidth(ctx); + const textFieldHeight = this.measureHeight(); + const x = isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x; + const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y; + if (canvasDims) { + const {width, height} = canvasDims; + const newX = Math.max(Math.min(x, width - textFieldWidth), 0); + const newY = Math.max(Math.min(y, height - textFieldHeight), 0); + return {x: newX, y: newY}; + } + return {x, y}; + } + draw(canvasArg) { + const canvas = resolveInput(canvasArg); + const ctx = getContext2dOrThrow(canvas); + const {backgroundColor, fontColor, fontSize, fontStyle, padding} = this.options; + ctx.font = `${fontSize}px ${fontStyle}`; + const maxTextWidth = this.measureWidth(ctx); + const textHeight = this.measureHeight(); + ctx.fillStyle = backgroundColor; + const upperLeft = this.getUpperLeft(ctx, canvas); + ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight); + ctx.fillStyle = fontColor; + this.text.forEach((textLine, i) => { + const x = padding + upperLeft.x; + const y = padding + upperLeft.y + (i + 1) * fontSize; + ctx.fillText(textLine, x, y); + }); + } +} + +// src/draw/DrawBox.ts +class DrawBoxOptions { + constructor(options = {}) { + const {boxColor, lineWidth, label, drawLabelOptions} = options; + this.boxColor = boxColor || "rgba(0, 0, 255, 1)"; + this.lineWidth = lineWidth || 2; + this.label = label; + const defaultDrawLabelOptions = { + anchorPosition: AnchorPosition.BOTTOM_LEFT, + backgroundColor: this.boxColor + }; + this.drawLabelOptions = new DrawTextFieldOptions(Object.assign({}, defaultDrawLabelOptions, drawLabelOptions)); + } +} +class DrawBox { + constructor(box, options = {}) { + this.box = new Box(box); + this.options = new DrawBoxOptions(options); + } + draw(canvasArg) { + const ctx = getContext2dOrThrow(canvasArg); + const {boxColor, lineWidth} = this.options; + const {x, y, width, height} = this.box; + ctx.strokeStyle = boxColor; + ctx.lineWidth = lineWidth; + ctx.strokeRect(x, y, width, height); + const {label} = this.options; + if (label) { + new DrawTextField([label], {x: x - lineWidth / 2, y}, this.options.drawLabelOptions).draw(canvasArg); + } + } +} + +// src/draw/drawDetections.ts +function drawDetections(canvasArg, detections) { + const detectionsArray = Array.isArray(detections) ? detections : [detections]; + detectionsArray.forEach((det) => { + const score = det instanceof FaceDetection ? det.score : isWithFaceDetection(det) ? det.detection.score : void 0; + const box = det instanceof FaceDetection ? det.box : isWithFaceDetection(det) ? det.detection.box : new Box(det); + const label = score ? `${round(score)}` : void 0; + new DrawBox(box, {label}).draw(canvasArg); + }); +} + +// src/dom/isMediaLoaded.ts +function isMediaLoaded(media) { + const {Image, Video} = env.getEnv(); + return media instanceof Image && media.complete || media instanceof Video && media.readyState >= 3; +} + +// src/dom/awaitMediaLoaded.ts +function awaitMediaLoaded(media) { + return new Promise((resolve, reject) => { + if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) { + return resolve(null); + } + function onLoad(e) { + if (!e.currentTarget) + return; + e.currentTarget.removeEventListener("load", onLoad); + e.currentTarget.removeEventListener("error", onError); + resolve(e); + } + function onError(e) { + if (!e.currentTarget) + return; + e.currentTarget.removeEventListener("load", onLoad); + e.currentTarget.removeEventListener("error", onError); + reject(e); + } + media.addEventListener("load", onLoad); + media.addEventListener("error", onError); + }); +} + +// src/dom/bufferToImage.ts +function bufferToImage(buf) { + return new Promise((resolve, reject) => { + if (!(buf instanceof Blob)) { + return reject("bufferToImage - expected buf to be of type: Blob"); + } + const reader = new FileReader(); + reader.onload = () => { + if (typeof reader.result !== "string") { + return reject("bufferToImage - expected reader.result to be a string, in onload"); + } + const img = env.getEnv().createImageElement(); + img.onload = () => resolve(img); + img.onerror = reject; + img.src = reader.result; + }; + reader.onerror = reject; + reader.readAsDataURL(buf); + }); +} + +// src/dom/getMediaDimensions.ts +function getMediaDimensions(input) { + const {Image, Video} = env.getEnv(); + if (input instanceof Image) { + return new Dimensions(input.naturalWidth, input.naturalHeight); + } + if (input instanceof Video) { + return new Dimensions(input.videoWidth, input.videoHeight); + } + return new Dimensions(input.width, input.height); +} + +// src/dom/createCanvas.ts +function createCanvas({width, height}) { + const {createCanvasElement} = env.getEnv(); + const canvas = createCanvasElement(); + canvas.width = width; + canvas.height = height; + return canvas; +} +function createCanvasFromMedia(media, dims) { + const {ImageData: ImageData2} = env.getEnv(); + if (!(media instanceof ImageData2) && !isMediaLoaded(media)) { + throw new Error("createCanvasFromMedia - media has not finished loading yet"); + } + const {width, height} = dims || getMediaDimensions(media); + const canvas = createCanvas({width, height}); + if (media instanceof ImageData2) { + getContext2dOrThrow(canvas).putImageData(media, 0, 0); + } else { + getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height); + } + return canvas; +} + +// src/dom/imageTensorToCanvas.ts +import { + browser, + tidy as tidy3 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +async function imageTensorToCanvas(imgTensor, canvas) { + const targetCanvas = canvas || env.getEnv().createCanvasElement(); + const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0); + const imgTensor3D = tidy3(() => imgTensor.as3D(height, width, numChannels).toInt()); + await browser.toPixels(imgTensor3D, targetCanvas); + imgTensor3D.dispose(); + return targetCanvas; +} + +// src/dom/isMediaElement.ts +function isMediaElement(input) { + const {Image, Canvas, Video} = env.getEnv(); + return input instanceof Image || input instanceof Canvas || input instanceof Video; +} + +// src/dom/imageToSquare.ts +function imageToSquare(input, inputSize, centerImage = false) { + const {Image, Canvas} = env.getEnv(); + if (!(input instanceof Image || input instanceof Canvas)) { + throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement"); + } + const dims = getMediaDimensions(input); + const scale2 = inputSize / Math.max(dims.height, dims.width); + const width = scale2 * dims.width; + const height = scale2 * dims.height; + const targetCanvas = createCanvas({width: inputSize, height: inputSize}); + const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input); + const offset = Math.abs(width - height) / 2; + const dx = centerImage && width < height ? offset : 0; + const dy = centerImage && height < width ? offset : 0; + getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height); + return targetCanvas; +} + +// src/dom/NetInput.ts +import { + Tensor as Tensor2, + browser as browser2, + cast as cast2, + image, + stack, + tidy as tidy4 +} from "@tensorflow/tfjs-core"; +class NetInput { + constructor(inputs, treatAsBatchInput = false) { + this._imageTensors = []; + this._canvases = []; + this._treatAsBatchInput = false; + this._inputDimensions = []; + if (!Array.isArray(inputs)) { + throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`); + } + this._treatAsBatchInput = treatAsBatchInput; + this._batchSize = inputs.length; + inputs.forEach((input, idx) => { + if (isTensor3D(input)) { + this._imageTensors[idx] = input; + this._inputDimensions[idx] = input.shape; + return; + } + if (isTensor4D(input)) { + const batchSize = input.shape[0]; + if (batchSize !== 1) { + throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`); + } + this._imageTensors[idx] = input; + this._inputDimensions[idx] = input.shape.slice(1); + return; + } + const canvas = input instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input); + this._canvases[idx] = canvas; + this._inputDimensions[idx] = [canvas.height, canvas.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 range(this.batchSize, 0, 1).map((_, batchIdx) => this.getReshapedInputDimensions(batchIdx)); + } + getInput(batchIdx) { + return this.canvases[batchIdx] || this.imageTensors[batchIdx]; + } + getInputDimensions(batchIdx) { + return this._inputDimensions[batchIdx]; + } + getInputHeight(batchIdx) { + return this._inputDimensions[batchIdx][0]; + } + getInputWidth(batchIdx) { + return this._inputDimensions[batchIdx][1]; + } + getReshapedInputDimensions(batchIdx) { + if (typeof this.inputSize !== "number") { + throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet"); + } + const width = this.getInputWidth(batchIdx); + const height = this.getInputHeight(batchIdx); + return computeReshapedDimensions({width, height}, this.inputSize); + } + toBatchTensor(inputSize, isCenterInputs = true) { + this._inputSize = inputSize; + return tidy4(() => { + const inputTensors = range(this.batchSize, 0, 1).map((batchIdx) => { + const input = this.getInput(batchIdx); + if (input instanceof Tensor2) { + let imgTensor = isTensor4D(input) ? input : input.expandDims(); + imgTensor = padToSquare(imgTensor, isCenterInputs); + if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) { + imgTensor = image.resizeBilinear(imgTensor, [inputSize, inputSize]); + } + return imgTensor.as3D(inputSize, inputSize, 3); + } + if (input instanceof env.getEnv().Canvas) { + return browser2.fromPixels(imageToSquare(input, inputSize, isCenterInputs)); + } + throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`); + }); + const batchTensor = stack(inputTensors.map((t) => cast2(t, "float32"))).as4D(this.batchSize, inputSize, inputSize, 3); + return batchTensor; + }); + } +} + +// src/dom/toNetInput.ts +async function toNetInput(inputs) { + if (inputs instanceof NetInput) { + return inputs; + } + let inputArgArray = Array.isArray(inputs) ? inputs : [inputs]; + if (!inputArgArray.length) { + throw new Error("toNetInput - empty array passed as input"); + } + const getIdxHint = (idx) => Array.isArray(inputs) ? ` at input index ${idx}:` : ""; + const inputArray = inputArgArray.map(resolveInput); + inputArray.forEach((input, i) => { + if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) { + if (typeof inputArgArray[i] === "string") { + throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`); + } + throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`); + } + if (isTensor4D(input)) { + const batchSize = input.shape[0]; + if (batchSize !== 1) { + throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`); + } + } + }); + await Promise.all(inputArray.map((input) => isMediaElement(input) && awaitMediaLoaded(input))); + return new NetInput(inputArray, Array.isArray(inputs)); +} + +// src/dom/extractFaces.ts +async function extractFaces(input, detections) { + const {Canvas} = env.getEnv(); + let canvas = input; + if (!(input instanceof Canvas)) { + const netInput = await toNetInput(input); + if (netInput.batchSize > 1) { + throw new Error("extractFaces - batchSize > 1 not supported"); + } + const tensorOrCanvas = netInput.getInput(0); + canvas = tensorOrCanvas instanceof Canvas ? tensorOrCanvas : await imageTensorToCanvas(tensorOrCanvas); + } + const ctx = getContext2dOrThrow(canvas); + const boxes = detections.map((det) => det instanceof FaceDetection ? det.forSize(canvas.width, canvas.height).box.floor() : det).map((box) => box.clipAtImageBorders(canvas.width, canvas.height)); + return boxes.map(({x, y, width, height}) => { + const faceImg = createCanvas({width, height}); + getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x, y, width, height), 0, 0); + return faceImg; + }); +} + +// src/dom/extractFaceTensors.ts +import { + slice3d, + tidy as tidy5 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +async function extractFaceTensors(imageTensor, detections) { + if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) { + throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D"); + } + if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) { + throw new Error("extractFaceTensors - batchSize > 1 not supported"); + } + return tidy5(() => { + const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0); + const boxes = detections.map((det) => det instanceof FaceDetection ? det.forSize(imgWidth, imgHeight).box : det).map((box) => box.clipAtImageBorders(imgWidth, imgHeight)); + const faceTensors = boxes.map(({x, y, width, height}) => slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels])); + return faceTensors; + }); +} + +// src/dom/fetchOrThrow.ts +async function fetchOrThrow(url, init) { + const fetch = env.getEnv().fetch; + const res = await fetch(url, init); + if (!(res.status < 400)) { + throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`); + } + return res; +} + +// src/dom/fetchImage.ts +async function fetchImage(uri) { + const res = await fetchOrThrow(uri); + const blob = await res.blob(); + if (!blob.type.startsWith("image/")) { + throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`); + } + return bufferToImage(blob); +} + +// src/dom/fetchJson.ts +async function fetchJson(uri) { + return (await fetchOrThrow(uri)).json(); +} + +// src/dom/fetchNetWeights.ts +async function fetchNetWeights(uri) { + return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer()); +} + +// src/common/getModelUris.ts +function getModelUris(uri, defaultModelName) { + const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`; + if (!uri) { + return { + modelBaseUri: "", + manifestUri: defaultManifestFilename + }; + } + if (uri === "/") { + return { + modelBaseUri: "/", + manifestUri: `/${defaultManifestFilename}` + }; + } + const protocol = uri.startsWith("http://") ? "http://" : uri.startsWith("https://") ? "https://" : ""; + uri = uri.replace(protocol, ""); + const parts = uri.split("/").filter((s) => s); + const manifestFile = uri.endsWith(".json") ? parts[parts.length - 1] : defaultManifestFilename; + let modelBaseUri = protocol + (uri.endsWith(".json") ? parts.slice(0, parts.length - 1) : parts).join("/"); + modelBaseUri = uri.startsWith("/") ? `/${modelBaseUri}` : modelBaseUri; + return { + modelBaseUri, + manifestUri: modelBaseUri === "/" ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}` + }; +} + +// src/dom/loadWeightMap.ts +import { + io +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +async function loadWeightMap(uri, defaultModelName) { + const {manifestUri, modelBaseUri} = getModelUris(uri, defaultModelName); + let manifest = await fetchJson(manifestUri); + return io.loadWeights(manifest, modelBaseUri); +} + +// src/dom/matchDimensions.ts +function matchDimensions(input, reference, useMediaDimensions = false) { + const {width, height} = useMediaDimensions ? getMediaDimensions(reference) : reference; + input.width = width; + input.height = height; + return {width, height}; +} + +// src/dom/types.ts + +// src/dom/index.ts + +// src/NeuralNetwork.ts +import { + Tensor as Tensor3, + Variable, + io as io2, + tensor +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class NeuralNetwork { + constructor(_name) { + this._name = _name; + this._params = void 0; + this._paramMappings = []; + } + get params() { + return this._params; + } + get paramMappings() { + return this._paramMappings; + } + get isLoaded() { + return !!this.params; + } + getParamFromPath(paramPath) { + const {obj, objProp} = this.traversePropertyPath(paramPath); + return obj[objProp]; + } + reassignParamFromPath(paramPath, tensor2) { + const {obj, objProp} = this.traversePropertyPath(paramPath); + obj[objProp].dispose(); + obj[objProp] = tensor2; + } + getParamList() { + return this._paramMappings.map(({paramPath}) => ({ + path: paramPath, + tensor: this.getParamFromPath(paramPath) + })); + } + getTrainableParams() { + return this.getParamList().filter((param) => param.tensor instanceof Variable); + } + getFrozenParams() { + return this.getParamList().filter((param) => !(param.tensor instanceof Variable)); + } + variable() { + this.getFrozenParams().forEach(({path, tensor: tensor2}) => { + this.reassignParamFromPath(path, tensor2.variable()); + }); + } + freeze() { + this.getTrainableParams().forEach(({path, tensor: variable}) => { + const tensor2 = tensor(variable.dataSync()); + variable.dispose(); + this.reassignParamFromPath(path, tensor2); + }); + } + dispose(throwOnRedispose = true) { + this.getParamList().forEach((param) => { + if (throwOnRedispose && param.tensor.isDisposed) { + throw new Error(`param tensor has already been disposed for path ${param.path}`); + } + param.tensor.dispose(); + }); + this._params = void 0; + } + serializeParams() { + return new Float32Array(this.getParamList().map(({tensor: tensor2}) => Array.from(tensor2.dataSync())).reduce((flat, arr) => flat.concat(arr))); + } + async load(weightsOrUrl) { + if (weightsOrUrl instanceof Float32Array) { + this.extractWeights(weightsOrUrl); + return; + } + await this.loadFromUri(weightsOrUrl); + } + async loadFromUri(uri) { + if (uri && typeof uri !== "string") { + throw new Error(`${this._name}.loadFromUri - expected model uri`); + } + const weightMap = await loadWeightMap(uri, this.getDefaultModelName()); + this.loadFromWeightMap(weightMap); + } + async loadFromDisk(filePath) { + if (filePath && typeof filePath !== "string") { + throw new Error(`${this._name}.loadFromDisk - expected model file path`); + } + const {readFile} = env.getEnv(); + const {manifestUri, modelBaseUri} = getModelUris(filePath, this.getDefaultModelName()); + const fetchWeightsFromDisk = (filePaths) => Promise.all(filePaths.map((filePath2) => readFile(filePath2).then((buf) => buf.buffer))); + const loadWeights = io2.weightsLoaderFactory(fetchWeightsFromDisk); + const manifest = JSON.parse((await readFile(manifestUri)).toString()); + const weightMap = await loadWeights(manifest, modelBaseUri); + this.loadFromWeightMap(weightMap); + } + loadFromWeightMap(weightMap) { + const { + paramMappings, + params + } = this.extractParamsFromWeigthMap(weightMap); + this._paramMappings = paramMappings; + this._params = params; + } + extractWeights(weights) { + const { + paramMappings, + params + } = this.extractParams(weights); + this._paramMappings = paramMappings; + this._params = params; + } + traversePropertyPath(paramPath) { + if (!this.params) { + throw new Error(`traversePropertyPath - model has no loaded params`); + } + const result = paramPath.split("/").reduce((res, objProp2) => { + if (!res.nextObj.hasOwnProperty(objProp2)) { + throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`); + } + return {obj: res.nextObj, objProp: objProp2, nextObj: res.nextObj[objProp2]}; + }, {nextObj: this.params}); + const {obj, objProp} = result; + if (!obj || !objProp || !(obj[objProp] instanceof Tensor3)) { + throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`); + } + return {obj, objProp}; + } +} + +// src/common/depthwiseSeparableConv.ts +import { + add, + separableConv2d, + tidy as tidy6 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function depthwiseSeparableConv(x, params, stride) { + return tidy6(() => { + let out = separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, "same"); + out = add(out, params.bias); + return out; + }); +} + +// src/faceFeatureExtractor/denseBlock.ts +import { + add as add2, + conv2d, + relu, + tidy as tidy7 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function denseBlock3(x, denseBlockParams, isFirstLayer = false) { + return tidy7(() => { + const out1 = relu(isFirstLayer ? add2(conv2d(x, denseBlockParams.conv0.filters, [2, 2], "same"), denseBlockParams.conv0.bias) : depthwiseSeparableConv(x, denseBlockParams.conv0, [2, 2])); + const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]); + const in3 = relu(add2(out1, out2)); + const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]); + return relu(add2(out1, add2(out2, out3))); + }); +} +function denseBlock4(x, denseBlockParams, isFirstLayer = false, isScaleDown = true) { + return tidy7(() => { + const out1 = relu(isFirstLayer ? add2(conv2d(x, denseBlockParams.conv0.filters, isScaleDown ? [2, 2] : [1, 1], "same"), denseBlockParams.conv0.bias) : depthwiseSeparableConv(x, denseBlockParams.conv0, isScaleDown ? [2, 2] : [1, 1])); + const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]); + const in3 = relu(add2(out1, out2)); + const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]); + const in4 = relu(add2(out1, add2(out2, out3))); + const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1]); + return relu(add2(out1, add2(out2, add2(out3, out4)))); + }); +} + +// src/common/convLayer.ts +import { + add as add3, + conv2d as conv2d2, + relu as relu2, + tidy as tidy8 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function convLayer(x, params, padding = "same", withRelu = false) { + return tidy8(() => { + const out = add3(conv2d2(x, params.filters, [1, 1], padding), params.bias); + return withRelu ? relu2(out) : out; + }); +} + +// src/common/disposeUnusedWeightTensors.ts +function disposeUnusedWeightTensors(weightMap, paramMappings) { + Object.keys(weightMap).forEach((path) => { + if (!paramMappings.some((pm) => pm.originalPath === path)) { + weightMap[path].dispose(); + } + }); +} + +// src/common/extractConvParamsFactory.ts +import { + tensor1d, + tensor4d +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractConvParamsFactory(extractWeights, paramMappings) { + return function(channelsIn, channelsOut, filterSize, mappedPrefix) { + const filters = tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); + const bias = tensor1d(extractWeights(channelsOut)); + paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/bias`}); + return {filters, bias}; + }; +} + +// src/common/extractFCParamsFactory.ts +import { + tensor1d as tensor1d2, + tensor2d +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractFCParamsFactory(extractWeights, paramMappings) { + return function(channelsIn, channelsOut, mappedPrefix) { + const fc_weights = tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); + const fc_bias = tensor1d2(extractWeights(channelsOut)); + paramMappings.push({paramPath: `${mappedPrefix}/weights`}, {paramPath: `${mappedPrefix}/bias`}); + return { + weights: fc_weights, + bias: fc_bias + }; + }; +} + +// src/common/types.ts +class SeparableConvParams { + constructor(depthwise_filter, pointwise_filter, bias) { + this.depthwise_filter = depthwise_filter; + this.pointwise_filter = pointwise_filter; + this.bias = bias; + } +} + +// src/common/extractSeparableConvParamsFactory.ts +import { + tensor1d as tensor1d3, + tensor4d as tensor4d2 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractSeparableConvParamsFactory(extractWeights, paramMappings) { + return function(channelsIn, channelsOut, mappedPrefix) { + const depthwise_filter = tensor4d2(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]); + const pointwise_filter = tensor4d2(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]); + const bias = tensor1d3(extractWeights(channelsOut)); + paramMappings.push({paramPath: `${mappedPrefix}/depthwise_filter`}, {paramPath: `${mappedPrefix}/pointwise_filter`}, {paramPath: `${mappedPrefix}/bias`}); + return new SeparableConvParams(depthwise_filter, pointwise_filter, bias); + }; +} +function loadSeparableConvParamsFactory(extractWeightEntry) { + return function(prefix) { + const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4); + const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4); + const bias = extractWeightEntry(`${prefix}/bias`, 1); + return new SeparableConvParams(depthwise_filter, pointwise_filter, bias); + }; +} + +// src/common/extractWeightEntryFactory.ts +function extractWeightEntryFactory(weightMap, paramMappings) { + return function(originalPath, paramRank, mappedPath) { + const tensor2 = weightMap[originalPath]; + if (!isTensor(tensor2, paramRank)) { + throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`); + } + paramMappings.push({originalPath, paramPath: mappedPath || originalPath}); + return tensor2; + }; +} + +// src/common/extractWeightsFactory.ts +function extractWeightsFactory(weights) { + let remainingWeights = weights; + function extractWeights(numWeights) { + const ret = remainingWeights.slice(0, numWeights); + remainingWeights = remainingWeights.slice(numWeights); + return ret; + } + function getRemainingWeights() { + return remainingWeights; + } + return { + extractWeights, + getRemainingWeights + }; +} + +// src/common/index.ts + +// src/faceFeatureExtractor/extractorsFactory.ts +function extractorsFactory(extractWeights, paramMappings) { + const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); + const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); + function extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer = false) { + const conv0 = isFirstLayer ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`) : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`); + const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`); + const conv22 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`); + return {conv0, conv1, conv2: conv22}; + } + function extractDenseBlock4Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer = false) { + const {conv0, conv1, conv2: conv22} = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer); + const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`); + return {conv0, conv1, conv2: conv22, conv3}; + } + return { + extractDenseBlock3Params, + extractDenseBlock4Params + }; +} + +// src/faceFeatureExtractor/extractParams.ts +function extractParams(weights) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const { + extractDenseBlock4Params + } = extractorsFactory(extractWeights, paramMappings); + const dense0 = extractDenseBlock4Params(3, 32, "dense0", true); + const dense1 = extractDenseBlock4Params(32, 64, "dense1"); + const dense2 = extractDenseBlock4Params(64, 128, "dense2"); + const dense3 = extractDenseBlock4Params(128, 256, "dense3"); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + paramMappings, + params: {dense0, dense1, dense2, dense3} + }; +} + +// src/common/loadConvParamsFactory.ts +function loadConvParamsFactory(extractWeightEntry) { + return function(prefix) { + const filters = extractWeightEntry(`${prefix}/filters`, 4); + const bias = extractWeightEntry(`${prefix}/bias`, 1); + return {filters, bias}; + }; +} + +// src/faceFeatureExtractor/loadParamsFactory.ts +function loadParamsFactory(weightMap, paramMappings) { + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + const extractConvParams = loadConvParamsFactory(extractWeightEntry); + const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); + function extractDenseBlock3Params(prefix, isFirstLayer = false) { + const conv0 = isFirstLayer ? extractConvParams(`${prefix}/conv0`) : extractSeparableConvParams(`${prefix}/conv0`); + const conv1 = extractSeparableConvParams(`${prefix}/conv1`); + const conv22 = extractSeparableConvParams(`${prefix}/conv2`); + return {conv0, conv1, conv2: conv22}; + } + function extractDenseBlock4Params(prefix, isFirstLayer = false) { + const conv0 = isFirstLayer ? extractConvParams(`${prefix}/conv0`) : extractSeparableConvParams(`${prefix}/conv0`); + const conv1 = extractSeparableConvParams(`${prefix}/conv1`); + const conv22 = extractSeparableConvParams(`${prefix}/conv2`); + const conv3 = extractSeparableConvParams(`${prefix}/conv3`); + return {conv0, conv1, conv2: conv22, conv3}; + } + return { + extractDenseBlock3Params, + extractDenseBlock4Params + }; +} + +// src/faceFeatureExtractor/extractParamsFromWeigthMap.ts +function extractParamsFromWeigthMap(weightMap) { + const paramMappings = []; + const { + extractDenseBlock4Params + } = loadParamsFactory(weightMap, paramMappings); + const params = { + dense0: extractDenseBlock4Params("dense0", true), + dense1: extractDenseBlock4Params("dense1"), + dense2: extractDenseBlock4Params("dense2"), + dense3: extractDenseBlock4Params("dense3") + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/faceFeatureExtractor/FaceFeatureExtractor.ts +import { + avgPool, + cast as cast3, + scalar, + tidy as tidy9 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class FaceFeatureExtractor extends NeuralNetwork { + constructor() { + super("FaceFeatureExtractor"); + } + forwardInput(input) { + const {params} = this; + if (!params) { + throw new Error("FaceFeatureExtractor - load model before inference"); + } + return tidy9(() => { + const batchTensor = cast3(input.toBatchTensor(112, true), "float32"); + const meanRgb = [122.782, 117.001, 104.298]; + const normalized = normalize(batchTensor, meanRgb).div(scalar(255)); + let out = denseBlock4(normalized, params.dense0, true); + out = denseBlock4(out, params.dense1); + out = denseBlock4(out, params.dense2); + out = denseBlock4(out, params.dense3); + out = avgPool(out, [7, 7], [2, 2], "valid"); + return out; + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + getDefaultModelName() { + return "face_feature_extractor_model"; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMap(weightMap); + } + extractParams(weights) { + return extractParams(weights); + } +} + +// src/common/fullyConnectedLayer.ts +import { + add as add4, + matMul, + tidy as tidy10 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function fullyConnectedLayer(x, params) { + return tidy10(() => add4(matMul(x, params.weights), params.bias)); +} + +// src/faceProcessor/extractParams.ts +function extractParams3(weights, channelsIn, channelsOut) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings); + const fc = extractFCParams(channelsIn, channelsOut, "fc"); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + paramMappings, + params: {fc} + }; +} + +// src/faceProcessor/extractParamsFromWeigthMap.ts +function extractParamsFromWeigthMap3(weightMap) { + const paramMappings = []; + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + function extractFcParams(prefix) { + const weights = extractWeightEntry(`${prefix}/weights`, 2); + const bias = extractWeightEntry(`${prefix}/bias`, 1); + return {weights, bias}; + } + const params = { + fc: extractFcParams("fc") + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/faceProcessor/util.ts +function seperateWeightMaps(weightMap) { + const featureExtractorMap = {}; + const classifierMap = {}; + Object.keys(weightMap).forEach((key) => { + const map = key.startsWith("fc") ? classifierMap : featureExtractorMap; + map[key] = weightMap[key]; + }); + return {featureExtractorMap, classifierMap}; +} + +// src/faceProcessor/FaceProcessor.ts +import { + tidy as tidy11 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class FaceProcessor extends NeuralNetwork { + constructor(_name, faceFeatureExtractor) { + super(_name); + this._faceFeatureExtractor = faceFeatureExtractor; + } + get faceFeatureExtractor() { + return this._faceFeatureExtractor; + } + runNet(input) { + const {params} = this; + if (!params) { + throw new Error(`${this._name} - load model before inference`); + } + return tidy11(() => { + const bottleneckFeatures = input instanceof NetInput ? this.faceFeatureExtractor.forwardInput(input) : input; + return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc); + }); + } + dispose(throwOnRedispose = true) { + this.faceFeatureExtractor.dispose(throwOnRedispose); + super.dispose(throwOnRedispose); + } + loadClassifierParams(weights) { + const {params, paramMappings} = this.extractClassifierParams(weights); + this._params = params; + this._paramMappings = paramMappings; + } + extractClassifierParams(weights) { + return extractParams3(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut()); + } + extractParamsFromWeigthMap(weightMap) { + const {featureExtractorMap, classifierMap} = seperateWeightMaps(weightMap); + this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap); + return extractParamsFromWeigthMap3(classifierMap); + } + extractParams(weights) { + const cIn = this.getClassifierChannelsIn(); + const cOut = this.getClassifierChannelsOut(); + const classifierWeightSize = cOut * cIn + cOut; + const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize); + const classifierWeights = weights.slice(weights.length - classifierWeightSize); + this.faceFeatureExtractor.extractWeights(featureExtractorWeights); + return this.extractClassifierParams(classifierWeights); + } +} + +// src/faceExpressionNet/FaceExpressions.ts +const FACE_EXPRESSION_LABELS = ["neutral", "happy", "sad", "angry", "fearful", "disgusted", "surprised"]; +class FaceExpressions { + constructor(probabilities) { + if (probabilities.length !== 7) { + throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`); + } + FACE_EXPRESSION_LABELS.forEach((expression, idx) => { + this[expression] = probabilities[idx]; + }); + } + asSortedArray() { + return FACE_EXPRESSION_LABELS.map((expression) => ({expression, probability: this[expression]})).sort((e0, e1) => e1.probability - e0.probability); + } +} + +// src/faceExpressionNet/FaceExpressionNet.ts +import { + softmax, + tidy as tidy12, + unstack +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class FaceExpressionNet extends FaceProcessor { + constructor(faceFeatureExtractor = new FaceFeatureExtractor()) { + super("FaceExpressionNet", faceFeatureExtractor); + } + forwardInput(input) { + return tidy12(() => softmax(this.runNet(input))); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + async predictExpressions(input) { + const netInput = await toNetInput(input); + const out = await this.forwardInput(netInput); + const probabilitesByBatch = await Promise.all(unstack(out).map(async (t) => { + const data = await t.data(); + t.dispose(); + return data; + })); + out.dispose(); + const predictionsByBatch = probabilitesByBatch.map((probabilites) => new FaceExpressions(probabilites)); + return netInput.isBatchInput ? predictionsByBatch : predictionsByBatch[0]; + } + getDefaultModelName() { + return "face_expression_model"; + } + getClassifierChannelsIn() { + return 256; + } + getClassifierChannelsOut() { + return 7; + } +} + +// src/faceExpressionNet/index.ts + +// src/factories/WithFaceExpressions.ts +function isWithFaceExpressions(obj) { + return obj["expressions"] instanceof FaceExpressions; +} +function extendWithFaceExpressions(sourceObj, expressions) { + const extension = {expressions}; + return Object.assign({}, sourceObj, extension); +} + +// src/draw/drawFaceExpressions.ts +function drawFaceExpressions(canvasArg, faceExpressions, minConfidence = 0.1, textFieldAnchor) { + const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions]; + faceExpressionsArray.forEach((e) => { + const expr = e instanceof FaceExpressions ? e : isWithFaceExpressions(e) ? e.expressions : void 0; + if (!expr) { + throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof"); + } + const sorted = expr.asSortedArray(); + const resultsToDisplay = sorted.filter((expr2) => expr2.probability > minConfidence); + const anchor = isWithFaceDetection(e) ? e.detection.box.bottomLeft : textFieldAnchor || new Point(0, 0); + const drawTextField = new DrawTextField(resultsToDisplay.map((expr2) => `${expr2.expression} (${round(expr2.probability)})`), anchor); + drawTextField.draw(canvasArg); + }); +} + +// src/factories/WithFaceLandmarks.ts +function isWithFaceLandmarks(obj) { + return isWithFaceDetection(obj) && obj["landmarks"] instanceof FaceLandmarks && obj["unshiftedLandmarks"] instanceof FaceLandmarks && obj["alignedRect"] instanceof FaceDetection; +} +function extendWithFaceLandmarks(sourceObj, unshiftedLandmarks) { + const {box: shift} = sourceObj.detection; + const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y); + const rect = landmarks.align(); + const {imageDims} = sourceObj.detection; + const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims); + const extension = { + landmarks, + unshiftedLandmarks, + alignedRect + }; + return Object.assign({}, sourceObj, extension); +} + +// src/draw/DrawFaceLandmarks.ts +class DrawFaceLandmarksOptions { + constructor(options = {}) { + const {drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor} = options; + this.drawLines = drawLines; + this.drawPoints = drawPoints; + this.lineWidth = lineWidth || 1; + this.pointSize = pointSize || 2; + this.lineColor = lineColor || "rgba(0, 255, 255, 1)"; + this.pointColor = pointColor || "rgba(255, 0, 255, 1)"; + } +} +class DrawFaceLandmarks { + constructor(faceLandmarks, options = {}) { + this.faceLandmarks = faceLandmarks; + this.options = new DrawFaceLandmarksOptions(options); + } + draw(canvasArg) { + const ctx = getContext2dOrThrow(canvasArg); + const {drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor} = this.options; + if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) { + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + drawContour(ctx, this.faceLandmarks.getJawOutline()); + drawContour(ctx, this.faceLandmarks.getLeftEyeBrow()); + drawContour(ctx, this.faceLandmarks.getRightEyeBrow()); + drawContour(ctx, this.faceLandmarks.getNose()); + drawContour(ctx, this.faceLandmarks.getLeftEye(), true); + drawContour(ctx, this.faceLandmarks.getRightEye(), true); + drawContour(ctx, this.faceLandmarks.getMouth(), true); + } + if (drawPoints) { + ctx.strokeStyle = pointColor; + ctx.fillStyle = pointColor; + const drawPoint = (pt) => { + ctx.beginPath(); + ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI); + ctx.fill(); + }; + this.faceLandmarks.positions.forEach(drawPoint); + } + } +} +function drawFaceLandmarks(canvasArg, faceLandmarks) { + const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks]; + faceLandmarksArray.forEach((f) => { + const landmarks = f instanceof FaceLandmarks ? f : isWithFaceLandmarks(f) ? f.landmarks : void 0; + if (!landmarks) { + throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof"); + } + new DrawFaceLandmarks(landmarks).draw(canvasArg); + }); +} + +// src/draw/index.ts +const draw_exports = {}; +__export(draw_exports, { + AnchorPosition: () => AnchorPosition, + DrawBox: () => DrawBox, + DrawBoxOptions: () => DrawBoxOptions, + DrawFaceLandmarks: () => DrawFaceLandmarks, + DrawFaceLandmarksOptions: () => DrawFaceLandmarksOptions, + DrawTextField: () => DrawTextField, + DrawTextFieldOptions: () => DrawTextFieldOptions, + drawContour: () => drawContour, + drawDetections: () => drawDetections, + drawFaceExpressions: () => drawFaceExpressions, + drawFaceLandmarks: () => drawFaceLandmarks +}); + +// src/xception/extractParams.ts +function extractorsFactory3(extractWeights, paramMappings) { + const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); + const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); + function extractReductionBlockParams(channelsIn, channelsOut, mappedPrefix) { + const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`); + const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`); + const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`); + return {separable_conv0, separable_conv1, expansion_conv}; + } + function extractMainBlockParams(channels, mappedPrefix) { + const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`); + const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`); + const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`); + return {separable_conv0, separable_conv1, separable_conv2}; + } + return { + extractConvParams, + extractSeparableConvParams, + extractReductionBlockParams, + extractMainBlockParams + }; +} +function extractParams5(weights, numMainBlocks) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const { + extractConvParams, + extractSeparableConvParams, + extractReductionBlockParams, + extractMainBlockParams + } = extractorsFactory3(extractWeights, paramMappings); + const entry_flow_conv_in = extractConvParams(3, 32, 3, "entry_flow/conv_in"); + const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, "entry_flow/reduction_block_0"); + const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, "entry_flow/reduction_block_1"); + const entry_flow = { + conv_in: entry_flow_conv_in, + reduction_block_0: entry_flow_reduction_block_0, + reduction_block_1: entry_flow_reduction_block_1 + }; + const middle_flow = {}; + range(numMainBlocks, 0, 1).forEach((idx) => { + middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`); + }); + const exit_flow_reduction_block = extractReductionBlockParams(128, 256, "exit_flow/reduction_block"); + const exit_flow_separable_conv = extractSeparableConvParams(256, 512, "exit_flow/separable_conv"); + const exit_flow = { + reduction_block: exit_flow_reduction_block, + separable_conv: exit_flow_separable_conv + }; + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + paramMappings, + params: {entry_flow, middle_flow, exit_flow} + }; +} + +// src/xception/extractParamsFromWeigthMap.ts +function loadParamsFactory3(weightMap, paramMappings) { + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + const extractConvParams = loadConvParamsFactory(extractWeightEntry); + const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); + function extractReductionBlockParams(mappedPrefix) { + const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`); + const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`); + const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`); + return {separable_conv0, separable_conv1, expansion_conv}; + } + function extractMainBlockParams(mappedPrefix) { + const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`); + const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`); + const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`); + return {separable_conv0, separable_conv1, separable_conv2}; + } + return { + extractConvParams, + extractSeparableConvParams, + extractReductionBlockParams, + extractMainBlockParams + }; +} +function extractParamsFromWeigthMap5(weightMap, numMainBlocks) { + const paramMappings = []; + const { + extractConvParams, + extractSeparableConvParams, + extractReductionBlockParams, + extractMainBlockParams + } = loadParamsFactory3(weightMap, paramMappings); + const entry_flow_conv_in = extractConvParams("entry_flow/conv_in"); + const entry_flow_reduction_block_0 = extractReductionBlockParams("entry_flow/reduction_block_0"); + const entry_flow_reduction_block_1 = extractReductionBlockParams("entry_flow/reduction_block_1"); + const entry_flow = { + conv_in: entry_flow_conv_in, + reduction_block_0: entry_flow_reduction_block_0, + reduction_block_1: entry_flow_reduction_block_1 + }; + const middle_flow = {}; + range(numMainBlocks, 0, 1).forEach((idx) => { + middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`); + }); + const exit_flow_reduction_block = extractReductionBlockParams("exit_flow/reduction_block"); + const exit_flow_separable_conv = extractSeparableConvParams("exit_flow/separable_conv"); + const exit_flow = { + reduction_block: exit_flow_reduction_block, + separable_conv: exit_flow_separable_conv + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params: {entry_flow, middle_flow, exit_flow}, paramMappings}; +} + +// src/xception/TinyXception.ts +import { + add as add5, + cast as cast4, + conv2d as conv2d3, + maxPool, + relu as relu3, + scalar as scalar2, + tidy as tidy13 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function conv(x, params, stride) { + return add5(conv2d3(x, params.filters, stride, "same"), params.bias); +} +function reductionBlock(x, params, isActivateInput = true) { + let out = isActivateInput ? relu3(x) : x; + out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1]); + out = depthwiseSeparableConv(relu3(out), params.separable_conv1, [1, 1]); + out = maxPool(out, [3, 3], [2, 2], "same"); + out = add5(out, conv(x, params.expansion_conv, [2, 2])); + return out; +} +function mainBlock(x, params) { + let out = depthwiseSeparableConv(relu3(x), params.separable_conv0, [1, 1]); + out = depthwiseSeparableConv(relu3(out), params.separable_conv1, [1, 1]); + out = depthwiseSeparableConv(relu3(out), params.separable_conv2, [1, 1]); + out = add5(out, x); + return out; +} +class TinyXception extends NeuralNetwork { + constructor(numMainBlocks) { + super("TinyXception"); + this._numMainBlocks = numMainBlocks; + } + forwardInput(input) { + const {params} = this; + if (!params) { + throw new Error("TinyXception - load model before inference"); + } + return tidy13(() => { + const batchTensor = cast4(input.toBatchTensor(112, true), "float32"); + const meanRgb = [122.782, 117.001, 104.298]; + const normalized = normalize(batchTensor, meanRgb).div(scalar2(256)); + let out = relu3(conv(normalized, params.entry_flow.conv_in, [2, 2])); + out = reductionBlock(out, params.entry_flow.reduction_block_0, false); + out = reductionBlock(out, params.entry_flow.reduction_block_1); + range(this._numMainBlocks, 0, 1).forEach((idx) => { + out = mainBlock(out, params.middle_flow[`main_block_${idx}`]); + }); + out = reductionBlock(out, params.exit_flow.reduction_block); + out = relu3(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1])); + return out; + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + getDefaultModelName() { + return "tiny_xception_model"; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMap5(weightMap, this._numMainBlocks); + } + extractParams(weights) { + return extractParams5(weights, this._numMainBlocks); + } +} + +// src/ageGenderNet/extractParams.ts +function extractParams7(weights) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings); + const age = extractFCParams(512, 1, "fc/age"); + const gender = extractFCParams(512, 2, "fc/gender"); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + paramMappings, + params: {fc: {age, gender}} + }; +} + +// src/ageGenderNet/extractParamsFromWeigthMap.ts +function extractParamsFromWeigthMap7(weightMap) { + const paramMappings = []; + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + function extractFcParams(prefix) { + const weights = extractWeightEntry(`${prefix}/weights`, 2); + const bias = extractWeightEntry(`${prefix}/bias`, 1); + return {weights, bias}; + } + const params = { + fc: { + age: extractFcParams("fc/age"), + gender: extractFcParams("fc/gender") + } + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/ageGenderNet/types.ts +var Gender; +(function(Gender2) { + Gender2["FEMALE"] = "female"; + Gender2["MALE"] = "male"; +})(Gender || (Gender = {})); + +// src/ageGenderNet/AgeGenderNet.ts +import { + avgPool as avgPool2, + softmax as softmax2, + tidy as tidy14, + unstack as unstack2 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class AgeGenderNet extends NeuralNetwork { + constructor(faceFeatureExtractor = new TinyXception(2)) { + super("AgeGenderNet"); + this._faceFeatureExtractor = faceFeatureExtractor; + } + get faceFeatureExtractor() { + return this._faceFeatureExtractor; + } + runNet(input) { + const {params} = this; + if (!params) { + throw new Error(`${this._name} - load model before inference`); + } + return tidy14(() => { + const bottleneckFeatures = input instanceof NetInput ? this.faceFeatureExtractor.forwardInput(input) : input; + const pooled = avgPool2(bottleneckFeatures, [7, 7], [2, 2], "valid").as2D(bottleneckFeatures.shape[0], -1); + const age = fullyConnectedLayer(pooled, params.fc.age).as1D(); + const gender = fullyConnectedLayer(pooled, params.fc.gender); + return {age, gender}; + }); + } + forwardInput(input) { + return tidy14(() => { + const {age, gender} = this.runNet(input); + return {age, gender: softmax2(gender)}; + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + async predictAgeAndGender(input) { + const netInput = await toNetInput(input); + const out = await this.forwardInput(netInput); + const ages = unstack2(out.age); + const genders = unstack2(out.gender); + const ageAndGenderTensors = ages.map((ageTensor, i) => ({ + ageTensor, + genderTensor: genders[i] + })); + const predictionsByBatch = await Promise.all(ageAndGenderTensors.map(async ({ageTensor, genderTensor}) => { + const age = (await ageTensor.data())[0]; + const probMale = (await genderTensor.data())[0]; + const isMale = probMale > 0.5; + const gender = isMale ? Gender.MALE : Gender.FEMALE; + const genderProbability = isMale ? probMale : 1 - probMale; + ageTensor.dispose(); + genderTensor.dispose(); + return {age, gender, genderProbability}; + })); + out.age.dispose(); + out.gender.dispose(); + return netInput.isBatchInput ? predictionsByBatch : predictionsByBatch[0]; + } + getDefaultModelName() { + return "age_gender_model"; + } + dispose(throwOnRedispose = true) { + this.faceFeatureExtractor.dispose(throwOnRedispose); + super.dispose(throwOnRedispose); + } + loadClassifierParams(weights) { + const {params, paramMappings} = this.extractClassifierParams(weights); + this._params = params; + this._paramMappings = paramMappings; + } + extractClassifierParams(weights) { + return extractParams7(weights); + } + extractParamsFromWeigthMap(weightMap) { + const {featureExtractorMap, classifierMap} = seperateWeightMaps(weightMap); + this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap); + return extractParamsFromWeigthMap7(classifierMap); + } + extractParams(weights) { + const classifierWeightSize = 512 * 1 + 1 + (512 * 2 + 2); + const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize); + const classifierWeights = weights.slice(weights.length - classifierWeightSize); + this.faceFeatureExtractor.extractWeights(featureExtractorWeights); + return this.extractClassifierParams(classifierWeights); + } +} + +// src/ageGenderNet/index.ts + +// src/faceLandmarkNet/FaceLandmark68NetBase.ts +import { + fill as fill3, + stack as stack2, + tidy as tidy15, + unstack as unstack3 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class FaceLandmark68NetBase extends FaceProcessor { + postProcess(output, inputSize, originalDimensions) { + const inputDimensions = originalDimensions.map(({width, height}) => { + const scale2 = inputSize / Math.max(height, width); + return { + width: width * scale2, + height: height * scale2 + }; + }); + const batchSize = inputDimensions.length; + return tidy15(() => { + const createInterleavedTensor = (fillX, fillY) => stack2([fill3([68], fillX, "float32"), fill3([68], fillY, "float32")], 1).as2D(1, 136).as1D(); + const getPadding = (batchIdx, cond) => { + const {width, height} = inputDimensions[batchIdx]; + return cond(width, height) ? Math.abs(width - height) / 2 : 0; + }; + const getPaddingX = (batchIdx) => getPadding(batchIdx, (w, h) => w < h); + const getPaddingY = (batchIdx) => getPadding(batchIdx, (w, h) => h < w); + const landmarkTensors = output.mul(fill3([batchSize, 136], inputSize, "float32")).sub(stack2(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(getPaddingX(batchIdx), getPaddingY(batchIdx))))).div(stack2(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(inputDimensions[batchIdx].width, inputDimensions[batchIdx].height)))); + return landmarkTensors; + }); + } + forwardInput(input) { + return tidy15(() => { + const out = this.runNet(input); + return this.postProcess(out, input.inputSize, input.inputDimensions.map(([height, width]) => ({height, width}))); + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + async detectLandmarks(input) { + const netInput = await toNetInput(input); + const landmarkTensors = tidy15(() => unstack3(this.forwardInput(netInput))); + const landmarksForBatch = await Promise.all(landmarkTensors.map(async (landmarkTensor, batchIdx) => { + const landmarksArray = Array.from(await landmarkTensor.data()); + const xCoords = landmarksArray.filter((_, i) => isEven(i)); + const yCoords = landmarksArray.filter((_, i) => !isEven(i)); + return new FaceLandmarks68(Array(68).fill(0).map((_, i) => new Point(xCoords[i], yCoords[i])), { + height: netInput.getInputHeight(batchIdx), + width: netInput.getInputWidth(batchIdx) + }); + })); + landmarkTensors.forEach((t) => t.dispose()); + return netInput.isBatchInput ? landmarksForBatch : landmarksForBatch[0]; + } + getClassifierChannelsOut() { + return 136; + } +} + +// src/faceLandmarkNet/FaceLandmark68Net.ts +class FaceLandmark68Net extends FaceLandmark68NetBase { + constructor(faceFeatureExtractor = new FaceFeatureExtractor()) { + super("FaceLandmark68Net", faceFeatureExtractor); + } + getDefaultModelName() { + return "face_landmark_68_model"; + } + getClassifierChannelsIn() { + return 256; + } +} + +// src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts +function extractParamsFromWeigthMapTiny(weightMap) { + const paramMappings = []; + const { + extractDenseBlock3Params + } = loadParamsFactory(weightMap, paramMappings); + const params = { + dense0: extractDenseBlock3Params("dense0", true), + dense1: extractDenseBlock3Params("dense1"), + dense2: extractDenseBlock3Params("dense2") + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/faceFeatureExtractor/extractParamsTiny.ts +function extractParamsTiny(weights) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const { + extractDenseBlock3Params + } = extractorsFactory(extractWeights, paramMappings); + const dense0 = extractDenseBlock3Params(3, 32, "dense0", true); + const dense1 = extractDenseBlock3Params(32, 64, "dense1"); + const dense2 = extractDenseBlock3Params(64, 128, "dense2"); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + paramMappings, + params: {dense0, dense1, dense2} + }; +} + +// src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts +import { + avgPool as avgPool3, + cast as cast5, + scalar as scalar3, + tidy as tidy16 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class TinyFaceFeatureExtractor extends NeuralNetwork { + constructor() { + super("TinyFaceFeatureExtractor"); + } + forwardInput(input) { + const {params} = this; + if (!params) { + throw new Error("TinyFaceFeatureExtractor - load model before inference"); + } + return tidy16(() => { + const batchTensor = cast5(input.toBatchTensor(112, true), "float32"); + const meanRgb = [122.782, 117.001, 104.298]; + const normalized = normalize(batchTensor, meanRgb).div(scalar3(255)); + let out = denseBlock3(normalized, params.dense0, true); + out = denseBlock3(out, params.dense1); + out = denseBlock3(out, params.dense2); + out = avgPool3(out, [14, 14], [2, 2], "valid"); + return out; + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + getDefaultModelName() { + return "face_feature_extractor_tiny_model"; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMapTiny(weightMap); + } + extractParams(weights) { + return extractParamsTiny(weights); + } +} + +// src/faceLandmarkNet/FaceLandmark68TinyNet.ts +class FaceLandmark68TinyNet extends FaceLandmark68NetBase { + constructor(faceFeatureExtractor = new TinyFaceFeatureExtractor()) { + super("FaceLandmark68TinyNet", faceFeatureExtractor); + } + getDefaultModelName() { + return "face_landmark_68_tiny_model"; + } + getClassifierChannelsIn() { + return 128; + } +} + +// src/faceLandmarkNet/index.ts +class FaceLandmarkNet extends FaceLandmark68Net { +} + +// src/faceRecognitionNet/scaleLayer.ts +import { + add as add6, + mul +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function scale(x, params) { + return add6(mul(x, params.weights), params.biases); +} + +// src/faceRecognitionNet/convLayer.ts +import { + add as add7, + conv2d as conv2d4, + relu as relu4 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function convLayer2(x, params, strides, withRelu, padding = "same") { + const {filters, bias} = params.conv; + let out = conv2d4(x, filters, strides, padding); + out = add7(out, bias); + out = scale(out, params.scale); + return withRelu ? relu4(out) : out; +} +function conv2(x, params) { + return convLayer2(x, params, [1, 1], true); +} +function convNoRelu(x, params) { + return convLayer2(x, params, [1, 1], false); +} +function convDown(x, params) { + return convLayer2(x, params, [2, 2], true, "valid"); +} + +// src/faceRecognitionNet/extractParams.ts +import { + tensor1d as tensor1d4, + tensor2d as tensor2d2, + tensor4d as tensor4d3, + tidy as tidy17, + transpose +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractorsFactory5(extractWeights, paramMappings) { + function extractFilterValues(numFilterValues, numFilters, filterSize) { + const weights = extractWeights(numFilterValues); + const depth = weights.length / (numFilters * filterSize * filterSize); + if (isFloat(depth)) { + throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`); + } + return tidy17(() => transpose(tensor4d3(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0])); + } + function extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix) { + const filters = extractFilterValues(numFilterValues, numFilters, filterSize); + const bias = tensor1d4(extractWeights(numFilters)); + paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/bias`}); + return {filters, bias}; + } + function extractScaleLayerParams(numWeights, mappedPrefix) { + const weights = tensor1d4(extractWeights(numWeights)); + const biases = tensor1d4(extractWeights(numWeights)); + paramMappings.push({paramPath: `${mappedPrefix}/weights`}, {paramPath: `${mappedPrefix}/biases`}); + return { + weights, + biases + }; + } + function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) { + const conv3 = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`); + const scale2 = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`); + return {conv: conv3, scale: scale2}; + } + function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown = false) { + const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`); + const conv22 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`); + return {conv1, conv2: conv22}; + } + return { + extractConvLayerParams, + extractResidualLayerParams + }; +} +function extractParams9(weights) { + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const paramMappings = []; + const { + extractConvLayerParams, + extractResidualLayerParams + } = extractorsFactory5(extractWeights, paramMappings); + const conv32_down = extractConvLayerParams(4704, 32, 7, "conv32_down"); + const conv32_1 = extractResidualLayerParams(9216, 32, 3, "conv32_1"); + const conv32_2 = extractResidualLayerParams(9216, 32, 3, "conv32_2"); + const conv32_3 = extractResidualLayerParams(9216, 32, 3, "conv32_3"); + const conv64_down = extractResidualLayerParams(36864, 64, 3, "conv64_down", true); + const conv64_1 = extractResidualLayerParams(36864, 64, 3, "conv64_1"); + const conv64_2 = extractResidualLayerParams(36864, 64, 3, "conv64_2"); + const conv64_3 = extractResidualLayerParams(36864, 64, 3, "conv64_3"); + const conv128_down = extractResidualLayerParams(147456, 128, 3, "conv128_down", true); + const conv128_1 = extractResidualLayerParams(147456, 128, 3, "conv128_1"); + const conv128_2 = extractResidualLayerParams(147456, 128, 3, "conv128_2"); + const conv256_down = extractResidualLayerParams(589824, 256, 3, "conv256_down", true); + const conv256_1 = extractResidualLayerParams(589824, 256, 3, "conv256_1"); + const conv256_2 = extractResidualLayerParams(589824, 256, 3, "conv256_2"); + const conv256_down_out = extractResidualLayerParams(589824, 256, 3, "conv256_down_out"); + const fc = tidy17(() => transpose(tensor2d2(extractWeights(256 * 128), [128, 256]), [1, 0])); + paramMappings.push({paramPath: `fc`}); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + const params = { + conv32_down, + conv32_1, + conv32_2, + conv32_3, + conv64_down, + conv64_1, + conv64_2, + conv64_3, + conv128_down, + conv128_1, + conv128_2, + conv256_down, + conv256_1, + conv256_2, + conv256_down_out, + fc + }; + return {params, paramMappings}; +} + +// src/faceRecognitionNet/extractParamsFromWeigthMap.ts +function extractorsFactory6(weightMap, paramMappings) { + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + function extractScaleLayerParams(prefix) { + const weights = extractWeightEntry(`${prefix}/scale/weights`, 1); + const biases = extractWeightEntry(`${prefix}/scale/biases`, 1); + return {weights, biases}; + } + function extractConvLayerParams(prefix) { + const filters = extractWeightEntry(`${prefix}/conv/filters`, 4); + const bias = extractWeightEntry(`${prefix}/conv/bias`, 1); + const scale2 = extractScaleLayerParams(prefix); + return {conv: {filters, bias}, scale: scale2}; + } + function extractResidualLayerParams(prefix) { + return { + conv1: extractConvLayerParams(`${prefix}/conv1`), + conv2: extractConvLayerParams(`${prefix}/conv2`) + }; + } + return { + extractConvLayerParams, + extractResidualLayerParams + }; +} +function extractParamsFromWeigthMap9(weightMap) { + const paramMappings = []; + const { + extractConvLayerParams, + extractResidualLayerParams + } = extractorsFactory6(weightMap, paramMappings); + const conv32_down = extractConvLayerParams("conv32_down"); + const conv32_1 = extractResidualLayerParams("conv32_1"); + const conv32_2 = extractResidualLayerParams("conv32_2"); + const conv32_3 = extractResidualLayerParams("conv32_3"); + const conv64_down = extractResidualLayerParams("conv64_down"); + const conv64_1 = extractResidualLayerParams("conv64_1"); + const conv64_2 = extractResidualLayerParams("conv64_2"); + const conv64_3 = extractResidualLayerParams("conv64_3"); + const conv128_down = extractResidualLayerParams("conv128_down"); + const conv128_1 = extractResidualLayerParams("conv128_1"); + const conv128_2 = extractResidualLayerParams("conv128_2"); + const conv256_down = extractResidualLayerParams("conv256_down"); + const conv256_1 = extractResidualLayerParams("conv256_1"); + const conv256_2 = extractResidualLayerParams("conv256_2"); + const conv256_down_out = extractResidualLayerParams("conv256_down_out"); + const fc = weightMap["fc"]; + paramMappings.push({originalPath: "fc", paramPath: "fc"}); + if (!isTensor2D(fc)) { + throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`); + } + const params = { + conv32_down, + conv32_1, + conv32_2, + conv32_3, + conv64_down, + conv64_1, + conv64_2, + conv64_3, + conv128_down, + conv128_1, + conv128_2, + conv256_down, + conv256_1, + conv256_2, + conv256_down_out, + fc + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/faceRecognitionNet/residualLayer.ts +import { + add as add8, + avgPool as avgPool4, + concat as concat3, + relu as relu5, + zeros +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function residual(x, params) { + let out = conv2(x, params.conv1); + out = convNoRelu(out, params.conv2); + out = add8(out, x); + out = relu5(out); + return out; +} +function residualDown(x, params) { + let out = convDown(x, params.conv1); + out = convNoRelu(out, params.conv2); + let pooled = avgPool4(x, 2, 2, "valid"); + const zeros2 = zeros(pooled.shape); + const isPad = pooled.shape[3] !== out.shape[3]; + const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]; + if (isAdjustShape) { + const padShapeX = [...out.shape]; + padShapeX[1] = 1; + const zerosW = zeros(padShapeX); + out = concat3([out, zerosW], 1); + const padShapeY = [...out.shape]; + padShapeY[2] = 1; + const zerosH = zeros(padShapeY); + out = concat3([out, zerosH], 2); + } + pooled = isPad ? concat3([pooled, zeros2], 3) : pooled; + out = add8(pooled, out); + out = relu5(out); + return out; +} + +// src/faceRecognitionNet/FaceRecognitionNet.ts +import { + cast as cast6, + matMul as matMul2, + maxPool as maxPool2, + scalar as scalar4, + tidy as tidy18, + unstack as unstack4 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class FaceRecognitionNet extends NeuralNetwork { + constructor() { + super("FaceRecognitionNet"); + } + forwardInput(input) { + const {params} = this; + if (!params) { + throw new Error("FaceRecognitionNet - load model before inference"); + } + return tidy18(() => { + const batchTensor = cast6(input.toBatchTensor(150, true), "float32"); + const meanRgb = [122.782, 117.001, 104.298]; + const normalized = normalize(batchTensor, meanRgb).div(scalar4(256)); + let out = convDown(normalized, params.conv32_down); + out = maxPool2(out, 3, 2, "valid"); + out = residual(out, params.conv32_1); + out = residual(out, params.conv32_2); + out = residual(out, params.conv32_3); + out = residualDown(out, params.conv64_down); + out = residual(out, params.conv64_1); + out = residual(out, params.conv64_2); + out = residual(out, params.conv64_3); + out = residualDown(out, params.conv128_down); + out = residual(out, params.conv128_1); + out = residual(out, params.conv128_2); + out = residualDown(out, params.conv256_down); + out = residual(out, params.conv256_1); + out = residual(out, params.conv256_2); + out = residualDown(out, params.conv256_down_out); + const globalAvg = out.mean([1, 2]); + const fullyConnected = matMul2(globalAvg, params.fc); + return fullyConnected; + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + async computeFaceDescriptor(input) { + const netInput = await toNetInput(input); + const faceDescriptorTensors = tidy18(() => unstack4(this.forwardInput(netInput))); + const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())); + faceDescriptorTensors.forEach((t) => t.dispose()); + return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0]; + } + getDefaultModelName() { + return "face_recognition_model"; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMap9(weightMap); + } + extractParams(weights) { + return extractParams9(weights); + } +} + +// src/faceRecognitionNet/index.ts +function createFaceRecognitionNet(weights) { + const net = new FaceRecognitionNet(); + net.extractWeights(weights); + return net; +} + +// src/factories/WithFaceDescriptor.ts +function extendWithFaceDescriptor(sourceObj, descriptor) { + const extension = {descriptor}; + return Object.assign({}, sourceObj, extension); +} + +// src/factories/WithAge.ts +function isWithAge(obj) { + return typeof obj["age"] === "number"; +} +function extendWithAge(sourceObj, age) { + const extension = {age}; + return Object.assign({}, sourceObj, extension); +} + +// src/factories/WithGender.ts +function isWithGender(obj) { + return (obj["gender"] === Gender.MALE || obj["gender"] === Gender.FEMALE) && isValidProbablitiy(obj["genderProbability"]); +} +function extendWithGender(sourceObj, gender, genderProbability) { + const extension = {gender, genderProbability}; + return Object.assign({}, sourceObj, extension); +} + +// src/factories/index.ts + +// src/ssdMobilenetv1/extractParams.ts +import { + tensor1d as tensor1d5, + tensor3d, + tensor4d as tensor4d4 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractorsFactory7(extractWeights, paramMappings) { + function extractDepthwiseConvParams(numChannels, mappedPrefix) { + const filters = tensor4d4(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); + const batch_norm_scale = tensor1d5(extractWeights(numChannels)); + const batch_norm_offset = tensor1d5(extractWeights(numChannels)); + const batch_norm_mean = tensor1d5(extractWeights(numChannels)); + const batch_norm_variance = tensor1d5(extractWeights(numChannels)); + paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/batch_norm_scale`}, {paramPath: `${mappedPrefix}/batch_norm_offset`}, {paramPath: `${mappedPrefix}/batch_norm_mean`}, {paramPath: `${mappedPrefix}/batch_norm_variance`}); + return { + filters, + batch_norm_scale, + batch_norm_offset, + batch_norm_mean, + batch_norm_variance + }; + } + function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, isPointwiseConv) { + const filters = tensor4d4(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); + const bias = tensor1d5(extractWeights(channelsOut)); + paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/${isPointwiseConv ? "batch_norm_offset" : "bias"}`}); + return {filters, bias}; + } + function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) { + const { + filters, + bias + } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true); + return { + filters, + batch_norm_offset: bias + }; + } + function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) { + const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`); + const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`); + return {depthwise_conv, pointwise_conv}; + } + function extractMobilenetV1Params() { + const conv_0 = extractPointwiseConvParams(3, 32, 3, "mobilenetv1/conv_0"); + const conv_1 = extractConvPairParams(32, 64, "mobilenetv1/conv_1"); + const conv_2 = extractConvPairParams(64, 128, "mobilenetv1/conv_2"); + const conv_3 = extractConvPairParams(128, 128, "mobilenetv1/conv_3"); + const conv_4 = extractConvPairParams(128, 256, "mobilenetv1/conv_4"); + const conv_5 = extractConvPairParams(256, 256, "mobilenetv1/conv_5"); + const conv_6 = extractConvPairParams(256, 512, "mobilenetv1/conv_6"); + const conv_7 = extractConvPairParams(512, 512, "mobilenetv1/conv_7"); + const conv_8 = extractConvPairParams(512, 512, "mobilenetv1/conv_8"); + const conv_9 = extractConvPairParams(512, 512, "mobilenetv1/conv_9"); + const conv_10 = extractConvPairParams(512, 512, "mobilenetv1/conv_10"); + const conv_11 = extractConvPairParams(512, 512, "mobilenetv1/conv_11"); + const conv_12 = extractConvPairParams(512, 1024, "mobilenetv1/conv_12"); + const conv_13 = extractConvPairParams(1024, 1024, "mobilenetv1/conv_13"); + return { + conv_0, + conv_1, + conv_2, + conv_3, + conv_4, + conv_5, + conv_6, + conv_7, + conv_8, + conv_9, + conv_10, + conv_11, + conv_12, + conv_13 + }; + } + function extractPredictionLayerParams() { + const conv_0 = extractPointwiseConvParams(1024, 256, 1, "prediction_layer/conv_0"); + const conv_1 = extractPointwiseConvParams(256, 512, 3, "prediction_layer/conv_1"); + const conv_2 = extractPointwiseConvParams(512, 128, 1, "prediction_layer/conv_2"); + const conv_3 = extractPointwiseConvParams(128, 256, 3, "prediction_layer/conv_3"); + const conv_4 = extractPointwiseConvParams(256, 128, 1, "prediction_layer/conv_4"); + const conv_5 = extractPointwiseConvParams(128, 256, 3, "prediction_layer/conv_5"); + const conv_6 = extractPointwiseConvParams(256, 64, 1, "prediction_layer/conv_6"); + const conv_7 = extractPointwiseConvParams(64, 128, 3, "prediction_layer/conv_7"); + const box_encoding_0_predictor = extractConvParams(512, 12, 1, "prediction_layer/box_predictor_0/box_encoding_predictor"); + const class_predictor_0 = extractConvParams(512, 9, 1, "prediction_layer/box_predictor_0/class_predictor"); + const box_encoding_1_predictor = extractConvParams(1024, 24, 1, "prediction_layer/box_predictor_1/box_encoding_predictor"); + const class_predictor_1 = extractConvParams(1024, 18, 1, "prediction_layer/box_predictor_1/class_predictor"); + const box_encoding_2_predictor = extractConvParams(512, 24, 1, "prediction_layer/box_predictor_2/box_encoding_predictor"); + const class_predictor_2 = extractConvParams(512, 18, 1, "prediction_layer/box_predictor_2/class_predictor"); + const box_encoding_3_predictor = extractConvParams(256, 24, 1, "prediction_layer/box_predictor_3/box_encoding_predictor"); + const class_predictor_3 = extractConvParams(256, 18, 1, "prediction_layer/box_predictor_3/class_predictor"); + const box_encoding_4_predictor = extractConvParams(256, 24, 1, "prediction_layer/box_predictor_4/box_encoding_predictor"); + const class_predictor_4 = extractConvParams(256, 18, 1, "prediction_layer/box_predictor_4/class_predictor"); + const box_encoding_5_predictor = extractConvParams(128, 24, 1, "prediction_layer/box_predictor_5/box_encoding_predictor"); + const class_predictor_5 = extractConvParams(128, 18, 1, "prediction_layer/box_predictor_5/class_predictor"); + const box_predictor_0 = { + box_encoding_predictor: box_encoding_0_predictor, + class_predictor: class_predictor_0 + }; + const box_predictor_1 = { + box_encoding_predictor: box_encoding_1_predictor, + class_predictor: class_predictor_1 + }; + const box_predictor_2 = { + box_encoding_predictor: box_encoding_2_predictor, + class_predictor: class_predictor_2 + }; + const box_predictor_3 = { + box_encoding_predictor: box_encoding_3_predictor, + class_predictor: class_predictor_3 + }; + const box_predictor_4 = { + box_encoding_predictor: box_encoding_4_predictor, + class_predictor: class_predictor_4 + }; + const box_predictor_5 = { + box_encoding_predictor: box_encoding_5_predictor, + class_predictor: class_predictor_5 + }; + return { + conv_0, + conv_1, + conv_2, + conv_3, + conv_4, + conv_5, + conv_6, + conv_7, + box_predictor_0, + box_predictor_1, + box_predictor_2, + box_predictor_3, + box_predictor_4, + box_predictor_5 + }; + } + return { + extractMobilenetV1Params, + extractPredictionLayerParams + }; +} +function extractParams11(weights) { + const paramMappings = []; + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const { + extractMobilenetV1Params, + extractPredictionLayerParams + } = extractorsFactory7(extractWeights, paramMappings); + const mobilenetv1 = extractMobilenetV1Params(); + const prediction_layer = extractPredictionLayerParams(); + const extra_dim = tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); + const output_layer = { + extra_dim + }; + paramMappings.push({paramPath: "output_layer/extra_dim"}); + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return { + params: { + mobilenetv1, + prediction_layer, + output_layer + }, + paramMappings + }; +} + +// src/ssdMobilenetv1/extractParamsFromWeigthMap.ts +function extractorsFactory8(weightMap, paramMappings) { + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + function extractPointwiseConvParams(prefix, idx, mappedPrefix) { + const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`); + const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`); + return {filters, batch_norm_offset}; + } + function extractConvPairParams(idx) { + const mappedPrefix = `mobilenetv1/conv_${idx}`; + const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`; + const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`; + const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`; + const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`); + const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`); + const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`); + const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`); + const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`); + return { + depthwise_conv: { + filters, + batch_norm_scale, + batch_norm_offset, + batch_norm_mean, + batch_norm_variance + }, + pointwise_conv: extractPointwiseConvParams("MobilenetV1", idx, mappedPrefixPointwiseConv) + }; + } + function extractMobilenetV1Params() { + return { + conv_0: extractPointwiseConvParams("MobilenetV1", 0, "mobilenetv1/conv_0"), + conv_1: extractConvPairParams(1), + conv_2: extractConvPairParams(2), + conv_3: extractConvPairParams(3), + conv_4: extractConvPairParams(4), + conv_5: extractConvPairParams(5), + conv_6: extractConvPairParams(6), + conv_7: extractConvPairParams(7), + conv_8: extractConvPairParams(8), + conv_9: extractConvPairParams(9), + conv_10: extractConvPairParams(10), + conv_11: extractConvPairParams(11), + conv_12: extractConvPairParams(12), + conv_13: extractConvPairParams(13) + }; + } + function extractConvParams(prefix, mappedPrefix) { + const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`); + const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`); + return {filters, bias}; + } + function extractBoxPredictorParams(idx) { + const box_encoding_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`, `prediction_layer/box_predictor_${idx}/box_encoding_predictor`); + const class_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`, `prediction_layer/box_predictor_${idx}/class_predictor`); + return {box_encoding_predictor, class_predictor}; + } + function extractPredictionLayerParams() { + return { + conv_0: extractPointwiseConvParams("Prediction", 0, "prediction_layer/conv_0"), + conv_1: extractPointwiseConvParams("Prediction", 1, "prediction_layer/conv_1"), + conv_2: extractPointwiseConvParams("Prediction", 2, "prediction_layer/conv_2"), + conv_3: extractPointwiseConvParams("Prediction", 3, "prediction_layer/conv_3"), + conv_4: extractPointwiseConvParams("Prediction", 4, "prediction_layer/conv_4"), + conv_5: extractPointwiseConvParams("Prediction", 5, "prediction_layer/conv_5"), + conv_6: extractPointwiseConvParams("Prediction", 6, "prediction_layer/conv_6"), + conv_7: extractPointwiseConvParams("Prediction", 7, "prediction_layer/conv_7"), + box_predictor_0: extractBoxPredictorParams(0), + box_predictor_1: extractBoxPredictorParams(1), + box_predictor_2: extractBoxPredictorParams(2), + box_predictor_3: extractBoxPredictorParams(3), + box_predictor_4: extractBoxPredictorParams(4), + box_predictor_5: extractBoxPredictorParams(5) + }; + } + return { + extractMobilenetV1Params, + extractPredictionLayerParams + }; +} +function extractParamsFromWeigthMap11(weightMap) { + const paramMappings = []; + const { + extractMobilenetV1Params, + extractPredictionLayerParams + } = extractorsFactory8(weightMap, paramMappings); + const extra_dim = weightMap["Output/extra_dim"]; + paramMappings.push({originalPath: "Output/extra_dim", paramPath: "output_layer/extra_dim"}); + if (!isTensor3D(extra_dim)) { + throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`); + } + const params = { + mobilenetv1: extractMobilenetV1Params(), + prediction_layer: extractPredictionLayerParams(), + output_layer: { + extra_dim + } + }; + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/ssdMobilenetv1/pointwiseConvLayer.ts +import { + add as add9, + clipByValue, + conv2d as conv2d5, + tidy as tidy19 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function pointwiseConvLayer(x, params, strides) { + return tidy19(() => { + let out = conv2d5(x, params.filters, strides, "same"); + out = add9(out, params.batch_norm_offset); + return clipByValue(out, 0, 6); + }); +} + +// src/ssdMobilenetv1/mobileNetV1.ts +import { + batchNorm, + clipByValue as clipByValue2, + depthwiseConv2d, + tidy as tidy20 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +const epsilon = 0.0010000000474974513; +function depthwiseConvLayer(x, params, strides) { + return tidy20(() => { + let out = depthwiseConv2d(x, params.filters, strides, "same"); + out = batchNorm(out, params.batch_norm_mean, params.batch_norm_variance, params.batch_norm_offset, params.batch_norm_scale, epsilon); + return clipByValue2(out, 0, 6); + }); +} +function getStridesForLayerIdx(layerIdx) { + return [2, 4, 6, 12].some((idx) => idx === layerIdx) ? [2, 2] : [1, 1]; +} +function mobileNetV1(x, params) { + return tidy20(() => { + let conv11; + let out = pointwiseConvLayer(x, params.conv_0, [2, 2]); + const convPairParams = [ + params.conv_1, + params.conv_2, + params.conv_3, + params.conv_4, + params.conv_5, + params.conv_6, + params.conv_7, + params.conv_8, + params.conv_9, + params.conv_10, + params.conv_11, + params.conv_12, + params.conv_13 + ]; + convPairParams.forEach((param, i) => { + const layerIdx = i + 1; + const depthwiseConvStrides = getStridesForLayerIdx(layerIdx); + out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides); + out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]); + if (layerIdx === 11) { + conv11 = out; + } + }); + if (conv11 === null) { + throw new Error("mobileNetV1 - output of conv layer 11 is null"); + } + return { + out, + conv11 + }; + }); +} + +// src/ssdMobilenetv1/nonMaxSuppression.ts +function nonMaxSuppression2(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { + const numBoxes = boxes.shape[0]; + const outputSize = Math.min(maxOutputSize, numBoxes); + const candidates = scores.map((score, boxIndex) => ({score, boxIndex})).filter((c) => c.score > scoreThreshold).sort((c1, c2) => c2.score - c1.score); + const suppressFunc = (x) => x <= iouThreshold ? 1 : 0; + const selected = []; + candidates.forEach((c) => { + if (selected.length >= outputSize) { + return; + } + const originalScore = c.score; + for (let j = selected.length - 1; j >= 0; --j) { + const iou3 = IOU(boxes, c.boxIndex, selected[j]); + if (iou3 === 0) { + continue; + } + c.score *= suppressFunc(iou3); + if (c.score <= scoreThreshold) { + break; + } + } + if (originalScore === c.score) { + selected.push(c.boxIndex); + } + }); + return selected; +} +function IOU(boxes, i, j) { + const boxesData = boxes.arraySync(); + const yminI = Math.min(boxesData[i][0], boxesData[i][2]); + const xminI = Math.min(boxesData[i][1], boxesData[i][3]); + const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]); + const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]); + const yminJ = Math.min(boxesData[j][0], boxesData[j][2]); + const xminJ = Math.min(boxesData[j][1], boxesData[j][3]); + const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]); + const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]); + const areaI = (ymaxI - yminI) * (xmaxI - xminI); + const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ); + if (areaI <= 0 || areaJ <= 0) { + return 0; + } + const intersectionYmin = Math.max(yminI, yminJ); + const intersectionXmin = Math.max(xminI, xminJ); + const intersectionYmax = Math.min(ymaxI, ymaxJ); + const intersectionXmax = Math.min(xmaxI, xmaxJ); + const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0) * Math.max(intersectionXmax - intersectionXmin, 0); + return intersectionArea / (areaI + areaJ - intersectionArea); +} + +// src/ssdMobilenetv1/outputLayer.ts +import { + add as add10, + div, + exp, + mul as mul2, + reshape, + scalar as scalar5, + sigmoid as sigmoid2, + slice, + stack as stack3, + sub as sub2, + tidy as tidy21, + tile, + transpose as transpose2, + unstack as unstack5 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function getCenterCoordinatesAndSizesLayer(x) { + const vec = unstack5(transpose2(x, [1, 0])); + const sizes = [ + sub2(vec[2], vec[0]), + sub2(vec[3], vec[1]) + ]; + const centers = [ + add10(vec[0], div(sizes[0], scalar5(2))), + add10(vec[1], div(sizes[1], scalar5(2))) + ]; + return { + sizes, + centers + }; +} +function decodeBoxesLayer(x0, x1) { + const { + sizes, + centers + } = getCenterCoordinatesAndSizesLayer(x0); + const vec = unstack5(transpose2(x1, [1, 0])); + const div0_out = div(mul2(exp(div(vec[2], scalar5(5))), sizes[0]), scalar5(2)); + const add0_out = add10(mul2(div(vec[0], scalar5(10)), sizes[0]), centers[0]); + const div1_out = div(mul2(exp(div(vec[3], scalar5(5))), sizes[1]), scalar5(2)); + const add1_out = add10(mul2(div(vec[1], scalar5(10)), sizes[1]), centers[1]); + return transpose2(stack3([ + sub2(add0_out, div0_out), + sub2(add1_out, div1_out), + add10(add0_out, div0_out), + add10(add1_out, div1_out) + ]), [1, 0]); +} +function outputLayer(boxPredictions, classPredictions, params) { + return tidy21(() => { + const batchSize = boxPredictions.shape[0]; + let boxes = decodeBoxesLayer(reshape(tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]), reshape(boxPredictions, [-1, 4])); + boxes = reshape(boxes, [batchSize, boxes.shape[0] / batchSize, 4]); + const scoresAndClasses = sigmoid2(slice(classPredictions, [0, 0, 1], [-1, -1, -1])); + let scores = slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]); + scores = reshape(scores, [batchSize, scores.shape[1]]); + const boxesByBatch = unstack5(boxes); + const scoresByBatch = unstack5(scores); + return { + boxes: boxesByBatch, + scores: scoresByBatch + }; + }); +} + +// src/ssdMobilenetv1/boxPredictionLayer.ts +import { + reshape as reshape2, + tidy as tidy22 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function boxPredictionLayer(x, params) { + return tidy22(() => { + const batchSize = x.shape[0]; + const boxPredictionEncoding = reshape2(convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]); + const classPrediction = reshape2(convLayer(x, params.class_predictor), [batchSize, -1, 3]); + return { + boxPredictionEncoding, + classPrediction + }; + }); +} + +// src/ssdMobilenetv1/predictionLayer.ts +import { + concat as concat4, + tidy as tidy23 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function predictionLayer(x, conv11, params) { + return tidy23(() => { + const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]); + const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]); + const conv22 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]); + const conv3 = pointwiseConvLayer(conv22, params.conv_3, [2, 2]); + const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]); + const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]); + const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]); + const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]); + const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0); + const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1); + const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2); + const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3); + const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4); + const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5); + const boxPredictions = concat4([ + boxPrediction0.boxPredictionEncoding, + boxPrediction1.boxPredictionEncoding, + boxPrediction2.boxPredictionEncoding, + boxPrediction3.boxPredictionEncoding, + boxPrediction4.boxPredictionEncoding, + boxPrediction5.boxPredictionEncoding + ], 1); + const classPredictions = concat4([ + boxPrediction0.classPrediction, + boxPrediction1.classPrediction, + boxPrediction2.classPrediction, + boxPrediction3.classPrediction, + boxPrediction4.classPrediction, + boxPrediction5.classPrediction + ], 1); + return { + boxPredictions, + classPredictions + }; + }); +} + +// src/ssdMobilenetv1/SsdMobilenetv1Options.ts +class SsdMobilenetv1Options { + constructor({minConfidence, maxResults} = {}) { + this._name = "SsdMobilenetv1Options"; + this._minConfidence = minConfidence || 0.5; + this._maxResults = maxResults || 100; + if (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; + } +} + +// src/ssdMobilenetv1/SsdMobilenetv1.ts +import { + cast as cast7, + mul as mul3, + scalar as scalar6, + sub as sub3, + tidy as tidy24 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class SsdMobilenetv1 extends NeuralNetwork { + constructor() { + super("SsdMobilenetv1"); + } + forwardInput(input) { + const {params} = this; + if (!params) { + throw new Error("SsdMobilenetv1 - load model before inference"); + } + return tidy24(() => { + const batchTensor = cast7(input.toBatchTensor(512, false), "float32"); + const x = sub3(mul3(batchTensor, scalar6(0.007843137718737125)), scalar6(1)); + const features = mobileNetV1(x, params.mobilenetv1); + const { + boxPredictions, + classPredictions + } = predictionLayer(features.out, features.conv11, params.prediction_layer); + return outputLayer(boxPredictions, classPredictions, params.output_layer); + }); + } + async forward(input) { + return this.forwardInput(await toNetInput(input)); + } + async locateFaces(input, options = {}) { + const {maxResults, minConfidence} = new SsdMobilenetv1Options(options); + const netInput = await toNetInput(input); + const { + boxes: _boxes, + scores: _scores + } = this.forwardInput(netInput); + const boxes = _boxes[0]; + const scores = _scores[0]; + for (let i = 1; i < _boxes.length; i++) { + _boxes[i].dispose(); + _scores[i].dispose(); + } + const scoresData = Array.from(await scores.data()); + const iouThreshold = 0.5; + const indices = nonMaxSuppression2(boxes, scoresData, maxResults, iouThreshold, minConfidence); + const reshapedDims = netInput.getReshapedInputDimensions(0); + const inputSize = netInput.inputSize; + const padX = inputSize / reshapedDims.width; + const padY = inputSize / reshapedDims.height; + const boxesData = boxes.arraySync(); + const results = indices.map((idx) => { + const [top, bottom] = [ + Math.max(0, boxesData[idx][0]), + Math.min(1, boxesData[idx][2]) + ].map((val) => val * padY); + const [left, right] = [ + Math.max(0, boxesData[idx][1]), + Math.min(1, boxesData[idx][3]) + ].map((val) => val * padX); + return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), { + height: netInput.getInputHeight(0), + width: netInput.getInputWidth(0) + }); + }); + boxes.dispose(); + scores.dispose(); + return results; + } + getDefaultModelName() { + return "ssd_mobilenetv1_model"; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMap11(weightMap); + } + extractParams(weights) { + return extractParams11(weights); + } +} + +// src/ssdMobilenetv1/index.ts +function createSsdMobilenetv1(weights) { + const net = new SsdMobilenetv1(); + net.extractWeights(weights); + return net; +} +function createFaceDetectionNet(weights) { + return createSsdMobilenetv1(weights); +} +class FaceDetectionNet extends SsdMobilenetv1 { +} + +// src/tinyYolov2/const.ts +const IOU_THRESHOLD = 0.4; +const BOX_ANCHORS = [ + new Point(0.738768, 0.874946), + new Point(2.42204, 2.65704), + new Point(4.30971, 7.04493), + new Point(10.246, 4.59428), + new Point(12.6868, 11.8741) +]; +const BOX_ANCHORS_SEPARABLE = [ + new Point(1.603231, 2.094468), + new Point(6.041143, 7.080126), + new Point(2.882459, 3.518061), + new Point(4.266906, 5.178857), + new Point(9.041765, 10.66308) +]; +const MEAN_RGB_SEPARABLE = [117.001, 114.697, 97.404]; +const DEFAULT_MODEL_NAME = "tiny_yolov2_model"; +const DEFAULT_MODEL_NAME_SEPARABLE_CONV = "tiny_yolov2_separable_conv_model"; + +// src/tinyYolov2/config.ts +const isNumber = (arg) => typeof arg === "number"; +function validateConfig(config2) { + if (!config2) { + throw new Error(`invalid config: ${config2}`); + } + if (typeof config2.withSeparableConvs !== "boolean") { + throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config2.withSeparableConvs}`); + } + if (!isNumber(config2.iouThreshold) || config2.iouThreshold < 0 || config2.iouThreshold > 1) { + throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config2.iouThreshold}`); + } + if (!Array.isArray(config2.classes) || !config2.classes.length || !config2.classes.every((c) => typeof c === "string")) { + throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config2.classes)}`); + } + if (!Array.isArray(config2.anchors) || !config2.anchors.length || !config2.anchors.map((a) => a || {}).every((a) => isNumber(a.x) && isNumber(a.y))) { + throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config2.anchors)}`); + } + if (config2.meanRgb && (!Array.isArray(config2.meanRgb) || config2.meanRgb.length !== 3 || !config2.meanRgb.every(isNumber))) { + throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config2.meanRgb)}`); + } +} + +// src/tinyYolov2/leaky.ts +import { + add as add11, + mul as mul4, + relu as relu6, + scalar as scalar7, + sub as sub4, + tidy as tidy25 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function leaky(x) { + return tidy25(() => { + const min = mul4(x, scalar7(0.10000000149011612)); + return add11(relu6(sub4(x, min)), min); + }); +} + +// src/tinyYolov2/convWithBatchNorm.ts +import { + add as add12, + conv2d as conv2d6, + mul as mul5, + pad, + sub as sub5, + tidy as tidy26 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function convWithBatchNorm(x, params) { + return tidy26(() => { + let out = pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]); + out = conv2d6(out, params.conv.filters, [1, 1], "valid"); + out = sub5(out, params.bn.sub); + out = mul5(out, params.bn.truediv); + out = add12(out, params.conv.bias); + return leaky(out); + }); +} + +// src/tinyYolov2/depthwiseSeparableConv.ts +import { + add as add13, + pad as pad2, + separableConv2d as separableConv2d2, + tidy as tidy27 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function depthwiseSeparableConv3(x, params) { + return tidy27(() => { + let out = pad2(x, [[0, 0], [1, 1], [1, 1], [0, 0]]); + out = separableConv2d2(out, params.depthwise_filter, params.pointwise_filter, [1, 1], "valid"); + out = add13(out, params.bias); + return leaky(out); + }); +} + +// src/tinyYolov2/extractParams.ts +import { + tensor1d as tensor1d6 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +function extractorsFactory9(extractWeights, paramMappings) { + const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); + function extractBatchNormParams(size, mappedPrefix) { + const sub6 = tensor1d6(extractWeights(size)); + const truediv = tensor1d6(extractWeights(size)); + paramMappings.push({paramPath: `${mappedPrefix}/sub`}, {paramPath: `${mappedPrefix}/truediv`}); + return {sub: sub6, truediv}; + } + function extractConvWithBatchNormParams(channelsIn, channelsOut, mappedPrefix) { + const conv3 = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`); + const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`); + return {conv: conv3, bn}; + } + const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); + return { + extractConvParams, + extractConvWithBatchNormParams, + extractSeparableConvParams + }; +} +function extractParams13(weights, config2, boxEncodingSize, filterSizes) { + const { + extractWeights, + getRemainingWeights + } = extractWeightsFactory(weights); + const paramMappings = []; + const { + extractConvParams, + extractConvWithBatchNormParams, + extractSeparableConvParams + } = extractorsFactory9(extractWeights, paramMappings); + let params; + if (config2.withSeparableConvs) { + const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes; + const conv0 = config2.isFirstLayerConv2d ? extractConvParams(s0, s1, 3, "conv0") : extractSeparableConvParams(s0, s1, "conv0"); + const conv1 = extractSeparableConvParams(s1, s2, "conv1"); + const conv22 = extractSeparableConvParams(s2, s3, "conv2"); + const conv3 = extractSeparableConvParams(s3, s4, "conv3"); + const conv4 = extractSeparableConvParams(s4, s5, "conv4"); + const conv5 = extractSeparableConvParams(s5, s6, "conv5"); + const conv6 = s7 ? extractSeparableConvParams(s6, s7, "conv6") : void 0; + const conv7 = s8 ? extractSeparableConvParams(s7, s8, "conv7") : void 0; + const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, "conv8"); + params = {conv0, conv1, conv2: conv22, conv3, conv4, conv5, conv6, conv7, conv8}; + } else { + const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes; + const conv0 = extractConvWithBatchNormParams(s0, s1, "conv0"); + const conv1 = extractConvWithBatchNormParams(s1, s2, "conv1"); + const conv22 = extractConvWithBatchNormParams(s2, s3, "conv2"); + const conv3 = extractConvWithBatchNormParams(s3, s4, "conv3"); + const conv4 = extractConvWithBatchNormParams(s4, s5, "conv4"); + const conv5 = extractConvWithBatchNormParams(s5, s6, "conv5"); + const conv6 = extractConvWithBatchNormParams(s6, s7, "conv6"); + const conv7 = extractConvWithBatchNormParams(s7, s8, "conv7"); + const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, "conv8"); + params = {conv0, conv1, conv2: conv22, conv3, conv4, conv5, conv6, conv7, conv8}; + } + if (getRemainingWeights().length !== 0) { + throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); + } + return {params, paramMappings}; +} + +// src/tinyYolov2/extractParamsFromWeigthMap.ts +function extractorsFactory10(weightMap, paramMappings) { + const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); + function extractBatchNormParams(prefix) { + const sub6 = extractWeightEntry(`${prefix}/sub`, 1); + const truediv = extractWeightEntry(`${prefix}/truediv`, 1); + return {sub: sub6, truediv}; + } + function extractConvParams(prefix) { + const filters = extractWeightEntry(`${prefix}/filters`, 4); + const bias = extractWeightEntry(`${prefix}/bias`, 1); + return {filters, bias}; + } + function extractConvWithBatchNormParams(prefix) { + const conv3 = extractConvParams(`${prefix}/conv`); + const bn = extractBatchNormParams(`${prefix}/bn`); + return {conv: conv3, bn}; + } + const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); + return { + extractConvParams, + extractConvWithBatchNormParams, + extractSeparableConvParams + }; +} +function extractParamsFromWeigthMap13(weightMap, config2) { + const paramMappings = []; + const { + extractConvParams, + extractConvWithBatchNormParams, + extractSeparableConvParams + } = extractorsFactory10(weightMap, paramMappings); + let params; + if (config2.withSeparableConvs) { + const numFilters = config2.filterSizes && config2.filterSizes.length || 9; + params = { + conv0: config2.isFirstLayerConv2d ? extractConvParams("conv0") : extractSeparableConvParams("conv0"), + conv1: extractSeparableConvParams("conv1"), + conv2: extractSeparableConvParams("conv2"), + conv3: extractSeparableConvParams("conv3"), + conv4: extractSeparableConvParams("conv4"), + conv5: extractSeparableConvParams("conv5"), + conv6: numFilters > 7 ? extractSeparableConvParams("conv6") : void 0, + conv7: numFilters > 8 ? extractSeparableConvParams("conv7") : void 0, + conv8: extractConvParams("conv8") + }; + } else { + params = { + conv0: extractConvWithBatchNormParams("conv0"), + conv1: extractConvWithBatchNormParams("conv1"), + conv2: extractConvWithBatchNormParams("conv2"), + conv3: extractConvWithBatchNormParams("conv3"), + conv4: extractConvWithBatchNormParams("conv4"), + conv5: extractConvWithBatchNormParams("conv5"), + conv6: extractConvWithBatchNormParams("conv6"), + conv7: extractConvWithBatchNormParams("conv7"), + conv8: extractConvParams("conv8") + }; + } + disposeUnusedWeightTensors(weightMap, paramMappings); + return {params, paramMappings}; +} + +// src/tinyYolov2/TinyYolov2Options.ts +var TinyYolov2SizeType; +(function(TinyYolov2SizeType2) { + TinyYolov2SizeType2[TinyYolov2SizeType2["XS"] = 224] = "XS"; + TinyYolov2SizeType2[TinyYolov2SizeType2["SM"] = 320] = "SM"; + TinyYolov2SizeType2[TinyYolov2SizeType2["MD"] = 416] = "MD"; + TinyYolov2SizeType2[TinyYolov2SizeType2["LG"] = 608] = "LG"; +})(TinyYolov2SizeType || (TinyYolov2SizeType = {})); +class TinyYolov2Options { + constructor({inputSize, scoreThreshold} = {}) { + this._name = "TinyYolov2Options"; + this._inputSize = inputSize || 416; + this._scoreThreshold = scoreThreshold || 0.5; + if (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; + } +} + +// src/tinyYolov2/TinyYolov2Base.ts +import { + cast as cast8, + maxPool as maxPool3, + scalar as scalar8, + softmax as softmax3, + tidy as tidy28, + unstack as unstack6 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class TinyYolov2Base extends NeuralNetwork { + constructor(config2) { + super("TinyYolov2"); + validateConfig(config2); + this._config = config2; + } + 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(x, params) { + let out = convWithBatchNorm(x, params.conv0); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = convWithBatchNorm(out, params.conv1); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = convWithBatchNorm(out, params.conv2); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = convWithBatchNorm(out, params.conv3); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = convWithBatchNorm(out, params.conv4); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = convWithBatchNorm(out, params.conv5); + out = maxPool3(out, [2, 2], [1, 1], "same"); + out = convWithBatchNorm(out, params.conv6); + out = convWithBatchNorm(out, params.conv7); + return convLayer(out, params.conv8, "valid", false); + } + runMobilenet(x, params) { + let out = this.config.isFirstLayerConv2d ? leaky(convLayer(x, params.conv0, "valid", false)) : depthwiseSeparableConv3(x, params.conv0); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = depthwiseSeparableConv3(out, params.conv1); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = depthwiseSeparableConv3(out, params.conv2); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = depthwiseSeparableConv3(out, params.conv3); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = depthwiseSeparableConv3(out, params.conv4); + out = maxPool3(out, [2, 2], [2, 2], "same"); + out = depthwiseSeparableConv3(out, params.conv5); + out = maxPool3(out, [2, 2], [1, 1], "same"); + out = params.conv6 ? depthwiseSeparableConv3(out, params.conv6) : out; + out = params.conv7 ? depthwiseSeparableConv3(out, params.conv7) : out; + return convLayer(out, params.conv8, "valid", false); + } + forwardInput(input, inputSize) { + const {params} = this; + if (!params) { + throw new Error("TinyYolov2 - load model before inference"); + } + return tidy28(() => { + let batchTensor = cast8(input.toBatchTensor(inputSize, false), "float32"); + batchTensor = this.config.meanRgb ? normalize(batchTensor, this.config.meanRgb) : batchTensor; + batchTensor = batchTensor.div(scalar8(256)); + return this.config.withSeparableConvs ? this.runMobilenet(batchTensor, params) : this.runTinyYolov2(batchTensor, params); + }); + } + async forward(input, inputSize) { + return await this.forwardInput(await toNetInput(input), inputSize); + } + async detect(input, forwardParams = {}) { + const {inputSize, scoreThreshold} = new TinyYolov2Options(forwardParams); + const netInput = await toNetInput(input); + const out = await this.forwardInput(netInput, inputSize); + const out0 = tidy28(() => unstack6(out)[0].expandDims()); + const inputDimensions = { + width: netInput.getInputWidth(0), + height: netInput.getInputHeight(0) + }; + const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold); + out.dispose(); + out0.dispose(); + const boxes = results.map((res) => res.box); + const scores = results.map((res) => res.score); + const classScores = results.map((res) => res.classScore); + const classNames = results.map((res) => this.config.classes[res.label]); + const indices = nonMaxSuppression(boxes.map((box) => box.rescale(inputSize)), scores, this.config.iouThreshold, true); + const detections = indices.map((idx) => new ObjectDetection(scores[idx], classScores[idx], classNames[idx], boxes[idx], inputDimensions)); + return detections; + } + getDefaultModelName() { + return ""; + } + extractParamsFromWeigthMap(weightMap) { + return extractParamsFromWeigthMap13(weightMap, this.config); + } + extractParams(weights) { + const filterSizes = this.config.filterSizes || TinyYolov2Base.DEFAULT_FILTER_SIZES; + const numFilters = filterSizes ? filterSizes.length : void 0; + if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) { + throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`); + } + return extractParams13(weights, this.config, this.boxEncodingSize, filterSizes); + } + async extractBoxes(outputTensor, inputBlobDimensions, scoreThreshold) { + const {width, height} = inputBlobDimensions; + const inputSize = Math.max(width, height); + const correctionFactorX = inputSize / width; + const correctionFactorY = inputSize / height; + const numCells = outputTensor.shape[1]; + const numBoxes = this.config.anchors.length; + const [boxesTensor, scoresTensor, classScoresTensor] = tidy28(() => { + const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize]); + const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4]); + const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1]); + const classScores = this.withClassScores ? softmax3(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3) : scalar8(0); + return [boxes, scores, classScores]; + }); + const results = []; + const scoresData = await scoresTensor.array(); + const boxesData = await boxesTensor.array(); + for (let row = 0; row < numCells; row++) { + for (let col = 0; col < numCells; col++) { + for (let anchor = 0; anchor < numBoxes; anchor++) { + const score = sigmoid(scoresData[row][col][anchor][0]); + if (!scoreThreshold || score > scoreThreshold) { + const ctX = (col + sigmoid(boxesData[row][col][anchor][0])) / numCells * correctionFactorX; + const ctY = (row + sigmoid(boxesData[row][col][anchor][1])) / numCells * correctionFactorY; + const width2 = Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x / numCells * correctionFactorX; + const height2 = Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y / numCells * correctionFactorY; + const x = ctX - width2 / 2; + const y = ctY - height2 / 2; + const pos = {row, col, anchor}; + const {classScore, label} = this.withClassScores ? await this.extractPredictedClass(classScoresTensor, pos) : {classScore: 1, label: 0}; + results.push({ + box: new BoundingBox(x, y, x + width2, y + height2), + score, + classScore: score * classScore, + label, + ...pos + }); + } + } + } + } + boxesTensor.dispose(); + scoresTensor.dispose(); + classScoresTensor.dispose(); + return results; + } + async extractPredictedClass(classesTensor, pos) { + const {row, col, anchor} = pos; + const classesData = await classesTensor.array(); + return Array(this.config.classes.length).fill(0).map((_, i) => classesData[row][col][anchor][i]).map((classScore, label) => ({ + classScore, + label + })).reduce((max, curr) => max.classScore > curr.classScore ? max : curr); + } +} +TinyYolov2Base.DEFAULT_FILTER_SIZES = [ + 3, + 16, + 32, + 64, + 128, + 256, + 512, + 1024, + 1024 +]; + +// src/tinyYolov2/TinyYolov2.ts +class TinyYolov2 extends TinyYolov2Base { + constructor(withSeparableConvs = true) { + const config2 = Object.assign({}, { + withSeparableConvs, + iouThreshold: IOU_THRESHOLD, + classes: ["face"] + }, withSeparableConvs ? { + anchors: BOX_ANCHORS_SEPARABLE, + meanRgb: MEAN_RGB_SEPARABLE + } : { + anchors: BOX_ANCHORS, + withClassScores: true + }); + super(config2); + } + get withSeparableConvs() { + return this.config.withSeparableConvs; + } + get anchors() { + return this.config.anchors; + } + async locateFaces(input, forwardParams) { + const objectDetections = await this.detect(input, forwardParams); + return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, {width: det.imageWidth, height: det.imageHeight})); + } + getDefaultModelName() { + return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME; + } + extractParamsFromWeigthMap(weightMap) { + return super.extractParamsFromWeigthMap(weightMap); + } +} + +// src/tinyYolov2/types.ts + +// src/tinyYolov2/index.ts +function createTinyYolov2(weights, withSeparableConvs = true) { + const net = new TinyYolov2(withSeparableConvs); + net.extractWeights(weights); + return net; +} + +// src/tinyFaceDetector/TinyFaceDetectorOptions.ts +class TinyFaceDetectorOptions extends TinyYolov2Options { + constructor() { + super(...arguments); + this._name = "TinyFaceDetectorOptions"; + } +} + +// src/globalApi/ComposableTask.ts +class ComposableTask { + async then(onfulfilled) { + return onfulfilled(await this.run()); + } + async run() { + throw new Error("ComposableTask - run is not implemented"); + } +} + +// src/globalApi/extractFacesAndComputeResults.ts +import { + Tensor as Tensor4 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +async function extractAllFacesAndComputeResults(parentResults, input, computeResults, extractedFaces, getRectForAlignment = ({alignedRect}) => alignedRect) { + const faceBoxes = parentResults.map((parentResult) => isWithFaceLandmarks(parentResult) ? getRectForAlignment(parentResult) : parentResult.detection); + const faces = extractedFaces || (input instanceof Tensor4 ? await extractFaceTensors(input, faceBoxes) : await extractFaces(input, faceBoxes)); + const results = await computeResults(faces); + faces.forEach((f) => f instanceof Tensor4 && f.dispose()); + return results; +} +async function extractSingleFaceAndComputeResult(parentResult, input, computeResult, extractedFaces, getRectForAlignment) { + return extractAllFacesAndComputeResults([parentResult], input, async (faces) => computeResult(faces[0]), extractedFaces, getRectForAlignment); +} + +// src/tinyFaceDetector/const.ts +const IOU_THRESHOLD2 = 0.4; +const BOX_ANCHORS2 = [ + new Point(1.603231, 2.094468), + new Point(6.041143, 7.080126), + new Point(2.882459, 3.518061), + new Point(4.266906, 5.178857), + new Point(9.041765, 10.66308) +]; +const MEAN_RGB = [117.001, 114.697, 97.404]; + +// src/tinyFaceDetector/TinyFaceDetector.ts +class TinyFaceDetector extends TinyYolov2Base { + constructor() { + const config2 = { + withSeparableConvs: true, + iouThreshold: IOU_THRESHOLD2, + classes: ["face"], + anchors: BOX_ANCHORS2, + meanRgb: MEAN_RGB, + isFirstLayerConv2d: true, + filterSizes: [3, 16, 32, 64, 128, 256, 512] + }; + super(config2); + } + get anchors() { + return this.config.anchors; + } + async locateFaces(input, forwardParams) { + const objectDetections = await this.detect(input, forwardParams); + return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, {width: det.imageWidth, height: det.imageHeight})); + } + getDefaultModelName() { + return "tiny_face_detector_model"; + } + extractParamsFromWeigthMap(weightMap) { + return super.extractParamsFromWeigthMap(weightMap); + } +} + +// src/globalApi/nets.ts +const nets = { + ssdMobilenetv1: new SsdMobilenetv1(), + tinyFaceDetector: new TinyFaceDetector(), + tinyYolov2: new TinyYolov2(), + faceLandmark68Net: new FaceLandmark68Net(), + faceLandmark68TinyNet: new FaceLandmark68TinyNet(), + faceRecognitionNet: new FaceRecognitionNet(), + faceExpressionNet: new FaceExpressionNet(), + ageGenderNet: new AgeGenderNet() +}; +const ssdMobilenetv1 = (input, options) => nets.ssdMobilenetv1.locateFaces(input, options); +const tinyFaceDetector = (input, options) => nets.tinyFaceDetector.locateFaces(input, options); +const tinyYolov23 = (input, options) => nets.tinyYolov2.locateFaces(input, options); +const detectFaceLandmarks = (input) => nets.faceLandmark68Net.detectLandmarks(input); +const detectFaceLandmarksTiny = (input) => nets.faceLandmark68TinyNet.detectLandmarks(input); +const computeFaceDescriptor = (input) => nets.faceRecognitionNet.computeFaceDescriptor(input); +const recognizeFaceExpressions = (input) => nets.faceExpressionNet.predictExpressions(input); +const predictAgeAndGender = (input) => nets.ageGenderNet.predictAgeAndGender(input); +const loadSsdMobilenetv1Model = (url) => nets.ssdMobilenetv1.load(url); +const loadTinyFaceDetectorModel = (url) => nets.tinyFaceDetector.load(url); +const loadTinyYolov2Model = (url) => nets.tinyYolov2.load(url); +const loadFaceLandmarkModel = (url) => nets.faceLandmark68Net.load(url); +const loadFaceLandmarkTinyModel = (url) => nets.faceLandmark68TinyNet.load(url); +const loadFaceRecognitionModel = (url) => nets.faceRecognitionNet.load(url); +const loadFaceExpressionModel = (url) => nets.faceExpressionNet.load(url); +const loadAgeGenderModel = (url) => nets.ageGenderNet.load(url); +const loadFaceDetectionModel = loadSsdMobilenetv1Model; +const locateFaces = ssdMobilenetv1; +const detectLandmarks = detectFaceLandmarks; + +// src/globalApi/PredictFaceExpressionsTask.ts +class PredictFaceExpressionsTaskBase extends ComposableTask { + constructor(parentTask, input, extractedFaces) { + super(); + this.parentTask = parentTask; + this.input = input; + this.extractedFaces = extractedFaces; + } +} +class PredictAllFaceExpressionsTask extends PredictFaceExpressionsTaskBase { + async run() { + const parentResults = await this.parentTask; + const faceExpressionsByFace = await extractAllFacesAndComputeResults(parentResults, this.input, async (faces) => await Promise.all(faces.map((face) => nets.faceExpressionNet.predictExpressions(face))), this.extractedFaces); + return parentResults.map((parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i])); + } + withAgeAndGender() { + return new PredictAllAgeAndGenderTask(this, this.input); + } +} +class PredictSingleFaceExpressionsTask extends PredictFaceExpressionsTaskBase { + async run() { + const parentResult = await this.parentTask; + if (!parentResult) { + return; + } + const faceExpressions = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.faceExpressionNet.predictExpressions(face), this.extractedFaces); + return extendWithFaceExpressions(parentResult, faceExpressions); + } + withAgeAndGender() { + return new PredictSingleAgeAndGenderTask(this, this.input); + } +} +class PredictAllFaceExpressionsWithFaceAlignmentTask extends PredictAllFaceExpressionsTask { + withAgeAndGender() { + return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptors() { + return new ComputeAllFaceDescriptorsTask(this, this.input); + } +} +class PredictSingleFaceExpressionsWithFaceAlignmentTask extends PredictSingleFaceExpressionsTask { + withAgeAndGender() { + return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptor() { + return new ComputeSingleFaceDescriptorTask(this, this.input); + } +} + +// src/globalApi/PredictAgeAndGenderTask.ts +class PredictAgeAndGenderTaskBase extends ComposableTask { + constructor(parentTask, input, extractedFaces) { + super(); + this.parentTask = parentTask; + this.input = input; + this.extractedFaces = extractedFaces; + } +} +class PredictAllAgeAndGenderTask extends PredictAgeAndGenderTaskBase { + async run() { + const parentResults = await this.parentTask; + const ageAndGenderByFace = await extractAllFacesAndComputeResults(parentResults, this.input, async (faces) => await Promise.all(faces.map((face) => nets.ageGenderNet.predictAgeAndGender(face))), this.extractedFaces); + return parentResults.map((parentResult, i) => { + const {age, gender, genderProbability} = ageAndGenderByFace[i]; + return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age); + }); + } + withFaceExpressions() { + return new PredictAllFaceExpressionsTask(this, this.input); + } +} +class PredictSingleAgeAndGenderTask extends PredictAgeAndGenderTaskBase { + async run() { + const parentResult = await this.parentTask; + if (!parentResult) { + return; + } + const {age, gender, genderProbability} = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.ageGenderNet.predictAgeAndGender(face), this.extractedFaces); + return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age); + } + withFaceExpressions() { + return new PredictSingleFaceExpressionsTask(this, this.input); + } +} +class PredictAllAgeAndGenderWithFaceAlignmentTask extends PredictAllAgeAndGenderTask { + withFaceExpressions() { + return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptors() { + return new ComputeAllFaceDescriptorsTask(this, this.input); + } +} +class PredictSingleAgeAndGenderWithFaceAlignmentTask extends PredictSingleAgeAndGenderTask { + withFaceExpressions() { + return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptor() { + return new ComputeSingleFaceDescriptorTask(this, this.input); + } +} + +// src/globalApi/ComputeFaceDescriptorsTasks.ts +class ComputeFaceDescriptorsTaskBase extends ComposableTask { + constructor(parentTask, input) { + super(); + this.parentTask = parentTask; + this.input = input; + } +} +class ComputeAllFaceDescriptorsTask extends ComputeFaceDescriptorsTaskBase { + async run() { + const parentResults = await this.parentTask; + const descriptors = await extractAllFacesAndComputeResults(parentResults, this.input, (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face))), null, (parentResult) => parentResult.landmarks.align(null, {useDlibAlignment: true})); + return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor)); + } + withFaceExpressions() { + return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withAgeAndGender() { + return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); + } +} +class ComputeSingleFaceDescriptorTask extends ComputeFaceDescriptorsTaskBase { + async run() { + const parentResult = await this.parentTask; + if (!parentResult) { + return; + } + const descriptor = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.faceRecognitionNet.computeFaceDescriptor(face), null, (parentResult2) => parentResult2.landmarks.align(null, {useDlibAlignment: true})); + return extendWithFaceDescriptor(parentResult, descriptor); + } + withFaceExpressions() { + return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withAgeAndGender() { + return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); + } +} + +// src/globalApi/DetectFaceLandmarksTasks.ts +import { + Tensor as Tensor5 +} from "@tensorflow/tfjs/dist/tf.es2017.js"; +class DetectFaceLandmarksTaskBase extends ComposableTask { + constructor(parentTask, input, useTinyLandmarkNet) { + super(); + this.parentTask = parentTask; + this.input = input; + this.useTinyLandmarkNet = useTinyLandmarkNet; + } + get landmarkNet() { + return this.useTinyLandmarkNet ? nets.faceLandmark68TinyNet : nets.faceLandmark68Net; + } +} +class DetectAllFaceLandmarksTask extends DetectFaceLandmarksTaskBase { + async run() { + const parentResults = await this.parentTask; + const detections = parentResults.map((res) => res.detection); + const faces = this.input instanceof Tensor5 ? await extractFaceTensors(this.input, detections) : await extractFaces(this.input, detections); + const faceLandmarksByFace = await Promise.all(faces.map((face) => this.landmarkNet.detectLandmarks(face))); + faces.forEach((f) => f instanceof Tensor5 && f.dispose()); + return parentResults.map((parentResult, i) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i])); + } + withFaceExpressions() { + return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withAgeAndGender() { + return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptors() { + return new ComputeAllFaceDescriptorsTask(this, this.input); + } +} +class DetectSingleFaceLandmarksTask extends DetectFaceLandmarksTaskBase { + async run() { + const parentResult = await this.parentTask; + if (!parentResult) { + return; + } + const {detection} = parentResult; + const faces = this.input instanceof Tensor5 ? await extractFaceTensors(this.input, [detection]) : await extractFaces(this.input, [detection]); + const landmarks = await this.landmarkNet.detectLandmarks(faces[0]); + faces.forEach((f) => f instanceof Tensor5 && f.dispose()); + return extendWithFaceLandmarks(parentResult, landmarks); + } + withFaceExpressions() { + return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); + } + withAgeAndGender() { + return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); + } + withFaceDescriptor() { + return new ComputeSingleFaceDescriptorTask(this, this.input); + } +} + +// src/globalApi/DetectFacesTasks.ts +class DetectFacesTaskBase extends ComposableTask { + constructor(input, options = new SsdMobilenetv1Options()) { + super(); + this.input = input; + this.options = options; + } +} +class DetectAllFacesTask extends DetectFacesTaskBase { + async run() { + const {input, options} = this; + const faceDetectionFunction = options instanceof TinyFaceDetectorOptions ? (input2) => nets.tinyFaceDetector.locateFaces(input2, options) : options instanceof SsdMobilenetv1Options ? (input2) => nets.ssdMobilenetv1.locateFaces(input2, options) : options instanceof TinyYolov2Options ? (input2) => nets.tinyYolov2.locateFaces(input2, options) : null; + if (!faceDetectionFunction) { + throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options"); + } + return faceDetectionFunction(input); + } + runAndExtendWithFaceDetections() { + return new Promise(async (res) => { + const detections = await this.run(); + return res(detections.map((detection) => extendWithFaceDetection({}, detection))); + }); + } + withFaceLandmarks(useTinyLandmarkNet = false) { + return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(), this.input, useTinyLandmarkNet); + } + withFaceExpressions() { + return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(), this.input); + } + withAgeAndGender() { + return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(), this.input); + } +} +class DetectSingleFaceTask extends DetectFacesTaskBase { + async run() { + const faceDetections = await new DetectAllFacesTask(this.input, this.options); + let faceDetectionWithHighestScore = faceDetections[0]; + faceDetections.forEach((faceDetection) => { + if (faceDetection.score > faceDetectionWithHighestScore.score) { + faceDetectionWithHighestScore = faceDetection; + } + }); + return faceDetectionWithHighestScore; + } + runAndExtendWithFaceDetection() { + return new Promise(async (res) => { + const detection = await this.run(); + return res(detection ? extendWithFaceDetection({}, detection) : void 0); + }); + } + withFaceLandmarks(useTinyLandmarkNet = false) { + return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(), this.input, useTinyLandmarkNet); + } + withFaceExpressions() { + return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(), this.input); + } + withAgeAndGender() { + return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(), this.input); + } +} + +// src/globalApi/detectFaces.ts +function detectSingleFace(input, options = new SsdMobilenetv1Options()) { + return new DetectSingleFaceTask(input, options); +} +function detectAllFaces(input, options = new SsdMobilenetv1Options()) { + return new DetectAllFacesTask(input, options); +} + +// src/globalApi/allFaces.ts +async function allFacesSsdMobilenetv1(input, minConfidence) { + console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"); + return await detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? {minConfidence} : {})).withFaceLandmarks().withFaceDescriptors(); +} +async function allFacesTinyYolov2(input, forwardParams = {}) { + console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"); + return await detectAllFaces(input, new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors(); +} +const allFaces = allFacesSsdMobilenetv1; + +// src/euclideanDistance.ts +function euclideanDistance(arr1, arr2) { + if (arr1.length !== arr2.length) + throw new Error("euclideanDistance: arr1.length !== arr2.length"); + const desc1 = Array.from(arr1); + const desc2 = Array.from(arr2); + return Math.sqrt(desc1.map((val, i) => val - desc2[i]).reduce((res, diff) => res + Math.pow(diff, 2), 0)); +} + +// src/globalApi/FaceMatcher.ts +class FaceMatcher { + constructor(inputs, distanceThreshold = 0.6) { + this._distanceThreshold = distanceThreshold; + const inputArray = Array.isArray(inputs) ? inputs : [inputs]; + if (!inputArray.length) { + throw new Error(`FaceRecognizer.constructor - expected atleast one input`); + } + let count = 1; + const createUniqueLabel = () => `person ${count++}`; + this._labeledDescriptors = inputArray.map((desc) => { + if (desc instanceof LabeledFaceDescriptors) { + return desc; + } + if (desc instanceof Float32Array) { + return new LabeledFaceDescriptors(createUniqueLabel(), [desc]); + } + if (desc.descriptor && desc.descriptor instanceof Float32Array) { + return new LabeledFaceDescriptors(createUniqueLabel(), [desc.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(queryDescriptor, descriptors) { + return descriptors.map((d) => euclideanDistance(d, queryDescriptor)).reduce((d1, d2) => d1 + d2, 0) / (descriptors.length || 1); + } + matchDescriptor(queryDescriptor) { + return this.labeledDescriptors.map(({descriptors, label}) => new FaceMatch(label, this.computeMeanDistance(queryDescriptor, descriptors))).reduce((best, curr) => best.distance < curr.distance ? best : curr); + } + findBestMatch(queryDescriptor) { + const bestMatch = this.matchDescriptor(queryDescriptor); + return bestMatch.distance < this.distanceThreshold ? bestMatch : new FaceMatch("unknown", bestMatch.distance); + } + toJSON() { + return { + distanceThreshold: this.distanceThreshold, + labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON()) + }; + } + static fromJSON(json) { + const labeledDescriptors = json.labeledDescriptors.map((ld) => LabeledFaceDescriptors.fromJSON(ld)); + return new FaceMatcher(labeledDescriptors, json.distanceThreshold); + } +} + +// src/globalApi/types.ts + +// src/globalApi/index.ts + +// src/tinyFaceDetector/index.ts +function createTinyFaceDetector(weights) { + const net = new TinyFaceDetector(); + net.extractWeights(weights); + return net; +} + +// src/resizeResults.ts +function resizeResults(results, dimensions) { + const {width, height} = new Dimensions(dimensions.width, dimensions.height); + if (width <= 0 || height <= 0) { + throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width, height})}`); + } + if (Array.isArray(results)) { + return results.map((obj) => resizeResults(obj, {width, height})); + } + if (isWithFaceLandmarks(results)) { + const resizedDetection = results.detection.forSize(width, height); + const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height); + return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks); + } + if (isWithFaceDetection(results)) { + return extendWithFaceDetection(results, results.detection.forSize(width, height)); + } + if (results instanceof FaceLandmarks || results instanceof FaceDetection) { + return results.forSize(width, height); + } + return results; +} + +// package.json +var version = "0.8.4"; + +// src/index.ts +import * as tf42 from "@tensorflow/tfjs/dist/tf.es2017.js"; +const node = typeof process !== "undefined"; +const browser3 = typeof navigator !== "undefined" && typeof navigator.userAgent !== "undefined"; +const version2 = {faceapi: version, node, browser: browser3}; +export { + AgeGenderNet, + BoundingBox, + Box, + ComposableTask, + ComputeAllFaceDescriptorsTask, + ComputeFaceDescriptorsTaskBase, + ComputeSingleFaceDescriptorTask, + DetectAllFaceLandmarksTask, + DetectAllFacesTask, + DetectFaceLandmarksTaskBase, + DetectFacesTaskBase, + DetectSingleFaceLandmarksTask, + DetectSingleFaceTask, + Dimensions, + FACE_EXPRESSION_LABELS, + FaceDetection, + FaceDetectionNet, + FaceExpressionNet, + FaceExpressions, + FaceLandmark68Net, + FaceLandmark68TinyNet, + FaceLandmarkNet, + FaceLandmarks, + FaceLandmarks5, + FaceLandmarks68, + FaceMatch, + FaceMatcher, + FaceRecognitionNet, + Gender, + LabeledBox, + LabeledFaceDescriptors, + NetInput, + NeuralNetwork, + ObjectDetection, + Point, + PredictedBox, + Rect, + SsdMobilenetv1, + SsdMobilenetv1Options, + TinyFaceDetector, + TinyFaceDetectorOptions, + TinyYolov2, + TinyYolov2Options, + TinyYolov2SizeType, + allFaces, + allFacesSsdMobilenetv1, + allFacesTinyYolov2, + awaitMediaLoaded, + bufferToImage, + computeFaceDescriptor, + createCanvas, + createCanvasFromMedia, + createFaceDetectionNet, + createFaceRecognitionNet, + createSsdMobilenetv1, + createTinyFaceDetector, + createTinyYolov2, + detectAllFaces, + detectFaceLandmarks, + detectFaceLandmarksTiny, + detectLandmarks, + detectSingleFace, + draw_exports as draw, + env, + euclideanDistance, + extendWithAge, + extendWithFaceDescriptor, + extendWithFaceDetection, + extendWithFaceExpressions, + extendWithFaceLandmarks, + extendWithGender, + extractFaceTensors, + extractFaces, + fetchImage, + fetchJson, + fetchNetWeights, + fetchOrThrow, + getContext2dOrThrow, + getMediaDimensions, + imageTensorToCanvas, + imageToSquare, + inverseSigmoid, + iou, + isMediaElement, + isMediaLoaded, + isWithAge, + isWithFaceDetection, + isWithFaceExpressions, + isWithFaceLandmarks, + isWithGender, + loadAgeGenderModel, + loadFaceDetectionModel, + loadFaceExpressionModel, + loadFaceLandmarkModel, + loadFaceLandmarkTinyModel, + loadFaceRecognitionModel, + loadSsdMobilenetv1Model, + loadTinyFaceDetectorModel, + loadTinyYolov2Model, + loadWeightMap, + locateFaces, + matchDimensions, + minBbox, + nets, + nonMaxSuppression, + normalize, + padToSquare, + predictAgeAndGender, + recognizeFaceExpressions, + resizeResults, + resolveInput, + shuffleArray, + sigmoid, + ssdMobilenetv1, + tf42 as tf, + tinyFaceDetector, + tinyYolov23 as tinyYolov2, + toNetInput, + utils_exports as utils, + validateConfig, + version2 as version +}; +//# sourceMappingURL=face-api.esm.nobundle.js.map diff --git a/dist/face-api.esm.nobundle.js.map b/dist/face-api.esm.nobundle.js.map new file mode 100644 index 0000000..a36da59 --- /dev/null +++ b/dist/face-api.esm.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, 'float32')\n const avg_g = tf.fill([...x.shape.slice(0, 3), 1], g, 'float32')\n const avg_b = tf.fill([...x.shape.slice(0, 3), 1], b, 'float32')\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, 'float32')\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 = tf.cast(input.toBatchTensor(112, true), 'float32');\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 = tf.cast(input.toBatchTensor(112, true), 'float32');\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([tf.fill([68], fillX, 'float32'), tf.fill([68], fillY, 'float32')], 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, 'float32'))\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 = tf.cast(input.toBatchTensor(112, true), 'float32');\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/dist/face-api.js b/dist/face-api.js index 76bda3c..82955a6 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 Uc.print(this,r)}clone(){return this.throwIfDisposed(),Uc.clone(this)}toString(r=!1){const l=this.dataSync();return aO(l,this.shape,this.dtype,r)}cast(r){return this.throwIfDisposed(),Uc.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(!ra(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,Fc,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=oa(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,kc)}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):Wc(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):Wc(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,Fc,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(ra(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 dn=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(_c(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 Bc;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)&&(Bc==null&&(Bc=document.createElement("canvas").getContext("2d")),Bc.canvas.width=x,Bc.canvas.height=v,Bc.drawImage(r,0,0,x,v),O=Bc.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,kc)}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 Mc(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=aa((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=aa((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=aa((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=aa((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=Pc(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 Pc(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=aa((l-f+U+G)/p+1,S),C=aa((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 aa(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 zc(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=zc(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=zc(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=Mc(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 ca=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 la=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=la(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 ha=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=oa(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 Gc=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 ua=z({pow_:c9});function lo(r,l){_c(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=oa(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 Vc=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 Yc=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=Yc(g)}else{const g=[u,2*(l-1)],f=ie(Gc(r),[u,l]),I=ie(Eu(r),[u,l]),S=Vc(vt(f,[0,1],[u,l-2]),1),x=ae(Vc(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=Yc(C)}if(p=Gc(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=Gc(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 da=z({step_:x9});function pa(r,l,u){if(_c(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 la(Bn(r),u);if(l===-Infinity)return ug(Bn(r),u);if(l==="euclidean"||l===2)return ps(Fe(ua(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 la(Fe(Bn(r),u[0]),u[1]-1);if(l===Infinity)return la(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=zc(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=ha(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=pa([[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),pa([[-1]]),pa([[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(dn(oe,ge),ne)),Te=vt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=$t(S);if(v===0)f=Be(Te,dn(Ve,dn(rt,Te)));else{const Kt=Be(Te,dn(Ve,dn(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,dn(dn(Ut,S),Ct));else{const Kt=Be(Ut,dn(dn(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:Yc,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,da(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:kc,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:()=>dn(r,g,!1,!0),b:()=>dn(p,r,!0,!1)}:!f&&I?{a:()=>dn(r,g,!1,!1),b:()=>dn(r,p,!0,!1)}:f&&!I?{a:()=>dn(g,r,!1,!0),b:()=>dn(p,r,!1,!1)}:{a:()=>dn(g,r,!0,!0),b:()=>dn(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:Fc,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(ha(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,ca(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=Mc(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,ua(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),da(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(da(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:()=>Vc(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(ua(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=Mc(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=ea({width:l,height:l}),O=r instanceof g?r:Nc(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:Nc(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 Zo(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=ea({width:x,height:v});return Un(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const wg=Xe(Je());async function Qo(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 Hc=Xe(Je());function es(r,l,u){return Hc.tidy(()=>{let p=Hc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Hc.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 ma(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 qc(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 jc(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 Kc(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(!na(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=qc(r,l),p=jc(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=Kc(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 po=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 po.tidy(()=>{const u=po.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(po.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=po.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 Xc=Xe(Je());function Uu(r,l){return Xc.tidy(()=>Xc.add(Xc.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 Jc=Xe(Je());class Mm extends Og{constructor(r=new Cg){super("FaceExpressionNet",r)}forwardInput(r){return Jc.tidy(()=>Jc.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(Jc.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 Dc(x.map(C=>`${C.expression} (${sa(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 Jo(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 Rc&&(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:()=>Dc,DrawTextFieldOptions:()=>Zm,drawContour:()=>ur,drawDetections:()=>E7,drawFaceExpressions:()=>bZ,drawFaceLandmarks:()=>wZ});function LZ(r,l){const u=qc(r,l),p=jc(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=Kc(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 tn=Xe(Je());function fD(r,l,u){return tn.add(tn.conv2d(r,l.filters,u,"same"),l.bias)}function nx(r,l,u=!0){let p=u?tn.relu(r):r;return p=es(p,l.separable_conv0,[1,1]),p=es(tn.relu(p),l.separable_conv1,[1,1]),p=tn.maxPool(p,[3,3],[2,2],"same"),p=tn.add(p,fD(r,l.expansion_conv,[2,2])),p}function IZ(r,l){let u=es(tn.relu(r),l.separable_conv0,[1,1]);return u=es(tn.relu(u),l.separable_conv1,[1,1]),u=es(tn.relu(u),l.separable_conv2,[1,1]),u=tn.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 tn.tidy(()=>{const u=tn.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(tn.scalar(256));let f=tn.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=tn.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,"float32"),fs.fill([68],C,"float32")],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 Rc(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 Ac 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 mo=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 mo.tidy(()=>{const u=mo.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(mo.scalar(255));let f=Sg(g,l.dense0,!0);return f=Sg(f,l.dense1),f=Sg(f,l.dense2),f=mo.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 Ac{}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 Tc 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 Tc;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)&&Ec(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},ya={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:ya,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 fo=Xe(Je());function Ks(r,l,u){return fo.tidy(()=>{let p=fo.conv2d(r,l.filters,u,"same");return p=fo.add(p,l.batch_norm_offset),fo.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 fa(r,l){return Mu.tidy(()=>{const u=r.shape[0],p=Mu.reshape(ma(r,l.box_encoding_predictor),[u,-1,1,4]),g=Mu.reshape(ma(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=fa(l,u.box_predictor_0),U=fa(r,u.box_predictor_1),G=fa(g,u.box_predictor_2),ne=fa(I,u.box_predictor_3),te=fa(x,u.box_predictor_4),oe=fa(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 Xo 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 Cc(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 Xo;return l.extractWeights(r),l}function UC(r){return $S(r)}class BC extends Xo{}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 go=Xe(Je());function Sr(r,l){return go.tidy(()=>{let u=go.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=go.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=go.add(u,l.bias),Qc(u)})}const rx=Xe(Je());function kZ(r,l){const u=qc(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=jc(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=Kc(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),ma(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Qc(ma(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,ma(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 ta(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+xc(te[oe][ge][fe][0]))/x*I,Ve=(oe+xc(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 Oc(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 Sc 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 Sc(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 ga(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 Qo(l,f):await Zo(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 ga([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 Ic 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 Xo,tinyFaceDetector:new Ic,tinyYolov2:new Sc,faceLandmark68Net:new Ac,faceLandmark68TinyNet:new Um,faceRecognitionNet:new Tc,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 ga(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 ga(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 ga(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 Qo(this.input,l):await Zo(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)=>Jo(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 Qo(this.input,[l]):await Zo(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),Jo(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 Ic;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 Jo(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.8.3";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=zc(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=zc(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=Mc(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 ca=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 la=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=la(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 ha=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=oa(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 Gc=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 ua=z({pow_:c9});function lo(r,l){_c(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=oa(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 Vc=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 Yc=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=Yc(g)}else{const g=[u,2*(l-1)],f=ie(Gc(r),[u,l]),I=ie(Eu(r),[u,l]),S=Vc(vt(f,[0,1],[u,l-2]),1),x=ae(Vc(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=Yc(C)}if(p=Gc(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=Gc(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 da=z({step_:x9});function pa(r,l,u){if(_c(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 la(Bn(r),u);if(l===-Infinity)return ug(Bn(r),u);if(l==="euclidean"||l===2)return ps(Fe(ua(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 la(Fe(Bn(r),u[0]),u[1]-1);if(l===Infinity)return la(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=zc(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=ha(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=pa([[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),pa([[-1]]),pa([[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(dn(oe,ge),ne)),Te=vt(f,[v,0],[u-v,p]),Ve=ae(Ae,S),rt=$t(S);if(v===0)f=Be(Te,dn(Ve,dn(rt,Te)));else{const Kt=Be(Te,dn(Ve,dn(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,dn(dn(Ut,S),Ct));else{const Kt=Be(Ut,dn(dn(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:Yc,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,da(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:kc,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:()=>dn(r,g,!1,!0),b:()=>dn(p,r,!0,!1)}:!f&&I?{a:()=>dn(r,g,!1,!1),b:()=>dn(r,p,!0,!1)}:f&&!I?{a:()=>dn(g,r,!1,!0),b:()=>dn(p,r,!1,!1)}:{a:()=>dn(g,r,!0,!0),b:()=>dn(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:Fc,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(ha(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,ca(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=Mc(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,ua(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),da(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(da(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:()=>Vc(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(ua(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=Mc(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=ea({width:l,height:l}),O=r instanceof g?r:Nc(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:Nc(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 Zo(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=ea({width:x,height:v});return Un(O).putImageData(g.getImageData(I,S,x,v),0,0),O})}const wg=Xe(Je());async function Qo(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 Hc=Xe(Je());function es(r,l,u){return Hc.tidy(()=>{let p=Hc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,u,"same");return p=Hc.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 ma(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 qc(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 jc(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 Kc(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(!na(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=qc(r,l),p=jc(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=Kc(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 po=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 po.tidy(()=>{const u=po.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(po.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=po.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 Xc=Xe(Je());function Uu(r,l){return Xc.tidy(()=>Xc.add(Xc.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 Jc=Xe(Je());class Mm extends Og{constructor(r=new Cg){super("FaceExpressionNet",r)}forwardInput(r){return Jc.tidy(()=>Jc.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(Jc.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 Dc(x.map(C=>`${C.expression} (${sa(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 Jo(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 Rc&&(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:()=>Dc,DrawTextFieldOptions:()=>Zm,drawContour:()=>ur,drawDetections:()=>E7,drawFaceExpressions:()=>bZ,drawFaceLandmarks:()=>wZ});function LZ(r,l){const u=qc(r,l),p=jc(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=Kc(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 tn=Xe(Je());function fD(r,l,u){return tn.add(tn.conv2d(r,l.filters,u,"same"),l.bias)}function nx(r,l,u=!0){let p=u?tn.relu(r):r;return p=es(p,l.separable_conv0,[1,1]),p=es(tn.relu(p),l.separable_conv1,[1,1]),p=tn.maxPool(p,[3,3],[2,2],"same"),p=tn.add(p,fD(r,l.expansion_conv,[2,2])),p}function IZ(r,l){let u=es(tn.relu(r),l.separable_conv0,[1,1]);return u=es(tn.relu(u),l.separable_conv1,[1,1]),u=es(tn.relu(u),l.separable_conv2,[1,1]),u=tn.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 tn.tidy(()=>{const u=tn.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(tn.scalar(256));let f=tn.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=tn.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,"float32"),fs.fill([68],C,"float32")],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 Rc(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 Ac 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 mo=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 mo.tidy(()=>{const u=mo.cast(r.toBatchTensor(112,!0),"float32"),p=[122.782,117.001,104.298],g=Ys(u,p).div(mo.scalar(255));let f=Sg(g,l.dense0,!0);return f=Sg(f,l.dense1),f=Sg(f,l.dense2),f=mo.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 Ac{}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 Tc 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 Tc;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)&&Ec(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},ya={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:ya,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 fo=Xe(Je());function Ks(r,l,u){return fo.tidy(()=>{let p=fo.conv2d(r,l.filters,u,"same");return p=fo.add(p,l.batch_norm_offset),fo.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 fa(r,l){return Mu.tidy(()=>{const u=r.shape[0],p=Mu.reshape(ma(r,l.box_encoding_predictor),[u,-1,1,4]),g=Mu.reshape(ma(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=fa(l,u.box_predictor_0),U=fa(r,u.box_predictor_1),G=fa(g,u.box_predictor_2),ne=fa(I,u.box_predictor_3),te=fa(x,u.box_predictor_4),oe=fa(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 Xo 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 Cc(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 Xo;return l.extractWeights(r),l}function UC(r){return $S(r)}class BC extends Xo{}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 go=Xe(Je());function Sr(r,l){return go.tidy(()=>{let u=go.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return u=go.separableConv2d(u,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),u=go.add(u,l.bias),Qc(u)})}const rx=Xe(Je());function kZ(r,l){const u=qc(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=jc(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=Kc(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),ma(u,l.conv8,"valid",!1)}runMobilenet(r,l){let u=this.config.isFirstLayerConv2d?Qc(ma(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,ma(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 ta(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+xc(te[oe][ge][fe][0]))/x*I,Ve=(oe+xc(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 Oc(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 Sc 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 Sc(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 ga(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 Qo(l,f):await Zo(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 ga([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 Ic 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 Xo,tinyFaceDetector:new Ic,tinyYolov2:new Sc,faceLandmark68Net:new Ac,faceLandmark68TinyNet:new Um,faceRecognitionNet:new Tc,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 ga(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 ga(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 ga(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 Qo(this.input,l):await Zo(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)=>Jo(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 Qo(this.input,[l]):await Zo(this.input,[l]),p=await this.landmarkNet.detectLandmarks(u[0]);return u.forEach(g=>g instanceof Hu.Tensor&&g.dispose()),Jo(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 Ic;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 Jo(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.8.4";return g2();})(); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.node.js b/dist/face-api.node.js index abf81fd..d162219 100644 --- a/dist/face-api.node.js +++ b/dist/face-api.node.js @@ -3819,7 +3819,7 @@ return a / b;`,w7=` `)}function sJ(r,l,h,d){const f=qt(l),g=d[d.length-1],S=new Array(g).fill(0),L=l.length,x=h==="complex64"?Ou(r):r;if(L>1)for(let A=0;AJR){const se=Cu*S;let fe=Array.from(r.slice(0,se)),de=Array.from(r.slice((L-Cu)*S,L*S));return h==="complex64"&&(fe=Ou(fe),de=Ou(de)),["["+fe.map((Ae,xe)=>Ru(Ae,f[xe],h)).join(", ")+", ..., "+de.map((Ae,xe)=>Ru(Ae,f[L-Cu+xe],h)).join(", ")+"]"]}const te=h==="complex64"?Ou(r):Array.from(r);return["["+te.map((se,fe)=>Ru(se,f[fe],h)).join(", ")+"]"]}const A=l.slice(1),O=d.slice(1),C=d[0]*S,$=[];if(L>JR){for(let te=0;te`Length of values '${d}' 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=h||zR(l,this.size),this.strides=Nu(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 h=this.locToIndex(l);this.values[h]=r}get(...r){r.length===0&&(r=[0]);let l=0;for(const d of r){if(d<0||d>=this.shape[l]){const f=`Requested out of range element at ${r}. Buffer shape=${this.shape}`;throw new Error(f)}l++}let h=r[r.length-1];for(let d=0;ddI(h))}catch(h){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=Yi().readSync(this.dataId);if(this.dtype==="string")try{return r.map(l=>dI(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 Yi().read(this.dataId);return this.dtype==="string"?r:new Uint8Array(r.buffer)}dispose(){if(this.isDisposed)return;Yi().disposeTensor(this),this.isDisposedInternal=!0}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(r=!1){return Uc.print(this,r)}clone(){return this.throwIfDisposed(),Uc.clone(this)}toString(r=!1){const l=this.dataSync();return ZR(l,this.shape,this.dtype,r)}cast(r){return this.throwIfDisposed(),Uc.cast(this,r)}variable(r=!0,l,h){return this.throwIfDisposed(),Yi().makeVariable(this,r,l,h)}}Object.defineProperty(Tn,Symbol.hasInstance,{value:r=>!!r&&r.data!=null&&r.dataSync!=null&&r.throwIfDisposed!=null});class Pf extends Tn{constructor(r,l,h,d){super(r.shape,r.dtype,r.dataId,d);this.trainable=l,this.name=h}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(!oa(r.shape,this.shape))throw new Error(`shape of the new value (${r.shape}) and previous value (${this.shape}) must match`);Yi().disposeTensor(this),this.dataId=r.dataId,Yi().incRef(this,null)}dispose(){Yi().disposeVariable(this),this.isDisposedInternal=!0}}Object.defineProperty(Pf,Symbol.hasInstance,{value:r=>r instanceof Tn&&r.assign!=null&&r.assign instanceof Function});var iO;(function(r){r.R0="R0",r.R1="R1",r.R2="R2",r.R3="R3",r.R4="R4",r.R5="R5",r.R6="R6"})(iO||(iO={}));var mI;(function(r){r.float32="float32",r.int32="int32",r.bool="int32",r.complex64="complex64"})(mI||(mI={}));var fI;(function(r){r.float32="float32",r.int32="int32",r.bool="bool",r.complex64="complex64"})(fI||(fI={}));var gI;(function(r){r.float32="float32",r.int32="float32",r.bool="float32",r.complex64="complex64"})(gI||(gI={}));var yI;(function(r){r.float32="complex64",r.int32="complex64",r.bool="complex64",r.complex64="complex64"})(yI||(yI={}));const rJ={float32:gI,int32:mI,bool:fI,complex64:yI};function rO(r,l){if(r==="string"||l==="string"){if(r==="string"&&l==="string")return"string";throw new Error(`Can not upcast ${r} with ${l}`)}return rJ[r][l]}function mt(r,l){if(r.dtype===l.dtype)return[r,l];const h=rO(r.dtype,l.dtype);return[r.cast(h),l.cast(h)]}function zf(r){const l=[],h=new Set;return oO(r,l,h),l}function oO(r,l,h){if(r==null)return;if(r instanceof Tn){l.push(r);return}if(!oJ(r))return;const d=r;for(const f in d){const g=d[f];h.has(g)||(h.add(g),oO(g,l,h))}}function oJ(r){return Array.isArray(r)||typeof r=="object"}class aO{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 Eu{constructor(r){this.ENV=r,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new aO}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=cI(r);l.forEach(h=>{h.disposeFunc!=null&&h.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 h=l.factory();if(h&&!(h instanceof h2)&&typeof h.then=="function"){const d=++this.pendingBackendInitId,f=h.then(g=>d(dthis.registryFactory[l].priority-this.registryFactory[r].priority)}initializeBackendsAndReturnBest(){const r=this.getSortedBackends();for(let l=0;lthis.startScope(h),()=>this.endScope(d),()=>(d=l(),d instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),d))}scopedRun(r,l,h){r();try{const d=h();return l(),d}catch(d){throw l(),d}}nextTensorId(){return Eu.nextTensorId++}nextVariableId(){return Eu.nextVariableId++}clone(r){const l=this.makeTensorFromDataId(r.dataId,r.shape,r.dtype),h={x:r},d=g=>({x:()=>{const S="float32",L={x:g},x={dtype:S};return H.runKernelFunc(A=>A.cast(g,S),L,null,Fc,x)}}),f=[];return this.addTapeNode(this.state.activeScope.name,h,[l],d,f,{}),l}runKernel(r,l,h,d,f){const g=null,S=null;return this.runKernelFunc(g,l,S,r,h,d,f)}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(r,l,h){const d=this.backend.numDataIds();let f=0;h.forEach(L=>{f+=L.dtype==="complex64"?3:1});const g=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],S=d-l-f-g;if(S>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${S} data ids) after running '${r}'`)}runKernelFunc(r,l,h,d,f,g,S){let L,x=[];const A=this.isTapeOn();d==null&&(d=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 $;const z=Wf(d,this.backendName);let ne;if(z!=null)$=()=>{const se=this.backend.numDataIds();ne=z.kernelFunc({inputs:l,attrs:f,backend:this.backend});const fe=Array.isArray(ne)?ne:[ne];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,se,fe);const de=fe.map(({dataId:Ae,shape:xe,dtype:Me})=>this.makeTensorFromDataId(Ae,xe,Me));if(A){let Ae=this.getTensorsForGradient(d,l,de);if(Ae==null){S==null&&(S=[]);const xe=de.filter((Me,Ke)=>S[Ke]);Ae=(g||[]).slice().concat(xe)}x=this.saveTensorsForBackwardMode(Ae)}return de};else{const se=fe=>{if(!A)return;x=fe.map(de=>this.keep(this.clone(de)))};$=()=>{const fe=this.backend.numDataIds();ne=this.tidy(()=>r(this.backend,se));const de=Array.isArray(ne)?ne:[ne];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(d,fe,de),de}}let te;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?L=$():(te=this.profiler.profileKernel(d,l,()=>$()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(te),L=te.outputs)}),A&&this.addTapeNode(d,l,L,h,x,f),this.state.profiling&&this.state.activeProfile.kernels.push({name:d,bytesAdded:this.state.numBytes-O,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-C,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(l).map(se=>l[se]!=null?l[se].shape:null),outputShapes:L.map(se=>se.shape),kernelTimeMs:te.timeMs,extraInfo:te.extraInfo}),Array.isArray(ne)?L:L[0]}saveTensorsForBackwardMode(r){const l=r.map(h=>this.keep(this.clone(h)));return l}getTensorsForGradient(r,l,h){const d=aI(r);if(d!=null){const f=d.inputsToSave||[],g=d.outputsToSave||[];let S;d.saveAllInputs?(Z(Array.isArray(l),()=>"saveAllInputs is true, expected inputs to be an array."),S=Object.keys(l).map(x=>l[x])):S=f.map(x=>l[x]);const L=h.filter((x,A)=>g[A]);return S.concat(L)}return null}makeTensor(r,l,h,d){if(r==null)throw new Error("Values passed to engine.makeTensor() are null");h=h||"float32",d=d||this.backend;let f=r;h==="string"&&Au(r[0])&&(f=r.map(L=>qR(L)));const g=d.write(f,l,h),S=new Tn(l,h,g,this.nextTensorId());if(this.incRef(S,d),h==="string"){const L=this.state.tensorInfo.get(g),x=HR(f);this.state.numBytes+=x-L.bytes,L.bytes=x}return S}makeTensorFromDataId(r,l,h,d){h=h||"float32";const f=new Tn(l,h,r,this.nextTensorId());return this.incRef(f,d),f}makeVariable(r,l=!0,h,d){h=h||this.nextVariableId().toString(),d!=null&&d!==r.dtype&&(r=r.cast(d));const f=new Pf(r,l,h,this.nextTensorId());if(this.state.registeredVariables[f.name]!=null)throw new Error(`Variable with name ${f.name} was already registered`);return this.state.registeredVariables[f.name]=f,this.incRef(f,this.backend),f}incRef(r,l){const h=this.state.tensorInfo.has(r.dataId)?this.state.tensorInfo.get(r.dataId).refCount:0;if(this.state.numTensors++,r.dtype==="string"&&this.state.numStringTensors++,h===0){this.state.numDataBuffers++;let d=0;r.dtype!=="complex64"&&r.dtype!=="string"&&(d=r.size*VR(r.dtype)),this.state.tensorInfo.set(r.dataId,{backend:l||this.backend,dtype:r.dtype,shape:r.shape,bytes:d,refCount:0}),this.state.numBytes+=d}this.state.tensorInfo.get(r.dataId).refCount++,r instanceof Pf||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),h=l.refCount;h<=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,h=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(d=>d.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-l,this.state.activeProfile.newTensors=this.state.numTensors-h;for(const d of this.state.activeProfile.kernels)d.kernelTimeMs=await d.kernelTimeMs,d.extraInfo=await d.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(r,l,h,d,f,g){const S={id:this.state.nextTapeNodeId++,kernelName:r,inputs:l,outputs:h,saved:f},L=aI(r);L!=null&&(d=L.gradFunc),d!=null&&(S.gradient=x=>(x=x.map((A,O)=>{if(A==null){const C=h[O],$=aa(C.size,C.dtype);return this.makeTensor($,C.shape,C.dtype)}return A}),d(x.length>1?x:x[0],f,g))),this.state.activeTape.push(S)}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=zf(r),h=new Set(l.map(f=>f.id));for(let f=0;f{!f.kept&&f.scopeId===d.id&&this.track(f)})}gradients(r,l,h,d=!1){if(Z(l.length>0,()=>"gradients() received an empty list of xs."),h!=null&&h.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${h.dtype}'`);const f=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",r));Z(f instanceof Tn,()=>"The result y returned by f() must be a tensor.");const g=KR(this.state.activeTape,l,f);if(!d&&g.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 S={};S[f.id]=h==null?aJ(f.shape):h,XR(S,g,x=>this.tidy(x),cJ);const L=l.map(x=>S[x.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(x=>{for(const A of x.saved)A.dispose()}),this.state.activeTape=null),{value:f,grads:L}})}customGrad(r){return Z(lI(r),()=>"The f passed in customGrad(f) must be a function."),(...l)=>{Z(l.every(f=>f instanceof Tn),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let h;const d={};return l.forEach((f,g)=>{d[g]=f}),this.runKernelFunc((f,g)=>(h=r(...l,g),Z(h.value instanceof Tn,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),Z(lI(h.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),h.value),d,(f,g)=>{const S=h.gradFunc(f,g),L=Array.isArray(S)?S:[S];Z(L.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(L.every(A=>A instanceof Tn),()=>"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 L.forEach((A,O)=>{x[O]=()=>A}),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=uI(),h=await this.backend.time(r);return h.wallMs=uI()-l,h}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 aO;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}}Eu.nextTensorId=0;Eu.nextVariableId=0;function aJ(r){const l=Uf(qt(r),"float32");return H.makeTensor(l,r,"float32")}function bI(){const r=sI();if(r._tfengine==null){const l=new d2(r);r._tfengine=new Eu(l)}return m2(r._tfengine.ENV),tO(()=>r._tfengine),r._tfengine}const H=bI();function cJ(r,l){const h={a:r,b:l};return H.runKernelFunc((d,f)=>{const g=d.add(r,l);return f([r,l]),g},h,null,kc)}function cO(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}const br=Es();br.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.")});br.registerFlag("IS_BROWSER",()=>cO());br.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");br.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));br.registerFlag("PROD",()=>!1);br.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>br.getBool("DEBUG"));br.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);br.registerFlag("IS_TEST",()=>!1);function wr(r,l){let h=r;if(Ds(r))return l==="string"?[]:[r.length];if(!Array.isArray(r))return[];const d=[];for(;Array.isArray(h)||Ds(h)&&l!=="string";)d.push(h.length),h=h[0];return Array.isArray(r)&&Es().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&lO(r,d,[]),d}function lO(r,l,h){if(h=h||[],!Array.isArray(r)&&!Ds(r)){Z(l.length===0,()=>`Element arr[${h.join("][")}] is a primitive, but should be an array/TypedArray of ${l[0]} elements`);return}Z(l.length>0,()=>`Element arr[${h.join("][")}] should be a primitive, but is an array of ${r.length} elements`),Z(r.length===l[0],()=>`Element arr[${h.join("][")}] should have ${l[0]} elements, but has ${r.length} elements`);const d=l.slice(1);for(let f=0;f=0&&(f=d),hO(d,f,l,h),r==null||!Ds(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 '${h}' must be a Tensor or TensorLike, but got '${x}'`)}const g=wr(r,f);!Ds(r)&&!Array.isArray(r)&&(r=[r]);const S=!0,L=f!=="string"?$f(r,f):Wc(r,[],S);return H.makeTensor(L,g,f)}function Gf(r,l,h,d="numeric"){if(!Array.isArray(r))throw new Error(`Argument ${l} passed to ${h} must be a \`Tensor[]\` or \`TensorLike[]\``);const f=r;return f.map((g,S)=>M(g,`${l}[${S}]`,h),d)}const uO="__op";function G(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 h=l[0];const d=r[h];h.endsWith("_")&&(h=h.substring(0,h.length-1)),h=h+uO;const f=(...g)=>{H.startScope(h);try{const S=d(...g);return S instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),H.endScope(S),S}catch(S){throw H.endScope(null),S}};return Object.defineProperty(f,"name",{value:h,configurable:!0}),f}function lJ(r,l){const h=M(r,"real","complex"),d=M(l,"imag","complex");Zt(h.shape,d.shape,`real and imag shapes, ${h.shape} and ${d.shape}, must match in call to tf.complex().`);const f=S=>S.complex(h,d),g={real:h,imag:d};return H.runKernelFunc(f,g,null,E2)}const qi=G({complex_:lJ});function ji(r,l,h,d){if(d==null&&(d=vu(r)),d==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!Ds(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){Bf(l);const f=qt(l),g=qt(h);Z(f===g,()=>`Based on the provided shape, [${l}], the tensor should have ${f} values but has ${g}`);for(let S=0;S`Error creating a new Tensor. Inferred shape (${h}) does not match the provided shape (${l}). `)}}return!Ds(r)&&!Array.isArray(r)&&(r=[r]),l=l||h,r=d!=="string"?$f(r,d):Wc(r,[],!0),H.makeTensor(r,l,d)}function wI(r,l,h){const d=wr(r,h);return ji(r,l,d,h)}function Du(r,l="float32",h){return l=l||"float32",Bf(r),new eO(r,l,h)}function hJ(r,l){const h=M(r,"x","cast");if(!GR(l))throw new Error(`Failed to cast to unknown dtype ${l}`);if(l==="string"&&h.dtype!=="string"||l!=="string"&&h.dtype==="string")throw new Error("Only strings can be casted to strings");const d={x:h},f={dtype:l};return H.runKernelFunc(g=>g.cast(h,l),d,null,Fc,f)}const Le=G({cast_:hJ});function uJ(r){const l=M(r,"x","clone",null),h=()=>H.makeTensorFromDataId(l.dataId,l.shape,l.dtype),d={x:l};return H.runKernelFunc(h,d,null,tf)}const bi=G({clone_:uJ});function LI(r,l=!1){console.log(r.toString(l))}bI();const dJ={buffer:Du,cast:Le,clone:bi,print:LI};nO(dJ);function pJ(r,l){const h=M(r,"x","reshape",null),d={x:h},f={shape:l},g=(S,L)=>(l=MR(l,h.size),Z(h.size===qt(l),()=>"new shape and old shape must have the same number of elements."),L([h]),S.reshape(h,l));return H.runKernelFunc(g,d,null,mf,f)}const re=G({reshape_:pJ});function mJ(r,l,h=!1,d=!1){let f=M(r,"a","matMul"),g=M(l,"b","matMul");[f,g]=mt(f,g),Z(f.rank>=2&&g.rank>=2&&f.rank===g.rank,()=>`Error in matMul: inputs must have the same rank of at least 2, got ranks ${f.rank} and ${g.rank}.`);const S=h?f.shape[f.rank-2]:f.shape[f.rank-1],L=d?g.shape[g.rank-1]:g.shape[g.rank-2],x=h?f.shape[f.rank-1]:f.shape[f.rank-2],A=d?g.shape[g.rank-2]:g.shape[g.rank-1],O=f.shape.slice(0,-2),C=g.shape.slice(0,-2),$=qt(O),z=qt(C);Z(oa(O,C),()=>`Error in matMul: outer dimensions (${O}) and (${C}) of Tensors with shapes ${f.shape} and ${g.shape} must match.`),Z(S===L,()=>`Error in matMul: inner shapes (${S}) and (${L}) of Tensors with shapes ${f.shape} and ${g.shape} and transposeA=${h} and transposeB=${d} must match.`);const ne=f.shape.slice(0,-2).concat([x,A]),te=h?re(f,[$,S,x]):re(f,[$,x,S]),se=d?re(g,[z,A,L]):re(g,[z,L,A]),fe=(Me,Ke)=>(Ke([te,se]),Me.batchMatMul(te,se,h,d)),de={a:te,b:se},Ae={transposeA:h,transposeB:d},xe=H.runKernelFunc(fe,de,null,Mm,Ae);return re(xe,ne)}const pn=G({matMul_:mJ});function fJ(r,l){const h=M(r,"x","transpose");if(l==null&&(l=h.shape.map((g,S)=>S).reverse()),Z(h.rank===l.length,()=>`Error in transpose: rank of input ${h.rank} must match length of perm ${l}.`),l.forEach(g=>{Z(g>=0&&g`All entries in 'perm' must be between 0 and ${h.rank-1} but got ${l}`)}),h.rank<=1)return h.clone();const d={x:h},f={perm:l};return H.runKernelFunc(g=>g.transpose(h,l),d,null,Ef,f)}const Wt=G({transpose_:fJ});function SI(r,l,h){if(_c(r),l!=null&&l.length!==3)throw new Error("tensor3d() requires shape to have three numbers");const d=wr(r,h);if(d.length!==3&&d.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(d.length===1&&l==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return ji(r,l,d,h)}const II={};vc(II,{fromPixels:()=>bJ,toPixels:()=>yJ});let Bc;function gJ(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 h=!1,d=!1,f=!1,g=!1,S=!1;if(r.data instanceof Uint8Array)h=!0;else if(typeof ImageData!="undefined"&&r instanceof ImageData)d=!0;else if(typeof HTMLVideoElement!="undefined"&&r instanceof HTMLVideoElement)f=!0;else if(typeof HTMLImageElement!="undefined"&&r instanceof HTMLImageElement)g=!0;else if(r.getContext!=null)S=!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(f){const z=2;if(f&&r.readyState element.")}const L=Wf(rI,H.backendName);if(L!=null){const z={pixels:r},ne={numChannels:l};return H.runKernel(rI,z,ne)}const[x,A]=f?[r.videoWidth,r.videoHeight]:[r.width,r.height];let O;S?O=r.getContext("2d").getImageData(0,0,x,A).data:d||h?O=r.data:(g||f)&&(Bc==null&&(Bc=document.createElement("canvas").getContext("2d")),Bc.canvas.width=x,Bc.canvas.height=A,Bc.drawImage(r,0,0,x,A),O=Bc.getImageData(0,0,x,A).data);let C;if(l===4)C=new Int32Array(O);else{const z=x*A;C=new Int32Array(z*l);for(let ne=0;ne4||g===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${g}`);if(h.dtype!=="float32"&&h.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${h.dtype}. Please use float32 or int32 tensors.`);const S=await h.data(),L=h.dtype==="float32"?255:1,x=new Uint8ClampedArray(f*d*4);for(let A=0;A1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${z}.`)}else if(h.dtype==="int32"&&(z<0||z>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${z}.`);g===1?(O[0]=z*L,O[1]=z*L,O[2]=z*L):O[$]=z*L}const C=A*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=f,l.height=d;const A=l.getContext("2d"),O=new ImageData(x,f,d);A.putImageData(O,0,0)}return h!==r&&h.dispose(),x}const bJ=G({fromPixels_:gJ});function dO(r,l,h){const d=r.shape.length;Z(d===l.length,()=>`Error in slice${d}D: Length of begin ${l} must match the rank of the array (${d}).`),Z(d===h.length,()=>`Error in slice${d}D: Length of size ${h} must match the rank of the array (${d}).`);for(let f=0;f`Error in slice${d}D: begin[${f}] + size[${f}] (${l[f]+h[f]}) would overflow input.shape[${f}] (${r.shape[f]})`)}function Vf(r,l,h){let d;const f=r.shape.length;typeof l=="number"?d=[l,...new Array(f-1).fill(0)]:l.length{Z(S!==-1,()=>"slice() does not support negative begin indexing.")});let g;return h==null?g=new Array(f).fill(-1):typeof h=="number"?g=[h,...new Array(f-1).fill(-1)]:h.lengthS>=0?S:(Z(S===-1,()=>`Negative size values should be exactly -1 but got ${S} for the slice() size at index ${L}.`),r.shape[L]-d[L])),[d,g]}function wJ(r){Es().getBool("DEPRECATION_WARNINGS_ENABLED")&&console.warn(r+" You can disable deprecation warnings with tf.disableDeprecationWarnings().")}sO(wJ);function pO(r,l){return H.tidy(r,l)}function mO(r){const l=zf(r);l.forEach(h=>h.dispose())}function LJ(r,l){let h=M(r,"a","add"),d=M(l,"b","add");[h,d]=mt(h,d);const f=(S,L)=>{const x=S.add(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,kc)}const St=G({add_:LJ});function SJ(r,l){let h=M(r,"a","floorDiv"),d=M(l,"b","floorDiv");[h,d]=mt(h,d);const f=(S,L)=>{const x=S.floorDiv(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,Zm)}const xI=G({floorDiv_:SJ});function IJ(r,l){let h=M(r,"a","div"),d=M(l,"b","div");if([h,d]=mt(h,d),h.dtype==="int32"&&d.dtype==="int32")return xI(h,d);const f=(L,x)=>{const A=L.realDivide(h,d);return x([h,d]),A},g={a:h,b:d},S={};return H.runKernelFunc(f,g,null,Km,S)}const ze=G({div_:IJ});function xJ(r,l){let h=M(r,"a","mul"),d=M(l,"b","mul");[h,d]=mt(h,d);const f=(S,L)=>{const x=S.multiply(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,lf)}const ae=G({mul_:xJ});function TJ(r){const l=M(r,"x","abs"),h={x:l};return H.runKernelFunc((d,f)=>(f([l]),l.dtype==="complex64"?d.complexAbs(l):d.abs(l)),h,null,Bm)}const Pn=G({abs_:TJ});function AJ(r,l){for(let h=0;hr[g]);return[h,f]}function ts(r,l){const h=l.map(d=>1);return vJ(r,h,l)}function fs(r,l){if(AJ(r,l))return null;const h=[];for(let d=0;dh.push(d)),h}function Mc(r){return r.map((l,h)=>[h,l]).sort((l,h)=>l[1]-h[1]).map(l=>l[0])}function oo(r,l){const h=[];for(let d=l-r;d`The output # of rows (${L}) must be an integer. Change the stride and/or zero pad parameters`);const x=ca((S-l+2*d)/h+1,f);return Z(Qt(x),()=>`The output # of columns (${x}) must be an integer. Change the stride and/or zero pad parameters`),[L,x]}function OJ(r,l,h,d,f,g){f==null&&(f=gO(r,l,d));const S=r[0],L=r[1],x=r[2],A=ca((S-l+2*f)/d+1,g);Z(Qt(A),()=>`The output # of depths (${A}) must be an integer. Change the stride and/or zero pad parameters`);const O=ca((L-l+2*f)/d+1,g);Z(Qt(O),()=>`The output # of rows (${O}) must be an integer. Change the stride and/or zero pad parameters`);const C=ca((x-l+2*f)/d+1,g);return Z(Qt(C),()=>`The output # of columns (${C}) must be an integer. Change the stride and/or zero pad parameters`),[A,O,C,h]}function gO(r,l,h,d=1){const f=Pc(l,d);return Math.floor((r[0]*(h-1)-h+f)/2)}function Hf(r){return typeof r=="number"?[r,r,r]:r.length===2?[r[0],r[1],1]:r}function TI(r){return typeof r=="number"?[r,r,r]:r}function Pc(r,l){return l<=1?r:r+(r-1)*(l-1)}function NJ(r,l,h,d,f,g,S,L,x){let A,O,C;if(typeof r=="number"){const $=r===0?"VALID":"NUMBER";A={top:r,bottom:r,left:r,right:r,type:$};const z=RJ([l,h],g,d,r,L);O=z[0],C=z[1]}else if(r==="same"){O=Math.ceil(l/d),C=Math.ceil(h/f);const $=Math.max(0,(O-1)*d+g-l),z=Math.max(0,(C-1)*f+S-h),ne=Math.floor($/2),te=$-ne,se=Math.floor(z/2),fe=z-se;A={top:ne,bottom:te,left:se,right:fe,type:"SAME"}}else if(r==="valid")A={top:0,bottom:0,left:0,right:0,type:"VALID"},O=Math.ceil((l-g+1)/d),C=Math.ceil((h-S+1)/f);else if(typeof r=="object"){const $=x==="channelsLast"?r[1][0]:r[2][0],z=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],se=$===0&&z===0&&ne===0&&te===0?"VALID":"EXPLICIT";A={top:$,bottom:z,left:ne,right:te,type:se},O=ca((l-g+$+z)/d+1,L),C=ca((h-S+ne+te)/f+1,L)}else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:A,outHeight:O,outWidth:C}}function CJ(r,l,h,d,f,g,S,L,x,A,O){let C,$,z,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 se=OJ([l,h,d,1],L,1,f,r,O);$=se[0],z=se[1],ne=se[2]}else if(r==="same"){$=Math.ceil(l/f),z=Math.ceil(h/g),ne=Math.ceil(d/S);const te=($-1)*f+L-l,se=(z-1)*g+x-h,fe=(ne-1)*S+A-d,de=Math.floor(te/2),Ae=te-de,xe=Math.floor(se/2),Me=se-xe,Ke=Math.floor(fe/2),wt=fe-Ke;C={top:xe,bottom:Me,left:Ke,right:wt,front:de,back:Ae,type:"SAME"}}else if(r==="valid")C={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},$=Math.ceil((l-L+1)/f),z=Math.ceil((h-x+1)/g),ne=Math.ceil((d-A+1)/S);else throw Error(`Unknown padding parameter: ${r}`);return{padInfo:C,outDepth:$,outHeight:z,outWidth:ne}}function ca(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 ao(r){const[l,h,d]=Hf(r);return l===1&&h===1&&d===1}function co(r,l){return ao(r)||ao(l)}function zc(r){if(r==="NHWC")return"channelsLast";if(r==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${r}`)}function yO(r,l){const h=r[0].length;r.forEach((f,g)=>{Z(f.length===h,()=>`Error in concat${h}D: rank of tensors[${g}] must be the same as the rank of the rest (${h})`)}),Z(l>=0&&l`Error in concat${h}D: axis must be between 0 and ${h-1}.`);const d=r[0];r.forEach((f,g)=>{for(let S=0;S`Error in concat${h}D: Shape of tensors[${g}] (${f}) does not match the shape of the rest (${d}) along the non-concatenated axis ${g}.`)})}function bO(r,l){const h=r[0].slice();for(let d=1;d=1,()=>"Pass at least one tensor to concat");let h=Gf(r,"tensors","concat");h[0].dtype==="complex64"&&h.forEach(S=>{if(S.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${S.dtype}. `)});const d=(S,L)=>{const x=ht(l,h[0].shape)[0],A=bO(h.map($=>$.shape),x);if(qt(A)===0)return wI([],A);if(h=h.filter($=>$.size>0),h.length===1)return h[0];const O=h.map($=>$.shape);yO(O,x);const C=S.concat(h,x);return L(h),C},f=h,g={axis:l};return H.runKernelFunc(d,f,null,Gm,g)}const bn=G({concat_:EJ});function DJ(r){const l=M(r,"x","sigmoid"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sigmoid(l);return f([g]),g},h,null,xf)}const AI=G({sigmoid_:DJ});function kJ(r,l,h){const d=M(r,"x","slice");if(d.rank===0)throw new Error("Slicing scalar is not possible");const f=(L,x)=>{const[A,O]=Vf(d,l,h);return dO(d,A,O),x([d]),L.slice(d,A,O)},g={x:d},S={begin:l,size:h};return H.runKernelFunc(f,g,null,Lf,S)}const At=G({slice_:kJ});function FJ(r,l,h){const d=M(r,"x","batchToSpaceND"),f=l.reduce((x,A)=>x*A);Z(d.rank>=1+l.length,()=>`input rank is ${d.rank} but should be > than blockShape.length ${l.length}`),Z(h.length===l.length,()=>`crops.length is ${h.length} but should be equal to blockShape.length ${l.length}`),Z(d.shape[0]%f===0,()=>`input tensor batch is ${d.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${f}`);const g=x=>x.batchToSpaceND(d,l,h),S={x:d},L={blockShape:l,crops:h};return H.runKernelFunc(g,S,null,Pm,L)}const vI=G({batchToSpaceND_:FJ});function _J(r,l){let h=M(r,"broadcastTo","x");const d=h.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthh.rank){const O=h.shape.slice();for(;O.length=0;O--)if(f[O]===l[O])g[O]=1;else if(h.shape[O]!==1)throw new Error(`broadcastTo(): [${d}] cannot be broadcast to [${l}].`);const S=g.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(S.length===0)return bi(h);const L=O=>O.tile(h,g),x={x:h},A={shape:l,inputShape:f};return H.runKernelFunc(L,x,null,zm,A)}const jf=G({broadcastTo_:_J});function WJ(r,l,h,d,f="NHWC",g=[1,1],S){const L=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let A=L,O=!1;L.rank===3&&(O=!0,A=re(L,[1,L.shape[0],L.shape[1],L.shape[2]])),Z(A.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${A.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),S!=null&&Z(Qt(d),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${S} but got pad ${d}.`);const C=f==="NHWC"?A.shape[3]:A.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(co(h,g),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${h} and dilations '${g}'`);const $=(se,fe)=>{const de=zc(f),Ae=Lr(A.shape,x.shape,h,g,d,S,!1,de),xe=se.conv2d(A,x,Ae);return fe([A,x]),xe},z={x:A,filter:x},ne={strides:h,pad:d,dataFormat:f,dilations:g,dimRoundingMode:S},te=H.runKernelFunc($,z,null,Vm,ne);return O?re(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const NI=G({conv2d_:WJ});function $J(r,l,h,d,f,g="NHWC",S){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let L=r,x=l,A=!1;l.rank===3&&(A=!0,x=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]),L=[1,r[0],r[1],r[2]]),Z(L.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${L.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(h.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${h.rank}`);const O=g==="NHWC"?L[3]:L[1],C=g==="NHWC"?x.shape[3]:x.shape[1];Z(O===h.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${h.shape[2]}.`),Z(C===h.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${h.shape[3]}.`),S!=null&&Z(Qt(f),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${S} but got pad ${f}.`);const $=(se,fe)=>{const de=1,Ae=zc(g),xe=Lr(L,h.shape,d,de,f,S,!1,Ae),Me=se.conv2dDerInput(x,h,xe);return fe([x,h]),Me},z={dy:x,filter:h},ne={strides:d,pad:f,dataFormat:g,dimRoundingMode:S,inputShape:L},te=H.runKernelFunc($,z,null,Hm,ne);return A?re(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const wO=G({conv2DBackpropInput_:$J});function UJ(r,l,h,d,f){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let g=r,S=l,L=!1;l.rank===4&&(L=!0,S=re(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),g=[1,r[0],r[1],r[2],r[3]]);const x=g[4],A=S.shape[4];Z(g.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${g.length}.`),Z(S.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${S.rank}`),Z(h.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${h.rank}`),Z(x===h.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${h.shape[3]}.`),Z(A===h.shape[4],()=>`Error in conv3dDerInput: depth of output (${A}) must match output depth for filter ${h.shape[4]}.`);const O=ne=>{const te=1,se=ku(g,h.shape,d,te,f);return ne.conv3dDerInput(S,h,se)},C={dy:S},$={pad:f},z=H.runKernelFunc(O,C,null,_2,$);return L?re(z,[z.shape[1],z.shape[2],z.shape[3],z.shape[4]]):z}const LO=G({conv3DBackpropInput_:UJ});function BJ(r){const l=M(r,"x","cos"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.cos(l);return f([l]),g},h,null,Ym)}const Fu=G({cos_:BJ});function MJ(r){const l=M(r,"x","cosh"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.cosh(l);return f([l]),g},h,null,qm)}const CI=G({cosh_:MJ});function PJ(r,l=0,h=!1,d=!1){const f=M(r,"x","cumsum"),g=(x,A)=>{const O=fs([l],f.rank);let C=f;O!=null&&(C=Wt(f,O));const $=oo(1,f.rank)[0];let z=x.cumsum(C,$,h,d);if(A([f]),O!=null){const ne=Mc(O);z=Wt(z,ne)}return z},S={x:f},L={axis:l,exclusive:h,reverse:d};return H.runKernelFunc(g,S,null,jm,L)}const RI=G({cumsum_:PJ});function vt(r,l){const h=[];for(let d=0;d1)&&h.unshift(g)}return h}function rt(r,l){const h=[],d=Math.max(r.length,l.length);for(let f=0;fS.equal(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,Y2)}const OI=G({equal_:zJ});function GJ(r,l,h){const d=M(l,"a","where"),f=M(h,"b","where"),g=M(r,"condition","where","bool"),S=rt(d.shape,f.shape),L=jf(d,S),x=jf(f,S);g.rank===1&&Z(g.shape[0]===d.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),g.rank!==1&&Zt(g.shape,x.shape,"Error in where: ");const A=(C,$)=>{const z=C.select(g,L,x);return $([g]),z},O={condition:g,t:L,e:x};return H.runKernelFunc(A,O,null,wf)}const zn=G({where_:GJ});function VJ(r){const l=M(r,"x","zerosLike"),h={x:l};return H.runKernelFunc(d=>d.zerosLike(l),h,null,Ff)}const je=G({zerosLike_:VJ});function HJ(r){const l=M(r,"x","exp"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.exp(l);return f([g]),g},h,null,Xm)}const Gn=G({exp_:HJ});function YJ(r,l=0){const h=null,d=M(r,"x","expandDims",h);Z(l<=d.rank,()=>"Axis must be <= rank of the tensor");const f=d.shape.slice();return l<0&&(Z(-(d.rank+1)<=l,()=>`Axis must be in the interval [${-(d.rank+1)}, ${d.rank}]`),l=d.rank+l+1),f.splice(l,0,1),re(d,f)}const ks=G({expandDims_:YJ});function qJ(r,l){const h=null,d=M(r,"x","tile",h);Z(d.rank===l.length,()=>`Error in transpose: rank of input ${d.rank} must match length of reps ${l}.`);const f=(x,A)=>{const O=x.tile(d,l);return A([d]),O},g=[d],S={x:d},L={reps:l};return H.runKernelFunc(f,S,null,Of,L,g)}const la=G({tile_:qJ});function jJ(r,l,h,d="float32"){l==null&&(l=r);const f=Du([r,l],d),g=r<=l?r:l;for(let L=0;Lf.fill(r,l,h),{},null,K2,d)}function KJ(r){const l=M(r,"x","floor"),h={x:l};return H.runKernelFunc(d=>d.floor(l),h,null,Jm)}const kI=G({floor_:KJ});function SO(r,l,h){const d=r.shape[h],f=[];let g=1,S=1;for(let L=0;L{const O=ht(h,d.shape)[0],C=SO(d,f,O),$=x.gather(d,re(f,[f.size]),O);return A([d,f]),re($,C.outputShape)};return H.runKernelFunc(L,g,null,Qm,S)}const FI=G({gather_:XJ});function JJ(r,l){let h=M(r,"a","greater"),d=M(l,"b","greater");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.greater(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,Z2)}const wi=G({greater_:JJ});function ZJ(r,l){let h=M(r,"a","greaterEqual"),d=M(l,"b","greaterEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.greaterEqual(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,ef)}const Sr=G({greaterEqual_:ZJ});function QJ(r){const l=M(r,"input","imag"),h=f=>f.imag(l),d={input:l};return H.runKernelFunc(h,d,null,eR)}const _u=G({imag_:QJ});function e9(r,l){let h=M(r,"a","maximum"),d=M(l,"b","maximum");[h,d]=mt(h,d),h.dtype==="bool"&&(h=Le(h,"int32"),d=Le(d,"int32")),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.maximum(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,of)}const _I=G({maximum_:e9});function ke(r,l){if((Ds(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"&&Ds(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const h=[],d=[];return ji(r,h,d,l)}function t9(r,l){let h=M(r,"a","less"),d=M(l,"b","less");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.less(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,iR)}const WI=G({less_:t9});function n9(r,l){let h=M(r,"a","lessEqual"),d=M(l,"b","lessEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.lessEqual(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,rR)}const Ir=G({lessEqual_:n9});function s9(r){const l=M(r,"x","log"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.log(l);return f([l]),g},h,null,nf)}const lo=G({log_:s9});function i9(r){const l=M(r,"x","log1p"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.log1p(l);return f([l]),g},h,null,sf)}const $I=G({log1p_:i9});function Kf(r){return H.customGrad(r)}function r9(r){const l=M(r,"x","neg"),h={x:l};return H.runKernelFunc(d=>d.neg(l),h,null,hf)}const yt=G({neg_:r9});function o9(r,l=null,h=!1){const d=M(r,"x","max"),f=(L,x)=>{const A=ht(l,d.shape);let O=A;const C=fs(O,d.rank);let $=d;C!=null&&($=Wt(d,C),O=oo(O.length,$.rank));const z=L.max($,O);C!=null&&$.dispose();let ne=z;if(h){const te=ts(ne.shape,ht(l,d.shape));ne=re(ne,te),z.dispose()}return x([d,ne]),ne},g={x:d},S={reductionIndices:l,keepDims:h};return H.runKernelFunc(f,g,null,rf,S)}const ha=G({max_:o9});function a9(r,l){let h=M(r,"a","sub"),d=M(l,"b","sub");[h,d]=mt(h,d);const f=(S,L)=>{const x=S.subtract(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,Rf)}const Be=G({sub_:a9});function c9(r,l=null,h=!1){let d=M(r,"x","sum");d.dtype==="bool"&&(d=Le(d,"int32"));const f=(L,x)=>{x([d]);const A=ht(l,d.shape),O=fs(A,d.rank);let C=A,$=d;O!=null&&($=Wt(d,O),C=oo(C.length,d.rank));let z=L.sum($,C);if(h){const ne=ts(z.shape,A);z=re(z,ne)}return z},g={x:d},S={axis:l,keepDims:h};return H.runKernelFunc(f,g,null,Af,S)}const Fe=G({sum_:c9});function l9(r,l=null,h=!1){const d=M(r,"x","logSumExp"),f=ht(l,d.shape),g=ha(d,f,!0),S=Be(d,g),L=Gn(S),x=Fe(L,f),A=lo(x),O=St(re(g,A.shape),A);if(h){const C=ts(O.shape,f);return re(O,C)}return O}const UI=G({logSumExp_:l9});function h9(r,l){const h=M(r,"a","logicalAnd","bool"),d=M(l,"b","logicalAnd","bool");rt(h.shape,d.shape);const f={a:h,b:d};return H.runKernelFunc(g=>g.logicalAnd(h,d),f,null,oR)}const ua=G({logicalAnd_:h9});function u9(r){const l=M(r,"x","logicalNot","bool"),h={x:l};return H.runKernelFunc(d=>d.logicalNot(l),h,null,aR)}const BI=G({logicalNot_:u9});function Fs(r,l="float32"){if(l==="complex64"){const d=Fs(r,"float32"),f=Fs(r,"float32");return qi(d,f)}const h=aa(qt(r),l);return H.makeTensor(h,r,l)}function Ki(r,l="float32"){if(l==="complex64"){const d=Ki(r,"float32"),f=Fs(r,"float32");return qi(d,f)}const h=Uf(qt(r),l);return H.makeTensor(h,r,l)}function d9(r,l=null,h=!1){const d=M(r,"x","mean"),f=ht(l,d.shape),g=fO(d.shape,f),S=g[1],L=qt(S),x=Kf(A=>{const O=ke(L),C=O.dtype===A.dtype?A:Le(A,O.dtype),$=ze(C,O),z=Fe($,l,h),ne=te=>{const se=A.shape.slice();f.forEach(Ae=>{se[Ae]=1});const fe=re(te,se),de=ze(ae(fe,Ki(A.shape,"float32")),L);return de};return{value:z,gradFunc:ne}});return x(d)}const MI=G({mean_:d9});function p9(r,l=null,h=!1){const d=M(r,"x","min"),f=(L,x)=>{const A=ht(l,d.shape);let O=A;const C=fs(O,d.rank);let $=d;C!=null&&($=Wt(d,C),O=oo(O.length,d.rank));const z=L.min($,O);C!=null&&$.dispose();let ne=z;if(h){const te=ts(ne.shape,A);ne=re(z,te),z.dispose()}return x([d,ne]),ne},g={x:d},S={axis:l,keepDims:h};return H.runKernelFunc(f,g,null,af,S)}const Xf=G({min_:p9});function m9(r,l){let h=M(r,"a","minimum"),d=M(l,"b","minimum");[h,d]=mt(h,d),h.dtype==="bool"&&(h=Le(h,"int32"),d=Le(d,"int32")),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.minimum(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,cf)}const PI=G({minimum_:m9});function f9(r){const l=M(r,"x","square"),h={},d=[l],f=[];return H.runKernelFunc((g,S)=>(S([l]),g.square(l)),{x:l},null,"Square",h,d,f)}const ut=G({square_:f9});function g9(r,l){let h=M(r,"a","notEqual"),d=M(l,"b","notEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.notEqual(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,gR)}const zI=G({notEqual_:g9});function y9(r){const l=M(r,"input","real"),h=f=>f.real(l),d={input:l};return H.runKernelFunc(h,d,null,TR)}const Gc=G({real_:y9});function b9(r,l,h=0){const d=M(r,"x","pad");if(d.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const f=(L,x)=>(x([d]),L.pad(d,l,h)),g={paddings:l,constantValue:h},S={x:d};return H.runKernelFunc(f,S,null,uf,g)}const GI=G({pad_:b9});function w9(r,l,h){const d=M(r,"x","spaceToBatchND");Z(d.rank>=1+l.length,()=>`input rank ${d.rank} should be > than [blockShape] ${l.length}`),Z(h.length===l.length,()=>`paddings.shape[0] ${h.length} must be equal to [blockShape] ${l.length}`),Z(d.shape.reduce((L,x,A)=>A>0&&A<=l.length?L&&(x+h[A-1][0]+h[A-1][1])%l[A-1]===0:L,!0),()=>`input spatial dimensions ${d.shape.slice(1)} with paddings ${h.toString()} must be divisible by blockShapes ${l.toString()}`);const f=L=>L.spaceToBatchND(d,l,h),g={x:d},S={blockShape:l,paddings:h};return H.runKernelFunc(f,g,null,vf,S)}const VI=G({spaceToBatchND_:w9});function L9(r,l){let h=M(r,"base","pow"),d=M(l,"exp","pow");[h,d]=mt(h,d);const f={a:h,b:d},g=(S,L)=>{const x=S.pow(h,d);return L([h,d,x]),x};return H.runKernelFunc(g,f,null,df)}const da=G({pow_:L9});function ho(r,l){_c(r);const h=wr(r,l);if(h.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const d=null;return ji(r,d,h,l)}function Jf(r,l,h=1,d="float32"){if(h===0)throw new Error("Cannot have a step of zero");const f=()=>{const S=r===l,L=r1;if(S||L||x)return Fs([0],d);const A=Math.abs(Math.ceil((l-r)/h)),O=aa(A,d);l(g([l]),l.dtype==="bool"?Le(l,"int32"):f.relu(l)),d={x:l};return H.runKernelFunc(h,d,null,pf)}const Wu=G({relu_:S9});function I9(r,l){const h=M(r,"x","reverse"),d=S=>{const L=ht(l,h.shape);if(h.rank===0)return bi(h);const x=S.reverse(h,L);return re(x,h.shape)},f={x:h},g={dims:l};return H.runKernelFunc(d,f,null,yf,g)}const Vc=G({reverse_:I9});function x9(r){const l=M(r,"x","rsqrt"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.rsqrt(l);return f([l]),g},h,null,bf)}const HI=G({rsqrt_:x9});function T9(r){const l=M(r,"x","sin"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sin(l);return f([l]),g},h,null,Sf)}const YI=G({sin_:T9});function A9(r){const l=M(r,"x","sinh"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sinh(l);return f([l]),g},h,null,If)}const qI=G({sinh_:A9});function v9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return H.runKernelFunc(h=>{const d=r.shape[r.shape.length-1],f=r.size/d,g=r.as2D(f,d),S=h.fft(g);return S.reshape(r.shape)},l,null,j2)}const $u=G({fft_:v9});function N9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return H.runKernelFunc(h=>{const d=r.shape[r.shape.length-1],f=r.size/d,g=re(r,[f,d]),S=h.ifft(g);return re(S,r.shape)},l,null,Q2)}const Hc=G({ifft_:N9});function C9(r){const l=r.shape[r.shape.length-1],h=r.size/l;let d;if(l<=2){const f=re(r,[h,l]);d=Hc(f)}else{const f=[h,2*(l-1)],g=re(Gc(r),[h,l]),S=re(_u(r),[h,l]),L=Vc(At(g,[0,1],[h,l-2]),1),x=ae(Vc(At(S,[0,1],[h,l-2]),1),ke(-1)),A=bn([g,L],1),O=bn([S,x],1),C=re(qi(A,O),[f[0],f[1]]);d=Hc(C)}if(d=Gc(d),r.rank===3&&r.shape[0]!==0){const f=d,g=r.shape[0];d=re(d,[g,d.shape[0]/g,d.shape[1]]),f.dispose()}return d}const jI=G({irfft_:C9});function IO(r,l,h=0){let d=[];if(typeof l=="number")Z(r.shape[h]%l===0,()=>"Number of splits must evenly divide the axis."),d=new Array(l).fill(r.shape[h]/l);else{const f=l.reduce((S,L)=>(L===-1&&(S+=1),S),0);Z(f<=1,()=>"There should be only one negative value in split array.");const g=l.indexOf(-1);if(g!==-1){const S=l.reduce((L,x)=>x>0?L+x:L);l[g]=r.shape[h]-S}Z(r.shape[h]===l.reduce((S,L)=>S+L),()=>"The sum of sizes must match the size of the axis dimension."),d=l}return d}function R9(r,l,h=0){const d=M(r,"x","split"),f=(L,x)=>{const A=ht(h,d.shape)[0],O=IO(d,l,A);return L.split(d,O,A)},g={x:d},S={numOrSizeSplits:l,axis:h};return H.runKernelFunc(f,g,null,Nf,S)}const uo=G({split_:R9});function O9(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let h=r.shape[r.shape.length-1];const d=r.size/h;let f;if(l!=null&&l0),te=r.shape.map(se=>se);te[r.shape.length-1]=l,f=At(r,ne,te),h=l}else if(l!=null&&l>h){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-h,f=bn([r,Fs(ne)],r.shape.length-1),h=l}else f=r;const g=je(f),S=re(qi(f,g),[d,h]),L=$u(S),x=Math.floor(h/2)+1,A=Gc(L),O=_u(L),C=uo(A,[x,h-x],A.shape.length-1),$=uo(O,[x,h-x],O.shape.length-1),z=f.shape.slice();return z[f.shape.length-1]=x,re(qi(C[0],$[0]),z)}const Uu=G({rfft_:O9});function E9(r){const l=M(r,"x","sqrt"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sqrt(l);return f([l]),g},h,null,Tf)}const gs=G({sqrt_:E9});function D9(r,l){let h=M(r,"a","squaredDifference"),d=M(l,"b","squaredDifference");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(L,x)=>{const A=L.squaredDifference(h,d);return x([h,d]),A},g={a:h,b:d},S={};return H.runKernelFunc(f,g,null,Cf,S)}const KI=G({squaredDifference_:D9});function k9(r,l){const h=M(r,"x","squeeze");return re(h,PR(h.shape,l).newShape)}const XI=G({squeeze_:k9});function F9(r,l=0){const h=Gf(r,"tensors","stack");if(Z(h.length>=1,()=>"Pass at least one tensor to tf.stack"),h.length===1)return ks(h[0],l);const d=h[0].rank,f=h[0].shape,g=h[0].dtype;Z(l<=d,()=>"Axis must be <= rank of the tensor"),h.forEach(L=>{Zt(f,L.shape,"All tensors passed to stack must have matching shapes"),Z(g===L.dtype,()=>"All tensors passed to stack must have matching dtypes")});const S=h.map(L=>ks(L,l));return bn(S,l)}const js=G({stack_:F9});function _9(r,l=0){const h=M(r,"x","step"),d={x:h},f={alpha:l};return H.runKernelFunc(g=>g.step(h,l),d,null,_f,f)}const pa=G({step_:_9});function ma(r,l,h){if(_c(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const d=wr(r,h);if(d.length!==2&&d.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(d.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return ji(r,l,d,h)}function W9(r,l,h){const d=M(r,"x","unsortedSegmentSum"),f=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(h),()=>"numSegments must be of dtype int");const g={x:d,segmentIds:f},S={numSegments:h},L=(x,A)=>{const O=x.unsortedSegmentSum(d,f,h);return A([f]),O};return H.runKernelFunc(L,g,null,kf,S)}const JI=G({unsortedSegmentSum_:W9});function $9(r,l=0){const h=M(r,"x","unstack");Z(l>=-h.shape.length&&l`Axis = ${l} is not in [-${h.shape.length}, ${h.shape.length})`),l<0&&(l+=h.shape.length);const d={value:h},f={axis:l},g=S=>S.unstack(h,l);return H.runKernelFunc(g,d,null,Df,f)}const Bu=G({unstack_:$9});function U9(r,l="euclidean",h=null,d=!1){r=M(r,"x","norm");const f=xO(r,l,h);let g=f.shape;if(d){const S=ht(h,r.shape);g=ts(f.shape,S)}return re(f,g)}function xO(r,l,h=null){if(r.rank===0)return Pn(r);if(r.rank!==1&&h===null)return xO(re(r,[-1]),l,h);if(r.rank===1||typeof h=="number"||Array.isArray(h)&&h.length===1){if(l===1)return Fe(Pn(r),h);if(l===Infinity)return ha(Pn(r),h);if(l===-Infinity)return Xf(Pn(r),h);if(l==="euclidean"||l===2)return gs(Fe(da(Pn(r),ke(2,"int32")),h));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(h)&&h.length===2){if(l===1)return ha(Fe(Pn(r),h[0]),h[1]-1);if(l===Infinity)return ha(Fe(Pn(r),h[1]),h[0]);if(l===-Infinity)return Xf(Fe(Pn(r),h[1]),h[0]);if(l==="fro"||l==="euclidean")return gs(Fe(ut(r),h));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${h}`)}const Zf=G({norm_:U9});function TO(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function Qf(r,l,h){const d=1-r%2,f=new Float32Array(r);for(let g=0;g`Error in conv2dDerFilter: input must be rank 4, but got shape ${L.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(h.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${h}.`);const A=g==="NHWC"?L.shape[3]:L.shape[1],O=g==="NHWC"?x.shape[3]:x.shape[1];Z(A===h[2],()=>`Error in conv2dDerFilter: depth of input ${A}) must match input depth in filter (${h[2]}.`),Z(O===h[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${h[3]}).`),S!=null&&Z(Qt(f),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${S} but got pad ${f}.`);const C=ne=>{const te=1,se=zc(g),fe=Lr(L.shape,h,d,te,f,S,!1,se);return ne.conv2dDerFilter(L,x,fe)},$={x:L,dy:x},z={strides:d,pad:f,dataFormat:g,dimRoundingMode:S};return H.runKernelFunc(C,$,null,D2,z)}const eg=G({conv2DBackpropFilter_:B9});function M9(r,l,h,d){let f=r;r.rank===3&&(f=re(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let g=l;g.rank===3&&(g=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const S=x=>x.depthwiseConv2DDerFilter(f,g,d),L={x:f,dy:g};return H.runKernelFunc(S,L,null,U2)}const AO=G({depthwiseConv2dNativeBackpropFilter_:M9});function P9(r,l,h,d){let f=l,g=!1;l.rank===3&&(g=!0,f=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const S=A=>A.depthwiseConv2DDerInput(f,h,d),L={dy:f},x=H.runKernelFunc(S,L,null,B2);return g?re(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const vO=G({depthwiseConv2dNativeBackpropInput_:P9});function z9(r){return Qf(r,.54,.46)}const NO=G({hammingWindow_:z9});function G9(r){return Qf(r,.5,.5)}const tg=G({hannWindow_:G9});function V9(r,l,h,d=!1,f=0){let g=0;const S=[];for(;g+l<=r.size;)S.push(At(r,g,l)),g+=h;if(d)for(;g`Error in cropAndResize: image must be rank 4,but got rank ${S.rank}.`),Z(L.rank===2&&L.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${A},4] but had shape ${L.shape}.`),Z(x.rank===1&&x.shape[0]===A,()=>`Error in cropAndResize: boxInd must be have size [${A}] but had shape ${L.shape}.`),Z(d.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${d.length}.`),Z(d[0]>=1&&d[1]>=1,()=>`cropSize must be atleast [1,1], but was ${d}`),Z(f==="bilinear"||f==="nearest",()=>`method must be bilinear or nearest, but was ${f}`);const O=ne=>ne.cropAndResize(S,L,x,d,f,g),C={image:S,boxes:L,boxInd:x},$={method:f,extrapolationValue:g,cropSize:d},z=H.runKernelFunc(O,C,null,W2,$);return z}const RO=G({cropAndResize_:Y9});function q9(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 h={image:l},d=H.runKernel(X2,h,{});return d}const OO=G({flipLeftRight_:q9});function j9(r,l,h=0,d=.5){const f=M(r,"image","rotateWithOffset","float32");Z(f.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${f.rank}.`);const g={image:f},S={radians:l,fillValue:h,center:d},L=H.runKernel($R,g,S);return L}const EO=G({rotateWithOffset_:j9});function Ks(r,l,h,d,f,g){d==null&&(d=.5),f==null&&(f=Number.NEGATIVE_INFINITY),g==null&&(g=0);const S=r.shape[0];return h=Math.min(h,S),Z(0<=d&&d<=1,()=>`iouThreshold must be in [0, 1], but was '${d}'`),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]===S,()=>`scores has incompatible shape with boxes. Expected ${S}, but was ${l.shape[0]}`),Z(0<=g&&g<=1,()=>`softNmsSigma must be in [0, 1], but was '${g}'`),{maxOutputSize:h,iouThreshold:d,scoreThreshold:f,softNmsSigma:g}}function K9(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY){const g=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),L=Ks(g,S,h,d,f);h=L.maxOutputSize,d=L.iouThreshold,f=L.scoreThreshold;const x={maxOutputSize:h,iouThreshold:d,scoreThreshold:f};return H.runKernelFunc(A=>A.nonMaxSuppression(g,S,h,d,f),{boxes:g,scores:S},null,yR,x)}const DO=G({nonMaxSuppression_:K9});function kO(r,l,h){const d=X9(r,l,h),f=d<0?-(d+1):d;r.splice(f,0,l)}function X9(r,l,h){return Z9(r,l,h||J9)}function J9(r,l){return r>l?1:r>>1);const L=h(l,r[g]);L>0?d=g+1:(f=g,S=!L)}return S?d:-d-1}function FO(r,l,h,d,f){return ZI(r,l,h,d,f,0).selectedIndices}function _O(r,l,h,d,f,g){return ZI(r,l,h,d,f,0,!1,g,!0)}function WO(r,l,h,d,f,g){return ZI(r,l,h,d,f,g,!0)}function ZI(r,l,h,d,f,g,S=!1,L=!1,x=!1){const A=[];for(let se=0;sef&&A.push({score:l[se],boxIndex:se,suppressBeginIndex:0});A.sort($O);const O=g>0?-.5/g:0,C=[],$=[];for(;C.length0;){const se=A.pop(),{score:fe,boxIndex:de,suppressBeginIndex:Ae}=se;if(fe=Ae;--Me){const Ke=Q9(r,de,C[Me]);if(Ke>=d){xe=!0;break}if(se.score=se.score*eZ(d,O,Ke),se.score<=f)break}se.suppressBeginIndex=C.length,xe||(se.score===fe?(C.push(de),$.push(se.score)):se.score>f&&kO(A,se,$O))}const z=C.length,ne=h-z;L&&ne>0&&(C.push(...new Array(ne).fill(0)),$.push(...new Array(ne).fill(0)));const te={selectedIndices:ho(C,"int32")};return S&&(te.selectedScores=ho($,"float32")),x&&(te.validOutputs=ke(z,"int32")),te}function Q9(r,l,h){const d=r.subarray(l*4,l*4+4),f=r.subarray(h*4,h*4+4),g=Math.min(d[0],d[2]),S=Math.min(d[1],d[3]),L=Math.max(d[0],d[2]),x=Math.max(d[1],d[3]),A=Math.min(f[0],f[2]),O=Math.min(f[1],f[3]),C=Math.max(f[0],f[2]),$=Math.max(f[1],f[3]),z=(L-g)*(x-S),ne=(C-A)*($-O);if(z<=0||ne<=0)return 0;const te=Math.max(g,A),se=Math.max(S,O),fe=Math.min(L,C),de=Math.min(x,$),Ae=Math.max(fe-te,0)*Math.max(de-se,0);return Ae/(z+ne-Ae)}function eZ(r,l,h){const d=Math.exp(l*h*h);return h<=r?d:0}function $O(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function tZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY){const g=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),L=Ks(g,S,h,d,f);h=L.maxOutputSize,d=L.iouThreshold,f=L.scoreThreshold;const x=await Promise.all([g.data(),S.data()]),A=x[0],O=x[1],C=FO(A,O,h,d,f);return g!==r&&g.dispose(),S!==l&&S.dispose(),C}const UO=tZ;function nZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=0){const S=M(r,"boxes","nonMaxSuppression"),L=M(l,"scores","nonMaxSuppression"),x=Ks(S,L,h,d,f,g);h=x.maxOutputSize,d=x.iouThreshold,f=x.scoreThreshold,g=x.softNmsSigma;const A={boxes:S,scores:L},O={maxOutputSize:h,iouThreshold:d,scoreThreshold:f,softNmsSigma:g},C=H.runKernel(wR,A,O);return{selectedIndices:C[0],selectedScores:C[1]}}const BO=G({nonMaxSuppressionWithScore_:nZ});async function sZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=0){const S=M(r,"boxes","nonMaxSuppressionAsync"),L=M(l,"scores","nonMaxSuppressionAsync"),x=Ks(S,L,h,d,f,g);h=x.maxOutputSize,d=x.iouThreshold,f=x.scoreThreshold,g=x.softNmsSigma;const A=await Promise.all([S.data(),L.data()]),O=A[0],C=A[1],$=WO(O,C,h,d,f,g);return S!==r&&S.dispose(),L!==l&&L.dispose(),$}const MO=sZ;function iZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=!1){const S=M(r,"boxes","nonMaxSuppression"),L=M(l,"scores","nonMaxSuppression"),x=Ks(S,L,h,d,f,null),A=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,$={boxes:S,scores:L},z={maxOutputSize:A,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:g},ne=H.runKernel(bR,$,z);return{selectedIndices:ne[0],validOutputs:ne[1]}}const PO=G({nonMaxSuppressionPadded_:iZ});async function rZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=!1){const S=M(r,"boxes","nonMaxSuppressionAsync"),L=M(l,"scores","nonMaxSuppressionAsync"),x=Ks(S,L,h,d,f,null),A=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[$,z]=await Promise.all([S.data(),L.data()]),ne=_O($,z,A,O,C,g);return S!==r&&S.dispose(),L!==l&&L.dispose(),ne}const zO=rZ;function oZ(r,l,h=!1){const d=M(r,"images","resizeBilinear");Z(d.rank===3||d.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${d.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let f=d,g=!1;d.rank===3&&(g=!0,f=re(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[S,L]=l,x=($,z)=>(z([f]),$.resizeBilinear(f,S,L,h)),A={images:f},O={alignCorners:h,size:l},C=H.runKernelFunc(x,A,null,gf,O);return g?re(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const GO=G({resizeBilinear_:oZ});function aZ(r,l,h=!1){const d=M(r,"images","resizeNearestNeighbor");Z(d.rank===3||d.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${d.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(d.dtype==="float32"||d.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let f=d,g=!1;d.rank===3&&(g=!0,f=re(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[S,L]=l,x={images:f},A={alignCorners:h,size:l},O=($,z)=>(z([f]),$.resizeNearestNeighbor(f,S,L,h)),C=H.runKernelFunc(O,x,null,ff,A);return g?re(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const VO=G({resizeNearestNeighbor_:aZ});function cZ(r,l,h){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(h%1===0,()=>`bandPart(): numUpper must be an integer, got ${h}.`);const d=M(r,"a","bandPart");Z(d.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${d.rank}.`);const f=d.shape,[g,S]=d.shape.slice(-2);if(!(l<=g))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${g}).`);if(!(h<=S))throw new Error(`bandPart(): numUpper (${h}) must not be greater than the number of columns (${S}).`);l<0&&(l=g),h<0&&(h=S);const L=re(Jf(0,g,1,"int32"),[-1,1]),x=Jf(0,S,1,"int32"),A=Be(L,x),O=ua(Ir(A,ke(+l,"int32")),Sr(A,ke(-h,"int32"))),C=Fs([g,S],d.dtype);return re(js(Bu(re(d,[-1,g,S])).map($=>zn(O,$,C))),f)}const HO=G({bandPart_:cZ});function lZ(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 f=r[0].shape[0];for(let g=1;g`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[g].shape[0]} vs. ${f})`)}else l=!0,r=uo(r,r.shape[0],0).map(f=>XI(f,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const h=[],d=r;for(let f=0;f{let g=d[f];if(f>0)for(let S=0;S=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return qO(r,l);{const h=r.shape.slice(0,r.shape.length-2).reduce((x,A)=>x*A),d=Bu(re(r,[h,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),f=[],g=[];d.forEach(x=>{const[A,O]=qO(x,l);f.push(A),g.push(O)});const S=re(js(f,0),r.shape),L=re(js(g,0),r.shape);return[S,L]}}function qO(r,l=!1){return H.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const h=r.shape[0],d=r.shape[1];let f=EI(h),g=bi(r);const S=ma([[1]],[1,1]);let L=bi(S);const x=h>=d?d:h;for(let A=0;A{const z=At(g,[A,A],[h-A,1]),ne=Zf(z),te=At(g,[A,A],[1,1]),se=zn(wi(te,0),ma([[-1]]),ma([[1]])),fe=Be(te,ae(se,ne)),de=ze(z,fe);de.shape[0]===1?L=bi(S):L=bn([S,At(de,[1,0],[de.shape[0]-1,de.shape[1]])],0);const Ae=yt(ze(pn(se,fe),ne)),xe=At(g,[A,0],[h-A,d]),Me=ae(Ae,L),Ke=Wt(L);if(A===0)g=Be(xe,pn(Me,pn(Ke,xe)));else{const Kt=Be(xe,pn(Me,pn(Ke,xe)));g=bn([At(g,[0,0],[A,d]),Kt],0)}const wt=Wt(Me),$t=At(f,[0,A],[h,f.shape[1]-A]);if(A===0)f=Be($t,pn(pn($t,L),wt));else{const Kt=Be($t,pn(pn($t,L),wt));f=bn([At(f,[0,0],[h,A]),Kt],1)}return[L,g,f]}),mO([O,C,$])}return!l&&h>d&&(f=At(f,[0,0],[h,d]),g=At(g,[0,0],[d,d])),[f,g]})}const jO=G({qr_:hZ});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 uZ(r,l,h=jt.SUM_BY_NONZERO_WEIGHTS){const d=M(r,"losses","computeWeightedLoss");let f=null;l!=null&&(f=M(l,"weights","computeWeightedLoss"));const g=f==null?d:ae(d,f);if(h===jt.NONE)return g;if(h===jt.SUM)return Fe(g);if(h===jt.MEAN){if(f==null)return MI(g);{const S=d.size/f.size,L=ze(Fe(g),Fe(f));return S>1?ze(L,ke(S)):L}}if(h===jt.SUM_BY_NONZERO_WEIGHTS){if(f==null)return ze(Fe(g),ke(d.size));{const S=ae(f,Ki(d.shape)),L=Le(Fe(zI(S,ke(0))),"float32");return ze(Fe(g),L)}}throw Error(`Unknown reduction: ${h}`)}const An=G({computeWeightedLoss_:uZ});function dZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","absoluteDifference"),g=M(l,"predictions","absoluteDifference");let S=null;h!=null&&(S=M(h,"weights","absoluteDifference")),Zt(f.shape,g.shape,"Error in absoluteDifference: ");const L=Pn(Be(f,g));return An(L,S,d)}const KO=G({absoluteDifference_:dZ});function pZ(r,l,h,d,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","cosineDistance"),S=M(l,"predictions","cosineDistance");let L=null;d!=null&&(L=M(d,"weights","cosineDistance")),Zt(g.shape,S.shape,"Error in cosineDistance: ");const x=ke(1),A=Be(x,Fe(ae(g,S),h,!0));return An(A,L,f)}const XO=G({cosineDistance_:pZ});function mZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"labels","hingeLoss");const g=M(l,"predictions","hingeLoss");let S=null;h!=null&&(S=M(h,"weights","hingeLoss")),Zt(f.shape,g.shape,"Error in hingeLoss: ");const L=ke(1);f=Be(ae(ke(2),f),L);const x=Wu(Be(L,ae(f,g)));return An(x,S,d)}const JO=G({hingeLoss_:mZ});function fZ(r,l,h,d=1,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","huberLoss"),S=M(l,"predictions","huberLoss");let L=null;h!=null&&(L=M(h,"weights","huberLoss")),Zt(g.shape,S.shape,"Error in huberLoss: ");const x=ke(d),A=Pn(Be(S,g)),O=PI(A,x),C=Be(A,O),$=St(ae(ke(.5),ut(O)),ae(x,C));return An($,L,f)}const ZO=G({huberLoss_:fZ});function gZ(r,l,h,d=1e-7,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","logLoss"),S=M(l,"predictions","logLoss");let L=null;h!=null&&(L=M(h,"weights","logLoss")),Zt(g.shape,S.shape,"Error in logLoss: ");const x=ke(1),A=ke(d),O=yt(ae(g,lo(St(S,A)))),C=ae(Be(x,g),lo(St(Be(x,S),A))),$=Be(O,C);return An($,L,f)}const QO=G({logLoss_:gZ});function yZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","meanSquaredError"),g=M(l,"predictions","meanSquaredError");let S=null;h!=null&&(S=M(h,"weights","meanSquaredError")),Zt(f.shape,g.shape,"Error in meanSquaredError: ");const L=KI(f,g);return An(L,S,d)}const e1=G({meanSquaredError_:yZ});function bZ(r,l){const h=M(r,"labels","sigmoidCrossEntropyWithLogits"),d=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(h.shape,d.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Wu(d),g=ae(d,h),S=$I(Gn(yt(Pn(d))));return St(Be(f,g),S)}function wZ(r,l,h,d=0,f=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"multiClassLabels","sigmoidCrossEntropy");const S=M(l,"logits","sigmoidCrossEntropy");let L=null;if(h!=null&&(L=M(h,"weights","sigmoidCrossEntropy")),Zt(g.shape,S.shape,"Error in sigmoidCrossEntropy: "),d>0){const A=ke(d),O=ke(1),C=ke(.5);g=St(ae(g,Be(O,A)),ae(C,A))}const x=bZ(g,S);return An(x,L,f)}const t1=G({sigmoidCrossEntropy_:wZ});function LZ(r,l,h=-1){if(h===-1&&(h=l.rank-1),h!==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 ${h}`);const d=Kf((f,g,S)=>{const L=!0,x=UI(g,[h],L),A=Be(Le(g,"float32"),x);S([f,A]);const O=yt(ae(A,f)),C=Fe(O,[h]),$=(z,ne)=>{const[te,se]=ne,fe=ts(z.shape,[h]);return[ae(re(z,fe),Be(Le(te,"float32"),Gn(se))),ae(re(z,fe),Be(Gn(se),Le(te,"float32")))]};return{value:C,gradFunc:$}});return d(r,l)}function SZ(r,l,h,d=0,f=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"onehotLabels","softmaxCrossEntropy");const S=M(l,"logits","softmaxCrossEntropy");let L=null;if(h!=null&&(L=M(h,"weights","softmaxCrossEntropy")),Zt(g.shape,S.shape,"Error in softmaxCrossEntropy: "),d>0){const A=ke(d),O=ke(1),C=ke(g.shape[1]);g=St(ae(g,Be(O,A)),ze(A,C))}const x=LZ(g,S);return An(x,L,f)}const n1=G({softmaxCrossEntropy_:SZ});const yAe={fft:$u,ifft:Hc,rfft:Uu,irfft:jI},IAe={hammingWindow:NO,hannWindow:tg,frame:ng,stft:CO},s1={flipLeftRight:OO,resizeNearestNeighbor:VO,resizeBilinear:GO,rotateWithOffset:EO,cropAndResize:RO,nonMaxSuppression:DO,nonMaxSuppressionAsync:UO,nonMaxSuppressionWithScore:BO,nonMaxSuppressionWithScoreAsync:MO,nonMaxSuppressionPadded:PO,nonMaxSuppressionPaddedAsync:zO},$Ae={bandPart:HO,gramSchmidt:YO,qr:jO},qAe={absoluteDifference:KO,computeWeightedLoss:An,cosineDistance:XO,hingeLoss:JO,huberLoss:ZO,logLoss:QO,meanSquaredError:e1,sigmoidCrossEntropy:t1,softmaxCrossEntropy:n1};const i1=1.7580993408473768,r1=1.0507009873554805;const o1={kernelName:Bm,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,pa(Le(h,"float32"),-1))}}};const a1={kernelName:f2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=ut(Le(h,"float32")),f=gs(Be(ke(1),d));return yt(ze(r,f))}}}};const c1={kernelName:g2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=gs(Be(ut(Le(h,"float32")),1));return ze(r,d)}}}};const l1={kernelName:kc,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{let L=r;const x=vt(h.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,h.shape)},S=()=>{let L=r;const x=vt(d.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,d.shape)};return{a:g,b:S}}};const h1={kernelName:y2,saveAllInputs:!0,gradFunc:(r,l)=>{const h={};return l.forEach((d,f)=>{h[f]=()=>r.clone()}),h}};const u1={kernelName:b2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>je(h)}}};const d1={kernelName:w2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>je(h)}}};const p1={kernelName:L2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,gs(Be(ke(1),ut(Le(h,"float32")))))}}};const m1={kernelName:S2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=gs(St(ke(1),ut(Le(h,"float32"))));return ze(r,d)}}}};const f1={kernelName:T2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=St(ut(h),ut(d));let x=ae(r,ze(d,L));const A=vt(h.shape,f);return A.length>0&&(x=Fe(x,A)),re(x,h.shape)},S=()=>{const L=St(ut(h),ut(d));let x=yt(ae(r,ze(h,L)));const A=vt(d.shape,f);return A.length>0&&(x=Fe(x,A)),re(x,d.shape)};return{a:g,b:S}}};const g1={kernelName:I2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,St(ut(Le(h,"float32")),1))}}};const y1={kernelName:x2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,Be(ke(1),ut(Le(h,"float32"))))}}};function IZ(r,l,h,d,f=[1,1,1],g,S){const L=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let A=L,O=x,C=!1;x.rank===4&&(C=!0,A=re(L,[1,L.shape[0],L.shape[1],L.shape[2],L.shape[3]]),O=re(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(A.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${A.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(co(d,f),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${d} and dilations '${f}'`),S!=null&&Z(Qt(g),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const $=se=>{const fe=qf(O.shape,h,d,f,g,S);return se.avgPool3dBackprop(A,O,fe)},z={dy:A,input:O},ne={filterSize:h,strides:d,dilations:f,pad:g,dimRoundingMode:S},te=H.runKernelFunc($,z,null,C2,ne);return C?re(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const b1=G({avgPool3dBackprop_:IZ});const w1={kernelName:N2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{filterSize:f,strides:g,dilations:S,pad:L,dimRoundingMode:x}=h,A=S==null?[1,1,1]:S;return{x:()=>b1(r,d,f,g,A,L,x)}}};function xZ(r,l,h,d,f){const g=M(r,"dy","avgPoolBackprop"),S=M(l,"input","avgPoolBackprop");Z(S.rank===g.rank,()=>`Rank of input (${S.rank}) does not match rank of dy (${g.rank})`);let L=S,x=g,A=!1;S.rank===3&&(A=!0,L=re(S,[1,S.shape[0],S.shape[1],S.shape[2]]),x=re(g,[1,g.shape[0],g.shape[1],g.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(L.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${L.rank}.`);const O=ne=>{const te=Yf(L.shape,h,d,1,f);return ne.avgPoolBackprop(x,L,te)},C={dy:x,input:L},$={filterSize:h,strides:d,pad:f},z=H.runKernelFunc(O,C,null,v2,$);return A?re(z,[z.shape[1],z.shape[2],z.shape[3]]):z}const L1=G({avgPoolBackprop_:xZ});const S1={kernelName:A2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{filterSize:f,strides:g,pad:S}=h;return{x:()=>L1(r,d,f,g,S)}}};const I1={kernelName:Mm,inputsToSave:["a","b"],gradFunc:(r,l,h)=>{const[d,f]=l,{transposeA:g,transposeB:S}=h;return!g&&!S?{a:()=>pn(r,f,!1,!0),b:()=>pn(d,r,!0,!1)}:!g&&S?{a:()=>pn(r,f,!1,!1),b:()=>pn(r,d,!0,!1)}:g&&!S?{a:()=>pn(f,r,!1,!0),b:()=>pn(d,r,!1,!1)}:{a:()=>pn(f,r,!0,!0),b:()=>pn(r,d,!0,!0)}}};const x1={kernelName:Pm,gradFunc:(r,l,h)=>{const{blockShape:d,crops:f}=h;return{x:()=>VI(r,d,f)}}};const T1={kernelName:zm,gradFunc:(r,l,h)=>{const d=h,f=d.inputShape,g=d.shape,S=Array.from(g);for(let x=f.length-1;x>=0;x--)if(f[x]===g[x])S[x]=1;else if(f[x]!==1)throw new Error(`broadcastTo(): [${f}] cannot be broadcast to [${g}].`);const L=[];for(let x=0;x1&&L.push(x);return{x:()=>Fe(r,L,!0)}}};const A1={kernelName:Fc,gradFunc:r=>({x:()=>r.clone()})};const v1={kernelName:R2,gradFunc:r=>({x:()=>je(r)})};const N1={kernelName:O2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{clipValueMin:f,clipValueMax:g}=h;return{x:()=>zn(ua(Sr(d,f),Ir(d,g)),r,je(r))}}};const C1={kernelName:Gm,saveAllInputs:!0,gradFunc:(r,l,h)=>{const d=l.map(x=>x.shape),{axis:f}=h,g=ht(f,l[0].shape)[0],S=d.map(x=>x[g]),L=uo(r,S,g);return L.map(x=>()=>x)}};const R1={kernelName:Vm,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,{dilations:g,strides:S,pad:L,dataFormat:x}=h;return Z(ao(g),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${g}'`),{x:()=>wO(d.shape,r,f,S,L,x),filter:()=>eg(d,r,f.shape,S,L,x)}}};const O1={kernelName:Hm,inputsToSave:["dy","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,{strides:g,pad:S,dataFormat:L,dimRoundingMode:x}=h;return{dy:()=>NI(r,f,g,S,L,1,x),filter:()=>eg(r,d,f.shape,g,S,L,x)}}};function TZ(r,l,h,d,f){let g=r;r.rank===4&&(g=re(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let S=l;S.rank===4&&(S=re(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(g.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${g.shape}.`),Z(S.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${S.shape}.`),Z(h.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${h}.`),Z(g.shape[4]===h[3],()=>`Error in conv3dDerFilter: depth of input ${g.shape[4]}) must match input depth in filter (${h[3]}.`),Z(S.shape[4]===h[4],()=>`Error in conv3dDerFilter: depth of dy (${S.shape[4]}) must match output depth for filter (${h[4]}).`);const L=O=>{const C=1,$=ku(g.shape,h,d,C,f);return O.conv3dDerFilter(g,S,$)},x={x:g,y:S},A={strides:d,pad:f};return H.runKernelFunc(L,x,null,F2,A)}const E1=G({conv3DBackpropFilter_:TZ});const D1={kernelName:k2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const{dilations:d,strides:f,pad:g}=h;Z(ao(d),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${d}'`);const[S,L]=l;return{x:()=>LO(S.shape,r,L,f,g),filter:()=>E1(S,r,L.shape,f,g)}}};const k1={kernelName:Ym,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(yt(YI(Le(h,"float32"))),r)}}};const F1={kernelName:qm,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(qI(Le(h,"float32")),r)}}};const _1={kernelName:jm,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{axis:f,exclusive:g,reverse:S}=h;return{x:()=>{const L=fs([f],d.rank);let x=RI(r,f,g,!S);return L!=null&&(x=Wt(x,L)),x}}}};const W1={kernelName:$2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const{dilations:d,strides:f,pad:g,dimRoundingMode:S}=h,L=d==null?[1,1]:d;Z(ao(L),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${L}'`);const[x,A]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(A.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${A.rank}.`),Z(x.shape[3]===A.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${A.shape[2]}.`),Z(co(f,L),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${L}'.`),S!=null&&Z(Qt(g),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const O=Lr(x.shape,A.shape,f,L,g,S,!0);return{x:()=>vO(x.shape,r,A,O),filter:()=>AO(x,r,A.shape,O)}}};const $1={kernelName:M2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,g={x:d,filter:f,dy:r},S={x:d,filter:f,dy:r};return{x:()=>H.runKernel(P2,g,h),filter:()=>H.runKernel(z2,S,h)}}};const U1={kernelName:Km,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ze(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{let L=ae(r,Le(h,"float32"));const x=vt(d.shape,f);x.length>0&&(L=re(Fe(L,x),d.shape));const A=ut(d);return yt(ze(L,Le(A,"float32")))};return{a:g,b:S}}};const B1={kernelName:G2,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l,d=g=>g.eluDer(r,h),f={dy:r,y:h};return{x:()=>H.runKernelFunc(d,f,null,V2)}}};const M1={kernelName:H2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l,d=ae(Gn(yt(ut(h))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,d)}}};const P1={kernelName:Xm,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,h)}}};const z1={kernelName:q2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,Gn(h))}}};const G1={kernelName:Jm,gradFunc:r=>({x:()=>je(r)})};const V1={kernelName:Zm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ze(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{let L=ae(r,Le(h,"float32"));const x=vt(d.shape,f);x.length>0&&(L=re(Fe(L,x),d.shape));const A=ut(d);return yt(ze(L,Le(A,"float32")))};return{a:g,b:S}}};const H1={kernelName:J2,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,h)=>{const{varianceEpsilon:d}=h,[f,g,S,L]=l,x=L==null?ke(1):L,A=vt(g.shape,f.shape),O=[];if(g.rank===1){for(let xe=0;xeg.rank===1?re(ae(ae(r,la(re(z,[1,1,1,g.shape[0]]),O)),x),f.shape):re(ae(ae(r,z),x),f.shape),se=()=>{let xe=ae(ae(z,ke(-1)),$);return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)},fe=()=>{let xe=ae(ae(ne,C),$);return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)},de=()=>{const xe=ae(C,z);let Me=ae(r,xe);return g.rank===1&&(Me=Fe(Me,A)),re(Me,g.shape)},Ae=()=>{let xe=r;return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)};return{x:te,mean:se,variance:fe,scale:de,offset:Ae}}};const j1={kernelName:Qm,inputsToSave:["x","indices"],gradFunc:(r,l,h)=>{const[d,f]=l,{axis:g}=h,S=ht(g,d.shape)[0],L=()=>{const x=d.shape,A=f.size,O=x.slice(0,S),C=O.length,$=x.slice(g,x.length).slice(1),z=$.length,ne=Y1(0,C),te=Y1(C+1,C+1+z),se=q1([O,[A],$]),fe=re(r,se),de=re(f,[A]),Ae=q1([[C],ne,te]),xe=Wt(fe,Ae);let Me=JI(xe,de,d.shape[S]);const Ke=Mc(Ae);return Me=Wt(Me,Ke),Me};return{x:L,indices:()=>f}}};function Y1(r,l){const h=[];for(let d=r;d{const[h,d]=l;return{a:()=>je(h),b:()=>je(d)}}};const X1={kernelName:tf,gradFunc:r=>({x:()=>Le(r,"float32")})};const J1={kernelName:tR,gradFunc:r=>({x:()=>je(r)})};const Z1={kernelName:nR,gradFunc:r=>({x:()=>je(r)})};const Q1={kernelName:sR,gradFunc:r=>({x:()=>je(r)})};const eE={kernelName:sf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,St(h,1))}}};const tE={kernelName:nf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,Le(h,"float32"))}}};const nE={kernelName:cR,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d]=l,{axis:f}=h;return{logits:()=>{const g=!0,S=Gn(d);return Be(r,ae(Fe(r,f,g),S))}}}};function AZ(r,l,h,d=5,f=1,g=1,S=.5){const L=O=>O.LRNGrad(h,r,l,d,f,g,S),x={x:r,y:l,dy:h},A={depthRadius:d,bias:f,alpha:g,beta:S};return H.runKernelFunc(L,x,null,hR,A)}const sE=G({localResponseNormalizationBackprop_:AZ});const iE={kernelName:lR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{depthRadius:g,bias:S,alpha:L,beta:x}=h;return{x:()=>sE(d,f,r,g,S,L,x)}}};function sg(r,l,h,d,f){return l.rank{const g=ae(r,Le(OI(h,l),r.dtype));return f==null?g:Wt(g,f)}}}const QI={kernelName:rf,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const d=h,{reductionIndices:f}=d,[g,S]=l,L=ht(f,g.shape),x=fs(L,g.rank),A=sg(r,S,g,L,x);return{x:()=>{let O=A.x();return x!=null&&(O=Wt(O)),O}}}};const rE={kernelName:of,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=()=>ae(r,Le(Sr(h,d),"float32")),g=()=>ae(r,Le(WI(h,d),"float32"));return{a:f,b:g}}};function vZ(r,l,h,d,f,g=[1,1,1],S,L){const x=M(r,"dy","maxPool3dBackprop"),A=M(l,"input","maxPool3dBackprop"),O=M(h,"output","maxPool3dBackprop");let C=x,$=A,z=O,ne=!1;A.rank===4&&(ne=!0,C=re(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),$=re(A,[1,A.shape[0],A.shape[1],A.shape[2],A.shape[3]]),z=re(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($.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${$.rank}.`),Z(z.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${z.rank}.`),Z(co(f,g),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${f} and dilations '${g}'`),L!=null&&Z(Qt(S),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${L} but got pad ${S}.`);const te=Ae=>{const xe=qf($.shape,d,f,g,S,L);return Ae.maxPool3dBackprop(C,$,z,xe)},se={dy:C,input:$,output:z},fe={filterSize:d,strides:f,dilations:g,pad:S,dimRoundingMode:L},de=H.runKernelFunc(te,se,null,mR,fe);return ne?re(de,[de.shape[1],de.shape[2],de.shape[3],de.shape[4]]):de}const oE=G({maxPool3dBackprop_:vZ});const aE={kernelName:pR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{filterSize:g,strides:S,dilations:L,pad:x,dimRoundingMode:A}=h,O=L==null?[1,1,1]:L;return{x:()=>oE(r,d,f,g,S,O,x,A)}}};function NZ(r,l,h,d,f,g,S){const L=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),A=M(h,"output","maxPoolBackprop");Z(x.rank===L.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${L.rank})`),Z(L.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${L.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),S!=null&&Z(Qt(g),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const O=z=>{const ne=Yf(x.shape,d,f,1,g,S);return z.maxPoolBackprop(L,x,A,ne)},C={dy:L,input:x,output:A},$={filterSize:d,strides:f,pad:g,dimRoundingMode:S};return H.runKernelFunc(O,C,null,dR,$)}const cE=G({maxPoolBackprop_:NZ});const lE={kernelName:uR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{filterSize:g,strides:S,pad:L}=h;return{x:()=>cE(r,d,f,g,S,L)}}};const hE={kernelName:af,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const d=h,{axis:f}=d,[g,S]=l,L=ht(f,g.shape),x=fs(L,g.rank),A=sg(r,S,g,L,x);return{x:()=>{let O=A.x();return x!=null&&(O=Wt(O)),O}}}};const uE={kernelName:cf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=()=>ae(r,Le(Ir(h,d),"float32")),g=()=>ae(r,Le(wi(h,d),"float32"));return{a:f,b:g}}};const dE={kernelName:fR,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=vt(h.shape,f);return L.length>0?re(Fe(r,L),h.shape):r},S=()=>{const L=ae(r,yt(kI(ze(h,d)))),x=vt(d.shape,f);return x.length>0?re(Fe(L,x),d.shape):L};return{a:g,b:S}}};const pE={kernelName:lf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ae(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{const L=ae(r,Le(h,"float32")),x=vt(d.shape,f);return x.length>0?re(Fe(L,x),d.shape):L};return{a:g,b:S}}};const mE={kernelName:hf,gradFunc:r=>({x:()=>yt(r)})};const fE={kernelName:SR,inputsToSave:["indices"],gradFunc:(r,l)=>{const h=l[0];return{indices:()=>Fs(h.shape,"float32")}}};const gE={kernelName:LR,gradFunc:r=>({x:()=>je(r)})};const ex={kernelName:uf,inputsToSave:["x"],gradFunc:(r,l,h)=>{const d=l[0],{paddings:f}=h,g=f.map(S=>S[0]);return{x:()=>At(r,g,d.shape)}}};const yE={kernelName:df,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[h,d,f]=l,g=h,S=d,L=rt(g.shape,S.shape),x=()=>{const O=Le(S,"float32");let C=ae(r,ae(O,da(g,Be(O,ke(1)))));const $=vt(g.shape,L);return $.length>0&&(C=Fe(C,$)),re(C,g.shape)},A=()=>{const O=wi(g,0),C=zn(O,lo(g),je(g));let $=ae(r,ae(f,C));const z=vt(S.shape,L);return z.length>0&&($=Fe($,z)),re($,S.shape)};return{a:x,b:A}}};const bE={kernelName:IR,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[h,d]=l,f=wi(h,0);return{x:()=>zn(f,r,ae(r,d)),alpha:()=>{let g=zn(f,je(r),ae(r,h));const S=vt(d.shape,r.shape);return S.length>0&&(g=Fe(g,S)),re(g,d.shape)}}}};const wE={kernelName:AR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,yt(ut(h)))}}};const LE={kernelName:CR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l,d=ae(Ir(h,6),pa(h));return{x:()=>ae(r,Le(d,"float32"))}}};const SE={kernelName:pf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,Le(pa(h),"float32"))}}};const IE={kernelName:mf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>re(r,h.shape)}}};const xE={kernelName:gf,inputsToSave:["images"],gradFunc:(r,l,h)=>{const[d]=l,f=L=>{const{alignCorners:x}=h;return L.resizeBilinearBackprop(r,d,x)},g={images:d},S=()=>H.runKernelFunc(f,g,null,NR,h);return{images:S}}};const TE={kernelName:ff,inputsToSave:["images"],gradFunc:(r,l,h)=>{const[d]=l,f=L=>{const{alignCorners:x}=h;return L.resizeNearestNeighborBackprop(r,d,x)},g={images:d},S=()=>H.runKernelFunc(f,g,null,vR,h);return{images:S}}};const AE={kernelName:yf,gradFunc:(r,l,h)=>{const{dims:d}=h,f=ht(d,r.shape);return{x:()=>Vc(r,f)}}};const vE={kernelName:RR,gradFunc:r=>({x:()=>je(r)})};const NE={kernelName:bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>yt(ze(r,ae(da(h,1.5),2)))}}};const CE={kernelName:wf,inputsToSave:["condition"],gradFunc:(r,l)=>{const[h]=l;return{condition:()=>Le(je(h),"float32"),t:()=>ae(r,Le(h,r.dtype)),e:()=>ae(r,Le(BI(h),r.dtype))}}};const RE={kernelName:OR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=wi(h,ke(0)),f=ke(i1),g=ke(r1),S=ae(r,g),L=ae(ae(r,f),Gn(Le(h,"float32")));return zn(d,S,L)}}}};const OE={kernelName:xf,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,ae(h,Be(ke(1),h)))}}};const EE={kernelName:ER,gradFunc:r=>({x:()=>je(r)})};const DE={kernelName:Sf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(Fu(Le(h,"float32")),r)}}};const kE={kernelName:If,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(CI(Le(h,"float32")),r)}}};const FE={kernelName:Lf,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{begin:f,size:g}=h,S=d.shape,[L,x]=Vf(d,f,g),A=[];for(let O=0;OGI(r,A)}}};const _E={kernelName:kR,outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d]=l,{dim:f}=h,g=!0,S=ae(r,d);return{logits:()=>Be(S,ae(Fe(S,[f],g),d))}}};const WE={kernelName:DR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,AI(h))}}};const tx={kernelName:vf,gradFunc:(r,l,h)=>{const{blockShape:d,paddings:f}=h;return{x:()=>vI(r,d,f)}}};const nx={kernelName:Nf,gradFunc:(r,l,h)=>{const{axis:d}=h;return{x:()=>bn(r,d)}}};const $E={kernelName:Tf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,ae(gs(Le(h,"float32")),2))}}};const UE={kernelName:FR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,ae(Le(h,"float32"),2))}}};const BE={kernelName:Cf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=ke(2),g=()=>ae(r,ae(f,Be(h,d))),S=()=>ae(r,ae(f,Be(d,h)));return{a:g,b:S}}};const ME={kernelName:_f,gradFunc:r=>({x:()=>je(r)})};const PE={kernelName:Rf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{let L=r;const x=vt(h.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,h.shape)},S=()=>{let L=r;const x=vt(d.shape,f);return x.length>0&&(L=Fe(L,x)),re(yt(L),d.shape)};return{a:g,b:S}}};const zE={kernelName:Af,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,f=d.shape.slice(),{axis:g}=h,S=ht(g,d.shape);S.forEach(A=>{f[A]=1});const L=re(r,f),x=ae(L,Ki(d.shape,"float32"));return{x:()=>x}}};const GE={kernelName:_R,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,ut(Fu(h)))}}};const VE={kernelName:WR,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(Be(ke(1),ut(h)),r)}}};const HE={kernelName:Of,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{reps:f}=h,g=()=>{let S=je(d);if(d.rank===1)for(let L=0;L{const d=h,{perm:f}=d,g=Mc(f);return{x:()=>Wt(r,g)}}};const qE={kernelName:Df,gradFunc:(r,l,h)=>{const d=h,{axis:f}=d;return{value:()=>js(r,f)}}};const jE={kernelName:kf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[h]=l,d=()=>CZ(r,h);return{x:d}}};function CZ(r,l){const h=_I(l,je(l)),d=FI(r,h);let f=Sr(l,ke(0,"int32"));const g=d.rank-f.rank;for(let L=0;L({x:()=>je(r)})};const RZ=[o1,a1,c1,l1,h1,u1,d1,p1,m1,f1,g1,y1,w1,S1,I1,x1,T1,A1,v1,N1,C1,O1,R1,D1,k1,F1,_1,W1,$1,U1,B1,M1,P1,z1,V1,G1,H1,j1,K1,X1,J1,Z1,Q1,eE,tE,nE,iE,QI,QI,rE,aE,lE,hE,uE,dE,pE,mE,fE,gE,ex,ex,yE,bE,wE,LE,SE,IE,xE,TE,AE,vE,NE,CE,RE,OE,EE,DE,kE,FE,_E,WE,tx,tx,nx,nx,$E,BE,UE,ME,PE,zE,GE,VE,HE,YE,qE,jE,KE];for(const r of RZ)BR(r);function sx(r,l,h=!1){const{Image:d,Canvas:f}=gt.getEnv();if(!(r instanceof d||r instanceof f))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const g=ra(r),S=l/Math.max(g.height,g.width),L=S*g.width,x=S*g.height,A=Dc({width:l,height:l}),O=r instanceof f?r:Tu(r),C=Math.abs(L-x)/2,$=h&&L{if(yr(h)){this._imageTensors[d]=h,this._inputDimensions[d]=h.shape;return}if(Os(h)){const g=h.shape[0];if(g!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${g} passed, but not supported in input array`);this._imageTensors[d]=h,this._inputDimensions[d]=h.shape.slice(1);return}const f=h instanceof gt.getEnv().Canvas?h:Tu(h);this._canvases[d]=f,this._inputDimensions[d]=[f.height,f.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 zi(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),h=this.getInputHeight(r);return PS({width:l,height:h},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,pO(()=>{const h=zi(this.batchSize,0,1).map(f=>{const g=this.getInput(f);if(g instanceof Tn){let S=Os(g)?g:g.expandDims();return S=HS(S,l),(S.shape[1]!==r||S.shape[2]!==r)&&(S=s1.resizeBilinear(S,[r,r])),S.as3D(r,r,3)}if(g instanceof gt.getEnv().Canvas)return II.fromPixels(sx(g,r,l));throw new Error(`toBatchTensor - at batchIdx ${f}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${g}`)}),d=js(h.map(f=>Le(f,"float32"))).as4D(this.batchSize,r,r,3);return d})}}async function Rt(r){if(r instanceof po)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const h=f=>Array.isArray(r)?` at input index ${f}:`:"",d=l.map(ia);return d.forEach((f,g)=>{if(!Um(f)&&!yr(f)&&!Os(f))throw typeof l[g]=="string"?new Error(`toNetInput -${h(g)} string passed, but could not resolve HTMLElement for element id ${l[g]}`):new Error(`toNetInput -${h(g)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Os(f)){const S=f.shape[0];if(S!==1)throw new Error(`toNetInput -${h(g)} tf.Tensor4D with batchSize ${S} passed, but not supported in input array`)}}),await Promise.all(d.map(f=>Um(f)&&QS(f))),new po(d,Array.isArray(r))}async function Yc(r,l){const{Canvas:h}=gt.getEnv();let d=r;if(!(r instanceof h)){const S=await Rt(r);if(S.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const L=S.getInput(0);d=L instanceof h?L:await tI(L)}const f=es(d),g=l.map(S=>S instanceof Yt?S.forSize(d.width,d.height).box.floor():S).map(S=>S.clipAtImageBorders(d.width,d.height));return g.map(({x:S,y:L,width:x,height:A})=>{const O=Dc({width:x,height:A});return es(O).putImageData(f.getImageData(S,L,x,A),0,0),O})}const ig=Ye(Je());async function qc(r,l){if(!yr(r)&&!Os(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Os(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return ig.tidy(()=>{const[h,d,f]=r.shape.slice(Os(r)?1:0),g=l.map(L=>L instanceof Yt?L.forSize(d,h).box:L).map(L=>L.clipAtImageBorders(d,h)),S=g.map(({x:L,y:x,width:A,height:O})=>ig.slice3d(r.as3D(h,d,f),[x,L,0],[O,A,f]));return S})}async function fa(r,l){const h=gt.getEnv().fetch,d=await h(r,l);if(!(d.status<400))throw new Error(`failed to fetch: (${d.status}) ${d.statusText}, from url: ${d.url}`);return d}async function OZ(r){const l=await fa(r),h=await l.blob();if(!h.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${h.type}, for url: ${l.url}`);return eI(h)}async function ix(r){return(await fa(r)).json()}async function EZ(r){return new Float32Array(await(await fa(r)).arrayBuffer())}function rg(r,l){const h=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:h};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${h}`};const d=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(d,"");const f=r.split("/").filter(L=>L),g=r.endsWith(".json")?f[f.length-1]:h;let S=d+(r.endsWith(".json")?f.slice(0,f.length-1):f).join("/");return S=r.startsWith("/")?`/${S}`:S,{modelBaseUri:S,manifestUri:S==="/"?`/${g}`:`${S}/${g}`}}const XE=Ye(Je());async function rx(r,l){const{manifestUri:h,modelBaseUri:d}=rg(r,l);let f=await ix(h);return XE.io.loadWeights(f,d)}function DZ(r,l,h=!1){const{width:d,height:f}=h?ra(l):l;return r.width=d,r.height=f,{width:d,height:f}}const xr=Ye(Je());class kn{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:h}=this.traversePropertyPath(r);return l[h]}reassignParamFromPath(r,l){const{obj:h,objProp:d}=this.traversePropertyPath(r);h[d].dispose(),h[d]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof xr.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof xr.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const h=xr.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,h)})}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 rx(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:h,modelBaseUri:d}=rg(r,this.getDefaultModelName()),f=x=>Promise.all(x.map(A=>l(A).then(O=>O.buffer))),g=xr.io.weightsLoaderFactory(f),S=JSON.parse((await l(h)).toString()),L=await g(S,d);this.loadFromWeightMap(L)}loadFromWeightMap(r){const{paramMappings:l,params:h}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=h}extractWeights(r){const{paramMappings:l,params:h}=this.extractParams(r);this._paramMappings=l,this._params=h}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((f,g)=>{if(!f.nextObj.hasOwnProperty(g))throw new Error(`traversePropertyPath - object does not have property ${g}, for path ${r}`);return{obj:f.nextObj,objProp:g,nextObj:f.nextObj[g]}},{nextObj:this.params}),{obj:h,objProp:d}=l;if(!h||!d||!(h[d]instanceof xr.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:h,objProp:d}}}const jc=Ye(Je());function ns(r,l,h){return jc.tidy(()=>{let d=jc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,h,"same");return d=jc.add(d,l.bias),d})}const Dt=Ye(Je());function og(r,l,h=!1){return Dt.tidy(()=>{const d=Dt.relu(h?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):ns(r,l.conv0,[2,2])),f=ns(d,l.conv1,[1,1]),g=Dt.relu(Dt.add(d,f)),S=ns(g,l.conv2,[1,1]);return Dt.relu(Dt.add(d,Dt.add(f,S)))})}function Mu(r,l,h=!1,d=!0){return Dt.tidy(()=>{const f=Dt.relu(h?Dt.add(Dt.conv2d(r,l.conv0.filters,d?[2,2]:[1,1],"same"),l.conv0.bias):ns(r,l.conv0,d?[2,2]:[1,1])),g=ns(f,l.conv1,[1,1]),S=Dt.relu(Dt.add(f,g)),L=ns(S,l.conv2,[1,1]),x=Dt.relu(Dt.add(f,Dt.add(g,L))),A=ns(x,l.conv3,[1,1]);return Dt.relu(Dt.add(f,Dt.add(g,Dt.add(L,A))))})}const mo=Ye(Je());function ga(r,l,h="same",d=!1){return mo.tidy(()=>{const f=mo.add(mo.conv2d(r,l.filters,[1,1],h),l.bias);return d?mo.relu(f):f})}function Vn(r,l){Object.keys(r).forEach(h=>{l.some(d=>d.originalPath===h)||r[h].dispose()})}const ag=Ye(Je());function Kc(r,l){return function(h,d,f,g){const S=ag.tensor4d(r(h*d*f*f),[f,f,h,d]),L=ag.tensor1d(r(d));return l.push({paramPath:`${g}/filters`},{paramPath:`${g}/bias`}),{filters:S,bias:L}}}const cg=Ye(Je());function lg(r,l){return function(h,d,f){const g=cg.tensor2d(r(h*d),[h,d]),S=cg.tensor1d(r(d));return l.push({paramPath:`${f}/weights`},{paramPath:`${f}/bias`}),{weights:g,bias:S}}}class ox{constructor(r,l,h){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=h}}const Pu=Ye(Je());function Xc(r,l){return function(h,d,f){const g=Pu.tensor4d(r(3*3*h),[3,3,h,1]),S=Pu.tensor4d(r(h*d),[1,1,h,d]),L=Pu.tensor1d(r(d));return l.push({paramPath:`${f}/depthwise_filter`},{paramPath:`${f}/pointwise_filter`},{paramPath:`${f}/bias`}),new ox(g,S,L)}}function Jc(r){return function(l){const h=r(`${l}/depthwise_filter`,4),d=r(`${l}/pointwise_filter`,4),f=r(`${l}/bias`,1);return new ox(h,d,f)}}function ys(r,l){return function(h,d,f){const g=r[h];if(!Qo(g,d))throw new Error(`expected weightMap[${h}] to be a Tensor${d}D, instead have ${g}`);return l.push({originalPath:h,paramPath:f||h}),g}}function Hn(r){let l=r;function h(f){const g=l.slice(0,f);return l=l.slice(f),g}function d(){return l}return{extractWeights:h,getRemainingWeights:d}}function hg(r,l){const h=Kc(r,l),d=Xc(r,l);function f(S,L,x,A=!1){const O=A?h(S,L,3,`${x}/conv0`):d(S,L,`${x}/conv0`),C=d(L,L,`${x}/conv1`),$=d(L,L,`${x}/conv2`);return{conv0:O,conv1:C,conv2:$}}function g(S,L,x,A=!1){const{conv0:O,conv1:C,conv2:$}=f(S,L,x,A),z=d(L,L,`${x}/conv3`);return{conv0:O,conv1:C,conv2:$,conv3:z}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:g}}function JE(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractDenseBlock4Params:f}=hg(h,l),g=f(3,32,"dense0",!0),S=f(32,64,"dense1"),L=f(64,128,"dense2"),x=f(128,256,"dense3");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{dense0:g,dense1:S,dense2:L,dense3:x}}}function ug(r){return function(l){const h=r(`${l}/filters`,4),d=r(`${l}/bias`,1);return{filters:h,bias:d}}}function dg(r,l){const h=ys(r,l),d=ug(h),f=Jc(h);function g(L,x=!1){const A=x?d(`${L}/conv0`):f(`${L}/conv0`),O=f(`${L}/conv1`),C=f(`${L}/conv2`);return{conv0:A,conv1:O,conv2:C}}function S(L,x=!1){const A=x?d(`${L}/conv0`):f(`${L}/conv0`),O=f(`${L}/conv1`),C=f(`${L}/conv2`),$=f(`${L}/conv3`);return{conv0:A,conv1:O,conv2:C,conv3:$}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:S}}function ZE(r){const l=[],{extractDenseBlock4Params:h}=dg(r,l),d={dense0:h("dense0",!0),dense1:h("dense1"),dense2:h("dense2"),dense3:h("dense3")};return Vn(r,l),{params:d,paramMappings:l}}const fo=Ye(Je());class pg extends kn{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return fo.tidy(()=>{const h=fo.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(fo.scalar(255));let g=Mu(f,l.dense0,!0);return g=Mu(g,l.dense1),g=Mu(g,l.dense2),g=Mu(g,l.dense3),g=fo.avgPool(g,[7,7],[2,2],"valid"),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return ZE(r)}extractParams(r){return JE(r)}}const Zc=Ye(Je());function zu(r,l){return Zc.tidy(()=>Zc.add(Zc.matMul(r,l.weights),l.bias))}function QE(r,l,h){const d=[],{extractWeights:f,getRemainingWeights:g}=Hn(r),S=lg(f,d),L=S(l,h,"fc");if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:d,params:{fc:L}}}function eD(r){const l=[],h=ys(r,l);function d(g){const S=h(`${g}/weights`,2),L=h(`${g}/bias`,1);return{weights:S,bias:L}}const f={fc:d("fc")};return Vn(r,l),{params:f,paramMappings:l}}function mg(r){const l={},h={};return Object.keys(r).forEach(d=>{const f=d.startsWith("fc")?h:l;f[d]=r[d]}),{featureExtractorMap:l,classifierMap:h}}const tD=Ye(Je());class fg extends kn{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 tD.tidy(()=>{const h=r instanceof po?this.faceFeatureExtractor.forwardInput(r):r;return zu(h.as2D(h.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:h}=this.extractClassifierParams(r);this._params=l,this._paramMappings=h}extractClassifierParams(r){return QE(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:h}=mg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),eD(h)}extractParams(r){const l=this.getClassifierChannelsIn(),h=this.getClassifierChannelsOut(),d=h*l+h,f=r.slice(0,r.length-d),g=r.slice(r.length-d);return this.faceFeatureExtractor.extractWeights(f),this.extractClassifierParams(g)}}const ax=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class ya{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);ax.forEach((l,h)=>{this[l]=r[h]})}asSortedArray(){return ax.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Qc=Ye(Je());class cx extends fg{constructor(r=new pg){super("FaceExpressionNet",r)}forwardInput(r){return Qc.tidy(()=>Qc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Rt(r))}async predictExpressions(r){const l=await Rt(r),h=await this.forwardInput(l),d=await Promise.all(Qc.unstack(h).map(async g=>{const S=await g.data();return g.dispose(),S}));h.dispose();const f=d.map(g=>new ya(g));return l.isBatchInput?f:f[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function lx(r){return r.expressions instanceof ya}function gg(r,l){const h={expressions:l};return Object.assign({},r,h)}function kZ(r,l,h=.1,d){const f=Array.isArray(l)?l:[l];f.forEach(g=>{const S=g instanceof ya?g:lx(g)?g.expressions:void 0;if(!S)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const L=S.asSortedArray(),x=L.filter(C=>C.probability>h),A=Vi(g)?g.detection.box.bottomLeft:d||new Ze(0,0),O=new Ec(x.map(C=>`${C.expression} (${ea(C.probability)})`),A);O.draw(r)})}function ba(r){return Vi(r)&&r.landmarks instanceof qs&&r.unshiftedLandmarks instanceof qs&&r.alignedRect instanceof Yt}function el(r,l){const{box:h}=r.detection,d=l.shiftBy(h.x,h.y),f=d.align(),{imageDims:g}=r.detection,S=new Yt(r.detection.score,f.rescale(g.reverse()),g),L={landmarks:d,unshiftedLandmarks:l,alignedRect:S};return Object.assign({},r,L)}class nD{constructor(r={}){const{drawLines:l=!0,drawPoints:h=!0,lineWidth:d,lineColor:f,pointSize:g,pointColor:S}=r;this.drawLines=l,this.drawPoints=h,this.lineWidth=d||1,this.pointSize=g||2,this.lineColor=f||"rgba(0, 255, 255, 1)",this.pointColor=S||"rgba(255, 0, 255, 1)"}}class sD{constructor(r,l={}){this.faceLandmarks=r,this.options=new nD(l)}draw(r){const l=es(r),{drawLines:h,drawPoints:d,lineWidth:f,lineColor:g,pointSize:S,pointColor:L}=this.options;if(h&&this.faceLandmarks instanceof Iu&&(l.strokeStyle=g,l.lineWidth=f,gr(l,this.faceLandmarks.getJawOutline()),gr(l,this.faceLandmarks.getLeftEyeBrow()),gr(l,this.faceLandmarks.getRightEyeBrow()),gr(l,this.faceLandmarks.getNose()),gr(l,this.faceLandmarks.getLeftEye(),!0),gr(l,this.faceLandmarks.getRightEye(),!0),gr(l,this.faceLandmarks.getMouth(),!0)),d){l.strokeStyle=L,l.fillStyle=L;const x=A=>{l.beginPath(),l.arc(A.x,A.y,S,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function FZ(r,l){const h=Array.isArray(l)?l:[l];h.forEach(d=>{const f=d instanceof qs?d:ba(d)?d.landmarks:void 0;if(!f)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new sD(f).draw(r)})}const hx={};vc(hx,{AnchorPosition:()=>Hi,DrawBox:()=>ZS,DrawBoxOptions:()=>l2,DrawFaceLandmarks:()=>sD,DrawFaceLandmarksOptions:()=>nD,DrawTextField:()=>Ec,DrawTextFieldOptions:()=>Wm,drawContour:()=>gr,drawDetections:()=>GX,drawFaceExpressions:()=>kZ,drawFaceLandmarks:()=>FZ});function _Z(r,l){const h=Kc(r,l),d=Xc(r,l);function f(S,L,x){const A=d(S,L,`${x}/separable_conv0`),O=d(L,L,`${x}/separable_conv1`),C=h(S,L,1,`${x}/expansion_conv`);return{separable_conv0:A,separable_conv1:O,expansion_conv:C}}function g(S,L){const x=d(S,S,`${L}/separable_conv0`),A=d(S,S,`${L}/separable_conv1`),O=d(S,S,`${L}/separable_conv2`);return{separable_conv0:x,separable_conv1:A,separable_conv2:O}}return{extractConvParams:h,extractSeparableConvParams:d,extractReductionBlockParams:f,extractMainBlockParams:g}}function iD(r,l){const h=[],{extractWeights:d,getRemainingWeights:f}=Hn(r),{extractConvParams:g,extractSeparableConvParams:S,extractReductionBlockParams:L,extractMainBlockParams:x}=_Z(d,h),A=g(3,32,3,"entry_flow/conv_in"),O=L(32,64,"entry_flow/reduction_block_0"),C=L(64,128,"entry_flow/reduction_block_1"),$={conv_in:A,reduction_block_0:O,reduction_block_1:C},z={};zi(l,0,1).forEach(fe=>{z[`main_block_${fe}`]=x(128,`middle_flow/main_block_${fe}`)});const ne=L(128,256,"exit_flow/reduction_block"),te=S(256,512,"exit_flow/separable_conv"),se={reduction_block:ne,separable_conv:te};if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:h,params:{entry_flow:$,middle_flow:z,exit_flow:se}}}function WZ(r,l){const h=ys(r,l),d=ug(h),f=Jc(h);function g(L){const x=f(`${L}/separable_conv0`),A=f(`${L}/separable_conv1`),O=d(`${L}/expansion_conv`);return{separable_conv0:x,separable_conv1:A,expansion_conv:O}}function S(L){const x=f(`${L}/separable_conv0`),A=f(`${L}/separable_conv1`),O=f(`${L}/separable_conv2`);return{separable_conv0:x,separable_conv1:A,separable_conv2:O}}return{extractConvParams:d,extractSeparableConvParams:f,extractReductionBlockParams:g,extractMainBlockParams:S}}function rD(r,l){const h=[],{extractConvParams:d,extractSeparableConvParams:f,extractReductionBlockParams:g,extractMainBlockParams:S}=WZ(r,h),L=d("entry_flow/conv_in"),x=g("entry_flow/reduction_block_0"),A=g("entry_flow/reduction_block_1"),O={conv_in:L,reduction_block_0:x,reduction_block_1:A},C={};zi(l,0,1).forEach(te=>{C[`main_block_${te}`]=S(`middle_flow/main_block_${te}`)});const $=g("exit_flow/reduction_block"),z=f("exit_flow/separable_conv"),ne={reduction_block:$,separable_conv:z};return Vn(r,h),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:h}}const tn=Ye(Je());function oD(r,l,h){return tn.add(tn.conv2d(r,l.filters,h,"same"),l.bias)}function ux(r,l,h=!0){let d=h?tn.relu(r):r;return d=ns(d,l.separable_conv0,[1,1]),d=ns(tn.relu(d),l.separable_conv1,[1,1]),d=tn.maxPool(d,[3,3],[2,2],"same"),d=tn.add(d,oD(r,l.expansion_conv,[2,2])),d}function $Z(r,l){let h=ns(tn.relu(r),l.separable_conv0,[1,1]);return h=ns(tn.relu(h),l.separable_conv1,[1,1]),h=ns(tn.relu(h),l.separable_conv2,[1,1]),h=tn.add(h,r),h}class aD extends kn{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return tn.tidy(()=>{const h=tn.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(tn.scalar(256));let g=tn.relu(oD(f,l.entry_flow.conv_in,[2,2]));return g=ux(g,l.entry_flow.reduction_block_0,!1),g=ux(g,l.entry_flow.reduction_block_1),zi(this._numMainBlocks,0,1).forEach(S=>{g=$Z(g,l.middle_flow[`main_block_${S}`])}),g=ux(g,l.exit_flow.reduction_block),g=tn.relu(ns(g,l.exit_flow.separable_conv,[1,1])),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return rD(r,this._numMainBlocks)}extractParams(r){return iD(r,this._numMainBlocks)}}function cD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),f=lg(h,l),g=f(512,1,"fc/age"),S=f(512,2,"fc/gender");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{fc:{age:g,gender:S}}}}function lD(r){const l=[],h=ys(r,l);function d(g){const S=h(`${g}/weights`,2),L=h(`${g}/bias`,1);return{weights:S,bias:L}}const f={fc:{age:d("fc/age"),gender:d("fc/gender")}};return Vn(r,l),{params:f,paramMappings:l}}var Tr;(function(r){r.FEMALE="female",r.MALE="male"})(Tr||(Tr={}));const Xi=Ye(Je());class dx extends kn{constructor(r=new aD(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 Xi.tidy(()=>{const h=r instanceof po?this.faceFeatureExtractor.forwardInput(r):r,d=Xi.avgPool(h,[7,7],[2,2],"valid").as2D(h.shape[0],-1),f=zu(d,l.fc.age).as1D(),g=zu(d,l.fc.gender);return{age:f,gender:g}})}forwardInput(r){return Xi.tidy(()=>{const{age:l,gender:h}=this.runNet(r);return{age:l,gender:Xi.softmax(h)}})}async forward(r){return this.forwardInput(await Rt(r))}async predictAgeAndGender(r){const l=await Rt(r),h=await this.forwardInput(l),d=Xi.unstack(h.age),f=Xi.unstack(h.gender),g=d.map((L,x)=>({ageTensor:L,genderTensor:f[x]})),S=await Promise.all(g.map(async({ageTensor:L,genderTensor:x})=>{const A=(await L.data())[0],O=(await x.data())[0],C=O>.5,$=C?Tr.MALE:Tr.FEMALE,z=C?O:1-O;return L.dispose(),x.dispose(),{age:A,gender:$,genderProbability:z}}));return h.age.dispose(),h.gender.dispose(),l.isBatchInput?S:S[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:h}=this.extractClassifierParams(r);this._params=l,this._paramMappings=h}extractClassifierParams(r){return cD(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:h}=mg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),lD(h)}extractParams(r){const l=512*1+1+(512*2+2),h=r.slice(0,r.length-l),d=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(h),this.extractClassifierParams(d)}}const bs=Ye(Je());class yg extends fg{postProcess(r,l,h){const d=h.map(({width:g,height:S})=>{const L=l/Math.max(S,g);return{width:g*L,height:S*L}}),f=d.length;return bs.tidy(()=>{const g=(O,C)=>bs.stack([bs.fill([68],O,"float32"),bs.fill([68],C,"float32")],1).as2D(1,136).as1D(),S=(O,C)=>{const{width:$,height:z}=d[O];return C($,z)?Math.abs($-z)/2:0},L=O=>S(O,(C,$)=>C<$),x=O=>S(O,(C,$)=>$g(L(C),x(C))))).div(bs.stack(Array.from(Array(f),(O,C)=>g(d[C].width,d[C].height))));return A})}forwardInput(r){return bs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([h,d])=>({height:h,width:d})))})}async forward(r){return this.forwardInput(await Rt(r))}async detectLandmarks(r){const l=await Rt(r),h=bs.tidy(()=>bs.unstack(this.forwardInput(l))),d=await Promise.all(h.map(async(f,g)=>{const S=Array.from(await f.data()),L=S.filter((A,O)=>Em(O)),x=S.filter((A,O)=>!Em(O));return new Iu(Array(68).fill(0).map((A,O)=>new Ze(L[O],x[O])),{height:l.getInputHeight(g),width:l.getInputWidth(g)})}));return h.forEach(f=>f.dispose()),l.isBatchInput?d:d[0]}getClassifierChannelsOut(){return 136}}class Gu extends yg{constructor(r=new pg){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function hD(r){const l=[],{extractDenseBlock3Params:h}=dg(r,l),d={dense0:h("dense0",!0),dense1:h("dense1"),dense2:h("dense2")};return Vn(r,l),{params:d,paramMappings:l}}function uD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractDenseBlock3Params:f}=hg(h,l),g=f(3,32,"dense0",!0),S=f(32,64,"dense1"),L=f(64,128,"dense2");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{dense0:g,dense1:S,dense2:L}}}const go=Ye(Je());class dD extends kn{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return go.tidy(()=>{const h=go.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(go.scalar(255));let g=og(f,l.dense0,!0);return g=og(g,l.dense1),g=og(g,l.dense2),g=go.avgPool(g,[14,14],[2,2],"valid"),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return hD(r)}extractParams(r){return uD(r)}}class px extends yg{constructor(r=new dD){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class UZ extends Gu{}const bg=Ye(Je());function pD(r,l){return bg.add(bg.mul(r,l.weights),l.biases)}const tl=Ye(Je());function mx(r,l,h,d,f="same"){const{filters:g,bias:S}=l.conv;let L=tl.conv2d(r,g,h,f);return L=tl.add(L,S),L=pD(L,l.scale),d?tl.relu(L):L}function mD(r,l){return mx(r,l,[1,1],!0)}function fx(r,l){return mx(r,l,[1,1],!1)}function wg(r,l){return mx(r,l,[2,2],!0,"valid")}const ws=Ye(Je());function BZ(r,l){function h(L,x,A){const O=r(L),C=O.length/(x*A*A);if(MS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${A}`);return ws.tidy(()=>ws.transpose(ws.tensor4d(O,[x,C,A,A]),[2,3,1,0]))}function d(L,x,A,O){const C=h(L,x,A),$=ws.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:$}}function f(L,x){const A=ws.tensor1d(r(L)),O=ws.tensor1d(r(L));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:A,biases:O}}function g(L,x,A,O){const C=d(L,x,A,`${O}/conv`),$=f(x,`${O}/scale`);return{conv:C,scale:$}}function S(L,x,A,O,C=!1){const $=g((C?.5:1)*L,x,A,`${O}/conv1`),z=g(L,x,A,`${O}/conv2`);return{conv1:$,conv2:z}}return{extractConvLayerParams:g,extractResidualLayerParams:S}}function fD(r){const{extractWeights:l,getRemainingWeights:h}=Hn(r),d=[],{extractConvLayerParams:f,extractResidualLayerParams:g}=BZ(l,d),S=f(4704,32,7,"conv32_down"),L=g(9216,32,3,"conv32_1"),x=g(9216,32,3,"conv32_2"),A=g(9216,32,3,"conv32_3"),O=g(36864,64,3,"conv64_down",!0),C=g(36864,64,3,"conv64_1"),$=g(36864,64,3,"conv64_2"),z=g(36864,64,3,"conv64_3"),ne=g(147456,128,3,"conv128_down",!0),te=g(147456,128,3,"conv128_1"),se=g(147456,128,3,"conv128_2"),fe=g(589824,256,3,"conv256_down",!0),de=g(589824,256,3,"conv256_1"),Ae=g(589824,256,3,"conv256_2"),xe=g(589824,256,3,"conv256_down_out"),Me=ws.tidy(()=>ws.transpose(ws.tensor2d(l(256*128),[128,256]),[1,0]));if(d.push({paramPath:"fc"}),h().length!==0)throw new Error(`weights remaing after extract: ${h().length}`);const Ke={conv32_down:S,conv32_1:L,conv32_2:x,conv32_3:A,conv64_down:O,conv64_1:C,conv64_2:$,conv64_3:z,conv128_down:ne,conv128_1:te,conv128_2:se,conv256_down:fe,conv256_1:de,conv256_2:Ae,conv256_down_out:xe,fc:Me};return{params:Ke,paramMappings:d}}function MZ(r,l){const h=ys(r,l);function d(S){const L=h(`${S}/scale/weights`,1),x=h(`${S}/scale/biases`,1);return{weights:L,biases:x}}function f(S){const L=h(`${S}/conv/filters`,4),x=h(`${S}/conv/bias`,1),A=d(S);return{conv:{filters:L,bias:x},scale:A}}function g(S){return{conv1:f(`${S}/conv1`),conv2:f(`${S}/conv2`)}}return{extractConvLayerParams:f,extractResidualLayerParams:g}}function gD(r){const l=[],{extractConvLayerParams:h,extractResidualLayerParams:d}=MZ(r,l),f=h("conv32_down"),g=d("conv32_1"),S=d("conv32_2"),L=d("conv32_3"),x=d("conv64_down"),A=d("conv64_1"),O=d("conv64_2"),C=d("conv64_3"),$=d("conv128_down"),z=d("conv128_1"),ne=d("conv128_2"),te=d("conv256_down"),se=d("conv256_1"),fe=d("conv256_2"),de=d("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!BS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const xe={conv32_down:f,conv32_1:g,conv32_2:S,conv32_3:L,conv64_down:x,conv64_1:A,conv64_2:O,conv64_3:C,conv128_down:$,conv128_1:z,conv128_2:ne,conv256_down:te,conv256_1:se,conv256_2:fe,conv256_down_out:de,fc:Ae};return Vn(r,l),{params:xe,paramMappings:l}}const Yn=Ye(Je());function Li(r,l){let h=mD(r,l.conv1);return h=fx(h,l.conv2),h=Yn.add(h,r),h=Yn.relu(h),h}function Vu(r,l){let h=wg(r,l.conv1);h=fx(h,l.conv2);let d=Yn.avgPool(r,2,2,"valid");const f=Yn.zeros(d.shape),g=d.shape[3]!==h.shape[3],S=d.shape[1]!==h.shape[1]||d.shape[2]!==h.shape[2];if(S){const L=[...h.shape];L[1]=1;const x=Yn.zeros(L);h=Yn.concat([h,x],1);const A=[...h.shape];A[2]=1;const O=Yn.zeros(A);h=Yn.concat([h,O],2)}return d=g?Yn.concat([d,f],3):d,h=Yn.add(d,h),h=Yn.relu(h),h}const _s=Ye(Je());class Hu extends kn{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return _s.tidy(()=>{const h=_s.cast(r.toBatchTensor(150,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(_s.scalar(256));let g=wg(f,l.conv32_down);g=_s.maxPool(g,3,2,"valid"),g=Li(g,l.conv32_1),g=Li(g,l.conv32_2),g=Li(g,l.conv32_3),g=Vu(g,l.conv64_down),g=Li(g,l.conv64_1),g=Li(g,l.conv64_2),g=Li(g,l.conv64_3),g=Vu(g,l.conv128_down),g=Li(g,l.conv128_1),g=Li(g,l.conv128_2),g=Vu(g,l.conv256_down),g=Li(g,l.conv256_1),g=Li(g,l.conv256_2),g=Vu(g,l.conv256_down_out);const S=g.mean([1,2]),L=_s.matMul(S,l.fc);return L})}async forward(r){return this.forwardInput(await Rt(r))}async computeFaceDescriptor(r){const l=await Rt(r),h=_s.tidy(()=>_s.unstack(this.forwardInput(l))),d=await Promise.all(h.map(f=>f.data()));return h.forEach(f=>f.dispose()),l.isBatchInput?d:d[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return gD(r)}extractParams(r){return fD(r)}}function PZ(r){const l=new Hu;return l.extractWeights(r),l}function Lg(r,l){const h={descriptor:l};return Object.assign({},r,h)}function zZ(r){return typeof r.age=="number"}function Sg(r,l){const h={age:l};return Object.assign({},r,h)}function GZ(r){return(r.gender===Tr.MALE||r.gender===Tr.FEMALE)&&Rc(r.genderProbability)}function Ig(r,l,h){const d={gender:l,genderProbability:h};return Object.assign({},r,d)}const Si=Ye(Je());function VZ(r,l){function h(x,A){const O=Si.tensor4d(r(3*3*x),[3,3,x,1]),C=Si.tensor1d(r(x)),$=Si.tensor1d(r(x)),z=Si.tensor1d(r(x)),ne=Si.tensor1d(r(x));return l.push({paramPath:`${A}/filters`},{paramPath:`${A}/batch_norm_scale`},{paramPath:`${A}/batch_norm_offset`},{paramPath:`${A}/batch_norm_mean`},{paramPath:`${A}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:$,batch_norm_mean:z,batch_norm_variance:ne}}function d(x,A,O,C,$){const z=Si.tensor4d(r(x*A*O*O),[O,O,x,A]),ne=Si.tensor1d(r(A));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${$?"batch_norm_offset":"bias"}`}),{filters:z,bias:ne}}function f(x,A,O,C){const{filters:$,bias:z}=d(x,A,O,C,!0);return{filters:$,batch_norm_offset:z}}function g(x,A,O){const C=h(x,`${O}/depthwise_conv`),$=f(x,A,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:$}}function S(){const x=f(3,32,3,"mobilenetv1/conv_0"),A=g(32,64,"mobilenetv1/conv_1"),O=g(64,128,"mobilenetv1/conv_2"),C=g(128,128,"mobilenetv1/conv_3"),$=g(128,256,"mobilenetv1/conv_4"),z=g(256,256,"mobilenetv1/conv_5"),ne=g(256,512,"mobilenetv1/conv_6"),te=g(512,512,"mobilenetv1/conv_7"),se=g(512,512,"mobilenetv1/conv_8"),fe=g(512,512,"mobilenetv1/conv_9"),de=g(512,512,"mobilenetv1/conv_10"),Ae=g(512,512,"mobilenetv1/conv_11"),xe=g(512,1024,"mobilenetv1/conv_12"),Me=g(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:A,conv_2:O,conv_3:C,conv_4:$,conv_5:z,conv_6:ne,conv_7:te,conv_8:se,conv_9:fe,conv_10:de,conv_11:Ae,conv_12:xe,conv_13:Me}}function L(){const x=f(1024,256,1,"prediction_layer/conv_0"),A=f(256,512,3,"prediction_layer/conv_1"),O=f(512,128,1,"prediction_layer/conv_2"),C=f(128,256,3,"prediction_layer/conv_3"),$=f(256,128,1,"prediction_layer/conv_4"),z=f(128,256,3,"prediction_layer/conv_5"),ne=f(256,64,1,"prediction_layer/conv_6"),te=f(64,128,3,"prediction_layer/conv_7"),se=d(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),fe=d(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),de=d(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=d(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),xe=d(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Me=d(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),Ke=d(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),wt=d(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),$t=d(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=d(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Fn=d(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),vn=d(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),Nn={box_encoding_predictor:se,class_predictor:fe},Qs={box_encoding_predictor:de,class_predictor:Ae},Ai={box_encoding_predictor:xe,class_predictor:Me},ei={box_encoding_predictor:Ke,class_predictor:wt},xa={box_encoding_predictor:$t,class_predictor:Kt},hl={box_encoding_predictor:Fn,class_predictor:vn};return{conv_0:x,conv_1:A,conv_2:O,conv_3:C,conv_4:$,conv_5:z,conv_6:ne,conv_7:te,box_predictor_0:Nn,box_predictor_1:Qs,box_predictor_2:Ai,box_predictor_3:ei,box_predictor_4:xa,box_predictor_5:hl}}return{extractMobilenetV1Params:S,extractPredictionLayerParams:L}}function yD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractMobilenetV1Params:f,extractPredictionLayerParams:g}=VZ(h,l),S=f(),L=g(),x=Si.tensor3d(h(5118*4),[1,5118,4]),A={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{params:{mobilenetv1:S,prediction_layer:L,output_layer:A},paramMappings:l}}function HZ(r,l){const h=ys(r,l);function d(A,O,C){const $=h(`${A}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),z=h(`${A}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:$,batch_norm_offset:z}}function f(A){const O=`mobilenetv1/conv_${A}`,C=`MobilenetV1/Conv2d_${A}_depthwise`,$=`${O}/depthwise_conv`,z=`${O}/pointwise_conv`,ne=h(`${C}/depthwise_weights`,4,`${$}/filters`),te=h(`${C}/BatchNorm/gamma`,1,`${$}/batch_norm_scale`),se=h(`${C}/BatchNorm/beta`,1,`${$}/batch_norm_offset`),fe=h(`${C}/BatchNorm/moving_mean`,1,`${$}/batch_norm_mean`),de=h(`${C}/BatchNorm/moving_variance`,1,`${$}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:se,batch_norm_mean:fe,batch_norm_variance:de},pointwise_conv:d("MobilenetV1",A,z)}}function g(){return{conv_0:d("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:f(1),conv_2:f(2),conv_3:f(3),conv_4:f(4),conv_5:f(5),conv_6:f(6),conv_7:f(7),conv_8:f(8),conv_9:f(9),conv_10:f(10),conv_11:f(11),conv_12:f(12),conv_13:f(13)}}function S(A,O){const C=h(`${A}/weights`,4,`${O}/filters`),$=h(`${A}/biases`,1,`${O}/bias`);return{filters:C,bias:$}}function L(A){const O=S(`Prediction/BoxPredictor_${A}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${A}/box_encoding_predictor`),C=S(`Prediction/BoxPredictor_${A}/ClassPredictor`,`prediction_layer/box_predictor_${A}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:d("Prediction",0,"prediction_layer/conv_0"),conv_1:d("Prediction",1,"prediction_layer/conv_1"),conv_2:d("Prediction",2,"prediction_layer/conv_2"),conv_3:d("Prediction",3,"prediction_layer/conv_3"),conv_4:d("Prediction",4,"prediction_layer/conv_4"),conv_5:d("Prediction",5,"prediction_layer/conv_5"),conv_6:d("Prediction",6,"prediction_layer/conv_6"),conv_7:d("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:L(0),box_predictor_1:L(1),box_predictor_2:L(2),box_predictor_3:L(3),box_predictor_4:L(4),box_predictor_5:L(5)}}return{extractMobilenetV1Params:g,extractPredictionLayerParams:x}}function bD(r){const l=[],{extractMobilenetV1Params:h,extractPredictionLayerParams:d}=HZ(r,l),f=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!yr(f))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${f}`);const g={mobilenetv1:h(),prediction_layer:d(),output_layer:{extra_dim:f}};return Vn(r,l),{params:g,paramMappings:l}}const yo=Ye(Je());function Xs(r,l,h){return yo.tidy(()=>{let d=yo.conv2d(r,l.filters,h,"same");return d=yo.add(d,l.batch_norm_offset),yo.clipByValue(d,0,6)})}const Ar=Ye(Je()),YZ=.0010000000474974513;function qZ(r,l,h){return Ar.tidy(()=>{let d=Ar.depthwiseConv2d(r,l.filters,h,"same");return d=Ar.batchNorm(d,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,YZ),Ar.clipByValue(d,0,6)})}function jZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function wD(r,l){return Ar.tidy(()=>{let h,d=Xs(r,l.conv_0,[2,2]);const f=[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(f.forEach((g,S)=>{const L=S+1,x=jZ(L);d=qZ(d,g.depthwise_conv,x),d=Xs(d,g.pointwise_conv,[1,1]),L===11&&(h=d)}),h===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:d,conv11:h}})}function LD(r,l,h,d,f){const g=r.shape[0],S=Math.min(h,g),L=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>f).sort((O,C)=>C.score-O.score),x=O=>O<=d?1:0,A=[];return L.forEach(O=>{if(A.length>=S)return;const C=O.score;for(let $=A.length-1;$>=0;--$){const z=KZ(r,O.boxIndex,A[$]);if(z===0)continue;if(O.score*=x(z),O.score<=f)break}C===O.score&&A.push(O.boxIndex)}),A}function KZ(r,l,h){const d=r.arraySync(),f=Math.min(d[l][0],d[l][2]),g=Math.min(d[l][1],d[l][3]),S=Math.max(d[l][0],d[l][2]),L=Math.max(d[l][1],d[l][3]),x=Math.min(d[h][0],d[h][2]),A=Math.min(d[h][1],d[h][3]),O=Math.max(d[h][0],d[h][2]),C=Math.max(d[h][1],d[h][3]),$=(S-f)*(L-g),z=(O-x)*(C-A);if($<=0||z<=0)return 0;const ne=Math.max(f,x),te=Math.max(g,A),se=Math.min(S,O),fe=Math.min(L,C),de=Math.max(se-ne,0)*Math.max(fe-te,0);return de/($+z-de)}const De=Ye(Je());function XZ(r){const l=De.unstack(De.transpose(r,[1,0])),h=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],d=[De.add(l[0],De.div(h[0],De.scalar(2))),De.add(l[1],De.div(h[1],De.scalar(2)))];return{sizes:h,centers:d}}function JZ(r,l){const{sizes:h,centers:d}=XZ(r),f=De.unstack(De.transpose(l,[1,0])),g=De.div(De.mul(De.exp(De.div(f[2],De.scalar(5))),h[0]),De.scalar(2)),S=De.add(De.mul(De.div(f[0],De.scalar(10)),h[0]),d[0]),L=De.div(De.mul(De.exp(De.div(f[3],De.scalar(5))),h[1]),De.scalar(2)),x=De.add(De.mul(De.div(f[1],De.scalar(10)),h[1]),d[1]);return De.transpose(De.stack([De.sub(S,g),De.sub(x,L),De.add(S,g),De.add(x,L)]),[1,0])}function SD(r,l,h){return De.tidy(()=>{const d=r.shape[0];let f=JZ(De.reshape(De.tile(h.extra_dim,[d,1,1]),[-1,4]),De.reshape(r,[-1,4]));f=De.reshape(f,[d,f.shape[0]/d,4]);const g=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let S=De.slice(g,[0,0,0],[-1,-1,1]);S=De.reshape(S,[d,S.shape[1]]);const L=De.unstack(f),x=De.unstack(S);return{boxes:L,scores:x}})}const Yu=Ye(Je());function wa(r,l){return Yu.tidy(()=>{const h=r.shape[0],d=Yu.reshape(ga(r,l.box_encoding_predictor),[h,-1,1,4]),f=Yu.reshape(ga(r,l.class_predictor),[h,-1,3]);return{boxPredictionEncoding:d,classPrediction:f}})}const qu=Ye(Je());function ID(r,l,h){return qu.tidy(()=>{const d=Xs(r,h.conv_0,[1,1]),f=Xs(d,h.conv_1,[2,2]),g=Xs(f,h.conv_2,[1,1]),S=Xs(g,h.conv_3,[2,2]),L=Xs(S,h.conv_4,[1,1]),x=Xs(L,h.conv_5,[2,2]),A=Xs(x,h.conv_6,[1,1]),O=Xs(A,h.conv_7,[2,2]),C=wa(l,h.box_predictor_0),$=wa(r,h.box_predictor_1),z=wa(f,h.box_predictor_2),ne=wa(S,h.box_predictor_3),te=wa(x,h.box_predictor_4),se=wa(O,h.box_predictor_5),fe=qu.concat([C.boxPredictionEncoding,$.boxPredictionEncoding,z.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,se.boxPredictionEncoding],1),de=qu.concat([C.classPrediction,$.classPrediction,z.classPrediction,ne.classPrediction,te.classPrediction,se.classPrediction],1);return{boxPredictions:fe,classPredictions:de}})}class Ii{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 xi=Ye(Je());class nl extends kn{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return xi.tidy(()=>{const h=xi.cast(r.toBatchTensor(512,!1),"float32"),d=xi.sub(xi.mul(h,xi.scalar(.007843137718737125)),xi.scalar(1)),f=wD(d,l.mobilenetv1),{boxPredictions:g,classPredictions:S}=ID(f.out,f.conv11,l.prediction_layer);return SD(g,S,l.output_layer)})}async forward(r){return this.forwardInput(await Rt(r))}async locateFaces(r,l={}){const{maxResults:h,minConfidence:d}=new Ii(l),f=await Rt(r),{boxes:g,scores:S}=this.forwardInput(f),L=g[0],x=S[0];for(let de=1;de{const[Ae,xe]=[Math.max(0,se[de][0]),Math.min(1,se[de][2])].map(wt=>wt*te),[Me,Ke]=[Math.max(0,se[de][1]),Math.min(1,se[de][3])].map(wt=>wt*ne);return new Yt(A[de],new Su(Me,Ae,Ke-Me,xe-Ae),{height:f.getInputHeight(0),width:f.getInputWidth(0)})});return L.dispose(),x.dispose(),fe}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return bD(r)}extractParams(r){return yD(r)}}function xD(r){const l=new nl;return l.extractWeights(r),l}function ZZ(r){return xD(r)}class QZ extends nl{}const TD=.4,AD=[new Ze(.738768,.874946),new Ze(2.42204,2.65704),new Ze(4.30971,7.04493),new Ze(10.246,4.59428),new Ze(12.6868,11.8741)],vD=[new Ze(1.603231,2.094468),new Ze(6.041143,7.080126),new Ze(2.882459,3.518061),new Ze(4.266906,5.178857),new Ze(9.041765,10.66308)],ND=[117.001,114.697,97.404],CD="tiny_yolov2_model",RD="tiny_yolov2_separable_conv_model";const xg=r=>typeof r=="number";function gx(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(!xg(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=>xg(l.x)&&xg(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(xg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const Js=Ye(Je());function sl(r){return Js.tidy(()=>{const l=Js.mul(r,Js.scalar(.10000000149011612));return Js.add(Js.relu(Js.sub(r,l)),l)})}const Zs=Ye(Je());function vr(r,l){return Zs.tidy(()=>{let h=Zs.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return h=Zs.conv2d(h,l.conv.filters,[1,1],"valid"),h=Zs.sub(h,l.bn.sub),h=Zs.mul(h,l.bn.truediv),h=Zs.add(h,l.conv.bias),sl(h)})}const bo=Ye(Je());function Nr(r,l){return bo.tidy(()=>{let h=bo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return h=bo.separableConv2d(h,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),h=bo.add(h,l.bias),sl(h)})}const yx=Ye(Je());function eQ(r,l){const h=Kc(r,l);function d(S,L){const x=yx.tensor1d(r(S)),A=yx.tensor1d(r(S));return l.push({paramPath:`${L}/sub`},{paramPath:`${L}/truediv`}),{sub:x,truediv:A}}function f(S,L,x){const A=h(S,L,3,`${x}/conv`),O=d(L,`${x}/bn`);return{conv:A,bn:O}}const g=Xc(r,l);return{extractConvParams:h,extractConvWithBatchNormParams:f,extractSeparableConvParams:g}}function OD(r,l,h,d){const{extractWeights:f,getRemainingWeights:g}=Hn(r),S=[],{extractConvParams:L,extractConvWithBatchNormParams:x,extractSeparableConvParams:A}=eQ(f,S);let O;if(l.withSeparableConvs){const[C,$,z,ne,te,se,fe,de,Ae]=d,xe=l.isFirstLayerConv2d?L(C,$,3,"conv0"):A(C,$,"conv0"),Me=A($,z,"conv1"),Ke=A(z,ne,"conv2"),wt=A(ne,te,"conv3"),$t=A(te,se,"conv4"),Kt=A(se,fe,"conv5"),Fn=de?A(fe,de,"conv6"):void 0,vn=Ae?A(de,Ae,"conv7"):void 0,Nn=L(Ae||de||fe,5*h,1,"conv8");O={conv0:xe,conv1:Me,conv2:Ke,conv3:wt,conv4:$t,conv5:Kt,conv6:Fn,conv7:vn,conv8:Nn}}else{const[C,$,z,ne,te,se,fe,de,Ae]=d,xe=x(C,$,"conv0"),Me=x($,z,"conv1"),Ke=x(z,ne,"conv2"),wt=x(ne,te,"conv3"),$t=x(te,se,"conv4"),Kt=x(se,fe,"conv5"),Fn=x(fe,de,"conv6"),vn=x(de,Ae,"conv7"),Nn=L(Ae,5*h,1,"conv8");O={conv0:xe,conv1:Me,conv2:Ke,conv3:wt,conv4:$t,conv5:Kt,conv6:Fn,conv7:vn,conv8:Nn}}if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{params:O,paramMappings:S}}function tQ(r,l){const h=ys(r,l);function d(L){const x=h(`${L}/sub`,1),A=h(`${L}/truediv`,1);return{sub:x,truediv:A}}function f(L){const x=h(`${L}/filters`,4),A=h(`${L}/bias`,1);return{filters:x,bias:A}}function g(L){const x=f(`${L}/conv`),A=d(`${L}/bn`);return{conv:x,bn:A}}const S=Jc(h);return{extractConvParams:f,extractConvWithBatchNormParams:g,extractSeparableConvParams:S}}function ED(r,l){const h=[],{extractConvParams:d,extractConvWithBatchNormParams:f,extractSeparableConvParams:g}=tQ(r,h);let S;if(l.withSeparableConvs){const L=l.filterSizes&&l.filterSizes.length||9;S={conv0:l.isFirstLayerConv2d?d("conv0"):g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:L>7?g("conv6"):void 0,conv7:L>8?g("conv7"):void 0,conv8:d("conv8")}}else S={conv0:f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:f("conv6"),conv7:f("conv7"),conv8:d("conv8")};return Vn(r,h),{params:S,paramMappings:h}}var bx;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(bx||(bx={}));class Cr{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=Ye(Je());class il extends kn{constructor(r){super("TinyYolov2");gx(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 h=vr(r,l.conv0);return h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv1),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv2),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv3),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv4),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv5),h=kt.maxPool(h,[2,2],[1,1],"same"),h=vr(h,l.conv6),h=vr(h,l.conv7),ga(h,l.conv8,"valid",!1)}runMobilenet(r,l){let h=this.config.isFirstLayerConv2d?sl(ga(r,l.conv0,"valid",!1)):Nr(r,l.conv0);return h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv1),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv2),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv3),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv4),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv5),h=kt.maxPool(h,[2,2],[1,1],"same"),h=l.conv6?Nr(h,l.conv6):h,h=l.conv7?Nr(h,l.conv7):h,ga(h,l.conv8,"valid",!1)}forwardInput(r,l){const{params:h}=this;if(!h)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let d=kt.cast(r.toBatchTensor(l,!1),"float32");return d=this.config.meanRgb?yi(d,this.config.meanRgb):d,d=d.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(d,h):this.runTinyYolov2(d,h)})}async forward(r,l){return await this.forwardInput(await Rt(r),l)}async detect(r,l={}){const{inputSize:h,scoreThreshold:d}=new Cr(l),f=await Rt(r),g=await this.forwardInput(f,h),S=kt.tidy(()=>kt.unstack(g)[0].expandDims()),L={width:f.getInputWidth(0),height:f.getInputHeight(0)},x=await this.extractBoxes(S,f.getReshapedInputDimensions(0),d);g.dispose(),S.dispose();const A=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),$=x.map(te=>this.config.classes[te.label]),z=VS(A.map(te=>te.rescale(h)),O,this.config.iouThreshold,!0),ne=z.map(te=>new Oc(O[te],C[te],$[te],A[te],L));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return ED(r,this.config)}extractParams(r){const l=this.config.filterSizes||il.DEFAULT_FILTER_SIZES,h=l?l.length:void 0;if(h!==7&&h!==8&&h!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${h} filterSizes in config`);return OD(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,h){const{width:d,height:f}=l,g=Math.max(d,f),S=g/d,L=g/f,x=r.shape[1],A=this.config.anchors.length,[O,C,$]=kt.tidy(()=>{const se=r.reshape([x,x,A,this.boxEncodingSize]),fe=se.slice([0,0,0,0],[x,x,A,4]),de=se.slice([0,0,0,4],[x,x,A,1]),Ae=this.withClassScores?kt.softmax(se.slice([0,0,0,5],[x,x,A,this.config.classes.length]),3):kt.scalar(0);return[fe,de,Ae]}),z=[],ne=await C.array(),te=await O.array();for(let se=0;seh){const xe=(fe+Lu(te[se][fe][de][0]))/x*S,Me=(se+Lu(te[se][fe][de][1]))/x*L,Ke=Math.exp(te[se][fe][de][2])*this.config.anchors[de].x/x*S,wt=Math.exp(te[se][fe][de][3])*this.config.anchors[de].y/x*L,$t=xe-Ke/2,Kt=Me-wt/2,Fn={row:se,col:fe,anchor:de},{classScore:vn,label:Nn}=this.withClassScores?await this.extractPredictedClass($,Fn):{classScore:1,label:0};z.push({box:new wu($t,Kt,$t+Ke,Kt+wt),score:Ae,classScore:Ae*vn,label:Nn,...Fn})}}return O.dispose(),C.dispose(),$.dispose(),z}async extractPredictedClass(r,l){const{row:h,col:d,anchor:f}=l,g=await r.array();return Array(this.config.classes.length).fill(0).map((S,L)=>g[h][d][f][L]).map((S,L)=>({classScore:S,label:L})).reduce((S,L)=>S.classScore>L.classScore?S:L)}}il.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class ju extends il{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:TD,classes:["face"]},r?{anchors:vD,meanRgb:ND}:{anchors:AD,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const h=await this.detect(r,l);return h.map(d=>new Yt(d.score,d.relativeBox,{width:d.imageWidth,height:d.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?RD:CD}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function nQ(r,l=!0){const h=new ju(l);return h.extractWeights(r),h}class wx extends Cr{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class Ti{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const Lx=Ye(Je());async function La(r,l,h,d,f=({alignedRect:g})=>g){const g=r.map(x=>ba(x)?f(x):x.detection),S=d||(l instanceof Lx.Tensor?await qc(l,g):await Yc(l,g)),L=await h(S);return S.forEach(x=>x instanceof Lx.Tensor&&x.dispose()),L}async function rl(r,l,h,d,f){return La([r],l,async g=>h(g[0]),d,f)}const DD=.4,kD=[new Ze(1.603231,2.094468),new Ze(6.041143,7.080126),new Ze(2.882459,3.518061),new Ze(4.266906,5.178857),new Ze(9.041765,10.66308)],FD=[117.001,114.697,97.404];class Ku extends il{constructor(){const r={withSeparableConvs:!0,iouThreshold:DD,classes:["face"],anchors:kD,meanRgb:FD,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const h=await this.detect(r,l);return h.map(d=>new Yt(d.score,d.relativeBox,{width:d.imageWidth,height:d.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const pt={ssdMobilenetv1:new nl,tinyFaceDetector:new Ku,tinyYolov2:new ju,faceLandmark68Net:new Gu,faceLandmark68TinyNet:new px,faceRecognitionNet:new Hu,faceExpressionNet:new cx,ageGenderNet:new dx},_D=(r,l)=>pt.ssdMobilenetv1.locateFaces(r,l),sQ=(r,l)=>pt.tinyFaceDetector.locateFaces(r,l),iQ=(r,l)=>pt.tinyYolov2.locateFaces(r,l),WD=r=>pt.faceLandmark68Net.detectLandmarks(r),rQ=r=>pt.faceLandmark68TinyNet.detectLandmarks(r),oQ=r=>pt.faceRecognitionNet.computeFaceDescriptor(r),aQ=r=>pt.faceExpressionNet.predictExpressions(r),cQ=r=>pt.ageGenderNet.predictAgeAndGender(r),$D=r=>pt.ssdMobilenetv1.load(r),lQ=r=>pt.tinyFaceDetector.load(r),hQ=r=>pt.tinyYolov2.load(r),uQ=r=>pt.faceLandmark68Net.load(r),dQ=r=>pt.faceLandmark68TinyNet.load(r),pQ=r=>pt.faceRecognitionNet.load(r),mQ=r=>pt.faceExpressionNet.load(r),fQ=r=>pt.ageGenderNet.load(r),gQ=$D,yQ=_D,bQ=WD;class UD extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.extractedFaces=h}}class Zu extends UD{async run(){const r=await this.parentTask,l=await La(r,this.input,async h=>await Promise.all(h.map(d=>pt.faceExpressionNet.predictExpressions(d))),this.extractedFaces);return r.map((h,d)=>gg(h,l[d]))}withAgeAndGender(){return new Xu(this,this.input)}}class Qu extends UD{async run(){const r=await this.parentTask;if(!r)return;const l=await rl(r,this.input,h=>pt.faceExpressionNet.predictExpressions(h),this.extractedFaces);return gg(r,l)}withAgeAndGender(){return new Ju(this,this.input)}}class cl extends Zu{withAgeAndGender(){return new ol(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class ll extends Qu{withAgeAndGender(){return new al(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class BD extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.extractedFaces=h}}class Xu extends BD{async run(){const r=await this.parentTask,l=await La(r,this.input,async h=>await Promise.all(h.map(d=>pt.ageGenderNet.predictAgeAndGender(d))),this.extractedFaces);return r.map((h,d)=>{const{age:f,gender:g,genderProbability:S}=l[d];return Sg(Ig(h,g,S),f)})}withFaceExpressions(){return new Zu(this,this.input)}}class Ju extends BD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:h,genderProbability:d}=await rl(r,this.input,f=>pt.ageGenderNet.predictAgeAndGender(f),this.extractedFaces);return Sg(Ig(r,h,d),l)}withFaceExpressions(){return new Qu(this,this.input)}}class ol extends Xu{withFaceExpressions(){return new cl(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class al extends Ju{withFaceExpressions(){return new ll(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class Sx extends Ti{constructor(r,l){super();this.parentTask=r;this.input=l}}class Sa extends Sx{async run(){const r=await this.parentTask,l=await La(r,this.input,h=>Promise.all(h.map(d=>pt.faceRecognitionNet.computeFaceDescriptor(d))),null,h=>h.landmarks.align(null,{useDlibAlignment:!0}));return l.map((h,d)=>Lg(r[d],h))}withFaceExpressions(){return new cl(this,this.input)}withAgeAndGender(){return new ol(this,this.input)}}class Ia extends Sx{async run(){const r=await this.parentTask;if(!r)return;const l=await rl(r,this.input,h=>pt.faceRecognitionNet.computeFaceDescriptor(h),null,h=>h.landmarks.align(null,{useDlibAlignment:!0}));return Lg(r,l)}withFaceExpressions(){return new ll(this,this.input)}withAgeAndGender(){return new al(this,this.input)}}const ed=Ye(Je());class Ix extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=h}get landmarkNet(){return this.useTinyLandmarkNet?pt.faceLandmark68TinyNet:pt.faceLandmark68Net}}class xx extends Ix{async run(){const r=await this.parentTask,l=r.map(f=>f.detection),h=this.input instanceof ed.Tensor?await qc(this.input,l):await Yc(this.input,l),d=await Promise.all(h.map(f=>this.landmarkNet.detectLandmarks(f)));return h.forEach(f=>f instanceof ed.Tensor&&f.dispose()),r.map((f,g)=>el(f,d[g]))}withFaceExpressions(){return new cl(this,this.input)}withAgeAndGender(){return new ol(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class Tx extends Ix{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,h=this.input instanceof ed.Tensor?await qc(this.input,[l]):await Yc(this.input,[l]),d=await this.landmarkNet.detectLandmarks(h[0]);return h.forEach(f=>f instanceof ed.Tensor&&f.dispose()),el(r,d)}withFaceExpressions(){return new ll(this,this.input)}withAgeAndGender(){return new al(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class Ax extends Ti{constructor(r,l=new Ii){super();this.input=r;this.options=l}}class Tg extends Ax{async run(){const{input:r,options:l}=this,h=l instanceof wx?d=>pt.tinyFaceDetector.locateFaces(d,l):l instanceof Ii?d=>pt.ssdMobilenetv1.locateFaces(d,l):l instanceof Cr?d=>pt.tinyYolov2.locateFaces(d,l):null;if(!h)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return h(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(h=>sa({},h)))})}withFaceLandmarks(r=!1){return new xx(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Zu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Xu(this.runAndExtendWithFaceDetections(),this.input)}}class vx extends Ax{async run(){const r=await new Tg(this.input,this.options);let l=r[0];return r.forEach(h=>{h.score>l.score&&(l=h)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?sa({},l):void 0)})}withFaceLandmarks(r=!1){return new Tx(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new Qu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Ju(this.runAndExtendWithFaceDetection(),this.input)}}function wQ(r,l=new Ii){return new vx(r,l)}function Ag(r,l=new Ii){return new Tg(r,l)}async function MD(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await Ag(r,new Ii(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function LQ(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await Ag(r,new Cr(l)).withFaceLandmarks().withFaceDescriptors()}const SQ=MD;function Nx(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const h=Array.from(r),d=Array.from(l);return Math.sqrt(h.map((f,g)=>f-d[g]).reduce((f,g)=>f+Math.pow(g,2),0))}class PD{constructor(r,l=.6){this._distanceThreshold=l;const h=Array.isArray(r)?r:[r];if(!h.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let d=1;const f=()=>`person ${d++}`;this._labeledDescriptors=h.map(g=>{if(g instanceof na)return g;if(g instanceof Float32Array)return new na(f(),[g]);if(g.descriptor&&g.descriptor instanceof Float32Array)return new na(f(),[g.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(h=>Nx(h,r)).reduce((h,d)=>h+d,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:h})=>new km(h,this.computeMeanDistance(r,l))).reduce((l,h)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(h=>na.fromJSON(h));return new PD(l,r.distanceThreshold)}}function IQ(r){const l=new Ku;return l.extractWeights(r),l}function zD(r,l){const{width:h,height:d}=new ms(l.width,l.height);if(h<=0||d<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:h,height:d})}`);if(Array.isArray(r))return r.map(f=>zD(f,{width:h,height:d}));if(ba(r)){const f=r.detection.forSize(h,d),g=r.unshiftedLandmarks.forSize(f.box.width,f.box.height);return el(sa(r,f),g)}return Vi(r)?sa(r,r.detection.forSize(h,d)):r instanceof qs||r instanceof Yt?r.forSize(h,d):r}var GD="0.8.3";vc(exports,{AgeGenderNet:()=>dx,BoundingBox:()=>wu,Box:()=>Ct,ComposableTask:()=>Ti,ComputeAllFaceDescriptorsTask:()=>Sa,ComputeFaceDescriptorsTaskBase:()=>Sx,ComputeSingleFaceDescriptorTask:()=>Ia,DetectAllFaceLandmarksTask:()=>xx,DetectAllFacesTask:()=>Tg,DetectFaceLandmarksTaskBase:()=>Ix,DetectFacesTaskBase:()=>Ax,DetectSingleFaceLandmarksTask:()=>Tx,DetectSingleFaceTask:()=>vx,Dimensions:()=>ms,FACE_EXPRESSION_LABELS:()=>ax,FaceDetection:()=>Yt,FaceDetectionNet:()=>QZ,FaceExpressionNet:()=>cx,FaceExpressions:()=>ya,FaceLandmark68Net:()=>Gu,FaceLandmark68TinyNet:()=>px,FaceLandmarkNet:()=>UZ,FaceLandmarks:()=>qs,FaceLandmarks5:()=>BX,FaceLandmarks68:()=>Iu,FaceMatch:()=>km,FaceMatcher:()=>PD,FaceRecognitionNet:()=>Hu,Gender:()=>Tr,LabeledBox:()=>Fm,LabeledFaceDescriptors:()=>na,NetInput:()=>po,NeuralNetwork:()=>kn,ObjectDetection:()=>Oc,Point:()=>Ze,PredictedBox:()=>MX,Rect:()=>Su,SsdMobilenetv1:()=>nl,SsdMobilenetv1Options:()=>Ii,TinyFaceDetector:()=>Ku,TinyFaceDetectorOptions:()=>wx,TinyYolov2:()=>ju,TinyYolov2Options:()=>Cr,TinyYolov2SizeType:()=>bx,allFaces:()=>SQ,allFacesSsdMobilenetv1:()=>MD,allFacesTinyYolov2:()=>LQ,awaitMediaLoaded:()=>QS,bufferToImage:()=>eI,computeFaceDescriptor:()=>oQ,createCanvas:()=>Dc,createCanvasFromMedia:()=>Tu,createFaceDetectionNet:()=>ZZ,createFaceRecognitionNet:()=>PZ,createSsdMobilenetv1:()=>xD,createTinyFaceDetector:()=>IQ,createTinyYolov2:()=>nQ,detectAllFaces:()=>Ag,detectFaceLandmarks:()=>WD,detectFaceLandmarksTiny:()=>rQ,detectLandmarks:()=>bQ,detectSingleFace:()=>wQ,draw:()=>hx,env:()=>gt,euclideanDistance:()=>Nx,extendWithAge:()=>Sg,extendWithFaceDescriptor:()=>Lg,extendWithFaceDetection:()=>sa,extendWithFaceExpressions:()=>gg,extendWithFaceLandmarks:()=>el,extendWithGender:()=>Ig,extractFaceTensors:()=>qc,extractFaces:()=>Yc,fetchImage:()=>OZ,fetchJson:()=>ix,fetchNetWeights:()=>EZ,fetchOrThrow:()=>fa,getContext2dOrThrow:()=>es,getMediaDimensions:()=>ra,imageTensorToCanvas:()=>tI,imageToSquare:()=>sx,inverseSigmoid:()=>_X,iou:()=>zS,isMediaElement:()=>Um,isMediaLoaded:()=>xu,isWithAge:()=>zZ,isWithFaceDetection:()=>Vi,isWithFaceExpressions:()=>lx,isWithFaceLandmarks:()=>ba,isWithGender:()=>GZ,loadAgeGenderModel:()=>fQ,loadFaceDetectionModel:()=>gQ,loadFaceExpressionModel:()=>mQ,loadFaceLandmarkModel:()=>uQ,loadFaceLandmarkTinyModel:()=>dQ,loadFaceRecognitionModel:()=>pQ,loadSsdMobilenetv1Model:()=>$D,loadTinyFaceDetectorModel:()=>lQ,loadTinyYolov2Model:()=>hQ,loadWeightMap:()=>rx,locateFaces:()=>yQ,matchDimensions:()=>DZ,minBbox:()=>GS,nets:()=>pt,nonMaxSuppression:()=>VS,normalize:()=>yi,padToSquare:()=>HS,predictAgeAndGender:()=>cQ,recognizeFaceExpressions:()=>aQ,resizeResults:()=>zD,resolveInput:()=>ia,shuffleArray:()=>FX,sigmoid:()=>Lu,ssdMobilenetv1:()=>_D,tf:()=>xQ,tinyFaceDetector:()=>sQ,tinyYolov2:()=>iQ,toNetInput:()=>Rt,utils:()=>US,validateConfig:()=>gx,version:()=>vQ});const xQ=Ye(Je()),TQ=typeof process!="undefined",AQ=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",vQ={faceapi:GD,node:TQ,browser:AQ}; + with dtype ${S.dtype}. `)});const d=(S,L)=>{const x=ht(l,h[0].shape)[0],A=bO(h.map($=>$.shape),x);if(qt(A)===0)return wI([],A);if(h=h.filter($=>$.size>0),h.length===1)return h[0];const O=h.map($=>$.shape);yO(O,x);const C=S.concat(h,x);return L(h),C},f=h,g={axis:l};return H.runKernelFunc(d,f,null,Gm,g)}const bn=G({concat_:EJ});function DJ(r){const l=M(r,"x","sigmoid"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sigmoid(l);return f([g]),g},h,null,xf)}const AI=G({sigmoid_:DJ});function kJ(r,l,h){const d=M(r,"x","slice");if(d.rank===0)throw new Error("Slicing scalar is not possible");const f=(L,x)=>{const[A,O]=Vf(d,l,h);return dO(d,A,O),x([d]),L.slice(d,A,O)},g={x:d},S={begin:l,size:h};return H.runKernelFunc(f,g,null,Lf,S)}const At=G({slice_:kJ});function FJ(r,l,h){const d=M(r,"x","batchToSpaceND"),f=l.reduce((x,A)=>x*A);Z(d.rank>=1+l.length,()=>`input rank is ${d.rank} but should be > than blockShape.length ${l.length}`),Z(h.length===l.length,()=>`crops.length is ${h.length} but should be equal to blockShape.length ${l.length}`),Z(d.shape[0]%f===0,()=>`input tensor batch is ${d.shape[0]} but is not divisible by the product of the elements of blockShape ${l.join(" * ")} === ${f}`);const g=x=>x.batchToSpaceND(d,l,h),S={x:d},L={blockShape:l,crops:h};return H.runKernelFunc(g,S,null,Pm,L)}const vI=G({batchToSpaceND_:FJ});function _J(r,l){let h=M(r,"broadcastTo","x");const d=h.shape;if(l.some(O=>!(O>0)||O%1!==0))throw new Error(`broadcastTo(): Invalid broadcast shape [${l}].`);if(l.lengthh.rank){const O=h.shape.slice();for(;O.length=0;O--)if(f[O]===l[O])g[O]=1;else if(h.shape[O]!==1)throw new Error(`broadcastTo(): [${d}] cannot be broadcast to [${l}].`);const S=g.map((O,C)=>O>1?C:-1).filter(O=>O>=0);if(S.length===0)return bi(h);const L=O=>O.tile(h,g),x={x:h},A={shape:l,inputShape:f};return H.runKernelFunc(L,x,null,zm,A)}const jf=G({broadcastTo_:_J});function WJ(r,l,h,d,f="NHWC",g=[1,1],S){const L=M(r,"x","conv2d"),x=M(l,"filter","conv2d");let A=L,O=!1;L.rank===3&&(O=!0,A=re(L,[1,L.shape[0],L.shape[1],L.shape[2]])),Z(A.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${A.rank}.`),Z(x.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${x.rank}.`),S!=null&&Z(Qt(d),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${S} but got pad ${d}.`);const C=f==="NHWC"?A.shape[3]:A.shape[1];Z(C===x.shape[2],()=>`Error in conv2d: depth of input (${C}) must match input depth for filter ${x.shape[2]}.`),Z(co(h,g),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${h} and dilations '${g}'`);const $=(se,fe)=>{const de=zc(f),Ae=Lr(A.shape,x.shape,h,g,d,S,!1,de),xe=se.conv2d(A,x,Ae);return fe([A,x]),xe},z={x:A,filter:x},ne={strides:h,pad:d,dataFormat:f,dilations:g,dimRoundingMode:S},te=H.runKernelFunc($,z,null,Vm,ne);return O?re(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const NI=G({conv2d_:WJ});function $J(r,l,h,d,f,g="NHWC",S){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let L=r,x=l,A=!1;l.rank===3&&(A=!0,x=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]),L=[1,r[0],r[1],r[2]]),Z(L.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${L.length}.`),Z(x.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${x.rank}`),Z(h.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${h.rank}`);const O=g==="NHWC"?L[3]:L[1],C=g==="NHWC"?x.shape[3]:x.shape[1];Z(O===h.shape[2],()=>`Error in conv2dDerInput: depth of input (${O}) must match input depth for filter ${h.shape[2]}.`),Z(C===h.shape[3],()=>`Error in conv2dDerInput: depth of output (${C}) must match output depth for filter ${h.shape[3]}.`),S!=null&&Z(Qt(f),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${S} but got pad ${f}.`);const $=(se,fe)=>{const de=1,Ae=zc(g),xe=Lr(L,h.shape,d,de,f,S,!1,Ae),Me=se.conv2dDerInput(x,h,xe);return fe([x,h]),Me},z={dy:x,filter:h},ne={strides:d,pad:f,dataFormat:g,dimRoundingMode:S,inputShape:L},te=H.runKernelFunc($,z,null,Hm,ne);return A?re(te,[te.shape[1],te.shape[2],te.shape[3]]):te}const wO=G({conv2DBackpropInput_:$J});function UJ(r,l,h,d,f){Z(r.length===l.rank,()=>`Length of inShape (${r.length}) and rank of dy (${l.rank}) must match`);let g=r,S=l,L=!1;l.rank===4&&(L=!0,S=re(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),g=[1,r[0],r[1],r[2],r[3]]);const x=g[4],A=S.shape[4];Z(g.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${g.length}.`),Z(S.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${S.rank}`),Z(h.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${h.rank}`),Z(x===h.shape[3],()=>`Error in conv3dDerInput: depth of input (${x}) must match input depth for filter ${h.shape[3]}.`),Z(A===h.shape[4],()=>`Error in conv3dDerInput: depth of output (${A}) must match output depth for filter ${h.shape[4]}.`);const O=ne=>{const te=1,se=ku(g,h.shape,d,te,f);return ne.conv3dDerInput(S,h,se)},C={dy:S},$={pad:f},z=H.runKernelFunc(O,C,null,_2,$);return L?re(z,[z.shape[1],z.shape[2],z.shape[3],z.shape[4]]):z}const LO=G({conv3DBackpropInput_:UJ});function BJ(r){const l=M(r,"x","cos"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.cos(l);return f([l]),g},h,null,Ym)}const Fu=G({cos_:BJ});function MJ(r){const l=M(r,"x","cosh"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.cosh(l);return f([l]),g},h,null,qm)}const CI=G({cosh_:MJ});function PJ(r,l=0,h=!1,d=!1){const f=M(r,"x","cumsum"),g=(x,A)=>{const O=fs([l],f.rank);let C=f;O!=null&&(C=Wt(f,O));const $=oo(1,f.rank)[0];let z=x.cumsum(C,$,h,d);if(A([f]),O!=null){const ne=Mc(O);z=Wt(z,ne)}return z},S={x:f},L={axis:l,exclusive:h,reverse:d};return H.runKernelFunc(g,S,null,jm,L)}const RI=G({cumsum_:PJ});function vt(r,l){const h=[];for(let d=0;d1)&&h.unshift(g)}return h}function rt(r,l){const h=[],d=Math.max(r.length,l.length);for(let f=0;fS.equal(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,Y2)}const OI=G({equal_:zJ});function GJ(r,l,h){const d=M(l,"a","where"),f=M(h,"b","where"),g=M(r,"condition","where","bool"),S=rt(d.shape,f.shape),L=jf(d,S),x=jf(f,S);g.rank===1&&Z(g.shape[0]===d.shape[0],()=>"The first dimension of `a` must match the size of `condition`."),g.rank!==1&&Zt(g.shape,x.shape,"Error in where: ");const A=(C,$)=>{const z=C.select(g,L,x);return $([g]),z},O={condition:g,t:L,e:x};return H.runKernelFunc(A,O,null,wf)}const zn=G({where_:GJ});function VJ(r){const l=M(r,"x","zerosLike"),h={x:l};return H.runKernelFunc(d=>d.zerosLike(l),h,null,Ff)}const je=G({zerosLike_:VJ});function HJ(r){const l=M(r,"x","exp"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.exp(l);return f([g]),g},h,null,Xm)}const Gn=G({exp_:HJ});function YJ(r,l=0){const h=null,d=M(r,"x","expandDims",h);Z(l<=d.rank,()=>"Axis must be <= rank of the tensor");const f=d.shape.slice();return l<0&&(Z(-(d.rank+1)<=l,()=>`Axis must be in the interval [${-(d.rank+1)}, ${d.rank}]`),l=d.rank+l+1),f.splice(l,0,1),re(d,f)}const ks=G({expandDims_:YJ});function qJ(r,l){const h=null,d=M(r,"x","tile",h);Z(d.rank===l.length,()=>`Error in transpose: rank of input ${d.rank} must match length of reps ${l}.`);const f=(x,A)=>{const O=x.tile(d,l);return A([d]),O},g=[d],S={x:d},L={reps:l};return H.runKernelFunc(f,S,null,Of,L,g)}const la=G({tile_:qJ});function jJ(r,l,h,d="float32"){l==null&&(l=r);const f=Du([r,l],d),g=r<=l?r:l;for(let L=0;Lf.fill(r,l,h),{},null,K2,d)}function KJ(r){const l=M(r,"x","floor"),h={x:l};return H.runKernelFunc(d=>d.floor(l),h,null,Jm)}const kI=G({floor_:KJ});function SO(r,l,h){const d=r.shape[h],f=[];let g=1,S=1;for(let L=0;L{const O=ht(h,d.shape)[0],C=SO(d,f,O),$=x.gather(d,re(f,[f.size]),O);return A([d,f]),re($,C.outputShape)};return H.runKernelFunc(L,g,null,Qm,S)}const FI=G({gather_:XJ});function JJ(r,l){let h=M(r,"a","greater"),d=M(l,"b","greater");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.greater(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,Z2)}const wi=G({greater_:JJ});function ZJ(r,l){let h=M(r,"a","greaterEqual"),d=M(l,"b","greaterEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.greaterEqual(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,ef)}const Sr=G({greaterEqual_:ZJ});function QJ(r){const l=M(r,"input","imag"),h=f=>f.imag(l),d={input:l};return H.runKernelFunc(h,d,null,eR)}const _u=G({imag_:QJ});function e9(r,l){let h=M(r,"a","maximum"),d=M(l,"b","maximum");[h,d]=mt(h,d),h.dtype==="bool"&&(h=Le(h,"int32"),d=Le(d,"int32")),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.maximum(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,of)}const _I=G({maximum_:e9});function ke(r,l){if((Ds(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"&&Ds(r)&&!(r instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");const h=[],d=[];return ji(r,h,d,l)}function t9(r,l){let h=M(r,"a","less"),d=M(l,"b","less");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.less(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,iR)}const WI=G({less_:t9});function n9(r,l){let h=M(r,"a","lessEqual"),d=M(l,"b","lessEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.lessEqual(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,rR)}const Ir=G({lessEqual_:n9});function s9(r){const l=M(r,"x","log"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.log(l);return f([l]),g},h,null,nf)}const lo=G({log_:s9});function i9(r){const l=M(r,"x","log1p"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.log1p(l);return f([l]),g},h,null,sf)}const $I=G({log1p_:i9});function Kf(r){return H.customGrad(r)}function r9(r){const l=M(r,"x","neg"),h={x:l};return H.runKernelFunc(d=>d.neg(l),h,null,hf)}const yt=G({neg_:r9});function o9(r,l=null,h=!1){const d=M(r,"x","max"),f=(L,x)=>{const A=ht(l,d.shape);let O=A;const C=fs(O,d.rank);let $=d;C!=null&&($=Wt(d,C),O=oo(O.length,$.rank));const z=L.max($,O);C!=null&&$.dispose();let ne=z;if(h){const te=ts(ne.shape,ht(l,d.shape));ne=re(ne,te),z.dispose()}return x([d,ne]),ne},g={x:d},S={reductionIndices:l,keepDims:h};return H.runKernelFunc(f,g,null,rf,S)}const ha=G({max_:o9});function a9(r,l){let h=M(r,"a","sub"),d=M(l,"b","sub");[h,d]=mt(h,d);const f=(S,L)=>{const x=S.subtract(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,Rf)}const Be=G({sub_:a9});function c9(r,l=null,h=!1){let d=M(r,"x","sum");d.dtype==="bool"&&(d=Le(d,"int32"));const f=(L,x)=>{x([d]);const A=ht(l,d.shape),O=fs(A,d.rank);let C=A,$=d;O!=null&&($=Wt(d,O),C=oo(C.length,d.rank));let z=L.sum($,C);if(h){const ne=ts(z.shape,A);z=re(z,ne)}return z},g={x:d},S={axis:l,keepDims:h};return H.runKernelFunc(f,g,null,Af,S)}const Fe=G({sum_:c9});function l9(r,l=null,h=!1){const d=M(r,"x","logSumExp"),f=ht(l,d.shape),g=ha(d,f,!0),S=Be(d,g),L=Gn(S),x=Fe(L,f),A=lo(x),O=St(re(g,A.shape),A);if(h){const C=ts(O.shape,f);return re(O,C)}return O}const UI=G({logSumExp_:l9});function h9(r,l){const h=M(r,"a","logicalAnd","bool"),d=M(l,"b","logicalAnd","bool");rt(h.shape,d.shape);const f={a:h,b:d};return H.runKernelFunc(g=>g.logicalAnd(h,d),f,null,oR)}const ua=G({logicalAnd_:h9});function u9(r){const l=M(r,"x","logicalNot","bool"),h={x:l};return H.runKernelFunc(d=>d.logicalNot(l),h,null,aR)}const BI=G({logicalNot_:u9});function Fs(r,l="float32"){if(l==="complex64"){const d=Fs(r,"float32"),f=Fs(r,"float32");return qi(d,f)}const h=aa(qt(r),l);return H.makeTensor(h,r,l)}function Ki(r,l="float32"){if(l==="complex64"){const d=Ki(r,"float32"),f=Fs(r,"float32");return qi(d,f)}const h=Uf(qt(r),l);return H.makeTensor(h,r,l)}function d9(r,l=null,h=!1){const d=M(r,"x","mean"),f=ht(l,d.shape),g=fO(d.shape,f),S=g[1],L=qt(S),x=Kf(A=>{const O=ke(L),C=O.dtype===A.dtype?A:Le(A,O.dtype),$=ze(C,O),z=Fe($,l,h),ne=te=>{const se=A.shape.slice();f.forEach(Ae=>{se[Ae]=1});const fe=re(te,se),de=ze(ae(fe,Ki(A.shape,"float32")),L);return de};return{value:z,gradFunc:ne}});return x(d)}const MI=G({mean_:d9});function p9(r,l=null,h=!1){const d=M(r,"x","min"),f=(L,x)=>{const A=ht(l,d.shape);let O=A;const C=fs(O,d.rank);let $=d;C!=null&&($=Wt(d,C),O=oo(O.length,d.rank));const z=L.min($,O);C!=null&&$.dispose();let ne=z;if(h){const te=ts(ne.shape,A);ne=re(z,te),z.dispose()}return x([d,ne]),ne},g={x:d},S={axis:l,keepDims:h};return H.runKernelFunc(f,g,null,af,S)}const Xf=G({min_:p9});function m9(r,l){let h=M(r,"a","minimum"),d=M(l,"b","minimum");[h,d]=mt(h,d),h.dtype==="bool"&&(h=Le(h,"int32"),d=Le(d,"int32")),rt(h.shape,d.shape);const f=(S,L)=>{const x=S.minimum(h,d);return L([h,d]),x},g={a:h,b:d};return H.runKernelFunc(f,g,null,cf)}const PI=G({minimum_:m9});function f9(r){const l=M(r,"x","square"),h={},d=[l],f=[];return H.runKernelFunc((g,S)=>(S([l]),g.square(l)),{x:l},null,"Square",h,d,f)}const ut=G({square_:f9});function g9(r,l){let h=M(r,"a","notEqual"),d=M(l,"b","notEqual");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=S=>S.notEqual(h,d),g={a:h,b:d};return H.runKernelFunc(f,g,null,gR)}const zI=G({notEqual_:g9});function y9(r){const l=M(r,"input","real"),h=f=>f.real(l),d={input:l};return H.runKernelFunc(h,d,null,TR)}const Gc=G({real_:y9});function b9(r,l,h=0){const d=M(r,"x","pad");if(d.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const f=(L,x)=>(x([d]),L.pad(d,l,h)),g={paddings:l,constantValue:h},S={x:d};return H.runKernelFunc(f,S,null,uf,g)}const GI=G({pad_:b9});function w9(r,l,h){const d=M(r,"x","spaceToBatchND");Z(d.rank>=1+l.length,()=>`input rank ${d.rank} should be > than [blockShape] ${l.length}`),Z(h.length===l.length,()=>`paddings.shape[0] ${h.length} must be equal to [blockShape] ${l.length}`),Z(d.shape.reduce((L,x,A)=>A>0&&A<=l.length?L&&(x+h[A-1][0]+h[A-1][1])%l[A-1]===0:L,!0),()=>`input spatial dimensions ${d.shape.slice(1)} with paddings ${h.toString()} must be divisible by blockShapes ${l.toString()}`);const f=L=>L.spaceToBatchND(d,l,h),g={x:d},S={blockShape:l,paddings:h};return H.runKernelFunc(f,g,null,vf,S)}const VI=G({spaceToBatchND_:w9});function L9(r,l){let h=M(r,"base","pow"),d=M(l,"exp","pow");[h,d]=mt(h,d);const f={a:h,b:d},g=(S,L)=>{const x=S.pow(h,d);return L([h,d,x]),x};return H.runKernelFunc(g,f,null,df)}const da=G({pow_:L9});function ho(r,l){_c(r);const h=wr(r,l);if(h.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");const d=null;return ji(r,d,h,l)}function Jf(r,l,h=1,d="float32"){if(h===0)throw new Error("Cannot have a step of zero");const f=()=>{const S=r===l,L=r1;if(S||L||x)return Fs([0],d);const A=Math.abs(Math.ceil((l-r)/h)),O=aa(A,d);l(g([l]),l.dtype==="bool"?Le(l,"int32"):f.relu(l)),d={x:l};return H.runKernelFunc(h,d,null,pf)}const Wu=G({relu_:S9});function I9(r,l){const h=M(r,"x","reverse"),d=S=>{const L=ht(l,h.shape);if(h.rank===0)return bi(h);const x=S.reverse(h,L);return re(x,h.shape)},f={x:h},g={dims:l};return H.runKernelFunc(d,f,null,yf,g)}const Vc=G({reverse_:I9});function x9(r){const l=M(r,"x","rsqrt"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.rsqrt(l);return f([l]),g},h,null,bf)}const HI=G({rsqrt_:x9});function T9(r){const l=M(r,"x","sin"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sin(l);return f([l]),g},h,null,Sf)}const YI=G({sin_:T9});function A9(r){const l=M(r,"x","sinh"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sinh(l);return f([l]),g},h,null,If)}const qI=G({sinh_:A9});function v9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${r.dtype}.`);const l={input:r};return H.runKernelFunc(h=>{const d=r.shape[r.shape.length-1],f=r.size/d,g=r.as2D(f,d),S=h.fft(g);return S.reshape(r.shape)},l,null,j2)}const $u=G({fft_:v9});function N9(r){Z(r.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${r.dtype}.`);const l={input:r};return H.runKernelFunc(h=>{const d=r.shape[r.shape.length-1],f=r.size/d,g=re(r,[f,d]),S=h.ifft(g);return re(S,r.shape)},l,null,Q2)}const Hc=G({ifft_:N9});function C9(r){const l=r.shape[r.shape.length-1],h=r.size/l;let d;if(l<=2){const f=re(r,[h,l]);d=Hc(f)}else{const f=[h,2*(l-1)],g=re(Gc(r),[h,l]),S=re(_u(r),[h,l]),L=Vc(At(g,[0,1],[h,l-2]),1),x=ae(Vc(At(S,[0,1],[h,l-2]),1),ke(-1)),A=bn([g,L],1),O=bn([S,x],1),C=re(qi(A,O),[f[0],f[1]]);d=Hc(C)}if(d=Gc(d),r.rank===3&&r.shape[0]!==0){const f=d,g=r.shape[0];d=re(d,[g,d.shape[0]/g,d.shape[1]]),f.dispose()}return d}const jI=G({irfft_:C9});function IO(r,l,h=0){let d=[];if(typeof l=="number")Z(r.shape[h]%l===0,()=>"Number of splits must evenly divide the axis."),d=new Array(l).fill(r.shape[h]/l);else{const f=l.reduce((S,L)=>(L===-1&&(S+=1),S),0);Z(f<=1,()=>"There should be only one negative value in split array.");const g=l.indexOf(-1);if(g!==-1){const S=l.reduce((L,x)=>x>0?L+x:L);l[g]=r.shape[h]-S}Z(r.shape[h]===l.reduce((S,L)=>S+L),()=>"The sum of sizes must match the size of the axis dimension."),d=l}return d}function R9(r,l,h=0){const d=M(r,"x","split"),f=(L,x)=>{const A=ht(h,d.shape)[0],O=IO(d,l,A);return L.split(d,O,A)},g={x:d},S={numOrSizeSplits:l,axis:h};return H.runKernelFunc(f,g,null,Nf,S)}const uo=G({split_:R9});function O9(r,l){Z(r.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${r.dtype}`);let h=r.shape[r.shape.length-1];const d=r.size/h;let f;if(l!=null&&l0),te=r.shape.map(se=>se);te[r.shape.length-1]=l,f=At(r,ne,te),h=l}else if(l!=null&&l>h){const ne=r.shape.map(te=>te);ne[r.shape.length-1]=l-h,f=bn([r,Fs(ne)],r.shape.length-1),h=l}else f=r;const g=je(f),S=re(qi(f,g),[d,h]),L=$u(S),x=Math.floor(h/2)+1,A=Gc(L),O=_u(L),C=uo(A,[x,h-x],A.shape.length-1),$=uo(O,[x,h-x],O.shape.length-1),z=f.shape.slice();return z[f.shape.length-1]=x,re(qi(C[0],$[0]),z)}const Uu=G({rfft_:O9});function E9(r){const l=M(r,"x","sqrt"),h={x:l};return H.runKernelFunc((d,f)=>{const g=d.sqrt(l);return f([l]),g},h,null,Tf)}const gs=G({sqrt_:E9});function D9(r,l){let h=M(r,"a","squaredDifference"),d=M(l,"b","squaredDifference");[h,d]=mt(h,d),rt(h.shape,d.shape);const f=(L,x)=>{const A=L.squaredDifference(h,d);return x([h,d]),A},g={a:h,b:d},S={};return H.runKernelFunc(f,g,null,Cf,S)}const KI=G({squaredDifference_:D9});function k9(r,l){const h=M(r,"x","squeeze");return re(h,PR(h.shape,l).newShape)}const XI=G({squeeze_:k9});function F9(r,l=0){const h=Gf(r,"tensors","stack");if(Z(h.length>=1,()=>"Pass at least one tensor to tf.stack"),h.length===1)return ks(h[0],l);const d=h[0].rank,f=h[0].shape,g=h[0].dtype;Z(l<=d,()=>"Axis must be <= rank of the tensor"),h.forEach(L=>{Zt(f,L.shape,"All tensors passed to stack must have matching shapes"),Z(g===L.dtype,()=>"All tensors passed to stack must have matching dtypes")});const S=h.map(L=>ks(L,l));return bn(S,l)}const js=G({stack_:F9});function _9(r,l=0){const h=M(r,"x","step"),d={x:h},f={alpha:l};return H.runKernelFunc(g=>g.step(h,l),d,null,_f,f)}const pa=G({step_:_9});function ma(r,l,h){if(_c(r),l!=null&&l.length!==2)throw new Error("tensor2d() requires shape to have two numbers");const d=wr(r,h);if(d.length!==2&&d.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(d.length===1&&l==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return ji(r,l,d,h)}function W9(r,l,h){const d=M(r,"x","unsortedSegmentSum"),f=M(l,"segmentIds","unsortedSegmentSum","int32");Z(Qt(h),()=>"numSegments must be of dtype int");const g={x:d,segmentIds:f},S={numSegments:h},L=(x,A)=>{const O=x.unsortedSegmentSum(d,f,h);return A([f]),O};return H.runKernelFunc(L,g,null,kf,S)}const JI=G({unsortedSegmentSum_:W9});function $9(r,l=0){const h=M(r,"x","unstack");Z(l>=-h.shape.length&&l`Axis = ${l} is not in [-${h.shape.length}, ${h.shape.length})`),l<0&&(l+=h.shape.length);const d={value:h},f={axis:l},g=S=>S.unstack(h,l);return H.runKernelFunc(g,d,null,Df,f)}const Bu=G({unstack_:$9});function U9(r,l="euclidean",h=null,d=!1){r=M(r,"x","norm");const f=xO(r,l,h);let g=f.shape;if(d){const S=ht(h,r.shape);g=ts(f.shape,S)}return re(f,g)}function xO(r,l,h=null){if(r.rank===0)return Pn(r);if(r.rank!==1&&h===null)return xO(re(r,[-1]),l,h);if(r.rank===1||typeof h=="number"||Array.isArray(h)&&h.length===1){if(l===1)return Fe(Pn(r),h);if(l===Infinity)return ha(Pn(r),h);if(l===-Infinity)return Xf(Pn(r),h);if(l==="euclidean"||l===2)return gs(Fe(da(Pn(r),ke(2,"int32")),h));throw new Error(`Error in norm: invalid ord value: ${l}`)}if(Array.isArray(h)&&h.length===2){if(l===1)return ha(Fe(Pn(r),h[0]),h[1]-1);if(l===Infinity)return ha(Fe(Pn(r),h[1]),h[0]);if(l===-Infinity)return Xf(Fe(Pn(r),h[1]),h[0]);if(l==="fro"||l==="euclidean")return gs(Fe(ut(r),h));throw new Error(`Error in norm: invalid ord value: ${l}`)}throw new Error(`Error in norm: invalid axis: ${h}`)}const Zf=G({norm_:U9});function TO(r){return Math.floor(Math.pow(2,Math.ceil(Math.log(r)/Math.log(2))))}function Qf(r,l,h){const d=1-r%2,f=new Float32Array(r);for(let g=0;g`Error in conv2dDerFilter: input must be rank 4, but got shape ${L.shape}.`),Z(x.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${x.shape}.`),Z(h.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${h}.`);const A=g==="NHWC"?L.shape[3]:L.shape[1],O=g==="NHWC"?x.shape[3]:x.shape[1];Z(A===h[2],()=>`Error in conv2dDerFilter: depth of input ${A}) must match input depth in filter (${h[2]}.`),Z(O===h[3],()=>`Error in conv2dDerFilter: depth of dy (${O}) must match output depth for filter (${h[3]}).`),S!=null&&Z(Qt(f),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${S} but got pad ${f}.`);const C=ne=>{const te=1,se=zc(g),fe=Lr(L.shape,h,d,te,f,S,!1,se);return ne.conv2dDerFilter(L,x,fe)},$={x:L,dy:x},z={strides:d,pad:f,dataFormat:g,dimRoundingMode:S};return H.runKernelFunc(C,$,null,D2,z)}const eg=G({conv2DBackpropFilter_:B9});function M9(r,l,h,d){let f=r;r.rank===3&&(f=re(r,[1,r.shape[0],r.shape[1],r.shape[2]]));let g=l;g.rank===3&&(g=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const S=x=>x.depthwiseConv2DDerFilter(f,g,d),L={x:f,dy:g};return H.runKernelFunc(S,L,null,U2)}const AO=G({depthwiseConv2dNativeBackpropFilter_:M9});function P9(r,l,h,d){let f=l,g=!1;l.rank===3&&(g=!0,f=re(l,[1,l.shape[0],l.shape[1],l.shape[2]]));const S=A=>A.depthwiseConv2DDerInput(f,h,d),L={dy:f},x=H.runKernelFunc(S,L,null,B2);return g?re(x,[x.shape[1],x.shape[2],x.shape[3]]):x}const vO=G({depthwiseConv2dNativeBackpropInput_:P9});function z9(r){return Qf(r,.54,.46)}const NO=G({hammingWindow_:z9});function G9(r){return Qf(r,.5,.5)}const tg=G({hannWindow_:G9});function V9(r,l,h,d=!1,f=0){let g=0;const S=[];for(;g+l<=r.size;)S.push(At(r,g,l)),g+=h;if(d)for(;g`Error in cropAndResize: image must be rank 4,but got rank ${S.rank}.`),Z(L.rank===2&&L.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${A},4] but had shape ${L.shape}.`),Z(x.rank===1&&x.shape[0]===A,()=>`Error in cropAndResize: boxInd must be have size [${A}] but had shape ${L.shape}.`),Z(d.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${d.length}.`),Z(d[0]>=1&&d[1]>=1,()=>`cropSize must be atleast [1,1], but was ${d}`),Z(f==="bilinear"||f==="nearest",()=>`method must be bilinear or nearest, but was ${f}`);const O=ne=>ne.cropAndResize(S,L,x,d,f,g),C={image:S,boxes:L,boxInd:x},$={method:f,extrapolationValue:g,cropSize:d},z=H.runKernelFunc(O,C,null,W2,$);return z}const RO=G({cropAndResize_:Y9});function q9(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 h={image:l},d=H.runKernel(X2,h,{});return d}const OO=G({flipLeftRight_:q9});function j9(r,l,h=0,d=.5){const f=M(r,"image","rotateWithOffset","float32");Z(f.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${f.rank}.`);const g={image:f},S={radians:l,fillValue:h,center:d},L=H.runKernel($R,g,S);return L}const EO=G({rotateWithOffset_:j9});function Ks(r,l,h,d,f,g){d==null&&(d=.5),f==null&&(f=Number.NEGATIVE_INFINITY),g==null&&(g=0);const S=r.shape[0];return h=Math.min(h,S),Z(0<=d&&d<=1,()=>`iouThreshold must be in [0, 1], but was '${d}'`),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]===S,()=>`scores has incompatible shape with boxes. Expected ${S}, but was ${l.shape[0]}`),Z(0<=g&&g<=1,()=>`softNmsSigma must be in [0, 1], but was '${g}'`),{maxOutputSize:h,iouThreshold:d,scoreThreshold:f,softNmsSigma:g}}function K9(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY){const g=M(r,"boxes","nonMaxSuppression"),S=M(l,"scores","nonMaxSuppression"),L=Ks(g,S,h,d,f);h=L.maxOutputSize,d=L.iouThreshold,f=L.scoreThreshold;const x={maxOutputSize:h,iouThreshold:d,scoreThreshold:f};return H.runKernelFunc(A=>A.nonMaxSuppression(g,S,h,d,f),{boxes:g,scores:S},null,yR,x)}const DO=G({nonMaxSuppression_:K9});function kO(r,l,h){const d=X9(r,l,h),f=d<0?-(d+1):d;r.splice(f,0,l)}function X9(r,l,h){return Z9(r,l,h||J9)}function J9(r,l){return r>l?1:r>>1);const L=h(l,r[g]);L>0?d=g+1:(f=g,S=!L)}return S?d:-d-1}function FO(r,l,h,d,f){return ZI(r,l,h,d,f,0).selectedIndices}function _O(r,l,h,d,f,g){return ZI(r,l,h,d,f,0,!1,g,!0)}function WO(r,l,h,d,f,g){return ZI(r,l,h,d,f,g,!0)}function ZI(r,l,h,d,f,g,S=!1,L=!1,x=!1){const A=[];for(let se=0;sef&&A.push({score:l[se],boxIndex:se,suppressBeginIndex:0});A.sort($O);const O=g>0?-.5/g:0,C=[],$=[];for(;C.length0;){const se=A.pop(),{score:fe,boxIndex:de,suppressBeginIndex:Ae}=se;if(fe=Ae;--Me){const Ke=Q9(r,de,C[Me]);if(Ke>=d){xe=!0;break}if(se.score=se.score*eZ(d,O,Ke),se.score<=f)break}se.suppressBeginIndex=C.length,xe||(se.score===fe?(C.push(de),$.push(se.score)):se.score>f&&kO(A,se,$O))}const z=C.length,ne=h-z;L&&ne>0&&(C.push(...new Array(ne).fill(0)),$.push(...new Array(ne).fill(0)));const te={selectedIndices:ho(C,"int32")};return S&&(te.selectedScores=ho($,"float32")),x&&(te.validOutputs=ke(z,"int32")),te}function Q9(r,l,h){const d=r.subarray(l*4,l*4+4),f=r.subarray(h*4,h*4+4),g=Math.min(d[0],d[2]),S=Math.min(d[1],d[3]),L=Math.max(d[0],d[2]),x=Math.max(d[1],d[3]),A=Math.min(f[0],f[2]),O=Math.min(f[1],f[3]),C=Math.max(f[0],f[2]),$=Math.max(f[1],f[3]),z=(L-g)*(x-S),ne=(C-A)*($-O);if(z<=0||ne<=0)return 0;const te=Math.max(g,A),se=Math.max(S,O),fe=Math.min(L,C),de=Math.min(x,$),Ae=Math.max(fe-te,0)*Math.max(de-se,0);return Ae/(z+ne-Ae)}function eZ(r,l,h){const d=Math.exp(l*h*h);return h<=r?d:0}function $O(r,l){return r.score-l.score||r.score===l.score&&l.boxIndex-r.boxIndex}async function tZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY){const g=M(r,"boxes","nonMaxSuppressionAsync"),S=M(l,"scores","nonMaxSuppressionAsync"),L=Ks(g,S,h,d,f);h=L.maxOutputSize,d=L.iouThreshold,f=L.scoreThreshold;const x=await Promise.all([g.data(),S.data()]),A=x[0],O=x[1],C=FO(A,O,h,d,f);return g!==r&&g.dispose(),S!==l&&S.dispose(),C}const UO=tZ;function nZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=0){const S=M(r,"boxes","nonMaxSuppression"),L=M(l,"scores","nonMaxSuppression"),x=Ks(S,L,h,d,f,g);h=x.maxOutputSize,d=x.iouThreshold,f=x.scoreThreshold,g=x.softNmsSigma;const A={boxes:S,scores:L},O={maxOutputSize:h,iouThreshold:d,scoreThreshold:f,softNmsSigma:g},C=H.runKernel(wR,A,O);return{selectedIndices:C[0],selectedScores:C[1]}}const BO=G({nonMaxSuppressionWithScore_:nZ});async function sZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=0){const S=M(r,"boxes","nonMaxSuppressionAsync"),L=M(l,"scores","nonMaxSuppressionAsync"),x=Ks(S,L,h,d,f,g);h=x.maxOutputSize,d=x.iouThreshold,f=x.scoreThreshold,g=x.softNmsSigma;const A=await Promise.all([S.data(),L.data()]),O=A[0],C=A[1],$=WO(O,C,h,d,f,g);return S!==r&&S.dispose(),L!==l&&L.dispose(),$}const MO=sZ;function iZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=!1){const S=M(r,"boxes","nonMaxSuppression"),L=M(l,"scores","nonMaxSuppression"),x=Ks(S,L,h,d,f,null),A=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,$={boxes:S,scores:L},z={maxOutputSize:A,iouThreshold:O,scoreThreshold:C,padToMaxOutputSize:g},ne=H.runKernel(bR,$,z);return{selectedIndices:ne[0],validOutputs:ne[1]}}const PO=G({nonMaxSuppressionPadded_:iZ});async function rZ(r,l,h,d=.5,f=Number.NEGATIVE_INFINITY,g=!1){const S=M(r,"boxes","nonMaxSuppressionAsync"),L=M(l,"scores","nonMaxSuppressionAsync"),x=Ks(S,L,h,d,f,null),A=x.maxOutputSize,O=x.iouThreshold,C=x.scoreThreshold,[$,z]=await Promise.all([S.data(),L.data()]),ne=_O($,z,A,O,C,g);return S!==r&&S.dispose(),L!==l&&L.dispose(),ne}const zO=rZ;function oZ(r,l,h=!1){const d=M(r,"images","resizeBilinear");Z(d.rank===3||d.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${d.rank}.`),Z(l.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${l}.`);let f=d,g=!1;d.rank===3&&(g=!0,f=re(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[S,L]=l,x=($,z)=>(z([f]),$.resizeBilinear(f,S,L,h)),A={images:f},O={alignCorners:h,size:l},C=H.runKernelFunc(x,A,null,gf,O);return g?re(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const GO=G({resizeBilinear_:oZ});function aZ(r,l,h=!1){const d=M(r,"images","resizeNearestNeighbor");Z(d.rank===3||d.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${d.rank}.`),Z(l.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${l}.`),Z(d.dtype==="float32"||d.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype");let f=d,g=!1;d.rank===3&&(g=!0,f=re(d,[1,d.shape[0],d.shape[1],d.shape[2]]));const[S,L]=l,x={images:f},A={alignCorners:h,size:l},O=($,z)=>(z([f]),$.resizeNearestNeighbor(f,S,L,h)),C=H.runKernelFunc(O,x,null,ff,A);return g?re(C,[C.shape[1],C.shape[2],C.shape[3]]):C}const VO=G({resizeNearestNeighbor_:aZ});function cZ(r,l,h){Z(l%1===0,()=>`bandPart(): numLower must be an integer, got ${l}.`),Z(h%1===0,()=>`bandPart(): numUpper must be an integer, got ${h}.`);const d=M(r,"a","bandPart");Z(d.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${d.rank}.`);const f=d.shape,[g,S]=d.shape.slice(-2);if(!(l<=g))throw new Error(`bandPart(): numLower (${l}) must not be greater than the number of rows (${g}).`);if(!(h<=S))throw new Error(`bandPart(): numUpper (${h}) must not be greater than the number of columns (${S}).`);l<0&&(l=g),h<0&&(h=S);const L=re(Jf(0,g,1,"int32"),[-1,1]),x=Jf(0,S,1,"int32"),A=Be(L,x),O=ua(Ir(A,ke(+l,"int32")),Sr(A,ke(-h,"int32"))),C=Fs([g,S],d.dtype);return re(js(Bu(re(d,[-1,g,S])).map($=>zn(O,$,C))),f)}const HO=G({bandPart_:cZ});function lZ(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 f=r[0].shape[0];for(let g=1;g`Gram-Schmidt: Non-unique lengths found in the input vectors: (${r[g].shape[0]} vs. ${f})`)}else l=!0,r=uo(r,r.shape[0],0).map(f=>XI(f,[0]));Z(r.length<=r[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${r.length}) exceeds number of dimensions (${r[0].shape[0]}).`);const h=[],d=r;for(let f=0;f{let g=d[f];if(f>0)for(let S=0;S=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${r.rank}`),r.rank===2)return qO(r,l);{const h=r.shape.slice(0,r.shape.length-2).reduce((x,A)=>x*A),d=Bu(re(r,[h,r.shape[r.shape.length-2],r.shape[r.shape.length-1]]),0),f=[],g=[];d.forEach(x=>{const[A,O]=qO(x,l);f.push(A),g.push(O)});const S=re(js(f,0),r.shape),L=re(js(g,0),r.shape);return[S,L]}}function qO(r,l=!1){return H.tidy(()=>{Z(r.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${r.shape.length}D Tensor.`);const h=r.shape[0],d=r.shape[1];let f=EI(h),g=bi(r);const S=ma([[1]],[1,1]);let L=bi(S);const x=h>=d?d:h;for(let A=0;A{const z=At(g,[A,A],[h-A,1]),ne=Zf(z),te=At(g,[A,A],[1,1]),se=zn(wi(te,0),ma([[-1]]),ma([[1]])),fe=Be(te,ae(se,ne)),de=ze(z,fe);de.shape[0]===1?L=bi(S):L=bn([S,At(de,[1,0],[de.shape[0]-1,de.shape[1]])],0);const Ae=yt(ze(pn(se,fe),ne)),xe=At(g,[A,0],[h-A,d]),Me=ae(Ae,L),Ke=Wt(L);if(A===0)g=Be(xe,pn(Me,pn(Ke,xe)));else{const Kt=Be(xe,pn(Me,pn(Ke,xe)));g=bn([At(g,[0,0],[A,d]),Kt],0)}const wt=Wt(Me),$t=At(f,[0,A],[h,f.shape[1]-A]);if(A===0)f=Be($t,pn(pn($t,L),wt));else{const Kt=Be($t,pn(pn($t,L),wt));f=bn([At(f,[0,0],[h,A]),Kt],1)}return[L,g,f]}),mO([O,C,$])}return!l&&h>d&&(f=At(f,[0,0],[h,d]),g=At(g,[0,0],[d,d])),[f,g]})}const jO=G({qr_:hZ});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 uZ(r,l,h=jt.SUM_BY_NONZERO_WEIGHTS){const d=M(r,"losses","computeWeightedLoss");let f=null;l!=null&&(f=M(l,"weights","computeWeightedLoss"));const g=f==null?d:ae(d,f);if(h===jt.NONE)return g;if(h===jt.SUM)return Fe(g);if(h===jt.MEAN){if(f==null)return MI(g);{const S=d.size/f.size,L=ze(Fe(g),Fe(f));return S>1?ze(L,ke(S)):L}}if(h===jt.SUM_BY_NONZERO_WEIGHTS){if(f==null)return ze(Fe(g),ke(d.size));{const S=ae(f,Ki(d.shape)),L=Le(Fe(zI(S,ke(0))),"float32");return ze(Fe(g),L)}}throw Error(`Unknown reduction: ${h}`)}const An=G({computeWeightedLoss_:uZ});function dZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","absoluteDifference"),g=M(l,"predictions","absoluteDifference");let S=null;h!=null&&(S=M(h,"weights","absoluteDifference")),Zt(f.shape,g.shape,"Error in absoluteDifference: ");const L=Pn(Be(f,g));return An(L,S,d)}const KO=G({absoluteDifference_:dZ});function pZ(r,l,h,d,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","cosineDistance"),S=M(l,"predictions","cosineDistance");let L=null;d!=null&&(L=M(d,"weights","cosineDistance")),Zt(g.shape,S.shape,"Error in cosineDistance: ");const x=ke(1),A=Be(x,Fe(ae(g,S),h,!0));return An(A,L,f)}const XO=G({cosineDistance_:pZ});function mZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){let f=M(r,"labels","hingeLoss");const g=M(l,"predictions","hingeLoss");let S=null;h!=null&&(S=M(h,"weights","hingeLoss")),Zt(f.shape,g.shape,"Error in hingeLoss: ");const L=ke(1);f=Be(ae(ke(2),f),L);const x=Wu(Be(L,ae(f,g)));return An(x,S,d)}const JO=G({hingeLoss_:mZ});function fZ(r,l,h,d=1,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","huberLoss"),S=M(l,"predictions","huberLoss");let L=null;h!=null&&(L=M(h,"weights","huberLoss")),Zt(g.shape,S.shape,"Error in huberLoss: ");const x=ke(d),A=Pn(Be(S,g)),O=PI(A,x),C=Be(A,O),$=St(ae(ke(.5),ut(O)),ae(x,C));return An($,L,f)}const ZO=G({huberLoss_:fZ});function gZ(r,l,h,d=1e-7,f=jt.SUM_BY_NONZERO_WEIGHTS){const g=M(r,"labels","logLoss"),S=M(l,"predictions","logLoss");let L=null;h!=null&&(L=M(h,"weights","logLoss")),Zt(g.shape,S.shape,"Error in logLoss: ");const x=ke(1),A=ke(d),O=yt(ae(g,lo(St(S,A)))),C=ae(Be(x,g),lo(St(Be(x,S),A))),$=Be(O,C);return An($,L,f)}const QO=G({logLoss_:gZ});function yZ(r,l,h,d=jt.SUM_BY_NONZERO_WEIGHTS){const f=M(r,"labels","meanSquaredError"),g=M(l,"predictions","meanSquaredError");let S=null;h!=null&&(S=M(h,"weights","meanSquaredError")),Zt(f.shape,g.shape,"Error in meanSquaredError: ");const L=KI(f,g);return An(L,S,d)}const e1=G({meanSquaredError_:yZ});function bZ(r,l){const h=M(r,"labels","sigmoidCrossEntropyWithLogits"),d=M(l,"logits","sigmoidCrossEntropyWithLogits");Zt(h.shape,d.shape,"Error in sigmoidCrossEntropyWithLogits: ");const f=Wu(d),g=ae(d,h),S=$I(Gn(yt(Pn(d))));return St(Be(f,g),S)}function wZ(r,l,h,d=0,f=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"multiClassLabels","sigmoidCrossEntropy");const S=M(l,"logits","sigmoidCrossEntropy");let L=null;if(h!=null&&(L=M(h,"weights","sigmoidCrossEntropy")),Zt(g.shape,S.shape,"Error in sigmoidCrossEntropy: "),d>0){const A=ke(d),O=ke(1),C=ke(.5);g=St(ae(g,Be(O,A)),ae(C,A))}const x=bZ(g,S);return An(x,L,f)}const t1=G({sigmoidCrossEntropy_:wZ});function LZ(r,l,h=-1){if(h===-1&&(h=l.rank-1),h!==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 ${h}`);const d=Kf((f,g,S)=>{const L=!0,x=UI(g,[h],L),A=Be(Le(g,"float32"),x);S([f,A]);const O=yt(ae(A,f)),C=Fe(O,[h]),$=(z,ne)=>{const[te,se]=ne,fe=ts(z.shape,[h]);return[ae(re(z,fe),Be(Le(te,"float32"),Gn(se))),ae(re(z,fe),Be(Gn(se),Le(te,"float32")))]};return{value:C,gradFunc:$}});return d(r,l)}function SZ(r,l,h,d=0,f=jt.SUM_BY_NONZERO_WEIGHTS){let g=M(r,"onehotLabels","softmaxCrossEntropy");const S=M(l,"logits","softmaxCrossEntropy");let L=null;if(h!=null&&(L=M(h,"weights","softmaxCrossEntropy")),Zt(g.shape,S.shape,"Error in softmaxCrossEntropy: "),d>0){const A=ke(d),O=ke(1),C=ke(g.shape[1]);g=St(ae(g,Be(O,A)),ze(A,C))}const x=LZ(g,S);return An(x,L,f)}const n1=G({softmaxCrossEntropy_:SZ});const yAe={fft:$u,ifft:Hc,rfft:Uu,irfft:jI},IAe={hammingWindow:NO,hannWindow:tg,frame:ng,stft:CO},s1={flipLeftRight:OO,resizeNearestNeighbor:VO,resizeBilinear:GO,rotateWithOffset:EO,cropAndResize:RO,nonMaxSuppression:DO,nonMaxSuppressionAsync:UO,nonMaxSuppressionWithScore:BO,nonMaxSuppressionWithScoreAsync:MO,nonMaxSuppressionPadded:PO,nonMaxSuppressionPaddedAsync:zO},$Ae={bandPart:HO,gramSchmidt:YO,qr:jO},qAe={absoluteDifference:KO,computeWeightedLoss:An,cosineDistance:XO,hingeLoss:JO,huberLoss:ZO,logLoss:QO,meanSquaredError:e1,sigmoidCrossEntropy:t1,softmaxCrossEntropy:n1};const i1=1.7580993408473768,r1=1.0507009873554805;const o1={kernelName:Bm,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,pa(Le(h,"float32"),-1))}}};const a1={kernelName:f2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=ut(Le(h,"float32")),f=gs(Be(ke(1),d));return yt(ze(r,f))}}}};const c1={kernelName:g2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=gs(Be(ut(Le(h,"float32")),1));return ze(r,d)}}}};const l1={kernelName:kc,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{let L=r;const x=vt(h.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,h.shape)},S=()=>{let L=r;const x=vt(d.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,d.shape)};return{a:g,b:S}}};const h1={kernelName:y2,saveAllInputs:!0,gradFunc:(r,l)=>{const h={};return l.forEach((d,f)=>{h[f]=()=>r.clone()}),h}};const u1={kernelName:b2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>je(h)}}};const d1={kernelName:w2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>je(h)}}};const p1={kernelName:L2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,gs(Be(ke(1),ut(Le(h,"float32")))))}}};const m1={kernelName:S2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=gs(St(ke(1),ut(Le(h,"float32"))));return ze(r,d)}}}};const f1={kernelName:T2,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=St(ut(h),ut(d));let x=ae(r,ze(d,L));const A=vt(h.shape,f);return A.length>0&&(x=Fe(x,A)),re(x,h.shape)},S=()=>{const L=St(ut(h),ut(d));let x=yt(ae(r,ze(h,L)));const A=vt(d.shape,f);return A.length>0&&(x=Fe(x,A)),re(x,d.shape)};return{a:g,b:S}}};const g1={kernelName:I2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,St(ut(Le(h,"float32")),1))}}};const y1={kernelName:x2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,Be(ke(1),ut(Le(h,"float32"))))}}};function IZ(r,l,h,d,f=[1,1,1],g,S){const L=M(r,"dy","avgPool3dBackprop"),x=M(l,"input","avgPool3dBackprop");let A=L,O=x,C=!1;x.rank===4&&(C=!0,A=re(L,[1,L.shape[0],L.shape[1],L.shape[2],L.shape[3]]),O=re(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]])),Z(A.rank===5,()=>`Error in avgPool3dBackprop: dy must be rank 5 but got rank ${A.rank}.`),Z(O.rank===5,()=>`Error in avgPool3dBackprop: input must be rank 5 but got rank ${O.rank}.`),Z(co(d,f),()=>`Error in avgPool3dBackprop: Either strides or dilations must be 1. Got strides ${d} and dilations '${f}'`),S!=null&&Z(Qt(g),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const $=se=>{const fe=qf(O.shape,h,d,f,g,S);return se.avgPool3dBackprop(A,O,fe)},z={dy:A,input:O},ne={filterSize:h,strides:d,dilations:f,pad:g,dimRoundingMode:S},te=H.runKernelFunc($,z,null,C2,ne);return C?re(te,[te.shape[1],te.shape[2],te.shape[3],te.shape[4]]):te}const b1=G({avgPool3dBackprop_:IZ});const w1={kernelName:N2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{filterSize:f,strides:g,dilations:S,pad:L,dimRoundingMode:x}=h,A=S==null?[1,1,1]:S;return{x:()=>b1(r,d,f,g,A,L,x)}}};function xZ(r,l,h,d,f){const g=M(r,"dy","avgPoolBackprop"),S=M(l,"input","avgPoolBackprop");Z(S.rank===g.rank,()=>`Rank of input (${S.rank}) does not match rank of dy (${g.rank})`);let L=S,x=g,A=!1;S.rank===3&&(A=!0,L=re(S,[1,S.shape[0],S.shape[1],S.shape[2]]),x=re(g,[1,g.shape[0],g.shape[1],g.shape[2]])),Z(x.rank===4,()=>`Error in avgPoolBackprop: dy must be rank 4 but got rank ${x.rank}.`),Z(L.rank===4,()=>`Error in avgPoolBackprop: input must be rank 4 but got rank ${L.rank}.`);const O=ne=>{const te=Yf(L.shape,h,d,1,f);return ne.avgPoolBackprop(x,L,te)},C={dy:x,input:L},$={filterSize:h,strides:d,pad:f},z=H.runKernelFunc(O,C,null,v2,$);return A?re(z,[z.shape[1],z.shape[2],z.shape[3]]):z}const L1=G({avgPoolBackprop_:xZ});const S1={kernelName:A2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{filterSize:f,strides:g,pad:S}=h;return{x:()=>L1(r,d,f,g,S)}}};const I1={kernelName:Mm,inputsToSave:["a","b"],gradFunc:(r,l,h)=>{const[d,f]=l,{transposeA:g,transposeB:S}=h;return!g&&!S?{a:()=>pn(r,f,!1,!0),b:()=>pn(d,r,!0,!1)}:!g&&S?{a:()=>pn(r,f,!1,!1),b:()=>pn(r,d,!0,!1)}:g&&!S?{a:()=>pn(f,r,!1,!0),b:()=>pn(d,r,!1,!1)}:{a:()=>pn(f,r,!0,!0),b:()=>pn(r,d,!0,!0)}}};const x1={kernelName:Pm,gradFunc:(r,l,h)=>{const{blockShape:d,crops:f}=h;return{x:()=>VI(r,d,f)}}};const T1={kernelName:zm,gradFunc:(r,l,h)=>{const d=h,f=d.inputShape,g=d.shape,S=Array.from(g);for(let x=f.length-1;x>=0;x--)if(f[x]===g[x])S[x]=1;else if(f[x]!==1)throw new Error(`broadcastTo(): [${f}] cannot be broadcast to [${g}].`);const L=[];for(let x=0;x1&&L.push(x);return{x:()=>Fe(r,L,!0)}}};const A1={kernelName:Fc,gradFunc:r=>({x:()=>r.clone()})};const v1={kernelName:R2,gradFunc:r=>({x:()=>je(r)})};const N1={kernelName:O2,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{clipValueMin:f,clipValueMax:g}=h;return{x:()=>zn(ua(Sr(d,f),Ir(d,g)),r,je(r))}}};const C1={kernelName:Gm,saveAllInputs:!0,gradFunc:(r,l,h)=>{const d=l.map(x=>x.shape),{axis:f}=h,g=ht(f,l[0].shape)[0],S=d.map(x=>x[g]),L=uo(r,S,g);return L.map(x=>()=>x)}};const R1={kernelName:Vm,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,{dilations:g,strides:S,pad:L,dataFormat:x}=h;return Z(ao(g),()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${g}'`),{x:()=>wO(d.shape,r,f,S,L,x),filter:()=>eg(d,r,f.shape,S,L,x)}}};const O1={kernelName:Hm,inputsToSave:["dy","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,{strides:g,pad:S,dataFormat:L,dimRoundingMode:x}=h;return{dy:()=>NI(r,f,g,S,L,1,x),filter:()=>eg(r,d,f.shape,g,S,L,x)}}};function TZ(r,l,h,d,f){let g=r;r.rank===4&&(g=re(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]));let S=l;S.rank===4&&(S=re(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]])),Z(g.rank===5,()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${g.shape}.`),Z(S.rank===5,()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${S.shape}.`),Z(h.length===5,()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${h}.`),Z(g.shape[4]===h[3],()=>`Error in conv3dDerFilter: depth of input ${g.shape[4]}) must match input depth in filter (${h[3]}.`),Z(S.shape[4]===h[4],()=>`Error in conv3dDerFilter: depth of dy (${S.shape[4]}) must match output depth for filter (${h[4]}).`);const L=O=>{const C=1,$=ku(g.shape,h,d,C,f);return O.conv3dDerFilter(g,S,$)},x={x:g,y:S},A={strides:d,pad:f};return H.runKernelFunc(L,x,null,F2,A)}const E1=G({conv3DBackpropFilter_:TZ});const D1={kernelName:k2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const{dilations:d,strides:f,pad:g}=h;Z(ao(d),()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${d}'`);const[S,L]=l;return{x:()=>LO(S.shape,r,L,f,g),filter:()=>E1(S,r,L.shape,f,g)}}};const k1={kernelName:Ym,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(yt(YI(Le(h,"float32"))),r)}}};const F1={kernelName:qm,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(qI(Le(h,"float32")),r)}}};const _1={kernelName:jm,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{axis:f,exclusive:g,reverse:S}=h;return{x:()=>{const L=fs([f],d.rank);let x=RI(r,f,g,!S);return L!=null&&(x=Wt(x,L)),x}}}};const W1={kernelName:$2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const{dilations:d,strides:f,pad:g,dimRoundingMode:S}=h,L=d==null?[1,1]:d;Z(ao(L),()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${L}'`);const[x,A]=l;Z(x.rank===4,()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${x.rank}.`),Z(A.rank===4,()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${A.rank}.`),Z(x.shape[3]===A.shape[2],()=>`Error in gradient of depthwiseConv2d: number of input channels (${x.shape[3]}) must match the inChannels dimension in filter ${A.shape[2]}.`),Z(co(f,L),()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${f} and dilations '${L}'.`),S!=null&&Z(Qt(g),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const O=Lr(x.shape,A.shape,f,L,g,S,!0);return{x:()=>vO(x.shape,r,A,O),filter:()=>AO(x,r,A.shape,O)}}};const $1={kernelName:M2,inputsToSave:["x","filter"],gradFunc:(r,l,h)=>{const[d,f]=l,g={x:d,filter:f,dy:r},S={x:d,filter:f,dy:r};return{x:()=>H.runKernel(P2,g,h),filter:()=>H.runKernel(z2,S,h)}}};const U1={kernelName:Km,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ze(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{let L=ae(r,Le(h,"float32"));const x=vt(d.shape,f);x.length>0&&(L=re(Fe(L,x),d.shape));const A=ut(d);return yt(ze(L,Le(A,"float32")))};return{a:g,b:S}}};const B1={kernelName:G2,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l,d=g=>g.eluDer(r,h),f={dy:r,y:h};return{x:()=>H.runKernelFunc(d,f,null,V2)}}};const M1={kernelName:H2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l,d=ae(Gn(yt(ut(h))),2/Math.sqrt(Math.PI));return{x:()=>ae(r,d)}}};const P1={kernelName:Xm,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,h)}}};const z1={kernelName:q2,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,Gn(h))}}};const G1={kernelName:Jm,gradFunc:r=>({x:()=>je(r)})};const V1={kernelName:Zm,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ze(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{let L=ae(r,Le(h,"float32"));const x=vt(d.shape,f);x.length>0&&(L=re(Fe(L,x),d.shape));const A=ut(d);return yt(ze(L,Le(A,"float32")))};return{a:g,b:S}}};const H1={kernelName:J2,inputsToSave:["x","mean","variance","scale"],gradFunc:(r,l,h)=>{const{varianceEpsilon:d}=h,[f,g,S,L]=l,x=L==null?ke(1):L,A=vt(g.shape,f.shape),O=[];if(g.rank===1){for(let xe=0;xeg.rank===1?re(ae(ae(r,la(re(z,[1,1,1,g.shape[0]]),O)),x),f.shape):re(ae(ae(r,z),x),f.shape),se=()=>{let xe=ae(ae(z,ke(-1)),$);return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)},fe=()=>{let xe=ae(ae(ne,C),$);return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)},de=()=>{const xe=ae(C,z);let Me=ae(r,xe);return g.rank===1&&(Me=Fe(Me,A)),re(Me,g.shape)},Ae=()=>{let xe=r;return g.rank===1&&(xe=Fe(xe,A)),re(xe,g.shape)};return{x:te,mean:se,variance:fe,scale:de,offset:Ae}}};const j1={kernelName:Qm,inputsToSave:["x","indices"],gradFunc:(r,l,h)=>{const[d,f]=l,{axis:g}=h,S=ht(g,d.shape)[0],L=()=>{const x=d.shape,A=f.size,O=x.slice(0,S),C=O.length,$=x.slice(g,x.length).slice(1),z=$.length,ne=Y1(0,C),te=Y1(C+1,C+1+z),se=q1([O,[A],$]),fe=re(r,se),de=re(f,[A]),Ae=q1([[C],ne,te]),xe=Wt(fe,Ae);let Me=JI(xe,de,d.shape[S]);const Ke=Mc(Ae);return Me=Wt(Me,Ke),Me};return{x:L,indices:()=>f}}};function Y1(r,l){const h=[];for(let d=r;d{const[h,d]=l;return{a:()=>je(h),b:()=>je(d)}}};const X1={kernelName:tf,gradFunc:r=>({x:()=>Le(r,"float32")})};const J1={kernelName:tR,gradFunc:r=>({x:()=>je(r)})};const Z1={kernelName:nR,gradFunc:r=>({x:()=>je(r)})};const Q1={kernelName:sR,gradFunc:r=>({x:()=>je(r)})};const eE={kernelName:sf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,St(h,1))}}};const tE={kernelName:nf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,Le(h,"float32"))}}};const nE={kernelName:cR,inputsToSave:[],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d]=l,{axis:f}=h;return{logits:()=>{const g=!0,S=Gn(d);return Be(r,ae(Fe(r,f,g),S))}}}};function AZ(r,l,h,d=5,f=1,g=1,S=.5){const L=O=>O.LRNGrad(h,r,l,d,f,g,S),x={x:r,y:l,dy:h},A={depthRadius:d,bias:f,alpha:g,beta:S};return H.runKernelFunc(L,x,null,hR,A)}const sE=G({localResponseNormalizationBackprop_:AZ});const iE={kernelName:lR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{depthRadius:g,bias:S,alpha:L,beta:x}=h;return{x:()=>sE(d,f,r,g,S,L,x)}}};function sg(r,l,h,d,f){return l.rank{const g=ae(r,Le(OI(h,l),r.dtype));return f==null?g:Wt(g,f)}}}const QI={kernelName:rf,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const d=h,{reductionIndices:f}=d,[g,S]=l,L=ht(f,g.shape),x=fs(L,g.rank),A=sg(r,S,g,L,x);return{x:()=>{let O=A.x();return x!=null&&(O=Wt(O)),O}}}};const rE={kernelName:of,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=()=>ae(r,Le(Sr(h,d),"float32")),g=()=>ae(r,Le(WI(h,d),"float32"));return{a:f,b:g}}};function vZ(r,l,h,d,f,g=[1,1,1],S,L){const x=M(r,"dy","maxPool3dBackprop"),A=M(l,"input","maxPool3dBackprop"),O=M(h,"output","maxPool3dBackprop");let C=x,$=A,z=O,ne=!1;A.rank===4&&(ne=!0,C=re(x,[1,x.shape[0],x.shape[1],x.shape[2],x.shape[3]]),$=re(A,[1,A.shape[0],A.shape[1],A.shape[2],A.shape[3]]),z=re(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($.rank===5,()=>`Error in maxPool3dBackprop: input must be rank 5 but got rank ${$.rank}.`),Z(z.rank===5,()=>`Error in maxPool3dBackprop: output must be rank 5 but got rank ${z.rank}.`),Z(co(f,g),()=>`Error in maxPool3dBackprop: Either strides or dilations must be 1. Got strides ${f} and dilations '${g}'`),L!=null&&Z(Qt(S),()=>`Error in maxPool3dBackprop: pad must be an integer when using, dimRoundingMode ${L} but got pad ${S}.`);const te=Ae=>{const xe=qf($.shape,d,f,g,S,L);return Ae.maxPool3dBackprop(C,$,z,xe)},se={dy:C,input:$,output:z},fe={filterSize:d,strides:f,dilations:g,pad:S,dimRoundingMode:L},de=H.runKernelFunc(te,se,null,mR,fe);return ne?re(de,[de.shape[1],de.shape[2],de.shape[3],de.shape[4]]):de}const oE=G({maxPool3dBackprop_:vZ});const aE={kernelName:pR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{filterSize:g,strides:S,dilations:L,pad:x,dimRoundingMode:A}=h,O=L==null?[1,1,1]:L;return{x:()=>oE(r,d,f,g,S,O,x,A)}}};function NZ(r,l,h,d,f,g,S){const L=M(r,"dy","maxPoolBackprop"),x=M(l,"input","maxPoolBackprop"),A=M(h,"output","maxPoolBackprop");Z(x.rank===L.rank,()=>`Rank of input (${x.rank}) does not match rank of dy (${L.rank})`),Z(L.rank===4,()=>`Error in maxPoolBackprop: dy must be rank 4 but got rank ${L.rank}.`),Z(x.rank===4,()=>`Error in maxPoolBackprop: input must be rank 4 but got rank ${x.rank}.`),S!=null&&Z(Qt(g),()=>`Error in maxPoolBackprop: pad must be an integer when using, dimRoundingMode ${S} but got pad ${g}.`);const O=z=>{const ne=Yf(x.shape,d,f,1,g,S);return z.maxPoolBackprop(L,x,A,ne)},C={dy:L,input:x,output:A},$={filterSize:d,strides:f,pad:g,dimRoundingMode:S};return H.runKernelFunc(O,C,null,dR,$)}const cE=G({maxPoolBackprop_:NZ});const lE={kernelName:uR,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d,f]=l,{filterSize:g,strides:S,pad:L}=h;return{x:()=>cE(r,d,f,g,S,L)}}};const hE={kernelName:af,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(r,l,h)=>{const d=h,{axis:f}=d,[g,S]=l,L=ht(f,g.shape),x=fs(L,g.rank),A=sg(r,S,g,L,x);return{x:()=>{let O=A.x();return x!=null&&(O=Wt(O)),O}}}};const uE={kernelName:cf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=()=>ae(r,Le(Ir(h,d),"float32")),g=()=>ae(r,Le(wi(h,d),"float32"));return{a:f,b:g}}};const dE={kernelName:fR,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=vt(h.shape,f);return L.length>0?re(Fe(r,L),h.shape):r},S=()=>{const L=ae(r,yt(kI(ze(h,d)))),x=vt(d.shape,f);return x.length>0?re(Fe(L,x),d.shape):L};return{a:g,b:S}}};const pE={kernelName:lf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{const L=ae(r,Le(d,"float32")),x=vt(h.shape,f);return x.length>0?re(Fe(L,x),h.shape):L},S=()=>{const L=ae(r,Le(h,"float32")),x=vt(d.shape,f);return x.length>0?re(Fe(L,x),d.shape):L};return{a:g,b:S}}};const mE={kernelName:hf,gradFunc:r=>({x:()=>yt(r)})};const fE={kernelName:SR,inputsToSave:["indices"],gradFunc:(r,l)=>{const h=l[0];return{indices:()=>Fs(h.shape,"float32")}}};const gE={kernelName:LR,gradFunc:r=>({x:()=>je(r)})};const ex={kernelName:uf,inputsToSave:["x"],gradFunc:(r,l,h)=>{const d=l[0],{paddings:f}=h,g=f.map(S=>S[0]);return{x:()=>At(r,g,d.shape)}}};const yE={kernelName:df,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(r,l)=>{const[h,d,f]=l,g=h,S=d,L=rt(g.shape,S.shape),x=()=>{const O=Le(S,"float32");let C=ae(r,ae(O,da(g,Be(O,ke(1)))));const $=vt(g.shape,L);return $.length>0&&(C=Fe(C,$)),re(C,g.shape)},A=()=>{const O=wi(g,0),C=zn(O,lo(g),je(g));let $=ae(r,ae(f,C));const z=vt(S.shape,L);return z.length>0&&($=Fe($,z)),re($,S.shape)};return{a:x,b:A}}};const bE={kernelName:IR,inputsToSave:["x","alpha"],gradFunc:(r,l)=>{const[h,d]=l,f=wi(h,0);return{x:()=>zn(f,r,ae(r,d)),alpha:()=>{let g=zn(f,je(r),ae(r,h));const S=vt(d.shape,r.shape);return S.length>0&&(g=Fe(g,S)),re(g,d.shape)}}}};const wE={kernelName:AR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,yt(ut(h)))}}};const LE={kernelName:CR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l,d=ae(Ir(h,6),pa(h));return{x:()=>ae(r,Le(d,"float32"))}}};const SE={kernelName:pf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,Le(pa(h),"float32"))}}};const IE={kernelName:mf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>re(r,h.shape)}}};const xE={kernelName:gf,inputsToSave:["images"],gradFunc:(r,l,h)=>{const[d]=l,f=L=>{const{alignCorners:x}=h;return L.resizeBilinearBackprop(r,d,x)},g={images:d},S=()=>H.runKernelFunc(f,g,null,NR,h);return{images:S}}};const TE={kernelName:ff,inputsToSave:["images"],gradFunc:(r,l,h)=>{const[d]=l,f=L=>{const{alignCorners:x}=h;return L.resizeNearestNeighborBackprop(r,d,x)},g={images:d},S=()=>H.runKernelFunc(f,g,null,vR,h);return{images:S}}};const AE={kernelName:yf,gradFunc:(r,l,h)=>{const{dims:d}=h,f=ht(d,r.shape);return{x:()=>Vc(r,f)}}};const vE={kernelName:RR,gradFunc:r=>({x:()=>je(r)})};const NE={kernelName:bf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>yt(ze(r,ae(da(h,1.5),2)))}}};const CE={kernelName:wf,inputsToSave:["condition"],gradFunc:(r,l)=>{const[h]=l;return{condition:()=>Le(je(h),"float32"),t:()=>ae(r,Le(h,r.dtype)),e:()=>ae(r,Le(BI(h),r.dtype))}}};const RE={kernelName:OR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>{const d=wi(h,ke(0)),f=ke(i1),g=ke(r1),S=ae(r,g),L=ae(ae(r,f),Gn(Le(h,"float32")));return zn(d,S,L)}}}};const OE={kernelName:xf,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,ae(h,Be(ke(1),h)))}}};const EE={kernelName:ER,gradFunc:r=>({x:()=>je(r)})};const DE={kernelName:Sf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(Fu(Le(h,"float32")),r)}}};const kE={kernelName:If,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(CI(Le(h,"float32")),r)}}};const FE={kernelName:Lf,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{begin:f,size:g}=h,S=d.shape,[L,x]=Vf(d,f,g),A=[];for(let O=0;OGI(r,A)}}};const _E={kernelName:kR,outputsToSave:[!0],gradFunc:(r,l,h)=>{const[d]=l,{dim:f}=h,g=!0,S=ae(r,d);return{logits:()=>Be(S,ae(Fe(S,[f],g),d))}}};const WE={kernelName:DR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,AI(h))}}};const tx={kernelName:vf,gradFunc:(r,l,h)=>{const{blockShape:d,paddings:f}=h;return{x:()=>vI(r,d,f)}}};const nx={kernelName:Nf,gradFunc:(r,l,h)=>{const{axis:d}=h;return{x:()=>bn(r,d)}}};const $E={kernelName:Tf,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,ae(gs(Le(h,"float32")),2))}}};const UE={kernelName:FR,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(r,ae(Le(h,"float32"),2))}}};const BE={kernelName:Cf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=ke(2),g=()=>ae(r,ae(f,Be(h,d))),S=()=>ae(r,ae(f,Be(d,h)));return{a:g,b:S}}};const ME={kernelName:_f,gradFunc:r=>({x:()=>je(r)})};const PE={kernelName:Rf,inputsToSave:["a","b"],gradFunc:(r,l)=>{const[h,d]=l,f=rt(h.shape,d.shape),g=()=>{let L=r;const x=vt(h.shape,f);return x.length>0&&(L=Fe(L,x)),re(L,h.shape)},S=()=>{let L=r;const x=vt(d.shape,f);return x.length>0&&(L=Fe(L,x)),re(yt(L),d.shape)};return{a:g,b:S}}};const zE={kernelName:Af,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,f=d.shape.slice(),{axis:g}=h,S=ht(g,d.shape);S.forEach(A=>{f[A]=1});const L=re(r,f),x=ae(L,Ki(d.shape,"float32"));return{x:()=>x}}};const GE={kernelName:_R,inputsToSave:["x"],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ze(r,ut(Fu(h)))}}};const VE={kernelName:WR,outputsToSave:[!0],gradFunc:(r,l)=>{const[h]=l;return{x:()=>ae(Be(ke(1),ut(h)),r)}}};const HE={kernelName:Of,inputsToSave:["x"],gradFunc:(r,l,h)=>{const[d]=l,{reps:f}=h,g=()=>{let S=je(d);if(d.rank===1)for(let L=0;L{const d=h,{perm:f}=d,g=Mc(f);return{x:()=>Wt(r,g)}}};const qE={kernelName:Df,gradFunc:(r,l,h)=>{const d=h,{axis:f}=d;return{value:()=>js(r,f)}}};const jE={kernelName:kf,inputsToSave:["segmentIds"],gradFunc:(r,l)=>{const[h]=l,d=()=>CZ(r,h);return{x:d}}};function CZ(r,l){const h=_I(l,je(l)),d=FI(r,h);let f=Sr(l,ke(0,"int32"));const g=d.rank-f.rank;for(let L=0;L({x:()=>je(r)})};const RZ=[o1,a1,c1,l1,h1,u1,d1,p1,m1,f1,g1,y1,w1,S1,I1,x1,T1,A1,v1,N1,C1,O1,R1,D1,k1,F1,_1,W1,$1,U1,B1,M1,P1,z1,V1,G1,H1,j1,K1,X1,J1,Z1,Q1,eE,tE,nE,iE,QI,QI,rE,aE,lE,hE,uE,dE,pE,mE,fE,gE,ex,ex,yE,bE,wE,LE,SE,IE,xE,TE,AE,vE,NE,CE,RE,OE,EE,DE,kE,FE,_E,WE,tx,tx,nx,nx,$E,BE,UE,ME,PE,zE,GE,VE,HE,YE,qE,jE,KE];for(const r of RZ)BR(r);function sx(r,l,h=!1){const{Image:d,Canvas:f}=gt.getEnv();if(!(r instanceof d||r instanceof f))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");const g=ra(r),S=l/Math.max(g.height,g.width),L=S*g.width,x=S*g.height,A=Dc({width:l,height:l}),O=r instanceof f?r:Tu(r),C=Math.abs(L-x)/2,$=h&&L{if(yr(h)){this._imageTensors[d]=h,this._inputDimensions[d]=h.shape;return}if(Os(h)){const g=h.shape[0];if(g!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${g} passed, but not supported in input array`);this._imageTensors[d]=h,this._inputDimensions[d]=h.shape.slice(1);return}const f=h instanceof gt.getEnv().Canvas?h:Tu(h);this._canvases[d]=f,this._inputDimensions[d]=[f.height,f.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 zi(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),h=this.getInputHeight(r);return PS({width:l,height:h},this.inputSize)}toBatchTensor(r,l=!0){return this._inputSize=r,pO(()=>{const h=zi(this.batchSize,0,1).map(f=>{const g=this.getInput(f);if(g instanceof Tn){let S=Os(g)?g:g.expandDims();return S=HS(S,l),(S.shape[1]!==r||S.shape[2]!==r)&&(S=s1.resizeBilinear(S,[r,r])),S.as3D(r,r,3)}if(g instanceof gt.getEnv().Canvas)return II.fromPixels(sx(g,r,l));throw new Error(`toBatchTensor - at batchIdx ${f}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${g}`)}),d=js(h.map(f=>Le(f,"float32"))).as4D(this.batchSize,r,r,3);return d})}}async function Rt(r){if(r instanceof po)return r;let l=Array.isArray(r)?r:[r];if(!l.length)throw new Error("toNetInput - empty array passed as input");const h=f=>Array.isArray(r)?` at input index ${f}:`:"",d=l.map(ia);return d.forEach((f,g)=>{if(!Um(f)&&!yr(f)&&!Os(f))throw typeof l[g]=="string"?new Error(`toNetInput -${h(g)} string passed, but could not resolve HTMLElement for element id ${l[g]}`):new Error(`toNetInput -${h(g)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(Os(f)){const S=f.shape[0];if(S!==1)throw new Error(`toNetInput -${h(g)} tf.Tensor4D with batchSize ${S} passed, but not supported in input array`)}}),await Promise.all(d.map(f=>Um(f)&&QS(f))),new po(d,Array.isArray(r))}async function Yc(r,l){const{Canvas:h}=gt.getEnv();let d=r;if(!(r instanceof h)){const S=await Rt(r);if(S.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");const L=S.getInput(0);d=L instanceof h?L:await tI(L)}const f=es(d),g=l.map(S=>S instanceof Yt?S.forSize(d.width,d.height).box.floor():S).map(S=>S.clipAtImageBorders(d.width,d.height));return g.map(({x:S,y:L,width:x,height:A})=>{const O=Dc({width:x,height:A});return es(O).putImageData(f.getImageData(S,L,x,A),0,0),O})}const ig=Ye(Je());async function qc(r,l){if(!yr(r)&&!Os(r))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(Os(r)&&r.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return ig.tidy(()=>{const[h,d,f]=r.shape.slice(Os(r)?1:0),g=l.map(L=>L instanceof Yt?L.forSize(d,h).box:L).map(L=>L.clipAtImageBorders(d,h)),S=g.map(({x:L,y:x,width:A,height:O})=>ig.slice3d(r.as3D(h,d,f),[x,L,0],[O,A,f]));return S})}async function fa(r,l){const h=gt.getEnv().fetch,d=await h(r,l);if(!(d.status<400))throw new Error(`failed to fetch: (${d.status}) ${d.statusText}, from url: ${d.url}`);return d}async function OZ(r){const l=await fa(r),h=await l.blob();if(!h.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${h.type}, for url: ${l.url}`);return eI(h)}async function ix(r){return(await fa(r)).json()}async function EZ(r){return new Float32Array(await(await fa(r)).arrayBuffer())}function rg(r,l){const h=`${l}-weights_manifest.json`;if(!r)return{modelBaseUri:"",manifestUri:h};if(r==="/")return{modelBaseUri:"/",manifestUri:`/${h}`};const d=r.startsWith("http://")?"http://":r.startsWith("https://")?"https://":"";r=r.replace(d,"");const f=r.split("/").filter(L=>L),g=r.endsWith(".json")?f[f.length-1]:h;let S=d+(r.endsWith(".json")?f.slice(0,f.length-1):f).join("/");return S=r.startsWith("/")?`/${S}`:S,{modelBaseUri:S,manifestUri:S==="/"?`/${g}`:`${S}/${g}`}}const XE=Ye(Je());async function rx(r,l){const{manifestUri:h,modelBaseUri:d}=rg(r,l);let f=await ix(h);return XE.io.loadWeights(f,d)}function DZ(r,l,h=!1){const{width:d,height:f}=h?ra(l):l;return r.width=d,r.height=f,{width:d,height:f}}const xr=Ye(Je());class kn{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:h}=this.traversePropertyPath(r);return l[h]}reassignParamFromPath(r,l){const{obj:h,objProp:d}=this.traversePropertyPath(r);h[d].dispose(),h[d]=l}getParamList(){return this._paramMappings.map(({paramPath:r})=>({path:r,tensor:this.getParamFromPath(r)}))}getTrainableParams(){return this.getParamList().filter(r=>r.tensor instanceof xr.Variable)}getFrozenParams(){return this.getParamList().filter(r=>!(r.tensor instanceof xr.Variable))}variable(){this.getFrozenParams().forEach(({path:r,tensor:l})=>{this.reassignParamFromPath(r,l.variable())})}freeze(){this.getTrainableParams().forEach(({path:r,tensor:l})=>{const h=xr.tensor(l.dataSync());l.dispose(),this.reassignParamFromPath(r,h)})}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 rx(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:h,modelBaseUri:d}=rg(r,this.getDefaultModelName()),f=x=>Promise.all(x.map(A=>l(A).then(O=>O.buffer))),g=xr.io.weightsLoaderFactory(f),S=JSON.parse((await l(h)).toString()),L=await g(S,d);this.loadFromWeightMap(L)}loadFromWeightMap(r){const{paramMappings:l,params:h}=this.extractParamsFromWeigthMap(r);this._paramMappings=l,this._params=h}extractWeights(r){const{paramMappings:l,params:h}=this.extractParams(r);this._paramMappings=l,this._params=h}traversePropertyPath(r){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");const l=r.split("/").reduce((f,g)=>{if(!f.nextObj.hasOwnProperty(g))throw new Error(`traversePropertyPath - object does not have property ${g}, for path ${r}`);return{obj:f.nextObj,objProp:g,nextObj:f.nextObj[g]}},{nextObj:this.params}),{obj:h,objProp:d}=l;if(!h||!d||!(h[d]instanceof xr.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${r}`);return{obj:h,objProp:d}}}const jc=Ye(Je());function ns(r,l,h){return jc.tidy(()=>{let d=jc.separableConv2d(r,l.depthwise_filter,l.pointwise_filter,h,"same");return d=jc.add(d,l.bias),d})}const Dt=Ye(Je());function og(r,l,h=!1){return Dt.tidy(()=>{const d=Dt.relu(h?Dt.add(Dt.conv2d(r,l.conv0.filters,[2,2],"same"),l.conv0.bias):ns(r,l.conv0,[2,2])),f=ns(d,l.conv1,[1,1]),g=Dt.relu(Dt.add(d,f)),S=ns(g,l.conv2,[1,1]);return Dt.relu(Dt.add(d,Dt.add(f,S)))})}function Mu(r,l,h=!1,d=!0){return Dt.tidy(()=>{const f=Dt.relu(h?Dt.add(Dt.conv2d(r,l.conv0.filters,d?[2,2]:[1,1],"same"),l.conv0.bias):ns(r,l.conv0,d?[2,2]:[1,1])),g=ns(f,l.conv1,[1,1]),S=Dt.relu(Dt.add(f,g)),L=ns(S,l.conv2,[1,1]),x=Dt.relu(Dt.add(f,Dt.add(g,L))),A=ns(x,l.conv3,[1,1]);return Dt.relu(Dt.add(f,Dt.add(g,Dt.add(L,A))))})}const mo=Ye(Je());function ga(r,l,h="same",d=!1){return mo.tidy(()=>{const f=mo.add(mo.conv2d(r,l.filters,[1,1],h),l.bias);return d?mo.relu(f):f})}function Vn(r,l){Object.keys(r).forEach(h=>{l.some(d=>d.originalPath===h)||r[h].dispose()})}const ag=Ye(Je());function Kc(r,l){return function(h,d,f,g){const S=ag.tensor4d(r(h*d*f*f),[f,f,h,d]),L=ag.tensor1d(r(d));return l.push({paramPath:`${g}/filters`},{paramPath:`${g}/bias`}),{filters:S,bias:L}}}const cg=Ye(Je());function lg(r,l){return function(h,d,f){const g=cg.tensor2d(r(h*d),[h,d]),S=cg.tensor1d(r(d));return l.push({paramPath:`${f}/weights`},{paramPath:`${f}/bias`}),{weights:g,bias:S}}}class ox{constructor(r,l,h){this.depthwise_filter=r;this.pointwise_filter=l;this.bias=h}}const Pu=Ye(Je());function Xc(r,l){return function(h,d,f){const g=Pu.tensor4d(r(3*3*h),[3,3,h,1]),S=Pu.tensor4d(r(h*d),[1,1,h,d]),L=Pu.tensor1d(r(d));return l.push({paramPath:`${f}/depthwise_filter`},{paramPath:`${f}/pointwise_filter`},{paramPath:`${f}/bias`}),new ox(g,S,L)}}function Jc(r){return function(l){const h=r(`${l}/depthwise_filter`,4),d=r(`${l}/pointwise_filter`,4),f=r(`${l}/bias`,1);return new ox(h,d,f)}}function ys(r,l){return function(h,d,f){const g=r[h];if(!Qo(g,d))throw new Error(`expected weightMap[${h}] to be a Tensor${d}D, instead have ${g}`);return l.push({originalPath:h,paramPath:f||h}),g}}function Hn(r){let l=r;function h(f){const g=l.slice(0,f);return l=l.slice(f),g}function d(){return l}return{extractWeights:h,getRemainingWeights:d}}function hg(r,l){const h=Kc(r,l),d=Xc(r,l);function f(S,L,x,A=!1){const O=A?h(S,L,3,`${x}/conv0`):d(S,L,`${x}/conv0`),C=d(L,L,`${x}/conv1`),$=d(L,L,`${x}/conv2`);return{conv0:O,conv1:C,conv2:$}}function g(S,L,x,A=!1){const{conv0:O,conv1:C,conv2:$}=f(S,L,x,A),z=d(L,L,`${x}/conv3`);return{conv0:O,conv1:C,conv2:$,conv3:z}}return{extractDenseBlock3Params:f,extractDenseBlock4Params:g}}function JE(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractDenseBlock4Params:f}=hg(h,l),g=f(3,32,"dense0",!0),S=f(32,64,"dense1"),L=f(64,128,"dense2"),x=f(128,256,"dense3");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{dense0:g,dense1:S,dense2:L,dense3:x}}}function ug(r){return function(l){const h=r(`${l}/filters`,4),d=r(`${l}/bias`,1);return{filters:h,bias:d}}}function dg(r,l){const h=ys(r,l),d=ug(h),f=Jc(h);function g(L,x=!1){const A=x?d(`${L}/conv0`):f(`${L}/conv0`),O=f(`${L}/conv1`),C=f(`${L}/conv2`);return{conv0:A,conv1:O,conv2:C}}function S(L,x=!1){const A=x?d(`${L}/conv0`):f(`${L}/conv0`),O=f(`${L}/conv1`),C=f(`${L}/conv2`),$=f(`${L}/conv3`);return{conv0:A,conv1:O,conv2:C,conv3:$}}return{extractDenseBlock3Params:g,extractDenseBlock4Params:S}}function ZE(r){const l=[],{extractDenseBlock4Params:h}=dg(r,l),d={dense0:h("dense0",!0),dense1:h("dense1"),dense2:h("dense2"),dense3:h("dense3")};return Vn(r,l),{params:d,paramMappings:l}}const fo=Ye(Je());class pg extends kn{constructor(){super("FaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceFeatureExtractor - load model before inference");return fo.tidy(()=>{const h=fo.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(fo.scalar(255));let g=Mu(f,l.dense0,!0);return g=Mu(g,l.dense1),g=Mu(g,l.dense2),g=Mu(g,l.dense3),g=fo.avgPool(g,[7,7],[2,2],"valid"),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeigthMap(r){return ZE(r)}extractParams(r){return JE(r)}}const Zc=Ye(Je());function zu(r,l){return Zc.tidy(()=>Zc.add(Zc.matMul(r,l.weights),l.bias))}function QE(r,l,h){const d=[],{extractWeights:f,getRemainingWeights:g}=Hn(r),S=lg(f,d),L=S(l,h,"fc");if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{paramMappings:d,params:{fc:L}}}function eD(r){const l=[],h=ys(r,l);function d(g){const S=h(`${g}/weights`,2),L=h(`${g}/bias`,1);return{weights:S,bias:L}}const f={fc:d("fc")};return Vn(r,l),{params:f,paramMappings:l}}function mg(r){const l={},h={};return Object.keys(r).forEach(d=>{const f=d.startsWith("fc")?h:l;f[d]=r[d]}),{featureExtractorMap:l,classifierMap:h}}const tD=Ye(Je());class fg extends kn{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 tD.tidy(()=>{const h=r instanceof po?this.faceFeatureExtractor.forwardInput(r):r;return zu(h.as2D(h.shape[0],-1),l.fc)})}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:h}=this.extractClassifierParams(r);this._params=l,this._paramMappings=h}extractClassifierParams(r){return QE(r,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:h}=mg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),eD(h)}extractParams(r){const l=this.getClassifierChannelsIn(),h=this.getClassifierChannelsOut(),d=h*l+h,f=r.slice(0,r.length-d),g=r.slice(r.length-d);return this.faceFeatureExtractor.extractWeights(f),this.extractClassifierParams(g)}}const ax=["neutral","happy","sad","angry","fearful","disgusted","surprised"];class ya{constructor(r){if(r.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${r.length}`);ax.forEach((l,h)=>{this[l]=r[h]})}asSortedArray(){return ax.map(r=>({expression:r,probability:this[r]})).sort((r,l)=>l.probability-r.probability)}}const Qc=Ye(Je());class cx extends fg{constructor(r=new pg){super("FaceExpressionNet",r)}forwardInput(r){return Qc.tidy(()=>Qc.softmax(this.runNet(r)))}async forward(r){return this.forwardInput(await Rt(r))}async predictExpressions(r){const l=await Rt(r),h=await this.forwardInput(l),d=await Promise.all(Qc.unstack(h).map(async g=>{const S=await g.data();return g.dispose(),S}));h.dispose();const f=d.map(g=>new ya(g));return l.isBatchInput?f:f[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}}function lx(r){return r.expressions instanceof ya}function gg(r,l){const h={expressions:l};return Object.assign({},r,h)}function kZ(r,l,h=.1,d){const f=Array.isArray(l)?l:[l];f.forEach(g=>{const S=g instanceof ya?g:lx(g)?g.expressions:void 0;if(!S)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");const L=S.asSortedArray(),x=L.filter(C=>C.probability>h),A=Vi(g)?g.detection.box.bottomLeft:d||new Ze(0,0),O=new Ec(x.map(C=>`${C.expression} (${ea(C.probability)})`),A);O.draw(r)})}function ba(r){return Vi(r)&&r.landmarks instanceof qs&&r.unshiftedLandmarks instanceof qs&&r.alignedRect instanceof Yt}function el(r,l){const{box:h}=r.detection,d=l.shiftBy(h.x,h.y),f=d.align(),{imageDims:g}=r.detection,S=new Yt(r.detection.score,f.rescale(g.reverse()),g),L={landmarks:d,unshiftedLandmarks:l,alignedRect:S};return Object.assign({},r,L)}class nD{constructor(r={}){const{drawLines:l=!0,drawPoints:h=!0,lineWidth:d,lineColor:f,pointSize:g,pointColor:S}=r;this.drawLines=l,this.drawPoints=h,this.lineWidth=d||1,this.pointSize=g||2,this.lineColor=f||"rgba(0, 255, 255, 1)",this.pointColor=S||"rgba(255, 0, 255, 1)"}}class sD{constructor(r,l={}){this.faceLandmarks=r,this.options=new nD(l)}draw(r){const l=es(r),{drawLines:h,drawPoints:d,lineWidth:f,lineColor:g,pointSize:S,pointColor:L}=this.options;if(h&&this.faceLandmarks instanceof Iu&&(l.strokeStyle=g,l.lineWidth=f,gr(l,this.faceLandmarks.getJawOutline()),gr(l,this.faceLandmarks.getLeftEyeBrow()),gr(l,this.faceLandmarks.getRightEyeBrow()),gr(l,this.faceLandmarks.getNose()),gr(l,this.faceLandmarks.getLeftEye(),!0),gr(l,this.faceLandmarks.getRightEye(),!0),gr(l,this.faceLandmarks.getMouth(),!0)),d){l.strokeStyle=L,l.fillStyle=L;const x=A=>{l.beginPath(),l.arc(A.x,A.y,S,0,2*Math.PI),l.fill()};this.faceLandmarks.positions.forEach(x)}}}function FZ(r,l){const h=Array.isArray(l)?l:[l];h.forEach(d=>{const f=d instanceof qs?d:ba(d)?d.landmarks:void 0;if(!f)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new sD(f).draw(r)})}const hx={};vc(hx,{AnchorPosition:()=>Hi,DrawBox:()=>ZS,DrawBoxOptions:()=>l2,DrawFaceLandmarks:()=>sD,DrawFaceLandmarksOptions:()=>nD,DrawTextField:()=>Ec,DrawTextFieldOptions:()=>Wm,drawContour:()=>gr,drawDetections:()=>GX,drawFaceExpressions:()=>kZ,drawFaceLandmarks:()=>FZ});function _Z(r,l){const h=Kc(r,l),d=Xc(r,l);function f(S,L,x){const A=d(S,L,`${x}/separable_conv0`),O=d(L,L,`${x}/separable_conv1`),C=h(S,L,1,`${x}/expansion_conv`);return{separable_conv0:A,separable_conv1:O,expansion_conv:C}}function g(S,L){const x=d(S,S,`${L}/separable_conv0`),A=d(S,S,`${L}/separable_conv1`),O=d(S,S,`${L}/separable_conv2`);return{separable_conv0:x,separable_conv1:A,separable_conv2:O}}return{extractConvParams:h,extractSeparableConvParams:d,extractReductionBlockParams:f,extractMainBlockParams:g}}function iD(r,l){const h=[],{extractWeights:d,getRemainingWeights:f}=Hn(r),{extractConvParams:g,extractSeparableConvParams:S,extractReductionBlockParams:L,extractMainBlockParams:x}=_Z(d,h),A=g(3,32,3,"entry_flow/conv_in"),O=L(32,64,"entry_flow/reduction_block_0"),C=L(64,128,"entry_flow/reduction_block_1"),$={conv_in:A,reduction_block_0:O,reduction_block_1:C},z={};zi(l,0,1).forEach(fe=>{z[`main_block_${fe}`]=x(128,`middle_flow/main_block_${fe}`)});const ne=L(128,256,"exit_flow/reduction_block"),te=S(256,512,"exit_flow/separable_conv"),se={reduction_block:ne,separable_conv:te};if(f().length!==0)throw new Error(`weights remaing after extract: ${f().length}`);return{paramMappings:h,params:{entry_flow:$,middle_flow:z,exit_flow:se}}}function WZ(r,l){const h=ys(r,l),d=ug(h),f=Jc(h);function g(L){const x=f(`${L}/separable_conv0`),A=f(`${L}/separable_conv1`),O=d(`${L}/expansion_conv`);return{separable_conv0:x,separable_conv1:A,expansion_conv:O}}function S(L){const x=f(`${L}/separable_conv0`),A=f(`${L}/separable_conv1`),O=f(`${L}/separable_conv2`);return{separable_conv0:x,separable_conv1:A,separable_conv2:O}}return{extractConvParams:d,extractSeparableConvParams:f,extractReductionBlockParams:g,extractMainBlockParams:S}}function rD(r,l){const h=[],{extractConvParams:d,extractSeparableConvParams:f,extractReductionBlockParams:g,extractMainBlockParams:S}=WZ(r,h),L=d("entry_flow/conv_in"),x=g("entry_flow/reduction_block_0"),A=g("entry_flow/reduction_block_1"),O={conv_in:L,reduction_block_0:x,reduction_block_1:A},C={};zi(l,0,1).forEach(te=>{C[`main_block_${te}`]=S(`middle_flow/main_block_${te}`)});const $=g("exit_flow/reduction_block"),z=f("exit_flow/separable_conv"),ne={reduction_block:$,separable_conv:z};return Vn(r,h),{params:{entry_flow:O,middle_flow:C,exit_flow:ne},paramMappings:h}}const tn=Ye(Je());function oD(r,l,h){return tn.add(tn.conv2d(r,l.filters,h,"same"),l.bias)}function ux(r,l,h=!0){let d=h?tn.relu(r):r;return d=ns(d,l.separable_conv0,[1,1]),d=ns(tn.relu(d),l.separable_conv1,[1,1]),d=tn.maxPool(d,[3,3],[2,2],"same"),d=tn.add(d,oD(r,l.expansion_conv,[2,2])),d}function $Z(r,l){let h=ns(tn.relu(r),l.separable_conv0,[1,1]);return h=ns(tn.relu(h),l.separable_conv1,[1,1]),h=ns(tn.relu(h),l.separable_conv2,[1,1]),h=tn.add(h,r),h}class aD extends kn{constructor(r){super("TinyXception");this._numMainBlocks=r}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyXception - load model before inference");return tn.tidy(()=>{const h=tn.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(tn.scalar(256));let g=tn.relu(oD(f,l.entry_flow.conv_in,[2,2]));return g=ux(g,l.entry_flow.reduction_block_0,!1),g=ux(g,l.entry_flow.reduction_block_1),zi(this._numMainBlocks,0,1).forEach(S=>{g=$Z(g,l.middle_flow[`main_block_${S}`])}),g=ux(g,l.exit_flow.reduction_block),g=tn.relu(ns(g,l.exit_flow.separable_conv,[1,1])),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(r){return rD(r,this._numMainBlocks)}extractParams(r){return iD(r,this._numMainBlocks)}}function cD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),f=lg(h,l),g=f(512,1,"fc/age"),S=f(512,2,"fc/gender");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{fc:{age:g,gender:S}}}}function lD(r){const l=[],h=ys(r,l);function d(g){const S=h(`${g}/weights`,2),L=h(`${g}/bias`,1);return{weights:S,bias:L}}const f={fc:{age:d("fc/age"),gender:d("fc/gender")}};return Vn(r,l),{params:f,paramMappings:l}}var Tr;(function(r){r.FEMALE="female",r.MALE="male"})(Tr||(Tr={}));const Xi=Ye(Je());class dx extends kn{constructor(r=new aD(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 Xi.tidy(()=>{const h=r instanceof po?this.faceFeatureExtractor.forwardInput(r):r,d=Xi.avgPool(h,[7,7],[2,2],"valid").as2D(h.shape[0],-1),f=zu(d,l.fc.age).as1D(),g=zu(d,l.fc.gender);return{age:f,gender:g}})}forwardInput(r){return Xi.tidy(()=>{const{age:l,gender:h}=this.runNet(r);return{age:l,gender:Xi.softmax(h)}})}async forward(r){return this.forwardInput(await Rt(r))}async predictAgeAndGender(r){const l=await Rt(r),h=await this.forwardInput(l),d=Xi.unstack(h.age),f=Xi.unstack(h.gender),g=d.map((L,x)=>({ageTensor:L,genderTensor:f[x]})),S=await Promise.all(g.map(async({ageTensor:L,genderTensor:x})=>{const A=(await L.data())[0],O=(await x.data())[0],C=O>.5,$=C?Tr.MALE:Tr.FEMALE,z=C?O:1-O;return L.dispose(),x.dispose(),{age:A,gender:$,genderProbability:z}}));return h.age.dispose(),h.gender.dispose(),l.isBatchInput?S:S[0]}getDefaultModelName(){return"age_gender_model"}dispose(r=!0){this.faceFeatureExtractor.dispose(r),super.dispose(r)}loadClassifierParams(r){const{params:l,paramMappings:h}=this.extractClassifierParams(r);this._params=l,this._paramMappings=h}extractClassifierParams(r){return cD(r)}extractParamsFromWeigthMap(r){const{featureExtractorMap:l,classifierMap:h}=mg(r);return this.faceFeatureExtractor.loadFromWeightMap(l),lD(h)}extractParams(r){const l=512*1+1+(512*2+2),h=r.slice(0,r.length-l),d=r.slice(r.length-l);return this.faceFeatureExtractor.extractWeights(h),this.extractClassifierParams(d)}}const bs=Ye(Je());class yg extends fg{postProcess(r,l,h){const d=h.map(({width:g,height:S})=>{const L=l/Math.max(S,g);return{width:g*L,height:S*L}}),f=d.length;return bs.tidy(()=>{const g=(O,C)=>bs.stack([bs.fill([68],O,"float32"),bs.fill([68],C,"float32")],1).as2D(1,136).as1D(),S=(O,C)=>{const{width:$,height:z}=d[O];return C($,z)?Math.abs($-z)/2:0},L=O=>S(O,(C,$)=>C<$),x=O=>S(O,(C,$)=>$g(L(C),x(C))))).div(bs.stack(Array.from(Array(f),(O,C)=>g(d[C].width,d[C].height))));return A})}forwardInput(r){return bs.tidy(()=>{const l=this.runNet(r);return this.postProcess(l,r.inputSize,r.inputDimensions.map(([h,d])=>({height:h,width:d})))})}async forward(r){return this.forwardInput(await Rt(r))}async detectLandmarks(r){const l=await Rt(r),h=bs.tidy(()=>bs.unstack(this.forwardInput(l))),d=await Promise.all(h.map(async(f,g)=>{const S=Array.from(await f.data()),L=S.filter((A,O)=>Em(O)),x=S.filter((A,O)=>!Em(O));return new Iu(Array(68).fill(0).map((A,O)=>new Ze(L[O],x[O])),{height:l.getInputHeight(g),width:l.getInputWidth(g)})}));return h.forEach(f=>f.dispose()),l.isBatchInput?d:d[0]}getClassifierChannelsOut(){return 136}}class Gu extends yg{constructor(r=new pg){super("FaceLandmark68Net",r)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}}function hD(r){const l=[],{extractDenseBlock3Params:h}=dg(r,l),d={dense0:h("dense0",!0),dense1:h("dense1"),dense2:h("dense2")};return Vn(r,l),{params:d,paramMappings:l}}function uD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractDenseBlock3Params:f}=hg(h,l),g=f(3,32,"dense0",!0),S=f(32,64,"dense1"),L=f(64,128,"dense2");if(d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{paramMappings:l,params:{dense0:g,dense1:S,dense2:L}}}const go=Ye(Je());class dD extends kn{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("TinyFaceFeatureExtractor - load model before inference");return go.tidy(()=>{const h=go.cast(r.toBatchTensor(112,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(go.scalar(255));let g=og(f,l.dense0,!0);return g=og(g,l.dense1),g=og(g,l.dense2),g=go.avgPool(g,[14,14],[2,2],"valid"),g})}async forward(r){return this.forwardInput(await Rt(r))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeigthMap(r){return hD(r)}extractParams(r){return uD(r)}}class px extends yg{constructor(r=new dD){super("FaceLandmark68TinyNet",r)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}}class UZ extends Gu{}const bg=Ye(Je());function pD(r,l){return bg.add(bg.mul(r,l.weights),l.biases)}const tl=Ye(Je());function mx(r,l,h,d,f="same"){const{filters:g,bias:S}=l.conv;let L=tl.conv2d(r,g,h,f);return L=tl.add(L,S),L=pD(L,l.scale),d?tl.relu(L):L}function mD(r,l){return mx(r,l,[1,1],!0)}function fx(r,l){return mx(r,l,[1,1],!1)}function wg(r,l){return mx(r,l,[2,2],!0,"valid")}const ws=Ye(Je());function BZ(r,l){function h(L,x,A){const O=r(L),C=O.length/(x*A*A);if(MS(C))throw new Error(`depth has to be an integer: ${C}, weights.length: ${O.length}, numFilters: ${x}, filterSize: ${A}`);return ws.tidy(()=>ws.transpose(ws.tensor4d(O,[x,C,A,A]),[2,3,1,0]))}function d(L,x,A,O){const C=h(L,x,A),$=ws.tensor1d(r(x));return l.push({paramPath:`${O}/filters`},{paramPath:`${O}/bias`}),{filters:C,bias:$}}function f(L,x){const A=ws.tensor1d(r(L)),O=ws.tensor1d(r(L));return l.push({paramPath:`${x}/weights`},{paramPath:`${x}/biases`}),{weights:A,biases:O}}function g(L,x,A,O){const C=d(L,x,A,`${O}/conv`),$=f(x,`${O}/scale`);return{conv:C,scale:$}}function S(L,x,A,O,C=!1){const $=g((C?.5:1)*L,x,A,`${O}/conv1`),z=g(L,x,A,`${O}/conv2`);return{conv1:$,conv2:z}}return{extractConvLayerParams:g,extractResidualLayerParams:S}}function fD(r){const{extractWeights:l,getRemainingWeights:h}=Hn(r),d=[],{extractConvLayerParams:f,extractResidualLayerParams:g}=BZ(l,d),S=f(4704,32,7,"conv32_down"),L=g(9216,32,3,"conv32_1"),x=g(9216,32,3,"conv32_2"),A=g(9216,32,3,"conv32_3"),O=g(36864,64,3,"conv64_down",!0),C=g(36864,64,3,"conv64_1"),$=g(36864,64,3,"conv64_2"),z=g(36864,64,3,"conv64_3"),ne=g(147456,128,3,"conv128_down",!0),te=g(147456,128,3,"conv128_1"),se=g(147456,128,3,"conv128_2"),fe=g(589824,256,3,"conv256_down",!0),de=g(589824,256,3,"conv256_1"),Ae=g(589824,256,3,"conv256_2"),xe=g(589824,256,3,"conv256_down_out"),Me=ws.tidy(()=>ws.transpose(ws.tensor2d(l(256*128),[128,256]),[1,0]));if(d.push({paramPath:"fc"}),h().length!==0)throw new Error(`weights remaing after extract: ${h().length}`);const Ke={conv32_down:S,conv32_1:L,conv32_2:x,conv32_3:A,conv64_down:O,conv64_1:C,conv64_2:$,conv64_3:z,conv128_down:ne,conv128_1:te,conv128_2:se,conv256_down:fe,conv256_1:de,conv256_2:Ae,conv256_down_out:xe,fc:Me};return{params:Ke,paramMappings:d}}function MZ(r,l){const h=ys(r,l);function d(S){const L=h(`${S}/scale/weights`,1),x=h(`${S}/scale/biases`,1);return{weights:L,biases:x}}function f(S){const L=h(`${S}/conv/filters`,4),x=h(`${S}/conv/bias`,1),A=d(S);return{conv:{filters:L,bias:x},scale:A}}function g(S){return{conv1:f(`${S}/conv1`),conv2:f(`${S}/conv2`)}}return{extractConvLayerParams:f,extractResidualLayerParams:g}}function gD(r){const l=[],{extractConvLayerParams:h,extractResidualLayerParams:d}=MZ(r,l),f=h("conv32_down"),g=d("conv32_1"),S=d("conv32_2"),L=d("conv32_3"),x=d("conv64_down"),A=d("conv64_1"),O=d("conv64_2"),C=d("conv64_3"),$=d("conv128_down"),z=d("conv128_1"),ne=d("conv128_2"),te=d("conv256_down"),se=d("conv256_1"),fe=d("conv256_2"),de=d("conv256_down_out"),Ae=r.fc;if(l.push({originalPath:"fc",paramPath:"fc"}),!BS(Ae))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${Ae}`);const xe={conv32_down:f,conv32_1:g,conv32_2:S,conv32_3:L,conv64_down:x,conv64_1:A,conv64_2:O,conv64_3:C,conv128_down:$,conv128_1:z,conv128_2:ne,conv256_down:te,conv256_1:se,conv256_2:fe,conv256_down_out:de,fc:Ae};return Vn(r,l),{params:xe,paramMappings:l}}const Yn=Ye(Je());function Li(r,l){let h=mD(r,l.conv1);return h=fx(h,l.conv2),h=Yn.add(h,r),h=Yn.relu(h),h}function Vu(r,l){let h=wg(r,l.conv1);h=fx(h,l.conv2);let d=Yn.avgPool(r,2,2,"valid");const f=Yn.zeros(d.shape),g=d.shape[3]!==h.shape[3],S=d.shape[1]!==h.shape[1]||d.shape[2]!==h.shape[2];if(S){const L=[...h.shape];L[1]=1;const x=Yn.zeros(L);h=Yn.concat([h,x],1);const A=[...h.shape];A[2]=1;const O=Yn.zeros(A);h=Yn.concat([h,O],2)}return d=g?Yn.concat([d,f],3):d,h=Yn.add(d,h),h=Yn.relu(h),h}const _s=Ye(Je());class Hu extends kn{constructor(){super("FaceRecognitionNet")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("FaceRecognitionNet - load model before inference");return _s.tidy(()=>{const h=_s.cast(r.toBatchTensor(150,!0),"float32"),d=[122.782,117.001,104.298],f=yi(h,d).div(_s.scalar(256));let g=wg(f,l.conv32_down);g=_s.maxPool(g,3,2,"valid"),g=Li(g,l.conv32_1),g=Li(g,l.conv32_2),g=Li(g,l.conv32_3),g=Vu(g,l.conv64_down),g=Li(g,l.conv64_1),g=Li(g,l.conv64_2),g=Li(g,l.conv64_3),g=Vu(g,l.conv128_down),g=Li(g,l.conv128_1),g=Li(g,l.conv128_2),g=Vu(g,l.conv256_down),g=Li(g,l.conv256_1),g=Li(g,l.conv256_2),g=Vu(g,l.conv256_down_out);const S=g.mean([1,2]),L=_s.matMul(S,l.fc);return L})}async forward(r){return this.forwardInput(await Rt(r))}async computeFaceDescriptor(r){const l=await Rt(r),h=_s.tidy(()=>_s.unstack(this.forwardInput(l))),d=await Promise.all(h.map(f=>f.data()));return h.forEach(f=>f.dispose()),l.isBatchInput?d:d[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(r){return gD(r)}extractParams(r){return fD(r)}}function PZ(r){const l=new Hu;return l.extractWeights(r),l}function Lg(r,l){const h={descriptor:l};return Object.assign({},r,h)}function zZ(r){return typeof r.age=="number"}function Sg(r,l){const h={age:l};return Object.assign({},r,h)}function GZ(r){return(r.gender===Tr.MALE||r.gender===Tr.FEMALE)&&Rc(r.genderProbability)}function Ig(r,l,h){const d={gender:l,genderProbability:h};return Object.assign({},r,d)}const Si=Ye(Je());function VZ(r,l){function h(x,A){const O=Si.tensor4d(r(3*3*x),[3,3,x,1]),C=Si.tensor1d(r(x)),$=Si.tensor1d(r(x)),z=Si.tensor1d(r(x)),ne=Si.tensor1d(r(x));return l.push({paramPath:`${A}/filters`},{paramPath:`${A}/batch_norm_scale`},{paramPath:`${A}/batch_norm_offset`},{paramPath:`${A}/batch_norm_mean`},{paramPath:`${A}/batch_norm_variance`}),{filters:O,batch_norm_scale:C,batch_norm_offset:$,batch_norm_mean:z,batch_norm_variance:ne}}function d(x,A,O,C,$){const z=Si.tensor4d(r(x*A*O*O),[O,O,x,A]),ne=Si.tensor1d(r(A));return l.push({paramPath:`${C}/filters`},{paramPath:`${C}/${$?"batch_norm_offset":"bias"}`}),{filters:z,bias:ne}}function f(x,A,O,C){const{filters:$,bias:z}=d(x,A,O,C,!0);return{filters:$,batch_norm_offset:z}}function g(x,A,O){const C=h(x,`${O}/depthwise_conv`),$=f(x,A,1,`${O}/pointwise_conv`);return{depthwise_conv:C,pointwise_conv:$}}function S(){const x=f(3,32,3,"mobilenetv1/conv_0"),A=g(32,64,"mobilenetv1/conv_1"),O=g(64,128,"mobilenetv1/conv_2"),C=g(128,128,"mobilenetv1/conv_3"),$=g(128,256,"mobilenetv1/conv_4"),z=g(256,256,"mobilenetv1/conv_5"),ne=g(256,512,"mobilenetv1/conv_6"),te=g(512,512,"mobilenetv1/conv_7"),se=g(512,512,"mobilenetv1/conv_8"),fe=g(512,512,"mobilenetv1/conv_9"),de=g(512,512,"mobilenetv1/conv_10"),Ae=g(512,512,"mobilenetv1/conv_11"),xe=g(512,1024,"mobilenetv1/conv_12"),Me=g(1024,1024,"mobilenetv1/conv_13");return{conv_0:x,conv_1:A,conv_2:O,conv_3:C,conv_4:$,conv_5:z,conv_6:ne,conv_7:te,conv_8:se,conv_9:fe,conv_10:de,conv_11:Ae,conv_12:xe,conv_13:Me}}function L(){const x=f(1024,256,1,"prediction_layer/conv_0"),A=f(256,512,3,"prediction_layer/conv_1"),O=f(512,128,1,"prediction_layer/conv_2"),C=f(128,256,3,"prediction_layer/conv_3"),$=f(256,128,1,"prediction_layer/conv_4"),z=f(128,256,3,"prediction_layer/conv_5"),ne=f(256,64,1,"prediction_layer/conv_6"),te=f(64,128,3,"prediction_layer/conv_7"),se=d(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),fe=d(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),de=d(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),Ae=d(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),xe=d(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),Me=d(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),Ke=d(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),wt=d(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),$t=d(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),Kt=d(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),Fn=d(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),vn=d(128,18,1,"prediction_layer/box_predictor_5/class_predictor"),Nn={box_encoding_predictor:se,class_predictor:fe},Qs={box_encoding_predictor:de,class_predictor:Ae},Ai={box_encoding_predictor:xe,class_predictor:Me},ei={box_encoding_predictor:Ke,class_predictor:wt},xa={box_encoding_predictor:$t,class_predictor:Kt},hl={box_encoding_predictor:Fn,class_predictor:vn};return{conv_0:x,conv_1:A,conv_2:O,conv_3:C,conv_4:$,conv_5:z,conv_6:ne,conv_7:te,box_predictor_0:Nn,box_predictor_1:Qs,box_predictor_2:Ai,box_predictor_3:ei,box_predictor_4:xa,box_predictor_5:hl}}return{extractMobilenetV1Params:S,extractPredictionLayerParams:L}}function yD(r){const l=[],{extractWeights:h,getRemainingWeights:d}=Hn(r),{extractMobilenetV1Params:f,extractPredictionLayerParams:g}=VZ(h,l),S=f(),L=g(),x=Si.tensor3d(h(5118*4),[1,5118,4]),A={extra_dim:x};if(l.push({paramPath:"output_layer/extra_dim"}),d().length!==0)throw new Error(`weights remaing after extract: ${d().length}`);return{params:{mobilenetv1:S,prediction_layer:L,output_layer:A},paramMappings:l}}function HZ(r,l){const h=ys(r,l);function d(A,O,C){const $=h(`${A}/Conv2d_${O}_pointwise/weights`,4,`${C}/filters`),z=h(`${A}/Conv2d_${O}_pointwise/convolution_bn_offset`,1,`${C}/batch_norm_offset`);return{filters:$,batch_norm_offset:z}}function f(A){const O=`mobilenetv1/conv_${A}`,C=`MobilenetV1/Conv2d_${A}_depthwise`,$=`${O}/depthwise_conv`,z=`${O}/pointwise_conv`,ne=h(`${C}/depthwise_weights`,4,`${$}/filters`),te=h(`${C}/BatchNorm/gamma`,1,`${$}/batch_norm_scale`),se=h(`${C}/BatchNorm/beta`,1,`${$}/batch_norm_offset`),fe=h(`${C}/BatchNorm/moving_mean`,1,`${$}/batch_norm_mean`),de=h(`${C}/BatchNorm/moving_variance`,1,`${$}/batch_norm_variance`);return{depthwise_conv:{filters:ne,batch_norm_scale:te,batch_norm_offset:se,batch_norm_mean:fe,batch_norm_variance:de},pointwise_conv:d("MobilenetV1",A,z)}}function g(){return{conv_0:d("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:f(1),conv_2:f(2),conv_3:f(3),conv_4:f(4),conv_5:f(5),conv_6:f(6),conv_7:f(7),conv_8:f(8),conv_9:f(9),conv_10:f(10),conv_11:f(11),conv_12:f(12),conv_13:f(13)}}function S(A,O){const C=h(`${A}/weights`,4,`${O}/filters`),$=h(`${A}/biases`,1,`${O}/bias`);return{filters:C,bias:$}}function L(A){const O=S(`Prediction/BoxPredictor_${A}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${A}/box_encoding_predictor`),C=S(`Prediction/BoxPredictor_${A}/ClassPredictor`,`prediction_layer/box_predictor_${A}/class_predictor`);return{box_encoding_predictor:O,class_predictor:C}}function x(){return{conv_0:d("Prediction",0,"prediction_layer/conv_0"),conv_1:d("Prediction",1,"prediction_layer/conv_1"),conv_2:d("Prediction",2,"prediction_layer/conv_2"),conv_3:d("Prediction",3,"prediction_layer/conv_3"),conv_4:d("Prediction",4,"prediction_layer/conv_4"),conv_5:d("Prediction",5,"prediction_layer/conv_5"),conv_6:d("Prediction",6,"prediction_layer/conv_6"),conv_7:d("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:L(0),box_predictor_1:L(1),box_predictor_2:L(2),box_predictor_3:L(3),box_predictor_4:L(4),box_predictor_5:L(5)}}return{extractMobilenetV1Params:g,extractPredictionLayerParams:x}}function bD(r){const l=[],{extractMobilenetV1Params:h,extractPredictionLayerParams:d}=HZ(r,l),f=r["Output/extra_dim"];if(l.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!yr(f))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${f}`);const g={mobilenetv1:h(),prediction_layer:d(),output_layer:{extra_dim:f}};return Vn(r,l),{params:g,paramMappings:l}}const yo=Ye(Je());function Xs(r,l,h){return yo.tidy(()=>{let d=yo.conv2d(r,l.filters,h,"same");return d=yo.add(d,l.batch_norm_offset),yo.clipByValue(d,0,6)})}const Ar=Ye(Je()),YZ=.0010000000474974513;function qZ(r,l,h){return Ar.tidy(()=>{let d=Ar.depthwiseConv2d(r,l.filters,h,"same");return d=Ar.batchNorm(d,l.batch_norm_mean,l.batch_norm_variance,l.batch_norm_offset,l.batch_norm_scale,YZ),Ar.clipByValue(d,0,6)})}function jZ(r){return[2,4,6,12].some(l=>l===r)?[2,2]:[1,1]}function wD(r,l){return Ar.tidy(()=>{let h,d=Xs(r,l.conv_0,[2,2]);const f=[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(f.forEach((g,S)=>{const L=S+1,x=jZ(L);d=qZ(d,g.depthwise_conv,x),d=Xs(d,g.pointwise_conv,[1,1]),L===11&&(h=d)}),h===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:d,conv11:h}})}function LD(r,l,h,d,f){const g=r.shape[0],S=Math.min(h,g),L=l.map((O,C)=>({score:O,boxIndex:C})).filter(O=>O.score>f).sort((O,C)=>C.score-O.score),x=O=>O<=d?1:0,A=[];return L.forEach(O=>{if(A.length>=S)return;const C=O.score;for(let $=A.length-1;$>=0;--$){const z=KZ(r,O.boxIndex,A[$]);if(z===0)continue;if(O.score*=x(z),O.score<=f)break}C===O.score&&A.push(O.boxIndex)}),A}function KZ(r,l,h){const d=r.arraySync(),f=Math.min(d[l][0],d[l][2]),g=Math.min(d[l][1],d[l][3]),S=Math.max(d[l][0],d[l][2]),L=Math.max(d[l][1],d[l][3]),x=Math.min(d[h][0],d[h][2]),A=Math.min(d[h][1],d[h][3]),O=Math.max(d[h][0],d[h][2]),C=Math.max(d[h][1],d[h][3]),$=(S-f)*(L-g),z=(O-x)*(C-A);if($<=0||z<=0)return 0;const ne=Math.max(f,x),te=Math.max(g,A),se=Math.min(S,O),fe=Math.min(L,C),de=Math.max(se-ne,0)*Math.max(fe-te,0);return de/($+z-de)}const De=Ye(Je());function XZ(r){const l=De.unstack(De.transpose(r,[1,0])),h=[De.sub(l[2],l[0]),De.sub(l[3],l[1])],d=[De.add(l[0],De.div(h[0],De.scalar(2))),De.add(l[1],De.div(h[1],De.scalar(2)))];return{sizes:h,centers:d}}function JZ(r,l){const{sizes:h,centers:d}=XZ(r),f=De.unstack(De.transpose(l,[1,0])),g=De.div(De.mul(De.exp(De.div(f[2],De.scalar(5))),h[0]),De.scalar(2)),S=De.add(De.mul(De.div(f[0],De.scalar(10)),h[0]),d[0]),L=De.div(De.mul(De.exp(De.div(f[3],De.scalar(5))),h[1]),De.scalar(2)),x=De.add(De.mul(De.div(f[1],De.scalar(10)),h[1]),d[1]);return De.transpose(De.stack([De.sub(S,g),De.sub(x,L),De.add(S,g),De.add(x,L)]),[1,0])}function SD(r,l,h){return De.tidy(()=>{const d=r.shape[0];let f=JZ(De.reshape(De.tile(h.extra_dim,[d,1,1]),[-1,4]),De.reshape(r,[-1,4]));f=De.reshape(f,[d,f.shape[0]/d,4]);const g=De.sigmoid(De.slice(l,[0,0,1],[-1,-1,-1]));let S=De.slice(g,[0,0,0],[-1,-1,1]);S=De.reshape(S,[d,S.shape[1]]);const L=De.unstack(f),x=De.unstack(S);return{boxes:L,scores:x}})}const Yu=Ye(Je());function wa(r,l){return Yu.tidy(()=>{const h=r.shape[0],d=Yu.reshape(ga(r,l.box_encoding_predictor),[h,-1,1,4]),f=Yu.reshape(ga(r,l.class_predictor),[h,-1,3]);return{boxPredictionEncoding:d,classPrediction:f}})}const qu=Ye(Je());function ID(r,l,h){return qu.tidy(()=>{const d=Xs(r,h.conv_0,[1,1]),f=Xs(d,h.conv_1,[2,2]),g=Xs(f,h.conv_2,[1,1]),S=Xs(g,h.conv_3,[2,2]),L=Xs(S,h.conv_4,[1,1]),x=Xs(L,h.conv_5,[2,2]),A=Xs(x,h.conv_6,[1,1]),O=Xs(A,h.conv_7,[2,2]),C=wa(l,h.box_predictor_0),$=wa(r,h.box_predictor_1),z=wa(f,h.box_predictor_2),ne=wa(S,h.box_predictor_3),te=wa(x,h.box_predictor_4),se=wa(O,h.box_predictor_5),fe=qu.concat([C.boxPredictionEncoding,$.boxPredictionEncoding,z.boxPredictionEncoding,ne.boxPredictionEncoding,te.boxPredictionEncoding,se.boxPredictionEncoding],1),de=qu.concat([C.classPrediction,$.classPrediction,z.classPrediction,ne.classPrediction,te.classPrediction,se.classPrediction],1);return{boxPredictions:fe,classPredictions:de}})}class Ii{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 xi=Ye(Je());class nl extends kn{constructor(){super("SsdMobilenetv1")}forwardInput(r){const{params:l}=this;if(!l)throw new Error("SsdMobilenetv1 - load model before inference");return xi.tidy(()=>{const h=xi.cast(r.toBatchTensor(512,!1),"float32"),d=xi.sub(xi.mul(h,xi.scalar(.007843137718737125)),xi.scalar(1)),f=wD(d,l.mobilenetv1),{boxPredictions:g,classPredictions:S}=ID(f.out,f.conv11,l.prediction_layer);return SD(g,S,l.output_layer)})}async forward(r){return this.forwardInput(await Rt(r))}async locateFaces(r,l={}){const{maxResults:h,minConfidence:d}=new Ii(l),f=await Rt(r),{boxes:g,scores:S}=this.forwardInput(f),L=g[0],x=S[0];for(let de=1;de{const[Ae,xe]=[Math.max(0,se[de][0]),Math.min(1,se[de][2])].map(wt=>wt*te),[Me,Ke]=[Math.max(0,se[de][1]),Math.min(1,se[de][3])].map(wt=>wt*ne);return new Yt(A[de],new Su(Me,Ae,Ke-Me,xe-Ae),{height:f.getInputHeight(0),width:f.getInputWidth(0)})});return L.dispose(),x.dispose(),fe}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(r){return bD(r)}extractParams(r){return yD(r)}}function xD(r){const l=new nl;return l.extractWeights(r),l}function ZZ(r){return xD(r)}class QZ extends nl{}const TD=.4,AD=[new Ze(.738768,.874946),new Ze(2.42204,2.65704),new Ze(4.30971,7.04493),new Ze(10.246,4.59428),new Ze(12.6868,11.8741)],vD=[new Ze(1.603231,2.094468),new Ze(6.041143,7.080126),new Ze(2.882459,3.518061),new Ze(4.266906,5.178857),new Ze(9.041765,10.66308)],ND=[117.001,114.697,97.404],CD="tiny_yolov2_model",RD="tiny_yolov2_separable_conv_model";const xg=r=>typeof r=="number";function gx(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(!xg(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=>xg(l.x)&&xg(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(xg)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(r.meanRgb)}`)}const Js=Ye(Je());function sl(r){return Js.tidy(()=>{const l=Js.mul(r,Js.scalar(.10000000149011612));return Js.add(Js.relu(Js.sub(r,l)),l)})}const Zs=Ye(Je());function vr(r,l){return Zs.tidy(()=>{let h=Zs.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return h=Zs.conv2d(h,l.conv.filters,[1,1],"valid"),h=Zs.sub(h,l.bn.sub),h=Zs.mul(h,l.bn.truediv),h=Zs.add(h,l.conv.bias),sl(h)})}const bo=Ye(Je());function Nr(r,l){return bo.tidy(()=>{let h=bo.pad(r,[[0,0],[1,1],[1,1],[0,0]]);return h=bo.separableConv2d(h,l.depthwise_filter,l.pointwise_filter,[1,1],"valid"),h=bo.add(h,l.bias),sl(h)})}const yx=Ye(Je());function eQ(r,l){const h=Kc(r,l);function d(S,L){const x=yx.tensor1d(r(S)),A=yx.tensor1d(r(S));return l.push({paramPath:`${L}/sub`},{paramPath:`${L}/truediv`}),{sub:x,truediv:A}}function f(S,L,x){const A=h(S,L,3,`${x}/conv`),O=d(L,`${x}/bn`);return{conv:A,bn:O}}const g=Xc(r,l);return{extractConvParams:h,extractConvWithBatchNormParams:f,extractSeparableConvParams:g}}function OD(r,l,h,d){const{extractWeights:f,getRemainingWeights:g}=Hn(r),S=[],{extractConvParams:L,extractConvWithBatchNormParams:x,extractSeparableConvParams:A}=eQ(f,S);let O;if(l.withSeparableConvs){const[C,$,z,ne,te,se,fe,de,Ae]=d,xe=l.isFirstLayerConv2d?L(C,$,3,"conv0"):A(C,$,"conv0"),Me=A($,z,"conv1"),Ke=A(z,ne,"conv2"),wt=A(ne,te,"conv3"),$t=A(te,se,"conv4"),Kt=A(se,fe,"conv5"),Fn=de?A(fe,de,"conv6"):void 0,vn=Ae?A(de,Ae,"conv7"):void 0,Nn=L(Ae||de||fe,5*h,1,"conv8");O={conv0:xe,conv1:Me,conv2:Ke,conv3:wt,conv4:$t,conv5:Kt,conv6:Fn,conv7:vn,conv8:Nn}}else{const[C,$,z,ne,te,se,fe,de,Ae]=d,xe=x(C,$,"conv0"),Me=x($,z,"conv1"),Ke=x(z,ne,"conv2"),wt=x(ne,te,"conv3"),$t=x(te,se,"conv4"),Kt=x(se,fe,"conv5"),Fn=x(fe,de,"conv6"),vn=x(de,Ae,"conv7"),Nn=L(Ae,5*h,1,"conv8");O={conv0:xe,conv1:Me,conv2:Ke,conv3:wt,conv4:$t,conv5:Kt,conv6:Fn,conv7:vn,conv8:Nn}}if(g().length!==0)throw new Error(`weights remaing after extract: ${g().length}`);return{params:O,paramMappings:S}}function tQ(r,l){const h=ys(r,l);function d(L){const x=h(`${L}/sub`,1),A=h(`${L}/truediv`,1);return{sub:x,truediv:A}}function f(L){const x=h(`${L}/filters`,4),A=h(`${L}/bias`,1);return{filters:x,bias:A}}function g(L){const x=f(`${L}/conv`),A=d(`${L}/bn`);return{conv:x,bn:A}}const S=Jc(h);return{extractConvParams:f,extractConvWithBatchNormParams:g,extractSeparableConvParams:S}}function ED(r,l){const h=[],{extractConvParams:d,extractConvWithBatchNormParams:f,extractSeparableConvParams:g}=tQ(r,h);let S;if(l.withSeparableConvs){const L=l.filterSizes&&l.filterSizes.length||9;S={conv0:l.isFirstLayerConv2d?d("conv0"):g("conv0"),conv1:g("conv1"),conv2:g("conv2"),conv3:g("conv3"),conv4:g("conv4"),conv5:g("conv5"),conv6:L>7?g("conv6"):void 0,conv7:L>8?g("conv7"):void 0,conv8:d("conv8")}}else S={conv0:f("conv0"),conv1:f("conv1"),conv2:f("conv2"),conv3:f("conv3"),conv4:f("conv4"),conv5:f("conv5"),conv6:f("conv6"),conv7:f("conv7"),conv8:d("conv8")};return Vn(r,h),{params:S,paramMappings:h}}var bx;(function(r){r[r.XS=224]="XS",r[r.SM=320]="SM",r[r.MD=416]="MD",r[r.LG=608]="LG"})(bx||(bx={}));class Cr{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=Ye(Je());class il extends kn{constructor(r){super("TinyYolov2");gx(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 h=vr(r,l.conv0);return h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv1),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv2),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv3),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv4),h=kt.maxPool(h,[2,2],[2,2],"same"),h=vr(h,l.conv5),h=kt.maxPool(h,[2,2],[1,1],"same"),h=vr(h,l.conv6),h=vr(h,l.conv7),ga(h,l.conv8,"valid",!1)}runMobilenet(r,l){let h=this.config.isFirstLayerConv2d?sl(ga(r,l.conv0,"valid",!1)):Nr(r,l.conv0);return h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv1),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv2),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv3),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv4),h=kt.maxPool(h,[2,2],[2,2],"same"),h=Nr(h,l.conv5),h=kt.maxPool(h,[2,2],[1,1],"same"),h=l.conv6?Nr(h,l.conv6):h,h=l.conv7?Nr(h,l.conv7):h,ga(h,l.conv8,"valid",!1)}forwardInput(r,l){const{params:h}=this;if(!h)throw new Error("TinyYolov2 - load model before inference");return kt.tidy(()=>{let d=kt.cast(r.toBatchTensor(l,!1),"float32");return d=this.config.meanRgb?yi(d,this.config.meanRgb):d,d=d.div(kt.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(d,h):this.runTinyYolov2(d,h)})}async forward(r,l){return await this.forwardInput(await Rt(r),l)}async detect(r,l={}){const{inputSize:h,scoreThreshold:d}=new Cr(l),f=await Rt(r),g=await this.forwardInput(f,h),S=kt.tidy(()=>kt.unstack(g)[0].expandDims()),L={width:f.getInputWidth(0),height:f.getInputHeight(0)},x=await this.extractBoxes(S,f.getReshapedInputDimensions(0),d);g.dispose(),S.dispose();const A=x.map(te=>te.box),O=x.map(te=>te.score),C=x.map(te=>te.classScore),$=x.map(te=>this.config.classes[te.label]),z=VS(A.map(te=>te.rescale(h)),O,this.config.iouThreshold,!0),ne=z.map(te=>new Oc(O[te],C[te],$[te],A[te],L));return ne}getDefaultModelName(){return""}extractParamsFromWeigthMap(r){return ED(r,this.config)}extractParams(r){const l=this.config.filterSizes||il.DEFAULT_FILTER_SIZES,h=l?l.length:void 0;if(h!==7&&h!==8&&h!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${h} filterSizes in config`);return OD(r,this.config,this.boxEncodingSize,l)}async extractBoxes(r,l,h){const{width:d,height:f}=l,g=Math.max(d,f),S=g/d,L=g/f,x=r.shape[1],A=this.config.anchors.length,[O,C,$]=kt.tidy(()=>{const se=r.reshape([x,x,A,this.boxEncodingSize]),fe=se.slice([0,0,0,0],[x,x,A,4]),de=se.slice([0,0,0,4],[x,x,A,1]),Ae=this.withClassScores?kt.softmax(se.slice([0,0,0,5],[x,x,A,this.config.classes.length]),3):kt.scalar(0);return[fe,de,Ae]}),z=[],ne=await C.array(),te=await O.array();for(let se=0;seh){const xe=(fe+Lu(te[se][fe][de][0]))/x*S,Me=(se+Lu(te[se][fe][de][1]))/x*L,Ke=Math.exp(te[se][fe][de][2])*this.config.anchors[de].x/x*S,wt=Math.exp(te[se][fe][de][3])*this.config.anchors[de].y/x*L,$t=xe-Ke/2,Kt=Me-wt/2,Fn={row:se,col:fe,anchor:de},{classScore:vn,label:Nn}=this.withClassScores?await this.extractPredictedClass($,Fn):{classScore:1,label:0};z.push({box:new wu($t,Kt,$t+Ke,Kt+wt),score:Ae,classScore:Ae*vn,label:Nn,...Fn})}}return O.dispose(),C.dispose(),$.dispose(),z}async extractPredictedClass(r,l){const{row:h,col:d,anchor:f}=l,g=await r.array();return Array(this.config.classes.length).fill(0).map((S,L)=>g[h][d][f][L]).map((S,L)=>({classScore:S,label:L})).reduce((S,L)=>S.classScore>L.classScore?S:L)}}il.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];class ju extends il{constructor(r=!0){const l=Object.assign({},{withSeparableConvs:r,iouThreshold:TD,classes:["face"]},r?{anchors:vD,meanRgb:ND}:{anchors:AD,withClassScores:!0});super(l)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(r,l){const h=await this.detect(r,l);return h.map(d=>new Yt(d.score,d.relativeBox,{width:d.imageWidth,height:d.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?RD:CD}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}function nQ(r,l=!0){const h=new ju(l);return h.extractWeights(r),h}class wx extends Cr{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}}class Ti{async then(r){return r(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}}const Lx=Ye(Je());async function La(r,l,h,d,f=({alignedRect:g})=>g){const g=r.map(x=>ba(x)?f(x):x.detection),S=d||(l instanceof Lx.Tensor?await qc(l,g):await Yc(l,g)),L=await h(S);return S.forEach(x=>x instanceof Lx.Tensor&&x.dispose()),L}async function rl(r,l,h,d,f){return La([r],l,async g=>h(g[0]),d,f)}const DD=.4,kD=[new Ze(1.603231,2.094468),new Ze(6.041143,7.080126),new Ze(2.882459,3.518061),new Ze(4.266906,5.178857),new Ze(9.041765,10.66308)],FD=[117.001,114.697,97.404];class Ku extends il{constructor(){const r={withSeparableConvs:!0,iouThreshold:DD,classes:["face"],anchors:kD,meanRgb:FD,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(r)}get anchors(){return this.config.anchors}async locateFaces(r,l){const h=await this.detect(r,l);return h.map(d=>new Yt(d.score,d.relativeBox,{width:d.imageWidth,height:d.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeigthMap(r){return super.extractParamsFromWeigthMap(r)}}const pt={ssdMobilenetv1:new nl,tinyFaceDetector:new Ku,tinyYolov2:new ju,faceLandmark68Net:new Gu,faceLandmark68TinyNet:new px,faceRecognitionNet:new Hu,faceExpressionNet:new cx,ageGenderNet:new dx},_D=(r,l)=>pt.ssdMobilenetv1.locateFaces(r,l),sQ=(r,l)=>pt.tinyFaceDetector.locateFaces(r,l),iQ=(r,l)=>pt.tinyYolov2.locateFaces(r,l),WD=r=>pt.faceLandmark68Net.detectLandmarks(r),rQ=r=>pt.faceLandmark68TinyNet.detectLandmarks(r),oQ=r=>pt.faceRecognitionNet.computeFaceDescriptor(r),aQ=r=>pt.faceExpressionNet.predictExpressions(r),cQ=r=>pt.ageGenderNet.predictAgeAndGender(r),$D=r=>pt.ssdMobilenetv1.load(r),lQ=r=>pt.tinyFaceDetector.load(r),hQ=r=>pt.tinyYolov2.load(r),uQ=r=>pt.faceLandmark68Net.load(r),dQ=r=>pt.faceLandmark68TinyNet.load(r),pQ=r=>pt.faceRecognitionNet.load(r),mQ=r=>pt.faceExpressionNet.load(r),fQ=r=>pt.ageGenderNet.load(r),gQ=$D,yQ=_D,bQ=WD;class UD extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.extractedFaces=h}}class Zu extends UD{async run(){const r=await this.parentTask,l=await La(r,this.input,async h=>await Promise.all(h.map(d=>pt.faceExpressionNet.predictExpressions(d))),this.extractedFaces);return r.map((h,d)=>gg(h,l[d]))}withAgeAndGender(){return new Xu(this,this.input)}}class Qu extends UD{async run(){const r=await this.parentTask;if(!r)return;const l=await rl(r,this.input,h=>pt.faceExpressionNet.predictExpressions(h),this.extractedFaces);return gg(r,l)}withAgeAndGender(){return new Ju(this,this.input)}}class cl extends Zu{withAgeAndGender(){return new ol(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class ll extends Qu{withAgeAndGender(){return new al(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class BD extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.extractedFaces=h}}class Xu extends BD{async run(){const r=await this.parentTask,l=await La(r,this.input,async h=>await Promise.all(h.map(d=>pt.ageGenderNet.predictAgeAndGender(d))),this.extractedFaces);return r.map((h,d)=>{const{age:f,gender:g,genderProbability:S}=l[d];return Sg(Ig(h,g,S),f)})}withFaceExpressions(){return new Zu(this,this.input)}}class Ju extends BD{async run(){const r=await this.parentTask;if(!r)return;const{age:l,gender:h,genderProbability:d}=await rl(r,this.input,f=>pt.ageGenderNet.predictAgeAndGender(f),this.extractedFaces);return Sg(Ig(r,h,d),l)}withFaceExpressions(){return new Qu(this,this.input)}}class ol extends Xu{withFaceExpressions(){return new cl(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class al extends Ju{withFaceExpressions(){return new ll(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class Sx extends Ti{constructor(r,l){super();this.parentTask=r;this.input=l}}class Sa extends Sx{async run(){const r=await this.parentTask,l=await La(r,this.input,h=>Promise.all(h.map(d=>pt.faceRecognitionNet.computeFaceDescriptor(d))),null,h=>h.landmarks.align(null,{useDlibAlignment:!0}));return l.map((h,d)=>Lg(r[d],h))}withFaceExpressions(){return new cl(this,this.input)}withAgeAndGender(){return new ol(this,this.input)}}class Ia extends Sx{async run(){const r=await this.parentTask;if(!r)return;const l=await rl(r,this.input,h=>pt.faceRecognitionNet.computeFaceDescriptor(h),null,h=>h.landmarks.align(null,{useDlibAlignment:!0}));return Lg(r,l)}withFaceExpressions(){return new ll(this,this.input)}withAgeAndGender(){return new al(this,this.input)}}const ed=Ye(Je());class Ix extends Ti{constructor(r,l,h){super();this.parentTask=r;this.input=l;this.useTinyLandmarkNet=h}get landmarkNet(){return this.useTinyLandmarkNet?pt.faceLandmark68TinyNet:pt.faceLandmark68Net}}class xx extends Ix{async run(){const r=await this.parentTask,l=r.map(f=>f.detection),h=this.input instanceof ed.Tensor?await qc(this.input,l):await Yc(this.input,l),d=await Promise.all(h.map(f=>this.landmarkNet.detectLandmarks(f)));return h.forEach(f=>f instanceof ed.Tensor&&f.dispose()),r.map((f,g)=>el(f,d[g]))}withFaceExpressions(){return new cl(this,this.input)}withAgeAndGender(){return new ol(this,this.input)}withFaceDescriptors(){return new Sa(this,this.input)}}class Tx extends Ix{async run(){const r=await this.parentTask;if(!r)return;const{detection:l}=r,h=this.input instanceof ed.Tensor?await qc(this.input,[l]):await Yc(this.input,[l]),d=await this.landmarkNet.detectLandmarks(h[0]);return h.forEach(f=>f instanceof ed.Tensor&&f.dispose()),el(r,d)}withFaceExpressions(){return new ll(this,this.input)}withAgeAndGender(){return new al(this,this.input)}withFaceDescriptor(){return new Ia(this,this.input)}}class Ax extends Ti{constructor(r,l=new Ii){super();this.input=r;this.options=l}}class Tg extends Ax{async run(){const{input:r,options:l}=this,h=l instanceof wx?d=>pt.tinyFaceDetector.locateFaces(d,l):l instanceof Ii?d=>pt.ssdMobilenetv1.locateFaces(d,l):l instanceof Cr?d=>pt.tinyYolov2.locateFaces(d,l):null;if(!h)throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | MtcnnOptions | TinyYolov2Options");return h(r)}runAndExtendWithFaceDetections(){return new Promise(async r=>{const l=await this.run();return r(l.map(h=>sa({},h)))})}withFaceLandmarks(r=!1){return new xx(this.runAndExtendWithFaceDetections(),this.input,r)}withFaceExpressions(){return new Zu(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new Xu(this.runAndExtendWithFaceDetections(),this.input)}}class vx extends Ax{async run(){const r=await new Tg(this.input,this.options);let l=r[0];return r.forEach(h=>{h.score>l.score&&(l=h)}),l}runAndExtendWithFaceDetection(){return new Promise(async r=>{const l=await this.run();return r(l?sa({},l):void 0)})}withFaceLandmarks(r=!1){return new Tx(this.runAndExtendWithFaceDetection(),this.input,r)}withFaceExpressions(){return new Qu(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Ju(this.runAndExtendWithFaceDetection(),this.input)}}function wQ(r,l=new Ii){return new vx(r,l)}function Ag(r,l=new Ii){return new Tg(r,l)}async function MD(r,l){return console.warn("allFacesSsdMobilenetv1 is deprecated and will be removed soon, use the high level api instead"),await Ag(r,new Ii(l?{minConfidence:l}:{})).withFaceLandmarks().withFaceDescriptors()}async function LQ(r,l={}){return console.warn("allFacesTinyYolov2 is deprecated and will be removed soon, use the high level api instead"),await Ag(r,new Cr(l)).withFaceLandmarks().withFaceDescriptors()}const SQ=MD;function Nx(r,l){if(r.length!==l.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");const h=Array.from(r),d=Array.from(l);return Math.sqrt(h.map((f,g)=>f-d[g]).reduce((f,g)=>f+Math.pow(g,2),0))}class PD{constructor(r,l=.6){this._distanceThreshold=l;const h=Array.isArray(r)?r:[r];if(!h.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let d=1;const f=()=>`person ${d++}`;this._labeledDescriptors=h.map(g=>{if(g instanceof na)return g;if(g instanceof Float32Array)return new na(f(),[g]);if(g.descriptor&&g.descriptor instanceof Float32Array)return new na(f(),[g.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(h=>Nx(h,r)).reduce((h,d)=>h+d,0)/(l.length||1)}matchDescriptor(r){return this.labeledDescriptors.map(({descriptors:l,label:h})=>new km(h,this.computeMeanDistance(r,l))).reduce((l,h)=>l.distancer.toJSON())}}static fromJSON(r){const l=r.labeledDescriptors.map(h=>na.fromJSON(h));return new PD(l,r.distanceThreshold)}}function IQ(r){const l=new Ku;return l.extractWeights(r),l}function zD(r,l){const{width:h,height:d}=new ms(l.width,l.height);if(h<=0||d<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:h,height:d})}`);if(Array.isArray(r))return r.map(f=>zD(f,{width:h,height:d}));if(ba(r)){const f=r.detection.forSize(h,d),g=r.unshiftedLandmarks.forSize(f.box.width,f.box.height);return el(sa(r,f),g)}return Vi(r)?sa(r,r.detection.forSize(h,d)):r instanceof qs||r instanceof Yt?r.forSize(h,d):r}var GD="0.8.4";vc(exports,{AgeGenderNet:()=>dx,BoundingBox:()=>wu,Box:()=>Ct,ComposableTask:()=>Ti,ComputeAllFaceDescriptorsTask:()=>Sa,ComputeFaceDescriptorsTaskBase:()=>Sx,ComputeSingleFaceDescriptorTask:()=>Ia,DetectAllFaceLandmarksTask:()=>xx,DetectAllFacesTask:()=>Tg,DetectFaceLandmarksTaskBase:()=>Ix,DetectFacesTaskBase:()=>Ax,DetectSingleFaceLandmarksTask:()=>Tx,DetectSingleFaceTask:()=>vx,Dimensions:()=>ms,FACE_EXPRESSION_LABELS:()=>ax,FaceDetection:()=>Yt,FaceDetectionNet:()=>QZ,FaceExpressionNet:()=>cx,FaceExpressions:()=>ya,FaceLandmark68Net:()=>Gu,FaceLandmark68TinyNet:()=>px,FaceLandmarkNet:()=>UZ,FaceLandmarks:()=>qs,FaceLandmarks5:()=>BX,FaceLandmarks68:()=>Iu,FaceMatch:()=>km,FaceMatcher:()=>PD,FaceRecognitionNet:()=>Hu,Gender:()=>Tr,LabeledBox:()=>Fm,LabeledFaceDescriptors:()=>na,NetInput:()=>po,NeuralNetwork:()=>kn,ObjectDetection:()=>Oc,Point:()=>Ze,PredictedBox:()=>MX,Rect:()=>Su,SsdMobilenetv1:()=>nl,SsdMobilenetv1Options:()=>Ii,TinyFaceDetector:()=>Ku,TinyFaceDetectorOptions:()=>wx,TinyYolov2:()=>ju,TinyYolov2Options:()=>Cr,TinyYolov2SizeType:()=>bx,allFaces:()=>SQ,allFacesSsdMobilenetv1:()=>MD,allFacesTinyYolov2:()=>LQ,awaitMediaLoaded:()=>QS,bufferToImage:()=>eI,computeFaceDescriptor:()=>oQ,createCanvas:()=>Dc,createCanvasFromMedia:()=>Tu,createFaceDetectionNet:()=>ZZ,createFaceRecognitionNet:()=>PZ,createSsdMobilenetv1:()=>xD,createTinyFaceDetector:()=>IQ,createTinyYolov2:()=>nQ,detectAllFaces:()=>Ag,detectFaceLandmarks:()=>WD,detectFaceLandmarksTiny:()=>rQ,detectLandmarks:()=>bQ,detectSingleFace:()=>wQ,draw:()=>hx,env:()=>gt,euclideanDistance:()=>Nx,extendWithAge:()=>Sg,extendWithFaceDescriptor:()=>Lg,extendWithFaceDetection:()=>sa,extendWithFaceExpressions:()=>gg,extendWithFaceLandmarks:()=>el,extendWithGender:()=>Ig,extractFaceTensors:()=>qc,extractFaces:()=>Yc,fetchImage:()=>OZ,fetchJson:()=>ix,fetchNetWeights:()=>EZ,fetchOrThrow:()=>fa,getContext2dOrThrow:()=>es,getMediaDimensions:()=>ra,imageTensorToCanvas:()=>tI,imageToSquare:()=>sx,inverseSigmoid:()=>_X,iou:()=>zS,isMediaElement:()=>Um,isMediaLoaded:()=>xu,isWithAge:()=>zZ,isWithFaceDetection:()=>Vi,isWithFaceExpressions:()=>lx,isWithFaceLandmarks:()=>ba,isWithGender:()=>GZ,loadAgeGenderModel:()=>fQ,loadFaceDetectionModel:()=>gQ,loadFaceExpressionModel:()=>mQ,loadFaceLandmarkModel:()=>uQ,loadFaceLandmarkTinyModel:()=>dQ,loadFaceRecognitionModel:()=>pQ,loadSsdMobilenetv1Model:()=>$D,loadTinyFaceDetectorModel:()=>lQ,loadTinyYolov2Model:()=>hQ,loadWeightMap:()=>rx,locateFaces:()=>yQ,matchDimensions:()=>DZ,minBbox:()=>GS,nets:()=>pt,nonMaxSuppression:()=>VS,normalize:()=>yi,padToSquare:()=>HS,predictAgeAndGender:()=>cQ,recognizeFaceExpressions:()=>aQ,resizeResults:()=>zD,resolveInput:()=>ia,shuffleArray:()=>FX,sigmoid:()=>Lu,ssdMobilenetv1:()=>_D,tf:()=>xQ,tinyFaceDetector:()=>sQ,tinyYolov2:()=>iQ,toNetInput:()=>Rt,utils:()=>US,validateConfig:()=>gx,version:()=>vQ});const xQ=Ye(Je()),TQ=typeof process!="undefined",AQ=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",vQ={faceapi:GD,node:TQ,browser:AQ}; /** * @license * Copyright 2017 Google LLC. All Rights Reserved. diff --git a/dist/face-api.nobundle.js b/dist/face-api.node.nobundle.js similarity index 99% rename from dist/face-api.nobundle.js rename to dist/face-api.node.nobundle.js index 7bfbe5b..6016c3d 100644 --- a/dist/face-api.nobundle.js +++ b/dist/face-api.node.nobundle.js @@ -4289,7 +4289,7 @@ function resizeResults(results, dimensions) { } // package.json -var version = "0.8.3"; +var version = "0.8.4"; // src/index.ts __export(exports, { @@ -4419,4 +4419,4 @@ const tf42 = __toModule(require("@tensorflow/tfjs/dist/tf.es2017.js")); const node = typeof process !== "undefined"; const browser3 = typeof navigator !== "undefined" && typeof navigator.userAgent !== "undefined"; const version2 = {faceapi: version, node, browser: browser3}; -//# sourceMappingURL=face-api.nobundle.js.map +//# sourceMappingURL=face-api.node.nobundle.js.map diff --git a/dist/face-api.nobundle.js.map b/dist/face-api.node.nobundle.js.map similarity index 100% rename from dist/face-api.nobundle.js.map rename to dist/face-api.node.nobundle.js.map diff --git a/package.json b/package.json index d2b8962..e0328e7 100644 --- a/package.json +++ b/package.json @@ -12,10 +12,10 @@ "type": "module", "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-esm-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --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-esm-nobundle": "esbuild --bundle --format=esm --target=es2018 --platform=browser --sourcemap --outfile=./dist/face-api.esm.nobundle.js --log-level=error --tsconfig=./tsconfig.json --external:@tensorflow --external:util --external:string_decoder --external:fs --global-name=faceapi 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-node": "esbuild --bundle --format=cjs --target=es2018 --platform=node --minify --sourcemap --outfile=./dist/face-api.node.js --log-level=error --tsconfig=./tsconfig.json src/index.ts", - "build-node-nobundle": "esbuild --bundle --format=cjs --target=es2018 --platform=node --sourcemap --outfile=./dist/face-api.nobundle.js --external:@tensorflow --log-level=error --tsconfig=./tsconfig.json src/index.ts", + "build-node-nobundle": "esbuild --bundle --format=cjs --target=es2018 --platform=node --sourcemap --outfile=./dist/face-api.node.nobundle.js --external:@tensorflow --log-level=error --tsconfig=./tsconfig.json src/index.ts", "build": "rimraf build/* dist/* && tsc && npm run build-iife && npm run build-esm && npm run build-esm-nobundle && npm run build-node && npm run build-node-nobundle && ls -l dist/" }, "keywords": [