ืคืจืืืื
ืกืจืืื ืืกืชืืื ืืขืช ืืืื ืืจื ื ืืืจืื ืืืฆื ืืืืืก ืืืืืืืื ืฉื ืืกืื ืจืืื ืืช ืืืืืฉ.
ืืืจ ืืจืื ืืื ืฉืื ื ืืืจื ืืฉืืจ ืืืืื ืืืขืฉืจ ืืืืื, ืืืืื ืืืช.
ืืืขืื ืืื ืฉืื ื ืจืืฆื ืืฉืืจ ืืืืื ื-Raspberry, ืืืืืฆืืขืื ืฉื ืืืื ืืจืฉืช ืืขืฆืืืช ืขืืื ืืฉืืืจืื ืืจืื ืื ืืจืฆืืช.
Intel Neural Computer Stick
ืฉืงืืชื ืคืชืจืื ืืช ืฉืื ืื.
ะ
ืืืจืืช ืฉืืื ืื ืืกืคืงืช ืืืืจืื ืืืกืืจืืช ืขืืงืจืืืช, ืืฉื ื ืืกืคืจ ืืืืืืืช.
ืืืืืื, ืืคืืจืื ืฉื ืืจืฉืช ืื ืืจืฉืช ืขืฉืื ืืืืืช ืื ืชืืื, ืืื ืืื ืชืืื, ืืืชืื ืฉืืืง ืืืฉืืืืช ืื ืืืื ื ืชืืืืช ืืืืฉืืจ, ืืื ืื ื ืชืืืืช, ืขืืืืืช ืืืชืจืืฉ ืฉืืืืืช ืืืืื ืชืืืื ืืืืจื, ืืืชืืฆืื ืืื ืื ืื ื ืืงืืืื ืืื ืืืจืื ืืืืจืื ืืคืื.
ืืืืคื ืืืื, ืื ืืชื ืจืืฆื ืืืืืฉืื ืจืฉืช ืขืฆืืืช ืฉืจืืจืืชืืช, ืืืชืื ืฉืืื ืื ืชืขืืื ืขื NCS. ืืื, ืืืืืชื ืื ืกืืช ืืคืชืืจ ืืช ืืืขืื ืืืืฆืขืืช ืืืืื ืื ืคืืฆืื ืืื ืืืฉืื ืืืืชืจ.
ืขื ื
ืืืืืจื ืืืื ืืืจืืจื ืืคืชืจืื ืืืืจื ืืงืืื ืืื ืืืืช ืืขื ื.
ืืคืฉืจืืืืช ืืืื ืืช - ืืขืื ืืื ืฉืื ืืฉืชืืืืืช.
ืื ืืื ืืืืื:
... ืืขืฉืจืืช ืคืืืช ืืืืจืื.
ืืืืืจื ืืื ืืืืื ืื ืืื ื ืงืื ืืื.
ืืืืืืชื ืื ืืืืืจ, ืืื ืืขืืืฃ ืืช ืกืืืืช ืืขืืืื ืืืฉื ื ืืืืืื ื-OpenCV ื-Docker ืืืืคืขืื ืืืชื ืืขื ื.
ืืืชืจืื ืฉื ืืืฉื ืื ืืื ืืืืฉืืช ืืฉืืืื - ืืชื ืืืื ืืฉื ืืช ืืช ืืจืฉืช ืืขืฆืืืช, ืืืจืื, ืฉืจืช - ืืืืคื ืืืื, ืื ืืืื.
ืฉืจืช
ื ืชืืื ืขื ืื ืืืคืืก ืืงืืื.
ืืืืคื ืืกืืจืชื ืื ื ืืฉืชืืฉ ื-Flask ืขืืืจ REST API, OpenCV ืืจืฉืช MobileSSD.
ืืืืจ ืฉืืชืงื ืชื ืืช ืืืจืกืืืช ืื ืืืืืืช ื-Docker, ืืืืืชื ืฉ-OpenCV 4.1.2 ืื ืขืืื ืขื Mobile SSD v1_coco_2018_01_28, ืืืืืชื ืฆืจืื ืืืืืจ ื-11/06_2017 ืืืืื.
ืืชืืืืช ืืฉืืจืืช, ืื ื ืืืขื ืื ืืช ืฉืืืช ืืืืชืืช ืืืจืฉืช:
def init():
tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)
ืืืืงืจ ืืงืืื (ืืืืฉื ื ืืื ืื ืฆืขืืจ ืืืืืื) ืื ืืืงื 0.3 ืฉื ืืืช, ื-Raspberry - 3.5.
ื ืชืืื ืืืืฉืื:
def inference(img):
net.setInput(cv.dnn.blobFromImage(img, 1.0/127.5, (300, 300), (127.5, 127.5, 127.5), swapRB=True, crop=False))
return net.forward()
ืืืงืจ - 0.2 ืฉื ืืืช, ืคืื - 1.7.
ืืคืืืช ืืืืื ืื ืืืจ ื-json ืงืจืื:
def build_detection(data, thr, rows, cols):
ret = []
for detection in data[0,0,:,:]:
score = float(detection[2])
if score > thr:
cls = int(detection[1])
a = {"class" : cls, "name" : tf_labels.getLabel(cls), "score" : score}
a["x"] = int(detection[3] * cols)
a["y"] = int(detection[4] * rows)
a["w"] = int(detection[5] * cols ) - a["x"]
a["h"] = int(detection[6] * rows) - a["y"]
ret.append(a)
return ret
ืืชืจ ืขื ืื
ืืคืฉืจืืช ืืืืคืืช, ืฉืื ืืืชืจ ืขืืืื ืืืขืืจืช ืืฉืจืช: ืืื ืขืฆืื ืืงืืฃ ืืช ืืืืืืืงืืื ืฉื ืืฆืื ืืืืืืจ ืืช ืืชืืื ื ืืืืืืจืช.
ืืคืฉืจืืช ืื ืืืื ืืืงืื ืื ืื ื ืื ืจืืฆืื ืืืจืืจ opencv ืืฉืจืช.
ืืืงืจ
ืื ืื ื ืืืกืคืื ืืช ืืชืืื ื.
ืืงืื ืืกืืจืง ืืืคืืจืกื
ืืคืืืคืืจืื, ื ืืงื ืืช ืืืชื Debian Stretch ืืื ื-Raspberry - ืื ื ืืจืื ืืืกื ืืช ืืืื ืืืืืื ืืืืืืช.
ืืชื ืฆืจืื ืืืชืงืื flask, protobuf, requests, opencv_python, ืืืืจืื Mobile SSD, ืงืื ืฉืจืช ื-Github ืืืืคืขืื ืืช ืืฉืจืช.
FROM python:3.7-stretch
RUN pip3 install flask
RUN pip3 install protobuf
RUN pip3 install requests
RUN pip3 install opencv_python
ADD http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz /
RUN tar -xvf /ssd_mobilenet_v1_coco_11_06_2017.tar.gz
ADD https://github.com/tprlab/docker-detect/archive/master.zip /
RUN unzip /master.zip
EXPOSE 80
CMD ["python3", "/docker-detect-master/detect-app/app.py"]
ืคืฉืื
ืคืจืกืื ื- Docker Hub
ืจืืฉืืื Docker ืืชืจืืื ืืืืืจืืช ืื ืคืืืช ืืืืื ืขื ื.
ืืื ืื ืืืจืื, ื ืขืืืจ ืืืืคื ืฉืืจื ื
- ืืืจืฉื
- ืืชืืืจืืช:
ืื ืืกื ืืืขืื - ืืืื ื ืืฆืื ืฉื ืืขื ืืฉืืขืืช:
docker tag opencv-detect tprlab/opencv-detect-ssd - ืืขืื ืืช ืืชืืื ื ืืฉืจืช:
docker push tprlab/opencv-detect-ssd
ืื ืื ื ืืฉืืงืื ืืขื ื
ืื ืืืืืจื ืืืื ืืืคืขืื ืืช ืืืืืื ืืื ืจืืื ืืืื.
ืื ืืฉืืงื ืื ืืืืืืื (ืืืื, ืืืงืจืืกืืคื, ืืืืื) ืืฆืืขืื ืืืงืจื-ืืืคืข ืืืื ื ืืฉื ื ืืจืืฉืื ื.
ืืืืจ ืืชื ืกืืช ืขื Microsoft Azure ื-Google Cloud, ืืชืคืฉืจืชื ืขื ืืืืจืื ืื ืื ืืืจืื ืืืจ ืืืชืจ.
ืื ืืชืืชื ืืื ืืืจืืืช, ืืืืืื ืฉืืืง ืื ืืืื ืกืคืฆืืคื ืืกืคืง ืื ืืืจ.
ื ืืกืืชื ืืคืฉืจืืืืช ืืืืจื ืฉืื ืืช,
ืจืืืช ื ืืืืืช (ืืฉืืชืคืืช ืืืืขืืืืืช) - 0.4 - 0.5 ืฉื ืืืช.
ืืืื ืืืช ืืืงืืช ืืืชืจ - 0.25 - 0.3.
ืืืื, ืืคืืื ืืชืจืืืฉ ืืืจืืข ืืืืชืจ, ืืืืืื ืืื ืคื ืฉืืืฉื, ืืชื ืืืื ืื ืกืืช.
ืืืืื
ืื ื ืืฉืืงืื ืกืืจืืืจ ืืืืื ืคืฉืื ืฉื OpenCV ืขื Raspberry, ืืืืื ืืจื Google Cloud.
ืืฆืืจื ืื ืืกืื ื ืขืฉื ืฉืืืืฉ ืืงืืืฅ ืืืืื ืฉืฆืืื ืคืขื ืืฆืืืช ืืงืจืื.
def handle_frame(frame):
return detect.detect_draw_img(frame)
def generate():
while True:
rc, frame = vs.read()
outFrame = handle_frame(frame)
if outFrame is None:
(rc, outFrame) = cv.imencode(".jpg", frame)
yield(b'--framern' b'Content-Type: image/jpegrnrn' + bytearray(outFrame) + b'rn')
@app.route("/stream")
def video_feed():
return Response(generate(), mimetype = "multipart/x-mixed-replace; boundary=frame")
ืขื ืืืืื ืื ืื ื ืืงืืืื ืื ืืืชืจ ืืฉืืืฉื ืคืจืืืืื ืืฉื ืืื, ืืื ืืืื ืืื ืืืื.
ืื ืืชื ืืืงื ืืืื ื ืืืงื ืืชืื GCloud, ืืชื ืืืื ืืืืืช 4-5 ืคืจืืืืื ืืฉื ืืื, ืืื ืืืืื ืืืขื ืืืชื ื ืจืื ืืขืื, ืืื ืขืืืื ืืืื.
ืืื ืฉืื ืงืฉืจ ืืขื ื ืืืขืืืืืช ืืชืืืืจื; ืืืืื ืคืืขื ืขื ืืืืจื ืจืืืื ืืขืืื ืืืืืจืืช ืืื.
ืืงื ืืืฉื ืขืฆืื
ืื ืืืืืชื ืืืชืืคืง ืืืจืฆืชื ืืช ืืืื ื-NCS.
ืืืืจืืช ืืืืื ืืืืชื ืืขื ืืืชืจ ืืืืืช ื-0.1 ืฉื ืืืช, ืืื ืืงืจื ืืืืจื ืคื 2-3 ืืืขื ื ืืืืื ื ืืืฉื, ืืืืืจ 8-9 ืคืจืืืืื ืืฉื ืืื.
ืืืืื ืืชืืฆืืืช ืืืกืืจ ืขื ืืื ืืขืืืื ืฉ-NCS ืืจืืฆื Mobile SSD ืืจืกืช 2018_01_28.
ื .ื ืื ืืกืฃ, ื ืืกืืืื ืืจืื ืฉืืืื ื ืฉืืืื ืืช ืืืงื ืืืื ืขื ืืขืื I7 ืืฆืืื ืชืืฆืืืช ืืขื ืืืืืช ืืืชืจ ืืืชืืจืจ ืฉืืคืฉืจ ืืกืืื ืขืืื 10 ืคืจืืืืื ืืฉื ืืื.
ืืฉืืื
ืื ืืกืื ืืชืงืื ืืืชืจ ืืืชืงื ืชื ืืช ืืืืื ืขื ืืืืฉื ืฆืืชืื ื-Google Kubernetes.
ืืชืจืืืืื ืขืฆืื ืืื ืืืฉืื ืืื ืืื ืืื ืื ืืืื ืืื ืืขืื ืืืชืจ ื-2 ืคืจืืืืื ืืฉื ืืื.
ืืื ืื ืืชื ืืคืขืื ืืฉืืื ืขื N ืฆืืชืื ืืื ืชื ืืกืืจืืช ื-N ืฉืจืฉืืจืื, ืื ืขื ืืกืคืจ ืืกืคืืง ืฉื ืฆืืชืื (5) ืืชื ืืืื ืืืฉืื ืืช 10 ืืคืจืืืืื ืืจืฆืืืื ืืฉื ืืื.
def generate():
while True:
rc, frame = vs.read()
if frame is not None:
future = executor.submit(handle_frame, (frame.copy()))
Q.append(future)
keep_polling = len(Q) > 0
while(keep_polling):
top = Q[0]
if top.done():
outFrame = top.result()
Q.popleft()
if outFrame:
yield(b'--framern' b'Content-Type: image/jpegrnrn' + bytearray(outFrame) + b'rn')
keep_polling = len(Q) > 0
else:
keep_polling = len(Q) >= M
ืื ื ืื ืฉืงืจื:
ืงืฆืช ืคืืืช ืืืืจ ืืืฉืจ ืขื NCS, ืืื ื ืืจืฅ ืืืชืจ ืืืฉืจ ืืืจื ืืื.
ืืจืืื, ืืืืื, ืืื ื ืืื ืืืจื - ืืฉ ืฉืืืืช ืืกื ืืจืื ืืืขืชืงื ืขืืืงื ืฉื ืชืืื ืืช opencv.
ืืกืงื ื
ืืกื ืืื, ืื ืืกืื ืืืคืฉืจ ืื ื ืืืกืืง ืฉืื ืชื ืกื, ืชืืื ืืืจืื ืขื ืขื ื ืคืฉืื.
ืืื ืฉืืืื ืขืืืื ืืืง ืื ืืืืจื ืืงืืืืช ืืืคืฉืจ ืื ืืืฉืื ืชืืฆืืืช ืืืืืช ืืืชืจ, ืืืื ืื ืืจืืงืื.
ืชืืืืจ
ืืงืืจ: www.habr.com