mirror of https://github.com/vladmandic/human
add typedocs and types
parent
01990ad117
commit
6eb04b75e6
|
@ -38,6 +38,7 @@
|
|||
"import/extensions": "off",
|
||||
"import/no-absolute-path": "off",
|
||||
"import/no-extraneous-dependencies": "off",
|
||||
"import/no-named-as-default": "off",
|
||||
"import/no-unresolved": "off",
|
||||
"import/prefer-default-export": "off",
|
||||
"lines-between-class-members": "off",
|
||||
|
|
|
@ -9,6 +9,12 @@ Repository: **<git+https://github.com/vladmandic/human.git>**
|
|||
|
||||
## 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
|
||||
|
||||
- distance based on minkowski space and limited euclidean space
|
||||
|
|
1
TODO.md
1
TODO.md
|
@ -23,7 +23,6 @@
|
|||
|
||||
## WiP Items
|
||||
|
||||
- face.tensor should return image in correct aspect ratio
|
||||
- box sizing on mobile
|
||||
|
||||
## 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
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
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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -36,6 +36,7 @@
|
|||
"rimraf": "^3.0.2",
|
||||
"simple-git": "^2.36.2",
|
||||
"tslib": "^2.1.0",
|
||||
"typedoc": "^0.20.30",
|
||||
"typescript": "^4.2.3"
|
||||
},
|
||||
"engines": {
|
||||
|
@ -928,6 +929,15 @@
|
|||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
|
@ -2112,6 +2122,27 @@
|
|||
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
||||
"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": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
|
@ -2274,6 +2305,15 @@
|
|||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||
"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": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||
|
@ -2596,6 +2636,24 @@
|
|||
"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": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
|
||||
|
@ -2732,6 +2790,12 @@
|
|||
"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": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||
|
@ -2961,6 +3025,30 @@
|
|||
"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": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||
|
@ -3281,6 +3369,18 @@
|
|||
"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": {
|
||||
"version": "0.13.7",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||
|
@ -3452,6 +3552,33 @@
|
|||
"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": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
|
||||
|
@ -3846,6 +3973,88 @@
|
|||
"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": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
||||
|
@ -3859,6 +4068,19 @@
|
|||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
||||
|
@ -3951,6 +4173,12 @@
|
|||
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
||||
"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": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
|
||||
|
@ -4006,6 +4234,12 @@
|
|||
"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": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
|
@ -4820,6 +5054,12 @@
|
|||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
|
@ -5755,6 +5995,19 @@
|
|||
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
|
||||
"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": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
|
@ -5883,6 +6136,12 @@
|
|||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||
"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": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||
|
@ -6121,6 +6380,18 @@
|
|||
"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": {
|
||||
"version": "1.4.1",
|
||||
"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": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||
|
@ -6421,6 +6698,32 @@
|
|||
"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": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||
|
@ -6656,6 +6959,15 @@
|
|||
"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": {
|
||||
"version": "0.13.7",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
|
||||
|
@ -6773,6 +7085,27 @@
|
|||
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
||||
"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": {
|
||||
"version": "3.0.3",
|
||||
"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==",
|
||||
"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": {
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
|
||||
"integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
|
||||
"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": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
|
||||
|
@ -7187,6 +7588,12 @@
|
|||
"integrity": "sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA==",
|
||||
"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": {
|
||||
"version": "2.1.2",
|
||||
"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==",
|
||||
"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": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"main": "dist/human.node.js",
|
||||
"module": "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>",
|
||||
"bugs": {
|
||||
"url": "https://github.com/vladmandic/human/issues"
|
||||
|
@ -23,7 +23,7 @@
|
|||
"scripts": {
|
||||
"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",
|
||||
"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",
|
||||
"test": "npm run lint && npm run start"
|
||||
},
|
||||
|
@ -71,6 +71,7 @@
|
|||
"rimraf": "^3.0.2",
|
||||
"simple-git": "^2.36.2",
|
||||
"tslib": "^2.1.0",
|
||||
"typedoc": "^0.20.30",
|
||||
"typescript": "^4.2.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
#!/usr/bin/env -S node --trace-warnings
|
||||
|
||||
const ts = require('typescript');
|
||||
const log = require('@vladmandic/pilogger');
|
||||
const esbuild = require('esbuild');
|
||||
const ts = require('typescript');
|
||||
const TypeDoc = require('typedoc');
|
||||
const changelog = require('./changelog');
|
||||
|
||||
// keeps esbuild service instance cached
|
||||
let busy = false;
|
||||
let td = null;
|
||||
const banner = { js: `
|
||||
/*
|
||||
Human library
|
||||
|
@ -172,7 +175,7 @@ async function getStats(json) {
|
|||
}
|
||||
|
||||
// rebuild typings
|
||||
function compile(entryPoint, options) {
|
||||
async function compile(entryPoint, options) {
|
||||
log.info('Compile typings:', entryPoint);
|
||||
const program = ts.createProgram(entryPoint, options);
|
||||
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
|
||||
async function build(f, msg, dev = false) {
|
||||
if (busy) {
|
||||
|
@ -217,8 +232,12 @@ async function build(f, msg, dev = false) {
|
|||
log.state(`Build for: ${targetGroupName} type: ${targetName}:`, stats);
|
||||
}
|
||||
}
|
||||
// generate typings
|
||||
compile(targets.browserBundle.esm.entryPoints, tsconfig);
|
||||
if (!dev) {
|
||||
// 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);
|
||||
} catch (err) {
|
||||
// catch errors and print where it occured
|
||||
|
|
|
@ -45,15 +45,11 @@ async function update(f) {
|
|||
|
||||
const name = path.join(__dirname, f);
|
||||
fs.writeFileSync(name, text);
|
||||
logger.state('Change log updated:', name);
|
||||
logger.info('Update Change log:', [name]);
|
||||
}
|
||||
|
||||
exports.update = update;
|
||||
|
||||
try {
|
||||
if (require.main === module) {
|
||||
if (require.main === module) {
|
||||
update('../CHANGELOG.md');
|
||||
}
|
||||
} catch {
|
||||
//
|
||||
} else {
|
||||
exports.update = update;
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ const options = {
|
|||
httpsPort: 10031,
|
||||
insecureHTTPParser: false,
|
||||
minElapsed: 2,
|
||||
monitor: ['package.json', 'config.js', 'demo', 'src'],
|
||||
monitor: ['package.json', 'config.ts', 'demo', 'src'],
|
||||
};
|
||||
|
||||
// just some predefined mime types
|
||||
|
|
|
@ -13,9 +13,9 @@ export class MediaPipeFaceMesh {
|
|||
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 results: Array<{}> = [];
|
||||
const results: Array<{ confidence, boxConfidence, faceConfidence, box, mesh, boxRaw, meshRaw, annotations, image }> = [];
|
||||
for (const prediction of (predictions || [])) {
|
||||
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() : [];
|
||||
|
|
32
src/draw.ts
32
src/draw.ts
|
@ -2,22 +2,22 @@ import config from '../config';
|
|||
import { TRI468 as triangulation } from './blazeface/coords';
|
||||
|
||||
export const options = {
|
||||
color: 'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
||||
labelColor: 'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel
|
||||
shadowColor: 'black',
|
||||
font: 'small-caps 16px "Segoe UI"',
|
||||
lineHeight: 20,
|
||||
lineWidth: 6,
|
||||
pointSize: 2,
|
||||
roundRect: 28,
|
||||
drawPoints: false,
|
||||
drawLabels: true,
|
||||
drawBoxes: true,
|
||||
drawPolygons: true,
|
||||
fillPolygons: false,
|
||||
useDepth: true,
|
||||
useCurves: false,
|
||||
bufferedOutput: false,
|
||||
color: <string>'rgba(173, 216, 230, 0.3)', // 'lightblue' with light alpha channel
|
||||
labelColor: <string>'rgba(173, 216, 230, 1)', // 'lightblue' with dark alpha channel
|
||||
shadowColor: <string>'black',
|
||||
font: <string>'small-caps 16px "Segoe UI"',
|
||||
lineHeight: <number>20,
|
||||
lineWidth: <number>6,
|
||||
pointSize: <number>2,
|
||||
roundRect: <number>28,
|
||||
drawPoints: <Boolean>false,
|
||||
drawLabels: <Boolean>true,
|
||||
drawBoxes: <Boolean>true,
|
||||
drawPolygons: <Boolean>true,
|
||||
fillPolygons: <Boolean>false,
|
||||
useDepth: <Boolean>true,
|
||||
useCurves: <Boolean>false,
|
||||
bufferedOutput: <Boolean>false,
|
||||
};
|
||||
|
||||
function point(ctx, x, y, z = null) {
|
||||
|
|
172
src/human.ts
172
src/human.ts
|
@ -24,6 +24,48 @@ const now = () => {
|
|||
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
|
||||
function mergeDeep(...objects) {
|
||||
const isObject = (obj) => obj && typeof obj === 'object';
|
||||
|
@ -39,25 +81,25 @@ function mergeDeep(...objects) {
|
|||
}, {});
|
||||
}
|
||||
|
||||
class Human {
|
||||
version: string;
|
||||
export class Human {
|
||||
version: String;
|
||||
config: typeof config.default;
|
||||
state: string;
|
||||
image: { tensor: typeof tf.Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
||||
state: String;
|
||||
image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement };
|
||||
// classes
|
||||
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: {
|
||||
face,
|
||||
posenet,
|
||||
blazepose,
|
||||
handpose,
|
||||
iris,
|
||||
age,
|
||||
gender,
|
||||
emotion,
|
||||
embedding,
|
||||
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;
|
||||
|
@ -67,13 +109,13 @@ class Human {
|
|||
body: typeof posenet | typeof blazepose;
|
||||
hand: typeof handpose;
|
||||
};
|
||||
sysinfo: { platform: string, agent: string };
|
||||
sysinfo: { platform: String, agent: String };
|
||||
#package: any;
|
||||
#perf: any;
|
||||
#numTensors: number;
|
||||
#analyzeMemoryLeaks: boolean;
|
||||
#checkSanity: boolean;
|
||||
#firstRun: boolean;
|
||||
#analyzeMemoryLeaks: Boolean;
|
||||
#checkSanity: Boolean;
|
||||
#firstRun: Boolean;
|
||||
// definition end
|
||||
|
||||
constructor(userConfig = {}) {
|
||||
|
@ -102,7 +144,7 @@ class Human {
|
|||
};
|
||||
// export access to image processing
|
||||
// @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
|
||||
this.classes = {
|
||||
facemesh,
|
||||
|
@ -122,6 +164,7 @@ class Human {
|
|||
}
|
||||
|
||||
// helper function: measure tensor leak
|
||||
/** @hidden */
|
||||
#analyze = (...msg) => {
|
||||
if (!this.#analyzeMemoryLeaks) return;
|
||||
const current = this.tf.engine().state.numTensors;
|
||||
|
@ -132,12 +175,11 @@ class Human {
|
|||
}
|
||||
|
||||
// quick sanity check on inputs
|
||||
#sanity = (input): null | string => {
|
||||
/** @hidden */
|
||||
#sanity = (input): null | String => {
|
||||
if (!this.#checkSanity) return null;
|
||||
if (!input) return 'input is not defined';
|
||||
if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) {
|
||||
return 'input must be a tensor';
|
||||
}
|
||||
if (this.tf.ENV.flags.IS_NODE && !(input instanceof tf.Tensor)) return 'input must be a tensor';
|
||||
try {
|
||||
this.tf.getBackend();
|
||||
} catch {
|
||||
|
@ -146,18 +188,18 @@ class Human {
|
|||
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);
|
||||
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);
|
||||
return null;
|
||||
}
|
||||
|
||||
// preload models, not explicitly required as it's done automatically on first use
|
||||
async load(userConfig = null) {
|
||||
async load(userConfig: Object = {}) {
|
||||
this.state = 'load';
|
||||
const timeStamp = now();
|
||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||
|
@ -215,6 +257,7 @@ class Human {
|
|||
}
|
||||
|
||||
// check if backend needs initialization if it changed
|
||||
/** @hidden */
|
||||
#checkBackend = async (force = false) => {
|
||||
if (this.config.backend && (this.config.backend !== '') && force || (this.tf.getBackend() !== this.config.backend)) {
|
||||
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 };
|
||||
const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1);
|
||||
// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
|
@ -285,6 +329,7 @@ class Human {
|
|||
return angle;
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
#detectFace = async (input): Promise<any> => {
|
||||
// run facemesh, includes blazeface and iris
|
||||
// eslint-disable-next-line no-async-promise-executor
|
||||
|
@ -294,27 +339,29 @@ class Human {
|
|||
let emotionRes;
|
||||
let embeddingRes;
|
||||
const faceRes: 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],
|
||||
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,
|
||||
age: Number,
|
||||
gender: String,
|
||||
genderConfidence: Number,
|
||||
emotion: String,
|
||||
embedding: any,
|
||||
iris: number,
|
||||
angle: { roll: number | null, yaw: number | null, pitch: number | null },
|
||||
iris: Number,
|
||||
angle: { roll: Number | null, yaw: Number | null, pitch: Number | null },
|
||||
tensor: Tensor,
|
||||
}> = [];
|
||||
|
||||
this.state = 'run:face';
|
||||
timeStamp = now();
|
||||
const faces = await this.models.face?.estimateFaces(input, this.config);
|
||||
this.#perf.face = Math.trunc(now() - timeStamp);
|
||||
if (!faces) return [];
|
||||
for (const face of faces) {
|
||||
this.#analyze('Get Face');
|
||||
|
||||
|
@ -418,45 +465,7 @@ class Human {
|
|||
}
|
||||
|
||||
// main detect function
|
||||
async detect(input, 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 },
|
||||
canvas: OffscreenCanvas | HTMLCanvasElement
|
||||
} | { error: string }> {
|
||||
// end definition
|
||||
|
||||
async detect(input: Tensor | ImageData | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas, userConfig: Object = {}): Promise<Result | { error: String }> {
|
||||
// detection happens inside a promise
|
||||
return new Promise(async (resolve) => {
|
||||
this.state = 'config';
|
||||
|
@ -562,6 +571,7 @@ class Human {
|
|||
});
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
#warmupBitmap = async () => {
|
||||
const b64toBlob = (base64, type = 'application/octet-stream') => fetch(`data:${type};base64,${base64}`).then((res) => res.blob());
|
||||
let blob;
|
||||
|
@ -579,6 +589,7 @@ class Human {
|
|||
return res;
|
||||
}
|
||||
|
||||
/** @hidden */
|
||||
#warmupCanvas = async () => new Promise((resolve) => {
|
||||
let src;
|
||||
let size = 0;
|
||||
|
@ -611,6 +622,7 @@ class Human {
|
|||
else resolve(null);
|
||||
});
|
||||
|
||||
/** @hidden */
|
||||
#warmupNode = async () => {
|
||||
const atob = (str) => Buffer.from(str, 'base64');
|
||||
const img = this.config.warmup === 'face' ? atob(sample.face) : atob(sample.body);
|
||||
|
@ -624,7 +636,7 @@ class Human {
|
|||
return res;
|
||||
}
|
||||
|
||||
async warmup(userConfig): Promise<{ face, body, hand, gesture, performance, canvas } | { error }> {
|
||||
async warmup(userConfig: Object = {}): Promise<Result | { error }> {
|
||||
const t0 = now();
|
||||
if (userConfig) this.config = mergeDeep(this.config, userConfig);
|
||||
const video = this.config.videoOptimized;
|
||||
|
|
|
@ -22,4 +22,19 @@
|
|||
},
|
||||
"formatCodeOptions": { "indentSize": 2, "tabSize": 2 },
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
|
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 |
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
|
@ -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>;
|
|
@ -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;
|
|
@ -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 };
|
|
@ -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>;
|
|
@ -7,14 +7,14 @@ export declare const options: {
|
|||
lineWidth: number;
|
||||
pointSize: number;
|
||||
roundRect: number;
|
||||
drawPoints: boolean;
|
||||
drawLabels: boolean;
|
||||
drawBoxes: boolean;
|
||||
drawPolygons: boolean;
|
||||
fillPolygons: boolean;
|
||||
useDepth: boolean;
|
||||
useCurves: boolean;
|
||||
bufferedOutput: boolean;
|
||||
drawPoints: Boolean;
|
||||
drawLabels: Boolean;
|
||||
drawBoxes: Boolean;
|
||||
drawPolygons: Boolean;
|
||||
fillPolygons: Boolean;
|
||||
useDepth: Boolean;
|
||||
useCurves: Boolean;
|
||||
bufferedOutput: Boolean;
|
||||
};
|
||||
export declare function gesture(inCanvas: any, result: any): Promise<void>;
|
||||
export declare function face(inCanvas: any, result: any): Promise<void>;
|
|
@ -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
2
wiki
|
@ -1 +1 @@
|
|||
Subproject commit 4c5d355a1d413c54f7f8ff2fa8bb39c535cc58b4
|
||||
Subproject commit 17f65ba8169f07140d23ea7b31f9c22b13b83642
|
Loading…
Reference in New Issue