diff --git a/README.md b/README.md index c2d4492..1ea99cb 100644 --- a/README.md +++ b/README.md @@ -9,93 +9,107 @@ Forked from **face-api.js** version **0.22.2** released on March 22nd, 2020 - - +Currently based on **`TensorFlow/JS` 2.6.0** +If you want to access `TFJS` classes and methods directly, they are exported as `faceapi.tf` + ## Differences -- Removed tests, docs, examples -- Updated all package dependencies -- Compatible with TensorFlow/JS 2.0+ -- Updated type casting for TypeScript type checking -- Removed unnecesary package dependencies (karma, jasmine, etc.) +- Updated all type castings for TypeScript type checking to TypeScript 4.1 - Typescript build process now targets ES2018 and instead of dual ES5/ES6 +- Compatible with TensorFlow/JS 2.0+ +- Removed old tests, docs, examples +- Removed unnecesary package dependencies (karma, jasmine, etc.) +- Updated all package dependencies - Browser bundle process uses ESBuild instead of Rollup - New TensorFlow/JS dependencies since backends were removed from @tensorflow/tfjs-core - Updated mobileNetv1 model due to batchNorm() dependency - Fully tree shakable when imported as an ESM module - 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+ - - mtcnn: Mostly obsolete + - mtcnn: Obsolete - tinyYolov2: Non-functional since weights are missing Which means valid models are **tinyFaceDetector** and **mobileNetv1** -Due to reduced code and changed build process, resulting bundle is about **>5x smaller** than the original! ## Installation There are several ways to use Face-API: -**Important**: This version of Face-Api does NOT pre-package `TFJS` to allow for faster downloads (it's much smaller) as well as to allow user to choose version of TFJS to use (it's compatible with any `TFJS 2.0+`). - ### 1. IIFE script -*Size: 936KB minified* -This is simplest way for usage within Browser -Simply download `dist/face-api.js`, include it in your `HTML` file & it's ready to use. +*Recommened for quick tests and backward compatibility with older Browsers that do not support ESM such as IE* + +This is simplest way for usage within Browser +Simply download `dist/face-api.js`, include it in your `HTML` file & it's ready to use ```html - -``` - -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` +IIFE script auto-registers global namespace `faceapi` within Window object which can be accessed directly from a ` + diff --git a/example/index.js b/example/index.js index e0674de..bd39ee3 100644 --- a/example/index.js +++ b/example/index.js @@ -127,6 +127,12 @@ async function main() { const engine = await faceapi.tf.engine(); log(`TF Engine State: ${str(engine.state)}`); + // const testT = faceapi.tf.tensor([0]); + // const testF = testT.toFloat(); + // console.log(testT.print(), testF.print()); + // testT.dispose(); + // testF.dispose(); + // loop through all images and try to process them log(`Start processing: ${samples.length} images ...
`); for (const img of samples) { diff --git a/package-lock.json b/package-lock.json index 8cc0cce..73c16a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs/-/tfjs-2.6.0.tgz", "integrity": "sha512-f70NAt480+/NH6ueAdKhwgN3BzeBWrvuAZ591pH44nuVlmUHtih7pSMVv2wREPOgA4ciAufops4FtTaqNamxZw==", + "dev": true, "requires": { "@tensorflow/tfjs-backend-cpu": "2.6.0", "@tensorflow/tfjs-backend-webgl": "2.6.0", @@ -26,6 +27,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-2.6.0.tgz", "integrity": "sha512-essk82VoET77tuFX5Sa9zv9F8d/2DxjEQ2RavoU+ugs0l64DTbdTpv3WdQwUihv1gNN7/16fUjJ6cG80SnS8/g==", + "dev": true, "requires": { "@types/seedrandom": "2.4.27", "seedrandom": "2.4.3" @@ -35,6 +37,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-2.6.0.tgz", "integrity": "sha512-j1eNYKIpO06CTSRXiIWdpZ2iPDBkx7PPl7K/1BtCEW/9FP7Q0q3doHKNmTdOPvuw7Dt1nNHEMnba0YB2lc5S7Q==", + "dev": true, "requires": { "@tensorflow/tfjs-backend-cpu": "2.6.0", "@types/offscreencanvas": "~2019.3.0", @@ -47,12 +50,14 @@ "@tensorflow/tfjs-converter": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-converter/-/tfjs-converter-2.6.0.tgz", - "integrity": "sha512-TzL4ULidZ26iVqfLmv5G6dfnJyJt5HttU1VZoBYCbxUcWQYk1Z4D9wqLVwfdcJz01XEKpmsECh8HBF0hwYlrkA==" + "integrity": "sha512-TzL4ULidZ26iVqfLmv5G6dfnJyJt5HttU1VZoBYCbxUcWQYk1Z4D9wqLVwfdcJz01XEKpmsECh8HBF0hwYlrkA==", + "dev": true }, "@tensorflow/tfjs-core": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-2.6.0.tgz", "integrity": "sha512-akUB1iz663UCUdOfEUu91XeHzGpdYtdtMPxjsGEdF0CwENzSAcvHzQrEVoPBRD+RKpxrVXvQBoOd7GYBxMIIKQ==", + "dev": true, "requires": { "@types/offscreencanvas": "~2019.3.0", "@types/seedrandom": "2.4.27", @@ -66,6 +71,7 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-data/-/tfjs-data-2.6.0.tgz", "integrity": "sha512-/x/j/A4Quiyc21xEYyBC82mqyssbFHRuHez7pYVJA/28TOesAfWPWo2I+wkeOTt91UerUeZMSq2FV3HOnPInhQ==", + "dev": true, "requires": { "@types/node-fetch": "^2.1.2", "node-fetch": "~2.6.1" @@ -74,17 +80,20 @@ "@tensorflow/tfjs-layers": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@tensorflow/tfjs-layers/-/tfjs-layers-2.6.0.tgz", - "integrity": "sha512-nU9WNSGpEU6GzKo5bvJBMa/OZRe1bR5Z2W6T0XiEY8CBiPNS+oJFJNm0NY8kQj/WnDS0Hfue38P46q7gV/9XMA==" + "integrity": "sha512-nU9WNSGpEU6GzKo5bvJBMa/OZRe1bR5Z2W6T0XiEY8CBiPNS+oJFJNm0NY8kQj/WnDS0Hfue38P46q7gV/9XMA==", + "dev": true }, "@types/node": { "version": "14.11.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==" + "integrity": "sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==", + "dev": true }, "@types/node-fetch": { "version": "2.5.7", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", + "dev": true, "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -93,32 +102,38 @@ "@types/offscreencanvas": { "version": "2019.3.0", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==" + "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==", + "dev": true }, "@types/seedrandom": { "version": "2.4.27", "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz", - "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=" + "integrity": "sha1-nbVjk33YaRX2kJK8QyWdL0hXjkE=", + "dev": true }, "@types/webgl-ext": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz", - "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" + "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==", + "dev": true }, "@types/webgl2": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz", - "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==" + "integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw==", + "dev": true }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -133,6 +148,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -140,7 +156,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "balanced-match": { "version": "1.0.0", @@ -168,6 +185,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -177,6 +195,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz", "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -187,6 +206,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -194,12 +214,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -213,12 +235,14 @@ "core-js": { "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "dev": true }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "diff": { "version": "4.0.2", @@ -229,7 +253,8 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "esbuild": { "version": "0.6.34", @@ -238,14 +263,16 @@ "dev": true }, "escalade": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", - "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "form-data": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -261,7 +288,8 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true }, "glob": { "version": "7.1.6", @@ -280,7 +308,8 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -301,7 +330,8 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true }, "make-error": { "version": "1.3.6", @@ -312,12 +342,14 @@ "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, "requires": { "mime-db": "1.44.0" } @@ -334,7 +366,8 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true }, "once": { "version": "1.4.0", @@ -354,12 +387,14 @@ "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true }, "rimraf": { "version": "3.0.2", @@ -373,7 +408,8 @@ "seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", - "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=" + "integrity": "sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw=", + "dev": true }, "source-map": { "version": "0.6.1", @@ -394,12 +430,14 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -410,6 +448,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -418,6 +457,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -442,15 +482,16 @@ "dev": true }, "typescript": { - "version": "4.1.0-dev.20201012", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.0-dev.20201012.tgz", - "integrity": "sha512-afzjHTxmS6JszBOz3CkQqlP+5ZlvZ/ACbRJMXJWhEYfHPCDHdQGZVEMbdnYICM1KfgN2SUpubWJsWvyxkoNmHA==", + "version": "4.1.0-dev.20201013", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.0-dev.20201013.tgz", + "integrity": "sha512-wM4uCHgnK3SWW3a655een4MF9cDmsUsENRj55foBpt1mRxFjd1OniePSDBvOqdgEncSpAJfVMnB7hyHPhB0Qog==", "dev": true }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -466,12 +507,14 @@ "y18n": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.2.tgz", - "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA==" + "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA==", + "dev": true }, "yargs": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz", "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==", + "dev": true, "requires": { "cliui": "^7.0.0", "escalade": "^3.0.2", @@ -485,7 +528,8 @@ "yargs-parser": { "version": "20.2.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==" + "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==", + "dev": true }, "yn": { "version": "3.1.1", diff --git a/package.json b/package.json index 17c97b1..c068953 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,19 @@ "name": "@vladmandic/face-api", "version": "0.6.3", "description": "JavaScript module for Face Detection and Face Recognition Using Tensorflow/JS", - "main": "build/src/index.js", + "main": "build/index.js", + "module": "dist/face-api.esm.js", "browser": "dist/face-api.js", - "typings": "build/src/index.d.ts", + "source:": "src/index.ts", + "typings": "build/index.d.ts", "engines": { "node": ">=12.0.0" }, "type": "module", "scripts": { - "build-esm": "esbuild --bundle --format=esm --target=esnext --platform=browser --sourcemap --outfile=./dist/face-api.esm.js --minify --log-level=error --tsconfig=./tsconfig.json build/src/index.js", - "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", - "build": "rimraf build/ dist/ && tsc && npm run build-esm && npm run build-iife" + "build-esm": "esbuild --bundle --format=esm --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.esm.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs src/index.ts", + "build-iife": "esbuild --bundle --format=iife --target=es2018 --platform=browser --minify --sourcemap --outfile=./dist/face-api.js --log-level=error --tsconfig=./tsconfig.json --external:util --external:string_decoder --external:fs --global-name=faceapi src/index.ts", + "build": "rimraf build/* dist/* && tsc && npm run build-esm && npm run build-iife && ls -l dist/" }, "keywords": [ "tensorflow", @@ -36,7 +38,8 @@ "url": "https://github.com/vladmandic/face-api/issues" }, "homepage": "https://github.com/vladmandic/face-api#readme", - "dependencies": { + "Dependencies": {}, + "peerDependencies": { "@tensorflow/tfjs": "^2.6.0" }, "devDependencies": { @@ -45,6 +48,7 @@ "rimraf": "^3.0.2", "ts-node": "^9.0.0", "tslib": "^2.0.3", - "typescript": "^4.1.0-dev.20201011" + "typescript": "^4.1.0-dev.20201013", + "@tensorflow/tfjs": "^2.6.0" } } diff --git a/src/NeuralNetwork.ts b/src/NeuralNetwork.ts index d433741..8fb1e68 100644 --- a/src/NeuralNetwork.ts +++ b/src/NeuralNetwork.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ParamMapping } from './common'; import { getModelUris } from './common/getModelUris'; diff --git a/src/ageGenderNet/AgeGenderNet.ts b/src/ageGenderNet/AgeGenderNet.ts index 3bd62f0..5a49aef 100644 --- a/src/ageGenderNet/AgeGenderNet.ts +++ b/src/ageGenderNet/AgeGenderNet.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { fullyConnectedLayer } from '../common/fullyConnectedLayer'; import { seperateWeightMaps } from '../faceProcessor/util'; @@ -80,9 +80,7 @@ export class AgeGenderNet extends NeuralNetwork { out.age.dispose() out.gender.dispose() - return netInput.isBatchInput - ? predictionsByBatch - : predictionsByBatch[0] + return netInput.isBatchInput ? predictionsByBatch as AgeAndGenderPrediction[] : predictionsByBatch[0] as AgeAndGenderPrediction } protected getDefaultModelName(): string { diff --git a/src/ageGenderNet/extractParamsFromWeigthMap.ts b/src/ageGenderNet/extractParamsFromWeigthMap.ts index 5d2a77a..e08aac0 100644 --- a/src/ageGenderNet/extractParamsFromWeigthMap.ts +++ b/src/ageGenderNet/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common'; import { NetParams } from './types'; diff --git a/src/ageGenderNet/types.ts b/src/ageGenderNet/types.ts index 92c6079..80847f3 100644 --- a/src/ageGenderNet/types.ts +++ b/src/ageGenderNet/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FCParams } from '../common'; diff --git a/src/common/convLayer.ts b/src/common/convLayer.ts index 8b17e5a..c81b7dc 100644 --- a/src/common/convLayer.ts +++ b/src/common/convLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from './types'; diff --git a/src/common/depthwiseSeparableConv.ts b/src/common/depthwiseSeparableConv.ts index c8a4c27..f4b9ed8 100644 --- a/src/common/depthwiseSeparableConv.ts +++ b/src/common/depthwiseSeparableConv.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { SeparableConvParams } from './types'; diff --git a/src/common/extractConvParamsFactory.ts b/src/common/extractConvParamsFactory.ts index 0f13b1e..cb16055 100644 --- a/src/common/extractConvParamsFactory.ts +++ b/src/common/extractConvParamsFactory.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams, ExtractWeightsFunction, ParamMapping } from './types'; diff --git a/src/common/extractFCParamsFactory.ts b/src/common/extractFCParamsFactory.ts index 7335116..d92558a 100644 --- a/src/common/extractFCParamsFactory.ts +++ b/src/common/extractFCParamsFactory.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ExtractWeightsFunction, FCParams, ParamMapping } from './types'; diff --git a/src/common/extractSeparableConvParamsFactory.ts b/src/common/extractSeparableConvParamsFactory.ts index bbab8ca..5fda65f 100644 --- a/src/common/extractSeparableConvParamsFactory.ts +++ b/src/common/extractSeparableConvParamsFactory.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types'; diff --git a/src/common/fullyConnectedLayer.ts b/src/common/fullyConnectedLayer.ts index 4e67cae..97b2b1e 100644 --- a/src/common/fullyConnectedLayer.ts +++ b/src/common/fullyConnectedLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FCParams } from './types'; diff --git a/src/common/loadConvParamsFactory.ts b/src/common/loadConvParamsFactory.ts index 5546df9..bebe61d 100644 --- a/src/common/loadConvParamsFactory.ts +++ b/src/common/loadConvParamsFactory.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from './types'; diff --git a/src/common/types.ts b/src/common/types.ts index 0179990..388a7d8 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; export type ExtractWeightsFunction = (numWeights: number) => Float32Array diff --git a/src/dom/NetInput.ts b/src/dom/NetInput.ts index ad8c54a..84d953c 100644 --- a/src/dom/NetInput.ts +++ b/src/dom/NetInput.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs-core'; import { Dimensions } from '../classes/Dimensions'; import { env } from '../env'; @@ -37,17 +37,17 @@ export class NetInput { } if (isTensor4D(input)) { - const batchSize = input.shape[0] + const batchSize = (input as any).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) + this._inputDimensions[idx] = (input as any).shape.slice(1) return } - const canvas = input instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input) + const canvas = (input as any) instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input) this._canvases[idx] = canvas this._inputDimensions[idx] = [canvas.height, canvas.width, 3] }) @@ -149,7 +149,8 @@ export class NetInput { // const batchTensor = tf.stack(inputTensors.map(t => t.toFloat())).as4D(this.batchSize, inputSize, inputSize, 3) const batchTensor = tf.stack(inputTensors.map(t => tf.cast(t, 'float32'))).as4D(this.batchSize, inputSize, inputSize, 3) - + // const batchTensor = tf.stack(inputTensors.map(t => tf.Tensor.as4D(tf.cast(t, 'float32'))), this.batchSize, inputSize, inputSize, 3); + return batchTensor }) } diff --git a/src/dom/extractFaceTensors.ts b/src/dom/extractFaceTensors.ts index 52c8bcb..711f6f9 100644 --- a/src/dom/extractFaceTensors.ts +++ b/src/dom/extractFaceTensors.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { Rect } from '../classes'; import { FaceDetection } from '../classes/FaceDetection'; diff --git a/src/dom/imageTensorToCanvas.ts b/src/dom/imageTensorToCanvas.ts index 89eb344..fb316d2 100644 --- a/src/dom/imageTensorToCanvas.ts +++ b/src/dom/imageTensorToCanvas.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { env } from '../env'; import { isTensor4D } from '../utils'; diff --git a/src/dom/loadWeightMap.ts b/src/dom/loadWeightMap.ts index bdb1d92..ae845be 100644 --- a/src/dom/loadWeightMap.ts +++ b/src/dom/loadWeightMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { getModelUris } from '../common/getModelUris'; import { fetchJson } from './fetchJson'; diff --git a/src/dom/types.ts b/src/dom/types.ts index 6641c9f..a8dc061 100644 --- a/src/dom/types.ts +++ b/src/dom/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput } from './NetInput'; diff --git a/src/faceExpressionNet/FaceExpressionNet.ts b/src/faceExpressionNet/FaceExpressionNet.ts index 6c0a3c8..91f1568 100644 --- a/src/faceExpressionNet/FaceExpressionNet.ts +++ b/src/faceExpressionNet/FaceExpressionNet.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput, TNetInput, toNetInput } from '../dom'; import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor'; diff --git a/src/faceFeatureExtractor/FaceFeatureExtractor.ts b/src/faceFeatureExtractor/FaceFeatureExtractor.ts index 159356a..45b5f6b 100644 --- a/src/faceFeatureExtractor/FaceFeatureExtractor.ts +++ b/src/faceFeatureExtractor/FaceFeatureExtractor.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput, TNetInput, toNetInput } from '../dom'; import { NeuralNetwork } from '../NeuralNetwork'; diff --git a/src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts b/src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts index 9d6ecca..409a3a8 100644 --- a/src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts +++ b/src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput, TNetInput, toNetInput } from '../dom'; import { NeuralNetwork } from '../NeuralNetwork'; diff --git a/src/faceFeatureExtractor/denseBlock.ts b/src/faceFeatureExtractor/denseBlock.ts index 0b9288b..8d20b31 100644 --- a/src/faceFeatureExtractor/denseBlock.ts +++ b/src/faceFeatureExtractor/denseBlock.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams, SeparableConvParams } from '../common'; import { depthwiseSeparableConv } from '../common/depthwiseSeparableConv'; diff --git a/src/faceFeatureExtractor/extractParamsFromWeigthMap.ts b/src/faceFeatureExtractor/extractParamsFromWeigthMap.ts index ab8e93e..1d6a623 100644 --- a/src/faceFeatureExtractor/extractParamsFromWeigthMap.ts +++ b/src/faceFeatureExtractor/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, ParamMapping } from '../common'; import { loadParamsFactory } from './loadParamsFactory'; diff --git a/src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts b/src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts index 0a3f216..ceb7e9d 100644 --- a/src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts +++ b/src/faceFeatureExtractor/extractParamsFromWeigthMapTiny.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, ParamMapping } from '../common'; import { loadParamsFactory } from './loadParamsFactory'; diff --git a/src/faceFeatureExtractor/types.ts b/src/faceFeatureExtractor/types.ts index 2cb136a..298a883 100644 --- a/src/faceFeatureExtractor/types.ts +++ b/src/faceFeatureExtractor/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput, TNetInput } from '..'; import { ConvParams, SeparableConvParams } from '../common'; diff --git a/src/faceLandmarkNet/FaceLandmark68NetBase.ts b/src/faceLandmarkNet/FaceLandmark68NetBase.ts index 92de6ff..767ab16 100644 --- a/src/faceLandmarkNet/FaceLandmark68NetBase.ts +++ b/src/faceLandmarkNet/FaceLandmark68NetBase.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { IDimensions, Point } from '../classes'; import { FaceLandmarks68 } from '../classes/FaceLandmarks68'; @@ -85,7 +85,7 @@ export abstract class FaceLandmark68NetBase< const yCoords = landmarksArray.filter((_, i) => !isEven(i)) return new FaceLandmarks68( - Array(68).fill(0).map((_, i) => new Point(xCoords[i], yCoords[i])), + Array(68).fill(0).map((_, i) => new Point(xCoords[i] as number, yCoords[i] as number)), { height: netInput.getInputHeight(batchIdx), width : netInput.getInputWidth(batchIdx), @@ -96,9 +96,7 @@ export abstract class FaceLandmark68NetBase< landmarkTensors.forEach(t => t.dispose()) - return netInput.isBatchInput - ? landmarksForBatch - : landmarksForBatch[0] + return netInput.isBatchInput ? landmarksForBatch as FaceLandmarks68[] : landmarksForBatch[0] as FaceLandmarks68; } protected getClassifierChannelsOut(): number { diff --git a/src/faceProcessor/FaceProcessor.ts b/src/faceProcessor/FaceProcessor.ts index 76ffbc2..5d1e49f 100644 --- a/src/faceProcessor/FaceProcessor.ts +++ b/src/faceProcessor/FaceProcessor.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { fullyConnectedLayer } from '../common/fullyConnectedLayer'; import { NetInput } from '../dom'; diff --git a/src/faceProcessor/extractParamsFromWeigthMap.ts b/src/faceProcessor/extractParamsFromWeigthMap.ts index 02a2b64..388decd 100644 --- a/src/faceProcessor/extractParamsFromWeigthMap.ts +++ b/src/faceProcessor/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common'; import { NetParams } from './types'; diff --git a/src/faceProcessor/util.ts b/src/faceProcessor/util.ts index 6f44e2b..0b8924e 100644 --- a/src/faceProcessor/util.ts +++ b/src/faceProcessor/util.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; export function seperateWeightMaps(weightMap: tf.NamedTensorMap) { diff --git a/src/faceRecognitionNet/FaceRecognitionNet.ts b/src/faceRecognitionNet/FaceRecognitionNet.ts index 2681261..f81923b 100644 --- a/src/faceRecognitionNet/FaceRecognitionNet.ts +++ b/src/faceRecognitionNet/FaceRecognitionNet.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { NetInput, TNetInput, toNetInput } from '../dom'; import { NeuralNetwork } from '../NeuralNetwork'; diff --git a/src/faceRecognitionNet/convLayer.ts b/src/faceRecognitionNet/convLayer.ts index 8f0bc94..7a797f9 100644 --- a/src/faceRecognitionNet/convLayer.ts +++ b/src/faceRecognitionNet/convLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { scale } from './scaleLayer'; import { ConvLayerParams } from './types'; diff --git a/src/faceRecognitionNet/extractParams.ts b/src/faceRecognitionNet/extractParams.ts index 9291256..0e5d992 100644 --- a/src/faceRecognitionNet/extractParams.ts +++ b/src/faceRecognitionNet/extractParams.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from '../common'; import { isFloat } from '../utils'; diff --git a/src/faceRecognitionNet/extractParamsFromWeigthMap.ts b/src/faceRecognitionNet/extractParamsFromWeigthMap.ts index f935178..dbd904d 100644 --- a/src/faceRecognitionNet/extractParamsFromWeigthMap.ts +++ b/src/faceRecognitionNet/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common'; import { isTensor2D } from '../utils'; diff --git a/src/faceRecognitionNet/residualLayer.ts b/src/faceRecognitionNet/residualLayer.ts index e1404bb..3f94548 100644 --- a/src/faceRecognitionNet/residualLayer.ts +++ b/src/faceRecognitionNet/residualLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { conv, convDown, convNoRelu } from './convLayer'; import { ResidualLayerParams } from './types'; diff --git a/src/faceRecognitionNet/scaleLayer.ts b/src/faceRecognitionNet/scaleLayer.ts index 3f9c0c6..cbd0b13 100644 --- a/src/faceRecognitionNet/scaleLayer.ts +++ b/src/faceRecognitionNet/scaleLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ScaleLayerParams } from './types'; diff --git a/src/faceRecognitionNet/types.ts b/src/faceRecognitionNet/types.ts index fffc5c0..8d2a8d5 100644 --- a/src/faceRecognitionNet/types.ts +++ b/src/faceRecognitionNet/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from '../common'; diff --git a/src/globalApi/DetectFaceLandmarksTasks.ts b/src/globalApi/DetectFaceLandmarksTasks.ts index bb6b72c..f424f24 100644 --- a/src/globalApi/DetectFaceLandmarksTasks.ts +++ b/src/globalApi/DetectFaceLandmarksTasks.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FaceLandmarks68 } from '../classes/FaceLandmarks68'; import { extractFaces, extractFaceTensors, TNetInput } from '../dom'; diff --git a/src/globalApi/PredictAgeAndGenderTask.ts b/src/globalApi/PredictAgeAndGenderTask.ts index 2702abd..8bc1898 100644 --- a/src/globalApi/PredictAgeAndGenderTask.ts +++ b/src/globalApi/PredictAgeAndGenderTask.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { AgeAndGenderPrediction } from '../ageGenderNet/types'; import { TNetInput } from '../dom'; diff --git a/src/globalApi/PredictFaceExpressionsTask.ts b/src/globalApi/PredictFaceExpressionsTask.ts index 5cfe58a..8f9d08a 100644 --- a/src/globalApi/PredictFaceExpressionsTask.ts +++ b/src/globalApi/PredictFaceExpressionsTask.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { TNetInput } from '../dom'; import { FaceExpressions } from '../faceExpressionNet/FaceExpressions'; diff --git a/src/globalApi/extractFacesAndComputeResults.ts b/src/globalApi/extractFacesAndComputeResults.ts index e51f8e6..11e00bb 100644 --- a/src/globalApi/extractFacesAndComputeResults.ts +++ b/src/globalApi/extractFacesAndComputeResults.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FaceDetection } from '../classes/FaceDetection'; import { extractFaces, extractFaceTensors, TNetInput } from '../dom'; diff --git a/src/index.ts b/src/index.ts index 7370b78..74285f2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,11 @@ -// const os = require('os'); -// const process = require('process'); - -import * as tf from '@tensorflow/tfjs'; +// import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; +// const tf = require('@tensorflow/tfjs-core/dist/tf-core.es2017.js'); +// require('@tensorflow/tfjs-backend-cpu/dist/tf-backend-cpu.es2017.js'); +// require('@tensorflow/tfjs-backend-webgl/dist/tf-backend-webgl.es2017.js'); import * as draw from './draw'; import * as utils from './utils'; -export { draw, utils, tf }; +export { tf, draw, utils }; export * from './ageGenderNet/index'; export * from './classes/index'; @@ -28,5 +29,10 @@ const node = (typeof process !== 'undefined'); const browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined'); export const version = { faceapi: pkg.version, node, browser }; -// import {PlatformBrowser} from './Platform'; +// import { PlatformBrowser } from './Platform'; // if (!tf.env().platform && tf.env().get('IS_BROWSER')) tf.env().setPlatform('browser', new PlatformBrowser); +// tf.setBackend('cpu'); + +// import {MathBackendCPU} from '@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js'; +// export {MathBackendCPU}; +// tf.registerBackend('cpu', () => new MathBackendCPU(), 1 /* priority */); diff --git a/src/ops/normalize.ts b/src/ops/normalize.ts index 189f42a..1d7d817 100644 --- a/src/ops/normalize.ts +++ b/src/ops/normalize.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; export function normalize(x: tf.Tensor4D, meanRgb: number[]): tf.Tensor4D { return tf.tidy(() => { diff --git a/src/ops/padToSquare.ts b/src/ops/padToSquare.ts index fffe323..aa1e1f6 100644 --- a/src/ops/padToSquare.ts +++ b/src/ops/padToSquare.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; /** * Pads the smaller dimension of an image tensor with zeros, such that width === height. diff --git a/src/ssdMobilenetv1/SsdMobilenetv1.ts b/src/ssdMobilenetv1/SsdMobilenetv1.ts index b148353..0b306b9 100644 --- a/src/ssdMobilenetv1/SsdMobilenetv1.ts +++ b/src/ssdMobilenetv1/SsdMobilenetv1.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { Rect } from '../classes'; import { FaceDetection } from '../classes/FaceDetection'; @@ -77,7 +77,7 @@ export class SsdMobilenetv1 extends NeuralNetwork { const iouThreshold = 0.5 const indices = nonMaxSuppression( boxes, - scoresData, + scoresData as number[], maxResults, iouThreshold, minConfidence @@ -100,7 +100,7 @@ export class SsdMobilenetv1 extends NeuralNetwork { Math.min(1.0, boxesData[idx][3]) ].map(val => val * padX) return new FaceDetection( - scoresData[idx], + scoresData[idx] as number, new Rect( left, top, diff --git a/src/ssdMobilenetv1/boxPredictionLayer.ts b/src/ssdMobilenetv1/boxPredictionLayer.ts index b1c5faa..1e11da5 100644 --- a/src/ssdMobilenetv1/boxPredictionLayer.ts +++ b/src/ssdMobilenetv1/boxPredictionLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { convLayer } from '../common'; import { BoxPredictionParams } from './types'; diff --git a/src/ssdMobilenetv1/extractParams.ts b/src/ssdMobilenetv1/extractParams.ts index d3b1533..37fbd6b 100644 --- a/src/ssdMobilenetv1/extractParams.ts +++ b/src/ssdMobilenetv1/extractParams.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory } from '../common'; import { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types'; diff --git a/src/ssdMobilenetv1/extractParamsFromWeigthMap.ts b/src/ssdMobilenetv1/extractParamsFromWeigthMap.ts index ba6b3c5..e48f7cd 100644 --- a/src/ssdMobilenetv1/extractParamsFromWeigthMap.ts +++ b/src/ssdMobilenetv1/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common'; import { isTensor3D } from '../utils'; diff --git a/src/ssdMobilenetv1/mobileNetV1.ts b/src/ssdMobilenetv1/mobileNetV1.ts index b82c6d2..42590aa 100644 --- a/src/ssdMobilenetv1/mobileNetV1.ts +++ b/src/ssdMobilenetv1/mobileNetV1.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { pointwiseConvLayer } from './pointwiseConvLayer'; import { MobileNetV1 } from './types'; diff --git a/src/ssdMobilenetv1/nonMaxSuppression.ts b/src/ssdMobilenetv1/nonMaxSuppression.ts index 379ca42..eb2e8c8 100644 --- a/src/ssdMobilenetv1/nonMaxSuppression.ts +++ b/src/ssdMobilenetv1/nonMaxSuppression.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs-core' +import * as tf from '@tensorflow/tfjs' export function nonMaxSuppression( boxes: tf.Tensor2D, diff --git a/src/ssdMobilenetv1/outputLayer.ts b/src/ssdMobilenetv1/outputLayer.ts index 3508d1e..a575e76 100644 --- a/src/ssdMobilenetv1/outputLayer.ts +++ b/src/ssdMobilenetv1/outputLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { OutputLayerParams } from './types'; diff --git a/src/ssdMobilenetv1/pointwiseConvLayer.ts b/src/ssdMobilenetv1/pointwiseConvLayer.ts index b5d39dd..39b4fd1 100644 --- a/src/ssdMobilenetv1/pointwiseConvLayer.ts +++ b/src/ssdMobilenetv1/pointwiseConvLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { PointwiseConvParams } from './types'; diff --git a/src/ssdMobilenetv1/predictionLayer.ts b/src/ssdMobilenetv1/predictionLayer.ts index 12a5bc1..a188cd1 100644 --- a/src/ssdMobilenetv1/predictionLayer.ts +++ b/src/ssdMobilenetv1/predictionLayer.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { boxPredictionLayer } from './boxPredictionLayer'; import { pointwiseConvLayer } from './pointwiseConvLayer'; diff --git a/src/ssdMobilenetv1/types.ts b/src/ssdMobilenetv1/types.ts index 957ad44..9446f1e 100644 --- a/src/ssdMobilenetv1/types.ts +++ b/src/ssdMobilenetv1/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from '../common'; diff --git a/src/tinyFaceDetector/TinyFaceDetector.ts b/src/tinyFaceDetector/TinyFaceDetector.ts index c453eb4..8fe7b5f 100644 --- a/src/tinyFaceDetector/TinyFaceDetector.ts +++ b/src/tinyFaceDetector/TinyFaceDetector.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FaceDetection, Point } from '../classes'; import { ParamMapping } from '../common'; diff --git a/src/tinyYolov2/TinyYolov2.ts b/src/tinyYolov2/TinyYolov2.ts index b739b27..bb27901 100644 --- a/src/tinyYolov2/TinyYolov2.ts +++ b/src/tinyYolov2/TinyYolov2.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { FaceDetection, Point } from '../classes'; import { ParamMapping } from '../common/types'; diff --git a/src/tinyYolov2/TinyYolov2Base.ts b/src/tinyYolov2/TinyYolov2Base.ts index 9dc38c6..cf7dc4f 100644 --- a/src/tinyYolov2/TinyYolov2Base.ts +++ b/src/tinyYolov2/TinyYolov2Base.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { BoundingBox } from '../classes/BoundingBox'; import { Dimensions } from '../classes/Dimensions'; diff --git a/src/tinyYolov2/convWithBatchNorm.ts b/src/tinyYolov2/convWithBatchNorm.ts index 3d24894..3af80ec 100644 --- a/src/tinyYolov2/convWithBatchNorm.ts +++ b/src/tinyYolov2/convWithBatchNorm.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { leaky } from './leaky'; import { ConvWithBatchNorm } from './types'; diff --git a/src/tinyYolov2/depthwiseSeparableConv.ts b/src/tinyYolov2/depthwiseSeparableConv.ts index 5e0f6ba..337da2d 100644 --- a/src/tinyYolov2/depthwiseSeparableConv.ts +++ b/src/tinyYolov2/depthwiseSeparableConv.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { SeparableConvParams } from '../common/types'; import { leaky } from './leaky'; diff --git a/src/tinyYolov2/extractParams.ts b/src/tinyYolov2/extractParams.ts index 1afc5cb..983430d 100644 --- a/src/tinyYolov2/extractParams.ts +++ b/src/tinyYolov2/extractParams.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { extractConvParamsFactory } from '../common'; import { extractSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory'; diff --git a/src/tinyYolov2/extractParamsFromWeigthMap.ts b/src/tinyYolov2/extractParamsFromWeigthMap.ts index b4e1a24..35f69c9 100644 --- a/src/tinyYolov2/extractParamsFromWeigthMap.ts +++ b/src/tinyYolov2/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from '../common'; import { disposeUnusedWeightTensors } from '../common/disposeUnusedWeightTensors'; diff --git a/src/tinyYolov2/leaky.ts b/src/tinyYolov2/leaky.ts index b7ac6da..80e6e99 100644 --- a/src/tinyYolov2/leaky.ts +++ b/src/tinyYolov2/leaky.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; export function leaky(x: tf.Tensor4D): tf.Tensor4D { return tf.tidy(() => { diff --git a/src/tinyYolov2/types.ts b/src/tinyYolov2/types.ts index d17a1d0..5e5ee76 100644 --- a/src/tinyYolov2/types.ts +++ b/src/tinyYolov2/types.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams } from '../common'; import { SeparableConvParams } from '../common/types'; diff --git a/src/utils/index.ts b/src/utils/index.ts index 1e48d78..b9a8ca2 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { Point } from '../classes'; import { Dimensions, IDimensions } from '../classes/Dimensions'; diff --git a/src/xception/TinyXception.ts b/src/xception/TinyXception.ts index 07cbc46..669b078 100644 --- a/src/xception/TinyXception.ts +++ b/src/xception/TinyXception.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { ConvParams, depthwiseSeparableConv } from '../common'; import { NetInput, TNetInput, toNetInput } from '../dom'; diff --git a/src/xception/extractParamsFromWeigthMap.ts b/src/xception/extractParamsFromWeigthMap.ts index 622071c..f00aff2 100644 --- a/src/xception/extractParamsFromWeigthMap.ts +++ b/src/xception/extractParamsFromWeigthMap.ts @@ -1,4 +1,4 @@ -import * as tf from '@tensorflow/tfjs'; +import * as tf from '@tensorflow/tfjs/dist/tf.es2017.js'; import { disposeUnusedWeightTensors, diff --git a/tsconfig.json b/tsconfig.json index a07a2d1..2a47203 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,41 +1,31 @@ { "compilerOptions": { - "lib": ["es2018", "dom"], - "module": "esnext", - "moduleResolution": "node", - "outDir": "build", + "module": "es2020", "target": "es2018", - "typeRoots": ["typings", "node_modules/@types"], + "moduleResolution": "node", + "lib": ["es2018", "dom"], + "typeRoots": [ + "typings", + "node_modules/@types" + ], + "outDir": "build", - "allowSyntheticDefaultImports": false, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "alwaysStrict": true, - "declaration": true, - "declarationMap": true, - "emitDecoratorMetadata": true, - "esModuleInterop": false, - "experimentalDecorators": true, - "importHelpers": true, - "incremental": false, - "listFiles": false, - "noFallthroughCasesInSwitch": false, - "noImplicitAny": false, - "noImplicitReturns": false, - "noImplicitThis": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "preserveConstEnums": true, - "pretty": true, "removeComments": false, - "resolveJsonModule": true, - "skipLibCheck": true, + "preserveConstEnums": true, + "emitDecoratorMetadata": false, + "experimentalDecorators": true, "sourceMap": true, - "strict": false, + "declaration": true, + "noImplicitAny": false, + "noImplicitReturns": true, + "noImplicitThis": true, + "noFallthroughCasesInSwitch": true, + "suppressImplicitAnyIndexErrors": true, "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true + "importHelpers": true, + "skipLibCheck": true, + "resolveJsonModule": true, }, "formatCodeOptions": { "indentSize": 2, "tabSize": 2 }, "include": ["src"], - "exclude": ["node_modules"] }