From aec1cfeba1c257600dd00419f2770e7e4452b6fc Mon Sep 17 00:00:00 2001 From: YI Date: Thu, 19 Dec 2019 19:12:53 +0800 Subject: [PATCH] add face-detect-demo --- facedetect-rasyberrypi/README.md | 9 ++ facedetect-rasyberrypi/demo.png | Bin 0 -> 43266 bytes facedetect-rasyberrypi/dockerfile/Dockerfile | 3 + .../guides/face_detect_demo_guide.md | 129 ++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 facedetect-rasyberrypi/README.md create mode 100644 facedetect-rasyberrypi/demo.png create mode 100644 facedetect-rasyberrypi/dockerfile/Dockerfile create mode 100644 facedetect-rasyberrypi/guides/face_detect_demo_guide.md diff --git a/facedetect-rasyberrypi/README.md b/facedetect-rasyberrypi/README.md new file mode 100644 index 000000000..94a25213e --- /dev/null +++ b/facedetect-rasyberrypi/README.md @@ -0,0 +1,9 @@ +# face detect example +* This demonstration is based on kubeedge, allowing part of the algorithm analysis ability to run on the edge. +* Demo is just an example, you can use this as an example to run various algorithm applications on the edge. +* The docker image used in this example can be used as a [basic image](./dockerfile/Dockerfile) to make images of different business scenarios. +* The demo does not necessarily have better performance, this is just a scenario demonstration. + + + +## Details for the face detect demo, please read the [Demo guide](./guides/face_detect_demo_guide.md) \ No newline at end of file diff --git a/facedetect-rasyberrypi/demo.png b/facedetect-rasyberrypi/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..9089a67ed7c2747c59cb0d1cc62c1e029679d61a GIT binary patch literal 43266 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 VIrfN}o%r_yt;hP0P-^xO{|D*P*aH9n literal 0 HcmV?d00001 diff --git a/facedetect-rasyberrypi/dockerfile/Dockerfile b/facedetect-rasyberrypi/dockerfile/Dockerfile new file mode 100644 index 000000000..116a39109 --- /dev/null +++ b/facedetect-rasyberrypi/dockerfile/Dockerfile @@ -0,0 +1,3 @@ +FROM kubeedge/face-detect-demo:v1 + +## add your application code with python3 \ No newline at end of file diff --git a/facedetect-rasyberrypi/guides/face_detect_demo_guide.md b/facedetect-rasyberrypi/guides/face_detect_demo_guide.md new file mode 100644 index 000000000..fba3cd888 --- /dev/null +++ b/facedetect-rasyberrypi/guides/face_detect_demo_guide.md @@ -0,0 +1,129 @@ +# Guide for use Kubeedge to run face detect Demo for edge at a raspberryPi + +## 1. Prepare Kubeedge environment +install guide please refers to the kubeedge install readme +[Kubeedge installation reference](https://github.com/kubeedge/kubeedge/blob/master/README.md) + +## 2. Prepare the raspberryPi environment +> Demo supports raspberrypi3 and higher +```shell script +run rasp-config to enable the raspberryPi camera. and reboot. +``` +## 3 . Run the face detect demo +> Provide two ways to run this face recognition demo on RaspberryPi + +### 3.1. By using rtsp stream provided by the raspberryPi built-in camera +> note: This method supports the camera which support RTSP video stream. Not just the camera that comes with raspberryPi \ +> The following steps use Raspberry Pi as an example + ++ Step1. Generate RTSP vide stream with build-in camera + +> install the dependent packages +```shell script +apt-get install cmake liblog4cpp5-dev libv4l-dev +``` +> [download the rtsp tool](https://github.com/mpromonet/v4l2rtspserver/releases/tag/v0.1.9) +```shell script +# install the rtsp tool +dpkg -i v4l2rtspserver-0.1.9-Linux-armv7l.deb +``` +> start the RTSP server +```shell script +v4l2rtspserver -H 640 -W 480 -F 15 -P 8555 /dev/video0 > rtsp.log 2>&1& +``` +> -F : the frame rate \ +> -H : the frame height \ +> -W : the frame width \ +> -P : the rtsp server port +> after finished the above steps, you will get a rtsp server url +```shell script +rtsp://hostip:8555/unicast +# the hostip depends on the configuration on your machine +``` + ++ Step2. Pull the Demo images +```shell script +docker pull kubeedge/face-detect-demo:v1 +``` ++ Step3. Run with docker +```shell script +docker run -d -p 8099:8099 -e VIDEO_URL=rtsp://${hostip}:8555/unicast kubeedge/face-detect-demo:v1 python3 /opt/src/app_rtsp.py +``` ++ Or run with kubeedge +> The deployment files are as follows \ +> Please modify the ${hostip} as your machine's \ +> Please modify the ${node_id} maybe you need replace the nodeSelector \ +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: face-detect-demo + labels: + app: demo +spec: + containers: + - name: demo + image: kubeedge/face-detect-demo:v1 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8099 + hostPort: 8099 + args: + - /opt/src/app_rtsp.py + command: + - python3 + env: + - name: VIDEO_URL + value: rtsp://${hostip}:8555/unicast + nodeSelector: + name: ${node_id} +``` + + +### 3.2. By using the picamera module in python (Recommended,Performance will be better) +> this method just support the raspberryPi, does not support other types of machine ++ Step1. Pull the Demo images +```shell script +docker pull docker pull kubeedge/face-detect-demo:v1 +``` + ++ Step2. Run with docker +> The deployment files are as follows +```shell script +docker run -d --privileged=true -v /dev/:/dev/ -p 8099:8099 kubeedge/face-detect-demo:v1 python3 /opt/src/app.py +``` + ++ Or run with kubeedge +> The deployment files are as follows \ +> Please modify the ${node_id} maybe you need replace the nodeSelector +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: face-detect-demo + labels: + app: demo +spec: + containers: + - name: demo + image: kubeedge/face-detect-demo:v1 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8099 + hostPort: 8099 + args: + - /opt/src/app.py + command: + - python3 + volumeMounts: + - name: dev + mountPath: /dev/ + securityContext: + privileged: true + volumes: + - name: dev + hostPath: + path: /dev/ + nodeSelector: + name: ${node_id} +```