рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрд╡рд░реАрд▓ рдХреНрд▓рд╛рдЙрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрдЯрд░рдЪрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ

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

рдЯреЗрд╕реНрд▓рд╛рдЪрд╛ рдСрдЯреЛрдкрд╛рдпрд▓рдЯ рд░рд╕реНрддрд╛ рдХрд╕рд╛ рдкрд╛рд╣рддреЛ рд╣реЗ рджрд╛рдЦрд╡рдгрд╛рд░рд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдЖрддрд╛ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдлрд┐рд░рдд рдЖрд╣реЗ.

рдбрд┐рдЯреЗрдХреНрдЯрд░рд╕рд╣ рд╕рдореГрджреНрдз рдХреЗрд▓реЗрд▓рд╛ рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд░рд┐рдЕрд▓ рдЯрд╛рдЗрдордордзреНрдпреЗ рдорд▓рд╛ рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рдЦрд╛рдЬ рд╕реБрдЯрд▓реА рдЖрд╣реЗ.

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрд╡рд░реАрд▓ рдХреНрд▓рд╛рдЙрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрдЯрд░рдЪрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ

рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА рдорд▓рд╛ рд░рд╛рд╕реНрдкрдмреЗрд░реА рд╡рд░реВрди рд╡реНрд╣рд┐рдбрд┐рдУ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рд╛рдпрдЪрд╛ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░реАрд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдЯреЗрдХреНрдЯрд░рдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдЦреВрдк рд╣рд╡реЗ рдЖрд╣реЗ.

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

рдореА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЙрдкрд╛рдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХреЗрд▓рд╛.

╨Т рд╢реЗрд╡рдЯрдЪрд╛ рд▓реЗрдЦ рдЗрдВрдЯреЗрд▓ рдиреНрдпреВрд░рд▓ рдХреЙрдореНрдкреНрдпреБрдЯрд░ рд╕реНрдЯрд┐рдХрдЪрд╛ рдкреНрд░рдпреЛрдЧ рдХреЗрд▓рд╛. рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреНрдпрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрд╡рд░реВрдк рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдЬрд░реА рдЗрдВрдЯреЗрд▓ рдкреНрд░рдореБрдЦ рдлреНрд░реЗрдорд╡рд░реНрдХрд╕рд╛рдареА рдХрдиреНрд╡реНрд╣рд░реНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ, рддрд░реАрд╣реА рдЕрдиреЗрдХ рддреЛрдЯреЗ рдЖрд╣реЗрдд.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрд╡рд╢реНрдпрдХ рдиреЗрдЯрд╡рд░реНрдХрдЪреЗ рд╕реНрд╡рд░реВрдк рд╡рд┐рд╕рдВрдЧрдд рдЕрд╕реВ рд╢рдХрддреЗ рдЖрдгрд┐ рддреЗ рд╕реБрд╕рдВрдЧрдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдХрд╛рд╣реА рд╕реНрддрд░ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕рд╡рд░ рд╕рдорд░реНрдерд┐рдд рдирд╕рддреАрд▓ рдЖрдгрд┐ рдЬрд░ рддреЗ рд╕рдорд░реНрдерд┐рдд рдЕрд╕рддреАрд▓, рддрд░ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпреЗрджрд░рдореНрдпрд╛рди рддреНрд░реБрдЯреА рдЙрджреНрднрд╡реВ рд╢рдХрддрд╛рдд, рдкрд░рд┐рдгрд╛рдореА рдЖрдКрдЯрдкреБрдЯрд╡рд░ рдХрд╛рд╣реА рд╡рд┐рдЪрд┐рддреНрд░ рдЧреЛрд╖реНрдЯреА рдорд┐рд│рддрд╛рдд.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рд╣рд╡реЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рддреЗ NCS рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рдореНрд╣рдгреВрди, рдореА рд╕рд░реНрд╡рд╛рдд рд╡реНрдпрд╛рдкрдХ рдЖрдгрд┐ рдкреНрд░рд╡реЗрд╢рдпреЛрдЧреНрдп рд╕рд╛рдзрдиреЗ рд╡рд╛рдкрд░реВрди рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛.

рдврдЧ

рд╕реНрдерд╛рдирд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рд╕реЛрд▓реНрдпреВрд╢рдирдЪрд╛ рд╕реНрдкрд╖реНрдЯ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рдХреНрд▓рд╛рдЙрдбрд╡рд░ рдЬрд╛рдгреЗ.

рддрдпрд╛рд░ рдкрд░реНрдпрд╛рдп - рдорд╛рдЭреЗ рдбреЛрд│реЗ рдЬрдВрдЧрд▓реА рдЪрд╛рд▓рддрд╛рдд.

рд╕рд░реНрд╡ рдиреЗрддреЗ:

... рдЖрдгрд┐ рдбрдЭрдирднрд░ рдХрдореА рдЬреНрдЮрд╛рдд.

рдпрд╛ рд╡рд┐рд╡рд┐рдзрддреЗрдкреИрдХреА рдирд┐рд╡рдбрдгреЗ рдЕрдЬрд┐рдмрд╛рдд рд╕реЛрдкреЗ рдирд╛рд╣реА.

рдЖрдгрд┐ рдореА рдирд┐рд╡рдбрд╛рдпрдЪреЗ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдбреЙрдХрд░рдордзреАрд▓ OpenCV рд╡рд░ рдЪрд╛рдВрдЧрд▓реА рдЬреБрдиреА рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдЧреБрдВрдбрд╛рд│рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдбрдордзреНрдпреЗ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛.

рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪрд╛ рдлрд╛рдпрджрд╛ рдореНрд╣рдгрдЬреЗ рд▓рд╡рдЪрд┐рдХрддрд╛ рдЖрдгрд┐ рдирд┐рдпрдВрддреНрд░рдг - рдЖрдкрдг рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ, рд╣реЛрд╕реНрдЯрд┐рдВрдЧ, рд╕рд░реНрд╡реНрд╣рд░ - рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдХреЛрдгрддреНрдпрд╛рд╣реА рд▓рд╣рд░реА рдмрджрд▓реВ рд╢рдХрддрд╛.

╨б╨╡╤А╨▓╨╡╤А

рдЪрд▓рд╛ рд╕реНрдерд╛рдирд┐рдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд╕рд╣ рдкреНрд░рд╛рд░рдВрдн рдХрд░реВрдпрд╛.

рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХрдкрдгреЗ рдореА 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)

рд╕реНрдерд╛рдирд┐рдХ рдбреЙрдХрд░рд╡рд░ (рдЦреВрдк рддрд░реБрдг рдирд╕рд▓реЗрд▓реНрдпрд╛ рд▓реЕрдкрдЯреЙрдкрд╡рд░) рдпрд╛рд╕ 0.3 рд╕реЗрдХрдВрдж рд▓рд╛рдЧрддрд╛рдд, рд░рд╛рд╕реНрдкрдмреЗрд░реАрд╡рд░ - 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 рдбреНрд░реЕрдЧ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА.

рдбреЙрдХрд░

рдЖрдореНрд╣реА рдкреНрд░рддрд┐рдорд╛ рдЧреЛрд│рд╛ рдХрд░рддреЛ.

рдХреЛрдб combed рдЖрдгрд┐ рд╡рд░ рдкреЛрд╕реНрдЯ рдЖрд╣реЗ рдЧрд┐рдереБрдм, рдбреЙрдХрд░ рддреЗрдереВрди рдереЗрдЯ рдШреЗрдИрд▓.

рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреНрд░рдорд╛рдгреЗрдЪ рдбреЗрдмрд┐рдпрди рд╕реНрдЯреНрд░реЗрдЪ рдШреЗрдК - рдЖрдореНрд╣реА рд╕рд┐рджреНрдз рддрдВрддреНрд░рдЬреНрдЮрд╛рди рд╕реНрдЯреЕрдХрдкрд╛рд╕реВрди рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА.

рддреБрдореНрд╣рд╛рд▓рд╛ рдлреНрд▓рд╛рд╕реНрдХ, рдкреНрд░реЛрдЯреЛрдмрдл, рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ, 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

рдЖрдореНрд╣реА рдХреНрд▓рд╛рдЙрдбрдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХрд░рддреЛ

рдХрдВрдЯреЗрдирд░ рдХреБрдареЗ рдЪрд╛рд▓рд╡рд╛рдпрдЪрд╛ рдпрд╛рдЪреА рдирд┐рд╡рдб рджреЗрдЦреАрд▓ рдЦреВрдк рд╡рд┐рд╕реНрддреГрдд рдЖрд╣реЗ.

рд╕рд░реНрд╡ рдореЛрдареЗ рдЦреЗрд│рд╛рдбреВ (Google, Microsoft, Amazon) рдкрд╣рд┐рд▓реНрдпрд╛ рд╡рд░реНрд╖рд╛рд╕рд╛рдареА рдорд╛рдпрдХреНрд░реЛ-рдЗрдВрд╕реНрдЯрдиреНрд╕ рдореЛрдлрдд рджреЗрддрд╛рдд.
Microsoft Azure рдЖрдгрд┐ Google Cloud рд╕рд╣ рдкреНрд░рдпреЛрдЧ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдореА рдирдВрддрд░рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рд╕реНрдерд┐рд░ рдЭрд╛рд▓реЛ рдХрд╛рд░рдг рддреЗ рдЕрдзрд┐рдХ рд╡реЗрдЧрд╛рдиреЗ рдЯреЗрдХ рдСрдл рдЭрд╛рд▓реЗ.

рдореА рдпреЗрдереЗ рд╕реВрдЪрдирд╛ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛ рдирд╛рд╣реАрдд, рдХрд╛рд░рдг рд╣рд╛ рднрд╛рдЧ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рджрд╛рддреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд╢рдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╣реЗ.

рдореА рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдЕрд░ рдкрд░реНрдпрд╛рдпрд╛рдВрдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛,
рдХрдореА рдкрд╛рддрд│реА (рд╕рд╛рдорд╛рдпрд┐рдХ рдЖрдгрд┐ рд╕рдорд░реНрдкрд┐рдд) - 0.4 - 0.5 рд╕реЗрдХрдВрдж.
рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрд╛рд░ - 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 рд╡рд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд╛рд▓рд╡рд▓рд╛.

рдбрд┐рдЯреЗрдХреНрдЯрд░рдЪрд╛ рд╡реЗрдЧ 0.1 рд╕реЗрдХрдВрджрд╛рдВрдкреЗрдХреНрд╖рд╛ рдереЛрдбрд╛ рдХрдореА рд╣реЛрддрд╛, рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдХрдордХреБрд╡рдд рдорд╢реАрдирд╡рд░реАрд▓ рдврдЧрд╛рдкреЗрдХреНрд╖рд╛ 2-3 рдкрдЯ рд╡реЗрдЧрд╡рд╛рди, рдореНрд╣рдгрдЬреЗ 8-9 рдлреНрд░реЗрдореНрд╕ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж.

рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИрд╡рд░реАрд▓ рдХреНрд▓рд╛рдЙрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрдЯрд░рдЪрд╛ рд╡реНрд╣рд┐рдбрд┐рдУ

NCS рдореЛрдмрд╛рдИрд▓ SSD рдЖрд╡реГрддреНрддреА 2018_01_28 рдЪрд╛рд▓рд╡рдд рд╣реЛрддреЗ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрд╡рд░реВрди рдкрд░рд┐рдгрд╛рдорд╛рдВрдордзреАрд▓ рдлрд░рдХ рд╕реНрдкрд╖реНрдЯ рдХреЗрд▓рд╛ рдЖрд╣реЗ.

PS рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдкреНрд░рдпреЛрдЧрд╛рдВрдиреА рджрд░реНрд╢рд╡рд┐рд▓реЗ рдЖрд╣реЗ рдХреА 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛