human/README.md

329 lines
13 KiB
Markdown
Raw Normal View History

2021-04-03 16:49:14 +02:00
![Git Version](https://img.shields.io/github/package-json/v/vladmandic/human?style=flat-square&svg=true&label=git)
![NPM Version](https://img.shields.io/npm/v/@vladmandic/human.png?style=flat-square)
![Last Commit](https://img.shields.io/github/last-commit/vladmandic/human?style=flat-square&svg=true)
![License](https://img.shields.io/github/license/vladmandic/human?style=flat-square&svg=true)
![GitHub Status Checks](https://img.shields.io/github/checks-status/vladmandic/human/main?style=flat-square&svg=true)
![Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/vladmandic/human?style=flat-square&svg=true)
2021-03-08 20:12:12 +01:00
2021-03-08 21:06:56 +01:00
# Human Library
2021-04-11 05:37:44 +02:00
**AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition,**
**Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis,**
2021-06-07 02:49:48 +02:00
**Age & Gender & Emotion Prediction, Gaze Tracking, Gesture Recognition, Body Segmentation**
2021-02-19 14:35:41 +01:00
<br>
2021-03-13 18:13:45 +01:00
JavaScript module using TensorFlow/JS Machine Learning library
2021-03-04 16:33:08 +01:00
2021-03-13 18:13:45 +01:00
- **Browser**:
Compatible with both desktop and mobile platforms
2021-03-30 15:03:18 +02:00
Compatible with *CPU*, *WebGL*, *WASM* backends
2021-03-13 18:13:45 +01:00
Compatible with *WebWorker* execution
- **NodeJS**:
2021-03-17 16:48:34 +01:00
Compatible with both software *tfjs-node* and
GPU accelerated backends *tfjs-node-gpu* using CUDA libraries
2020-11-08 16:06:23 +01:00
<br>
Check out [**Live Demo**](https://vladmandic.github.io/human/demo/index.html) app for processing of live WebCam video or static images
- To start video detection, simply press *Play*
- To process images, simply drag & drop in your Browser window
- Note: For optimal performance, select only models you'd like to use
2021-06-02 19:35:33 +02:00
- Note: If you have modern GPU, WebGL (default) backend is preferred, otherwise select WASM backend
2021-03-04 16:33:08 +01:00
2020-11-08 16:06:23 +01:00
<br>
2020-10-12 01:22:43 +02:00
2021-03-30 15:03:18 +02:00
## Demos
2021-09-16 16:15:20 +02:00
- [**List of all Demo applications**](https://github.com/vladmandic/human/wiki/Demos)
- [*Live:* **Main Application**](https://vladmandic.github.io/human/demo/index.html)
- [*Live:* **Face Extraction, Description, Identification and Matching**](https://vladmandic.github.io/human/demo/facematch/index.html)
- [*Live:* **Face Extraction and 3D Rendering**](https://vladmandic.github.io/human/demo/face3d/index.html)
- [*Live:* **Multithreaded Detection Showcasing Maximum Performance**](https://vladmandic.github.io/human/demo/multithread/index.html)
- [*Live:* **VR Model with Head, Face, Eye, Body and Hand tracking**](https://vladmandic.github.io/human-vrm/src/human-vrm.html)
- [Examples galery](https://vladmandic.github.io/human/samples/samples.html)
2021-03-30 15:03:18 +02:00
2021-03-04 16:33:08 +01:00
## Project pages
2020-11-07 15:39:54 +01:00
2020-10-14 17:43:33 +02:00
- [**Code Repository**](https://github.com/vladmandic/human)
2020-10-15 14:16:34 +02:00
- [**NPM Package**](https://www.npmjs.com/package/@vladmandic/human)
2020-10-14 17:43:33 +02:00
- [**Issues Tracker**](https://github.com/vladmandic/human/issues)
- [**TypeDoc API Specification**](https://vladmandic.github.io/human/typedoc/classes/Human.html)
2021-03-12 04:11:49 +01:00
- [**Change Log**](https://github.com/vladmandic/human/blob/main/CHANGELOG.md)
2021-05-30 15:41:24 +02:00
- [**Current To-do List**](https://github.com/vladmandic/human/blob/main/TODO.md)
2020-11-07 15:39:54 +01:00
2021-03-04 16:33:08 +01:00
## Wiki pages
2020-11-07 15:39:54 +01:00
2020-11-07 15:47:26 +01:00
- [**Home**](https://github.com/vladmandic/human/wiki)
- [**Installation**](https://github.com/vladmandic/human/wiki/Install)
2020-11-13 22:42:00 +01:00
- [**Usage & Functions**](https://github.com/vladmandic/human/wiki/Usage)
- [**Configuration Details**](https://github.com/vladmandic/human/wiki/Configuration)
- [**Output Details**](https://github.com/vladmandic/human/wiki/Outputs)
2021-03-24 16:08:49 +01:00
- [**Face Recognition & Face Description**](https://github.com/vladmandic/human/wiki/Embedding)
2020-11-09 14:57:24 +01:00
- [**Gesture Recognition**](https://github.com/vladmandic/human/wiki/Gesture)
2021-03-24 16:08:49 +01:00
- [**Common Issues**](https://github.com/vladmandic/human/wiki/Issues)
2021-04-16 15:31:58 +02:00
- [**Background and Benchmarks**](https://github.com/vladmandic/human/wiki/Background)
2020-11-13 22:42:00 +01:00
2021-03-04 16:33:08 +01:00
## Additional notes
2020-11-13 22:42:00 +01:00
- [**Comparing Backends**](https://github.com/vladmandic/human/wiki/Backends)
2020-11-07 15:47:26 +01:00
- [**Development Server**](https://github.com/vladmandic/human/wiki/Development-Server)
- [**Build Process**](https://github.com/vladmandic/human/wiki/Build-Process)
- [**Adding Custom Modules**](https://github.com/vladmandic/human/wiki/Module)
2020-11-07 15:47:26 +01:00
- [**Performance Notes**](https://github.com/vladmandic/human/wiki/Performance)
2020-11-10 16:23:11 +01:00
- [**Performance Profiling**](https://github.com/vladmandic/human/wiki/Profiling)
2020-11-23 13:44:10 +01:00
- [**Platform Support**](https://github.com/vladmandic/human/wiki/Platforms)
2021-09-12 18:42:17 +02:00
- [**Diagnostic and Performance trace information**](https://github.com/vladmandic/human/wiki/Diag)
2021-10-02 17:41:51 +02:00
- [**Dockerize Human applications**](https://github.com/vladmandic/human/wiki/Docker)
2020-11-14 13:05:20 +01:00
- [**List of Models & Credits**](https://github.com/vladmandic/human/wiki/Models)
- [**Models Download Repository**](https://github.com/vladmandic/human-models)
2021-05-30 15:41:24 +02:00
- [**Security & Privacy Policy**](https://github.com/vladmandic/human/blob/main/SECURITY.md)
2021-05-30 18:03:34 +02:00
- [**License & Usage Restrictions**](https://github.com/vladmandic/human/blob/main/LICENSE)
2020-10-12 01:22:43 +02:00
2020-11-08 18:44:08 +01:00
<br>
2021-03-04 16:33:08 +01:00
*See [**issues**](https://github.com/vladmandic/human/issues?q=) and [**discussions**](https://github.com/vladmandic/human/discussions) for list of known limitations and planned enhancements*
2020-10-14 02:52:30 +02:00
2020-11-07 15:39:54 +01:00
*Suggestions are welcome!*
2020-11-06 22:21:20 +01:00
2021-04-10 03:53:48 +02:00
<hr><br>
2020-11-06 22:21:20 +01:00
2020-10-16 21:04:51 +02:00
## Examples
2020-10-13 16:06:49 +02:00
Visit [Examples galery](https://vladmandic.github.io/human/samples/samples.html) for more examples
<https://vladmandic.github.io/human/samples/samples.html>
![samples](assets/samples.jpg)
<br>
## Options
2021-03-04 16:33:08 +01:00
All options as presented in the demo application...
> [demo/index.html](demo/index.html)
2020-11-21 13:19:20 +01:00
![Options visible in demo](assets/screenshot-menu.png)
2021-09-16 16:15:20 +02:00
<br>
2021-09-15 17:15:38 +02:00
**Results Browser:**
[ *Demo -> Display -> Show Results* ]<br>
![Results](assets/screenshot-results.png)
<br>
## Advanced Examples
1. **Face Similarity Matching:**
2021-05-30 18:03:34 +02:00
Extracts all faces from provided input images,
sorts them by similarity to selected face
and optionally matches detected face with database of known people to guess their names
2021-06-14 14:16:10 +02:00
> [demo/facematch](demo/facematch/index.html)
2021-03-23 20:35:54 +01:00
![Face Matching](assets/screenshot-facematch.jpg)
<br>
2. **Face3D OpenGL Rendering:**
2021-06-14 14:16:10 +02:00
> [demo/face3d](demo/face3d/index.html)
2021-03-30 15:03:18 +02:00
![Face Matching](assets/screenshot-face3d.jpg)
<br>
3. **VR Model Tracking:**
![vrmodel](assets/screenshot-vrm.jpg)
<br>
**468-Point Face Mesh Defails:**
2021-05-17 05:55:08 +02:00
(view in full resolution to see keypoints)
![FaceMesh](assets/facemesh.png)
2021-03-05 17:43:50 +01:00
<br><hr><br>
2021-04-09 00:37:58 +02:00
## Quick Start
2021-04-11 05:16:06 +02:00
Simply load `Human` (*IIFE version*) directly from a cloud CDN in your HTML file:
(pick one: `jsdelirv`, `unpkg` or `cdnjs`)
2021-04-09 00:37:58 +02:00
```html
<script src="https://cdn.jsdelivr.net/npm/@vladmandic/human/dist/human.js"></script>
<script src="https://unpkg.dev/@vladmandic/human/dist/human.js"></script>
2021-09-12 14:49:56 +02:00
<script src="https://cdnjs.cloudflare.com/ajax/libs/human/2.1.5/human.js"></script>
2021-04-09 00:37:58 +02:00
```
For details, including how to use `Browser ESM` version or `NodeJS` version of `Human`, see [**Installation**](https://github.com/vladmandic/human/wiki/Install)
<br>
2021-04-12 23:48:59 +02:00
## 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 `<video>` tag that links to:
- WebCam on user's system
- Any supported video type
For example: `.mp4`, `.avi`, etc.
- Additional video types supported via *HTML5 Media Source Extensions*
Live streaming examples:
- **HLS** (*HTTP Live Streaming*) using `hls.js`
- **DASH** (Dynamic Adaptive Streaming over HTTP) using `dash.js`
- **WebRTC** media track using built-in support
2021-04-12 23:48:59 +02:00
<br>
2021-04-09 00:37:58 +02:00
## Example
2021-03-05 17:43:50 +01:00
Example 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
2021-03-05 20:40:44 +01:00
const config = { backend: 'webgl' };
2021-03-05 17:43:50 +01:00
const human = new Human(config);
2021-09-11 22:00:16 +02:00
// select input HTMLVideoElement and output HTMLCanvasElement from page
const inputVideo = document.getElementById('video-id');
const outputCanvas = document.getElementById('canvas-id');
2021-03-05 17:43:50 +01:00
function detectVideo() {
// perform processing using default configuration
human.detect(inputVideo).then((result) => {
2021-03-05 20:40:44 +01:00
// result object will contain detected details
// as well as the processed canvas itself
// so lets first draw processed frame on canvas
2021-03-05 17:43:50 +01:00
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);
2021-04-11 05:16:06 +02:00
// and loop immediate to the next frame
2021-03-05 17:43:50 +01:00
requestAnimationFrame(detectVideo);
});
}
detectVideo();
```
2020-11-21 13:19:20 +01:00
2021-04-11 05:16:06 +02:00
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
2021-09-11 22:00:16 +02:00
const inputVideo = document.getElementById('video-id');
const outputCanvas = document.getElementById('canvas-id');
2021-04-11 05:16:06 +02:00
async function detectVideo() {
const result = await human.detect(inputVideo); // run detection
human.draw.all(outputCanvas, result); // draw all results
requestAnimationFrame(detectVideo); // run loop
2021-04-11 05:16:06 +02:00
}
detectVideo(); // start loop
2021-04-11 05:16:06 +02:00
```
2021-09-11 22:00:16 +02:00
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); // calculate next interpolated frame
human.draw.all(outputCanvas, interpolated); // draw the frame
}
requestAnimationFrame(drawVideo); // run draw loop
}
detectVideo(); // start detection loop
drawVideo(); // start draw loop
```
And for even better results, you can run detection in a separate web worker thread
2021-03-13 18:13:45 +01:00
<br><hr><br>
2021-03-18 21:55:00 +01:00
## Default models
Default models in Human library are:
- **Face Detection**: MediaPipe BlazeFace - Back variation
2021-03-18 21:55:00 +01:00
- **Face Mesh**: MediaPipe FaceMesh
- **Face Iris Analysis**: MediaPipe Iris
- **Face Description**: HSE FaceRes
2021-03-18 21:55:00 +01:00
- **Emotion Detection**: Oarriaga Emotion
- **Body Analysis**: MoveNet - Lightning variation
2021-08-06 14:50:50 +02:00
- **Hand Analysis**: MediaPipe Hands
- **Body Segmentation**: Google Selfie
- **Object Detection**: MB3 CenterNet
2021-08-06 14:50:50 +02:00
- **Body Segmentation**: Google Selfie
2021-03-18 21:55:00 +01:00
Note that alternative models are provided and can be enabled via configuration
For example, `PoseNet` model can be switched for `BlazePose`, `EfficientPose` or `MoveNet` model depending on the use case
2021-03-18 21:55:00 +01:00
For more info, see [**Configuration Details**](https://github.com/vladmandic/human/wiki/Configuration) and [**List of Models**](https://github.com/vladmandic/human/wiki/Models)
<br><hr><br>
2021-09-12 18:42:17 +02:00
## Diagnostics
- [How to get diagnostic information or performance trace information](https://github.com/vladmandic/human/wiki/Diag)
<br><hr><br>
2021-09-16 01:12:05 +02:00
`Human` library is written in `TypeScript` [4.4](https://www.typescriptlang.org/docs/handbook/intro.html)
2021-03-13 18:13:45 +01:00
Conforming to `JavaScript` [ECMAScript version 2020](https://www.ecma-international.org/ecma-262/11.0/index.html) standard
2021-06-08 13:37:15 +02:00
Build target is `JavaScript` [EMCAScript version 2018](https://262.ecma-international.org/9.0/)
2021-03-13 18:13:45 +01:00
2021-03-14 04:38:35 +01:00
<br>
For details see [**Wiki Pages**](https://github.com/vladmandic/human/wiki)
2021-07-31 13:29:37 +02:00
and [**API Specification**](https://vladmandic.github.io/human/typedoc/classes/Human.html)
2021-03-14 04:38:35 +01:00
2021-03-04 16:33:08 +01:00
<br>
2021-03-08 20:12:12 +01:00
2021-04-03 16:49:14 +02:00
![Stars](https://img.shields.io/github/stars/vladmandic/human?style=flat-square&svg=true)
2021-04-09 01:16:17 +02:00
![Forks](https://badgen.net/github/forks/vladmandic/human)
2021-04-03 16:49:14 +02:00
![Code Size](https://img.shields.io/github/languages/code-size/vladmandic/human?style=flat-square&svg=true)
2021-04-09 01:16:17 +02:00
![CDN](https://data.jsdelivr.com/v1/package/npm/@vladmandic/human/badge)<br>
2021-04-03 16:49:14 +02:00
![Downloads](https://img.shields.io/npm/dw/@vladmandic/human.png?style=flat-square)
![Downloads](https://img.shields.io/npm/dm/@vladmandic/human.png?style=flat-square)
![Downloads](https://img.shields.io/npm/dy/@vladmandic/human.png?style=flat-square)