add typedocs and types

pull/91/head
Vladimir Mandic 2021-03-13 22:31:09 -05:00
parent 01990ad117
commit 6eb04b75e6
77 changed files with 11342 additions and 438567 deletions

View File

@ -38,6 +38,7 @@
"import/extensions": "off", "import/extensions": "off",
"import/no-absolute-path": "off", "import/no-absolute-path": "off",
"import/no-extraneous-dependencies": "off", "import/no-extraneous-dependencies": "off",
"import/no-named-as-default": "off",
"import/no-unresolved": "off", "import/no-unresolved": "off",
"import/prefer-default-export": "off", "import/prefer-default-export": "off",
"lines-between-class-members": "off", "lines-between-class-members": "off",

View File

@ -9,6 +9,12 @@ Repository: **<git+https://github.com/vladmandic/human.git>**
## Changelog ## Changelog
### **HEAD -> main** 2021/03/13 mandic00@live.com
### **origin/main** 2021/03/13 mandic00@live.com
### **1.1.2** 2021/03/12 mandic00@live.com ### **1.1.2** 2021/03/12 mandic00@live.com
- distance based on minkowski space and limited euclidean space - distance based on minkowski space and limited euclidean space

View File

@ -23,7 +23,6 @@
## WiP Items ## WiP Items
- face.tensor should return image in correct aspect ratio
- box sizing on mobile - box sizing on mobile
## Issues ## Issues

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

File diff suppressed because one or more lines are too long

97752
dist/human.esm.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

97758
dist/human.js vendored

File diff suppressed because one or more lines are too long

6
dist/human.js.map vendored

File diff suppressed because one or more lines are too long

25082
dist/human.node-gpu.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

25082
dist/human.node.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

75034
dist/tfjs.esm.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

413
package-lock.json generated
View File

@ -36,6 +36,7 @@
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"simple-git": "^2.36.2", "simple-git": "^2.36.2",
"tslib": "^2.1.0", "tslib": "^2.1.0",
"typedoc": "^0.20.30",
"typescript": "^4.2.3" "typescript": "^4.2.3"
}, },
"engines": { "engines": {
@ -928,6 +929,15 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true "dev": true
}, },
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true,
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/balanced-match": { "node_modules/balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -2112,6 +2122,27 @@
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true "dev": true
}, },
"node_modules/handlebars": {
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
"source-map": "^0.6.1",
"wordwrap": "^1.0.0"
},
"bin": {
"handlebars": "bin/handlebars"
},
"engines": {
"node": ">=0.4.7"
},
"optionalDependencies": {
"uglify-js": "^3.1.4"
}
},
"node_modules/has": { "node_modules/has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -2274,6 +2305,15 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true "dev": true
}, },
"node_modules/interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/is-arrayish": { "node_modules/is-arrayish": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@ -2596,6 +2636,24 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/lunr": {
"version": "2.3.9",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
"dev": true
},
"node_modules/marked": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz",
"integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==",
"dev": true,
"bin": {
"marked": "bin/marked"
},
"engines": {
"node": ">= 8.16.2"
}
},
"node_modules/merge2": { "node_modules/merge2": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@ -2732,6 +2790,12 @@
"ms": "^2.1.1" "ms": "^2.1.1"
} }
}, },
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"node_modules/node-fetch": { "node_modules/node-fetch": {
"version": "2.6.1", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
@ -2961,6 +3025,30 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"node_modules/onigasm": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
"dev": true,
"dependencies": {
"lru-cache": "^5.1.1"
}
},
"node_modules/onigasm/node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/onigasm/node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
},
"node_modules/optionator": { "node_modules/optionator": {
"version": "0.9.1", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@ -3281,6 +3369,18 @@
"node": ">=8.10.0" "node": ">=8.10.0"
} }
}, },
"node_modules/rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"dependencies": {
"resolve": "^1.1.6"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/regenerator-runtime": { "node_modules/regenerator-runtime": {
"version": "0.13.7", "version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
@ -3452,6 +3552,33 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/shelljs": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
"dev": true,
"dependencies": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
},
"bin": {
"shjs": "bin/shjs"
},
"engines": {
"node": ">=4"
}
},
"node_modules/shiki": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz",
"integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==",
"dev": true,
"dependencies": {
"onigasm": "^2.2.5",
"vscode-textmate": "^5.2.0"
}
},
"node_modules/signal-exit": { "node_modules/signal-exit": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@ -3846,6 +3973,88 @@
"url": "https://github.com/sponsors/sindresorhus" "url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/typedoc": {
"version": "0.20.30",
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.30.tgz",
"integrity": "sha512-A4L6JDShPFwZDt9qp7FBsEpW7C6rA5fRv6ywgBuxGxZnT2wuF5afbWzmrwqHR3Xw38V1H2L4v/VJ0S/llBwV6Q==",
"dev": true,
"dependencies": {
"colors": "^1.4.0",
"fs-extra": "^9.1.0",
"handlebars": "^4.7.7",
"lodash": "^4.17.21",
"lunr": "^2.3.9",
"marked": "^2.0.1",
"minimatch": "^3.0.0",
"progress": "^2.0.3",
"shelljs": "^0.8.4",
"shiki": "^0.9.2",
"typedoc-default-themes": "^0.12.8"
},
"bin": {
"typedoc": "bin/typedoc"
},
"engines": {
"node": ">= 10.8.0"
},
"peerDependencies": {
"typescript": "3.9.x || 4.0.x || 4.1.x || 4.2.x"
}
},
"node_modules/typedoc-default-themes": {
"version": "0.12.8",
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.8.tgz",
"integrity": "sha512-tyjyDTKy/JLnBSwvhoqd99VIjrP33SdOtwcMD32b+OqnrjZWe8HmZECbfBoacqoxjHd58gfeNw6wA7uvqWFa4w==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/typedoc/node_modules/colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true,
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/typedoc/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/typedoc/node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/typedoc/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/typescript": { "node_modules/typescript": {
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
@ -3859,6 +4068,19 @@
"node": ">=4.2.0" "node": ">=4.2.0"
} }
}, },
"node_modules/uglify-js": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.1.tgz",
"integrity": "sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw==",
"dev": true,
"optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/unbox-primitive": { "node_modules/unbox-primitive": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
@ -3951,6 +4173,12 @@
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
"dev": true "dev": true
}, },
"node_modules/vscode-textmate": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
"dev": true
},
"node_modules/vscode-uri": { "node_modules/vscode-uri": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
@ -4006,6 +4234,12 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
"node_modules/wrap-ansi": { "node_modules/wrap-ansi": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@ -4820,6 +5054,12 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true "dev": true
}, },
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"dev": true
},
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -5755,6 +5995,19 @@
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true "dev": true
}, },
"handlebars": {
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
"integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
"dev": true,
"requires": {
"minimist": "^1.2.5",
"neo-async": "^2.6.0",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
}
},
"has": { "has": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@ -5883,6 +6136,12 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true "dev": true
}, },
"interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true
},
"is-arrayish": { "is-arrayish": {
"version": "0.2.1", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@ -6121,6 +6380,18 @@
"yallist": "^4.0.0" "yallist": "^4.0.0"
} }
}, },
"lunr": {
"version": "2.3.9",
"resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
"integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
"dev": true
},
"marked": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz",
"integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==",
"dev": true
},
"merge2": { "merge2": {
"version": "1.4.1", "version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@ -6237,6 +6508,12 @@
} }
} }
}, },
"neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"node-fetch": { "node-fetch": {
"version": "2.6.1", "version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
@ -6421,6 +6698,32 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"onigasm": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
"integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
"dev": true,
"requires": {
"lru-cache": "^5.1.1"
},
"dependencies": {
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"requires": {
"yallist": "^3.0.2"
}
},
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
}
}
},
"optionator": { "optionator": {
"version": "0.9.1", "version": "0.9.1",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@ -6656,6 +6959,15 @@
"picomatch": "^2.2.1" "picomatch": "^2.2.1"
} }
}, },
"rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"requires": {
"resolve": "^1.1.6"
}
},
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.13.7", "version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
@ -6773,6 +7085,27 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true "dev": true
}, },
"shelljs": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
"dev": true,
"requires": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
}
},
"shiki": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.3.tgz",
"integrity": "sha512-NEjg1mVbAUrzRv2eIcUt3TG7X9svX7l3n3F5/3OdFq+/BxUdmBOeKGiH4icZJBLHy354Shnj6sfBTemea2e7XA==",
"dev": true,
"requires": {
"onigasm": "^2.2.5",
"vscode-textmate": "^5.2.0"
}
},
"signal-exit": { "signal-exit": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
@ -7095,12 +7428,80 @@
"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
"dev": true "dev": true
}, },
"typedoc": {
"version": "0.20.30",
"resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.30.tgz",
"integrity": "sha512-A4L6JDShPFwZDt9qp7FBsEpW7C6rA5fRv6ywgBuxGxZnT2wuF5afbWzmrwqHR3Xw38V1H2L4v/VJ0S/llBwV6Q==",
"dev": true,
"requires": {
"colors": "^1.4.0",
"fs-extra": "^9.1.0",
"handlebars": "^4.7.7",
"lodash": "^4.17.21",
"lunr": "^2.3.9",
"marked": "^2.0.1",
"minimatch": "^3.0.0",
"progress": "^2.0.3",
"shelljs": "^0.8.4",
"shiki": "^0.9.2",
"typedoc-default-themes": "^0.12.8"
},
"dependencies": {
"colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
"integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
"dev": true
},
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
}
}
},
"typedoc-default-themes": {
"version": "0.12.8",
"resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.8.tgz",
"integrity": "sha512-tyjyDTKy/JLnBSwvhoqd99VIjrP33SdOtwcMD32b+OqnrjZWe8HmZECbfBoacqoxjHd58gfeNw6wA7uvqWFa4w==",
"dev": true
},
"typescript": { "typescript": {
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
"integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
"dev": true "dev": true
}, },
"uglify-js": {
"version": "3.13.1",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.1.tgz",
"integrity": "sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw==",
"dev": true,
"optional": true
},
"unbox-primitive": { "unbox-primitive": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
@ -7187,6 +7588,12 @@
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==", "integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
"dev": true "dev": true
}, },
"vscode-textmate": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
"integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==",
"dev": true
},
"vscode-uri": { "vscode-uri": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
@ -7230,6 +7637,12 @@
"integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
"dev": true "dev": true
}, },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
"dev": true
},
"wrap-ansi": { "wrap-ansi": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",

View File

@ -6,7 +6,7 @@
"main": "dist/human.node.js", "main": "dist/human.node.js",
"module": "dist/human.esm.js", "module": "dist/human.esm.js",
"browser": "dist/human.esm.js", "browser": "dist/human.esm.js",
"types": "types/human.d.ts", "types": "types/src/human.d.ts",
"author": "Vladimir Mandic <mandic00@live.com>", "author": "Vladimir Mandic <mandic00@live.com>",
"bugs": { "bugs": {
"url": "https://github.com/vladmandic/human/issues" "url": "https://github.com/vladmandic/human/issues"
@ -23,7 +23,7 @@
"scripts": { "scripts": {
"start": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught --no-deprecation demo/node.js", "start": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught --no-deprecation demo/node.js",
"dev": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/serve.js", "dev": "node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/serve.js",
"build": "rimraf dist/* && rimraf types/* && node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/build.js && node server/changelog.js", "build": "rimraf dist/* types/* typedoc/* && node --trace-warnings --unhandled-rejections=strict --trace-uncaught server/build.js",
"lint": "eslint src server demo", "lint": "eslint src server demo",
"test": "npm run lint && npm run start" "test": "npm run lint && npm run start"
}, },
@ -71,6 +71,7 @@
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"simple-git": "^2.36.2", "simple-git": "^2.36.2",
"tslib": "^2.1.0", "tslib": "^2.1.0",
"typedoc": "^0.20.30",
"typescript": "^4.2.3" "typescript": "^4.2.3"
} }
} }

View File

@ -1,11 +1,14 @@
#!/usr/bin/env -S node --trace-warnings #!/usr/bin/env -S node --trace-warnings
const ts = require('typescript');
const log = require('@vladmandic/pilogger'); const log = require('@vladmandic/pilogger');
const esbuild = require('esbuild'); const esbuild = require('esbuild');
const ts = require('typescript'); const TypeDoc = require('typedoc');
const changelog = require('./changelog');
// keeps esbuild service instance cached // keeps esbuild service instance cached
let busy = false; let busy = false;
let td = null;
const banner = { js: ` const banner = { js: `
/* /*
Human library Human library
@ -172,7 +175,7 @@ async function getStats(json) {
} }
// rebuild typings // rebuild typings
function compile(entryPoint, options) { async function compile(entryPoint, options) {
log.info('Compile typings:', entryPoint); log.info('Compile typings:', entryPoint);
const program = ts.createProgram(entryPoint, options); const program = ts.createProgram(entryPoint, options);
const emit = program.emit(); const emit = program.emit();
@ -192,6 +195,18 @@ function compile(entryPoint, options) {
} }
} }
async function typedoc(entryPoint) {
log.info('Generate TypeDocs:', entryPoint);
if (!td) {
td = new TypeDoc.Application();
td.options.addReader(new TypeDoc.TSConfigReader());
td.bootstrap({ entryPoints: entryPoint });
}
const project = td.convert();
const result = project ? await td.generateDocs(project, 'typedoc') : null;
if (result) log.warn('TypeDoc:', result);
}
// rebuild on file change // rebuild on file change
async function build(f, msg, dev = false) { async function build(f, msg, dev = false) {
if (busy) { if (busy) {
@ -217,8 +232,12 @@ async function build(f, msg, dev = false) {
log.state(`Build for: ${targetGroupName} type: ${targetName}:`, stats); log.state(`Build for: ${targetGroupName} type: ${targetName}:`, stats);
} }
} }
// generate typings if (!dev) {
compile(targets.browserBundle.esm.entryPoints, tsconfig); // generate typings & typedoc only when run as explict build
await compile(targets.browserBundle.esm.entryPoints, tsconfig);
await changelog.update('../CHANGELOG.md');
await typedoc(targets.browserBundle.esm.entryPoints);
}
if (require.main === module) process.exit(0); if (require.main === module) process.exit(0);
} catch (err) { } catch (err) {
// catch errors and print where it occured // catch errors and print where it occured

View File

@ -45,15 +45,11 @@ async function update(f) {
const name = path.join(__dirname, f); const name = path.join(__dirname, f);
fs.writeFileSync(name, text); fs.writeFileSync(name, text);
logger.state('Change log updated:', name); logger.info('Update Change log:', [name]);
} }
exports.update = update; if (require.main === module) {
update('../CHANGELOG.md');
try { } else {
if (require.main === module) { exports.update = update;
update('../CHANGELOG.md');
}
} catch {
//
} }

View File

@ -32,7 +32,7 @@ const options = {
httpsPort: 10031, httpsPort: 10031,
insecureHTTPParser: false, insecureHTTPParser: false,
minElapsed: 2, minElapsed: 2,
monitor: ['package.json', 'config.js', 'demo', 'src'], monitor: ['package.json', 'config.ts', 'demo', 'src'],
}; };
// just some predefined mime types // just some predefined mime types

View File

@ -13,9 +13,9 @@ export class MediaPipeFaceMesh {
this.config = config; this.config = config;
} }
async estimateFaces(input, config) { async estimateFaces(input, config): Promise<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }[]> {
const predictions = await this.facePipeline.predict(input, config); const predictions = await this.facePipeline.predict(input, config);
const results: Array<{}> = []; const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];
for (const prediction of (predictions || [])) { for (const prediction of (predictions || [])) {
if (prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing if (prediction.isDisposedInternal) continue; // guard against disposed tensors on long running operations such as pause in middle of processing
const mesh = prediction.coords ? prediction.coords.arraySync() : []; const mesh = prediction.coords ? prediction.coords.arraySync() : [];

View File

@ -2,22 +2,22 @@ import config from '../config';
import { TRI468 as triangulation } from './blazeface/coords'; import { TRI468 as triangulation } from './blazeface/coords';
export const options = { export const options = {
color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel color: <string>'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel labelColor: <string>'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel
shadowColor: 'black', shadowColor: <string>'black',
font: 'small-caps 16px "Segoe UI"', font: <string>'small-caps 16px "Segoe UI"',
lineHeight: 20, lineHeight: <number>20,
lineWidth: 6, lineWidth: <number>6,
pointSize: 2, pointSize: <number>2,
roundRect: 28, roundRect: <number>28,
drawPoints: false, drawPoints: <Boolean>false,
drawLabels: true, drawLabels: <Boolean>true,
drawBoxes: true, drawBoxes: <Boolean>true,
drawPolygons: true, drawPolygons: <Boolean>true,
fillPolygons: false, fillPolygons: <Boolean>false,
useDepth: true, useDepth: <Boolean>true,
useCurves: false, useCurves: <Boolean>false,
bufferedOutput: false, bufferedOutput: <Boolean>false,
}; };
function point(ctx, x, y, z = null) { function point(ctx, x, y, z = null) {

View File

@ -24,6 +24,48 @@ const now = () => {
return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString()); return parseInt((Number(process.hrtime.bigint()) / 1000 / 1000).toString());
}; };
type Tensor = {};
type Model = {};
export type Result = {
face: Array<{
confidence: Number,
boxConfidence: Number,
faceConfidence: Number,
box: [Number, Number, Number, Number],
mesh: Array<[Number, Number, Number]>
meshRaw: Array<[Number, Number, Number]>
boxRaw: [Number, Number, Number, Number],
annotations: any,
age: Number,
gender: String,
genderConfidence: Number,
emotion: String,
embedding: any,
iris: Number,
angle: { roll: Number | null, yaw: Number | null, pitch: Number | null },
}>,
body: Array<{
id: Number,
part: String,
position: { x: Number, y: Number, z: Number },
score: Number,
presence: Number }>,
hand: Array<{
confidence: Number,
box: any,
landmarks: any,
annotations: any,
}>,
gesture: Array<{
part: String,
gesture: String,
}>,
performance: { any },
canvas: OffscreenCanvas | HTMLCanvasElement,
}
export type { default as Config } from '../config';
// helper function: perform deep merge of multiple objects so it allows full inheriance with overrides // helper function: perform deep merge of multiple objects so it allows full inheriance with overrides
function mergeDeep(...objects) { function mergeDeep(...objects) {
const isObject = (obj) => obj && typeof obj === 'object'; const isObject = (obj) => obj && typeof obj === 'object';
@ -39,25 +81,25 @@ function mergeDeep(...objects) {
}, {}); }, {});
} }
class Human { export class Human {
version: string; version: String;
config: typeof config.default; config: typeof config.default;
state: string; state: String;
image: { tensor: typeof tf.Tensor, canvas: OffscreenCanvas | HTMLCanvasElement }; image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
// classes // classes
tf: typeof tf; tf: typeof tf;
draw: typeof draw; draw: { options?: typeof draw.options, gesture: Function, face: Function, body: Function, hand: Function, canvas: Function, all: Function };
// models // models
models: { models: {
face, face: facemesh.MediaPipeFaceMesh | null,
posenet, posenet: posenet.PoseNet | null,
blazepose, blazepose: Model | null,
handpose, handpose: handpose.HandPose | null,
iris, iris: Model | null,
age, age: Model | null,
gender, gender: Model | null,
emotion, emotion: Model | null,
embedding, embedding: Model | null,
}; };
classes: { classes: {
facemesh: typeof facemesh; facemesh: typeof facemesh;
@ -67,13 +109,13 @@ class Human {
body: typeof posenet | typeof blazepose; body: typeof posenet | typeof blazepose;
hand: typeof handpose; hand: typeof handpose;
}; };
sysinfo: { platform: string, agent: string }; sysinfo: { platform: String, agent: String };
#package: any; #package: any;
#perf: any; #perf: any;
#numTensors: number; #numTensors: number;
#analyzeMemoryLeaks: boolean; #analyzeMemoryLeaks: Boolean;
#checkSanity: boolean; #checkSanity: Boolean;
#firstRun: boolean; #firstRun: Boolean;
// definition end // definition end
constructor(userConfig = {}) { constructor(userConfig = {}) {
@ -102,7 +144,7 @@ class Human {
}; };
// export access to image processing // export access to image processing
// @ts-ignore // @ts-ignore
this.image = (input: tf.Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas) => image.process(input, this.config); this.image = (input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas) => image.process(input, this.config);
// export raw access to underlying models // export raw access to underlying models
this.classes = { this.classes = {
facemesh, facemesh,
@ -122,6 +164,7 @@ class Human {
} }
// helper function: measure tensor leak // helper function: measure tensor leak
/** @hidden */
#analyze = (...msg) => { #analyze = (...msg) => {
if (!this.#analyzeMemoryLeaks) return; if (!this.#analyzeMemoryLeaks) return;
const current = this.tf.engine().state.numTensors; const current = this.tf.engine().state.numTensors;
@ -132,12 +175,11 @@ class Human {
} }
// quick sanity check on inputs // quick sanity check on inputs
#sanity = (input): null | string => { /** @hidden */
#sanity = (input): null | String => {
if (!this.#checkSanity) return null; if (!this.#checkSanity) return null;
if (!input) return 'input is not defined'; if (!input) return 'input is not defined';
if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) { if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';
return 'input must be a tensor';
}
try { try {
this.tf.getBackend(); this.tf.getBackend();
} catch { } catch {
@ -146,18 +188,18 @@ class Human {
return null; return null;
} }
simmilarity(embedding1: Array<number>, embedding2: Array<number>): number { simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number {
if (this.config.face.embedding.enabled) return embedding.simmilarity(embedding1, embedding2); if (this.config.face.embedding.enabled) return embedding.simmilarity(embedding1, embedding2);
return 0; return 0;
} }
enhance(input: typeof tf.Tensor): typeof tf.Tensor | null { enhance(input: Tensor): Tensor | null {
if (this.config.face.embedding.enabled) return embedding.enhance(input); if (this.config.face.embedding.enabled) return embedding.enhance(input);
return null; return null;
} }
// preload models, not explicitly required as it's done automatically on first use // preload models, not explicitly required as it's done automatically on first use
async load(userConfig = null) { async load(userConfig: Object = {}) {
this.state = 'load'; this.state = 'load';
const timeStamp = now(); const timeStamp = now();
if (userConfig) this.config = mergeDeep(this.config, userConfig); if (userConfig) this.config = mergeDeep(this.config, userConfig);
@ -215,6 +257,7 @@ class Human {
} }
// check if backend needs initialization if it changed // check if backend needs initialization if it changed
/** @hidden */
#checkBackend = async (force = false) => { #checkBackend = async (force = false) => {
if (this.config.backend && (this.config.backend !== '') && force || (this.tf.getBackend() !== this.config.backend)) { if (this.config.backend && (this.config.backend !== '') && force || (this.tf.getBackend() !== this.config.backend)) {
const timeStamp = now(); const timeStamp = now();
@ -267,7 +310,8 @@ class Human {
} }
} }
#calculateFaceAngle = (mesh): { roll: number | null, yaw: number | null, pitch: number | null } => { /** @hidden */
#calculateFaceAngle = (mesh): { roll: Number | null, yaw: Number | null, pitch: Number | null } => {
if (!mesh || mesh.length < 300) return { roll: null, yaw: null, pitch: null }; if (!mesh || mesh.length < 300) return { roll: null, yaw: null, pitch: null };
const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1); const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);
// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
@ -285,6 +329,7 @@ class Human {
return angle; return angle;
} }
/** @hidden */
#detectFace = async (input): Promise<any> => { #detectFace = async (input): Promise<any> => {
// run facemesh, includes blazeface and iris // run facemesh, includes blazeface and iris
// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor
@ -294,27 +339,29 @@ class Human {
let emotionRes; let emotionRes;
let embeddingRes; let embeddingRes;
const faceRes: Array<{ const faceRes: Array<{
confidence: number, confidence: Number,
boxConfidence: number, boxConfidence: Number,
faceConfidence: number, faceConfidence: Number,
box: [number, number, number, number], box: [Number, Number, Number, Number],
mesh: Array<[number, number, number]> mesh: Array<[Number, Number, Number]>
meshRaw: Array<[number, number, number]> meshRaw: Array<[Number, Number, Number]>
boxRaw: [number, number, number, number], boxRaw: [Number, Number, Number, Number],
annotations: any, annotations: any,
age: number, age: Number,
gender: string, gender: String,
genderConfidence: number, genderConfidence: Number,
emotion: string, emotion: String,
embedding: any, embedding: any,
iris: number, iris: Number,
angle: { roll: number | null, yaw: number | null, pitch: number | null }, angle: { roll: Number | null, yaw: Number | null, pitch: Number | null },
tensor: Tensor,
}> = []; }> = [];
this.state = 'run:face'; this.state = 'run:face';
timeStamp = now(); timeStamp = now();
const faces = await this.models.face?.estimateFaces(input, this.config); const faces = await this.models.face?.estimateFaces(input, this.config);
this.#perf.face = Math.trunc(now() - timeStamp); this.#perf.face = Math.trunc(now() - timeStamp);
if (!faces) return [];
for (const face of faces) { for (const face of faces) {
this.#analyze('Get Face'); this.#analyze('Get Face');
@ -418,45 +465,7 @@ class Human {
} }
// main detect function // main detect function
async detect(input, userConfig = {}): Promise<{ async detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig: Object = {}): Promise<Result | { error: String }> {
face: Array<{
confidence: number,
boxConfidence: number,
faceConfidence: number,
box: [number, number, number, number],
mesh: Array<[number, number, number]>
meshRaw: Array<[number, number, number]>
boxRaw: [number, number, number, number],
annotations: any,
age: number,
gender: string,
genderConfidence: number,
emotion: string,
embedding: any,
iris: number,
angle: { roll: number | null, yaw: number | null, pitch: number | null },
}>,
body: Array<{
id: number,
part: string,
position: { x: number, y: number, z: number },
score: number,
presence: number }>,
hand: Array<{
confidence: number,
box: any,
landmarks: any,
annotations: any,
}>,
gesture: Array<{
part: string,
gesture: string,
}>,
performance: { any },
canvas: OffscreenCanvas | HTMLCanvasElement
} | { error: string }> {
// end definition
// detection happens inside a promise // detection happens inside a promise
return new Promise(async (resolve) => { return new Promise(async (resolve) => {
this.state = 'config'; this.state = 'config';
@ -562,6 +571,7 @@ class Human {
}); });
} }
/** @hidden */
#warmupBitmap = async () => { #warmupBitmap = async () => {
const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob()); const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());
let blob; let blob;
@ -579,6 +589,7 @@ class Human {
return res; return res;
} }
/** @hidden */
#warmupCanvas = async () => new Promise((resolve) => { #warmupCanvas = async () => new Promise((resolve) => {
let src; let src;
let size = 0; let size = 0;
@ -611,6 +622,7 @@ class Human {
else resolve(null); else resolve(null);
}); });
/** @hidden */
#warmupNode = async () => { #warmupNode = async () => {
const atob = (str) => Buffer.from(str, 'base64'); const atob = (str) => Buffer.from(str, 'base64');
const img = this.config.warmup === 'face' ? atob(sample.face) : atob(sample.body); const img = this.config.warmup === 'face' ? atob(sample.face) : atob(sample.body);
@ -624,7 +636,7 @@ class Human {
return res; return res;
} }
async warmup(userConfig): Promise<{ face, body, hand, gesture, performance, canvas } | { error }> { async warmup(userConfig: Object = {}): Promise<Result | { error }> {
const t0 = now(); const t0 = now();
if (userConfig) this.config = mergeDeep(this.config, userConfig); if (userConfig) this.config = mergeDeep(this.config, userConfig);
const video = this.config.videoOptimized; const video = this.config.videoOptimized;

View File

@ -22,4 +22,19 @@
}, },
"formatCodeOptions": { "indentSize": 2, "tabSize": 2 }, "formatCodeOptions": { "indentSize": 2, "tabSize": 2 },
"include": ["src/*", "src/***/*", "demo/*"], "include": ["src/*", "src/***/*", "demo/*"],
"typedocOptions": {
"excludePrivate": true,
"excludeExternals": true,
"excludeProtected": true,
"excludeInternal": true,
"disableSources": true,
"gitRevision": "main",
"hideGenerator": "true",
"theme": "default",
"readme": "none",
"out": "typedoc",
"entryPoints": "src/human.ts",
"logLevel": "Error",
"logger": "none"
}
} }

2638
typedoc/assets/css/main.css Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

248
typedoc/assets/js/main.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

861
typedoc/classes/human.html Normal file

File diff suppressed because one or more lines are too long

473
typedoc/index.html Normal file

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
export declare class MediaPipeFaceMesh {
facePipeline: any;
config: any;
constructor(blazeFace: any, blazeMeshModel: any, irisModel: any, config: any);
estimateFaces(input: any, config: any): Promise<{}[]>;
}
export declare function load(config: any): Promise<MediaPipeFaceMesh>;

101
types/config.d.ts vendored Normal file
View File

@ -0,0 +1,101 @@
declare const _default: {
backend: string;
wasmPath: string;
debug: boolean;
async: boolean;
profile: boolean;
deallocate: boolean;
scoped: boolean;
videoOptimized: boolean;
warmup: string;
filter: {
enabled: boolean;
width: number;
height: number;
return: boolean;
brightness: number;
contrast: number;
sharpness: number;
blur: number;
saturation: number;
hue: number;
negative: boolean;
sepia: boolean;
vintage: boolean;
kodachrome: boolean;
technicolor: boolean;
polaroid: boolean;
pixelate: number;
};
gesture: {
enabled: boolean;
};
face: {
enabled: boolean;
detector: {
modelPath: string;
rotation: boolean;
maxFaces: number;
skipFrames: number;
skipInitial: boolean;
minConfidence: number;
iouThreshold: number;
scoreThreshold: number;
return: boolean;
};
mesh: {
enabled: boolean;
modelPath: string;
};
iris: {
enabled: boolean;
modelPath: string;
};
age: {
enabled: boolean;
modelPath: string;
skipFrames: number;
};
gender: {
enabled: boolean;
minConfidence: number;
modelPath: string;
skipFrames: number;
};
emotion: {
enabled: boolean;
minConfidence: number;
skipFrames: number;
modelPath: string;
};
embedding: {
enabled: boolean;
modelPath: string;
};
};
body: {
enabled: boolean;
modelPath: string;
maxDetections: number;
scoreThreshold: number;
nmsRadius: number;
};
hand: {
enabled: boolean;
rotation: boolean;
skipFrames: number;
skipInitial: boolean;
minConfidence: number;
iouThreshold: number;
scoreThreshold: number;
maxHands: number;
landmarks: boolean;
detector: {
modelPath: string;
};
skeleton: {
modelPath: string;
};
};
};
export default _default;

119
types/human.d.ts vendored
View File

@ -1,119 +0,0 @@
import * as tf from '../dist/tfjs.esm.js';
import * as facemesh from './blazeface/facemesh';
import * as age from './age/age';
import * as gender from './gender/gender';
import * as emotion from './emotion/emotion';
import * as posenet from './posenet/posenet';
import * as handpose from './handpose/handpose';
import * as blazepose from './blazepose/blazepose';
import * as config from '../config';
import * as draw from './draw';
declare class Human {
#private;
version: string;
config: typeof config.default;
state: string;
image: {
tensor: typeof tf.Tensor;
canvas: OffscreenCanvas | HTMLCanvasElement;
};
tf: typeof tf;
draw: typeof draw;
models: {
face: any;
posenet: any;
blazepose: any;
handpose: any;
iris: any;
age: any;
gender: any;
emotion: any;
embedding: any;
};
classes: {
facemesh: typeof facemesh;
age: typeof age;
gender: typeof gender;
emotion: typeof emotion;
body: typeof posenet | typeof blazepose;
hand: typeof handpose;
};
sysinfo: {
platform: string;
agent: string;
};
constructor(userConfig?: {});
profileData(): {
newBytes: any;
newTensors: any;
peakBytes: any;
numKernelOps: any;
timeKernelOps: any;
slowestKernelOps: any;
largestKernelOps: any;
} | {};
simmilarity(embedding1: Array<number>, embedding2: Array<number>): number;
enhance(input: typeof tf.Tensor): typeof tf.Tensor | null;
load(userConfig?: null): Promise<void>;
detect(input: any, userConfig?: {}): Promise<{
face: Array<{
confidence: number;
boxConfidence: number;
faceConfidence: number;
box: [number, number, number, number];
mesh: Array<[number, number, number]>;
meshRaw: Array<[number, number, number]>;
boxRaw: [number, number, number, number];
annotations: any;
age: number;
gender: string;
genderConfidence: number;
emotion: string;
embedding: any;
iris: number;
angle: {
roll: number | null;
yaw: number | null;
pitch: number | null;
};
}>;
body: Array<{
id: number;
part: string;
position: {
x: number;
y: number;
z: number;
};
score: number;
presence: number;
}>;
hand: Array<{
confidence: number;
box: any;
landmarks: any;
annotations: any;
}>;
gesture: Array<{
part: string;
gesture: string;
}>;
performance: {
any: any;
};
canvas: OffscreenCanvas | HTMLCanvasElement;
} | {
error: string;
}>;
warmup(userConfig: any): Promise<{
face: any;
body: any;
hand: any;
gesture: any;
performance: any;
canvas: any;
} | {
error: any;
}>;
}
export { Human as default };

17
types/src/blazeface/facemesh.d.ts vendored Normal file
View File

@ -0,0 +1,17 @@
export declare class MediaPipeFaceMesh {
facePipeline: any;
config: any;
constructor(blazeFace: any, blazeMeshModel: any, irisModel: any, config: any);
estimateFaces(input: any, config: any): Promise<{
confidence: any;
boxConfidence: any;
faceConfidence: any;
box: any;
mesh: any;
boxRaw: any;
meshRaw: any;
annotations: any;
image: any;
}[]>;
}
export declare function load(config: any): Promise<MediaPipeFaceMesh>;

View File

@ -7,14 +7,14 @@ export declare const options: {
lineWidth: number; lineWidth: number;
pointSize: number; pointSize: number;
roundRect: number; roundRect: number;
drawPoints: boolean; drawPoints: Boolean;
drawLabels: boolean; drawLabels: Boolean;
drawBoxes: boolean; drawBoxes: Boolean;
drawPolygons: boolean; drawPolygons: Boolean;
fillPolygons: boolean; fillPolygons: Boolean;
useDepth: boolean; useDepth: Boolean;
useCurves: boolean; useCurves: Boolean;
bufferedOutput: boolean; bufferedOutput: Boolean;
}; };
export declare function gesture(inCanvas: any, result: any): Promise<void>; export declare function gesture(inCanvas: any, result: any): Promise<void>;
export declare function face(inCanvas: any, result: any): Promise<void>; export declare function face(inCanvas: any, result: any): Promise<void>;

124
types/src/human.d.ts vendored Normal file
View File

@ -0,0 +1,124 @@
import * as tf from '../dist/tfjs.esm.js';
import * as facemesh from './blazeface/facemesh';
import * as age from './age/age';
import * as gender from './gender/gender';
import * as emotion from './emotion/emotion';
import * as posenet from './posenet/posenet';
import * as handpose from './handpose/handpose';
import * as blazepose from './blazepose/blazepose';
import * as config from '../config';
import * as draw from './draw';
declare type Tensor = {};
declare type Model = {};
export declare type Result = {
face: Array<{
confidence: Number;
boxConfidence: Number;
faceConfidence: Number;
box: [Number, Number, Number, Number];
mesh: Array<[Number, Number, Number]>;
meshRaw: Array<[Number, Number, Number]>;
boxRaw: [Number, Number, Number, Number];
annotations: any;
age: Number;
gender: String;
genderConfidence: Number;
emotion: String;
embedding: any;
iris: Number;
angle: {
roll: Number | null;
yaw: Number | null;
pitch: Number | null;
};
}>;
body: Array<{
id: Number;
part: String;
position: {
x: Number;
y: Number;
z: Number;
};
score: Number;
presence: Number;
}>;
hand: Array<{
confidence: Number;
box: any;
landmarks: any;
annotations: any;
}>;
gesture: Array<{
part: String;
gesture: String;
}>;
performance: {
any: any;
};
canvas: OffscreenCanvas | HTMLCanvasElement;
};
export type { default as Config } from '../config';
export declare class Human {
#private;
version: String;
config: typeof config.default;
state: String;
image: {
tensor: Tensor;
canvas: OffscreenCanvas | HTMLCanvasElement;
};
tf: typeof tf;
draw: {
options?: typeof draw.options;
gesture: Function;
face: Function;
body: Function;
hand: Function;
canvas: Function;
all: Function;
};
models: {
face: facemesh.MediaPipeFaceMesh | null;
posenet: posenet.PoseNet | null;
blazepose: Model | null;
handpose: handpose.HandPose | null;
iris: Model | null;
age: Model | null;
gender: Model | null;
emotion: Model | null;
embedding: Model | null;
};
classes: {
facemesh: typeof facemesh;
age: typeof age;
gender: typeof gender;
emotion: typeof emotion;
body: typeof posenet | typeof blazepose;
hand: typeof handpose;
};
sysinfo: {
platform: String;
agent: String;
};
constructor(userConfig?: {});
profileData(): {
newBytes: any;
newTensors: any;
peakBytes: any;
numKernelOps: any;
timeKernelOps: any;
slowestKernelOps: any;
largestKernelOps: any;
} | {};
simmilarity(embedding1: Array<Number>, embedding2: Array<Number>): Number;
enhance(input: Tensor): Tensor | null;
load(userConfig?: Object): Promise<void>;
detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig?: Object): Promise<Result | {
error: String;
}>;
warmup(userConfig?: Object): Promise<Result | {
error: any;
}>;
}
export { Human as default };

2
wiki

@ -1 +1 @@
Subproject commit 4c5d355a1d413c54f7f8ff2fa8bb39c535cc58b4 Subproject commit 17f65ba8169f07140d23ea7b31f9c22b13b83642