From 28ff955a418726f12efd370a36718f3966835555 Mon Sep 17 00:00:00 2001 From: Patrice Date: Thu, 27 Jun 2019 17:00:17 +0200 Subject: [PATCH] added docs --- .gitignore | 2 ++ README.md | 33 +++++++++++++++++++++ arch.png | Bin 0 -> 34380 bytes mock/Dockerfile | 15 ---------- mock/app.py | 66 ------------------------------------------ mock/cams.json | 32 -------------------- mock/clients.json | 26 ----------------- mock/requirements.txt | 4 --- 8 files changed, 35 insertions(+), 143 deletions(-) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 arch.png delete mode 100644 mock/Dockerfile delete mode 100644 mock/app.py delete mode 100644 mock/cams.json delete mode 100644 mock/clients.json delete mode 100644 mock/requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..14db69a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +server/__pycache__/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..fdac573 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# IoI Interaktion ohne Interaktion +##### (Demo) + +Dieses Projekt enthält alle Komponenten eines Systems zu überwachung und Analyse mehrerer Videostreams und der Steuerung von Geräten auf Basis der Analyse. + +### Struktur: +Pfad | Beschreibung +----|--- +./FrontEnd/ | Enthält den Front-End Client. Geschrieben in C#. +./client/ | Ein simpler Flask (Python) Endpoint der als Demo Endpoint dient +./server/ | Enthält alle Dateien für Das Backend +./server/cams.json | Entält Informationen über die genutzen Videostreams, kann als Teil der Datenbank verstanden werden +./server/clients.json | Entält Informationen über die möglichen Endpoints, kann als Teil der Datenbank verstanden werden +./server/Dockerfile | Enthält die Deployment Beschreibung. Kann als Prod. Env genutzt werden. Nutzt in diesem Fall aber nur die CPU +./server/model.pb | Enthält das genutzte vortrainierte Neuronale Netz +./server/motion_detector_old.py | Ein erster Prototyp eines rein OpenCV basierten Ansatzes +./server/requirments.txt | Enthält die pip Abhängigkeiten, wird von Dockerfile genutzt +./server/detector.py | Stellt die detection API die vom Server genutzt wird. Hier wird das NN ausgeführt +./server/app.py | Ein Flask Server. Nutzt detector.py um Personen in Videos zu erkennen. Bietet mehrere Routen, mehr hierzu weiter unten. + +### Routes + + /client/ returns client list as json + /client//info returns client information as json + /cam/ returns camera list as json + /cam//stream returns a unedited mjpeg stream + /cam//processed returns a mjpeg stream with persons highlighted + /info returns camera infromation + + +### Architektur + +![Architektur Übersicht](arch.png) \ No newline at end of file diff --git a/arch.png b/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..b9278f150046dd5838554f6912933f9553296748 GIT binary patch literal 34380 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

dbx0Cegtk%Ee1xT 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 YxXVN|z%3FKns=hX4Qo literal 0 HcmV?d00001 diff --git a/mock/Dockerfile b/mock/Dockerfile deleted file mode 100644 index c2dc85b..0000000 --- a/mock/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.7 - -RUN apt-get update -RUN apt-get install -y gcc libevent-dev python-dev - -COPY ./requirements.txt / -RUN pip install -r /requirements.txt - -COPY ./ /app - -WORKDIR /app -EXPOSE 5000 - - -CMD ["gunicorn", "-b", "0.0.0.0:5000","--worker-class", "gthread", "-w","4", "--threads", "100", "app"] \ No newline at end of file diff --git a/mock/app.py b/mock/app.py deleted file mode 100644 index 6eb1517..0000000 --- a/mock/app.py +++ /dev/null @@ -1,66 +0,0 @@ -import os -import random -import json -from importlib import import_module -import cv2 -from flask import Flask, jsonify, Response - -application = Flask(__name__) -clients = [] -cams = [] -with open("./clients.json", 'r', encoding='utf-8') as f: - array = f.read() - clients = json.loads(array) - -with open("./cams.json", 'r', encoding='utf-8') as f: - array = f.read() - cams = json.loads(array) - - -class VideoCamera(object): - def __init__(self, url): - self.video = cv2.VideoCapture(url) - - def __del__(self): - self.video.release() - - def get_frame(self): - success, image = self.video.read() - ret, jpeg = cv2.imencode('.jpg', image) - return jpeg.tobytes() - -def gen(camera): - """Video streaming generator function.""" - while True: - frame = camera.get_frame() - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') - -@application.route('/client/') -def client_list(): - json = clients - return jsonify(json) - -@application.route('/client//info') -def client_info(num): - json = clients[int(num)] - return jsonify(json) - -@application.route('/cam/') -def cam_list(): - json = cams - return jsonify(json) - -@application.route('/cam//info') -def cam_info(num): - json = cams[int(num)] - return jsonify(json) - -@application.route('/cam//stream') -def cam_stream(num): - return Response(gen(VideoCamera(cams[int(num)]["ip"])), - mimetype='multipart/x-mixed-replace; boundary=frame') - -if __name__ == '__main__': - print(clients[0]) - application.run(host='127.0.0.1', port=80, threaded=True) diff --git a/mock/cams.json b/mock/cams.json deleted file mode 100644 index 104847d..0000000 --- a/mock/cams.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "id": 0, - "label": "cam1", - "ip": "http://89.29.108.38:80/mjpg/video.mjpg", - "client_id": 0, - "status": true, - "x":0.2, - "y":0.8, - "angle": 130 - }, - { - "id": 1, - "label": "cam2", - "ip": "http://89.29.108.38:80/mjpg/video.mjpg", - "client_id": 1, - "status": false, - "x":0.4, - "y":0.2, - "angle": 190 - }, - { - "id": 2, - "label": "cam3", - "ip": "http://62.99.80.154:81/mjpg/video.mjpg", - "client_id": 2, - "status": true, - "x":0.9, - "y":0.1, - "angle": 270 - } -] \ No newline at end of file diff --git a/mock/clients.json b/mock/clients.json deleted file mode 100644 index d819984..0000000 --- a/mock/clients.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "id": 0, - "label": "name1", - "ip": "http://127.0.0.2", - "status": true, - "x":0.11, - "y":0.8 - }, - { - "id": 1, - "label": "name2", - "ip": "http://127.0.0.2", - "status": false, - "x":0.3, - "y":0.3 - }, - { - "id": 2, - "label": "name3", - "ip": "http://127.0.0.2", - "status": true, - "x":0.5, - "y":0.6 - } -] \ No newline at end of file diff --git a/mock/requirements.txt b/mock/requirements.txt deleted file mode 100644 index e3806c4..0000000 --- a/mock/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -requests -flask -gunicorn -opencv-python \ No newline at end of file