From 714d2b91875575f27616e525be81473dfaf3abe4 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 17 Mar 2021 20:16:40 -0400 Subject: [PATCH] enforce types --- .eslintrc.json | 3 +- CHANGELOG.md | 1 + src/config.ts | 152 ++++++++++++++++++++--------------------- src/human.ts | 58 ++++++++-------- src/nanodet/nanodet.ts | 2 +- src/profile.ts | 2 +- src/result.ts | 70 +++++++++---------- src/tfjs/backend.ts | 2 +- 8 files changed, 144 insertions(+), 146 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 8fbf824a..8d1b0f33 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -27,8 +27,8 @@ "ignorePatterns": [ "dist", "assets", "media", "models", "node_modules" ], "rules": { "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/ban-types": "off", "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/ban-types": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-var-requires": "off", "camelcase": "off", @@ -36,7 +36,6 @@ "func-names": "off", "guard-for-in": "off", "import/extensions": "off", - "import/no-absolute-path": "off", "import/no-extraneous-dependencies": "off", "import/no-named-as-default": "off", "import/no-unresolved": "off", diff --git a/CHANGELOG.md b/CHANGELOG.md index ee999531..4091b303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Repository: **** ### **HEAD -> main** 2021/03/17 mandic00@live.com +- switch to single jumbo dts - type definitions ### **1.1.9** 2021/03/17 mandic00@live.com diff --git a/src/config.ts b/src/config.ts index cc276ef7..205633c6 100644 --- a/src/config.ts +++ b/src/config.ts @@ -7,111 +7,111 @@ * Contains all configurable parameters */ export interface Config { - backend: String, - wasmPath: String, - debug: Boolean, - async: Boolean, - profile: Boolean, - deallocate: Boolean, - scoped: Boolean, - videoOptimized: Boolean, - warmup: String, + 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, + 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, + enabled: boolean, }, face: { - enabled: Boolean, + enabled: boolean, detector: { - modelPath: String, - rotation: Boolean, - maxFaces: Number, - skipFrames: Number, - skipInitial: Boolean, - minConfidence: Number, - iouThreshold: Number, - scoreThreshold: Number, - return: Boolean, + modelPath: string, + rotation: boolean, + maxFaces: number, + skipFrames: number, + skipInitial: boolean, + minConfidence: number, + iouThreshold: number, + scoreThreshold: number, + return: boolean, }, mesh: { - enabled: Boolean, - modelPath: String, + enabled: boolean, + modelPath: string, }, iris: { - enabled: Boolean, - modelPath: String, + enabled: boolean, + modelPath: string, }, age: { - enabled: Boolean, - modelPath: String, - skipFrames: Number, + enabled: boolean, + modelPath: string, + skipFrames: number, }, gender: { - enabled: Boolean, - minConfidence: Number, - modelPath: String, - skipFrames: Number, + enabled: boolean, + minConfidence: number, + modelPath: string, + skipFrames: number, }, emotion: { - enabled: Boolean, - minConfidence: Number, - skipFrames: Number, - modelPath: String, + enabled: boolean, + minConfidence: number, + skipFrames: number, + modelPath: string, }, embedding: { - enabled: Boolean, - modelPath: String, + enabled: boolean, + modelPath: string, }, }, body: { - enabled: Boolean, - modelPath: String, - maxDetections: Number, - scoreThreshold: Number, - nmsRadius: Number, + 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, + enabled: boolean, + rotation: boolean, + skipFrames: number, + skipInitial: boolean, + minConfidence: number, + iouThreshold: number, + scoreThreshold: number, + maxHands: number, + landmarks: boolean, detector: { - modelPath: String, + modelPath: string, }, skeleton: { - modelPath: String, + modelPath: string, }, }, object: { - enabled: Boolean, - modelPath: String, - minConfidence: Number, - iouThreshold: Number, - maxResults: Number, - skipFrames: Number, + enabled: boolean, + modelPath: string, + minConfidence: number, + iouThreshold: number, + maxResults: number, + skipFrames: number, }, } diff --git a/src/human.ts b/src/human.ts index a2f0f6fc..2c1512a1 100644 --- a/src/human.ts +++ b/src/human.ts @@ -20,8 +20,8 @@ import { Result } from './result'; import * as sample from './sample'; import * as app from '../package.json'; -type Tensor = {}; -type Model = {}; +type Tensor = Object; +type Model = Object; export type { Config } from './config'; export type { Result } from './result'; @@ -29,7 +29,7 @@ export type { Result } from './result'; /** Defines all possible input types for **Human** detection */ export type Input = Tensor | ImageData | ImageBitmap | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas; /** Error message */ -export type Error = { error: String }; +export type Error = { error: string }; export type TensorFlow = typeof tf; // helper function: gets elapsed time on both browser and nodejs @@ -62,9 +62,9 @@ function mergeDeep(...objects) { * - Possible inputs: {@link Input} */ export class Human { - version: String; + version: string; config: Config; - state: String; + state: string; image: { tensor: Tensor, canvas: OffscreenCanvas | HTMLCanvasElement }; // classes tf: TensorFlow; @@ -99,19 +99,17 @@ export class Human { hand: typeof handpose; nanodet: typeof nanodet; }; - sysinfo: { platform: String, agent: String }; - #package: any; + sysinfo: { platform: string, agent: string }; #perf: any; #numTensors: number; - #analyzeMemoryLeaks: Boolean; - #checkSanity: Boolean; - #firstRun: Boolean; + #analyzeMemoryLeaks: boolean; + #checkSanity: boolean; + #firstRun: boolean; // definition end constructor(userConfig: Config | Object = {}) { this.tf = tf; this.draw = draw; - this.#package = app; this.version = app.version; this.config = mergeDeep(defaults, userConfig); this.state = 'idle'; @@ -168,7 +166,7 @@ export class Human { // quick sanity check on inputs /** @hidden */ - #sanity = (input): null | String => { + #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'; @@ -180,7 +178,7 @@ export class Human { return null; } - simmilarity(embedding1: Array, embedding2: Array): Number { + simmilarity(embedding1: Array, embedding2: Array): number { if (this.config.face.embedding.enabled) return embedding.simmilarity(embedding1, embedding2); return 0; } @@ -191,7 +189,7 @@ export class Human { } // eslint-disable-next-line class-methods-use-this - match(faceEmbedding: Array, db: Array<{ name: String, source: String | undefined, embedding: Array }>, threshold = 0): { name: String, source: String | undefined, simmilarity: Number, embedding: Array } { + match(faceEmbedding: Array, db: Array<{ name: string, source: string, embedding: number[] }>, threshold = 0): { name: string, source: string, simmilarity: number, embedding: number[] } { return embedding.match(faceEmbedding, db, threshold); } @@ -311,7 +309,7 @@ export class Human { } /** @hidden */ - #calculateFaceAngle = (mesh): { roll: Number | null, yaw: Number | null, pitch: Number | null } => { + #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 @@ -339,21 +337,21 @@ export 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], - annotations: any, - age: Number, - gender: String, - genderConfidence: Number, - emotion: String, - embedding: any, - iris: Number, - angle: { roll: Number | null, yaw: Number | null, pitch: Number | null }, + 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: Array<{ part: string, points: Array<[number, number, number]>[] }>, + age: number, + gender: string, + genderConfidence: number, + emotion: string, + embedding: number[], + iris: number, + angle: { roll: number | null, yaw: number | null, pitch: number | null }, tensor: Tensor, }> = []; diff --git a/src/nanodet/nanodet.ts b/src/nanodet/nanodet.ts index 38fb6f80..aeb696b2 100644 --- a/src/nanodet/nanodet.ts +++ b/src/nanodet/nanodet.ts @@ -21,7 +21,7 @@ export async function load(config) { } async function process(res, inputSize, outputShape, config) { - let results: Array<{ score: Number, strideSize: Number, class: Number, label: String, center: Number[], centerRaw: Number[], box: Number[], boxRaw: Number[] }> = []; + let results: Array<{ score: number, strideSize: number, class: number, label: string, center: number[], centerRaw: number[], box: number[], boxRaw: number[] }> = []; for (const strideSize of [1, 2, 4]) { // try each stride size as it detects large/medium/small objects // find scores, boxes, classes tf.tidy(() => { // wrap in tidy to automatically deallocate temp tensors diff --git a/src/profile.ts b/src/profile.ts index 8f6ebd9d..2e294e82 100644 --- a/src/profile.ts +++ b/src/profile.ts @@ -2,7 +2,7 @@ import { log } from './log'; export const data = {}; -export function run(name: string, raw: any) { +export function run(name: string, raw: any): void { if (!raw || !raw.kernels) return; const maxResults = 5; const time = raw.kernels diff --git a/src/result.ts b/src/result.ts index 7c626b15..d6fe69be 100644 --- a/src/result.ts +++ b/src/result.ts @@ -26,21 +26,21 @@ export interface Result { * - angle as object with values for roll, yaw and pitch angles */ face: Array<{ - confidence: Number, - boxConfidence: Number, - faceConfidence: Number, - box: [Number, Number, Number, Number], - boxRaw: [Number, Number, Number, Number], - mesh: Array<[Number, Number, Number]> - meshRaw: Array<[Number, Number, Number]> - annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>, - age: Number, - gender: String, - genderConfidence: Number, - emotion: Array<{ score: Number, emotion: String }>, - embedding: Array, - iris: Number, - angle: { roll: Number, yaw: Number, pitch: Number }, + confidence: number, + boxConfidence: number, + faceConfidence: number, + box: [number, number, number, number], + boxRaw: [number, number, number, number], + mesh: Array<[number, number, number]> + meshRaw: Array<[number, number, number]> + annotations: Array<{ part: string, points: Array<[number, number, number]>[] }>, + age: number, + gender: string, + genderConfidence: number, + emotion: Array<{ score: number, emotion: string }>, + embedding: Array, + iris: number, + angle: { roll: number, yaw: number, pitch: number }, }>, /** Body results * @@ -53,11 +53,11 @@ export interface Result { * - body part presence value */ body: Array<{ - id: Number, - part: String, - position: { x: Number, y: Number, z: Number }, - score: Number, - presence: Number }>, + id: number, + part: string, + position: { x: number, y: number, z: number }, + score: number, + presence: number }>, /** Hand results * * Array of individual results with one object per detected hand @@ -69,11 +69,11 @@ export interface Result { * - annotations as array of annotated face landmark points */ hand: Array<{ - confidence: Number, - box: [Number, Number, Number, Number], - boxRaw: [Number, Number, Number, Number], - landmarks: Array<[Number, Number, Number]>, - annotations: Array<{ part: String, points: Array<[Number, Number, Number]>[] }>, + confidence: number, + box: [number, number, number, number], + boxRaw: [number, number, number, number], + landmarks: Array<[number, number, number]>, + annotations: Array<{ part: string, points: Array<[number, number, number]>[] }>, }>, /** Gesture results * @@ -83,8 +83,8 @@ export interface Result { * - gesture detected */ gesture: Array<{ - part: String, - gesture: String, + part: string, + gesture: string, }>, /** Object results * @@ -98,14 +98,14 @@ export interface Result { * - boxRaw as array of [x, y, width, height], normalized to range 0..1 */ object: Array<{ - score: Number, - strideSize: Number, - class: Number, - label: String, - center: Number[], - centerRaw: Number[], - box: Number[], - boxRaw: Number[], + score: number, + strideSize: number, + class: number, + label: string, + center: number[], + centerRaw: number[], + box: number[], + boxRaw: number[], }>, performance: { any }, canvas: OffscreenCanvas | HTMLCanvasElement, diff --git a/src/tfjs/backend.ts b/src/tfjs/backend.ts index 4e7f3f9e..53b71410 100644 --- a/src/tfjs/backend.ts +++ b/src/tfjs/backend.ts @@ -20,7 +20,7 @@ export const config = { }, }; -export function register() { +export function register(): void { if (!tf.findBackend(config.name)) { log('backend registration:', config.name); try {