рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрдорд╛ рдХреНрд▓рд╛рдЙрдб рд╡рд╕реНрддреБ рдбрд┐рдЯреЗрдХреНрдЯрд░рдХреЛ рднрд┐рдбрд┐рдпреЛ

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛

рдЯреЗрд╕реНрд▓рд╛рдХреЛ рдЕрдЯреЛрдкрд╛рдпрд▓рдЯрд▓реЗ рд╕рдбрдХ рдХрд╕рд░реА рд╣реЗрд░реНрдЫ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрдиреЗ рднрд┐рдбрд┐рдпреЛ рдЕрд╣рд┐рд▓реЗ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдШреБрдорд┐рд░рд╣реЗрдХреЛ рдЫред

рдорд▓рд╛рдИ рдбрд┐рдЯреЗрдХреНрдЯрд░рд╕рдБрдЧ рд╕рдореГрджреНрдз рднрд┐рдбрд┐рдпреЛ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрди рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ рдЦреБрдЬрд▓реА рднрдЗрд░рд╣реЗрдХреЛ рдЫ, рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордпрдорд╛ред

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрдорд╛ рдХреНрд▓рд╛рдЙрдб рд╡рд╕реНрддреБ рдбрд┐рдЯреЗрдХреНрдЯрд░рдХреЛ рднрд┐рдбрд┐рдпреЛ

рд╕рдорд╕реНрдпрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдо Raspberry рдмрд╛рдЯ рднрд┐рдбрд┐рдпреЛ рдкреНрд░рд╕рд╛рд░рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рд░ рдпрд╕рдорд╛ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░рдХреЛ рдкреНрд░рджрд░реНрд╢рдирд▓реЗ рдЪрд╛рд╣рд┐рдиреЗ рдзреЗрд░реИ рдЫреЛрдбреНрдЫред

рдЗрдВрдЯреЗрд▓ рдиреНрдпреВрд░рд▓ рдХрдореНрдкреНрдпреБрдЯрд░ рд╕реНрдЯрд┐рдХ

рдореИрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрд╛рдпрд╣рд░реВ рд╡рд┐рдЪрд╛рд░ рдЧрд░реЗрдВред

╨Т рдЕрдиреНрддрд┐рдо рд▓реЗрдЦ Intel Neural Computer Stick рдХреЛ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдпреЛред рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЫ, рддрд░ рдпрд╕рдХреЛ рдЖрдлреНрдиреИ рдиреЗрдЯрд╡рд░реНрдХ рдврд╛рдБрдЪрд╛ рдЖрд╡рд╢реНрдпрдХ рдЫред

рдпрджреНрдпрдкрд┐ рдЗрдВрдЯреЗрд▓рд▓реЗ рдкреНрд░рдореБрдЦ рдлреНрд░реЗрдорд╡рд░реНрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрднрд░реНрдЯрд░рд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ, рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреНред

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЖрд╡рд╢реНрдпрдХ рдиреЗрдЯрд╡рд░реНрдХрдХреЛ рдврд╛рдБрдЪрд╛ рдЕрд╕рдВрдЧрдд рд╣реБрди рд╕рдХреНрдЫ, рд░ рдпрджрд┐ рдпреЛ рдЙрдкрдпреБрдХреНрдд рдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдХреЗрд╣реА рддрд╣рд╣рд░реВ рдЙрдкрдХрд░рдгрдорд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реБрди рд╕рдХреНрдЫ, рд░ рдпрджрд┐ рддрд┐рдиреАрд╣рд░реВ рд╕рдорд░реНрдерд┐рдд рдЫрдиреН рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░реВрдкрд╛рдиреНрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХреНрд░рдордорд╛ рд╣реБрди рд╕рдХреНрдЫ, рдЬрд╕рдХреЛ рдкрд░рд┐рдгрд╛рдо рд╕реНрд╡рд░реВрдкред рд╣рд╛рдореАрд▓реЗ рдЖрдЙрдЯрдкреБрдЯрдорд╛ рдХреЗрд╣рд┐ рдЕрдиреМрдареЛ рдЪреАрдЬрд╣рд░реВ рдкрд╛рдЙрдБрдЫреМрдВред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпрджрд┐ рддрдкрд╛рдЗрдБ рдХреБрдиреИ рдкреНрд░рдХрд╛рд░рдХреЛ рдордирдорд╛рдиреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ NCS рд╕рдБрдЧ рдХрд╛рдо рдирдЧрд░реНрди рд╕рдХреНрдЫред рддреНрдпрд╕реИрд▓реЗ, рдореИрд▓реЗ рд╕рдмреИрднрдиреНрджрд╛ рд╡реНрдпрд╛рдкрдХ рд░ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред

рдХреНрд▓рд╛рдЙрдб

рд╕реНрдерд╛рдиреАрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рдирдХреЛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреНрд▓рд╛рдЙрдбрдорд╛ рдЬрд╛рдиреБ рд╣реЛред

рддрдпрд╛рд░ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ - рдореЗрд░реЛ рдЖрдБрдЦрд╛ рдЬрдВрдЧрд▓реА рджреМрдбрдиреНрдЫред

рд╕рдмреИ рдиреЗрддрд╛рд╣рд░реБ:

... рд░ рджрд░реНрдЬрдиреМрдВ рдХрдо рдЬреНрдЮрд╛рдд рд╡реНрдпрдХреНрддрд┐рд╣рд░реВред

рдпреЛ рд╡рд┐рд╡рд┐рдзрддрд╛ рдмреАрдЪ рдЫрдиреЛрдЯ рд╕рдмреИ рд╕рдЬрд┐рд▓реЛ рдЫреИрдиред

рд░ рдореИрд▓реЗ рдЫрдиреМрдЯ рдирдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рддрд░ рд░рд╛рдореНрд░реЛ рдкреБрд░рд╛рдиреЛ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛рд▓рд╛рдИ рдУрдкрдирд╕реАрднреАрдорд╛ рдбрдХрд░рдорд╛ рдмреЗрд░реНрдиреБрд╣реЛрд╕реН рд░ рдХреНрд▓рд╛рдЙрдбрдорд╛ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред

рдпрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рдлрд╛рдЗрджрд╛ рд▓рдЪрд┐рд▓реЛрдкрди рд░ рдирд┐рдпрдиреНрддреНрд░рдг рд╣реЛ - рддрдкрд╛рдЗрдБ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ, рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рд╕рд░реНрднрд░ - рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдХреБрдиреИ рдкрдирд┐ рд╕рдирдХ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рд╕рд░реНрднрд░

рд╕реНрдерд╛рдиреАрдп рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрдХреЛ рд╕рд╛рде рд╕реБрд░реБ рдЧрд░реМрдВред

рдкрд░рдореНрдкрд░рд╛рдЧрдд рд░реВрдкрдорд╛ рдо REST API, OpenCV рд░ MobileSSD рдиреЗрдЯрд╡рд░реНрдХрдХреЛ рд▓рд╛рдЧрд┐ рдлреНрд▓рд╛рд╕реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред

рдбрдХрд░рдорд╛ рд╣рд╛рд▓рдХреЛ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдореИрд▓реЗ рдкрддреНрддрд╛ рд▓рдЧрд╛рдПрдБ рдХрд┐ OpenCV 4.1.2 рд▓реЗ рдореЛрдмрд╛рдЗрд▓ 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)

рд╕реНрдерд╛рдиреАрдп рдбрдХрд░рдорд╛ (рдзреЗрд░реИ рдЬрд╡рд╛рди рд▓реНрдпрд╛рдкрдЯрдкрдорд╛) рдпрд╕рд▓реЗ реж.рей рд╕реЗрдХреЗрдиреНрдб рд▓рд┐рдиреНрдЫ, рд░рд╛рд╕реНрдкрдмреЗрд░реАрдорд╛ - рей.релред

рдЧрдгрдирд╛ рд╕реБрд░реБ рдЧрд░реМрдВ:

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()

рдбрдХрд░ - реж.реи рд╕реЗрдХреЗрдиреНрдб, рд░рд╛рд╕реНрдкрдмреЗрд░реА - рез.ренред

рдЯреЗрдиреНрд╕рд░ рдирд┐рдХрд╛рд╕рд▓рд╛рдИ рдкрдвреНрди рдпреЛрдЧреНрдп 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 рд▓рд╛рдИ рд╕рд░реНрднрд░рдорд╛ рдбреНрд░реНрдпрд╛рдЧ рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрдиреМрдВред

рдбрдХрд░

рд╣рд╛рдореА рдЫрд╡рд┐ рд╕рдЩреНрдХрд▓рдиред

рдХреЛрдб рдХрдореНрдмреЗрдб рд░ рдкреЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдЫ Github, рдбрдХрд░рд▓реЗ рддреНрдпрд╣рд╛рдБрдмрд╛рдЯ рд╕рд┐рдзреИ рд▓рд┐рдиреЗрдЫред

рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореА рд░рд╛рд╕реНрдкрдмреЗрд░реАрдорд╛ рдЬрд╕реНрддреИ рдбреЗрдмрд┐рдпрди рд╕реНрдЯреНрд░реЗрдЪ рд▓рд┐рдиреЗрдЫреМрдВ - рд╣рд╛рдореА рдкреНрд░рдорд╛рдгрд┐рдд рдЯреЗрдХ рд╕реНрдЯреНрдпрд╛рдХрдмрд╛рдЯ рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрдиреЗ рдЫреИрдиреМрдВред

рддрдкрд╛рдИрдВрд▓реЗ рдлреНрд▓рд╛рд╕реНрдХ, рдкреНрд░реЛрдЯреЛрдмрдл, рдЕрдиреБрд░реЛрдзрд╣рд░реВ, opencv_python рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдореЛрдмрд╛рдЗрд▓ 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"]

╨Я╤А╨╛╤Б╤В╨╛╨╣ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рддред

рдбрдХрд░ рд╣рдмрдорд╛ рдкреНрд░рдХрд╛рд╢рди рдЧрд░реНрджреИ

рдбрдХрд░ рд░реЗрдЬрд┐рд╕реНрдЯреНрд░реАрд╣рд░реВ рдХреНрд▓рд╛рдЙрдб рдбрд┐рдЯреЗрдХреНрдЯрд░рд╣рд░реВ рднрдиреНрджрд╛ рдХрдо рдЧрддрд┐рдорд╛ рдЧреБрдгрд╛ рдЧрд░реНрджреИрдЫрдиреНред

рдЪрд┐рдиреНрддрд╛ рдирдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рд░реВрдврд┐рд╡рд╛рджреА рд░реВрдкрдорд╛ рдЬрд╛рдиреЗрдЫреМрдВ рдбрдХрд░рд╣рдм.

  1. рджрд░реНрддрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  2. рд▓рдЧ - рдЗрди:
    рдбрдХрд░ рд▓рдЧрдЗрди
  3. рд╕рд╛рд░реНрдердХ рдирд╛рдо рд▓рд┐рдПрд░ рдЖрдЙрдиреБрд╣реЛрд╕реН:
    рдбрдХрд░ рдЯреНрдпрд╛рдЧ opencv-detect tprlab/opencv-detect-ssd
  4. рд╕рд░реНрднрд░рдорд╛ рдЫрд╡рд┐ рдЕрдкрд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:
    рдбрдХрд░ рдкреБрд╢ tprlab/opencv-detect-ssd

рд╣рд╛рдореА рдХреНрд▓рд╛рдЙрдбрдорд╛ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ

рдХрдиреНрдЯреЗрдирд░ рдХрд╣рд╛рдБ рдЪрд▓рд╛рдЙрдиреЗ рдЫрдиреМрдЯ рдкрдирд┐ рдзреЗрд░реИ рдлрд░рд╛рдХрд┐рд▓реЛ рдЫред

рд╕рдмреИ рдареВрд▓рд╛ рдЦреЗрд▓рд╛рдбреАрд╣рд░реВ (рдЧреБрдЧрд▓, рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯ, рдЕрдореЗрдЬрди) рдкрд╣рд┐рд▓реЛ рд╡рд░реНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рдирд┐: рд╢реБрд▓реНрдХ рдорд╛рдЗрдХреНрд░реЛ-рдЗрдиреНрд╕реНрдЯреНрдпрд╛рдиреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реНрдЫрдиреНред
Microsoft Azure рд░ рдЧреБрдЧрд▓ рдХреНрд▓рд╛рдЙрдбрдХреЛ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдо рдкрдЫрд┐рд▓реНрд▓реЛрдорд╛ рдмрд╕реЗрдБ рдХрд┐рдирднрдиреЗ рдпреЛ рдЫрд┐рдЯреЛ рдмрдиреНрдж рднрдпреЛред

рдореИрд▓реЗ рдпрд╣рд╛рдБ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рд▓реЗрдЦреЗрдХреЛ рдЫреИрди, рдХрд┐рдирдХрд┐ рдпреЛ рднрд╛рдЧ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдкреНрд░рджрд╛рдпрдХрдХреЛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЫред

рдореИрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ,
рдирд┐рдореНрди рд╕реНрддрд░рд╣рд░реВ (рд╕рд╛рдЭрд╛ рд░ рд╕рдорд░реНрдкрд┐рдд) - реж.рек - реж.рел рд╕реЗрдХреЗрдиреНрдбред
рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░рд╣рд░реВ - 0.25 - 0.3ред
рдареАрдХ рдЫ, рд╕рдмреИрднрдиреНрджрд╛ рдЦрд░рд╛рдм рдЕрд╡рд╕реНрдерд╛рдорд╛ рдкрдирд┐, рдЬреАрддрд╣рд░реВ рддреАрди рдкрдЯрдХ рдЫрдиреН, рддрдкрд╛рдИрдВ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рднрд┐рдбрд┐рдпреЛ

рд╣рд╛рдореАрд▓реЗ рд░рд╛рд╕реНрдкрдмреЗрд░реАрдорд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг OpenCV рднрд┐рдбрд┐рдпреЛ рд╕реНрдЯреНрд░рд┐рдорд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ, 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 рдорд╛ рдмреЗрдиреНрдЪрдорд╛рд░реНрдХ рджреМрдбреЗрдВред

рдбрд┐рдЯреЗрдХреНрдЯрд░рдХреЛ рдЧрддрд┐ реж.рез рд╕реЗрдХреЗрдиреНрдб рднрдиреНрджрд╛ рдереЛрд░реИ рдврд┐рд▓реЛ рдерд┐рдпреЛ, рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдХрдордЬреЛрд░ рдореЗрд╕рд┐рдирдорд╛ рдХреНрд▓рд╛рдЙрдб рднрдиреНрджрд╛ реи-рей рдЧреБрдгрд╛ рдЫрд┐рдЯреЛ, рдЕрд░реНрдерд╛рддреН рео-реп рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХреЗрдиреНрдбред

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрдорд╛ рдХреНрд▓рд╛рдЙрдб рд╡рд╕реНрддреБ рдбрд┐рдЯреЗрдХреНрдЯрд░рдХреЛ рднрд┐рдбрд┐рдпреЛ

NCS рд▓реЗ рдореЛрдмрд╛рдЗрд▓ SSD рд╕рдВрд╕реНрдХрд░рдг 2018_01_28 рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдерд┐рдпреЛ рднрдиреНрдиреЗ рддрдереНрдпрд▓реЗ рдирддрд┐рдЬрд╛рд╣рд░реВрдорд╛ рднрдПрдХреЛ рднрд┐рдиреНрдирддрд╛рд▓рд╛рдИ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реЗрдХреЛ рдЫред

P.S. рдердк рд░реВрдкрдорд╛, рдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓реЗ рджреЗрдЦрд╛рдПрдХреЛ рдЫ рдХрд┐ 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 рдХреЛ рддреБрд▓рдирд╛рдорд╛ рдереЛрд░реИ рдХрдо рдЫрд┐рдЯреЛ, рддрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдордХреЛ рддреБрд▓рдирд╛рдорд╛ рдзреЗрд░реИ рдмрд▓рд┐рдпреЛред

рд▓рд╛рдн, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд░реИрдЦрд┐рдХ рдЫреИрди - рддреНрдпрд╣рд╛рдБ рдУрдкрдирд╕реАрднреА рдЫрд╡рд┐рд╣рд░реВрдХреЛ рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬреЗрд╕рди рд░ рдЧрд╣рд┐рд░реЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдУрднрд░рд▓реЗрд╣рд░реВ рдЫрдиреНред

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рд╕рдордЧреНрд░рдорд╛, рдкреНрд░рдпреЛрдЧрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпреЛ рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдкреБрдЧреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рдХрд┐ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВ рд╕рд╛рдзрд╛рд░рдг рдХреНрд▓рд╛рдЙрдбрдмрд╛рдЯ рдЯрд╛рдврд╛ рдЬрд╛рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рддрд░ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбреЗрд╕реНрдХрдЯрдк рд╡рд╛ рд╕реНрдерд╛рдиреАрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд░рд╛рдореНрд░реЛ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ, рд░ рдХреБрдиреИ рдЪрд╛рд▓ рдмрд┐рдирд╛ред

рд╕рдиреНрджрд░реНрдн

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди