diff --git a/CHANGELOG.md b/CHANGELOG.md index 24895fc3..4918e24b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ ## Changelog -### **HEAD -> main** 2022/10/24 mandic00@live.com +### **HEAD -> main** 2022/10/28 mandic00@live.com +- add named exports - add draw label templates - reduce dev dependencies - tensor rank strong typechecks diff --git a/TODO.md b/TODO.md index beb592d7..ca9bc1dd 100644 --- a/TODO.md +++ b/TODO.md @@ -57,4 +57,4 @@ No support for running in **web workers** as Safari still does not support `Offs - Add [draw label templates](https://github.com/vladmandic/human/wiki/Draw) - Reduce build dependencies `Human` is now 30% smaller :) -- Add named export for improved bundler support +- Add named export for improved bundler support when using non-default imports diff --git a/package.json b/package.json index 3864bd99..b3633a18 100644 --- a/package.json +++ b/package.json @@ -83,15 +83,15 @@ "@tensorflow/tfjs-core": "^4.0.0", "@tensorflow/tfjs-node": "^4.0.0", "@tensorflow/tfjs-node-gpu": "^4.0.0", - "@types/node": "^18.11.7", + "@types/node": "^18.11.9", "@types/offscreencanvas": "^2019.7.0", - "@typescript-eslint/eslint-plugin": "^5.41.0", - "@typescript-eslint/parser": "^5.41.0", + "@typescript-eslint/eslint-plugin": "^5.42.0", + "@typescript-eslint/parser": "^5.42.0", "@vladmandic/build": "^0.7.14", "@vladmandic/pilogger": "^0.4.6", "@vladmandic/tfjs": "github:vladmandic/tfjs", - "canvas": "^2.10.1", - "esbuild": "^0.15.12", + "canvas": "^2.10.2", + "esbuild": "^0.15.13", "eslint": "8.26.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-html": "^7.1.0", @@ -100,8 +100,8 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.1.1", "rimraf": "^3.0.2", - "tslib": "^2.4.0", - "typedoc": "0.23.19", + "tslib": "^2.4.1", + "typedoc": "0.23.20", "typescript": "4.8.4" } } diff --git a/src/draw/body.ts b/src/draw/body.ts index 80c09785..be394c2d 100644 --- a/src/draw/body.ts +++ b/src/draw/body.ts @@ -8,7 +8,7 @@ import type { AnyCanvas, DrawOptions } from '../exports'; export function body(inCanvas: AnyCanvas, result: BodyResult[], drawOptions?: Partial) { const localOptions: DrawOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.lineJoin = 'round'; for (let i = 0; i < result.length; i++) { diff --git a/src/draw/draw.ts b/src/draw/draw.ts index adec3ebf..b6aaacfe 100644 --- a/src/draw/draw.ts +++ b/src/draw/draw.ts @@ -28,7 +28,7 @@ export { gesture } from './gesture'; export function person(inCanvas: AnyCanvas, result: PersonResult[], drawOptions?: Partial) { const localOptions: DrawOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.lineJoin = 'round'; ctx.font = localOptions.font; @@ -55,7 +55,7 @@ export function person(inCanvas: AnyCanvas, result: PersonResult[], drawOptions? /** draw processed canvas */ export function canvas(input: AnyCanvas | HTMLImageElement | HTMLVideoElement, output: AnyCanvas) { if (!input || !output) return; - const ctx = getCanvasContext(output); + const ctx = getCanvasContext(output) as CanvasRenderingContext2D; if (!ctx) return; ctx.drawImage(input, 0, 0); } diff --git a/src/draw/face.ts b/src/draw/face.ts index 47027390..71e72690 100644 --- a/src/draw/face.ts +++ b/src/draw/face.ts @@ -140,7 +140,7 @@ function drawFaceBoxes(f: FaceResult, ctx) { export function face(inCanvas: AnyCanvas, result: FaceResult[], drawOptions?: Partial) { localOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.font = localOptions.font; ctx.strokeStyle = localOptions.color; diff --git a/src/draw/gesture.ts b/src/draw/gesture.ts index 9d45d6ce..795aceae 100644 --- a/src/draw/gesture.ts +++ b/src/draw/gesture.ts @@ -9,7 +9,7 @@ export function gesture(inCanvas: AnyCanvas, result: GestureResult[], drawOption const localOptions: DrawOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; if (localOptions.drawGestures && (localOptions.gestureLabels?.length > 0)) { - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.font = localOptions.font; ctx.fillStyle = localOptions.color; diff --git a/src/draw/hand.ts b/src/draw/hand.ts index 8c18b7e8..4c878483 100644 --- a/src/draw/hand.ts +++ b/src/draw/hand.ts @@ -8,7 +8,7 @@ import type { AnyCanvas, DrawOptions, Point } from '../exports'; export function hand(inCanvas: AnyCanvas, result: HandResult[], drawOptions?: Partial) { const localOptions: DrawOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.lineJoin = 'round'; ctx.font = localOptions.font; diff --git a/src/draw/object.ts b/src/draw/object.ts index cbf2ef19..ffb5a1dd 100644 --- a/src/draw/object.ts +++ b/src/draw/object.ts @@ -8,7 +8,7 @@ import type { AnyCanvas, DrawOptions } from '../exports'; export function object(inCanvas: AnyCanvas, result: ObjectResult[], drawOptions?: Partial) { const localOptions: DrawOptions = mergeDeep(options, drawOptions); if (!result || !inCanvas) return; - const ctx = getCanvasContext(inCanvas); + const ctx = getCanvasContext(inCanvas) as CanvasRenderingContext2D; if (!ctx) return; ctx.lineJoin = 'round'; ctx.font = localOptions.font; diff --git a/src/tfjs/humangl.ts b/src/tfjs/humangl.ts index dfa86177..8d2a7880 100644 --- a/src/tfjs/humangl.ts +++ b/src/tfjs/humangl.ts @@ -62,7 +62,7 @@ export function register(instance: Human): void { return; } try { - config.gl = config.canvas.getContext('webgl2', config.webGLattr); + config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext; if (!config.gl) { log('humangl error: cannot get webgl context'); return; diff --git a/src/util/webcam.ts b/src/util/webcam.ts index 25b88d88..c39df7b1 100644 --- a/src/util/webcam.ts +++ b/src/util/webcam.ts @@ -118,7 +118,7 @@ export class WebCam { // eslint-disable-line @typescript-eslint/no-extraneous-cl } // set constraints to use - const requestedConstraints: DisplayMediaStreamConstraints = { + const requestedConstraints: MediaStreamConstraints = { audio: false, video: { facingMode: this.config.mode === 'front' ? 'user' : 'environment', diff --git a/src/warmup.ts b/src/warmup.ts index d63dc556..247038d6 100644 --- a/src/warmup.ts +++ b/src/warmup.ts @@ -60,7 +60,7 @@ async function warmupCanvas(instance: Human): Promise { log('Warmup: Canvas not found'); resolve(undefined); } else { - const ctx = canvas.getContext('2d'); + const ctx = canvas.getContext('2d') as CanvasRenderingContext2D; if (ctx) ctx.drawImage(img, 0, 0); // const data = ctx?.getImageData(0, 0, canvas.height, canvas.width); const tensor = await instance.image(canvas); @@ -80,6 +80,7 @@ async function warmupNode(instance: Human): Promise { else img = atob(sample.body); let res: Result; if (('node' in tf) && (tf.getBackend() === 'tensorflow')) { + // @ts-ignore const data: Tensor = tf['node'].decodeJpeg(img); // eslint-disable-line import/namespace const expanded: Tensor = tf.expandDims(data, 0); instance.tf.dispose(data); diff --git a/test/build.log b/test/build.log index 0076a1c9..1bcf00e3 100644 --- a/test/build.log +++ b/test/build.log @@ -1,40 +1,40 @@ -2022-10-28 09:26:00 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} -2022-10-28 09:26:00 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} -2022-10-28 09:26:00 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-10-28 09:26:00 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.12","typescript":"4.8.4","typedoc":"0.23.19","eslint":"8.26.0"} -2022-10-28 09:26:00 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-10-28 09:26:00 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} -2022-10-28 09:26:00 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":79,"inputBytes":672529,"outputBytes":316303} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} -2022-10-28 09:26:00 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":79,"inputBytes":672533,"outputBytes":316307} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} -2022-10-28 09:26:00 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":79,"inputBytes":673481,"outputBytes":316418} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} -2022-10-28 09:26:00 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":79,"inputBytes":672275,"outputBytes":314908} -2022-10-28 09:26:00 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} -2022-10-28 09:26:00 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":79,"inputBytes":1816505,"outputBytes":1456466} -2022-10-28 09:26:01 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":79,"inputBytes":1816505,"outputBytes":1913830} -2022-10-28 09:26:04 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} -2022-10-28 09:26:06 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} -2022-10-28 09:26:06 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5936,"outputBytes":2867} -2022-10-28 09:26:06 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17134,"outputBytes":9181} -2022-10-28 09:26:14 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":116,"errors":0,"warnings":0} -2022-10-28 09:26:15 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-10-28 09:26:15 STATE: Copy: {"input":"src/tfjs","output":"dist/tfjs.esm.d.ts"} -2022-10-28 09:26:15 INFO:  Done... -2022-10-28 09:26:15 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} -2022-10-28 09:26:15 STATE: Filter: {"input":"types/human.d.ts"} -2022-10-28 09:26:15 STATE: Link: {"input":"types/human.d.ts"} -2022-10-28 09:26:15 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} -2022-10-28 09:26:15 STATE: Models {"folder":"./models","models":12} -2022-10-28 09:26:15 STATE: Models {"folder":"../human-models/models","models":43} -2022-10-28 09:26:15 STATE: Models {"folder":"../blazepose/model/","models":4} -2022-10-28 09:26:15 STATE: Models {"folder":"../anti-spoofing/model","models":1} -2022-10-28 09:26:15 STATE: Models {"folder":"../efficientpose/models","models":3} -2022-10-28 09:26:15 STATE: Models {"folder":"../insightface/models","models":5} -2022-10-28 09:26:15 STATE: Models {"folder":"../movenet/models","models":3} -2022-10-28 09:26:15 STATE: Models {"folder":"../nanodet/models","models":4} -2022-10-28 09:26:16 STATE: Models: {"count":58,"totalSize":386543911} -2022-10-28 09:26:16 INFO:  Human Build complete... {"logFile":"test/build.log"} +2022-11-04 13:19:02 DATA:  Build {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-04 13:19:02 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.0"} +2022-11-04 13:19:02 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2022-11-04 13:19:02 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.13","typescript":"4.8.4","typedoc":"0.23.20","eslint":"8.26.0"} +2022-11-04 13:19:02 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2022-11-04 13:19:02 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":79,"inputBytes":672790,"outputBytes":316303} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":79,"inputBytes":672794,"outputBytes":316307} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":79,"inputBytes":673742,"outputBytes":316418} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":79,"inputBytes":672536,"outputBytes":314908} +2022-11-04 13:19:02 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1144900} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":79,"inputBytes":1816766,"outputBytes":1456466} +2022-11-04 13:19:02 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":79,"inputBytes":1816766,"outputBytes":1913830} +2022-11-04 13:19:06 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} +2022-11-04 13:19:08 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":76,"generated":true} +2022-11-04 13:19:08 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":5936,"outputBytes":2867} +2022-11-04 13:19:08 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17134,"outputBytes":9181} +2022-11-04 13:19:16 STATE: Lint: {"locations":["*.json","src/**/*.ts","test/**/*.js","demo/**/*.js"],"files":116,"errors":0,"warnings":0} +2022-11-04 13:19:16 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2022-11-04 13:19:16 STATE: Copy: {"input":"src/tfjs","output":"dist/tfjs.esm.d.ts"} +2022-11-04 13:19:16 INFO:  Done... +2022-11-04 13:19:17 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":195} +2022-11-04 13:19:17 STATE: Filter: {"input":"types/human.d.ts"} +2022-11-04 13:19:17 STATE: Link: {"input":"types/human.d.ts"} +2022-11-04 13:19:17 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} +2022-11-04 13:19:17 STATE: Models {"folder":"./models","models":12} +2022-11-04 13:19:17 STATE: Models {"folder":"../human-models/models","models":43} +2022-11-04 13:19:17 STATE: Models {"folder":"../blazepose/model/","models":4} +2022-11-04 13:19:17 STATE: Models {"folder":"../anti-spoofing/model","models":1} +2022-11-04 13:19:17 STATE: Models {"folder":"../efficientpose/models","models":3} +2022-11-04 13:19:17 STATE: Models {"folder":"../insightface/models","models":5} +2022-11-04 13:19:17 STATE: Models {"folder":"../movenet/models","models":3} +2022-11-04 13:19:17 STATE: Models {"folder":"../nanodet/models","models":4} +2022-11-04 13:19:18 STATE: Models: {"count":58,"totalSize":386543911} +2022-11-04 13:19:18 INFO:  Human Build complete... {"logFile":"test/build.log"}