added docker notes

master
Vladimir Mandic 2021-10-02 11:41:42 -04:00
parent 3cc1daff22
commit 89065def60
2 changed files with 159 additions and 61 deletions

141
Docker.md Normal file

@ -0,0 +1,141 @@
# Running Human in a Docker container
This guide covers multiple scenarios:
1. Run app using Human as a full environment inside container
2. Run app using Human as NodeJS worker inside container
3. Run Human for web inside container
<br>
## Install Docker
For details see [Docker Docs: Installation Guide](https://docs.docker.com/engine/install/)
Example: Install Docker using official convenience script:
> curl https://get.docker.com | sudo sh
Check Docker status installation:
> sudo docker version
> sudo docker info
> sudo systemctl status containerd docker
Get list of running containers
> docker ps
Get logs from a running container
> docker logs `containerID`
Stop container
> docker stop `containerID`
Go to shell inside container
> docker exec -it `containerID` /bin/bash
<br>
## 1. Run Human full environment
- To run `human` inside docker container,
simply *dockerize* your application as usual
- Note that if your app has a dependency on `@vladmandic/human`,
all of `human` components will be installed by default and not just the library
(for example, this includes copies of in `/models` and sources in `/src`)
- It is strongly recommended to dockerize prodution mode only apps (`npm install --production`)
to avoid installing all of `human` dev dependencies inside the container
<br>
## 2. Run Human as NodeJS worker
### Minimize Dependnecies
To minimize size of a container dont install `human` as your app dependency
And avoid importing entire `@vladmandic/human` as usual:
```js
// const Human = require('@vladmandic/human').default;
```
Instead import `human` library directly as only library is required inside docker container:
```js
const Human = require('./human-dist/human.node.js').default;
```
### Configure Docker
Create Docker recipe `myapp.docker` in your `human` project folder
- Can use `NodeJS` 14 or 16
- Minimal footprint as only `/dist` is actually required
- Assumes user has NodeJS app `myapp` with its `package.json`
- Modify workdir path as needed
- Modify entry point as needed
```text
FROM node:16
WORKDIR <path-to-myapp>
COPY package.json .
copy <myapp> .
RUN npm install
COPY node_modules/@vladmandic/human/dist ./human-dist
ENTRYPOINT node myapp/index.js
USER node
```
### Build image
> sudo docker build . --file myapp.docker --tag myapp
### Run container
- Maps `models` from host to a docker container so there is no need to copy it into each container
- Modify path as needed
> docker run -docker run -it --init --detach \
--volume node_modules/@vladmandic/human/models:$PWD/models \
myapp
<br>
## 3. Run Human for Web
### Configure Docker
Create Docker recipe `human-web.docker` in your `human` project folder
- Can use `NodeJS` 14 or 16
- Default package is empty as `human` has no external dependencies
- Minimal footprint as only `/dist` is actually required
- As an example, copies default `/demo` web app to serve
- Uses `@vladmandic/build` as web server
- Modify workdir path as needed
```text
FROM node:16
WORKDIR <path-to-myapp>
RUN npm init --yes
COPY build.json .
RUN npm install @vladmandic/build --no-fund
COPY dist ./dist
COPY demo ./demo
EXPOSE 10031
ENTRYPOINT node node_modules/@vladmandic/build/dist/build.js --profile serve
USER node
```
### Build image
> sudo docker build . --file human-web.docker --tag human-web
### Run container
- Maps `models` from host to a docker container so there is no need to copy it into each container
- Maps human internal web server to external port 8001 so app can be accessed externally
> docker run -docker run -it --init --detach --name human-web-instance \
--publish 8001:10031 \
--volume node_modules/@vladmandic/human/models:$PWD/models \
human-web
<br>

79
Home.md

@ -2,7 +2,7 @@
**AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition,**
**Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis,**
**Age & Gender & Emotion Prediction, Gesture Recognition**
**Age & Gender & Emotion Prediction, Gaze Tracking, Gesture Recognition, Body Segmentation**
<br>
@ -16,25 +16,26 @@ JavaScript module using TensorFlow/JS Machine Learning library
Compatible with both software *tfjs-node* and
GPU accelerated backends *tfjs-node-gpu* using CUDA libraries
Check out [**Live Demo**](https://vladmandic.github.io/human/demo/index.html) for processing of live WebCam video or static images
<br>
## Demos
- [**Main Application**](https://vladmandic.github.io/human/demo/index.html)
- [**Face Extraction, Description, Identification and Matching**](https://vladmandic.github.io/human/demo/facematch/index.html)
- [**Face Extraction and 3D Rendering**](https://vladmandic.github.io/human/demo/face3d/index.html)
- [**Details on Demo Applications**](https://github.com/vladmandic/human/wiki/Demos)
- [**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)
## Project pages
- [**Code Repository**](https://github.com/vladmandic/human)
- [**NPM Package**](https://www.npmjs.com/package/@vladmandic/human)
- [**Issues Tracker**](https://github.com/vladmandic/human/issues)
- [**TypeDoc API Specification: Human**](https://vladmandic.github.io/human/typedoc/classes/Human.html)
- [**TypeDoc API Specification: Root**](https://vladmandic.github.io/human/typedoc/)
- [**TypeDoc API Specification**](https://vladmandic.github.io/human/typedoc/classes/Human.html)
- [**Change Log**](https://github.com/vladmandic/human/blob/main/CHANGELOG.md)
- [**Current To-do List**](https://github.com/vladmandic/human/blob/main/TODO.md)
## Wiki pages
@ -50,14 +51,19 @@ Check out [**Live Demo**](https://vladmandic.github.io/human/demo/index.html) fo
## Additional notes
- [**Notes on Backends**](https://github.com/vladmandic/human/wiki/Backends)
- [**Comparing Backends**](https://github.com/vladmandic/human/wiki/Backends)
- [**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)
- [**Performance Notes**](https://github.com/vladmandic/human/wiki/Performance)
- [**Performance Profiling**](https://github.com/vladmandic/human/wiki/Profiling)
- [**Platform Support**](https://github.com/vladmandic/human/wiki/Platforms)
- [**Diagnostic and Performance trace information**](https://github.com/vladmandic/human/wiki/Diag)
- [**Dockerize Human applications**](https://github.com/vladmandic/human/wiki/Docker)
- [**List of Models & Credits**](https://github.com/vladmandic/human/wiki/Models)
- [**Models Download Repository**](https://github.com/vladmandic/human-models)
- [**Security & Privacy Policy**](https://github.com/vladmandic/human/blob/main/SECURITY.md)
- [**License & Usage Restrictions**](https://github.com/vladmandic/human/blob/main/LICENSE)
<br>
@ -65,57 +71,8 @@ Check out [**Live Demo**](https://vladmandic.github.io/human/demo/index.html) fo
*Suggestions are welcome!*
<hr><br>
## 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
<br><hr><br>
## Default models
Default models in Human library are:
- **Face Detection**: MediaPipe BlazeFace - Back variation
- **Face Mesh**: MediaPipe FaceMesh
- **Face Iris Analysis**: MediaPipe Iris
- **Face Description**: HSE FaceRes
- **Emotion Detection**: Oarriaga Emotion
- **Body Analysis**: MoveNet - Lightning variation
- **Hand Analysis**: MediaPipe Hands
- **Body Segmentation**: Google Selfie
- **Object Detection**: CenterNet
- **Body Segmentation**: Google Selfie
Note that alternative models are provided and can be enabled via configuration
For example, `PoseNet` model can be switched for `BlazePose` model depending on the use case
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>
`Human` library is written in `TypeScript` [4.2](https://www.typescriptlang.org/docs/handbook/intro.html)
`Human` library is written in `TypeScript` [4.4](https://www.typescriptlang.org/docs/handbook/intro.html)
Conforming to `JavaScript` [ECMAScript version 2020](https://www.ecma-international.org/ecma-262/11.0/index.html) standard
Build target is `JavaScript` **EMCAScript version 2018**
<br>
For details see [**Wiki Pages**](https://github.com/vladmandic/human/wiki)
and [**API Specification**](https://vladmandic.github.io/human/typedoc/classes/Human.html)
<br>
Build target is `JavaScript` [EMCAScript version 2018](https://262.ecma-international.org/9.0/)