major update

pull/13/head
Vladimir Mandic 2020-10-11 12:41:17 -04:00
parent 0b6b67996f
commit 7c02d78df9
30 changed files with 4201 additions and 13376 deletions

108
README.md
View File

@ -3,7 +3,6 @@
## Note ## Note
This is updated **face-api.js** with latest available TensorFlow/JS as the original face-api.js is not compatible with **tfjs 2.0+**. This is updated **face-api.js** with latest available TensorFlow/JS as the original face-api.js is not compatible with **tfjs 2.0+**.
Currently based on **TFJS-Core 2.4.0**.
Forked from **face-api.js** version **0.22.2** released on March 22nd, 2020 Forked from **face-api.js** version **0.22.2** released on March 22nd, 2020
@ -17,12 +16,13 @@ Forked from **face-api.js** version **0.22.2** released on March 22nd, 2020
- Compatible with TensorFlow/JS 2.0+ - Compatible with TensorFlow/JS 2.0+
- Updated type casting for TypeScript type checking - Updated type casting for TypeScript type checking
- Removed unnecesary package dependencies (karma, jasmine, etc.) - Removed unnecesary package dependencies (karma, jasmine, etc.)
- Typescript build process now targets ES2017 and instead of dual ES5/ES6 - Typescript build process now targets ES2018 and instead of dual ES5/ES6
- Browser bundle process uses ESBuild instead of Rollup - Browser bundle process uses ESBuild instead of Rollup
- New TensorFlow/JS dependencies since backends were removed from @tensorflow/tfjs-core - New TensorFlow/JS dependencies since backends were removed from @tensorflow/tfjs-core
- Updated mobileNetv1 model due to batchNorm() dependency - Updated mobileNetv1 model due to batchNorm() dependency
- Fully tree shakable when imported as an ESM module - Fully tree shakable when imported as an ESM module
- Added `version` class that returns JSON objecgt with version of FaceAPI as well as linked TFJS - Added `version` class that returns JSON object with version of FaceAPI as well as linked TFJS
- Added calls for `setPlatform` to automatically prepare TFJS in browser
- Removed following models as they are either obsolete or non-functional with tfjs 2.0+ - Removed following models as they are either obsolete or non-functional with tfjs 2.0+
- mtcnn: Mostly obsolete - mtcnn: Mostly obsolete
- tinyYolov2: Non-functional since weights are missing - tinyYolov2: Non-functional since weights are missing
@ -32,48 +32,63 @@ Due to reduced code and changed build process, resulting bundle is about **>5x s
## Installation ## Installation
**Imporant!**: This version of **face-api** does not embedd full version of **TensorFlow/JS (tfjs)** to keep package as small as possible (322KB minified), enable dynamic loading of different tfjs backends as well as to enable reusability of tfjs for different purposes. There are several ways to use Face-API:
*Load tfjs explicitly before loading face-api.* ### IIFE script
*Note: package `@tensorflow/tfjs` is bundle, if you want to keep your project small, import `@tensorflow/tfjs-core` plus a specific backend such as `@tensorflow/tfjs-backend-cpu`, `@tensorflow/tfjs-backend-webgl` or `@tensorflow/tfjs-node`* *Size: 936KB minified*
For example as a script: This is simplest way for usage within Browser as it includes full version of TensorFlow/JS prepackaged with no external dependencies.
Simply include this in your `HTML` file and it's ready to use.
```html ```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/2.3.0/tf.es2017.js"></script> <script src="dist/face-api.js"><script>
<script src="/dist/face-api.js"></script> <!-- full version / 960KB --> ```
or
<script src="/dist/face-api.min.js"></script> <!-- minified version / 320KB -->
```
Or install a module: IIFE script auto-registers global namespace `faceapi` within Window object.
And if you want to access `TensorFlow/JS` classes directly, they are exported as `faceapi.tf`
```bash Pre-packaged version of `TFJS` is **2.6.0**
npm install @tensorflow/tfjs @vladmandic/face-api
```
Use module using `require` (recommended for VanillaJS): ### ESM module
*Size: 164KB non-minified*
```js If you're using bundler *(such as rollup, webpack, esbuild)* to package your client application, you can import ESM version of FaceAPI which supports full tree shaking
const tf = require('@tensorflow/tfjs'); Note that this version does NOT pre-package `TFJS`, so you'll need to include it before you import `FaceAPI`
const faceapi = require('@vladmandic/face-api'); You can use any version of `TFJS` 2.0+
```
Use module in a JavaScript project using `import`: ```js
(NodeJS requires `"type": "module"` inside `package.json` to support `import` statements) import * as tf from 'https://cdnjs.cloudflare.com/ajax/libs/tensorflow/2.6.0/tf.min.js'; // load directly from CDN
import * as faceapi from 'dist/face-api.esm.js';
```
*Experimental*:
You could use same syntax within your main `JS` file if it's imported with `<script type="module">`
```js ```html
import tf from '@tensorflow/tfjs'; <script src="tf.min.js">
import faceapi from '@vladmandic/face-api'; <script src="./index.js" type="module">
``` ```
and then in `index.js`
Use module in a TypeScript project: ```js
(TSC will compile this to `require` statements) import * as tf from 'https://cdnjs.cloudflare.com/ajax/libs/tensorflow/2.6.0/tf.min.js'; // load directly from CDN
import * as faceapi from 'dist/face-api.esm.js';
```
```js ### NPM module
import * as tf from '@tensorflow/tfjs'; *Size: 45,104KB unpacked (including sources and pre-trained model weights)*
import * as faceapi from '@vladmandic/face-api';
``` Simmilar to ESM module, but with full sources as it points to `build/src/index.js` instead
Recommended for NodeJS projects
Install with:
```shell
npm install @tensorflow/tfjs @vladmandic/face-api
```
And then use with:
```js
import * as tf from '@tensorflow/tfjs';
import * as faceapi from '@vladmandic/face-api';
```
## Weights ## Weights
@ -81,20 +96,25 @@ Pretrained models and their weights are includes in `./model`.
## Build ## Build
Included in `./dist` are: If you want to do a full rebuild, either download npm module
- face-api.cjs: CJS format, used by NodeJS import/require (default for node and browser require/import)
- face-api.ejs: ESM format, used by Browser (provided as an alternative)
- face-api.js: IIFE format, used by Browser (default for browser script)
- face-api.min.js: Minified IIFE format, used by Browser
If you want to do a full rebuild use:
```shell ```shell
npm install @vladmandic/face-api
cd node_modules/@vladmandic/face-api
```
or clone a git project
```shell
git clone https://github.com/vladmandic/face-api
cd face-api
```
Then install all dependencies and run rebuild:
```shell
npm install
npm run build npm run build
``` ```
Which will compile everything in `./src` into `./build` and create both standard and minified bundles as well as a sourcemap in `./dist` Which will compile everything in `./src` into `./build` and create both ESM (standard) and IIFE (minified) bundles as well as sourcemaps in `./dist`
## Documentation ## Documentation

View File

@ -3,21 +3,16 @@
"version": "0.5.3", "version": "0.5.3",
"description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS", "description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS",
"main": "build/src/index.js", "main": "build/src/index.js",
"browser": "dist/face-api.esm.js", "browser": "dist/face-api.js",
"typings": "./build/src/index.d.ts", "typings": "build/src/index.d.ts",
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=12.0.0"
}, },
"type": "module", "type": "module",
"scripts": { "scripts": {
"compile": "tsc", "build-esm": "esbuild --bundle --format=esm --target=esnext --platform=browser --sourcemap --outfile=./dist/face-api.esm.js --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"clean": "rimraf build/ dist/", "build-iife": "esbuild --bundle --format=iife --target=esnext --platform=browser --sourcemap --outfile=./dist/face-api.js --global-name=faceapi --minify --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"cjs": "esbuild --bundle --outfile=./dist/face-api.cjs.js --target=esnext --platform=browser --format=cjs --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js", "build": "rimraf build/ dist/ && tsc && npm run build-esm && npm run build-iife"
"node": "esbuild --bundle --outfile=./dist/face-api.node.js --target=esnext --platform=node --format=esm --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"esm": "esbuild --bundle --outfile=./dist/face-api.esm.js --target=esnext --platform=browser --format=esm --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"iife": "esbuild --bundle --outfile=./dist/face-api.iife.js --target=esnext --platform=browser --format=iife --global-name=faceapi --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"minify": "esbuild --bundle --outfile=./dist/face-api.min.js --target=esnext --platform=browser --format=iife --sourcemap --global-name=faceapi --external:@tensorflow/tfjs --log-level=error --minify --tsconfig=./tsconfig.json build/src/index.js",
"build": "npm run clean && npm run compile && npm run cjs && npm run esm && npm run iife && npm run node && npm run minify"
}, },
"keywords": [ "keywords": [
"tensorflow", "tensorflow",
@ -45,11 +40,11 @@
"@tensorflow/tfjs": "^2.6.0" "@tensorflow/tfjs": "^2.6.0"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^14.11.7", "@types/node": "^14.11.8",
"esbuild": "^0.6.34", "esbuild": "^0.6.34",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"ts-node": "^9.0.0", "ts-node": "^9.0.0",
"tslib": "^2.0.2", "tslib": "^2.0.3",
"typescript": "^4.1.0-dev.20201008" "typescript": "^4.1.0-dev.20201011"
} }
} }

View File

@ -1 +1 @@
{"version":3,"file":"NeuralNetwork.d.ts","sourceRoot":"","sources":["../../src/NeuralNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,8BAAsB,aAAa,CAAC,UAAU;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM;IAHnC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAY;IACrD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAK;gBAEvB,KAAK,EAAE,MAAM;IAWnC,IAAW,MAAM,IAAI,UAAU,GAAG,SAAS,CAAwB;IACnE,IAAW,aAAa,IAAI,YAAY,EAAE,CAA+B;IACzE,IAAW,QAAQ,IAAI,OAAO,CAAyB;IAEhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM;IAK9C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM;IAM1D,YAAY;;;;IAOZ,kBAAkB;;;;IAIlB,eAAe;;;;IAIf,QAAQ;IAMR,MAAM;IAQN,OAAO,CAAC,gBAAgB,GAAE,OAAc;IAUxC,eAAe,IAAI,YAAY;IAQzB,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IASnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAoB/C,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc;IAU9C,cAAc,CAAC,OAAO,EAAE,YAAY;IAU3C,OAAO,CAAC,oBAAoB;IAqB5B,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM;IAChD,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;IAClI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;CAC/G"} {"version":3,"file":"NeuralNetwork.d.ts","sourceRoot":"","sources":["../../src/NeuralNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,8BAAsB,aAAa,CAAC,UAAU;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM;IAHnC,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAY;IACrD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAK;gBAEvB,KAAK,EAAE,MAAM;IAWnC,IAAW,MAAM,IAAI,UAAU,GAAG,SAAS,CAAwB;IACnE,IAAW,aAAa,IAAI,YAAY,EAAE,CAA+B;IACzE,IAAW,QAAQ,IAAI,OAAO,CAAyB;IAEhD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM;IAK9C,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM;IAM1D,YAAY;;;;IAOZ,kBAAkB;;;;IAIlB,eAAe;;;;IAIf,QAAQ;IAMR,MAAM;IAQN,OAAO,CAAC,gBAAgB,GAAE,OAAc;IAUxC,eAAe,IAAI,YAAY;IAQzB,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IASnC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAmB/C,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc;IAU9C,cAAc,CAAC,OAAO,EAAE,YAAY;IAU3C,OAAO,CAAC,oBAAoB;IAqB5B,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,MAAM;IAChD,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,SAAS,EAAE,EAAE,CAAC,cAAc,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;IAClI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE;CAC/G"}

View File

@ -1 +1 @@
{"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/NeuralNetwork.ts"],"names":[],"mappings":"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"} {"version":3,"file":"NeuralNetwork.js","sourceRoot":"","sources":["../../src/NeuralNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,MAAM,OAAgB,aAAa;IAKjC,YAAsB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;QAHzB,YAAO,GAA2B,SAAS,CAAA;QAC3C,mBAAc,GAAmB,EAAE,CAAA;QAG3C;;;;;;;UAOE;IACJ,CAAC;IAED,IAAW,MAAM,KAA6B,OAAO,IAAI,CAAC,OAAO,CAAA,CAAC,CAAC;IACnE,IAAW,aAAa,KAAqB,OAAO,IAAI,CAAC,cAAc,CAAA,CAAC,CAAC;IACzE,IAAW,QAAQ,KAAc,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA,CAAC,CAAC;IAEhD,gBAAgB,CAAC,SAAiB;QACvC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC7D,OAAO,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IAEM,qBAAqB,CAAC,SAAiB,EAAE,MAAiB;QAC/D,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC7D,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAA;QACtB,GAAG,CAAC,OAAO,CAAC,GAAG,MAAM,CAAA;IACvB,CAAC;IAEM,YAAY;QACjB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;SACzC,CAAC,CAAC,CAAA;IACL,CAAC;IAEM,kBAAkB;QACvB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAA;IACjF,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IACpF,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;YAClD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC7C,QAAQ,CAAC,OAAO,EAAE,CAAA;YAClB,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,OAAO,CAAC,mBAA4B,IAAI;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAClC,IAAI,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC/C,MAAM,IAAI,KAAK,CAAC,mDAAmD,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;aACjF;YACD,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;QACxB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;IAC1B,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,YAAY,CACrB,IAAI,CAAC,YAAY,EAAE;aAChB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAa,CAAC;aAC9D,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAC3C,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,YAA+C;QAC/D,IAAI,YAAY,YAAY,YAAY,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;YACjC,OAAM;SACP;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;IACtC,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,GAAuB;QAC9C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,mCAAmC,CAAC,CAAA;SAClE;QAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAA;QACtE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,QAA4B;QACpD,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,0CAA0C,CAAC,CAAA;SACzE;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAA;QAEjC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAA;QAExF,MAAM,oBAAoB,GAAG,CAAC,SAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAC/D,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CACtE,CAAA;QACD,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QACrE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;QAE3D,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC;IAEM,iBAAiB,CAAC,SAA4B;QACnD,MAAM,EACJ,aAAa,EACb,MAAM,EACP,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAA;QAE9C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAEM,cAAc,CAAC,OAAqB;QACzC,MAAM,EACJ,aAAa,EACb,MAAM,EACP,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE/B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAA;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAEO,oBAAoB,CAAC,SAAiB;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;SACrE;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAkD,EAAE,OAAO,EAAE,EAAE;YACzG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC,wDAAwD,OAAO,cAAc,SAAS,EAAE,CAAC,CAAA;aAC1G;YAED,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAA;QACrE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAE5B,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;QAC/B,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE;YAC5D,MAAM,IAAI,KAAK,CAAC,8DAA8D,SAAS,EAAE,CAAC,CAAA;SAC3F;QAED,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;IACzB,CAAC;CAKF"}

8
build/src/Platform.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
export declare class PlatformBrowser {
private textEncoder;
fetch(path: string, init?: RequestInit): Promise<Response>;
now(): number;
encode(text: string, encoding: string): Uint8Array;
decode(bytes: Uint8Array, encoding: string): string;
}
//# sourceMappingURL=Platform.d.ts.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Platform.d.ts","sourceRoot":"","sources":["../../src/Platform.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IAEjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI1D,GAAG,IAAI,MAAM;IAIb,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAUlD,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGpD"}

21
build/src/Platform.js Normal file
View File

@ -0,0 +1,21 @@
export class PlatformBrowser {
fetch(path, init) {
return fetch(path, init);
}
now() {
return performance.now();
}
encode(text, encoding) {
if (encoding !== 'utf-8' && encoding !== 'utf8') {
throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);
}
if (this.textEncoder == null) {
this.textEncoder = new TextEncoder();
}
return this.textEncoder.encode(text);
}
decode(bytes, encoding) {
return new TextDecoder(encoding).decode(bytes);
}
}
//# sourceMappingURL=Platform.js.map

View File

@ -0,0 +1 @@
{"version":3,"file":"Platform.js","sourceRoot":"","sources":["../../src/Platform.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAG1B,KAAK,CAAC,IAAY,EAAE,IAAkB;QACpC,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG;QACD,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,QAAgB;QACnC,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,EAAE;YAC/C,MAAM,IAAI,KAAK,CACX,kDAAkD,QAAQ,EAAE,CAAC,CAAC;SACnE;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;SACtC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,KAAiB,EAAE,QAAgB;QACxC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;CACF"}

View File

@ -20,7 +20,7 @@ export * from './NeuralNetwork';
export * from './resizeResults'; export * from './resizeResults';
export declare const version: { export declare const version: {
faceapi: string; faceapi: string;
node: string | boolean; node: boolean;
browser: string | boolean; browser: boolean;
}; };
//# sourceMappingURL=index.d.ts.map //# sourceMappingURL=index.d.ts.map

View File

@ -21,7 +21,10 @@ export * from './euclideanDistance';
export * from './NeuralNetwork'; export * from './NeuralNetwork';
export * from './resizeResults'; export * from './resizeResults';
import * as pkg from '../package.json'; import * as pkg from '../package.json';
const node = typeof process !== 'undefined' ? process.version : false; const node = (typeof process !== 'undefined');
const browser = typeof navigator !== 'undefined' ? navigator.userAgent : false; const browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');
export const version = { faceapi: pkg.version, node, browser }; export const version = { faceapi: pkg.version, node, browser };
import { PlatformBrowser } from './Platform';
if (!tf.env().platform && tf.env().get('IS_BROWSER'))
tf.env().setPlatform('browser', new PlatformBrowser);
//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map

View File

@ -1 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,sCAAsC;AAEtC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AACrE,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAA;AAC9E,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC"} {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,sCAAsC;AAEtC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAE3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAEhC,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AACvC,MAAM,IAAI,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC;AAC9C,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC;AACnG,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAE/D,OAAO,EAAC,eAAe,EAAC,MAAM,YAAY,CAAC;AAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;IAAE,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,eAAe,CAAC,CAAC"}

4345
dist/face-api.cjs.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

64
dist/face-api.esm.js vendored
View File

@ -725,7 +725,7 @@ function extendWithFaceDetection(sourceObj, detection) {
// build/src/env/createBrowserEnv.js // build/src/env/createBrowserEnv.js
function createBrowserEnv() { function createBrowserEnv() {
const fetch = window["fetch"] || function() { const fetch2 = window["fetch"] || function() {
throw new Error("fetch - missing fetch implementation for browser environment"); throw new Error("fetch - missing fetch implementation for browser environment");
}; };
const readFile = function() { const readFile = function() {
@ -739,7 +739,7 @@ function createBrowserEnv() {
Video: HTMLVideoElement, Video: HTMLVideoElement,
createCanvasElement: () => document.createElement("canvas"), createCanvasElement: () => document.createElement("canvas"),
createImageElement: () => document.createElement("img"), createImageElement: () => document.createElement("img"),
fetch, fetch: fetch2,
readFile readFile
}; };
} }
@ -784,7 +784,7 @@ function createNodejsEnv() {
} }
throw new Error("createImageElement - missing Image implementation for nodejs environment"); throw new Error("createImageElement - missing Image implementation for nodejs environment");
}; };
const fetch = global["fetch"] || function() { const fetch2 = global["fetch"] || function() {
throw new Error("fetch - missing fetch implementation for nodejs environment"); throw new Error("fetch - missing fetch implementation for nodejs environment");
}; };
const fileSystem = createFileSystem(); const fileSystem = createFileSystem();
@ -801,7 +801,7 @@ function createNodejsEnv() {
}, },
createCanvasElement, createCanvasElement,
createImageElement, createImageElement,
fetch, fetch: fetch2,
...fileSystem ...fileSystem
}; };
} }
@ -822,8 +822,8 @@ function getEnv() {
} }
return environment; return environment;
} }
function setEnv(env16) { function setEnv(env17) {
environment = env16; environment = env17;
} }
function initialize() { function initialize() {
if (isBrowser()) { if (isBrowser()) {
@ -833,22 +833,22 @@ function initialize() {
return setEnv(createNodejsEnv()); return setEnv(createNodejsEnv());
} }
} }
function monkeyPatch(env16) { function monkeyPatch(env17) {
if (!environment) { if (!environment) {
initialize(); initialize();
} }
if (!environment) { if (!environment) {
throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()"); throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");
} }
const {Canvas = environment.Canvas, Image = environment.Image} = env16; const {Canvas = environment.Canvas, Image = environment.Image} = env17;
environment.Canvas = Canvas; environment.Canvas = Canvas;
environment.Image = Image; environment.Image = Image;
environment.createCanvasElement = env16.createCanvasElement || (() => new Canvas()); environment.createCanvasElement = env17.createCanvasElement || (() => new Canvas());
environment.createImageElement = env16.createImageElement || (() => new Image()); environment.createImageElement = env17.createImageElement || (() => new Image());
environment.ImageData = env16.ImageData || environment.ImageData; environment.ImageData = env17.ImageData || environment.ImageData;
environment.Video = env16.Video || environment.Video; environment.Video = env17.Video || environment.Video;
environment.fetch = env16.fetch || environment.fetch; environment.fetch = env17.fetch || environment.fetch;
environment.readFile = env16.readFile || environment.readFile; environment.readFile = env17.readFile || environment.readFile;
} }
const env = { const env = {
getEnv, getEnv,
@ -1303,8 +1303,8 @@ async function extractFaceTensors(imageTensor, detections) {
// build/src/dom/fetchOrThrow.js // build/src/dom/fetchOrThrow.js
async function fetchOrThrow(url, init) { async function fetchOrThrow(url, init) {
const fetch = env.getEnv().fetch; const fetch2 = env.getEnv().fetch;
const res = await fetch(url, init); const res = await fetch2(url, init);
if (!(res.status < 400)) { if (!(res.status < 400)) {
throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`); throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);
} }
@ -4403,11 +4403,37 @@ function resizeResults(results, dimensions) {
// build/package.json // build/package.json
var version = "0.5.3"; var version = "0.5.3";
// build/src/Platform.js
class PlatformBrowser {
fetch(path, init) {
return fetch(path, init);
}
now() {
return performance.now();
}
encode(text, encoding) {
if (encoding !== "utf-8" && encoding !== "utf8") {
throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);
}
if (this.textEncoder == null) {
this.textEncoder = new TextEncoder();
}
return this.textEncoder.encode(text);
}
decode(bytes, encoding) {
return new TextDecoder(encoding).decode(bytes);
}
}
// build/src/index.js // build/src/index.js
import * as tf42 from "@tensorflow/tfjs"; import {
const node = typeof process !== "undefined" ? process.version : false; env as env16
const browser3 = typeof navigator !== "undefined" ? navigator.userAgent : false; }, * as tf42 from "@tensorflow/tfjs";
const node = typeof process !== "undefined";
const browser3 = typeof navigator !== "undefined" && typeof navigator.userAgent !== "undefined";
const version2 = {faceapi: version, node, browser: browser3}; const version2 = {faceapi: version, node, browser: browser3};
if (!env16().platform && env16().get("IS_BROWSER"))
env16().setPlatform("browser", new PlatformBrowser());
export { export {
AgeGenderNet, AgeGenderNet,
BoundingBox, BoundingBox,

File diff suppressed because one or more lines are too long

4350
dist/face-api.iife.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

3976
dist/face-api.js vendored Normal file

File diff suppressed because one or more lines are too long

7
dist/face-api.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4534
dist/face-api.node.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -5,8 +5,8 @@
<meta http-equiv="content-type"> <meta http-equiv="content-type">
<meta content="text/html"> <meta content="text/html">
<meta charset="UTF-8"> <meta charset="UTF-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/2.3.0/tf.es2017.js"></script> <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/2.6.0/tf.min.js"></script> -->
<script src="https://vladmandic.github.io/face-api/dist/face-api.js"></script> <script src="../dist/face-api.js"></script>
<style> <style>
body { font-family: monospace; background: black; color: white; font-size: 16px; line-height: 22px; margin: 0; } body { font-family: monospace; background: black; color: white; font-size: 16px; line-height: 22px; margin: 0; }
</style> </style>
@ -27,7 +27,7 @@
// helper function to pretty-print json object to string // helper function to pretty-print json object to string
function str(json) { function str(json) {
let text = '<font color="lightblue">'; let text = '<font color="lightblue">';
text += JSON.stringify(json).replace(/{|}|"|\[|\]/g, '').replace(/,/g, ', '); text += json ? JSON.stringify(json).replace(/{|}|"|\[|\]/g, '').replace(/,/g, ', ') : '';
text += '</font>'; text += '</font>';
return text; return text;
} }
@ -120,11 +120,15 @@
async function main() { async function main() {
// initialize tfjs // initialize tfjs
log('FaceAPI Test'); log('FaceAPI Test');
window.tf = faceapi.tf;
await faceapi.tf.setBackend('webgl'); await faceapi.tf.setBackend('webgl');
await faceapi.tf.enableProdMode(); await faceapi.tf.enableProdMode();
await faceapi.tf.ENV.set('DEBUG', false); await faceapi.tf.ENV.set('DEBUG', false);
await faceapi.tf.ready();
// check version // check version
log(`Version: ${str(faceapi.version)}`); log(`Version: TensorFlow/JS ${str(faceapi.tf?.version_core || '(not loaded)')} FaceAPI ${str(faceapi?.version || '(not loaded)')} Backend: ${str(faceapi.tf?.getBackend() || '(not loaded)')}`);
log(`Flags: ${JSON.stringify(faceapi.tf.ENV.flags)}`);
// load face-api models // load face-api models
log('Loading FaceAPI models'); log('Loading FaceAPI models');

18
package-lock.json generated
View File

@ -77,9 +77,9 @@
"integrity": "sha512-nU9WNSGpEU6GzKo5bvJBMa/OZRe1bR5Z2W6T0XiEY8CBiPNS+oJFJNm0NY8kQj/WnDS0Hfue38P46q7gV/9XMA==" "integrity": "sha512-nU9WNSGpEU6GzKo5bvJBMa/OZRe1bR5Z2W6T0XiEY8CBiPNS+oJFJNm0NY8kQj/WnDS0Hfue38P46q7gV/9XMA=="
}, },
"@types/node": { "@types/node": {
"version": "14.11.7", "version": "14.11.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.7.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz",
"integrity": "sha512-hSEXknS4KiayUdZ7401J/T6eykXHJkDEipnyQMJ4/GstK4kWjbHnwXlcpvIWfPKiEH1JU96DkbzJ1nHRmpmKLw==" "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw=="
}, },
"@types/node-fetch": { "@types/node-fetch": {
"version": "2.5.7", "version": "2.5.7",
@ -436,15 +436,15 @@
} }
}, },
"tslib": { "tslib": {
"version": "2.0.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.2.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
"integrity": "sha512-wAH28hcEKwna96/UacuWaVspVLkg4x1aDM9JlzqaQTOFczCktkVAb5fmXChgandR1EraDPs2w8P+ozM+oafwxg==", "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==",
"dev": true "dev": true
}, },
"typescript": { "typescript": {
"version": "4.1.0-dev.20201008", "version": "4.1.0-dev.20201011",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.0-dev.20201008.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.0-dev.20201011.tgz",
"integrity": "sha512-+g2TfvYueD60iu2YXz5czsDRdY4M/h9RvmwrorTTNmnTQaUOeb7spT4EyHa1g5TjhqHa/8+lCgCdPkuEQqg9WA==", "integrity": "sha512-+Lfj2Q+dXFAJbfB1jQQRlhTssgl0CQVo8a+CNzlNXsnC1cN1yoH40wkEjWd6uB8NGkamxKda1xrEb2miJtpP5g==",
"dev": true "dev": true
}, },
"wrap-ansi": { "wrap-ansi": {

View File

@ -1,23 +1,18 @@
{ {
"name": "@vladmandic/face-api", "name": "@vladmandic/face-api",
"version": "0.5.3", "version": "0.6.0",
"description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS", "description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS",
"main": "build/src/index.js", "main": "build/src/index.js",
"browser": "dist/face-api.esm.js", "browser": "dist/face-api.js",
"typings": "./build/src/index.d.ts", "typings": "build/src/index.d.ts",
"engines": { "engines": {
"node": ">=12.0.0" "node": ">=12.0.0"
}, },
"type": "module", "type": "module",
"scripts": { "scripts": {
"compile": "tsc", "build-esm": "esbuild --bundle --format=esm --target=esnext --platform=browser --sourcemap --outfile=./dist/face-api.esm.js --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"clean": "rimraf build/ dist/", "build-iife": "esbuild --bundle --format=iife --target=esnext --platform=browser --sourcemap --outfile=./dist/face-api.js --global-name=faceapi --minify --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"cjs": "esbuild --bundle --outfile=./dist/face-api.cjs.js --target=esnext --platform=browser --format=cjs --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js", "build": "rimraf build/ dist/ && tsc && npm run build-esm && npm run build-iife"
"node": "esbuild --bundle --outfile=./dist/face-api.node.js --target=esnext --platform=node --format=esm --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"esm": "esbuild --bundle --outfile=./dist/face-api.esm.js --target=esnext --platform=browser --format=esm --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"iife": "esbuild --bundle --outfile=./dist/face-api.iife.js --target=esnext --platform=browser --format=iife --global-name=faceapi --sourcemap --external:@tensorflow/tfjs --log-level=error --tsconfig=./tsconfig.json build/src/index.js",
"minify": "esbuild --bundle --outfile=./dist/face-api.min.js --target=esnext --platform=browser --format=iife --sourcemap --global-name=faceapi --external:@tensorflow/tfjs --log-level=error --minify --tsconfig=./tsconfig.json build/src/index.js",
"build": "npm run clean && npm run compile && npm run cjs && npm run esm && npm run iife && npm run node && npm run minify"
}, },
"keywords": [ "keywords": [
"tensorflow", "tensorflow",
@ -45,11 +40,11 @@
"@tensorflow/tfjs": "^2.6.0" "@tensorflow/tfjs": "^2.6.0"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^14.11.7", "@types/node": "^14.11.8",
"esbuild": "^0.6.34", "esbuild": "^0.6.34",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"ts-node": "^9.0.0", "ts-node": "^9.0.0",
"tslib": "^2.0.2", "tslib": "^2.0.3",
"typescript": "^4.1.0-dev.20201008" "typescript": "^4.1.0-dev.20201011"
} }
} }

View File

@ -114,7 +114,6 @@ export abstract class NeuralNetwork<TNetParams> {
filePaths.map(filePath => readFile(filePath).then(buf => buf.buffer)) filePaths.map(filePath => readFile(filePath).then(buf => buf.buffer))
) )
const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk) const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)
const manifest = JSON.parse((await readFile(manifestUri)).toString()) const manifest = JSON.parse((await readFile(manifestUri)).toString())
const weightMap = await loadWeights(manifest, modelBaseUri) const weightMap = await loadWeights(manifest, modelBaseUri)

25
src/Platform.ts Normal file
View File

@ -0,0 +1,25 @@
export class PlatformBrowser {
private textEncoder: TextEncoder;
fetch(path: string, init?: RequestInit): Promise<Response> {
return fetch(path, init);
}
now(): number {
return performance.now();
}
encode(text: string, encoding: string): Uint8Array {
if (encoding !== 'utf-8' && encoding !== 'utf8') {
throw new Error(
`Browser's encoder only supports utf-8, but got ${encoding}`);
}
if (this.textEncoder == null) {
this.textEncoder = new TextEncoder();
}
return this.textEncoder.encode(text);
}
decode(bytes: Uint8Array, encoding: string): string {
return new TextDecoder(encoding).decode(bytes);
}
}

View File

@ -24,6 +24,9 @@ export * from './NeuralNetwork';
export * from './resizeResults'; export * from './resizeResults';
import * as pkg from '../package.json'; import * as pkg from '../package.json';
const node = typeof process !== 'undefined' ? process.version : false const node = (typeof process !== 'undefined');
const browser = typeof navigator !== 'undefined' ? navigator.userAgent : false const browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');
export const version = { faceapi: pkg.version, node, browser }; export const version = { faceapi: pkg.version, node, browser };
import {PlatformBrowser} from './Platform';
if (!tf.env().platform && tf.env().get('IS_BROWSER')) tf.env().setPlatform('browser', new PlatformBrowser);

View File

@ -1,7 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"lib": ["es2018", "dom"], "lib": ["es2018", "dom"],
"module": "es2020", "module": "esnext",
"moduleResolution": "node", "moduleResolution": "node",
"outDir": "build", "outDir": "build",
"target": "es2018", "target": "es2018",