diff --git a/README.md b/README.md
index 7f1a9d6..4ca3e82 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ This is updated **face-api.js** with latest available TensorFlow/JS as the origi
Forked from [face-api.js](https://github.com/justadudewhohacks/face-api.js) version **0.22.2** released on March 22nd, 2020
-Currently based on **`TensorFlow/JS` 2.8.2**
+Currently based on **`TensorFlow/JS` 2.8.3**
### Why?
@@ -35,6 +35,7 @@ Unfortunately, changes ended up being too large for a simple pull request on ori
- Updated TensorFlow/JS dependencies since backends were removed from `@tensorflow/tfjs-core`
- Updated mobileNetv1 model due to `batchNorm()` dependency
- Added `version` class that returns JSON object with version of FaceAPI as well as linked TFJS
+- Added test/dev built-in HTTP & HTTPS Web server
- Removed `mtcnn` and `tinyYolov2` models as they were non-functional in latest public version of `Face-API`
*If there is a demand, I can re-implement them back.*
@@ -50,8 +51,12 @@ Which means valid models are **tinyFaceDetector** and **mobileNetv1**
### Browser
-Browser example that uses both models as well as all of the extensions is included in `/example/index.html`
-Example can be accessed directly using Git pages using URL:
+Browser example that uses static images and showcases both models as well as all of the extensions is included in `/example/index.html`
+Example can be accessed directly using Git pages using URL:
+
+Browser example that uses live webcam is included in `/example/webcam.html`
+Example can be accessed directly using Git pages using URL:
+
@@ -242,6 +247,37 @@ And then use with:
Pretrained models and their weights are includes in `./model`.
+
+
+
+
+## Test & Dev Web Server
+
+Built-in test&dev web server can be started using
+```shell
+npm run dev
+```
+
+By default it starts HTTP server on port 8000 and HTTPS server on port 8001 and can be accessed as:
+-
+-
+
+```json
+2021-01-10 08:39:00 INFO: @vladmandic/face-api version 0.10.2
+2021-01-10 08:39:00 INFO: User: vlado Platform: linux Arch: x64 Node: v15.4.0
+2021-01-10 08:39:00 INFO: Build: file startup all target: es2018
+2021-01-10 08:39:00 STATE: HTTP server listening: 8000
+2021-01-10 08:39:00 STATE: HTTP2 server listening: 8001
+2021-01-10 08:39:00 STATE: Monitoring: [ 'package.json', 'config.js', 'example', 'src', [length]: 4 ]
+2021-01-10 08:39:00 STATE: Monitoring: [ 'package.json', 'config.js', 'example', 'src', [length]: 4 ]
+2021-01-10 08:39:01 STATE: Build for: browserBundle type: tfjs: { modules: 1253, moduleBytes: 3997175, imports: 7, importBytes: 276, outputBytes: 1565414, outputFiles: 'dist/tfjs.esm.js' }
+2021-01-10 08:39:01 STATE: Build for: browserBundle type: iife: { imports: 160, importBytes: 1797487, outputBytes: 1699552, outputFiles: 'dist/face-api.js' }
+2021-01-10 08:39:01 STATE: Build for: browserBundle type: esm: { imports: 160, importBytes: 1797487, outputBytes: 1697086, outputFiles: 'dist/face-api.esm.js' }
+2021-01-10 08:39:01 INFO: Compile: [ 'src/index.ts', [length]: 1 ]
+```
+
+
+
## Build
@@ -272,19 +308,21 @@ npm run build
> @vladmandic/face-api@0.8.9 build /home/vlado/dev/face-api
> rimraf dist/* && node ./build.js
```
+
```json
-2020-12-02 16:31:23 INFO: @vladmandic/face-api version 0.8.9
-2020-12-02 16:31:23 INFO: User: vlado Platform: linux Arch: x64 Node: v15.0.1
-2020-12-02 16:31:23 INFO: Build: file startup all target: es2018
-2020-12-02 16:31:23 STATE: Build for: node type: tfjs: { imports: 1, importBytes: 39, outputBytes: 1042, outputFiles: 'dist/tfjs.esm.js' }
-2020-12-02 16:31:23 STATE: Build for: node type: node: { imports: 160, importBytes: 228038, outputBytes: 134190, outputFiles: 'dist/face-api.node.js' }
-2020-12-02 16:31:23 STATE: Build for: nodeGPU type: tfjs: { imports: 1, importBytes: 43, outputBytes: 1046, outputFiles: 'dist/tfjs.esm.js' }
-2020-12-02 16:31:23 STATE: Build for: nodeGPU type: node: { imports: 160, importBytes: 228042, outputBytes: 134198, outputFiles: 'dist/face-api.node-gpu.js' }
-2020-12-02 16:31:23 STATE: Build for: browserNoBundle type: tfjs: { imports: 1, importBytes: 1784, outputBytes: 244, outputFiles: 'dist/tfjs.esm.js' }
-2020-12-02 16:31:23 STATE: Build for: browserNoBundle type: esm: { imports: 160, importBytes: 227240, outputBytes: 131024, outputFiles: 'dist/face-api.esm-nobundle.js' }
-2020-12-02 16:31:24 STATE: Build for: browserBundle type: tfjs: { modules: 1045, moduleBytes: 3718721, imports: 7, importBytes: 1784, outputBytes: 1501677, outputFiles: 'dist/tfjs.esm.js' }
-2020-12-02 16:31:24 STATE: Build for: browserBundle type: iife: { imports: 162, importBytes: 1728673, modules: 576, moduleBytes: 1359851, outputBytes: 1903311, outputFiles: 'dist/face-api.js' }
-2020-12-02 16:31:25 STATE: Build for: browserBundle type: esm: { imports: 162, importBytes: 1728673, modules: 576, moduleBytes: 1359851, outputBytes: 1900836, outputFiles: 'dist/face-api.esm.js' }
+2021-01-10 08:42:01 INFO: @vladmandic/face-api version 0.10.2
+2021-01-10 08:42:01 INFO: User: vlado Platform: linux Arch: x64 Node: v15.4.0
+2021-01-10 08:42:01 INFO: Build: file startup all target: es2018
+2021-01-10 08:42:01 STATE: Build for: node type: tfjs: { imports: 1, importBytes: 143, outputBytes: 1042, outputFiles: 'dist/tfjs.esm.js' }
+2021-01-10 08:42:01 STATE: Build for: node type: node: { imports: 160, importBytes: 233115, outputBytes: 132266, outputFiles: 'dist/face-api.node.js' }
+2021-01-10 08:42:01 STATE: Build for: nodeGPU type: tfjs: { imports: 1, importBytes: 147, outputBytes: 1046, outputFiles: 'dist/tfjs.esm.js' }
+2021-01-10 08:42:01 STATE: Build for: nodeGPU type: node: { imports: 160, importBytes: 233119, outputBytes: 132274, outputFiles: 'dist/face-api.node-gpu.js' }
+2021-01-10 08:42:01 STATE: Build for: browserNoBundle type: tfjs: { imports: 1, importBytes: 276, outputBytes: 244, outputFiles: 'dist/tfjs.esm.js' }
+2021-01-10 08:42:01 STATE: Build for: browserNoBundle type: esm: { imports: 160, importBytes: 232317, outputBytes: 129069, outputFiles: 'dist/face-api.esm-nobundle.js' }
+2021-01-10 08:42:01 STATE: Build for: browserBundle type: tfjs: { modules: 1253, moduleBytes: 3997175, imports: 7, importBytes: 276, outputBytes: 1565414, outputFiles: 'dist/tfjs.esm.js' }
+2021-01-10 08:42:02 STATE: Build for: browserBundle type: iife: { imports: 160, importBytes: 1797487, outputBytes: 1699552, outputFiles: 'dist/face-api.js' }
+2021-01-10 08:42:02 STATE: Build for: browserBundle type: esm: { imports: 160, importBytes: 1797487, outputBytes: 1697086, outputFiles: 'dist/face-api.esm.js' }
+2021-01-10 08:42:02 INFO: Compile: [ 'src/index.ts', [length]: 1 ]```
```
diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js
index c939297..7252701 100644
--- a/dist/face-api.esm-nobundle.js
+++ b/dist/face-api.esm-nobundle.js
@@ -5,5 +5,5 @@
author: '
*/
-var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module,desc)=>{if(__markAsModule(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames(module))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc(module,key))||desc.enumerable});return target},__toModule=module=>module&&module.__esModule?module:__exportStar(__defProp(module!=null?__create(__getProtoOf(module)):{},"default",{value:module,enumerable:!0}),module);import*as dist_star from"@tensorflow/tfjs/dist/index.js";import*as tfjs_backend_wasm_star from"@tensorflow/tfjs-backend-wasm";var require_tfjs_esm=__commonJS(exports=>{__exportStar(exports,dist_star);__exportStar(exports,tfjs_backend_wasm_star)}),require_isNodejs=__commonJS((exports,module)=>{__export(exports,{isNodejs:()=>isNodejs2});function isNodejs2(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}}),tf42=__toModule(require_tfjs_esm()),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});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var 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});var tf=__toModule(require_tfjs_esm()),Dimensions=class{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)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.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){let f=10**prec;return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let 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&&!Number.isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&num>=0&&num<=1}var Point=class{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(this.x**2+this.y**2)}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}},Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){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=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),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)}`);let[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(){let[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(){let[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,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{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()}},BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{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})}},FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmountLocal=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmountLocal,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],tensorsToStack=[isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}},relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{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){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}={useDlibAlignment:!1,minBoxPadding:.2,...options};return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),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){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class 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)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!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}};var LabeledFaceDescriptors=class{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){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!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}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){return{...sourceObj,...{detection}}}function createBrowserEnv(){let fetch=window.fetch;if(!fetch)throw new Error("fetch - missing fetch implementation for browser environment");let readFile=()=>{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}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}return{readFile:fs?filePath=>new Promise((resolve,reject)=>{fs.readFile(filePath,(err,buffer)=>err?reject(err):resolve(buffer))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)}}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=()=>{if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=()=>{if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch,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}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var import_isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env2){environment=env2}function initialize(){return isBrowser()?setEnv(createBrowserEnv()):import_isNodejs.isNodejs()?setEnv(createNodejsEnv()):null}function monkeyPatch(env2){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env2;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env2.createCanvasElement||(()=>new Canvas),environment.createImageElement=env2.createImageElement||(()=>new Image),environment.ImageData=env2.ImageData||environment.ImageData,environment.Video=env2.Video||environment.Video,environment.fetch=env2.fetch||environment.fetch,environment.readFile=env2.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:import_isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}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={}));var DrawTextFieldOptions=class{constructor(options={}){let{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}},DrawTextField=class{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){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}},DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions({...defaultDrawLabelOptions,...drawLabelOptions})}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){(Array.isArray(detections)?detections:[detections]).forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onError(e){!e.currentTarget||(e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e))}function onLoad(e){!e.currentTarget||(e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e))}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{buf instanceof Blob||reject(new Error("bufferToImage - expected buf to be of type: Blob"));let reader=new FileReader;reader.onload=()=>{typeof reader.result!="string"&&reject(new Error("bufferToImage - expected reader.result to be a string, in onload"));let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require_tfjs_esm());function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let 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}let 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");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.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}`)});return tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3)})}};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");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):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)){let 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))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas);return detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height)).map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());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 tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0);return detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)).map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]))})}async function fetchOrThrow(url,init){let{fetch}=env.getEnv(),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}async function fetchImage(uri){let res=await fetchOrThrow(uri),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)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm()),tf8=__toModule(require_tfjs_esm()),NeuralNetwork=class{constructor(){this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{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 tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.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`);let 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`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(fp=>readFile(fp).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{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");let 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}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}},tf10=__toModule(require_tfjs_esm()),tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,filterSize,mappedPrefix)=>{let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,mappedPrefix)=>{let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm()),SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,mappedPrefix)=>{let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return prefix=>{let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return(originalPath,paramRank,mappedPath)=>{let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),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}}}function loadConvParamsFactory(extractWeightEntry){return prefix=>{let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),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)}},tf17=__toModule(require_tfjs_esm()),tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams2(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),fc=extractFCParamsFactory(extractWeights,paramMappings)(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap2(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams2(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap2(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}},FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{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)}},FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){return{...sourceObj,...{expressions}}}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){(Array.isArray(faceExpressions)?faceExpressions:[faceExpressions]).forEach(e=>{let 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");let resultsToDisplay=expr.asSortedArray().filter(exprLocal=>exprLocal.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0);new DrawTextField(resultsToDisplay.map(exprLocal=>`${exprLocal.expression} (${round(exprLocal.probability)})`),anchor).draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims);return{...sourceObj,...{landmarks,unshiftedLandmarks,alignedRect}}}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,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)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{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(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let 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){(Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks]).forEach(f=>{let 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)})}var version="0.10.1",tf20=__toModule(require_tfjs_esm()),tf19=__toModule(require_tfjs_esm());function extractorsFactory2(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams3(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory2(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),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}}}function loadParamsFactory2(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap3(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory2(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),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=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap3(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams3(weights,this._numMainBlocks)}};function extractParams4(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),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}}}}function extractParamsFromWeigthMap4(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams4(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap4(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm()),FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))))})}forwardInput(input){return tf21.tidy(()=>{let 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){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),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)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}},FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),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)}},FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}},FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm()),tf24=__toModule(require_tfjs_esm()),tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),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 tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams5(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory3(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{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},paramMappings}}function extractorsFactory4(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),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 extractParamsFromWeigthMap5(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory4(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),{fc}=weightMap;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let 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 disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3];if(pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2]){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(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);let globalAvg=out.mean([1,2]);return tf27.matMul(globalAvg,params.fc)})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap)}extractParams(weights){return extractParams5(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){return{...sourceObj,...{descriptor}}}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){return{...sourceObj,...{age}}}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){return{...sourceObj,...{gender,genderProbability}}}var tf34=__toModule(require_tfjs_esm()),tf28=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return 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`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),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(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0:{box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1:{box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2:{box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3:{box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4:{box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5:{box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5}}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams6(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory5(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),output_layer={extra_dim:tf28.tensor3d(extractWeights(5118*4),[1,5118,4])};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),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){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),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 extractParamsFromWeigthMap6(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory6(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm()),tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]);if([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].forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(!(selected.length>=outputSize)){let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou2=IOU(boxes,c.boxIndex,selected[j]);if(iou2!==0&&(c.score*=suppressFunc(iou2),c.score<=scoreThreshold))break}originalScore===c.score&&selected.push(c.boxIndex)}}),selected}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm()),tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||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}},SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{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={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),indices=nonMaxSuppression2(boxes,scoresData,maxResults,.5,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[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)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap6(weightMap)}extractParams(weights){return extractParams6(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{},IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.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)],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)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model",tf39=__toModule(require_tfjs_esm()),isNumber=arg=>typeof arg=="number";function validateConfig(config){if(!config)throw new Error(`invalid config: ${config}`);if(typeof config.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`);if(!isNumber(config.iouThreshold)||config.iouThreshold<0||config.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`);if(!Array.isArray(config.classes)||!config.classes.length||!config.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`);if(!Array.isArray(config.anchors)||!config.anchors.length||!config.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(config.anchors)}`);if(config.meanRgb&&(!Array.isArray(config.meanRgb)||config.meanRgb.length!==3||!config.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm()),tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv2(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams7(weights,config,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory7(extractWeights,paramMappings),params;if(config.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),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}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap7(weightMap,config){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory8(weightMap,paramMappings),params;if(config.withSeparableConvs){let numFilters=config.filterSizes&&config.filterSizes.length||9;params={conv0:config.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")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.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}},TinyYolov2Base2=class extends NeuralNetwork{constructor(config){super("TinyYolov2");validateConfig(config),this._config=config}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);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv2(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv2(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv2(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]);return nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0).map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions))}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap7(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,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 extractParams7(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,widthLocal=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,heightLocal=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-widthLocal/2,y=ctY-heightLocal/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+widthLocal,y+heightLocal),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,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=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config={withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"],...withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0}};super(config)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){return(await this.detect(input,forwardParams)).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)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}},ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}},tf41=__toModule(require_tfjs_esm()),tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,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)],MEAN_RGB=[117.001,114.697,97.404],TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){return(await this.detect(input,forwardParams)).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)}},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},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov2=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks,PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>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)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!!parentResult){let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!!parentResult){let{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)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask;return(await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}))).map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!!parentResult){let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}},DetectFaceLandmarksTaskBase=class 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}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),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)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!!parentResult){let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}},DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,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 resolve=>{let detections=await this.run();resolve(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async resolve=>{let detection=await this.run();resolve(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+diff**2,0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,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.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{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)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",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,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,tinyYolov2,toNetInput,utils_exports as utils,validateConfig,version2 as version};
+var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor;var __markAsModule=target=>__defProp(target,"__esModule",{value:!0});var __commonJS=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export=(target,all)=>{__markAsModule(target);for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__exportStar=(target,module,desc)=>{if(__markAsModule(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames(module))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc(module,key))||desc.enumerable});return target},__toModule=module=>module&&module.__esModule?module:__exportStar(__defProp(module!=null?__create(__getProtoOf(module)):{},"default",{value:module,enumerable:!0}),module);import*as dist_star from"@tensorflow/tfjs/dist/index.js";import*as tfjs_backend_wasm_star from"@tensorflow/tfjs-backend-wasm";var require_tfjs_esm=__commonJS(exports=>{__exportStar(exports,dist_star);__exportStar(exports,tfjs_backend_wasm_star)});var require_isNodejs=__commonJS((exports,module)=>{__export(exports,{isNodejs:()=>isNodejs2});function isNodejs2(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}});var tf42=__toModule(require_tfjs_esm());var 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});function drawContour(ctx,points,isClosed=!1){if(ctx.beginPath(),points.slice(1).forEach(({x,y},prevIdx)=>{let from=points[prevIdx];ctx.moveTo(from.x,from.y),ctx.lineTo(x,y)}),isClosed){let from=points[points.length-1],to=points[0];if(!from||!to)return;ctx.moveTo(from.x,from.y),ctx.lineTo(to.x,to.y)}ctx.stroke()}var 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});var tf=__toModule(require_tfjs_esm());var Dimensions=class{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)}};function isTensor(tensor2,dim){return tensor2 instanceof tf.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){let f=10**prec;return Math.floor(num*f)/f}function isDimensions(obj){return obj&&obj.width&&obj.height}function computeReshapedDimensions({width,height},inputSize){let 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&&!Number.isNaN(num)||num===0}function isValidProbablitiy(num){return isValidNumber(num)&&num>=0&&num<=1}var Point=class{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(this.x**2+this.y**2)}floor(){return new Point(Math.floor(this.x),Math.floor(this.y))}};var Box=class{static isRect(rect){return!!rect&&[rect.x,rect.y,rect.width,rect.height].every(isValidNumber)}static assertIsValidBox(box,callee,allowNegativeDimensions=!1){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=!0){let box=_box||{},isBbox=[box.left,box.top,box.right,box.bottom].every(isValidNumber),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)}`);let[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(){let[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(){let[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,diff=Math.abs(width-height);return widthimageWidth&&(edx=-ex+imageWidth+w,ex=imageWidth),ey>imageHeight&&(edy=-ey+imageHeight+h,ey=imageHeight),x<1&&(edy=2-x,x=1),y<1&&(edy=2-y,y=1),{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()}};var BoundingBox=class extends Box{constructor(left,top,right,bottom,allowNegativeDimensions=!1){super({left,top,right,bottom},allowNegativeDimensions)}};var ObjectDetection=class{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})}};var FaceDetection=class extends ObjectDetection{constructor(score,relativeBox,imageDims){super(score,score,"",relativeBox,imageDims)}forSize(width,height){let{score,relativeBox,imageDims}=super.forSize(width,height);return new FaceDetection(score,relativeBox,imageDims)}};function iou(box1,box2,isIOU=!0){let width=Math.max(0,Math.min(box1.right,box2.right)-Math.max(box1.left,box2.left)),height=Math.max(0,Math.min(box1.bottom,box2.bottom)-Math.max(box1.top,box2.top)),interSection=width*height;return isIOU?interSection/(box1.area+box2.area-interSection):interSection/Math.min(box1.area,box2.area)}function minBbox(pts){let xs=pts.map(pt=>pt.x),ys=pts.map(pt=>pt.y),minX=xs.reduce((min,x)=>xymaxmax({score,boxIndex})).sort((c1,c2)=>c1.score-c2.score).map(c=>c.boxIndex),pick=[];for(;indicesSortedByScore.length>0;){let curr=indicesSortedByScore.pop();pick.push(curr);let indices=indicesSortedByScore,outputs=[];for(let i=0;ioutputs[j]<=iouThreshold)}return pick}var tf2=__toModule(require_tfjs_esm());function normalize(x,meanRgb){return tf2.tidy(()=>{let[r,g,b]=meanRgb,avg_r=tf2.fill([...x.shape.slice(0,3),1],r,"float32"),avg_g=tf2.fill([...x.shape.slice(0,3),1],g,"float32"),avg_b=tf2.fill([...x.shape.slice(0,3),1],b,"float32"),avg_rgb=tf2.concat([avg_r,avg_g,avg_b],3);return tf2.sub(x,avg_rgb)})}var tf3=__toModule(require_tfjs_esm());function padToSquare(imgTensor,isCenterImage=!1){return tf3.tidy(()=>{let[height,width]=imgTensor.shape.slice(1);if(height===width)return imgTensor;let dimDiff=Math.abs(height-width),paddingAmount=Math.round(dimDiff*(isCenterImage?.5:1)),paddingAxis=height>width?2:1,createPaddingTensor=paddingAmountLocal=>{let paddingTensorShape=imgTensor.shape.slice();return paddingTensorShape[paddingAxis]=paddingAmountLocal,tf3.fill(paddingTensorShape,0,"float32")},paddingTensorAppend=createPaddingTensor(paddingAmount),remainingPaddingAmount=dimDiff-paddingTensorAppend.shape[paddingAxis],tensorsToStack=[isCenterImage&&remainingPaddingAmount?createPaddingTensor(remainingPaddingAmount):null,imgTensor,paddingTensorAppend].filter(t=>!!t).map(t=>tf3.cast(t,"float32"));return tf3.concat(tensorsToStack,paddingAxis)})}function shuffleArray(inputArray){let array=inputArray.slice();for(let i=array.length-1;i>0;i--){let j=Math.floor(Math.random()*(i+1)),x=array[i];array[i]=array[j],array[j]=x}return array}function sigmoid(x){return 1/(1+Math.exp(-x))}function inverseSigmoid(x){return Math.log(x/(1-x))}var Rect=class extends Box{constructor(x,y,width,height,allowNegativeDimensions=!1){super({x,y,width,height},allowNegativeDimensions)}};var relX=.5,relY=.43,relScale=.45,FaceLandmarks=class{constructor(relativeFaceLandmarkPositions,imgDims,shift=new Point(0,0)){let{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){let box=detection instanceof FaceDetection?detection.box.floor():new Box(detection);return this.shiftBy(box.x,box.y).align(null,options)}let{useDlibAlignment,minBoxPadding}={useDlibAlignment:!1,minBoxPadding:.2,...options};return useDlibAlignment?this.alignDlib():this.alignMinBbox(minBoxPadding)}alignDlib(){let centers=this.getRefPointsForAlignment(),[leftEyeCenter,rightEyeCenter,mouthCenter]=centers,distToMouth=pt=>mouthCenter.sub(pt).magnitude(),eyeToMouthDist=(distToMouth(leftEyeCenter)+distToMouth(rightEyeCenter))/2,size=Math.floor(eyeToMouthDist/relScale),refPoint=getCenterPoint(centers),x=Math.floor(Math.max(0,refPoint.x-relX*size)),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){let box=minBbox(this.positions);return box.pad(box.width*padding,box.height*padding)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var FaceLandmarks5=class extends FaceLandmarks{getRefPointsForAlignment(){let pts=this.positions;return[pts[0],pts[1],getCenterPoint([pts[3],pts[4]])]}};var FaceLandmarks68=class 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)}};var FaceMatch=class{constructor(label,distance){this._label=label,this._distance=distance}get label(){return this._label}get distance(){return this._distance}toString(withDistance=!0){return`${this.label}${withDistance?` (${round(this.distance)})`:""}`}};var LabeledBox=class extends Box{static assertIsValidLabeledBox(box,callee){if(Box.assertIsValidBox(box,callee),!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}};var LabeledFaceDescriptors=class{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){let descriptors=json.descriptors.map(d=>new Float32Array(d));return new LabeledFaceDescriptors(json.label,descriptors)}};var PredictedBox=class extends LabeledBox{static assertIsValidPredictedBox(box,callee){if(LabeledBox.assertIsValidLabeledBox(box,callee),!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}};function isWithFaceDetection(obj){return obj.detection instanceof FaceDetection}function extendWithFaceDetection(sourceObj,detection){return{...sourceObj,...{detection}}}function createBrowserEnv(){let fetch=window.fetch;if(!fetch)throw new Error("fetch - missing fetch implementation for browser environment");let readFile=()=>{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}}function createFileSystem(fs){let requireFsError="";if(!fs)try{fs=require("fs")}catch(err){requireFsError=err.toString()}return{readFile:fs?filePath=>new Promise((resolve,reject)=>{fs.readFile(filePath,(err,buffer)=>err?reject(err):resolve(buffer))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`)}}}function createNodejsEnv(){let Canvas=global.Canvas||global.HTMLCanvasElement,Image=global.Image||global.HTMLImageElement,createCanvasElement=()=>{if(Canvas)return new Canvas;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},createImageElement=()=>{if(Image)return new Image;throw new Error("createImageElement - missing Image implementation for nodejs environment")},fetch=global.fetch,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}}function isBrowser(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}var import_isNodejs=__toModule(require_isNodejs()),environment;function getEnv(){if(!environment)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return environment}function setEnv(env2){environment=env2}function initialize(){return isBrowser()?setEnv(createBrowserEnv()):import_isNodejs.isNodejs()?setEnv(createNodejsEnv()):null}function monkeyPatch(env2){if(environment||initialize(),!environment)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas=environment.Canvas,Image=environment.Image}=env2;environment.Canvas=Canvas,environment.Image=Image,environment.createCanvasElement=env2.createCanvasElement||(()=>new Canvas),environment.createImageElement=env2.createImageElement||(()=>new Image),environment.ImageData=env2.ImageData||environment.ImageData,environment.Video=env2.Video||environment.Video,environment.fetch=env2.fetch||environment.fetch,environment.readFile=env2.readFile||environment.readFile}var env={getEnv,setEnv,initialize,createBrowserEnv,createFileSystem,createNodejsEnv,monkeyPatch,isBrowser,isNodejs:import_isNodejs.isNodejs};initialize();function resolveInput(arg){return!env.isNodejs()&&typeof arg=="string"?document.getElementById(arg):arg}function getContext2dOrThrow(canvasArg){let{Canvas,CanvasRenderingContext2D:CanvasRenderingContext2D2}=env.getEnv();if(canvasArg instanceof CanvasRenderingContext2D2)return canvasArg;let canvas=resolveInput(canvasArg);if(!(canvas instanceof Canvas))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let ctx=canvas.getContext("2d");if(!ctx)throw new Error("resolveContext2d - canvas 2d context is null");return ctx}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={}));var DrawTextFieldOptions=class{constructor(options={}){let{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}},DrawTextField=class{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){let{padding}=this.options;return this.text.map(l=>ctx.measureText(l).width).reduce((w0,w1)=>w0{let x=padding+upperLeft.x,y=padding+upperLeft.y+(i+1)*fontSize;ctx.fillText(textLine,x,y)})}};var DrawBoxOptions=class{constructor(options={}){let{boxColor,lineWidth,label,drawLabelOptions}=options;this.boxColor=boxColor||"rgba(0, 0, 255, 1)",this.lineWidth=lineWidth||2,this.label=label;let defaultDrawLabelOptions={anchorPosition:AnchorPosition.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new DrawTextFieldOptions({...defaultDrawLabelOptions,...drawLabelOptions})}},DrawBox=class{constructor(box,options={}){this.box=new Box(box),this.options=new DrawBoxOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{boxColor,lineWidth}=this.options,{x,y,width,height}=this.box;ctx.strokeStyle=boxColor,ctx.lineWidth=lineWidth,ctx.strokeRect(x,y,width,height);let{label}=this.options;label&&new DrawTextField([label],{x:x-lineWidth/2,y},this.options.drawLabelOptions).draw(canvasArg)}};function drawDetections(canvasArg,detections){(Array.isArray(detections)?detections:[detections]).forEach(det=>{let score=det instanceof FaceDetection?det.score:isWithFaceDetection(det)?det.detection.score:void 0,box=det instanceof FaceDetection?det.box:isWithFaceDetection(det)?det.detection.box:new Box(det),label=score?`${round(score)}`:void 0;new DrawBox(box,{label}).draw(canvasArg)})}var tf18=__toModule(require_tfjs_esm());function isMediaLoaded(media){let{Image,Video}=env.getEnv();return media instanceof Image&&media.complete||media instanceof Video&&media.readyState>=3}function awaitMediaLoaded(media){return new Promise((resolve,reject)=>{if(media instanceof env.getEnv().Canvas||isMediaLoaded(media))return resolve(null);function onError(e){!e.currentTarget||(e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),reject(e))}function onLoad(e){!e.currentTarget||(e.currentTarget.removeEventListener("load",onLoad),e.currentTarget.removeEventListener("error",onError),resolve(e))}media.addEventListener("load",onLoad),media.addEventListener("error",onError)})}function bufferToImage(buf){return new Promise((resolve,reject)=>{buf instanceof Blob||reject(new Error("bufferToImage - expected buf to be of type: Blob"));let reader=new FileReader;reader.onload=()=>{typeof reader.result!="string"&&reject(new Error("bufferToImage - expected reader.result to be a string, in onload"));let img=env.getEnv().createImageElement();img.onload=()=>resolve(img),img.onerror=reject,img.src=reader.result},reader.onerror=reject,reader.readAsDataURL(buf)})}function getMediaDimensions(input){let{Image,Video}=env.getEnv();return input instanceof Image?new Dimensions(input.naturalWidth,input.naturalHeight):input instanceof Video?new Dimensions(input.videoWidth,input.videoHeight):new Dimensions(input.width,input.height)}function createCanvas({width,height}){let{createCanvasElement}=env.getEnv(),canvas=createCanvasElement();return canvas.width=width,canvas.height=height,canvas}function createCanvasFromMedia(media,dims){let{ImageData:ImageData2}=env.getEnv();if(!(media instanceof ImageData2)&&!isMediaLoaded(media))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width,height}=dims||getMediaDimensions(media),canvas=createCanvas({width,height});return media instanceof ImageData2?getContext2dOrThrow(canvas).putImageData(media,0,0):getContext2dOrThrow(canvas).drawImage(media,0,0,width,height),canvas}var tf4=__toModule(require_tfjs_esm());async function imageTensorToCanvas(imgTensor,canvas){let targetCanvas=canvas||env.getEnv().createCanvasElement(),[height,width,numChannels]=imgTensor.shape.slice(isTensor4D(imgTensor)?1:0),imgTensor3D=tf4.tidy(()=>imgTensor.as3D(height,width,numChannels).toInt());return await tf4.browser.toPixels(imgTensor3D,targetCanvas),imgTensor3D.dispose(),targetCanvas}function isMediaElement(input){let{Image,Canvas,Video}=env.getEnv();return input instanceof Image||input instanceof Canvas||input instanceof Video}var tf5=__toModule(require_tfjs_esm());function imageToSquare(input,inputSize,centerImage=!1){let{Image,Canvas}=env.getEnv();if(!(input instanceof Image||input instanceof Canvas))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");let dims=getMediaDimensions(input),scale2=inputSize/Math.max(dims.height,dims.width),width=scale2*dims.width,height=scale2*dims.height,targetCanvas=createCanvas({width:inputSize,height:inputSize}),inputCanvas=input instanceof Canvas?input:createCanvasFromMedia(input),offset=Math.abs(width-height)/2,dx=centerImage&&width{if(isTensor3D(input)){this._imageTensors[idx]=input,this._inputDimensions[idx]=input.shape;return}if(isTensor4D(input)){let 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}let 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");let width=this.getInputWidth(batchIdx),height=this.getInputHeight(batchIdx);return computeReshapedDimensions({width,height},this.inputSize)}toBatchTensor(inputSize,isCenterInputs=!0){return this._inputSize=inputSize,tf5.tidy(()=>{let inputTensors=range(this.batchSize,0,1).map(batchIdx=>{let input=this.getInput(batchIdx);if(input instanceof tf5.Tensor){let imgTensor=isTensor4D(input)?input:input.expandDims();return imgTensor=padToSquare(imgTensor,isCenterInputs),(imgTensor.shape[1]!==inputSize||imgTensor.shape[2]!==inputSize)&&(imgTensor=tf5.image.resizeBilinear(imgTensor,[inputSize,inputSize])),imgTensor.as3D(inputSize,inputSize,3)}if(input instanceof env.getEnv().Canvas)return tf5.browser.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}`)});return tf5.stack(inputTensors.map(t=>tf5.cast(t,"float32"))).as4D(this.batchSize,inputSize,inputSize,3)})}};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");let getIdxHint=idx=>Array.isArray(inputs)?` at input index ${idx}:`:"",inputArray=inputArgArray.map(resolveInput);return inputArray.forEach((input,i)=>{if(!isMediaElement(input)&&!isTensor3D(input)&&!isTensor4D(input))throw typeof inputArgArray[i]=="string"?new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`):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)){let 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))),new NetInput(inputArray,Array.isArray(inputs))}async function extractFaces(input,detections){let{Canvas}=env.getEnv(),canvas=input;if(!(input instanceof Canvas)){let netInput=await toNetInput(input);if(netInput.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let tensorOrCanvas=netInput.getInput(0);canvas=tensorOrCanvas instanceof Canvas?tensorOrCanvas:await imageTensorToCanvas(tensorOrCanvas)}let ctx=getContext2dOrThrow(canvas);return detections.map(det=>det instanceof FaceDetection?det.forSize(canvas.width,canvas.height).box.floor():det).map(box=>box.clipAtImageBorders(canvas.width,canvas.height)).map(({x,y,width,height})=>{let faceImg=createCanvas({width,height});return getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x,y,width,height),0,0),faceImg})}var tf6=__toModule(require_tfjs_esm());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 tf6.tidy(()=>{let[imgHeight,imgWidth,numChannels]=imageTensor.shape.slice(isTensor4D(imageTensor)?1:0);return detections.map(det=>det instanceof FaceDetection?det.forSize(imgWidth,imgHeight).box:det).map(box=>box.clipAtImageBorders(imgWidth,imgHeight)).map(({x,y,width,height})=>tf6.slice3d(imageTensor.as3D(imgHeight,imgWidth,numChannels),[y,x,0],[height,width,numChannels]))})}async function fetchOrThrow(url,init){let{fetch}=env.getEnv(),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}async function fetchImage(uri){let res=await fetchOrThrow(uri),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)}async function fetchJson(uri){return(await fetchOrThrow(uri)).json()}async function fetchNetWeights(uri){return new Float32Array(await(await fetchOrThrow(uri)).arrayBuffer())}var tf7=__toModule(require_tfjs_esm());function getModelUris(uri,defaultModelName){let defaultManifestFilename=`${defaultModelName}-weights_manifest.json`;if(!uri)return{modelBaseUri:"",manifestUri:defaultManifestFilename};if(uri==="/")return{modelBaseUri:"/",manifestUri:`/${defaultManifestFilename}`};let protocol=uri.startsWith("http://")?"http://":uri.startsWith("https://")?"https://":"";uri=uri.replace(protocol,"");let parts=uri.split("/").filter(s=>s),manifestFile=uri.endsWith(".json")?parts[parts.length-1]:defaultManifestFilename,modelBaseUri=protocol+(uri.endsWith(".json")?parts.slice(0,parts.length-1):parts).join("/");return modelBaseUri=uri.startsWith("/")?`/${modelBaseUri}`:modelBaseUri,{modelBaseUri,manifestUri:modelBaseUri==="/"?`/${manifestFile}`:`${modelBaseUri}/${manifestFile}`}}async function loadWeightMap(uri,defaultModelName){let{manifestUri,modelBaseUri}=getModelUris(uri,defaultModelName),manifest=await fetchJson(manifestUri);return tf7.io.loadWeights(manifest,modelBaseUri)}function matchDimensions(input,reference,useMediaDimensions=!1){let{width,height}=useMediaDimensions?getMediaDimensions(reference):reference;return input.width=width,input.height=height,{width,height}}var tf15=__toModule(require_tfjs_esm());var tf8=__toModule(require_tfjs_esm());var NeuralNetwork=class{constructor(){this._params=void 0;this._paramMappings=[]}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(paramPath){let{obj,objProp}=this.traversePropertyPath(paramPath);return obj[objProp]}reassignParamFromPath(paramPath,tensor2){let{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 tf8.Variable)}getFrozenParams(){return this.getParamList().filter(param=>!(param.tensor instanceof tf8.Variable))}variable(){this.getFrozenParams().forEach(({path,tensor:tensor2})=>{this.reassignParamFromPath(path,tensor2.variable())})}freeze(){this.getTrainableParams().forEach(({path,tensor:variable})=>{let tensor2=tf8.tensor(variable.dataSync());variable.dispose(),this.reassignParamFromPath(path,tensor2)})}dispose(throwOnRedispose=!0){this.getParamList().forEach(param=>{if(throwOnRedispose&¶m.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`);let 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`);let{readFile}=env.getEnv(),{manifestUri,modelBaseUri}=getModelUris(filePath,this.getDefaultModelName()),fetchWeightsFromDisk=filePaths=>Promise.all(filePaths.map(fp=>readFile(fp).then(buf=>buf.buffer))),loadWeights=tf8.io.weightsLoaderFactory(fetchWeightsFromDisk),manifest=JSON.parse((await readFile(manifestUri)).toString()),weightMap=await loadWeights(manifest,modelBaseUri);this.loadFromWeightMap(weightMap)}loadFromWeightMap(weightMap){let{paramMappings,params}=this.extractParamsFromWeigthMap(weightMap);this._paramMappings=paramMappings,this._params=params}extractWeights(weights){let{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");let 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}),{obj,objProp}=result;if(!obj||!objProp||!(obj[objProp]instanceof tf8.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);return{obj,objProp}}};var tf10=__toModule(require_tfjs_esm());var tf9=__toModule(require_tfjs_esm());function depthwiseSeparableConv(x,params,stride){return tf9.tidy(()=>{let out=tf9.separableConv2d(x,params.depthwise_filter,params.pointwise_filter,stride,"same");return out=tf9.add(out,params.bias),out})}function denseBlock3(x,denseBlockParams,isFirstLayer=!1){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,[2,2],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,[2,2])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,out3)))})}function denseBlock4(x,denseBlockParams,isFirstLayer=!1,isScaleDown=!0){return tf10.tidy(()=>{let out1=tf10.relu(isFirstLayer?tf10.add(tf10.conv2d(x,denseBlockParams.conv0.filters,isScaleDown?[2,2]:[1,1],"same"),denseBlockParams.conv0.bias):depthwiseSeparableConv(x,denseBlockParams.conv0,isScaleDown?[2,2]:[1,1])),out2=depthwiseSeparableConv(out1,denseBlockParams.conv1,[1,1]),in3=tf10.relu(tf10.add(out1,out2)),out3=depthwiseSeparableConv(in3,denseBlockParams.conv2,[1,1]),in4=tf10.relu(tf10.add(out1,tf10.add(out2,out3))),out4=depthwiseSeparableConv(in4,denseBlockParams.conv3,[1,1]);return tf10.relu(tf10.add(out1,tf10.add(out2,tf10.add(out3,out4))))})}var tf11=__toModule(require_tfjs_esm());function convLayer(x,params,padding="same",withRelu=!1){return tf11.tidy(()=>{let out=tf11.add(tf11.conv2d(x,params.filters,[1,1],padding),params.bias);return withRelu?tf11.relu(out):out})}function disposeUnusedWeightTensors(weightMap,paramMappings){Object.keys(weightMap).forEach(path=>{paramMappings.some(pm=>pm.originalPath===path)||weightMap[path].dispose()})}var tf12=__toModule(require_tfjs_esm());function extractConvParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,filterSize,mappedPrefix)=>{let filters=tf12.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf12.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}}var tf13=__toModule(require_tfjs_esm());function extractFCParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,mappedPrefix)=>{let fc_weights=tf13.tensor2d(extractWeights(channelsIn*channelsOut),[channelsIn,channelsOut]),fc_bias=tf13.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/bias`}),{weights:fc_weights,bias:fc_bias}}}var tf14=__toModule(require_tfjs_esm());var SeparableConvParams=class{constructor(depthwise_filter,pointwise_filter,bias){this.depthwise_filter=depthwise_filter;this.pointwise_filter=pointwise_filter;this.bias=bias}};function extractSeparableConvParamsFactory(extractWeights,paramMappings){return(channelsIn,channelsOut,mappedPrefix)=>{let depthwise_filter=tf14.tensor4d(extractWeights(3*3*channelsIn),[3,3,channelsIn,1]),pointwise_filter=tf14.tensor4d(extractWeights(channelsIn*channelsOut),[1,1,channelsIn,channelsOut]),bias=tf14.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/depthwise_filter`},{paramPath:`${mappedPrefix}/pointwise_filter`},{paramPath:`${mappedPrefix}/bias`}),new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function loadSeparableConvParamsFactory(extractWeightEntry){return prefix=>{let depthwise_filter=extractWeightEntry(`${prefix}/depthwise_filter`,4),pointwise_filter=extractWeightEntry(`${prefix}/pointwise_filter`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return new SeparableConvParams(depthwise_filter,pointwise_filter,bias)}}function extractWeightEntryFactory(weightMap,paramMappings){return(originalPath,paramRank,mappedPath)=>{let tensor2=weightMap[originalPath];if(!isTensor(tensor2,paramRank))throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`);return paramMappings.push({originalPath,paramPath:mappedPath||originalPath}),tensor2}}function extractWeightsFactory(weights){let remainingWeights=weights;function extractWeights(numWeights){let ret=remainingWeights.slice(0,numWeights);return remainingWeights=remainingWeights.slice(numWeights),ret}function getRemainingWeights(){return remainingWeights}return{extractWeights,getRemainingWeights}}function extractorsFactory(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv0`):extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/conv0`),conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv1`),conv22=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer=!1){let{conv0,conv1,conv2:conv22}=extractDenseBlock3Params(channelsIn,channelsOut,mappedPrefix,isFirstLayer),conv3=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParams(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock4Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock4Params(3,32,"dense0",!0),dense1=extractDenseBlock4Params(32,64,"dense1"),dense2=extractDenseBlock4Params(64,128,"dense2"),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}}}function loadConvParamsFactory(extractWeightEntry){return prefix=>{let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}}function loadParamsFactory(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractDenseBlock3Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`);return{conv0,conv1,conv2:conv22}}function extractDenseBlock4Params(prefix,isFirstLayer=!1){let conv0=isFirstLayer?extractConvParams(`${prefix}/conv0`):extractSeparableConvParams(`${prefix}/conv0`),conv1=extractSeparableConvParams(`${prefix}/conv1`),conv22=extractSeparableConvParams(`${prefix}/conv2`),conv3=extractSeparableConvParams(`${prefix}/conv3`);return{conv0,conv1,conv2:conv22,conv3}}return{extractDenseBlock3Params,extractDenseBlock4Params}}function extractParamsFromWeigthMap(weightMap){let paramMappings=[],{extractDenseBlock4Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock4Params("dense0",!0),dense1:extractDenseBlock4Params("dense1"),dense2:extractDenseBlock4Params("dense2"),dense3:extractDenseBlock4Params("dense3")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var FaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("FaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceFeatureExtractor - load model before inference");return tf15.tidy(()=>{let batchTensor=tf15.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf15.scalar(255)),out=denseBlock4(normalized,params.dense0,!0);return out=denseBlock4(out,params.dense1),out=denseBlock4(out,params.dense2),out=denseBlock4(out,params.dense3),out=tf15.avgPool(out,[7,7],[2,2],"valid"),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)}};var tf17=__toModule(require_tfjs_esm());var tf16=__toModule(require_tfjs_esm());function fullyConnectedLayer(x,params){return tf16.tidy(()=>tf16.add(tf16.matMul(x,params.weights),params.bias))}function extractParams2(weights,channelsIn,channelsOut){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),fc=extractFCParamsFactory(extractWeights,paramMappings)(channelsIn,channelsOut,"fc");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{fc}}}function extractParamsFromWeigthMap2(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:extractFcParams("fc")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function seperateWeightMaps(weightMap){let featureExtractorMap={},classifierMap={};return Object.keys(weightMap).forEach(key=>{let map=key.startsWith("fc")?classifierMap:featureExtractorMap;map[key]=weightMap[key]}),{featureExtractorMap,classifierMap}}var FaceProcessor=class extends NeuralNetwork{constructor(_name,faceFeatureExtractor){super(_name);this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf17.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input;return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0],-1),params.fc)})}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams2(weights,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap2(classifierMap)}extractParams(weights){let cIn=this.getClassifierChannelsIn(),cOut=this.getClassifierChannelsOut(),classifierWeightSize=cOut*cIn+cOut,featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var FACE_EXPRESSION_LABELS=["neutral","happy","sad","angry","fearful","disgusted","surprised"],FaceExpressions=class{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)}};var FaceExpressionNet=class extends FaceProcessor{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceExpressionNet",faceFeatureExtractor)}forwardInput(input){return tf18.tidy(()=>tf18.softmax(this.runNet(input)))}async forward(input){return this.forwardInput(await toNetInput(input))}async predictExpressions(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),probabilitesByBatch=await Promise.all(tf18.unstack(out).map(async t=>{let data=await t.data();return t.dispose(),data}));out.dispose();let predictionsByBatch=probabilitesByBatch.map(probabilites=>new FaceExpressions(probabilites));return netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function isWithFaceExpressions(obj){return obj.expressions instanceof FaceExpressions}function extendWithFaceExpressions(sourceObj,expressions){return{...sourceObj,...{expressions}}}function drawFaceExpressions(canvasArg,faceExpressions,minConfidence=.1,textFieldAnchor){(Array.isArray(faceExpressions)?faceExpressions:[faceExpressions]).forEach(e=>{let 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");let resultsToDisplay=expr.asSortedArray().filter(exprLocal=>exprLocal.probability>minConfidence),anchor=isWithFaceDetection(e)?e.detection.box.bottomLeft:textFieldAnchor||new Point(0,0);new DrawTextField(resultsToDisplay.map(exprLocal=>`${exprLocal.expression} (${round(exprLocal.probability)})`),anchor).draw(canvasArg)})}function isWithFaceLandmarks(obj){return isWithFaceDetection(obj)&&obj.landmarks instanceof FaceLandmarks&&obj.unshiftedLandmarks instanceof FaceLandmarks&&obj.alignedRect instanceof FaceDetection}function extendWithFaceLandmarks(sourceObj,unshiftedLandmarks){let{box:shift}=sourceObj.detection,landmarks=unshiftedLandmarks.shiftBy(shift.x,shift.y),rect=landmarks.align(),{imageDims}=sourceObj.detection,alignedRect=new FaceDetection(sourceObj.detection.score,rect.rescale(imageDims.reverse()),imageDims);return{...sourceObj,...{landmarks,unshiftedLandmarks,alignedRect}}}var DrawFaceLandmarksOptions=class{constructor(options={}){let{drawLines=!0,drawPoints=!0,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)"}},DrawFaceLandmarks=class{constructor(faceLandmarks,options={}){this.faceLandmarks=faceLandmarks,this.options=new DrawFaceLandmarksOptions(options)}draw(canvasArg){let ctx=getContext2dOrThrow(canvasArg),{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(),!0),drawContour(ctx,this.faceLandmarks.getRightEye(),!0),drawContour(ctx,this.faceLandmarks.getMouth(),!0)),drawPoints){ctx.strokeStyle=pointColor,ctx.fillStyle=pointColor;let 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){(Array.isArray(faceLandmarks)?faceLandmarks:[faceLandmarks]).forEach(f=>{let 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)})}var version="0.10.2";var tf20=__toModule(require_tfjs_esm());var tf19=__toModule(require_tfjs_esm());function extractorsFactory2(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings),extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);function extractReductionBlockParams(channelsIn,channelsOut,mappedPrefix){let separable_conv0=extractSeparableConvParams(channelsIn,channelsOut,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channelsOut,channelsOut,`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(channels,mappedPrefix){let separable_conv0=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(channels,channels,`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParams3(weights,numMainBlocks){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=extractorsFactory2(extractWeights,paramMappings),entry_flow_conv_in=extractConvParams(3,32,3,"entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams(32,64,"entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams(64,128,"entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(128,`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams(128,256,"exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams(256,512,"exit_flow/separable_conv"),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}}}function loadParamsFactory2(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings),extractConvParams=loadConvParamsFactory(extractWeightEntry),extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);function extractReductionBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),expansion_conv=extractConvParams(`${mappedPrefix}/expansion_conv`);return{separable_conv0,separable_conv1,expansion_conv}}function extractMainBlockParams(mappedPrefix){let separable_conv0=extractSeparableConvParams(`${mappedPrefix}/separable_conv0`),separable_conv1=extractSeparableConvParams(`${mappedPrefix}/separable_conv1`),separable_conv2=extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);return{separable_conv0,separable_conv1,separable_conv2}}return{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}}function extractParamsFromWeigthMap3(weightMap,numMainBlocks){let paramMappings=[],{extractConvParams,extractSeparableConvParams,extractReductionBlockParams,extractMainBlockParams}=loadParamsFactory2(weightMap,paramMappings),entry_flow_conv_in=extractConvParams("entry_flow/conv_in"),entry_flow_reduction_block_0=extractReductionBlockParams("entry_flow/reduction_block_0"),entry_flow_reduction_block_1=extractReductionBlockParams("entry_flow/reduction_block_1"),entry_flow={conv_in:entry_flow_conv_in,reduction_block_0:entry_flow_reduction_block_0,reduction_block_1:entry_flow_reduction_block_1},middle_flow={};range(numMainBlocks,0,1).forEach(idx=>{middle_flow[`main_block_${idx}`]=extractMainBlockParams(`middle_flow/main_block_${idx}`)});let exit_flow_reduction_block=extractReductionBlockParams("exit_flow/reduction_block"),exit_flow_separable_conv=extractSeparableConvParams("exit_flow/separable_conv"),exit_flow={reduction_block:exit_flow_reduction_block,separable_conv:exit_flow_separable_conv};return disposeUnusedWeightTensors(weightMap,paramMappings),{params:{entry_flow,middle_flow,exit_flow},paramMappings}}function conv(x,params,stride){return tf19.add(tf19.conv2d(x,params.filters,stride,"same"),params.bias)}function reductionBlock(x,params,isActivateInput=!0){let out=isActivateInput?tf19.relu(x):x;return out=depthwiseSeparableConv(out,params.separable_conv0,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=tf19.maxPool(out,[3,3],[2,2],"same"),out=tf19.add(out,conv(x,params.expansion_conv,[2,2])),out}function mainBlock(x,params){let out=depthwiseSeparableConv(tf19.relu(x),params.separable_conv0,[1,1]);return out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv1,[1,1]),out=depthwiseSeparableConv(tf19.relu(out),params.separable_conv2,[1,1]),out=tf19.add(out,x),out}var TinyXception=class extends NeuralNetwork{constructor(numMainBlocks){super("TinyXception");this._numMainBlocks=numMainBlocks}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyXception - load model before inference");return tf19.tidy(()=>{let batchTensor=tf19.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf19.scalar(256)),out=tf19.relu(conv(normalized,params.entry_flow.conv_in,[2,2]));return out=reductionBlock(out,params.entry_flow.reduction_block_0,!1),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=tf19.relu(depthwiseSeparableConv(out,params.exit_flow.separable_conv,[1,1])),out})}async forward(input){return this.forwardInput(await toNetInput(input))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap3(weightMap,this._numMainBlocks)}extractParams(weights){return extractParams3(weights,this._numMainBlocks)}};function extractParams4(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),extractFCParams=extractFCParamsFactory(extractWeights,paramMappings),age=extractFCParams(512,1,"fc/age"),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}}}}function extractParamsFromWeigthMap4(weightMap){let paramMappings=[],extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractFcParams(prefix){let weights=extractWeightEntry(`${prefix}/weights`,2),bias=extractWeightEntry(`${prefix}/bias`,1);return{weights,bias}}let params={fc:{age:extractFcParams("fc/age"),gender:extractFcParams("fc/gender")}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var Gender;(function(Gender2){Gender2.FEMALE="female",Gender2.MALE="male"})(Gender||(Gender={}));var AgeGenderNet=class extends NeuralNetwork{constructor(faceFeatureExtractor=new TinyXception(2)){super("AgeGenderNet");this._faceFeatureExtractor=faceFeatureExtractor}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(input){let{params}=this;if(!params)throw new Error(`${this._name} - load model before inference`);return tf20.tidy(()=>{let bottleneckFeatures=input instanceof NetInput?this.faceFeatureExtractor.forwardInput(input):input,pooled=tf20.avgPool(bottleneckFeatures,[7,7],[2,2],"valid").as2D(bottleneckFeatures.shape[0],-1),age=fullyConnectedLayer(pooled,params.fc.age).as1D(),gender=fullyConnectedLayer(pooled,params.fc.gender);return{age,gender}})}forwardInput(input){return tf20.tidy(()=>{let{age,gender}=this.runNet(input);return{age,gender:tf20.softmax(gender)}})}async forward(input){return this.forwardInput(await toNetInput(input))}async predictAgeAndGender(input){let netInput=await toNetInput(input),out=await this.forwardInput(netInput),ages=tf20.unstack(out.age),genders=tf20.unstack(out.gender),ageAndGenderTensors=ages.map((ageTensor,i)=>({ageTensor,genderTensor:genders[i]})),predictionsByBatch=await Promise.all(ageAndGenderTensors.map(async({ageTensor,genderTensor})=>{let age=(await ageTensor.data())[0],probMale=(await genderTensor.data())[0],isMale=probMale>.5,gender=isMale?Gender.MALE:Gender.FEMALE,genderProbability=isMale?probMale:1-probMale;return ageTensor.dispose(),genderTensor.dispose(),{age,gender,genderProbability}}));return out.age.dispose(),out.gender.dispose(),netInput.isBatchInput?predictionsByBatch:predictionsByBatch[0]}getDefaultModelName(){return"age_gender_model"}dispose(throwOnRedispose=!0){this.faceFeatureExtractor.dispose(throwOnRedispose),super.dispose(throwOnRedispose)}loadClassifierParams(weights){let{params,paramMappings}=this.extractClassifierParams(weights);this._params=params,this._paramMappings=paramMappings}extractClassifierParams(weights){return extractParams4(weights)}extractParamsFromWeigthMap(weightMap){let{featureExtractorMap,classifierMap}=seperateWeightMaps(weightMap);return this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap),extractParamsFromWeigthMap4(classifierMap)}extractParams(weights){let classifierWeightSize=512*1+1+(512*2+2),featureExtractorWeights=weights.slice(0,weights.length-classifierWeightSize),classifierWeights=weights.slice(weights.length-classifierWeightSize);return this.faceFeatureExtractor.extractWeights(featureExtractorWeights),this.extractClassifierParams(classifierWeights)}};var tf21=__toModule(require_tfjs_esm());var FaceLandmark68NetBase=class extends FaceProcessor{postProcess(output,inputSize,originalDimensions){let inputDimensions=originalDimensions.map(({width,height})=>{let scale2=inputSize/Math.max(height,width);return{width:width*scale2,height:height*scale2}}),batchSize=inputDimensions.length;return tf21.tidy(()=>{let createInterleavedTensor=(fillX,fillY)=>tf21.stack([tf21.fill([68],fillX,"float32"),tf21.fill([68],fillY,"float32")],1).as2D(1,136).as1D(),getPadding=(batchIdx,cond)=>{let{width,height}=inputDimensions[batchIdx];return cond(width,height)?Math.abs(width-height)/2:0},getPaddingX=batchIdx=>getPadding(batchIdx,(w,h)=>wgetPadding(batchIdx,(w,h)=>hcreateInterleavedTensor(getPaddingX(batchIdx),getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize),(_,batchIdx)=>createInterleavedTensor(inputDimensions[batchIdx].width,inputDimensions[batchIdx].height))))})}forwardInput(input){return tf21.tidy(()=>{let 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){let netInput=await toNetInput(input),landmarkTensors=tf21.tidy(()=>tf21.unstack(this.forwardInput(netInput))),landmarksForBatch=await Promise.all(landmarkTensors.map(async(landmarkTensor,batchIdx)=>{let landmarksArray=Array.from(await landmarkTensor.data()),xCoords=landmarksArray.filter((_,i)=>isEven(i)),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)})}));return landmarkTensors.forEach(t=>t.dispose()),netInput.isBatchInput?landmarksForBatch:landmarksForBatch[0]}getClassifierChannelsOut(){return 136}};var FaceLandmark68Net=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new FaceFeatureExtractor){super("FaceLandmark68Net",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};var tf22=__toModule(require_tfjs_esm());function extractParamsFromWeigthMapTiny(weightMap){let paramMappings=[],{extractDenseBlock3Params}=loadParamsFactory(weightMap,paramMappings),params={dense0:extractDenseBlock3Params("dense0",!0),dense1:extractDenseBlock3Params("dense1"),dense2:extractDenseBlock3Params("dense2")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}function extractParamsTiny(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractDenseBlock3Params}=extractorsFactory(extractWeights,paramMappings),dense0=extractDenseBlock3Params(3,32,"dense0",!0),dense1=extractDenseBlock3Params(32,64,"dense1"),dense2=extractDenseBlock3Params(64,128,"dense2");if(getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{paramMappings,params:{dense0,dense1,dense2}}}var TinyFaceFeatureExtractor=class extends NeuralNetwork{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(input){let{params}=this;if(!params)throw new Error("TinyFaceFeatureExtractor - load model before inference");return tf22.tidy(()=>{let batchTensor=tf22.cast(input.toBatchTensor(112,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf22.scalar(255)),out=denseBlock3(normalized,params.dense0,!0);return out=denseBlock3(out,params.dense1),out=denseBlock3(out,params.dense2),out=tf22.avgPool(out,[14,14],[2,2],"valid"),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)}};var FaceLandmark68TinyNet=class extends FaceLandmark68NetBase{constructor(faceFeatureExtractor=new TinyFaceFeatureExtractor){super("FaceLandmark68TinyNet",faceFeatureExtractor)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var FaceLandmarkNet=class extends FaceLandmark68Net{};var tf27=__toModule(require_tfjs_esm());var tf24=__toModule(require_tfjs_esm());var tf23=__toModule(require_tfjs_esm());function scale(x,params){return tf23.add(tf23.mul(x,params.weights),params.biases)}function convLayer2(x,params,strides,withRelu,padding="same"){let{filters,bias}=params.conv,out=tf24.conv2d(x,filters,strides,padding);return out=tf24.add(out,bias),out=scale(out,params.scale),withRelu?tf24.relu(out):out}function conv2(x,params){return convLayer2(x,params,[1,1],!0)}function convNoRelu(x,params){return convLayer2(x,params,[1,1],!1)}function convDown(x,params){return convLayer2(x,params,[2,2],!0,"valid")}var tf25=__toModule(require_tfjs_esm());function extractorsFactory3(extractWeights,paramMappings){function extractFilterValues(numFilterValues,numFilters,filterSize){let weights=extractWeights(numFilterValues),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 tf25.tidy(()=>tf25.transpose(tf25.tensor4d(weights,[numFilters,depth,filterSize,filterSize]),[2,3,1,0]))}function extractConvParams(numFilterValues,numFilters,filterSize,mappedPrefix){let filters=extractFilterValues(numFilterValues,numFilters,filterSize),bias=tf25.tensor1d(extractWeights(numFilters));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/bias`}),{filters,bias}}function extractScaleLayerParams(numWeights,mappedPrefix){let weights=tf25.tensor1d(extractWeights(numWeights)),biases=tf25.tensor1d(extractWeights(numWeights));return paramMappings.push({paramPath:`${mappedPrefix}/weights`},{paramPath:`${mappedPrefix}/biases`}),{weights,biases}}function extractConvLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix){let conv3=extractConvParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv`),scale2=extractScaleLayerParams(numFilters,`${mappedPrefix}/scale`);return{conv:conv3,scale:scale2}}function extractResidualLayerParams(numFilterValues,numFilters,filterSize,mappedPrefix,isDown=!1){let conv1=extractConvLayerParams((isDown?.5:1)*numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv1`),conv22=extractConvLayerParams(numFilterValues,numFilters,filterSize,`${mappedPrefix}/conv2`);return{conv1,conv2:conv22}}return{extractConvLayerParams,extractResidualLayerParams}}function extractParams5(weights){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory3(extractWeights,paramMappings),conv32_down=extractConvLayerParams(4704,32,7,"conv32_down"),conv32_1=extractResidualLayerParams(9216,32,3,"conv32_1"),conv32_2=extractResidualLayerParams(9216,32,3,"conv32_2"),conv32_3=extractResidualLayerParams(9216,32,3,"conv32_3"),conv64_down=extractResidualLayerParams(36864,64,3,"conv64_down",!0),conv64_1=extractResidualLayerParams(36864,64,3,"conv64_1"),conv64_2=extractResidualLayerParams(36864,64,3,"conv64_2"),conv64_3=extractResidualLayerParams(36864,64,3,"conv64_3"),conv128_down=extractResidualLayerParams(147456,128,3,"conv128_down",!0),conv128_1=extractResidualLayerParams(147456,128,3,"conv128_1"),conv128_2=extractResidualLayerParams(147456,128,3,"conv128_2"),conv256_down=extractResidualLayerParams(589824,256,3,"conv256_down",!0),conv256_1=extractResidualLayerParams(589824,256,3,"conv256_1"),conv256_2=extractResidualLayerParams(589824,256,3,"conv256_2"),conv256_down_out=extractResidualLayerParams(589824,256,3,"conv256_down_out"),fc=tf25.tidy(()=>tf25.transpose(tf25.tensor2d(extractWeights(256*128),[128,256]),[1,0]));if(paramMappings.push({paramPath:"fc"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{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},paramMappings}}function extractorsFactory4(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractScaleLayerParams(prefix){let weights=extractWeightEntry(`${prefix}/scale/weights`,1),biases=extractWeightEntry(`${prefix}/scale/biases`,1);return{weights,biases}}function extractConvLayerParams(prefix){let filters=extractWeightEntry(`${prefix}/conv/filters`,4),bias=extractWeightEntry(`${prefix}/conv/bias`,1),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 extractParamsFromWeigthMap5(weightMap){let paramMappings=[],{extractConvLayerParams,extractResidualLayerParams}=extractorsFactory4(weightMap,paramMappings),conv32_down=extractConvLayerParams("conv32_down"),conv32_1=extractResidualLayerParams("conv32_1"),conv32_2=extractResidualLayerParams("conv32_2"),conv32_3=extractResidualLayerParams("conv32_3"),conv64_down=extractResidualLayerParams("conv64_down"),conv64_1=extractResidualLayerParams("conv64_1"),conv64_2=extractResidualLayerParams("conv64_2"),conv64_3=extractResidualLayerParams("conv64_3"),conv128_down=extractResidualLayerParams("conv128_down"),conv128_1=extractResidualLayerParams("conv128_1"),conv128_2=extractResidualLayerParams("conv128_2"),conv256_down=extractResidualLayerParams("conv256_down"),conv256_1=extractResidualLayerParams("conv256_1"),conv256_2=extractResidualLayerParams("conv256_2"),conv256_down_out=extractResidualLayerParams("conv256_down_out"),{fc}=weightMap;if(paramMappings.push({originalPath:"fc",paramPath:"fc"}),!isTensor2D(fc))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);let 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 disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf26=__toModule(require_tfjs_esm());function residual(x,params){let out=conv2(x,params.conv1);return out=convNoRelu(out,params.conv2),out=tf26.add(out,x),out=tf26.relu(out),out}function residualDown(x,params){let out=convDown(x,params.conv1);out=convNoRelu(out,params.conv2);let pooled=tf26.avgPool(x,2,2,"valid"),zeros2=tf26.zeros(pooled.shape),isPad=pooled.shape[3]!==out.shape[3];if(pooled.shape[1]!==out.shape[1]||pooled.shape[2]!==out.shape[2]){let padShapeX=[...out.shape];padShapeX[1]=1;let zerosW=tf26.zeros(padShapeX);out=tf26.concat([out,zerosW],1);let padShapeY=[...out.shape];padShapeY[2]=1;let zerosH=tf26.zeros(padShapeY);out=tf26.concat([out,zerosH],2)}return pooled=isPad?tf26.concat([pooled,zeros2],3):pooled,out=tf26.add(pooled,out),out=tf26.relu(out),out}var FaceRecognitionNet=class extends NeuralNetwork{constructor(){super("FaceRecognitionNet")}forwardInput(input){let{params}=this;if(!params)throw new Error("FaceRecognitionNet - load model before inference");return tf27.tidy(()=>{let batchTensor=tf27.cast(input.toBatchTensor(150,!0),"float32"),normalized=normalize(batchTensor,[122.782,117.001,104.298]).div(tf27.scalar(256)),out=convDown(normalized,params.conv32_down);out=tf27.maxPool(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);let globalAvg=out.mean([1,2]);return tf27.matMul(globalAvg,params.fc)})}async forward(input){return this.forwardInput(await toNetInput(input))}async computeFaceDescriptor(input){let netInput=await toNetInput(input),faceDescriptorTensors=tf27.tidy(()=>tf27.unstack(this.forwardInput(netInput))),faceDescriptorsForBatch=await Promise.all(faceDescriptorTensors.map(t=>t.data()));return faceDescriptorTensors.forEach(t=>t.dispose()),netInput.isBatchInput?faceDescriptorsForBatch:faceDescriptorsForBatch[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap5(weightMap)}extractParams(weights){return extractParams5(weights)}};function createFaceRecognitionNet(weights){let net=new FaceRecognitionNet;return net.extractWeights(weights),net}function extendWithFaceDescriptor(sourceObj,descriptor){return{...sourceObj,...{descriptor}}}function isWithAge(obj){return typeof obj.age=="number"}function extendWithAge(sourceObj,age){return{...sourceObj,...{age}}}function isWithGender(obj){return(obj.gender===Gender.MALE||obj.gender===Gender.FEMALE)&&isValidProbablitiy(obj.genderProbability)}function extendWithGender(sourceObj,gender,genderProbability){return{...sourceObj,...{gender,genderProbability}}}var tf34=__toModule(require_tfjs_esm());var tf28=__toModule(require_tfjs_esm());function extractorsFactory5(extractWeights,paramMappings){function extractDepthwiseConvParams(numChannels,mappedPrefix){let filters=tf28.tensor4d(extractWeights(3*3*numChannels),[3,3,numChannels,1]),batch_norm_scale=tf28.tensor1d(extractWeights(numChannels)),batch_norm_offset=tf28.tensor1d(extractWeights(numChannels)),batch_norm_mean=tf28.tensor1d(extractWeights(numChannels)),batch_norm_variance=tf28.tensor1d(extractWeights(numChannels));return 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`}),{filters,batch_norm_scale,batch_norm_offset,batch_norm_mean,batch_norm_variance}}function extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,isPointwiseConv){let filters=tf28.tensor4d(extractWeights(channelsIn*channelsOut*filterSize*filterSize),[filterSize,filterSize,channelsIn,channelsOut]),bias=tf28.tensor1d(extractWeights(channelsOut));return paramMappings.push({paramPath:`${mappedPrefix}/filters`},{paramPath:`${mappedPrefix}/${isPointwiseConv?"batch_norm_offset":"bias"}`}),{filters,bias}}function extractPointwiseConvParams(channelsIn,channelsOut,filterSize,mappedPrefix){let{filters,bias}=extractConvParams(channelsIn,channelsOut,filterSize,mappedPrefix,!0);return{filters,batch_norm_offset:bias}}function extractConvPairParams(channelsIn,channelsOut,mappedPrefix){let depthwise_conv=extractDepthwiseConvParams(channelsIn,`${mappedPrefix}/depthwise_conv`),pointwise_conv=extractPointwiseConvParams(channelsIn,channelsOut,1,`${mappedPrefix}/pointwise_conv`);return{depthwise_conv,pointwise_conv}}function extractMobilenetV1Params(){let conv_0=extractPointwiseConvParams(3,32,3,"mobilenetv1/conv_0"),conv_1=extractConvPairParams(32,64,"mobilenetv1/conv_1"),conv_2=extractConvPairParams(64,128,"mobilenetv1/conv_2"),conv_3=extractConvPairParams(128,128,"mobilenetv1/conv_3"),conv_4=extractConvPairParams(128,256,"mobilenetv1/conv_4"),conv_5=extractConvPairParams(256,256,"mobilenetv1/conv_5"),conv_6=extractConvPairParams(256,512,"mobilenetv1/conv_6"),conv_7=extractConvPairParams(512,512,"mobilenetv1/conv_7"),conv_8=extractConvPairParams(512,512,"mobilenetv1/conv_8"),conv_9=extractConvPairParams(512,512,"mobilenetv1/conv_9"),conv_10=extractConvPairParams(512,512,"mobilenetv1/conv_10"),conv_11=extractConvPairParams(512,512,"mobilenetv1/conv_11"),conv_12=extractConvPairParams(512,1024,"mobilenetv1/conv_12"),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(){let conv_0=extractPointwiseConvParams(1024,256,1,"prediction_layer/conv_0"),conv_1=extractPointwiseConvParams(256,512,3,"prediction_layer/conv_1"),conv_2=extractPointwiseConvParams(512,128,1,"prediction_layer/conv_2"),conv_3=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_3"),conv_4=extractPointwiseConvParams(256,128,1,"prediction_layer/conv_4"),conv_5=extractPointwiseConvParams(128,256,3,"prediction_layer/conv_5"),conv_6=extractPointwiseConvParams(256,64,1,"prediction_layer/conv_6"),conv_7=extractPointwiseConvParams(64,128,3,"prediction_layer/conv_7"),box_encoding_0_predictor=extractConvParams(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),class_predictor_0=extractConvParams(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),box_encoding_1_predictor=extractConvParams(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),class_predictor_1=extractConvParams(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),box_encoding_2_predictor=extractConvParams(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),class_predictor_2=extractConvParams(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),box_encoding_3_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),class_predictor_3=extractConvParams(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),box_encoding_4_predictor=extractConvParams(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),class_predictor_4=extractConvParams(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),box_encoding_5_predictor=extractConvParams(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),class_predictor_5=extractConvParams(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0,conv_1,conv_2,conv_3,conv_4,conv_5,conv_6,conv_7,box_predictor_0:{box_encoding_predictor:box_encoding_0_predictor,class_predictor:class_predictor_0},box_predictor_1:{box_encoding_predictor:box_encoding_1_predictor,class_predictor:class_predictor_1},box_predictor_2:{box_encoding_predictor:box_encoding_2_predictor,class_predictor:class_predictor_2},box_predictor_3:{box_encoding_predictor:box_encoding_3_predictor,class_predictor:class_predictor_3},box_predictor_4:{box_encoding_predictor:box_encoding_4_predictor,class_predictor:class_predictor_4},box_predictor_5:{box_encoding_predictor:box_encoding_5_predictor,class_predictor:class_predictor_5}}}return{extractMobilenetV1Params,extractPredictionLayerParams}}function extractParams6(weights){let paramMappings=[],{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory5(extractWeights,paramMappings),mobilenetv1=extractMobilenetV1Params(),prediction_layer=extractPredictionLayerParams(),output_layer={extra_dim:tf28.tensor3d(extractWeights(5118*4),[1,5118,4])};if(paramMappings.push({paramPath:"output_layer/extra_dim"}),getRemainingWeights().length!==0)throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);return{params:{mobilenetv1,prediction_layer,output_layer},paramMappings}}function extractorsFactory6(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractPointwiseConvParams(prefix,idx,mappedPrefix){let filters=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`,4,`${mappedPrefix}/filters`),batch_norm_offset=extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`,1,`${mappedPrefix}/batch_norm_offset`);return{filters,batch_norm_offset}}function extractConvPairParams(idx){let mappedPrefix=`mobilenetv1/conv_${idx}`,prefixDepthwiseConv=`MobilenetV1/Conv2d_${idx}_depthwise`,mappedPrefixDepthwiseConv=`${mappedPrefix}/depthwise_conv`,mappedPrefixPointwiseConv=`${mappedPrefix}/pointwise_conv`,filters=extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`,4,`${mappedPrefixDepthwiseConv}/filters`),batch_norm_scale=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`,1,`${mappedPrefixDepthwiseConv}/batch_norm_scale`),batch_norm_offset=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`,1,`${mappedPrefixDepthwiseConv}/batch_norm_offset`),batch_norm_mean=extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`,1,`${mappedPrefixDepthwiseConv}/batch_norm_mean`),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){let filters=extractWeightEntry(`${prefix}/weights`,4,`${mappedPrefix}/filters`),bias=extractWeightEntry(`${prefix}/biases`,1,`${mappedPrefix}/bias`);return{filters,bias}}function extractBoxPredictorParams(idx){let box_encoding_predictor=extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${idx}/box_encoding_predictor`),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 extractParamsFromWeigthMap6(weightMap){let paramMappings=[],{extractMobilenetV1Params,extractPredictionLayerParams}=extractorsFactory6(weightMap,paramMappings),extra_dim=weightMap["Output/extra_dim"];if(paramMappings.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!isTensor3D(extra_dim))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);let params={mobilenetv1:extractMobilenetV1Params(),prediction_layer:extractPredictionLayerParams(),output_layer:{extra_dim}};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var tf30=__toModule(require_tfjs_esm());var tf29=__toModule(require_tfjs_esm());function pointwiseConvLayer(x,params,strides){return tf29.tidy(()=>{let out=tf29.conv2d(x,params.filters,strides,"same");return out=tf29.add(out,params.batch_norm_offset),tf29.clipByValue(out,0,6)})}var epsilon=.0010000000474974513;function depthwiseConvLayer(x,params,strides){return tf30.tidy(()=>{let out=tf30.depthwiseConv2d(x,params.filters,strides,"same");return out=tf30.batchNorm(out,params.batch_norm_mean,params.batch_norm_variance,params.batch_norm_offset,params.batch_norm_scale,epsilon),tf30.clipByValue(out,0,6)})}function getStridesForLayerIdx(layerIdx){return[2,4,6,12].some(idx=>idx===layerIdx)?[2,2]:[1,1]}function mobileNetV1(x,params){return tf30.tidy(()=>{let conv11,out=pointwiseConvLayer(x,params.conv_0,[2,2]);if([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].forEach((param,i)=>{let layerIdx=i+1,depthwiseConvStrides=getStridesForLayerIdx(layerIdx);out=depthwiseConvLayer(out,param.depthwise_conv,depthwiseConvStrides),out=pointwiseConvLayer(out,param.pointwise_conv,[1,1]),layerIdx===11&&(conv11=out)}),conv11===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out,conv11}})}function IOU(boxes,i,j){let boxesData=boxes.arraySync(),yminI=Math.min(boxesData[i][0],boxesData[i][2]),xminI=Math.min(boxesData[i][1],boxesData[i][3]),ymaxI=Math.max(boxesData[i][0],boxesData[i][2]),xmaxI=Math.max(boxesData[i][1],boxesData[i][3]),yminJ=Math.min(boxesData[j][0],boxesData[j][2]),xminJ=Math.min(boxesData[j][1],boxesData[j][3]),ymaxJ=Math.max(boxesData[j][0],boxesData[j][2]),xmaxJ=Math.max(boxesData[j][1],boxesData[j][3]),areaI=(ymaxI-yminI)*(xmaxI-xminI),areaJ=(ymaxJ-yminJ)*(xmaxJ-xminJ);if(areaI<=0||areaJ<=0)return 0;let intersectionYmin=Math.max(yminI,yminJ),intersectionXmin=Math.max(xminI,xminJ),intersectionYmax=Math.min(ymaxI,ymaxJ),intersectionXmax=Math.min(xmaxI,xmaxJ),intersectionArea=Math.max(intersectionYmax-intersectionYmin,0)*Math.max(intersectionXmax-intersectionXmin,0);return intersectionArea/(areaI+areaJ-intersectionArea)}function nonMaxSuppression2(boxes,scores,maxOutputSize,iouThreshold,scoreThreshold){let numBoxes=boxes.shape[0],outputSize=Math.min(maxOutputSize,numBoxes),candidates=scores.map((score,boxIndex)=>({score,boxIndex})).filter(c=>c.score>scoreThreshold).sort((c1,c2)=>c2.score-c1.score),suppressFunc=x=>x<=iouThreshold?1:0,selected=[];return candidates.forEach(c=>{if(selected.length>=outputSize)return;let originalScore=c.score;for(let j=selected.length-1;j>=0;--j){let iou2=IOU(boxes,c.boxIndex,selected[j]);if(iou2!==0&&(c.score*=suppressFunc(iou2),c.score<=scoreThreshold))break}originalScore===c.score&&selected.push(c.boxIndex)}),selected}var tf31=__toModule(require_tfjs_esm());function getCenterCoordinatesAndSizesLayer(x){let vec=tf31.unstack(tf31.transpose(x,[1,0])),sizes=[tf31.sub(vec[2],vec[0]),tf31.sub(vec[3],vec[1])],centers=[tf31.add(vec[0],tf31.div(sizes[0],tf31.scalar(2))),tf31.add(vec[1],tf31.div(sizes[1],tf31.scalar(2)))];return{sizes,centers}}function decodeBoxesLayer(x0,x1){let{sizes,centers}=getCenterCoordinatesAndSizesLayer(x0),vec=tf31.unstack(tf31.transpose(x1,[1,0])),div0_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2],tf31.scalar(5))),sizes[0]),tf31.scalar(2)),add0_out=tf31.add(tf31.mul(tf31.div(vec[0],tf31.scalar(10)),sizes[0]),centers[0]),div1_out=tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3],tf31.scalar(5))),sizes[1]),tf31.scalar(2)),add1_out=tf31.add(tf31.mul(tf31.div(vec[1],tf31.scalar(10)),sizes[1]),centers[1]);return tf31.transpose(tf31.stack([tf31.sub(add0_out,div0_out),tf31.sub(add1_out,div1_out),tf31.add(add0_out,div0_out),tf31.add(add1_out,div1_out)]),[1,0])}function outputLayer(boxPredictions,classPredictions,params){return tf31.tidy(()=>{let batchSize=boxPredictions.shape[0],boxes=decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim,[batchSize,1,1]),[-1,4]),tf31.reshape(boxPredictions,[-1,4]));boxes=tf31.reshape(boxes,[batchSize,boxes.shape[0]/batchSize,4]);let scoresAndClasses=tf31.sigmoid(tf31.slice(classPredictions,[0,0,1],[-1,-1,-1])),scores=tf31.slice(scoresAndClasses,[0,0,0],[-1,-1,1]);scores=tf31.reshape(scores,[batchSize,scores.shape[1]]);let boxesByBatch=tf31.unstack(boxes),scoresByBatch=tf31.unstack(scores);return{boxes:boxesByBatch,scores:scoresByBatch}})}var tf33=__toModule(require_tfjs_esm());var tf32=__toModule(require_tfjs_esm());function boxPredictionLayer(x,params){return tf32.tidy(()=>{let batchSize=x.shape[0],boxPredictionEncoding=tf32.reshape(convLayer(x,params.box_encoding_predictor),[batchSize,-1,1,4]),classPrediction=tf32.reshape(convLayer(x,params.class_predictor),[batchSize,-1,3]);return{boxPredictionEncoding,classPrediction}})}function predictionLayer(x,conv11,params){return tf33.tidy(()=>{let conv0=pointwiseConvLayer(x,params.conv_0,[1,1]),conv1=pointwiseConvLayer(conv0,params.conv_1,[2,2]),conv22=pointwiseConvLayer(conv1,params.conv_2,[1,1]),conv3=pointwiseConvLayer(conv22,params.conv_3,[2,2]),conv4=pointwiseConvLayer(conv3,params.conv_4,[1,1]),conv5=pointwiseConvLayer(conv4,params.conv_5,[2,2]),conv6=pointwiseConvLayer(conv5,params.conv_6,[1,1]),conv7=pointwiseConvLayer(conv6,params.conv_7,[2,2]),boxPrediction0=boxPredictionLayer(conv11,params.box_predictor_0),boxPrediction1=boxPredictionLayer(x,params.box_predictor_1),boxPrediction2=boxPredictionLayer(conv1,params.box_predictor_2),boxPrediction3=boxPredictionLayer(conv3,params.box_predictor_3),boxPrediction4=boxPredictionLayer(conv5,params.box_predictor_4),boxPrediction5=boxPredictionLayer(conv7,params.box_predictor_5),boxPredictions=tf33.concat([boxPrediction0.boxPredictionEncoding,boxPrediction1.boxPredictionEncoding,boxPrediction2.boxPredictionEncoding,boxPrediction3.boxPredictionEncoding,boxPrediction4.boxPredictionEncoding,boxPrediction5.boxPredictionEncoding],1),classPredictions=tf33.concat([boxPrediction0.classPrediction,boxPrediction1.classPrediction,boxPrediction2.classPrediction,boxPrediction3.classPrediction,boxPrediction4.classPrediction,boxPrediction5.classPrediction],1);return{boxPredictions,classPredictions}})}var SsdMobilenetv1Options=class{constructor({minConfidence,maxResults}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=minConfidence||.5,this._maxResults=maxResults||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var SsdMobilenetv1=class extends NeuralNetwork{constructor(){super("SsdMobilenetv1")}forwardInput(input){let{params}=this;if(!params)throw new Error("SsdMobilenetv1 - load model before inference");return tf34.tidy(()=>{let batchTensor=tf34.cast(input.toBatchTensor(512,!1),"float32"),x=tf34.sub(tf34.mul(batchTensor,tf34.scalar(.007843137718737125)),tf34.scalar(1)),features=mobileNetV1(x,params.mobilenetv1),{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={}){let{maxResults,minConfidence}=new SsdMobilenetv1Options(options),netInput=await toNetInput(input),{boxes:_boxes,scores:_scores}=this.forwardInput(netInput),boxes=_boxes[0],scores=_scores[0];for(let i=1;i<_boxes.length;i++)_boxes[i].dispose(),_scores[i].dispose();let scoresData=Array.from(await scores.data()),indices=nonMaxSuppression2(boxes,scoresData,maxResults,.5,minConfidence),reshapedDims=netInput.getReshapedInputDimensions(0),inputSize=netInput.inputSize,padX=inputSize/reshapedDims.width,padY=inputSize/reshapedDims.height,boxesData=boxes.arraySync(),results=indices.map(idx=>{let[top,bottom]=[Math.max(0,boxesData[idx][0]),Math.min(1,boxesData[idx][2])].map(val=>val*padY),[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)})});return boxes.dispose(),scores.dispose(),results}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap6(weightMap)}extractParams(weights){return extractParams6(weights)}};function createSsdMobilenetv1(weights){let net=new SsdMobilenetv1;return net.extractWeights(weights),net}function createFaceDetectionNet(weights){return createSsdMobilenetv1(weights)}var FaceDetectionNet=class extends SsdMobilenetv1{};var IOU_THRESHOLD=.4,BOX_ANCHORS=[new Point(.738768,.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)],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)],MEAN_RGB_SEPARABLE=[117.001,114.697,97.404],DEFAULT_MODEL_NAME="tiny_yolov2_model",DEFAULT_MODEL_NAME_SEPARABLE_CONV="tiny_yolov2_separable_conv_model";var tf39=__toModule(require_tfjs_esm());var isNumber=arg=>typeof arg=="number";function validateConfig(config){if(!config)throw new Error(`invalid config: ${config}`);if(typeof config.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`);if(!isNumber(config.iouThreshold)||config.iouThreshold<0||config.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`);if(!Array.isArray(config.classes)||!config.classes.length||!config.classes.every(c=>typeof c=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`);if(!Array.isArray(config.anchors)||!config.anchors.length||!config.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(config.anchors)}`);if(config.meanRgb&&(!Array.isArray(config.meanRgb)||config.meanRgb.length!==3||!config.meanRgb.every(isNumber)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`)}var tf36=__toModule(require_tfjs_esm());var tf35=__toModule(require_tfjs_esm());function leaky(x){return tf35.tidy(()=>{let min=tf35.mul(x,tf35.scalar(.10000000149011612));return tf35.add(tf35.relu(tf35.sub(x,min)),min)})}function convWithBatchNorm(x,params){return tf36.tidy(()=>{let out=tf36.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf36.conv2d(out,params.conv.filters,[1,1],"valid"),out=tf36.sub(out,params.bn.sub),out=tf36.mul(out,params.bn.truediv),out=tf36.add(out,params.conv.bias),leaky(out)})}var tf37=__toModule(require_tfjs_esm());function depthwiseSeparableConv2(x,params){return tf37.tidy(()=>{let out=tf37.pad(x,[[0,0],[1,1],[1,1],[0,0]]);return out=tf37.separableConv2d(out,params.depthwise_filter,params.pointwise_filter,[1,1],"valid"),out=tf37.add(out,params.bias),leaky(out)})}var tf38=__toModule(require_tfjs_esm());function extractorsFactory7(extractWeights,paramMappings){let extractConvParams=extractConvParamsFactory(extractWeights,paramMappings);function extractBatchNormParams(size,mappedPrefix){let sub6=tf38.tensor1d(extractWeights(size)),truediv=tf38.tensor1d(extractWeights(size));return paramMappings.push({paramPath:`${mappedPrefix}/sub`},{paramPath:`${mappedPrefix}/truediv`}),{sub:sub6,truediv}}function extractConvWithBatchNormParams(channelsIn,channelsOut,mappedPrefix){let conv3=extractConvParams(channelsIn,channelsOut,3,`${mappedPrefix}/conv`),bn=extractBatchNormParams(channelsOut,`${mappedPrefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=extractSeparableConvParamsFactory(extractWeights,paramMappings);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParams7(weights,config,boxEncodingSize,filterSizes){let{extractWeights,getRemainingWeights}=extractWeightsFactory(weights),paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory7(extractWeights,paramMappings),params;if(config.withSeparableConvs){let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=config.isFirstLayerConv2d?extractConvParams(s0,s1,3,"conv0"):extractSeparableConvParams(s0,s1,"conv0"),conv1=extractSeparableConvParams(s1,s2,"conv1"),conv22=extractSeparableConvParams(s2,s3,"conv2"),conv3=extractSeparableConvParams(s3,s4,"conv3"),conv4=extractSeparableConvParams(s4,s5,"conv4"),conv5=extractSeparableConvParams(s5,s6,"conv5"),conv6=s7?extractSeparableConvParams(s6,s7,"conv6"):void 0,conv7=s8?extractSeparableConvParams(s7,s8,"conv7"):void 0,conv8=extractConvParams(s8||s7||s6,5*boxEncodingSize,1,"conv8");params={conv0,conv1,conv2:conv22,conv3,conv4,conv5,conv6,conv7,conv8}}else{let[s0,s1,s2,s3,s4,s5,s6,s7,s8]=filterSizes,conv0=extractConvWithBatchNormParams(s0,s1,"conv0"),conv1=extractConvWithBatchNormParams(s1,s2,"conv1"),conv22=extractConvWithBatchNormParams(s2,s3,"conv2"),conv3=extractConvWithBatchNormParams(s3,s4,"conv3"),conv4=extractConvWithBatchNormParams(s4,s5,"conv4"),conv5=extractConvWithBatchNormParams(s5,s6,"conv5"),conv6=extractConvWithBatchNormParams(s6,s7,"conv6"),conv7=extractConvWithBatchNormParams(s7,s8,"conv7"),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}}function extractorsFactory8(weightMap,paramMappings){let extractWeightEntry=extractWeightEntryFactory(weightMap,paramMappings);function extractBatchNormParams(prefix){let sub6=extractWeightEntry(`${prefix}/sub`,1),truediv=extractWeightEntry(`${prefix}/truediv`,1);return{sub:sub6,truediv}}function extractConvParams(prefix){let filters=extractWeightEntry(`${prefix}/filters`,4),bias=extractWeightEntry(`${prefix}/bias`,1);return{filters,bias}}function extractConvWithBatchNormParams(prefix){let conv3=extractConvParams(`${prefix}/conv`),bn=extractBatchNormParams(`${prefix}/bn`);return{conv:conv3,bn}}let extractSeparableConvParams=loadSeparableConvParamsFactory(extractWeightEntry);return{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}}function extractParamsFromWeigthMap7(weightMap,config){let paramMappings=[],{extractConvParams,extractConvWithBatchNormParams,extractSeparableConvParams}=extractorsFactory8(weightMap,paramMappings),params;if(config.withSeparableConvs){let numFilters=config.filterSizes&&config.filterSizes.length||9;params={conv0:config.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")};return disposeUnusedWeightTensors(weightMap,paramMappings),{params,paramMappings}}var TinyYolov2Options=class{constructor({inputSize,scoreThreshold}={}){this._name="TinyYolov2Options";if(this._inputSize=inputSize||416,this._scoreThreshold=scoreThreshold||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var TinyYolov2Base2=class extends NeuralNetwork{constructor(config){super("TinyYolov2");validateConfig(config),this._config=config}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);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=convWithBatchNorm(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=convWithBatchNorm(out,params.conv6),out=convWithBatchNorm(out,params.conv7),convLayer(out,params.conv8,"valid",!1)}runMobilenet(x,params){let out=this.config.isFirstLayerConv2d?leaky(convLayer(x,params.conv0,"valid",!1)):depthwiseSeparableConv2(x,params.conv0);return out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv1),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv2),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv3),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv4),out=tf39.maxPool(out,[2,2],[2,2],"same"),out=depthwiseSeparableConv2(out,params.conv5),out=tf39.maxPool(out,[2,2],[1,1],"same"),out=params.conv6?depthwiseSeparableConv2(out,params.conv6):out,out=params.conv7?depthwiseSeparableConv2(out,params.conv7):out,convLayer(out,params.conv8,"valid",!1)}forwardInput(input,inputSize){let{params}=this;if(!params)throw new Error("TinyYolov2 - load model before inference");return tf39.tidy(()=>{let batchTensor=tf39.cast(input.toBatchTensor(inputSize,!1),"float32");return batchTensor=this.config.meanRgb?normalize(batchTensor,this.config.meanRgb):batchTensor,batchTensor=batchTensor.div(tf39.scalar(256)),this.config.withSeparableConvs?this.runMobilenet(batchTensor,params):this.runTinyYolov2(batchTensor,params)})}async forward(input,inputSize){return this.forwardInput(await toNetInput(input),inputSize)}async detect(input,forwardParams={}){let{inputSize,scoreThreshold}=new TinyYolov2Options(forwardParams),netInput=await toNetInput(input),out=await this.forwardInput(netInput,inputSize),out0=tf39.tidy(()=>tf39.unstack(out)[0].expandDims()),inputDimensions={width:netInput.getInputWidth(0),height:netInput.getInputHeight(0)},results=await this.extractBoxes(out0,netInput.getReshapedInputDimensions(0),scoreThreshold);out.dispose(),out0.dispose();let boxes=results.map(res=>res.box),scores=results.map(res=>res.score),classScores=results.map(res=>res.classScore),classNames=results.map(res=>this.config.classes[res.label]);return nonMaxSuppression(boxes.map(box=>box.rescale(inputSize)),scores,this.config.iouThreshold,!0).map(idx=>new ObjectDetection(scores[idx],classScores[idx],classNames[idx],boxes[idx],inputDimensions))}getDefaultModelName(){return""}extractParamsFromWeigthMap(weightMap){return extractParamsFromWeigthMap7(weightMap,this.config)}extractParams(weights){let filterSizes=this.config.filterSizes||TinyYolov2Base2.DEFAULT_FILTER_SIZES,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 extractParams7(weights,this.config,this.boxEncodingSize,filterSizes)}async extractBoxes(outputTensor,inputBlobDimensions,scoreThreshold){let{width,height}=inputBlobDimensions,inputSize=Math.max(width,height),correctionFactorX=inputSize/width,correctionFactorY=inputSize/height,numCells=outputTensor.shape[1],numBoxes=this.config.anchors.length,[boxesTensor,scoresTensor,classScoresTensor]=tf39.tidy(()=>{let reshaped=outputTensor.reshape([numCells,numCells,numBoxes,this.boxEncodingSize]),boxes=reshaped.slice([0,0,0,0],[numCells,numCells,numBoxes,4]),scores=reshaped.slice([0,0,0,4],[numCells,numCells,numBoxes,1]),classScores=this.withClassScores?tf39.softmax(reshaped.slice([0,0,0,5],[numCells,numCells,numBoxes,this.config.classes.length]),3):tf39.scalar(0);return[boxes,scores,classScores]}),results=[],scoresData=await scoresTensor.array(),boxesData=await boxesTensor.array();for(let row=0;rowscoreThreshold){let ctX=(col+sigmoid(boxesData[row][col][anchor][0]))/numCells*correctionFactorX,ctY=(row+sigmoid(boxesData[row][col][anchor][1]))/numCells*correctionFactorY,widthLocal=Math.exp(boxesData[row][col][anchor][2])*this.config.anchors[anchor].x/numCells*correctionFactorX,heightLocal=Math.exp(boxesData[row][col][anchor][3])*this.config.anchors[anchor].y/numCells*correctionFactorY,x=ctX-widthLocal/2,y=ctY-heightLocal/2,pos={row,col,anchor},{classScore,label}=this.withClassScores?await this.extractPredictedClass(classScoresTensor,pos):{classScore:1,label:0};results.push({box:new BoundingBox(x,y,x+widthLocal,y+heightLocal),score,classScore:score*classScore,label,...pos})}}return boxesTensor.dispose(),scoresTensor.dispose(),classScoresTensor.dispose(),results}async extractPredictedClass(classesTensor,pos){let{row,col,anchor}=pos,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=TinyYolov2Base2;TinyYolov2Base.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var TinyYolov2=class extends TinyYolov2Base{constructor(withSeparableConvs=!0){let config={withSeparableConvs,iouThreshold:IOU_THRESHOLD,classes:["face"],...withSeparableConvs?{anchors:BOX_ANCHORS_SEPARABLE,meanRgb:MEAN_RGB_SEPARABLE}:{anchors:BOX_ANCHORS,withClassScores:!0}};super(config)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){return(await this.detect(input,forwardParams)).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)}};function createTinyYolov2(weights,withSeparableConvs=!0){let net=new TinyYolov2(withSeparableConvs);return net.extractWeights(weights),net}var TinyFaceDetectorOptions=class extends TinyYolov2Options{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var ComposableTask=class{async then(onfulfilled){return onfulfilled(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};var tf41=__toModule(require_tfjs_esm());var tf40=__toModule(require_tfjs_esm());async function extractAllFacesAndComputeResults(parentResults,input,computeResults,extractedFaces,getRectForAlignment=({alignedRect})=>alignedRect){let faceBoxes=parentResults.map(parentResult=>isWithFaceLandmarks(parentResult)?getRectForAlignment(parentResult):parentResult.detection),faces=extractedFaces||(input instanceof tf40.Tensor?await extractFaceTensors(input,faceBoxes):await extractFaces(input,faceBoxes)),results=await computeResults(faces);return faces.forEach(f=>f instanceof tf40.Tensor&&f.dispose()),results}async function extractSingleFaceAndComputeResult(parentResult,input,computeResult,extractedFaces,getRectForAlignment){return extractAllFacesAndComputeResults([parentResult],input,async faces=>computeResult(faces[0]),extractedFaces,getRectForAlignment)}var IOU_THRESHOLD2=.4,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)],MEAN_RGB=[117.001,114.697,97.404];var TinyFaceDetector=class extends TinyYolov2Base{constructor(){let config={withSeparableConvs:!0,iouThreshold:IOU_THRESHOLD2,classes:["face"],anchors:BOX_ANCHORS2,meanRgb:MEAN_RGB,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(config)}get anchors(){return this.config.anchors}async locateFaces(input,forwardParams){return(await this.detect(input,forwardParams)).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)}};var 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},ssdMobilenetv1=(input,options)=>nets.ssdMobilenetv1.locateFaces(input,options),tinyFaceDetector=(input,options)=>nets.tinyFaceDetector.locateFaces(input,options),tinyYolov2=(input,options)=>nets.tinyYolov2.locateFaces(input,options),detectFaceLandmarks=input=>nets.faceLandmark68Net.detectLandmarks(input),detectFaceLandmarksTiny=input=>nets.faceLandmark68TinyNet.detectLandmarks(input),computeFaceDescriptor=input=>nets.faceRecognitionNet.computeFaceDescriptor(input),recognizeFaceExpressions=input=>nets.faceExpressionNet.predictExpressions(input),predictAgeAndGender=input=>nets.ageGenderNet.predictAgeAndGender(input),loadSsdMobilenetv1Model=url=>nets.ssdMobilenetv1.load(url),loadTinyFaceDetectorModel=url=>nets.tinyFaceDetector.load(url),loadTinyYolov2Model=url=>nets.tinyYolov2.load(url),loadFaceLandmarkModel=url=>nets.faceLandmark68Net.load(url),loadFaceLandmarkTinyModel=url=>nets.faceLandmark68TinyNet.load(url),loadFaceRecognitionModel=url=>nets.faceRecognitionNet.load(url),loadFaceExpressionModel=url=>nets.faceExpressionNet.load(url),loadAgeGenderModel=url=>nets.ageGenderNet.load(url),loadFaceDetectionModel=loadSsdMobilenetv1Model,locateFaces=ssdMobilenetv1,detectLandmarks=detectFaceLandmarks;var PredictFaceExpressionsTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResults=await this.parentTask,faceExpressionsByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>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)}},PredictSingleFaceExpressionsTask=class extends PredictFaceExpressionsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let faceExpressions=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceExpressionNet.predictExpressions(face),this.extractedFaces);return extendWithFaceExpressions(parentResult,faceExpressions)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this,this.input)}},PredictAllFaceExpressionsWithFaceAlignmentTask=class extends PredictAllFaceExpressionsTask{withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleFaceExpressionsWithFaceAlignmentTask=class extends PredictSingleFaceExpressionsTask{withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}};var PredictAgeAndGenderTaskBase=class extends ComposableTask{constructor(parentTask,input,extractedFaces){super();this.parentTask=parentTask;this.input=input;this.extractedFaces=extractedFaces}},PredictAllAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResults=await this.parentTask,ageAndGenderByFace=await extractAllFacesAndComputeResults(parentResults,this.input,async faces=>Promise.all(faces.map(face=>nets.ageGenderNet.predictAgeAndGender(face))),this.extractedFaces);return parentResults.map((parentResult,i)=>{let{age,gender,genderProbability}=ageAndGenderByFace[i];return extendWithAge(extendWithGender(parentResult,gender,genderProbability),age)})}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this,this.input)}},PredictSingleAgeAndGenderTask=class extends PredictAgeAndGenderTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{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)}},PredictAllAgeAndGenderWithFaceAlignmentTask=class extends PredictAllAgeAndGenderTask{withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptors(){return new ComputeAllFaceDescriptorsTask(this,this.input)}},PredictSingleAgeAndGenderWithFaceAlignmentTask=class extends PredictSingleAgeAndGenderTask{withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}};var ComputeFaceDescriptorsTaskBase=class extends ComposableTask{constructor(parentTask,input){super();this.parentTask=parentTask;this.input=input}},ComputeAllFaceDescriptorsTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResults=await this.parentTask;return(await extractAllFacesAndComputeResults(parentResults,this.input,faces=>Promise.all(faces.map(face=>nets.faceRecognitionNet.computeFaceDescriptor(face))),null,parentResult=>parentResult.landmarks.align(null,{useDlibAlignment:!0}))).map((descriptor,i)=>extendWithFaceDescriptor(parentResults[i],descriptor))}withFaceExpressions(){return new PredictAllFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderWithFaceAlignmentTask(this,this.input)}},ComputeSingleFaceDescriptorTask=class extends ComputeFaceDescriptorsTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let descriptor=await extractSingleFaceAndComputeResult(parentResult,this.input,face=>nets.faceRecognitionNet.computeFaceDescriptor(face),null,parentResult2=>parentResult2.landmarks.align(null,{useDlibAlignment:!0}));return extendWithFaceDescriptor(parentResult,descriptor)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}};var DetectFaceLandmarksTaskBase=class 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}},DetectAllFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResults=await this.parentTask,detections=parentResults.map(res=>res.detection),faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,detections):await extractFaces(this.input,detections),faceLandmarksByFace=await Promise.all(faces.map(face=>this.landmarkNet.detectLandmarks(face)));return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),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)}},DetectSingleFaceLandmarksTask=class extends DetectFaceLandmarksTaskBase{async run(){let parentResult=await this.parentTask;if(!parentResult)return;let{detection}=parentResult,faces=this.input instanceof tf41.Tensor?await extractFaceTensors(this.input,[detection]):await extractFaces(this.input,[detection]),landmarks=await this.landmarkNet.detectLandmarks(faces[0]);return faces.forEach(f=>f instanceof tf41.Tensor&&f.dispose()),extendWithFaceLandmarks(parentResult,landmarks)}withFaceExpressions(){return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this,this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this,this.input)}withFaceDescriptor(){return new ComputeSingleFaceDescriptorTask(this,this.input)}};var DetectFacesTaskBase=class extends ComposableTask{constructor(input,options=new SsdMobilenetv1Options){super();this.input=input;this.options=options}},DetectAllFacesTask=class extends DetectFacesTaskBase{async run(){let{input,options}=this,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 resolve=>{let detections=await this.run();resolve(detections.map(detection=>extendWithFaceDetection({},detection)))})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(),this.input)}},DetectSingleFaceTask=class extends DetectFacesTaskBase{async run(){let faceDetections=await new DetectAllFacesTask(this.input,this.options),faceDetectionWithHighestScore=faceDetections[0];return faceDetections.forEach(faceDetection=>{faceDetection.score>faceDetectionWithHighestScore.score&&(faceDetectionWithHighestScore=faceDetection)}),faceDetectionWithHighestScore}runAndExtendWithFaceDetection(){return new Promise(async resolve=>{let detection=await this.run();resolve(detection?extendWithFaceDetection({},detection):void 0)})}withFaceLandmarks(useTinyLandmarkNet=!1){return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(),this.input,useTinyLandmarkNet)}withFaceExpressions(){return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(),this.input)}};function detectSingleFace(input,options=new SsdMobilenetv1Options){return new DetectSingleFaceTask(input,options)}function detectAllFaces(input,options=new SsdMobilenetv1Options){return new DetectAllFacesTask(input,options)}async function allFacesSsdMobilenetv1(input,minConfidence){return detectAllFaces(input,new SsdMobilenetv1Options(minConfidence?{minConfidence}:{})).withFaceLandmarks().withFaceDescriptors()}async function allFacesTinyYolov2(input,forwardParams={}){return detectAllFaces(input,new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors()}var allFaces=allFacesSsdMobilenetv1;function euclideanDistance(arr1,arr2){if(arr1.length!==arr2.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let desc1=Array.from(arr1),desc2=Array.from(arr2);return Math.sqrt(desc1.map((val,i)=>val-desc2[i]).reduce((res,diff)=>res+diff**2,0))}var FaceMatcher=class{constructor(inputs,distanceThreshold=.6){this._distanceThreshold=distanceThreshold;let inputArray=Array.isArray(inputs)?inputs:[inputs];if(!inputArray.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let count=1,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.distanceld.toJSON())}}static fromJSON(json){let labeledDescriptors=json.labeledDescriptors.map(ld=>LabeledFaceDescriptors.fromJSON(ld));return new FaceMatcher(labeledDescriptors,json.distanceThreshold)}};function createTinyFaceDetector(weights){let net=new TinyFaceDetector;return net.extractWeights(weights),net}function resizeResults(results,dimensions){let{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)){let resizedDetection=results.detection.forSize(width,height),resizedLandmarks=results.unshiftedLandmarks.forSize(resizedDetection.box.width,resizedDetection.box.height);return extendWithFaceLandmarks(extendWithFaceDetection(results,resizedDetection),resizedLandmarks)}return isWithFaceDetection(results)?extendWithFaceDetection(results,results.detection.forSize(width,height)):results instanceof FaceLandmarks||results instanceof FaceDetection?results.forSize(width,height):results}var node=typeof process!="undefined",browser3=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",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,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,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
index 07403e9..4d0d7b1 100644
--- a/dist/face-api.esm-nobundle.js.map
+++ b/dist/face-api.esm-nobundle.js.map
@@ -2,6 +2,6 @@
"version": 3,
"sources": ["../src/tfjs/tf-browser.ts", "../src/env/isNodejs.ts", "../src/index.ts", "../src/draw/index.ts", "../src/draw/drawContour.ts", "../src/utils/index.ts", "../src/classes/Dimensions.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/faceExpressionNet/FaceExpressionNet.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/NetInput.ts", "../src/dom/imageToSquare.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/dom/loadWeightMap.ts", "../src/common/getModelUris.ts", "../src/dom/matchDimensions.ts", "../src/faceFeatureExtractor/FaceFeatureExtractor.ts", "../src/NeuralNetwork.ts", "../src/faceFeatureExtractor/denseBlock.ts", "../src/common/depthwiseSeparableConv.ts", "../src/common/convLayer.ts", "../src/common/disposeUnusedWeightTensors.ts", "../src/common/extractConvParamsFactory.ts", "../src/common/extractFCParamsFactory.ts", "../src/common/extractSeparableConvParamsFactory.ts", "../src/common/types.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/faceProcessor/FaceProcessor.ts", "../src/common/fullyConnectedLayer.ts", "../src/faceProcessor/extractParams.ts", "../src/faceProcessor/extractParamsFromWeigthMap.ts", "../src/faceProcessor/util.ts", "../src/faceExpressionNet/FaceExpressions.ts", "../src/factories/WithFaceExpressions.ts", "../src/draw/drawFaceExpressions.ts", "../src/factories/WithFaceLandmarks.ts", "../src/draw/DrawFaceLandmarks.ts", "../src/ageGenderNet/AgeGenderNet.ts", "../src/xception/TinyXception.ts", "../src/xception/extractParams.ts", "../src/xception/extractParamsFromWeigthMap.ts", "../src/ageGenderNet/extractParams.ts", "../src/ageGenderNet/extractParamsFromWeigthMap.ts", "../src/ageGenderNet/types.ts", "../src/faceLandmarkNet/FaceLandmark68NetBase.ts", "../src/faceLandmarkNet/FaceLandmark68Net.ts", "../src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts", "../src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts", "../src/faceFeatureExtractor/extractParamsTiny.ts", "../src/faceLandmarkNet/FaceLandmark68TinyNet.ts", "../src/faceLandmarkNet/index.ts", "../src/faceRecognitionNet/FaceRecognitionNet.ts", "../src/faceRecognitionNet/convLayer.ts", "../src/faceRecognitionNet/scaleLayer.ts", "../src/faceRecognitionNet/extractParams.ts", "../src/faceRecognitionNet/extractParamsFromWeigthMap.ts", "../src/faceRecognitionNet/residualLayer.ts", "../src/faceRecognitionNet/index.ts", "../src/factories/WithFaceDescriptor.ts", "../src/factories/WithAge.ts", "../src/factories/WithGender.ts", "../src/ssdMobilenetv1/SsdMobilenetv1.ts", "../src/ssdMobilenetv1/extractParams.ts", "../src/ssdMobilenetv1/extractParamsFromWeigthMap.ts", "../src/ssdMobilenetv1/mobileNetV1.ts", "../src/ssdMobilenetv1/pointwiseConvLayer.ts", "../src/ssdMobilenetv1/nonMaxSuppression.ts", "../src/ssdMobilenetv1/outputLayer.ts", "../src/ssdMobilenetv1/predictionLayer.ts", "../src/ssdMobilenetv1/boxPredictionLayer.ts", "../src/ssdMobilenetv1/SsdMobilenetv1Options.ts", "../src/ssdMobilenetv1/index.ts", "../src/tinyYolov2/const.ts", "../src/tinyYolov2/TinyYolov2Base.ts", "../src/tinyYolov2/config.ts", "../src/tinyYolov2/convWithBatchNorm.ts", "../src/tinyYolov2/leaky.ts", "../src/tinyYolov2/depthwiseSeparableConv.ts", "../src/tinyYolov2/extractParams.ts", "../src/tinyYolov2/extractParamsFromWeigthMap.ts", "../src/tinyYolov2/TinyYolov2Options.ts", "../src/tinyYolov2/TinyYolov2.ts", "../src/tinyYolov2/index.ts", "../src/tinyFaceDetector/TinyFaceDetectorOptions.ts", "../src/globalApi/ComposableTask.ts", "../src/globalApi/DetectFaceLandmarksTasks.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/DetectFacesTasks.ts", "../src/globalApi/detectFaces.ts", "../src/globalApi/allFaces.ts", "../src/euclideanDistance.ts", "../src/globalApi/FaceMatcher.ts", "../src/tinyFaceDetector/index.ts", "../src/resizeResults.ts"],
"sourcesContent": ["/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable node/no-unpublished-import */\n\n// wrapper to load tfjs in a single place so version can be changed quickly\n\nexport * from '@tensorflow/tfjs/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm';\n", "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}\n", "import * as tf from '../dist/tfjs.esm';\nimport * as draw from './draw/index';\nimport * as utils from './utils/index';\nimport * as pkg from '../package.json';\n\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\nconst node = (typeof process !== 'undefined');\n// eslint-disable-next-line no-undef\nconst browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');\nexport const version = { faceapi: pkg.version as string, node, browser };\n", "export * from './drawContour';\nexport * from './drawDetections';\nexport * from './drawFaceExpressions';\nexport * from './DrawBox';\nexport * from './DrawFaceLandmarks';\nexport * from './DrawTextField';\n", "import { Point } from '../classes/index';\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Point } from '../classes/index';\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 = 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 // eslint-disable-next-line no-mixed-operators\n return !!num && (num !== Infinity) && (num !== -Infinity) && !Number.isNaN(num) || num === 0;\n}\n\nexport function isValidProbablitiy(num: any) {\n return isValidNumber(num) && num >= 0 && num <= 1.0;\n}\n", "import { isValidNumber } from '../utils/index';\n\nexport interface IDimensions {\n width: number\n height: number\n}\n\nexport class Dimensions implements IDimensions {\n private _width: number\n\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\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}\n", "export interface IPoint {\n x: number\n y: number\n}\n\nexport class Point implements IPoint {\n private _x: number\n\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\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((this.x ** 2) + (this.y ** 2));\n }\n\n public floor(): Point {\n return new Point(Math.floor(this.x), Math.floor(this.y));\n }\n}\n", "import { isDimensions, isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { IDimensions } from './Dimensions';\nimport { Point } from './Point';\nimport { IRect } from './Rect';\n\nexport class Box implements IBoundingBox, IRect {\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\n private _y: number\n\n private _width: number\n\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({\n x, y, width, height,\n }, '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\n public get y(): number { return this._y; }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public get left(): number { return this.x; }\n\n public get top(): number { return this.y; }\n\n public get right(): number { return this.x + this.width; }\n\n public get bottom(): number { return this.y + this.height; }\n\n public get area(): number { return this.width * this.height; }\n\n public get topLeft(): Point { return new Point(this.left, this.top); }\n\n public get topRight(): Point { return new Point(this.right, this.top); }\n\n public get bottomLeft(): Point { return new Point(this.left, this.bottom); }\n\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({\n x, y, width, height,\n });\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({\n x, y, width, height,\n });\n }\n\n public toSquare(): Box {\n let {\n x, y, width, height,\n } = 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({\n x, y, width, height,\n });\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 const [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({\n x, y, width, height,\n });\n }\n\n public clipAtImageBorders(imgWidth: number, imgHeight: number): Box {\n const {\n x, y, right, bottom,\n } = 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({\n x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight,\n })).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({\n x, y, width, height,\n });\n }\n\n public padAtBorders(imageHeight: number, imageWidth: number) {\n const w = this.width + 1;\n const h = this.height + 1;\n\n const dx = 1;\n const 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 {\n dy, edy, dx, edx, y, ey, x, ex, w, h,\n };\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}\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({\n left, top, right, bottom,\n }, allowNegativeDimensions);\n }\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\n private _classScore: number\n\n private _className: string\n\n private _box: Rect\n\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\n public get classScore(): number { return this._classScore; }\n\n public get className(): string { return this._className; }\n\n public get box(): Box { return this._box; }\n\n public get imageDims(): Dimensions { return this._imageDims; }\n\n public get imageWidth(): number { return this.imageDims.width; }\n\n public get imageHeight(): number { return this.imageDims.height; }\n\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}\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}\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}\n", "import { BoundingBox, IPoint } from '../classes/index';\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 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 '../../dist/tfjs.esm';\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}\n", "import * as tf from '../../dist/tfjs.esm';\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 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 = (paddingAmountLocal: number): tf.Tensor => {\n const paddingTensorShape = imgTensor.shape.slice();\n paddingTensorShape[paddingAxis] = paddingAmountLocal;\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}\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}\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({\n x, y, width, height,\n }, allowNegativeDimensions);\n }\n}\n", "import { minBbox } from '../ops/index';\nimport { getCenterPoint } from '../utils/index';\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\n protected _positions: Point[]\n\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\n public get imageWidth(): number { return this._imgDims.width; }\n\n public get imageHeight(): number { return this._imgDims.height; }\n\n public get positions(): Point[] { return this._positions; }\n\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 } = { 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 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}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks5 extends FaceLandmarks {\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}\n", "import { getCenterPoint } from '../utils/index';\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}\n", "import { round } from '../utils/index';\n\nexport interface IFaceMatch {\n label: string\n distance: number\n}\n\nexport class FaceMatch implements IFaceMatch {\n private _label: string\n\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\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}\n", "import { isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { IRect } from './Rect';\n\nexport class LabeledBox extends Box {\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\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\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) => new Float32Array(d));\n return new LabeledFaceDescriptors(json.label, descriptors);\n }\n}\n", "import { isValidProbablitiy } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { LabeledBox } from './LabeledBox';\nimport { IRect } from './Rect';\n\nexport class PredictedBox extends LabeledBox {\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\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\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 const extension = { detection };\n return { ...sourceObj, ...extension };\n}\n", "import { Environment } from './types';\n\nexport function createBrowserEnv(): Environment {\n const fetch = window.fetch;\n if (!fetch) throw new Error('fetch - missing fetch implementation for browser environment');\n\n const readFile = () => {\n throw new Error('readFile - filesystem not available for browser environment');\n };\n\n return {\n Canvas: HTMLCanvasElement,\n CanvasRenderingContext2D,\n Image: HTMLImageElement,\n ImageData,\n Video: HTMLVideoElement,\n createCanvasElement: () => document.createElement('canvas'),\n createImageElement: () => document.createElement('img'),\n fetch,\n readFile,\n };\n}\n", "import { FileSystem } from './types';\n\nexport function createFileSystem(fs?: any): FileSystem {\n let requireFsError = '';\n\n if (!fs) {\n try {\n // eslint-disable-next-line global-require\n fs = require('fs');\n } catch (err) {\n requireFsError = err.toString();\n }\n }\n\n const readFile = fs\n ? (filePath: string) => new Promise((resolve, reject) => {\n fs.readFile(filePath, (err: any, buffer: Buffer) => (err ? reject(err) : resolve(buffer)));\n })\n : () => {\n throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`);\n };\n\n return {\n readFile,\n };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { createFileSystem } from './createFileSystem';\nimport { Environment } from './types';\n\nexport function createNodejsEnv(): Environment {\n // eslint-disable-next-line dot-notation\n const Canvas = global['Canvas'] || global.HTMLCanvasElement;\n const Image = global.Image || global.HTMLImageElement;\n\n const createCanvasElement = () => {\n if (Canvas) return new Canvas();\n throw new Error('createCanvasElement - missing Canvas implementation for nodejs environment');\n };\n\n const createImageElement = () => {\n if (Image) return new Image();\n throw new Error('createImageElement - missing Image implementation for nodejs environment');\n };\n\n const fetch = global.fetch;\n // if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');\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}\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}\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()) return setEnv(createBrowserEnv());\n if (isNodejs()) return setEnv(createNodejsEnv());\n return null;\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/index';\n\nexport function resolveInput(arg: string | any) {\n if (!env.isNodejs() && typeof arg === 'string') {\n return document.getElementById(arg);\n }\n return arg;\n}\n", "import { env } from '../env/index';\nimport { resolveInput } from './resolveInput';\n\nexport function getContext2dOrThrow(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D): CanvasRenderingContext2D {\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}\n", "/* eslint-disable max-classes-per-file */\nimport { IDimensions, IPoint } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { resolveInput } from '../dom/resolveInput';\n\n// eslint-disable-next-line no-shadow\nexport enum AnchorPosition {\n // eslint-disable-next-line no-unused-vars\n TOP_LEFT = 'TOP_LEFT',\n // eslint-disable-next-line no-unused-vars\n TOP_RIGHT = 'TOP_RIGHT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n // eslint-disable-next-line no-unused-vars\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\n public backgroundColor: string\n\n public fontColor: string\n\n public fontSize: number\n\n public fontStyle: string\n\n public padding: number\n\n constructor(options: IDrawTextFieldOptions = {}) {\n const {\n anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = 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\n public anchor : IPoint\n\n public options: DrawTextFieldOptions\n\n constructor(\n text: string | string[] | DrawTextField,\n anchor: IPoint,\n options: IDrawTextFieldOptions = {},\n ) {\n // eslint-disable-next-line no-nested-ternary\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 {\n backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = 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}\n", "/* eslint-disable max-classes-per-file */\nimport { Box, IBoundingBox, IRect } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport {\n AnchorPosition, DrawTextField, DrawTextFieldOptions, IDrawTextFieldOptions,\n} 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\n public lineWidth: number\n\n public drawLabelOptions: DrawTextFieldOptions\n\n public label?: string\n\n constructor(options: IDrawBoxOptions = {}) {\n const {\n boxColor, lineWidth, label, drawLabelOptions,\n } = 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({ ...defaultDrawLabelOptions, ...drawLabelOptions });\n }\n}\n\nexport class DrawBox {\n public box: Box\n\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 {\n x, y, width, height,\n } = 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}\n", "import { Box, IBoundingBox, IRect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { round } from '../utils/index';\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 // eslint-disable-next-line no-nested-ternary\n const score = det instanceof FaceDetection\n ? det.score\n : (isWithFaceDetection(det) ? det.detection.score : undefined);\n\n // eslint-disable-next-line no-nested-ternary\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\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 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}\n", "import { env } from '../env/index';\n\nexport function isMediaLoaded(media: HTMLImageElement | HTMLVideoElement) : boolean {\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/index';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) {\n // eslint-disable-next-line consistent-return\n return new Promise((resolve, reject) => {\n if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) {\n return resolve(null);\n }\n\n function onError(e: Event) {\n if (!e.currentTarget) return;\n // eslint-disable-next-line no-use-before-define\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n reject(e);\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 media.addEventListener('load', onLoad);\n media.addEventListener('error', onError);\n });\n}\n", "import { env } from '../env/index';\n\nexport function bufferToImage(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) reject(new Error('bufferToImage - expected buf to be of type: Blob'));\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') reject(new Error('bufferToImage - expected reader.result to be a string, in onload'));\n const img = env.getEnv().createImageElement();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = reader.result as string;\n };\n reader.onerror = reject;\n reader.readAsDataURL(buf);\n });\n}\n", "import { Dimensions, IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\n\nexport function getMediaDimensions(input: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | IDimensions): Dimensions {\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/index';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function createCanvas({ width, height }: IDimensions): HTMLCanvasElement {\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 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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { env } from '../env/index';\nimport { isTensor4D } from '../utils/index';\n\nexport async function imageTensorToCanvas(\n imgTensor: tf.Tensor,\n canvas?: HTMLCanvasElement,\n): Promise {\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}\n", "import { env } from '../env/index';\n\nexport function isMediaElement(input: any) {\n const { Image, Canvas, Video } = env.getEnv();\n\n return input instanceof Image\n || input instanceof Canvas\n || input instanceof Video;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Dimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { padToSquare } from '../ops/padToSquare';\nimport {\n computeReshapedDimensions, isTensor3D, isTensor4D, range,\n} from '../utils/index';\nimport { createCanvasFromMedia } from './createCanvas';\nimport { imageToSquare } from './imageToSquare';\nimport { TResolvedNetInput } from './types';\n\nexport class NetInput {\n private _imageTensors: Array = []\n\n private _canvases: HTMLCanvasElement[] = []\n\n private _batchSize: number\n\n private _treatAsBatchInput: boolean = false\n\n private _inputDimensions: number[][] = []\n\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 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 this._inputSize = inputSize;\n\n return tf.tidy(() => {\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}\n", "import { env } from '../env/index';\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 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}\n", "import { isTensor3D, isTensor4D } from '../utils/index';\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 const 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 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}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { Rect } from '../classes/Rect';\nimport { env } from '../env/index';\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 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(({\n x, y, width, height,\n }) => {\n const faceImg = createCanvas({ width, height });\n getContext2dOrThrow(faceImg)\n .putImageData(ctx.getImageData(x, y, width, height), 0, 0);\n return faceImg;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isTensor3D, isTensor4D } from '../utils/index';\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 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(({\n x, y, width, height,\n }) => tf.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels]));\n\n return faceTensors;\n });\n}\n", "import { env } from '../env/index';\n\nexport async function fetchOrThrow(\n url: string,\n // eslint-disable-next-line no-undef\n init?: RequestInit,\n): Promise {\n const { fetch } = env.getEnv();\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}\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", "import * as tf from '../../dist/tfjs.esm';\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 const manifest = await fetchJson(manifestUri);\n // if (manifest['weightsManifest']) manifest = manifest['weightsManifest'];\n return tf.io.loadWeights(manifest, modelBaseUri);\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 // eslint-disable-next-line no-nested-ternary\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}\n", "import { IDimensions } from '../classes/index';\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\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 constructor() {\n super('FaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\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}\n", "import * as tf from '../dist/tfjs.esm';\n\nimport { ParamMapping } from './common/index';\nimport { getModelUris } from './common/getModelUris';\nimport { loadWeightMap } from './dom/index';\nimport { env } from './env/index';\n\nexport abstract class NeuralNetwork {\n protected _params: TNetParams | undefined = undefined\n\n protected _paramMappings: ParamMapping[] = []\n\n public _name: any;\n\n public get params(): TNetParams | undefined { return this._params; }\n\n public get paramMappings(): ParamMapping[] { return this._paramMappings; }\n\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((fp) => readFile(fp).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 // eslint-disable-next-line no-prototype-builtins\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\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParamsFromWeigthMap(weightMap: tf.NamedTensorMap): { params: TNetParams, paramMappings: ParamMapping[] }\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParams(weights: Float32Array): { params: TNetParams, paramMappings: ParamMapping[] }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, SeparableConvParams } from '../common/index';\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 '../../dist/tfjs.esm';\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}\n", "import * as tf from '../../dist/tfjs.esm';\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}\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 '../../dist/tfjs.esm';\n\nimport { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';\n\nexport function extractConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams => {\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", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, FCParams, ParamMapping } from './types';\n\nexport function extractFCParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): FCParams => {\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", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types';\n\nexport function extractSeparableConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (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\nexport function loadSeparableConvParamsFactory(\n // eslint-disable-next-line no-unused-vars\n extractWeightEntry: (originalPath: string, paramRank: number) => T,\n) {\n return (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", "import * as tf from '../../dist/tfjs.esm';\n\n// eslint-disable-next-line no-unused-vars\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 // eslint-disable-next-line no-useless-constructor\n constructor(\n // eslint-disable-next-line no-unused-vars\n public depthwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public pointwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public bias: tf.Tensor1D,\n // eslint-disable-next-line no-empty-function\n ) {}\n}\n", "import { isTensor } from '../utils/index';\nimport { ParamMapping } from './types';\n\nexport function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {\n return (originalPath: string, paramRank: number, mappedPath?: string) => {\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", "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}\n", "import {\n extractConvParamsFactory,\n extractSeparableConvParamsFactory,\n ExtractWeightsFunction,\n ParamMapping,\n} from '../common/index';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\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 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 const { conv0, conv1, conv2 } = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer);\n const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\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: {\n dense0, dense1, dense2, dense3,\n },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\n// eslint-disable-next-line no-unused-vars\nexport function loadConvParamsFactory(extractWeightEntry: (originalPath: string, paramRank: number) => T) {\n return (prefix: string): ConvParams => {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return { filters, bias };\n };\n}\n", "import { extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\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 {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { NetInput } from '../dom/index';\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 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\n protected abstract getClassifierChannelsIn(): number\n\n protected abstract getClassifierChannelsOut(): number\n\n public runNet(input: NetInput | tf.Tensor4D): tf.Tensor2D {\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 const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeigthMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from './types';\n\nexport function fullyConnectedLayer(\n x: tf.Tensor2D,\n params: FCParams,\n): tf.Tensor2D {\n return tf.tidy(() => tf.add(\n tf.matMul(x, params.weights),\n params.bias,\n ));\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport {\n disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping,\n} from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function seperateWeightMaps(weightMap: tf.NamedTensorMap) {\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", "export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised'];\n\nexport class FaceExpressions {\n public neutral: number\n\n public happy: number\n\n public sad: number\n\n public angry: number\n\n public fearful: number\n\n public disgusted: number\n\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}\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 const extension = { expressions };\n return { ...sourceObj, ...extension };\n}\n", "import { IPoint, Point } from '../classes/index';\nimport { FaceExpressions } from '../faceExpressionNet/index';\nimport { isWithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { round } from '../utils/index';\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 // eslint-disable-next-line no-nested-ternary\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((exprLocal) => exprLocal.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((exprLocal) => `${exprLocal.expression} (${round(exprLocal.probability)})`),\n anchor,\n );\n drawTextField.draw(canvasArg);\n });\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 > = 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 // eslint-disable-next-line dot-notation\n && obj['landmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['unshiftedLandmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['alignedRect'] instanceof FaceDetection;\n}\n\nexport function extendWithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 >(sourceObj: TSource, unshiftedLandmarks: TFaceLandmarks): WithFaceLandmarks {\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 { ...sourceObj, ...extension };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IPoint } from '../classes/index';\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\n public drawPoints: boolean\n\n public lineWidth: number\n\n public pointSize: number\n\n public lineColor: string\n\n public pointColor: string\n\n constructor(options: IDrawFaceLandmarksOptions = {}) {\n const {\n drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor,\n } = 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\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 {\n drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor,\n } = 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 // eslint-disable-next-line no-nested-ternary\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}\n", "import * as tf from '../../dist/tfjs.esm';\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 {\n AgeAndGenderPrediction, Gender, NetOutput, NetParams,\n} from './types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\n\nexport class AgeGenderNet extends NeuralNetwork {\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 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 const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeigthMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, depthwiseSeparableConv } from '../common/index';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { range } from '../utils/index';\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 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 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}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, extractWeightsFactory } from '../common/index';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractReductionBlockParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ReductionBlockParams {\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 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\nexport function extractParams(weights: Float32Array, numMainBlocks: number): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport {\n disposeUnusedWeightTensors,\n extractWeightEntryFactory,\n loadSeparableConvParamsFactory,\n ParamMapping,\n} from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\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 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 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 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}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport {\n disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping,\n} from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from '../common/index';\n\n// eslint-disable-next-line no-shadow\nexport enum Gender {\n // eslint-disable-next-line no-unused-vars\n FEMALE = 'female',\n // eslint-disable-next-line no-unused-vars\n MALE = 'male'\n}\n\nexport type AgeAndGenderPrediction = {\n age: number\n gender: Gender\n genderProbability: number\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { IDimensions, Point } from '../classes/index';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { isEven } from '../utils/index';\n\nexport abstract class FaceLandmark68NetBase<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends FaceProcessor {\n public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {\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) => tf.stack([tf.fill([68], fillX, 'float32'), tf.fill([68], fillY, 'float32')], 1).as2D(1, 136).as1D();\n\n // eslint-disable-next-line no-unused-vars\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\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) => createInterleavedTensor(\n getPaddingX(batchIdx),\n getPaddingY(batchIdx),\n ))))\n .div(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n inputDimensions[batchIdx].width,\n inputDimensions[batchIdx].height,\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}\n", "import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68Net extends FaceLandmark68NetBase {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\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 constructor() {\n super('TinyFaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeigthMapTiny(\n weightMap: tf.NamedTensorMap,\n): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\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}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\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}\n", "import { TinyFaceFeatureExtractor } from '../faceFeatureExtractor/TinyFaceFeatureExtractor';\nimport { TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68TinyNet extends FaceLandmark68NetBase {\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}\n", "import { FaceLandmark68Net } from './FaceLandmark68Net';\n\nexport * from './FaceLandmark68Net';\nexport * from './FaceLandmark68TinyNet';\n\nexport class FaceLandmarkNet extends FaceLandmark68Net {}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { convDown } from './convLayer';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeigthMap } from './extractParamsFromWeigthMap';\nimport { residual, residualDown } from './residualLayer';\nimport { NetParams } from './types';\n\nexport class FaceRecognitionNet extends NeuralNetwork {\n constructor() {\n super('FaceRecognitionNet');\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { scale } from './scaleLayer';\nimport { ConvLayerParams } from './types';\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}\n", "import * as tf from '../../dist/tfjs.esm';\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 '../../dist/tfjs.esm';\n\nimport {\n ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping,\n} from '../common/index';\nimport { isFloat } from '../utils/index';\nimport {\n ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams,\n} from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\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 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 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 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 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\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor2D } from '../utils/index';\nimport {\n ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams,\n} from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractScaleLayerParams(prefix: string): ScaleLayerParams {\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 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\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\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;\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}\n", "import * as tf from '../../dist/tfjs.esm';\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}\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}\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 const extension = { descriptor };\n return { ...sourceObj, ...extension };\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 const extension = { age };\n return { ...sourceObj, ...extension };\n}\n", "import { Gender } from '../ageGenderNet/types';\nimport { isValidProbablitiy } from '../utils/index';\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 const extension = { gender, genderProbability };\n return { ...sourceObj, ...extension };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\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\nexport class SsdMobilenetv1 extends NeuralNetwork {\n constructor() {\n super('SsdMobilenetv1');\n }\n\n public forwardInput(input: NetInput) {\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 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 // 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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport {\n ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory,\n} from '../common/index';\nimport {\n MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams,\n} from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {\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 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 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 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 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\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport {\n ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping,\n} from '../common/index';\nimport { isTensor3D } from '../utils/index';\nimport {\n BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams,\n} from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {\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 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 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 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}\n", "import * as tf from '../../dist/tfjs.esm';\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 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\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 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 '../../dist/tfjs.esm';\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 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 '../../dist/tfjs.esm';\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 = Math.max(intersectionYmax - intersectionYmin, 0.0)\n * Math.max(intersectionXmax - intersectionXmin, 0.0);\n return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n\nexport function nonMaxSuppression(\n boxes: tf.Tensor2D,\n scores: number[],\n maxOutputSize: number,\n iouThreshold: number,\n scoreThreshold: number,\n): number[] {\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) continue;\n c.score *= suppressFunc(iou);\n if (c.score <= scoreThreshold) break;\n }\n if (originalScore === c.score) {\n selected.push(c.boxIndex);\n }\n });\n\n return selected;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { OutputLayerParams } from './types';\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 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 '../../dist/tfjs.esm';\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 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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { convLayer } from '../common/index';\nimport { BoxPredictionParams } from './types';\n\nexport function boxPredictionLayer(\n x: tf.Tensor4D,\n params: BoxPredictionParams,\n) {\n return tf.tidy(() => {\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}\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\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\n get maxResults(): number { return this._maxResults; }\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 {}\n", "import { Point } from '../classes/index';\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';\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { BoundingBox } from '../classes/BoundingBox';\nimport { Dimensions } from '../classes/Dimensions';\nimport { ObjectDetection } from '../classes/ObjectDetection';\nimport { convLayer } from '../common/index';\nimport { ConvParams, SeparableConvParams } from '../common/types';\nimport { toNetInput } from '../dom/index';\nimport { NetInput } from '../dom/NetInput';\nimport { TNetInput } from '../dom/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { sigmoid } from '../ops/index';\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 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 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 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 const { params } = this;\n\n if (!params) {\n throw new Error('TinyYolov2 - load model before inference');\n }\n\n return tf.tidy(() => {\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 this.forwardInput(await toNetInput(input), inputSize);\n }\n\n public async detect(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise {\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) => new ObjectDetection(\n scores[idx],\n classScores[idx],\n classNames[idx],\n boxes[idx],\n inputDimensions,\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 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 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 widthLocal = ((Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x) / numCells) * correctionFactorX;\n const heightLocal = ((Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y) / numCells) * correctionFactorY;\n\n const x = (ctX - (widthLocal / 2));\n const y = (ctY - (heightLocal / 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 + widthLocal, y + heightLocal),\n 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}\n", "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 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 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 throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\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}\n", "import * as tf from '../../dist/tfjs.esm';\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}\n", "import * as tf from '../../dist/tfjs.esm';\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { extractConvParamsFactory } from '../common/index';\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 const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n\n function extractBatchNormParams(size: number, mappedPrefix: string): BatchNorm {\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 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\nexport function extractParams(\n weights: Float32Array,\n config: TinyYolov2Config,\n boxEncodingSize: number,\n filterSizes: number[],\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\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 = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\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 = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n }\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from '../common/index';\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 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\nexport function extractParamsFromWeigthMap(\n weightMap: tf.NamedTensorMap,\n config: TinyYolov2Config,\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\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 // eslint-disable-next-line no-mixed-operators\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}\n", "export interface ITinyYolov2Options {\n inputSize?: number\n scoreThreshold?: number\n}\n\nexport class TinyYolov2Options {\n protected _name: string = 'TinyYolov2Options'\n\n private _inputSize: number\n\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\n get scoreThreshold(): number { return this._scoreThreshold; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\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 constructor(withSeparableConvs: boolean = true) {\n const config = {\n withSeparableConvs,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\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}\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}\n", "import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\n\nexport interface ITinyFaceDetectorOptions extends ITinyYolov2Options {}\n\nexport class TinyFaceDetectorOptions extends TinyYolov2Options {\n protected _name: string = 'TinyFaceDetectorOptions'\n}\n", "export class ComposableTask {\n public async then(\n // eslint-disable-next-line no-unused-vars\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", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\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 // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\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 public async run(): Promise[]> {\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) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i]));\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 public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\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}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\n\nexport async function extractAllFacesAndComputeResults, TResult>(\n parentResults: TSource[],\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResults: (faces: Array) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment: (parentResult: WithFaceLandmarks) => FaceDetection = ({ alignedRect }) => alignedRect,\n) {\n const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)\n ? getRectForAlignment(parentResult)\n : parentResult.detection));\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 // eslint-disable-next-line no-unused-vars\n computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment?: (parentResultLocal: WithFaceLandmarks) => FaceDetection,\n) {\n return extractAllFacesAndComputeResults(\n [parentResult],\n input,\n async (faces) => computeResult(faces[0]),\n extractedFaces,\n getRectForAlignment,\n );\n}\n", "import { Point } from '../classes/index';\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];\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/index';\nimport { TNetInput } from '../dom/index';\nimport { ITinyYolov2Options } from '../tinyYolov2/index';\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 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}\n", "import { AgeGenderNet } from '../ageGenderNet/AgeGenderNet';\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { TNetInput } from '../dom/index';\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 { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2/index';\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 => 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 => 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 => 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 => 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 => 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 => nets.faceRecognitionNet.computeFaceDescriptor(input);\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 => 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 => 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;\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { TNetInput } from '../dom/index';\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 // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const faceExpressionsByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => 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 public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\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 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 withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { TNetInput } from '../dom/index';\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 // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase>[], TSource[]> {\n public async run(): Promise>[]> {\n const parentResults = await this.parentTask;\n\n const ageAndGenderByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => 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 public async run(): Promise> | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\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 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 withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { TNetInput } from '../dom/index';\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 // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n ) {\n super();\n }\n}\n\nexport class ComputeAllFaceDescriptorsTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const descriptors = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise)),\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 public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n const descriptor = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise,\n null,\n // eslint-disable-next-line no-shadow\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}\n", "/* eslint-disable max-classes-per-file */\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { TinyYolov2Options } from '../tinyYolov2/index';\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 // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected options: FaceDetectionOptions = new SsdMobilenetv1Options(),\n ) {\n super();\n }\n}\n\nexport class DetectAllFacesTask extends DetectFacesTaskBase {\n public async run(): Promise {\n const { input, options } = this;\n\n // eslint-disable-next-line no-nested-ternary\n const faceDetectionFunction = options instanceof TinyFaceDetectorOptions\n // eslint-disable-next-line no-shadow\n ? (input: TNetInput) => nets.tinyFaceDetector.locateFaces(input, options)\n : (\n // eslint-disable-next-line no-nested-ternary\n options instanceof SsdMobilenetv1Options\n // eslint-disable-next-line no-shadow\n ? (input: TNetInput) => nets.ssdMobilenetv1.locateFaces(input, options)\n : (\n options instanceof TinyYolov2Options\n // eslint-disable-next-line no-shadow\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 // eslint-disable-next-line no-async-promise-executor\n return new Promise[]>(async (resolve) => {\n const detections = await this.run();\n resolve(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 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 // eslint-disable-next-line no-async-promise-executor\n return new Promise | undefined>(async (resolve) => {\n const detection = await this.run();\n resolve(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}\n", "import { TNetInput } from '../dom/index';\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}\n", "import { TNetInput } from '../dom/index';\nimport { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/index';\nimport { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\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 return 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 return 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) 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 + (diff ** 2), 0),\n );\n}\n", "import { FaceMatch } from '../classes/FaceMatch';\nimport { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors';\nimport { euclideanDistance } from '../euclideanDistance';\nimport { WithFaceDescriptor } from '../factories/index';\n\nexport class FaceMatcher {\n private _labeledDescriptors: LabeledFaceDescriptors[]\n\n private _distanceThreshold: number\n\n constructor(\n inputs: LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>,\n distanceThreshold: number = 0.6,\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\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}\n", "import { Dimensions, IDimensions } from './classes/index';\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 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}\n"],
- "mappings": "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",
+ "mappings": "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",
"names": []
}
diff --git a/dist/face-api.esm-nobundle.json b/dist/face-api.esm-nobundle.json
index 321982c..fff414a 100644
--- a/dist/face-api.esm-nobundle.json
+++ b/dist/face-api.esm-nobundle.json
@@ -1077,7 +1077,7 @@
]
},
"package.json": {
- "bytes": 1728,
+ "bytes": 1807,
"imports": []
},
"src/xception/extractParams.ts": {
@@ -2136,7 +2136,7 @@
"dist/face-api.esm-nobundle.js.map": {
"imports": [],
"inputs": {},
- "bytes": 303708
+ "bytes": 311523
},
"dist/face-api.esm-nobundle.js": {
"imports": [],
@@ -2264,43 +2264,43 @@
],
"inputs": {
"dist/tfjs.esm.js": {
- "bytesInOutput": 246
+ "bytesInOutput": 247
},
"src/env/isNodejs.ts": {
- "bytesInOutput": 224
+ "bytesInOutput": 229
},
"src/index.ts": {
- "bytesInOutput": 201
+ "bytesInOutput": 206
},
"src/draw/index.ts": {
- "bytesInOutput": 447
+ "bytesInOutput": 451
},
"src/draw/drawContour.ts": {
"bytesInOutput": 313
},
"src/utils/index.ts": {
- "bytesInOutput": 1561
+ "bytesInOutput": 1560
},
"src/classes/Dimensions.ts": {
- "bytesInOutput": 394
+ "bytesInOutput": 398
},
"src/classes/Point.ts": {
- "bytesInOutput": 472
+ "bytesInOutput": 473
},
"src/classes/Box.ts": {
- "bytesInOutput": 3300
+ "bytesInOutput": 3305
},
"src/classes/BoundingBox.ts": {
- "bytesInOutput": 149
+ "bytesInOutput": 153
},
"src/classes/index.ts": {
"bytesInOutput": 0
},
"src/classes/ObjectDetection.ts": {
- "bytesInOutput": 753
+ "bytesInOutput": 754
},
"src/classes/FaceDetection.ts": {
- "bytesInOutput": 268
+ "bytesInOutput": 272
},
"src/ops/iou.ts": {
"bytesInOutput": 328
@@ -2324,10 +2324,10 @@
"bytesInOutput": 188
},
"src/classes/Rect.ts": {
- "bytesInOutput": 135
+ "bytesInOutput": 136
},
"src/classes/FaceLandmarks.ts": {
- "bytesInOutput": 1884
+ "bytesInOutput": 1888
},
"src/classes/FaceLandmarks5.ts": {
"bytesInOutput": 153
@@ -2372,16 +2372,16 @@
"bytesInOutput": 446
},
"src/draw/DrawTextField.ts": {
- "bytesInOutput": 2254
+ "bytesInOutput": 2255
},
"src/draw/DrawBox.ts": {
- "bytesInOutput": 821
+ "bytesInOutput": 825
},
"src/draw/drawDetections.ts": {
"bytesInOutput": 390
},
"src/faceExpressionNet/FaceExpressionNet.ts": {
- "bytesInOutput": 874
+ "bytesInOutput": 878
},
"src/dom/isMediaLoaded.ts": {
"bytesInOutput": 151
@@ -2444,16 +2444,16 @@
"bytesInOutput": 201
},
"src/faceFeatureExtractor/FaceFeatureExtractor.ts": {
- "bytesInOutput": 895
+ "bytesInOutput": 897
},
"src/NeuralNetwork.ts": {
- "bytesInOutput": 3282
+ "bytesInOutput": 3292
},
"src/faceFeatureExtractor/denseBlock.ts": {
- "bytesInOutput": 1171
+ "bytesInOutput": 1176
},
"src/common/depthwiseSeparableConv.ts": {
- "bytesInOutput": 240
+ "bytesInOutput": 244
},
"src/common/convLayer.ts": {
"bytesInOutput": 229
@@ -2471,10 +2471,10 @@
"bytesInOutput": 428
},
"src/common/extractSeparableConvParamsFactory.ts": {
- "bytesInOutput": 945
+ "bytesInOutput": 946
},
"src/common/types.ts": {
- "bytesInOutput": 173
+ "bytesInOutput": 177
},
"src/common/extractWeightEntryFactory.ts": {
"bytesInOutput": 366
@@ -2498,10 +2498,10 @@
"bytesInOutput": 400
},
"src/faceProcessor/FaceProcessor.ts": {
- "bytesInOutput": 1579
+ "bytesInOutput": 1585
},
"src/common/fullyConnectedLayer.ts": {
- "bytesInOutput": 149
+ "bytesInOutput": 153
},
"src/faceProcessor/extractParams.ts": {
"bytesInOutput": 382
@@ -2513,7 +2513,7 @@
"bytesInOutput": 252
},
"src/faceExpressionNet/FaceExpressions.ts": {
- "bytesInOutput": 527
+ "bytesInOutput": 532
},
"src/faceExpressionNet/index.ts": {
"bytesInOutput": 0
@@ -2531,13 +2531,13 @@
"bytesInOutput": 1723
},
"package.json": {
- "bytesInOutput": 20
+ "bytesInOutput": 21
},
"src/ageGenderNet/AgeGenderNet.ts": {
- "bytesInOutput": 2554
+ "bytesInOutput": 2559
},
"src/xception/TinyXception.ts": {
- "bytesInOutput": 1901
+ "bytesInOutput": 1905
},
"src/xception/extractParams.ts": {
"bytesInOutput": 2443
@@ -2558,16 +2558,16 @@
"bytesInOutput": 0
},
"src/faceLandmarkNet/FaceLandmark68NetBase.ts": {
- "bytesInOutput": 2029
+ "bytesInOutput": 2035
},
"src/faceLandmarkNet/FaceLandmark68Net.ts": {
- "bytesInOutput": 253
+ "bytesInOutput": 257
},
"src/faceLandmarkNet/index.ts": {
- "bytesInOutput": 50
+ "bytesInOutput": 54
},
"src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts": {
- "bytesInOutput": 888
+ "bytesInOutput": 889
},
"src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts": {
"bytesInOutput": 362
@@ -2576,16 +2576,16 @@
"bytesInOutput": 517
},
"src/faceLandmarkNet/FaceLandmark68TinyNet.ts": {
- "bytesInOutput": 269
+ "bytesInOutput": 274
},
"src/faceRecognitionNet/FaceRecognitionNet.ts": {
- "bytesInOutput": 1705
+ "bytesInOutput": 1706
},
"src/faceRecognitionNet/convLayer.ts": {
- "bytesInOutput": 458
+ "bytesInOutput": 463
},
"src/faceRecognitionNet/scaleLayer.ts": {
- "bytesInOutput": 119
+ "bytesInOutput": 123
},
"src/faceRecognitionNet/extractParams.ts": {
"bytesInOutput": 3405
@@ -2612,52 +2612,52 @@
"bytesInOutput": 244
},
"src/ssdMobilenetv1/SsdMobilenetv1.ts": {
- "bytesInOutput": 1900
+ "bytesInOutput": 1905
},
"src/ssdMobilenetv1/extractParams.ts": {
- "bytesInOutput": 5963
+ "bytesInOutput": 5967
},
"src/ssdMobilenetv1/extractParamsFromWeigthMap.ts": {
"bytesInOutput": 4319
},
"src/ssdMobilenetv1/mobileNetV1.ts": {
- "bytesInOutput": 1110
+ "bytesInOutput": 1111
},
"src/ssdMobilenetv1/pointwiseConvLayer.ts": {
- "bytesInOutput": 235
+ "bytesInOutput": 239
},
"src/ssdMobilenetv1/nonMaxSuppression.ts": {
- "bytesInOutput": 1502
+ "bytesInOutput": 1504
},
"src/ssdMobilenetv1/outputLayer.ts": {
"bytesInOutput": 1590
},
"src/ssdMobilenetv1/predictionLayer.ts": {
- "bytesInOutput": 1418
+ "bytesInOutput": 1419
},
"src/ssdMobilenetv1/boxPredictionLayer.ts": {
- "bytesInOutput": 350
+ "bytesInOutput": 354
},
"src/ssdMobilenetv1/SsdMobilenetv1Options.ts": {
- "bytesInOutput": 554
+ "bytesInOutput": 555
},
"src/ssdMobilenetv1/index.ts": {
- "bytesInOutput": 234
+ "bytesInOutput": 235
},
"src/tinyYolov2/const.ts": {
- "bytesInOutput": 485
+ "bytesInOutput": 490
},
"src/tinyYolov2/TinyYolov2Base.ts": {
- "bytesInOutput": 5885
+ "bytesInOutput": 5894
},
"src/tinyYolov2/config.ts": {
- "bytesInOutput": 1164
+ "bytesInOutput": 1168
},
"src/tinyYolov2/convWithBatchNorm.ts": {
- "bytesInOutput": 322
+ "bytesInOutput": 323
},
"src/tinyYolov2/leaky.ts": {
- "bytesInOutput": 178
+ "bytesInOutput": 182
},
"src/tinyYolov2/depthwiseSeparableConv.ts": {
"bytesInOutput": 293
@@ -2678,37 +2678,37 @@
"bytesInOutput": 139
},
"src/tinyFaceDetector/TinyFaceDetectorOptions.ts": {
- "bytesInOutput": 132
+ "bytesInOutput": 133
},
"src/globalApi/ComposableTask.ts": {
- "bytesInOutput": 154
+ "bytesInOutput": 159
},
"src/globalApi/DetectFaceLandmarksTasks.ts": {
- "bytesInOutput": 1912
+ "bytesInOutput": 1926
},
"src/globalApi/extractFacesAndComputeResults.ts": {
- "bytesInOutput": 812
+ "bytesInOutput": 816
},
"src/tinyFaceDetector/const.ts": {
- "bytesInOutput": 215
+ "bytesInOutput": 216
},
"src/tinyFaceDetector/TinyFaceDetector.ts": {
- "bytesInOutput": 624
+ "bytesInOutput": 629
},
"src/globalApi/nets.ts": {
- "bytesInOutput": 1515
+ "bytesInOutput": 1520
},
"src/globalApi/PredictFaceExpressionsTask.ts": {
- "bytesInOutput": 1691
+ "bytesInOutput": 1700
},
"src/globalApi/PredictAgeAndGenderTask.ts": {
- "bytesInOutput": 1785
+ "bytesInOutput": 1794
},
"src/globalApi/ComputeFaceDescriptorsTasks.ts": {
- "bytesInOutput": 1390
+ "bytesInOutput": 1399
},
"src/globalApi/DetectFacesTasks.ts": {
- "bytesInOutput": 2221
+ "bytesInOutput": 2225
},
"src/globalApi/detectFaces.ts": {
"bytesInOutput": 224
@@ -2732,7 +2732,7 @@
"bytesInOutput": 824
}
},
- "bytes": 129069
+ "bytes": 129272
}
}
}
diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js
index b1a6736..2773a3b 100644
--- a/dist/face-api.esm.js
+++ b/dist/face-api.esm.js
@@ -5,43 +5,43 @@
author: '
*/
-var __create=Object.create,__defProp=Object.defineProperty,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__markAsModule=target=>__defProp(target,"__esModule",{value:!0}),__commonJS=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export=(target,all4)=>{__markAsModule(target);for(var name in all4)__defProp(target,name,{get:all4[name],enumerable:!0})},__exportStar=(target,module,desc)=>{if(__markAsModule(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames(module))!__hasOwnProp.call(target,key)&&key!=="default"&&__defProp(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc(module,key))||desc.enumerable});return target},__toModule=module=>module&&module.__esModule?module:__exportStar(__defProp(module!=null?__create(__getProtoOf(module)):{},"default",{value:module,enumerable:!0}),module),require_isNodejs=__commonJS((exports,module)=>{__export(exports,{isNodejs:()=>isNodejs2});function isNodejs2(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}}),tfjs_esm_exports={};__export(tfjs_esm_exports,{Abs:()=>Abs,Acos:()=>Acos,Acosh:()=>Acosh,AdadeltaOptimizer:()=>AdadeltaOptimizer,AdagradOptimizer:()=>AdagradOptimizer,AdamOptimizer:()=>AdamOptimizer,AdamaxOptimizer:()=>AdamaxOptimizer,Add:()=>Add,AddN:()=>AddN,All:()=>All,Any:()=>Any,ArgMax:()=>ArgMax,ArgMin:()=>ArgMin,Asin:()=>Asin,Asinh:()=>Asinh,Atan:()=>Atan,Atan2:()=>Atan2,Atanh:()=>Atanh,AvgPool:()=>AvgPool,AvgPool3D:()=>AvgPool3D,AvgPool3DGrad:()=>AvgPool3DGrad,AvgPoolGrad:()=>AvgPoolGrad,BackendWasm:()=>BackendWasm,BatchMatMul:()=>BatchMatMul,BatchToSpaceND:()=>BatchToSpaceND,Bincount:()=>Bincount,BroadcastTo:()=>BroadcastTo,Callback:()=>Callback,CallbackList:()=>CallbackList,Cast:()=>Cast,Ceil:()=>Ceil,ClipByValue:()=>ClipByValue,Complex:()=>Complex,ComplexAbs:()=>ComplexAbs,Concat:()=>Concat,Conv2D:()=>Conv2D,Conv2DBackpropFilter:()=>Conv2DBackpropFilter,Conv2DBackpropInput:()=>Conv2DBackpropInput,Conv3D:()=>Conv3D,Conv3DBackpropFilterV2:()=>Conv3DBackpropFilterV2,Conv3DBackpropInputV2:()=>Conv3DBackpropInputV2,Cos:()=>Cos,Cosh:()=>Cosh,CropAndResize:()=>CropAndResize,Cumsum:()=>Cumsum,CustomCallback:()=>CustomCallback,DataStorage:()=>DataStorage,DenseBincount:()=>DenseBincount,DepthToSpace:()=>DepthToSpace,DepthwiseConv2dNative:()=>DepthwiseConv2dNative,DepthwiseConv2dNativeBackpropFilter:()=>DepthwiseConv2dNativeBackpropFilter,DepthwiseConv2dNativeBackpropInput:()=>DepthwiseConv2dNativeBackpropInput,Diag:()=>Diag,Dilation2D:()=>Dilation2D,Dilation2DBackpropFilter:()=>Dilation2DBackpropFilter,Dilation2DBackpropInput:()=>Dilation2DBackpropInput,ENV:()=>ENV,EarlyStopping:()=>EarlyStopping,Elu:()=>Elu,EluGrad:()=>EluGrad,Environment:()=>Environment,Equal:()=>Equal,Erf:()=>Erf,Exp:()=>Exp,ExpandDims:()=>ExpandDims,Expm1:()=>Expm1,FFT:()=>FFT,Fill:()=>Fill,FlipLeftRight:()=>FlipLeftRight,Floor:()=>Floor,FloorDiv:()=>FloorDiv,FromPixels:()=>FromPixels,FusedBatchNorm:()=>FusedBatchNorm,FusedConv2D:()=>FusedConv2D,FusedDepthwiseConv2D:()=>FusedDepthwiseConv2D,GatherNd:()=>GatherNd,GatherV2:()=>GatherV2,GraphModel:()=>GraphModel,Greater:()=>Greater,GreaterEqual:()=>GreaterEqual,History:()=>History,IFFT:()=>IFFT,Identity:()=>Identity,Imag:()=>Imag,InputSpec:()=>InputSpec,IsFinite:()=>IsFinite,IsInf:()=>IsInf,IsNan:()=>IsNan,KernelBackend:()=>KernelBackend,LRN:()=>LRN,LRNGrad:()=>LRNGrad,LayerVariable:()=>LayerVariable,LayersModel:()=>LayersModel,LeakyRelu:()=>LeakyRelu,Less:()=>Less,LessEqual:()=>LessEqual,LinSpace:()=>LinSpace,Log:()=>Log,Log1p:()=>Log1p,LogSoftmax:()=>LogSoftmax,LogicalAnd:()=>LogicalAnd,LogicalNot:()=>LogicalNot,LogicalOr:()=>LogicalOr,Max:()=>Max,MaxPool:()=>MaxPool,MaxPool3D:()=>MaxPool3D,MaxPool3DGrad:()=>MaxPool3DGrad,MaxPoolGrad:()=>MaxPoolGrad,MaxPoolWithArgmax:()=>MaxPoolWithArgmax,Maximum:()=>Maximum,Mean:()=>Mean,Min:()=>Min,Minimum:()=>Minimum,MirrorPad:()=>MirrorPad,Mod:()=>Mod,MomentumOptimizer:()=>MomentumOptimizer,Multinomial:()=>Multinomial,Multiply:()=>Multiply,Neg:()=>Neg,NonMaxSuppressionV3:()=>NonMaxSuppressionV3,NonMaxSuppressionV4:()=>NonMaxSuppressionV4,NonMaxSuppressionV5:()=>NonMaxSuppressionV5,NotEqual:()=>NotEqual,OP_SCOPE_SUFFIX:()=>OP_SCOPE_SUFFIX,OneHot:()=>OneHot,OnesLike:()=>OnesLike,Optimizer:()=>Optimizer,Pack:()=>Pack,PadV2:()=>PadV2,Pool:()=>Pool,Pow:()=>Pow,Prelu:()=>Prelu,Prod:()=>Prod,RMSPropOptimizer:()=>RMSPropOptimizer,RNN:()=>RNN,Range:()=>Range,Rank:()=>Rank,Real:()=>Real,RealDiv:()=>RealDiv,Reciprocal:()=>Reciprocal,Reduction:()=>Reduction,Relu:()=>Relu,Relu6:()=>Relu6,Reshape:()=>Reshape,ResizeBilinear:()=>ResizeBilinear,ResizeBilinearGrad:()=>ResizeBilinearGrad,ResizeNearestNeighbor:()=>ResizeNearestNeighbor,ResizeNearestNeighborGrad:()=>ResizeNearestNeighborGrad,Reverse:()=>Reverse,RotateWithOffset:()=>RotateWithOffset,Round:()=>Round,Rsqrt:()=>Rsqrt,SGDOptimizer:()=>SGDOptimizer,ScatterNd:()=>ScatterNd,Select:()=>Select,Selu:()=>Selu,Sequential:()=>Sequential,Sigmoid:()=>Sigmoid,Sign:()=>Sign,Sin:()=>Sin,Sinh:()=>Sinh,Slice:()=>Slice,Softmax:()=>Softmax,Softplus:()=>Softplus,SpaceToBatchND:()=>SpaceToBatchND,SparseToDense:()=>SparseToDense,SplitV:()=>SplitV,Sqrt:()=>Sqrt,Square:()=>Square,SquaredDifference:()=>SquaredDifference,Step:()=>Step,StridedSlice:()=>StridedSlice,Sub:()=>Sub,Sum:()=>Sum,SymbolicTensor:()=>SymbolicTensor,Tan:()=>Tan,Tanh:()=>Tanh,Tensor:()=>Tensor,TensorBuffer:()=>TensorBuffer,Tile:()=>Tile,TopK:()=>TopK,Transpose:()=>Transpose,Unique:()=>Unique,Unpack:()=>Unpack,UnsortedSegmentSum:()=>UnsortedSegmentSum,Variable:()=>Variable,ZerosLike:()=>ZerosLike,_FusedMatMul:()=>_FusedMatMul,abs:()=>abs,acos:()=>acos,acosh:()=>acosh,add:()=>add2,addN:()=>addN,addStrict:()=>addStrict,all:()=>all,any:()=>any,argMax:()=>argMax,argMin:()=>argMin,asin:()=>asin,asinh:()=>asinh,atan:()=>atan,atan2:()=>atan2,atanh:()=>atanh,avgPool:()=>avgPool,avgPool3d:()=>avgPool3d,backend:()=>backend,backend_util:()=>backend_util_exports,basicLSTMCell:()=>basicLSTMCell,batchNorm:()=>batchNorm,batchNorm2d:()=>batchNorm2d,batchNorm3d:()=>batchNorm3d,batchNorm4d:()=>batchNorm4d,batchToSpaceND:()=>batchToSpaceND,bincount:()=>bincount,booleanMaskAsync:()=>booleanMaskAsync,broadcastTo:()=>broadcastTo,browser:()=>browser_exports,buffer:()=>buffer,callbacks:()=>callbacks,cast:()=>cast,ceil:()=>ceil,clipByValue:()=>clipByValue,clone:()=>clone,complex:()=>complex,concat:()=>concat,concat1d:()=>concat1d,concat2d:()=>concat2d,concat3d:()=>concat3d,concat4d:()=>concat4d,constraints:()=>exports_constraints_exports,conv1d:()=>conv1d,conv2d:()=>conv2d,conv2dTranspose:()=>conv2dTranspose,conv3d:()=>conv3d,conv3dTranspose:()=>conv3dTranspose,copyRegisteredKernels:()=>copyRegisteredKernels,cos:()=>cos,cosh:()=>cosh,cosineWindow:()=>cosineWindow,cumsum:()=>cumsum,customGrad:()=>customGrad,data:()=>dist_exports,denseBincount:()=>denseBincount,deprecationWarn:()=>deprecationWarn,depthToSpace:()=>depthToSpace,depthwiseConv2d:()=>depthwiseConv2d,deregisterOp:()=>deregisterOp,device_util:()=>device_util_exports,diag:()=>diag,dilation2d:()=>dilation2d,disableDeprecationWarnings:()=>disableDeprecationWarnings,dispose:()=>dispose,disposeVariables:()=>disposeVariables,div:()=>div,divNoNan:()=>divNoNan,divStrict:()=>divStrict,dot:()=>dot,dropout:()=>dropout,elu:()=>elu,enableDebugMode:()=>enableDebugMode,enableProdMode:()=>enableProdMode,enclosingPowerOfTwo:()=>enclosingPowerOfTwo,engine:()=>engine,env:()=>env,equal:()=>equal,equalStrict:()=>equalStrict,erf:()=>erf,exp:()=>exp,expandDims:()=>expandDims,expm1:()=>expm1,eye:()=>eye,fft:()=>fft,fill:()=>fill,findBackend:()=>findBackend,findBackendFactory:()=>findBackendFactory,floor:()=>floor,floorDiv:()=>floorDiv,fused:()=>fused_ops_exports,gather:()=>gather,gatherND:()=>gatherND,gather_util:()=>gather_nd_util_exports,getBackend:()=>getBackend,getGradient:()=>getGradient,getKernel:()=>getKernel,getKernelsForBackend:()=>getKernelsForBackend,grad:()=>grad,grads:()=>grads,greater:()=>greater,greaterEqual:()=>greaterEqual,greaterEqualStrict:()=>greaterEqualStrict,greaterStrict:()=>greaterStrict,ifft:()=>ifft,imag:()=>imag,image:()=>image,inTopKAsync:()=>inTopKAsync,initializers:()=>exports_initializers_exports,input:()=>input,io:()=>io_exports,irfft:()=>irfft,isFinite:()=>isFinite2,isInf:()=>isInf,isNaN:()=>isNaN2,keep:()=>keep,kernel_impls:()=>kernel_impls_exports,layers:()=>exports_layers_exports,leakyRelu:()=>leakyRelu,less:()=>less,lessEqual:()=>lessEqual,lessEqualStrict:()=>lessEqualStrict,lessStrict:()=>lessStrict,linalg:()=>linalg,linspace:()=>linspace,loadGraphModel:()=>loadGraphModel,loadLayersModel:()=>loadLayersModel,localResponseNormalization:()=>localResponseNormalization,log:()=>log,log1p:()=>log1p,logSigmoid:()=>logSigmoid,logSoftmax:()=>logSoftmax,logSumExp:()=>logSumExp,logicalAnd:()=>logicalAnd,logicalNot:()=>logicalNot,logicalOr:()=>logicalOr,logicalXor:()=>logicalXor,losses:()=>losses,matMul:()=>matMul,math:()=>math_exports,max:()=>max,maxPool:()=>maxPool,maxPool3d:()=>maxPool3d,maxPoolWithArgmax:()=>maxPoolWithArgmax,maximum:()=>maximum,maximumStrict:()=>maximumStrict,mean:()=>mean,memory:()=>memory,metrics:()=>exports_metrics_exports,min:()=>min,minimum:()=>minimum,minimumStrict:()=>minimumStrict,mirrorPad:()=>mirrorPad,mod:()=>mod,modStrict:()=>modStrict,model:()=>model,models:()=>exports_models_exports,moments:()=>moments,movingAverage:()=>movingAverage,mul:()=>mul,mulStrict:()=>mulStrict,multiRNNCell:()=>multiRNNCell,multinomial:()=>multinomial,neg:()=>neg,nextFrame:()=>nextFrame,norm:()=>norm,notEqual:()=>notEqual,notEqualStrict:()=>notEqualStrict,oneHot:()=>oneHot,ones:()=>ones2,onesLike:()=>onesLike,op:()=>op,outerProduct:()=>outerProduct,pad:()=>pad,pad1d:()=>pad1d,pad2d:()=>pad2d,pad3d:()=>pad3d,pad4d:()=>pad4d,pool:()=>pool,pow:()=>pow,powStrict:()=>powStrict,prelu:()=>prelu,print:()=>print2,prod:()=>prod,profile:()=>profile,rand:()=>rand,randomGamma:()=>randomGamma,randomNormal:()=>randomNormal,randomUniform:()=>randomUniform,range:()=>range,ready:()=>ready,real:()=>real,reciprocal:()=>reciprocal,registerBackend:()=>registerBackend,registerCallbackConstructor:()=>registerCallbackConstructor,registerGradient:()=>registerGradient,registerKernel:()=>registerKernel,registerOp:()=>registerOp,regularizers:()=>exports_regularizers_exports,relu:()=>relu,relu6:()=>relu6,removeBackend:()=>removeBackend,reshape:()=>reshape,reverse:()=>reverse,reverse1d:()=>reverse1d,reverse2d:()=>reverse2d,reverse3d:()=>reverse3d,reverse4d:()=>reverse4d,rfft:()=>rfft,round:()=>round2,rsqrt:()=>rsqrt,scalar:()=>scalar,scatterND:()=>scatterND,scatter_util:()=>scatter_nd_util_exports,selu:()=>selu,separableConv2d:()=>separableConv2d,sequential:()=>sequential,serialization:()=>serialization_exports,setBackend:()=>setBackend,setPlatform:()=>setPlatform,setWasmPath:()=>setWasmPath,setWasmPaths:()=>setWasmPaths,setdiff1dAsync:()=>setdiff1dAsync,sigmoid:()=>sigmoid,sign:()=>sign,signal:()=>signal,sin:()=>sin,sinh:()=>sinh,slice:()=>slice,slice1d:()=>slice1d,slice2d:()=>slice2d,slice3d:()=>slice3d,slice4d:()=>slice4d,slice_util:()=>slice_util_exports,softmax:()=>softmax,softplus:()=>softplus,spaceToBatchND:()=>spaceToBatchND,sparseToDense:()=>sparseToDense,spectral:()=>spectral,split:()=>split,sqrt:()=>sqrt,square:()=>square,squaredDifference:()=>squaredDifference,squaredDifferenceStrict:()=>squaredDifferenceStrict,squeeze:()=>squeeze,stack:()=>stack,step:()=>step,stridedSlice:()=>stridedSlice,sub:()=>sub,subStrict:()=>subStrict,sum:()=>sum2,sumOutType:()=>sumOutType,tan:()=>tan,tanh:()=>tanh2,tensor:()=>tensor,tensor1d:()=>tensor1d,tensor2d:()=>tensor2d,tensor3d:()=>tensor3d,tensor4d:()=>tensor4d,tensor5d:()=>tensor5d,tensor6d:()=>tensor6d,tensor_util:()=>tensor_util_exports,test_util:()=>test_util_exports,tidy:()=>tidy,tile:()=>tile,time:()=>time,topk:()=>topk,train:()=>train,transpose:()=>transpose,truncatedNormal:()=>truncatedNormal,unique:()=>unique,unregisterGradient:()=>unregisterGradient,unregisterKernel:()=>unregisterKernel,unsortedSegmentSum:()=>unsortedSegmentSum,unstack:()=>unstack,upcastType:()=>upcastType,util:()=>util_exports,valueAndGrad:()=>valueAndGrad,valueAndGrads:()=>valueAndGrads,variable:()=>variable,variableGrads:()=>variableGrads,version:()=>version8,version_converter:()=>version3,version_core:()=>version,version_layers:()=>version2,version_wasm:()=>version9,where:()=>where,whereAsync:()=>whereAsync,zeros:()=>zeros,zerosLike:()=>zerosLike});var __create2=Object.create,__defProp2=Object.defineProperty,__getProtoOf2=Object.getPrototypeOf,__hasOwnProp2=Object.prototype.hasOwnProperty,__getOwnPropNames2=Object.getOwnPropertyNames,__getOwnPropDesc2=Object.getOwnPropertyDescriptor,__markAsModule2=target=>__defProp2(target,"__esModule",{value:!0}),__commonJS2=(callback,module)=>()=>(module||(module={exports:{}},callback(module.exports,module)),module.exports),__export2=(target,all4)=>{__markAsModule2(target);for(var name in all4)__defProp2(target,name,{get:all4[name],enumerable:!0})},__exportStar2=(target,module,desc)=>{if(__markAsModule2(target),module&&typeof module=="object"||typeof module=="function")for(let key of __getOwnPropNames2(module))!__hasOwnProp2.call(target,key)&&key!=="default"&&__defProp2(target,key,{get:()=>module[key],enumerable:!(desc=__getOwnPropDesc2(module,key))||desc.enumerable});return target},__toModule2=module=>module&&module.__esModule?module:__exportStar2(__defProp2(module!=null?__create2(__getProtoOf2(module)):{},"default",{value:module,enumerable:!0}),module),require_browser=__commonJS2(()=>{}),require_alea=__commonJS2((exports,module)=>{(function(global2,module2,define2){function Alea(seed){var me=this,mash=Mash();me.next=function(){var t=2091639*me.s0+me.c*23283064365386963e-26;return me.s0=me.s1,me.s1=me.s2,me.s2=t-(me.c=t|0)},me.c=1,me.s0=mash(" "),me.s1=mash(" "),me.s2=mash(" "),me.s0-=mash(seed),me.s0<0&&(me.s0+=1),me.s1-=mash(seed),me.s1<0&&(me.s1+=1),me.s2-=mash(seed),me.s2<0&&(me.s2+=1),mash=null}function copy(f,t){return t.c=f.c,t.s0=f.s0,t.s1=f.s1,t.s2=f.s2,t}function impl(seed,opts){var xg=new Alea(seed),state=opts&&opts.state,prng=xg.next;return prng.int32=function(){return xg.next()*4294967296|0},prng.double=function(){return prng()+(prng()*2097152|0)*11102230246251565e-32},prng.quick=prng,state&&(typeof state=="object"&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}function Mash(){var n=4022871197,mash=function(data){data=data.toString();for(var i=0;i>>0,h-=n,h*=n,n=h>>>0,h-=n,n+=h*4294967296}return(n>>>0)*23283064365386963e-26};return mash}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.alea=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_xor128=__commonJS2((exports,module)=>{(function(global2,module2,define2){function XorGen(seed){var me=this,strseed="";me.x=0,me.y=0,me.z=0,me.w=0,me.next=function(){var t=me.x^me.x<<11;return me.x=me.y,me.y=me.z,me.z=me.w,me.w^=me.w>>>19^t^t>>>8},seed===(seed|0)?me.x=seed:strseed+=seed;for(var k=0;k>>0)/4294967296};return prng.double=function(){do var top=xg.next()>>>11,bot=(xg.next()>>>0)/4294967296,result=(top+bot)/(1<<21);while(result===0);return result},prng.int32=xg.next,prng.quick=prng,state&&(typeof state=="object"&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.xor128=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_xorwow=__commonJS2((exports,module)=>{(function(global2,module2,define2){function XorGen(seed){var me=this,strseed="";me.next=function(){var t=me.x^me.x>>>2;return me.x=me.y,me.y=me.z,me.z=me.w,me.w=me.v,(me.d=me.d+362437|0)+(me.v=me.v^me.v<<4^(t^t<<1))|0},me.x=0,me.y=0,me.z=0,me.w=0,me.v=0,seed===(seed|0)?me.x=seed:strseed+=seed;for(var k=0;k>>4),me.next()}function copy(f,t){return t.x=f.x,t.y=f.y,t.z=f.z,t.w=f.w,t.v=f.v,t.d=f.d,t}function impl(seed,opts){var xg=new XorGen(seed),state=opts&&opts.state,prng=function(){return(xg.next()>>>0)/4294967296};return prng.double=function(){do var top=xg.next()>>>11,bot=(xg.next()>>>0)/4294967296,result=(top+bot)/(1<<21);while(result===0);return result},prng.int32=xg.next,prng.quick=prng,state&&(typeof state=="object"&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.xorwow=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_xorshift7=__commonJS2((exports,module)=>{(function(global2,module2,define2){function XorGen(seed){var me=this;me.next=function(){var X=me.x,i=me.i,t,v,w;return t=X[i],t^=t>>>7,v=t^t<<24,t=X[i+1&7],v^=t^t>>>10,t=X[i+3&7],v^=t^t>>>3,t=X[i+4&7],v^=t^t<<7,t=X[i+7&7],t=t^t<<13,v^=t^t<<9,X[i]=v,me.i=i+1&7,v};function init2(me2,seed2){var j,w,X=[];if(seed2===(seed2|0))w=X[0]=seed2;else for(seed2=""+seed2,j=0;j0;--j)me2.next()}init2(me,seed)}function copy(f,t){return t.x=f.x.slice(),t.i=f.i,t}function impl(seed,opts){seed==null&&(seed=+new Date);var xg=new XorGen(seed),state=opts&&opts.state,prng=function(){return(xg.next()>>>0)/4294967296};return prng.double=function(){do var top=xg.next()>>>11,bot=(xg.next()>>>0)/4294967296,result=(top+bot)/(1<<21);while(result===0);return result},prng.int32=xg.next,prng.quick=prng,state&&(state.x&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.xorshift7=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_xor4096=__commonJS2((exports,module)=>{(function(global2,module2,define2){function XorGen(seed){var me=this;me.next=function(){var w=me.w,X=me.X,i=me.i,t,v;return me.w=w=w+1640531527|0,v=X[i+34&127],t=X[i=i+1&127],v^=v<<13,t^=t<<17,v^=v>>>15,t^=t>>>12,v=X[i]=v^t,me.i=i,v+(w^w>>>16)|0};function init2(me2,seed2){var t,v,i,j,w,X=[],limit=128;for(seed2===(seed2|0)?(v=seed2,seed2=null):(seed2=seed2+"\0",v=0,limit=Math.max(limit,seed2.length)),i=0,j=-32;j>>15,v^=v<<4,v^=v>>>13,j>=0&&(w=w+1640531527|0,t=X[j&127]^=v+w,i=t==0?i+1:0);for(i>=128&&(X[(seed2&&seed2.length||0)&127]=-1),i=127,j=4*128;j>0;--j)v=X[i+34&127],t=X[i=i+1&127],v^=v<<13,t^=t<<17,v^=v>>>15,t^=t>>>12,X[i]=v^t;me2.w=w,me2.X=X,me2.i=i}init2(me,seed)}function copy(f,t){return t.i=f.i,t.w=f.w,t.X=f.X.slice(),t}function impl(seed,opts){seed==null&&(seed=+new Date);var xg=new XorGen(seed),state=opts&&opts.state,prng=function(){return(xg.next()>>>0)/4294967296};return prng.double=function(){do var top=xg.next()>>>11,bot=(xg.next()>>>0)/4294967296,result=(top+bot)/(1<<21);while(result===0);return result},prng.int32=xg.next,prng.quick=prng,state&&(state.X&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.xor4096=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_tychei=__commonJS2((exports,module)=>{(function(global2,module2,define2){function XorGen(seed){var me=this,strseed="";me.next=function(){var b=me.b,c=me.c,d=me.d,a=me.a;return b=b<<25^b>>>7^c,c=c-d|0,d=d<<24^d>>>8^a,a=a-b|0,me.b=b=b<<20^b>>>12^c,me.c=c=c-d|0,me.d=d<<16^c>>>16^a,me.a=a-b|0},me.a=0,me.b=0,me.c=2654435769|0,me.d=1367130551,seed===Math.floor(seed)?(me.a=seed/4294967296|0,me.b=seed|0):strseed+=seed;for(var k=0;k>>0)/4294967296};return prng.double=function(){do var top=xg.next()>>>11,bot=(xg.next()>>>0)/4294967296,result=(top+bot)/(1<<21);while(result===0);return result},prng.int32=xg.next,prng.quick=prng,state&&(typeof state=="object"&©(state,xg),prng.state=function(){return copy(xg,{})}),prng}module2&&module2.exports?module2.exports=impl:define2&&define2.amd?define2(function(){return impl}):this.tychei=impl})(exports,typeof module=="object"&&module,typeof define=="function"&&define)}),require_crypto=__commonJS2(()=>{}),require_seedrandom=__commonJS2((exports,module)=>{(function(pool3,math){var global2=this,width=256,chunks=6,digits=52,rngname="random",startdenom=math.pow(width,chunks),significance=math.pow(2,digits),overflow=significance*2,mask=width-1,nodecrypto;function seedrandom5(seed,options,callback){var key=[];options=options==!0?{entropy:!0}:options||{};var shortseed=mixkey(flatten4(options.entropy?[seed,tostring(pool3)]:seed==null?autoseed():seed,3),key),arc4=new ARC4(key),prng=function(){for(var n=arc4.g(chunks),d=startdenom,x=0;n=overflow;)n/=2,d/=2,x>>>=1;return(n+x)/d};return prng.int32=function(){return arc4.g(4)|0},prng.quick=function(){return arc4.g(4)/4294967296},prng.double=prng,mixkey(tostring(arc4.S),pool3),(options.pass||callback||function(prng2,seed2,is_math_call,state){return state&&(state.S&©(state,arc4),prng2.state=function(){return copy(arc4,{})}),is_math_call?(math[rngname]=prng2,seed2):prng2})(prng,shortseed,"global"in options?options.global:this==math,options.state)}math["seed"+rngname]=seedrandom5;function ARC4(key){var t,keylen=key.length,me=this,i=0,j=me.i=me.j=0,s=me.S=[];for(keylen||(key=[keylen++]);i{var alea5=require_alea(),xor128=require_xor128(),xorwow=require_xorwow(),xorshift7=require_xorshift7(),xor4096=require_xor4096(),tychei=require_tychei(),sr=require_seedrandom();sr.alea=alea5,sr.xor128=xor128,sr.xorwow=xorwow,sr.xorshift7=xorshift7,sr.xor4096=xor4096,sr.tychei=tychei,module.exports=sr}),require_string_decoder=__commonJS2(()=>{}),require_path=__commonJS2(()=>{}),require_worker_threads=__commonJS2(()=>{}),require_perf_hooks=__commonJS2(()=>{}),require_tfjs_backend_wasm_threaded_simd=__commonJS2((exports,module)=>{var WasmBackendModuleThreadedSimd=function(){var _scriptDir=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(_scriptDir=_scriptDir||__filename),function(WasmBackendModuleThreadedSimd2){WasmBackendModuleThreadedSimd2=WasmBackendModuleThreadedSimd2||{};function GROWABLE_HEAP_I8(){return wasmMemory.buffer!=buffer2&&updateGlobalBufferAndViews(wasmMemory.buffer),HEAP8}function GROWABLE_HEAP_U8(){return wasmMemory.buffer!=buffer2&&updateGlobalBufferAndViews(wasmMemory.buffer),HEAPU8}function GROWABLE_HEAP_I32(){return wasmMemory.buffer!=buffer2&&updateGlobalBufferAndViews(wasmMemory.buffer),HEAP32}function GROWABLE_HEAP_U32(){return wasmMemory.buffer!=buffer2&&updateGlobalBufferAndViews(wasmMemory.buffer),HEAPU32}function GROWABLE_HEAP_F64(){return wasmMemory.buffer!=buffer2&&updateGlobalBufferAndViews(wasmMemory.buffer),HEAPF64}var Module=typeof WasmBackendModuleThreadedSimd2!="undefined"?WasmBackendModuleThreadedSimd2:{},_scriptDir2=void 0,moduleOverrides={},key;for(key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var arguments_=[],thisProgram="./this.program",quit_=function(status,toThrow){throw toThrow},ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_PTHREAD=Module.ENVIRONMENT_IS_PTHREAD||!1;ENVIRONMENT_IS_PTHREAD&&(buffer2=Module.buffer,DYNAMIC_BASE=Module.DYNAMIC_BASE,DYNAMICTOP_PTR=Module.DYNAMICTOP_PTR);var scriptDirectory="";function locateFile(path){return Module.locateFile?Module.locateFile(path,scriptDirectory):scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle,nodeFS,nodePath;if(ENVIRONMENT_IS_NODE){ENVIRONMENT_IS_WORKER?scriptDirectory=require_path().dirname(scriptDirectory)+"/":scriptDirectory=__dirname+"/",read_=function(filename,binary){return nodeFS||(nodeFS=require("fs")),nodePath||(nodePath=require_path()),filename=nodePath.normalize(filename),nodeFS.readFileSync(filename,binary?null:"utf8")},readBinary=function(filename){var ret=read_(filename,!0);return ret.buffer||(ret=new Uint8Array(ret)),assert3(ret.buffer),ret},process.argv.length>1&&(thisProgram=process.argv[1].replace(/\\/g,"/")),arguments_=process.argv.slice(2),process.on("uncaughtException",function(ex){if(!(ex instanceof ExitStatus))throw ex}),process.on("unhandledRejection",abort),quit_=function(status){process.exit(status)},Module.inspect=function(){return"[Emscripten Module object]"};var nodeWorkerThreads;try{nodeWorkerThreads=require_worker_threads()}catch(e){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),e}Worker=nodeWorkerThreads.Worker}else ENVIRONMENT_IS_SHELL?(typeof read!="undefined"&&(read_=function(f){return read(f)}),readBinary=function(f){var data;return typeof readbuffer=="function"?new Uint8Array(readbuffer(f)):(data=read(f,"binary"),assert3(typeof data=="object"),data)},typeof scriptArgs!="undefined"?arguments_=scriptArgs:typeof arguments!="undefined"&&(arguments_=arguments),typeof quit=="function"&&(quit_=function(status){quit(status)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&(ENVIRONMENT_IS_WORKER?scriptDirectory=self.location.href:document.currentScript&&(scriptDirectory=document.currentScript.src),_scriptDir2&&(scriptDirectory=_scriptDir2),scriptDirectory.indexOf("blob:")!==0?scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1):scriptDirectory="",ENVIRONMENT_IS_NODE?(read_=function(filename,binary){return nodeFS||(nodeFS=require("fs")),nodePath||(nodePath=require_path()),filename=nodePath.normalize(filename),nodeFS.readFileSync(filename,binary?null:"utf8")},readBinary=function(filename){var ret=read_(filename,!0);return ret.buffer||(ret=new Uint8Array(ret)),assert3(ret.buffer),ret}):(read_=function(url){var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.send(null),xhr.responseText},ENVIRONMENT_IS_WORKER&&(readBinary=function(url){var xhr=new XMLHttpRequest;return xhr.open("GET",url,!1),xhr.responseType="arraybuffer",xhr.send(null),new Uint8Array(xhr.response)}),readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,!0),xhr.responseType="arraybuffer",xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()},xhr.onerror=onerror,xhr.send(null)}),setWindowTitle=function(title){document.title=title});ENVIRONMENT_IS_NODE&&typeof performance=="undefined"&&(performance=require_perf_hooks().performance);var out=Module.print||console.log.bind(console),err=Module.printErr||console.warn.bind(console);for(key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=null,Module.arguments&&(arguments_=Module.arguments),Module.thisProgram&&(thisProgram=Module.thisProgram),Module.quit&&(quit_=Module.quit);var Atomics_load=Atomics.load,Atomics_store=Atomics.store,Atomics_compareExchange=Atomics.compareExchange,wasmBinary;Module.wasmBinary&&(wasmBinary=Module.wasmBinary);var noExitRuntime;Module.noExitRuntime&&(noExitRuntime=Module.noExitRuntime),typeof WebAssembly!="object"&&err("no native wasm support detected");var wasmMemory,wasmTable=new WebAssembly.Table({initial:167,maximum:167+0,element:"anyfunc"}),wasmModule,threadInfoStruct=0,selfThreadId=0,ABORT=!1,EXITSTATUS=0;function assert3(condition,text){condition||abort("Assertion failed: "+text)}function getCFunc(ident){var func2=Module["_"+ident];return assert3(func2,"Cannot call unknown function "+ident+", make sure it is exported"),func2}function ccall(ident,returnType,argTypes,args,opts){var toC={string:function(str){var ret2=0;if(str!=null&&str!==0){var len=(str.length<<2)+1;ret2=stackAlloc(len),stringToUTF8(str,ret2,len)}return ret2},array:function(arr){var ret2=stackAlloc(arr.length);return writeArrayToMemory(arr,ret2),ret2}};function convertReturnValue(ret2){return returnType==="string"?UTF8ToString(ret2):returnType==="boolean"?Boolean(ret2):ret2}var func2=getCFunc(ident),cArgs=[],stack2=0;if(args)for(var i=0;i=endIdx);){var u0=heap[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heap[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heap[idx++]&63;if((u0&240)==224?u0=(u0&15)<<12|u1<<6|u2:u0=(u0&7)<<18|u1<<12|u2<<6|heap[idx++]&63,u0<65536)str+=String.fromCharCode(u0);else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;for(var startIdx=outIdx,endIdx=outIdx+maxBytesToWrite-1,i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6,heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18,heap[outIdx++]=128|u>>12&63,heap[outIdx++]=128|u>>6&63,heap[outIdx++]=128|u&63}}return heap[outIdx]=0,outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){for(var len=0,i=0;i=55296&&u<=57343&&(u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023),u<=127?++len:u<=2047?len+=2:u<=65535?len+=3:len+=4}return len}function writeArrayToMemory(array2,buffer3){GROWABLE_HEAP_I8().set(array2,buffer3)}var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){return x%multiple>0&&(x+=multiple-x%multiple),x}var buffer2,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer2=buf,Module.HEAP8=HEAP8=new Int8Array(buf),Module.HEAP16=HEAP16=new Int16Array(buf),Module.HEAP32=HEAP32=new Int32Array(buf),Module.HEAPU8=HEAPU8=new Uint8Array(buf),Module.HEAPU16=HEAPU16=new Uint16Array(buf),Module.HEAPU32=HEAPU32=new Uint32Array(buf),Module.HEAPF32=HEAPF32=new Float32Array(buf),Module.HEAPF64=HEAPF64=new Float64Array(buf)}var STACK_BASE=5256464,STACKTOP=STACK_BASE,STACK_MAX=13584,DYNAMIC_BASE=5256464,DYNAMICTOP_PTR=12656,INITIAL_INITIAL_MEMORY=Module.INITIAL_MEMORY||16777216;if(ENVIRONMENT_IS_PTHREAD)wasmMemory=Module.wasmMemory,buffer2=Module.buffer;else if(Module.wasmMemory)wasmMemory=Module.wasmMemory;else if(wasmMemory=new WebAssembly.Memory({initial:INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,maximum:2147483648/WASM_PAGE_SIZE,shared:!0}),!(wasmMemory.buffer instanceof SharedArrayBuffer))throw err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),ENVIRONMENT_IS_NODE&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");wasmMemory&&(buffer2=wasmMemory.buffer),INITIAL_INITIAL_MEMORY=buffer2.byteLength,updateGlobalBufferAndViews(buffer2),ENVIRONMENT_IS_PTHREAD||(GROWABLE_HEAP_I32()[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE);function callRuntimeCallbacks(callbacks2){for(;callbacks2.length>0;){var callback=callbacks2.shift();if(typeof callback=="function"){callback(Module);continue}var func2=callback.func;typeof func2=="number"?callback.arg===void 0?Module.dynCall_v(func2):Module.dynCall_vi(func2,callback.arg):func2(callback.arg===void 0?null:callback.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;ENVIRONMENT_IS_PTHREAD&&(runtimeInitialized=!0);function preRun(){if(!ENVIRONMENT_IS_PTHREAD){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}}function initRuntime(){runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__)}function preMain(){ENVIRONMENT_IS_PTHREAD||callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(!ENVIRONMENT_IS_PTHREAD){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_ceil=Math.ceil,Math_floor=Math.floor,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function addRunDependency(id){assert3(!ENVIRONMENT_IS_PTHREAD,"addRunDependency cannot be used in a pthread worker"),runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(id){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var callback=dependenciesFulfilled;dependenciesFulfilled=null,callback()}}Module.preloadedImages={},Module.preloadedAudios={};function abort(what){throw Module.onAbort&&Module.onAbort(what),ENVIRONMENT_IS_PTHREAD&&console.error("Pthread aborting at "+new Error().stack),what+="",out(what),err(what),ABORT=!0,EXITSTATUS=1,what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.",new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="tfjs-backend-wasm-threaded-simd.wasm";isDataURI(wasmBinaryFile)||(wasmBinaryFile=locateFile(wasmBinaryFile));function getBinary(){try{if(wasmBinary)return new Uint8Array(wasmBinary);if(readBinary)return readBinary(wasmBinaryFile);throw"both async and sync fetching of the wasm failed"}catch(err2){abort(err2)}}function getBinaryPromise(){return!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch=="function"&&!isFileURI(wasmBinaryFile)?fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response.ok)throw"failed to load wasm binary file at '"+wasmBinaryFile+"'";return response.arrayBuffer()}).catch(function(){return getBinary()}):new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={a:asmLibraryArg};function receiveInstance(instance,module2){var exports3=instance.exports;if(Module.asm=exports3,wasmModule=module2,!ENVIRONMENT_IS_PTHREAD){var numWorkersToLoad=PThread.unusedWorkers.length;PThread.unusedWorkers.forEach(function(w){PThread.loadWasmModuleToWorker(w,function(){--numWorkersToLoad||removeRunDependency("wasm-instantiate")})})}}ENVIRONMENT_IS_PTHREAD||addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output.instance,output.module)}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason),abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch=="function")fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason),err("falling back to ArrayBuffer instantiation"),instantiateArrayBuffer(receiveInstantiatedSource)})});else return instantiateArrayBuffer(receiveInstantiatedSource)}if(Module.instantiateWasm)try{var exports2=Module.instantiateWasm(info,receiveInstance);return exports2}catch(e){return err("Module.instantiateWasm callback failed with error: "+e),!1}return instantiateAsync(),{}}var ASM_CONSTS={};function initPthreadsJS(){PThread.initRuntime()}ENVIRONMENT_IS_PTHREAD||__ATINIT__.push({func:function(){___wasm_call_ctors()}});var __pthread_ptr=0,__pthread_is_main_runtime_thread=0,__pthread_is_main_browser_thread=0;function __register_pthread_ptr(pthreadPtr,isMainBrowserThread,isMainRuntimeThread){pthreadPtr=pthreadPtr|0,isMainBrowserThread=isMainBrowserThread|0,isMainRuntimeThread=isMainRuntimeThread|0,__pthread_ptr=pthreadPtr,__pthread_is_main_browser_thread=isMainBrowserThread,__pthread_is_main_runtime_thread=isMainRuntimeThread}Module.__register_pthread_ptr=__register_pthread_ptr;var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135},__main_thread_futex_wait_address=13568;function _emscripten_futex_wake(addr,count2){if(addr<=0||addr>GROWABLE_HEAP_I8().length||addr&!0||count2<0)return-28;if(count2==0)return 0;count2>=2147483647&&(count2=Infinity);var mainThreadWaitAddress=Atomics.load(GROWABLE_HEAP_I32(),__main_thread_futex_wait_address>>2),mainThreadWoken=0;if(mainThreadWaitAddress==addr){var loadedAddr=Atomics.compareExchange(GROWABLE_HEAP_I32(),__main_thread_futex_wait_address>>2,mainThreadWaitAddress,0);if(loadedAddr==mainThreadWaitAddress&&(--count2,mainThreadWoken=1,count2<=0))return 1}var ret=Atomics.notify(GROWABLE_HEAP_I32(),addr>>2,count2);if(ret>=0)return ret+mainThreadWoken;throw"Atomics.notify returned an unexpected value "+ret}Module._emscripten_futex_wake=_emscripten_futex_wake;function __kill_thread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! _kill_thread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in _kill_thread!";GROWABLE_HEAP_I32()[pthread_ptr+12>>2]=0;var pthread=PThread.pthreads[pthread_ptr];pthread.worker.terminate(),PThread.freeThreadData(pthread),PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1),pthread.worker.pthread=void 0}function __cancel_thread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! _cancel_thread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in _cancel_thread!";var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({cmd:"cancel"})}function __cleanup_thread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! _cleanup_thread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in _cleanup_thread!";GROWABLE_HEAP_I32()[pthread_ptr+12>>2]=0;var pthread=PThread.pthreads[pthread_ptr];if(pthread){var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}var PThread={MAIN_THREAD_ID:1,mainThreadInfo:{schedPolicy:0,schedPrio:0},unusedWorkers:[],runningWorkers:[],initRuntime:function(){__register_pthread_ptr(PThread.mainThreadBlock,!ENVIRONMENT_IS_WORKER,1),_emscripten_register_main_browser_thread_id(PThread.mainThreadBlock)},initMainThreadBlock:function(){for(var pthreadPoolSize=8,i=0;i>2]=PThread.mainThreadBlock;var headPtr=PThread.mainThreadBlock+156;GROWABLE_HEAP_I32()[headPtr>>2]=headPtr;for(var tlsMemory=13056,i=0;i<128;++i)GROWABLE_HEAP_U32()[tlsMemory/4+i]=0;Atomics.store(GROWABLE_HEAP_U32(),PThread.mainThreadBlock+104>>2,tlsMemory),Atomics.store(GROWABLE_HEAP_U32(),PThread.mainThreadBlock+40>>2,PThread.mainThreadBlock),Atomics.store(GROWABLE_HEAP_U32(),PThread.mainThreadBlock+44>>2,42)},initWorker:function(){},pthreads:{},exitHandlers:null,setThreadStatus:function(){},runExitHandlers:function(){if(PThread.exitHandlers!==null){for(;PThread.exitHandlers.length>0;)PThread.exitHandlers.pop()();PThread.exitHandlers=null}ENVIRONMENT_IS_PTHREAD&&threadInfoStruct&&___pthread_tsd_run_dtors()},threadExit:function(exitCode){var tb=_pthread_self();tb&&(Atomics.store(GROWABLE_HEAP_U32(),tb+4>>2,exitCode),Atomics.store(GROWABLE_HEAP_U32(),tb+0>>2,1),Atomics.store(GROWABLE_HEAP_U32(),tb+60>>2,1),Atomics.store(GROWABLE_HEAP_U32(),tb+64>>2,0),PThread.runExitHandlers(),_emscripten_futex_wake(tb+0,2147483647),__register_pthread_ptr(0,0,0),threadInfoStruct=0,ENVIRONMENT_IS_PTHREAD&&postMessage({cmd:"exit"}))},threadCancel:function(){PThread.runExitHandlers(),Atomics.store(GROWABLE_HEAP_U32(),threadInfoStruct+4>>2,-1),Atomics.store(GROWABLE_HEAP_U32(),threadInfoStruct+0>>2,1),_emscripten_futex_wake(threadInfoStruct+0,2147483647),threadInfoStruct=selfThreadId=0,__register_pthread_ptr(0,0,0),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var t in PThread.pthreads){var pthread=PThread.pthreads[t];pthread&&pthread.worker&&PThread.returnWorkerToPool(pthread.worker)}PThread.pthreads={};for(var i=0;i>2];GROWABLE_HEAP_I32()[pthread.threadInfoStruct+104>>2]=0,_free(tlsMemory),_free(pthread.threadInfoStruct)}pthread.threadInfoStruct=0,pthread.allocatedOwnStack&&pthread.stackBase&&_free(pthread.stackBase),pthread.stackBase=0,pthread.worker&&(pthread.worker.pthread=null)}},returnWorkerToPool:function(worker){delete PThread.pthreads[worker.pthread.thread],PThread.unusedWorkers.push(worker),PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1),PThread.freeThreadData(worker.pthread),worker.pthread=void 0},receiveObjectTransfer:function(data){},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e.data,cmd=d.cmd;if(worker.pthread&&(PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct),d.targetThread&&d.targetThread!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];thread?thread.worker.postMessage(e.data,d.transferList):console.error('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d.targetThread+", but that thread no longer exists!"),PThread.currentProxiedOperationCallerThread=void 0;return}if(cmd==="processQueuedMainThreadWork")_emscripten_main_thread_process_queued_calls();else if(cmd==="spawnThread")__spawn_thread(e.data);else if(cmd==="cleanupThread")__cleanup_thread(d.thread);else if(cmd==="killThread")__kill_thread(d.thread);else if(cmd==="cancelThread")__cancel_thread(d.thread);else if(cmd==="loaded")worker.loaded=!0,onFinishedLoading&&onFinishedLoading(worker),worker.runPthread&&(worker.runPthread(),delete worker.runPthread);else if(cmd==="print")out("Thread "+d.threadId+": "+d.text);else if(cmd==="printErr")err("Thread "+d.threadId+": "+d.text);else if(cmd==="alert")alert("Thread "+d.threadId+": "+d.text);else if(cmd==="exit"){var detached=worker.pthread&&Atomics.load(GROWABLE_HEAP_U32(),worker.pthread.thread+68>>2);detached&&PThread.returnWorkerToPool(worker)}else cmd==="cancelDone"?PThread.returnWorkerToPool(worker):cmd==="objectTransfer"?PThread.receiveObjectTransfer(e.data):e.data.target==="setimmediate"?worker.postMessage(e.data):err("worker sent an unknown command "+cmd);PThread.currentProxiedOperationCallerThread=void 0},worker.onerror=function(e){err("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)},ENVIRONMENT_IS_NODE&&(worker.on("message",function(data){worker.onmessage({data})}),worker.on("error",function(data){worker.onerror(data)}),worker.on("exit",function(data){console.log("worker exited - TODO: update the worker queue?")})),worker.postMessage({cmd:"load",urlOrBlob:Module.mainScriptUrlOrBlob||_scriptDir2,wasmMemory,wasmModule,DYNAMIC_BASE,DYNAMICTOP_PTR})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("tfjs-backend-wasm-threaded-simd.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){return PThread.unusedWorkers.length==0&&(PThread.allocateUnusedWorker(),PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])),PThread.unusedWorkers.length>0?PThread.unusedWorkers.pop():null},busySpinWait:function(msecs){for(var t=performance.now()+msecs;performance.now()>2]=value,value}function _atexit(func2,arg){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,func2,arg);__ATEXIT__.unshift({func:func2,arg})}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId)postMessage({cmd:"processQueuedMainThreadWork"});else if(ENVIRONMENT_IS_PTHREAD)postMessage({targetThread:targetThreadId,cmd:"processThreadQueue"});else{var pthread=PThread.pthreads[targetThreadId],worker=pthread&&pthread.worker;if(!worker)return;worker.postMessage({cmd:"processThreadQueue"})}return 1}function _abort(){abort()}function _emscripten_conditional_set_current_thread_status(expectedStatus,newStatus){expectedStatus=expectedStatus|0,newStatus=newStatus|0}function _emscripten_futex_wait(addr,val,timeout){if(addr<=0||addr>GROWABLE_HEAP_I8().length||addr&!0)return-28;if(ENVIRONMENT_IS_WORKER){var ret=Atomics.wait(GROWABLE_HEAP_I32(),addr>>2,val,timeout);if(ret==="timed-out")return-73;if(ret==="not-equal")return-6;if(ret==="ok")return 0;throw"Atomics.wait returned an unexpected value "+ret}else{var loadedVal=Atomics.load(GROWABLE_HEAP_I32(),addr>>2);if(val!=loadedVal)return-6;var tNow=performance.now(),tEnd=tNow+timeout;Atomics.store(GROWABLE_HEAP_I32(),__main_thread_futex_wait_address>>2,addr);for(var ourWaitAddress=addr;addr==ourWaitAddress;){if(tNow=performance.now(),tNow>tEnd)return-73;_emscripten_main_thread_process_queued_calls(),addr=Atomics.load(GROWABLE_HEAP_I32(),__main_thread_futex_wait_address>>2)}return 0}}function _emscripten_is_main_browser_thread(){return __pthread_is_main_browser_thread|0}function _emscripten_is_main_runtime_thread(){return __pthread_is_main_runtime_thread|0}function _emscripten_memcpy_big(dest,src,num){GROWABLE_HEAP_U8().copyWithin(dest,src,src+num)}function _emscripten_num_logical_cores(){return navigator.hardwareConcurrency}function _emscripten_proxy_to_main_thread_js(index,sync){for(var numCallArgs=arguments.length-2,stack2=stackSave(),args=stackAlloc(numCallArgs*8),b=args>>3,i=0;i>3]),buf+=8):(buf=buf+3&~3,args.push(GROWABLE_HEAP_I32()[buf>>2]),buf+=4);return args}function _emscripten_receive_on_main_thread_js(index,numCallArgs,args){_emscripten_receive_on_main_thread_js_callArgs.length=numCallArgs;for(var b=args>>3,i=0;i>>16),updateGlobalBufferAndViews(wasmMemory.buffer),1}catch(e){}}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;var oldSize=_emscripten_get_heap_size();if(requestedSize<=oldSize)return!1;var PAGE_MULTIPLE=65536,maxHeapSize=2147483648;if(requestedSize>maxHeapSize)return!1;for(var minHeapSize=16777216,cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(minHeapSize,requestedSize,overGrownHeapSize),PAGE_MULTIPLE)),replacement=emscripten_realloc_buffer(newSize);if(replacement)return!0}return!1}var JSEvents={keyEvent:0,mouseEvent:0,wheelEvent:0,uiEvent:0,focusEvent:0,deviceOrientationEvent:0,deviceMotionEvent:0,fullscreenChangeEvent:0,pointerlockChangeEvent:0,visibilityChangeEvent:0,touchEvent:0,previousFullscreenElement:null,previousScreenX:null,previousScreenY:null,removeEventListenersRegistered:!1,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i)JSEvents._removeHandler(i);JSEvents.eventHandlers=[],JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){JSEvents.removeEventListenersRegistered||(__ATEXIT__.push(JSEvents.removeAllEventListeners),JSEvents.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return!1;for(var i2 in arrA)if(arrA[i2]!=arrB[i2])return!1;return!0}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList))return}JSEvents.deferredCalls.push({targetFunction,precedence,argsList}),JSEvents.deferredCalls.sort(function(x,y){return x.precedence