diff --git a/Demos.md b/Demos.md index 673e42d..770ab47 100644 --- a/Demos.md +++ b/Demos.md @@ -9,6 +9,7 @@ All demos are included in `/demo` and come with individual documentation per-dem - **Full** [[*Live*]](https://vladmandic.github.io/human/demo/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo): Main browser demo app that showcases all Human capabilities - **Simple** [[*Live*]](https://vladmandic.github.io/human/demo/typescript/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/typescript): Simple demo in WebCam processing demo in TypeScript - **Embedded** [[*Live*]](https://vladmandic.github.io/human/demo/video/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/video/index.html): Even simpler demo with tiny code embedded in HTML file +- **Face Detect** [[*Live*]](https://vladmandic.github.io/human/demo/facedetect/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/facedetect): Extract faces from images and processes details - **Face Match** [[*Live*]](https://vladmandic.github.io/human/demo/facematch/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/facematch): Extract faces from images, calculates face descriptors and similarities and matches them to known database - **Face ID** [[*Live*]](https://vladmandic.github.io/human/demo/faceid/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/faceid): Runs multiple checks to validate webcam input before performing face match to faces in IndexDB - **Multi-thread** [[*Live*]](https://vladmandic.github.io/human/demo/multithread/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/multithread): Runs each Human module in a separate web worker for highest possible performance diff --git a/Home.md b/Home.md index e2844a7..da1b9ad 100644 --- a/Home.md +++ b/Home.md @@ -14,35 +14,6 @@
-## Highlights - -- Compatible with most server-side and client-side environments and frameworks -- Combines multiple machine learning models which can be switched on-demand depending on the use-case -- Related models are executed in an attention pipeline to provide details when needed -- Optimized input pre-processing that can enhance image quality of any type of inputs -- Detection of frame changes to trigger only required models for improved performance -- Intelligent temporal interpolation to provide smooth results regardless of processing performance -- Simple unified API -- Built-in Image, Video and WebCam handling - -[*Jump to Quick Start*](#quick-start) - -
- -## Compatibility - -- **Browser**: - Compatible with both desktop and mobile platforms - Compatible with *CPU*, *WebGL*, *WASM* backends - Compatible with *WebWorker* execution - Compatible with *WebView* -- **NodeJS**: - Compatibile with *WASM* backend for executions on architectures where *tensorflow* binaries are not available - Compatible with *tfjs-node* using software execution via *tensorflow* shared libraries - Compatible with *tfjs-node* using GPU-accelerated execution via *tensorflow* shared libraries and nVidia CUDA - -
- ## Releases - [Release Notes](https://github.com/vladmandic/human/releases) - [NPM Link](https://www.npmjs.com/package/@vladmandic/human) @@ -70,6 +41,7 @@ - **Full** [[*Live*]](https://vladmandic.github.io/human/demo/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo): Main browser demo app that showcases all Human capabilities - **Simple** [[*Live*]](https://vladmandic.github.io/human/demo/typescript/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/typescript): Simple demo in WebCam processing demo in TypeScript - **Embedded** [[*Live*]](https://vladmandic.github.io/human/demo/video/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/video/index.html): Even simpler demo with tiny code embedded in HTML file +- **Face Detect** [[*Live*]](https://vladmandic.github.io/human/demo/facedetect/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/facedetect): Extract faces from images and processes details - **Face Match** [[*Live*]](https://vladmandic.github.io/human/demo/facematch/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/facematch): Extract faces from images, calculates face descriptors and similarities and matches them to known database - **Face ID** [[*Live*]](https://vladmandic.github.io/human/demo/faceid/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/faceid): Runs multiple checks to validate webcam input before performing face match to faces in IndexDB - **Multi-thread** [[*Live*]](https://vladmandic.github.io/human/demo/multithread/index.html) [[*Details*]](https://github.com/vladmandic/human/tree/main/demo/multithread): Runs each Human module in a separate web worker for highest possible performance @@ -140,240 +112,4 @@ *Suggestions are welcome!* -


- -## Quick Start - -Simply load `Human` (*IIFE version*) directly from a cloud CDN in your HTML file: -(pick one: `jsdelirv`, `unpkg` or `cdnjs`) - -```html - - - - -``` - -For details, including how to use `Browser ESM` version or `NodeJS` version of `Human`, see [**Installation**](https://github.com/vladmandic/human/wiki/Install) - -
- -## Code Examples - -Simple app that uses Human to process video input and -draw output on screen using internal draw helper functions - -```js -// create instance of human with simple configuration using default values -const config = { backend: 'webgl' }; -const human = new Human(config); -// select input HTMLVideoElement and output HTMLCanvasElement from page -const inputVideo = document.getElementById('video-id'); -const outputCanvas = document.getElementById('canvas-id'); - -function detectVideo() { - // perform processing using default configuration - human.detect(inputVideo).then((result) => { - // result object will contain detected details - // as well as the processed canvas itself - // so lets first draw processed frame on canvas - human.draw.canvas(result.canvas, outputCanvas); - // then draw results on the same canvas - human.draw.face(outputCanvas, result.face); - human.draw.body(outputCanvas, result.body); - human.draw.hand(outputCanvas, result.hand); - human.draw.gesture(outputCanvas, result.gesture); - // and loop immediate to the next frame - requestAnimationFrame(detectVideo); - return result; - }); -} - -detectVideo(); -``` - -or using `async/await`: - -```js -// create instance of human with simple configuration using default values -const config = { backend: 'webgl' }; -const human = new Human(config); // create instance of Human -const inputVideo = document.getElementById('video-id'); -const outputCanvas = document.getElementById('canvas-id'); - -async function detectVideo() { - const result = await human.detect(inputVideo); // run detection - human.draw.all(outputCanvas, result); // draw all results - requestAnimationFrame(detectVideo); // run loop -} - -detectVideo(); // start loop -``` - -or using `Events`: - -```js -// create instance of human with simple configuration using default values -const config = { backend: 'webgl' }; -const human = new Human(config); // create instance of Human -const inputVideo = document.getElementById('video-id'); -const outputCanvas = document.getElementById('canvas-id'); - -human.events.addEventListener('detect', () => { // event gets triggered when detect is complete - human.draw.all(outputCanvas, human.result); // draw all results -}); - -function detectVideo() { - human.detect(inputVideo) // run detection - .then(() => requestAnimationFrame(detectVideo)); // upon detect complete start processing of the next frame -} - -detectVideo(); // start loop -``` - -or using interpolated results for smooth video processing by separating detection and drawing loops: - -```js -const human = new Human(); // create instance of Human -const inputVideo = document.getElementById('video-id'); -const outputCanvas = document.getElementById('canvas-id'); -let result; - -async function detectVideo() { - result = await human.detect(inputVideo); // run detection - requestAnimationFrame(detectVideo); // run detect loop -} - -async function drawVideo() { - if (result) { // check if result is available - const interpolated = human.next(result); // get smoothened result using last-known results - human.draw.all(outputCanvas, interpolated); // draw the frame - } - requestAnimationFrame(drawVideo); // run draw loop -} - -detectVideo(); // start detection loop -drawVideo(); // start draw loop -``` - -or same, but using built-in full video processing instead of running manual frame-by-frame loop: - -```js -const human = new Human(); // create instance of Human -const inputVideo = document.getElementById('video-id'); -const outputCanvas = document.getElementById('canvas-id'); - -async function drawResults() { - const interpolated = human.next(); // get smoothened result using last-known results - human.draw.all(outputCanvas, interpolated); // draw the frame - requestAnimationFrame(drawResults); // run draw loop -} - -human.video(inputVideo); // start detection loop which continously updates results -drawResults(); // start draw loop -``` - -or using built-in webcam helper methods that take care of video handling completely: - -```js -const human = new Human(); // create instance of Human -const outputCanvas = document.getElementById('canvas-id'); - -async function drawResults() { - const interpolated = human.next(); // get smoothened result using last-known results - human.draw.canvas(outputCanvas, human.webcam.element); // draw current webcam frame - human.draw.all(outputCanvas, interpolated); // draw the frame detectgion results - requestAnimationFrame(drawResults); // run draw loop -} - -await human.webcam.start({ crop: true }); -human.video(human.webcam.element); // start detection loop which continously updates results -drawResults(); // start draw loop -``` - -And for even better results, you can run detection in a separate web worker thread - -


- -## Inputs - -`Human` library can process all known input types: - -- `Image`, `ImageData`, `ImageBitmap`, `Canvas`, `OffscreenCanvas`, `Tensor`, -- `HTMLImageElement`, `HTMLCanvasElement`, `HTMLVideoElement`, `HTMLMediaElement` - -Additionally, `HTMLVideoElement`, `HTMLMediaElement` can be a standard `