ื•ื•ื™ื“ืขื ืคื•ืŸ ืงืœืึธื•ื“ ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ Raspberry Pi

ืคึผืจืึธืœืึธื’

ื ื•ื•ื™ื“ืขื ืื™ื– ืื™ืฆื˜ ืกืขืจืงื™ืึทืœื™ื™ื˜ื™ื“ ืื•ื™ืฃ ื“ื™ ืื™ื ื˜ืขืจื ืขื˜ ื•ื•ืึธืก ื•ื•ื™ื™ึทื–ืŸ ื•ื•ื™ ื˜ืขืกืœืึท ืก ืึทื•ื˜ืึธืคึผื™ืœืึธื˜ ื–ืขื˜ ื“ืขื ื•ื•ืขื’.

ืื™ืš ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื™ื˜ืฉื™ื ื’ ืคึฟืึทืจ ืึท ืœืึทื ื’ ืฆื™ื™ึทื˜ ืฆื• ื‘ืจืึธื“ืงืึทืกื˜ ื•ื•ื™ื“ืขื ืขื ืจื™ื˜ืฉื˜ ืžื™ื˜ ืึท ื“ื™ื˜ืขืงื˜ืขืจ, ืื•ืŸ ืื™ืŸ ืคืึทืงื˜ื™ืฉ ืฆื™ื™ื˜.

ื•ื•ื™ื“ืขื ืคื•ืŸ ืงืœืึธื•ื“ ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ Raspberry Pi

ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ืึทื– ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื‘ืจืึธื“ืงืึทืกื˜ ื•ื•ื™ื“ืขื ืคึฟื•ืŸ Raspberry, ืื•ืŸ ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืคื•ืŸ ื“ื™ ื ืขื•ืจืึทืœ ื ืขืฅ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ ืขืก ืœืึธื–ืŸ ืคื™ืœ ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ืืœื˜.

ื™ื ื˜ืขืœ ื ืขื•ืจืึทืœ ืงืึธืžืคึผื™ื•ื˜ืขืจ ืฉื˜ืขืงืŸ

ืื™ืš ื‘ืื˜ืจืื›ื˜ ืคืึทืจืฉื™ื“ืขื ืข ืกืึทืœื•ืฉืึทื ื–.

ะ’ ืœืขืฆื˜ืข ืึทืจื˜ื™ืงืœ ืขืงืกืคึผืขืจื™ืžืขื ื˜ืขื“ ืžื™ื˜ Intel Neural Computer Stick. ื“ื™ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืื™ื– ืฉื˜ืึทืจืง, ืึธื‘ืขืจ ืจื™ืงื•ื•ื™ื™ืขืจื– ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื ืขืฅ ืคึฟืึธืจืžืึทื˜.

ื›ืึธื˜ืฉ Intel ื’ื™ื˜ ืงืึทื ื•ื•ืขืจื˜ืขืจื– ืคึฟืึทืจ ื”ื•ื™ืคึผื˜ ืคืจืึทืžืขื•ื•ืึธืจืงืก, ืขืก ื–ืขื ืขืŸ ืึท ื ื•ืžืขืจ ืคื•ืŸ ืคึผื™ื˜ืคืึธืœื–.

ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ื™ ืคึฟืึธืจืžืึทื˜ ืคื•ืŸ ื“ื™ ืคืืจืœืื ื’ื˜ ื ืขืฅ ืงืขืŸ ื–ื™ื™ืŸ ื™ื ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ, ืื•ืŸ ืื•ื™ื‘ ืขืก ืื™ื– ืงืึทืžืคึผืึทื˜ืึทื‘ืึทืœ, ืขื˜ืœืขื›ืข ืœื™ื™ึทืขืจืก ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื’ืขืฉื˜ื™ืฆื˜ ืื•ื™ืฃ ื“ื™ ืžื™ื˜ืœ, ืื•ืŸ ืื•ื™ื‘ ื–ื™ื™ ื–ืขื ืขืŸ ื’ืขืฉื˜ื™ืฆื˜, ืขืจืจืึธืจืก ืงืขืŸ ืคึผืึทืกื™ืจืŸ ื‘ืขืฉืึทืก ื“ื™ ืงืึทื ื•ื•ืขืจื–ืฉืึทืŸ ืคึผืจืึธืฆืขืก, ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ื•ื•ืึธืก ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืขื˜ืœืขื›ืข ืžืึธื“ื ืข ื–ืื›ืŸ ืื™ืŸ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜.

ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืึท ืึทืจื‘ื™ื˜ืจืึทืจื™ืฉ ื ืขื•ืจืึทืœ ื ืขืฅ, ืขืก ืงืขืŸ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ NCS. ื“ืขืจื™ื‘ืขืจ, ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืคึผืจืึธื‘ืœืขื ืžื™ื˜ ื“ื™ ืžืขืจืกื˜ ื•ื•ื™ื™ื“ืกืคึผืจืขื“ ืื•ืŸ ืฆื•ื˜ืจื™ื˜ืœืขืš ืžื›ืฉื™ืจื™ื.

ื•ื•ืึธืœืงืŸ

ื“ื™ ืงืœืึธืจ ื•ื•ื™ ื“ืขืจ ื˜ืึธื’ ืื ื“ืขืจ ื‘ืจื™ืจื” ืฆื• ืึท ื”ื™ื’ืข ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืœื™ื™ื–ื•ื ื’ ืื™ื– ืฆื• ื’ื™ื™ืŸ ืฆื• ื“ื™ ื•ื•ืึธืœืงืŸ.

ื’ืจื™ื™ื˜-ื’ืขืžืื›ื˜ ืึธืคึผืฆื™ืขืก - ืžื™ื™ืŸ ืื•ื™ื’ืŸ ืœื•ื™ืคืŸ ื•ื•ื™ืœื“.

ืืœืข ืžื ื”ื™ื’ื™ื:

... ืื•ืŸ ืฆืขื ื“ืœื™ืงืขืจ ื•ื•ื™ื™ื ื™ืงืขืจ ื‘ืึทืงืึทื ื˜ืข.

ื˜ืฉื•ื–ื™ื ื’ ืฆื•ื•ื™ืฉืŸ ื“ืขื ืคืึทืจืฉื™ื™ื“ื ืงื™ื™ึทื˜ ืื™ื– ื ื™ืฉื˜ ื’ืจื™ื ื’.

ืื•ืŸ ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ื ื™ืฉื˜ ืฆื• ืงืœื™ื™ึทื‘ืŸ, ืึธื‘ืขืจ ืฆื• ื™ื™ึทื ื•ื•ื™ืงืœืขืŸ ื“ื™ ื’ื•ื˜ ืึทืœื˜ ืืจื‘ืขื˜ืŸ ืกื›ืขืžืข ืื•ื™ืฃ OpenCV ืื™ืŸ ื“ืึธืงืงืขืจ ืื•ืŸ ืœื•ื™ืคืŸ ืขืก ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ.

ื“ื™ ืžื™ื™ึทืœืข ืคื•ืŸ โ€‹โ€‹ื“ืขื ืฆื•ื’ืึทื ื’ ืื™ื– ื‘ื™ื™ื’ื™ืงื™ื™ึทื˜ ืื•ืŸ ืงืึธื ื˜ืจืึธืœ - ืื™ืจ ืงืขื ืขืŸ ื˜ื•ื™ืฉืŸ ื“ื™ ื ืขื•ืจืึทืœ ื ืขืฅ, ื”ืึธืกื˜ื™ื ื’, ืกืขืจื•ื•ืขืจ - ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืงื™ื™ืŸ ืงืึทืคึผืจื™ื–.

ืกืขืจื•ื•ื™ืจืขืจ

ื–ืืœ ืก ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ืึท ื”ื™ื’ืข ืคึผืจืึธื•ื˜ืึทื˜ื™ื™ืคึผ.

ื˜ืจืึทื“ื™ืฉืึทื ืึทืœื™ ืื™ืš ื ื•ืฆืŸ Flask ืคึฟืึทืจ REST API, OpenCV ืื•ืŸ MobileSSD ื ืขืฅ.

ืื™ืš ื”ืึธื‘ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืงืจืึทื ื˜ ื•ื•ืขืจืกื™ืขืก ืื•ื™ืฃ ื“ืึธืงืงืขืจ, ืื™ืš ื“ื™ืกืงืึทื•ื•ืขืจื“ ืึทื– 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 ืกืขืง, Raspberry - 1.7.

ื•ื•ืขื ื“ืŸ ื˜ืขื ืกืึธืจ ื•ื™ืกืžืึทื˜ืขืจืŸ ืื™ืŸ ืœื™ื™ื ืขื•ื•ื“ื™ืง ื“ื–ืฉืกืึธืŸ:

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 ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจ.

ื“ืึธืงืขืจ

ืžื™ืจ ืงืœื™ื™ึทื‘ืŸ ื“ื™ ื‘ื™ืœื“.

ื“ืขืจ ืงืึธื“ ืื™ื– ืงืึธื•ืžื“ ืื•ืŸ ืึทืจื™ื™ึทื ื’ืขืฉื™ืงื˜ ืื•ื™ืฃ ื’ื™ื˜ื”ื•ื‘, ื“ืึธืงืขืจ ื•ื•ืขื˜ ื ืขืžืขืŸ ืขืก ื’ืœื™ื™ืš ืคึฟื•ืŸ ื“ืึธืจื˜.

ื•ื•ื™ ืึท ืคึผืœืึทื˜ืคืึธืจืžืข, ืžื™ืจ ื•ื•ืขืœืŸ ื ืขืžืขืŸ ื“ื™ ื–ืขืœื‘ืข ื“ืขื‘ื™ืึทืŸ ืกื˜ืจืขื˜ืฉ ื•ื•ื™ ืื•ื™ืฃ Raspberry - ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ืึธืคึผื ื™ื™ื’ืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื•ื•ืขืŸ ื˜ืขืง ืกื˜ืึทืง.

ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ืงืึธืœื‘ืข, ืคึผืจืึธื˜ืึธื‘ื•ืฃ, ืจื™ืงื•ื•ืขืก, opencv_python, ืืจืืคืงืืคื™ืข ืžืึธื‘ื™ืœ ืกืกื“, ืกืขืจื•ื•ืขืจ ืงืึธื“ ืคึฟื•ืŸ 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

ื“ืึธืงืงืขืจ ืจืขื’ื™ืกื˜ืจื™ื– ืžืึทืœื˜ืึทืคึผืœื™ื™ื™ื ื’ ืžื™ื˜ ืึท ื’ื™ื›ืงื™ื™ึทื˜ ื ื™ื˜ ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ื•ื•ืึธืœืงืŸ ื“ืขื˜ืขืงื˜ืึธืจืก.

ื›ึผื“ื™ ื ื™ืฉื˜ ืฆื• ืึทืจืŸ, ื•ื•ืขืœืŸ ืžื™ืจ ืงืึธื ืกืขืจื•ื•ืึทื˜ื™ื•ื• ื“ื•ืจื›ื’ื™ื™ืŸ DockerHub.

  1. ืจืขื’ื™ืกื˜ืจื™ืจืŸ
  2. ืฆื™ื™ื›ืŸ ืืจื™ื™ืŸ:
    ื“ืึธืงืงืขืจ ืœืึธื’ื™ืŸ
  3. ื–ืืœ ืก ืงื•ืžืขืŸ ืึทืจื•ื™ืฃ ืžื™ื˜ ืึท ืžื™ื ื™ื ื’ืคืึทืœ ื ืึธืžืขืŸ:
    docker tag opencv-detect tprlab/opencv-detect-ssd
  4. ืฆื•ืคึฟืขืœื™ืงืขืจ ื“ื™ ื‘ื™ืœื“ ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจ:
    ื“ืึธืงืงืขืจ ืฉื˜ื•ืคึผืŸ tprlab/opencv-detect-ssd

ืžื™ืจ ืงืึทื˜ืขืจ ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ

ื“ื™ ื‘ืจื™ืจื” ืคื•ืŸ ื•ื•ื• ืฆื• ืœื•ื™ืคืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ ืื™ื– ืื•ื™ืš ื’ืึทื ืฅ ื‘ืจื™ื™ื˜.

ืึทืœืข ื“ื™ ื’ืจื•ื™ืก ืคึผืœื™ื™ึทืขืจืก (ื’ื•ื’ืœ, ืžื™ื™ืงืจืึธืกืึธืคึฟื˜, ืึทืžืึทื–ืึธืŸ) ืคืึธืจืฉืœืึธื’ืŸ ืึท ืžื™ืงืจืึธ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคึฟืึทืจ ืคืจื™ื™ ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ื™ืึธืจ.
ื ืึธืš ืขืงืกืคึผืขืจื™ืžืขื ื˜ื™ื ื’ ืžื™ื˜ Microsoft Azure ืื•ืŸ Google Cloud, ืื™ืš ื’ืขื–ืขืฆื˜ ืื•ื™ืฃ ื“ื™ ื™ืขื ืขืจ ื•ื•ื™ื™ึทืœ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืคืึทืกื˜ืขืจ.

ืื™ืš ื”ืื‘ ื ื™ืฉื˜ ื’ืขืฉืจื™ื‘ืŸ ืื™ื ืกื˜ืจื•ืงืฆื™ืขืก ื“ืึธ, ื•ื•ื™ื™ึทืœ ื“ืขืจ ื˜ื™ื™ืœ ืื™ื– ื–ื™ื™ืขืจ ืกืคึผืขืฆื™ืคื™ืฉ ืคึฟืึทืจ ื“ื™ ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ ืฉืคึผื™ื™ึทื–ืขืจ.

ืื™ืš ื’ืขืคืจื•ื•ื•ื˜ ืคืึทืจืฉื™ื“ืขื ืข ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืึธืคึผืฆื™ืขืก,
ื ื™ื“ืขืจื™ืง ืœืขื•ื•ืขืœืก (ืฉืขืจื“ ืื•ืŸ ื“ืขื“ืึทืงื™ื™ื˜ืึทื“) - 0.4 - 0.5 ืกืขืงื•ื ื“ืขืก.
ืžืขืจ ืฉื˜ืึทืจืง ืงืึทืจืก - 0.25 - 0.3.
ื ื•, ืืคื™ืœื• ืื™ืŸ ื“ื™ ืขืจื’ืกื˜ ืคืึทืœ, ื“ื™ ื•ื•ื™ื ื™ื ื’ื– ื–ืขื ืขืŸ ื“ืจื™ื™ ืžืึธืœ, ืื™ืจ ืงืขื ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ.

ื•ื•ื™ื“ืขื

ืžื™ืจ ืงืึทื˜ืขืจ ืึท ืคึผืฉื•ื˜ OpenCV ื•ื•ื™ื“ืขื ืกื˜ืจื™ืžืขืจ ืื•ื™ืฃ Raspberry, ื“ื™ื˜ืขืงื˜ื™ื ื’ ื“ื•ืจืš Google ืงืœืึธื•ื“.
ืคึฟืึทืจ ื“ืขืจ ืขืงืกืคึผืขืจื™ืžืขื ื˜, ืึท ื•ื•ื™ื“ืขื ื˜ืขืงืข ืื™ื– ื’ืขื ื™ืฆื˜ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึทืžืึธืœ ืคื™ืœืžื“ ืื™ืŸ ืึท ื˜ืจืึทืค - ื™ื ื˜ืขืจืกืขืงืฉืึทืŸ.


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 ืจืึธืžืขืŸ ืคึผืขืจ ืกืขืงื•ื ื“ืข, ืึธื‘ืขืจ ื“ื™ ื—ื™ืœื•ืง ืื™ื– ื›ึผืžืขื˜ ื•ืžื–ืขื™ืง ืคึฟืึทืจ ื“ื™ ืื•ื™ื’, ืขืก ืื™ื– ื ืึธืš ืคึผืึทืžืขืœืขืš.

ื•ื•ื™ื“ืขื ืคื•ืŸ ืงืœืึธื•ื“ ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ Raspberry Pi

ื“ื™ ื•ื•ืึธืœืงืŸ ืื•ืŸ ื˜ืจืึทื ืกืคึผืขืจื˜ื™ื™ืฉืึทืŸ ืงืึธืก ื”ืึธื‘ืŸ ื’ืึธืจื ื™ืฉื˜ ืฆื• ื˜ืึธืŸ ืžื™ื˜ ืื™ื; ื“ืขืจ ื“ืขื˜ืขืงื˜ืึธืจ ืœื•ื™ืคื˜ ืื•ื™ืฃ ืจืขื’ื•ืœืขืจ ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืื•ืŸ ืึทืจื‘ืขื˜ ืžื™ื˜ ื“ืขืจ ื’ื™ื›ืงื™ื™ึทื˜.

ื ืขื•ืจืึทืœ ืงืึธืžืคึผื™ื•ื˜ืขืจ ืฉื˜ืขืงืŸ

ืื™ืš ืงืขืŸ ื ื™ืฉื˜ ืึทื ื˜ืงืขื’ื ืฉื˜ืขืœื  ื–ื™ืš ืื•ืŸ ืœื•ื™ืคืŸ ื“ื™ ื‘ืขื ื˜ืฉืžืึทืจืง ืื•ื™ืฃ NCS.

ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืคื•ืŸ ื“ื™ ื“ืขื˜ืขืงื˜ืึธืจ ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื‘ื™ืกืœ ืกืœืึธื•ืขืจ ื•ื•ื™ 0.1 ืกืขืงื•ื ื“ืขืก, ืื™ืŸ ืงื™ื™ืŸ ืคืึทืœ 2-3 ืžืืœ ืคืึทืกื˜ืขืจ ื•ื•ื™ ื“ื™ ื•ื•ืึธืœืงืŸ ืื•ื™ืฃ ืึท ืฉื•ื•ืึทืš ืžืึทืฉื™ืŸ, ื“"ื” 8-9 ืจืึธืžืขืŸ ืคึผืขืจ ืกืขืงื•ื ื“ืข.

ื•ื•ื™ื“ืขื ืคื•ืŸ ืงืœืึธื•ื“ ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ Raspberry Pi

ื“ืขืจ ื—ื™ืœื•ืง ืื™ืŸ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืื™ื– ื“ืขืจืงืœืขืจื˜ ื“ื•ืจืš ื“ื™ ืคืึทืงื˜ ืึทื– NCS ืื™ื– ืคืœื™ืกื ื“ื™ืง ืžืึธื‘ื™ืœ ืกืกื“ ื•ื•ืขืจืกื™ืข 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

ื“ืึธ ืก ื•ื•ืึธืก ื’ืขื˜ืจืืคืŸ:

ื•ื•ื™ื“ืขื ืคื•ืŸ ืงืœืึธื•ื“ ืึธื‘ื“ื–ืฉืขืงื˜ ื“ืขื˜ืขืงื˜ืึธืจ ืื•ื™ืฃ Raspberry Pi

ื ื‘ื™ืกืœ ื•ื•ื™ื™ื ื™ืงืขืจ ืฉื ืขืœ ื•ื•ื™ ืžื™ื˜ NCS, ืึธื‘ืขืจ ืžืขืจ ืงืจืึทืคื˜ื™ืง ื•ื•ื™ ืื™ืŸ ืื™ื™ืŸ ื˜ื™ื™ึทืš.

ื“ืขืจ ื’ืขื•ื•ื™ื ืก, ืคื•ืŸ ืงื•ืจืก, ืื™ื– ื ื™ืฉื˜ ืœื™ื ืขืึทืจ - ืขืก ื–ืขื ืขืŸ ืึธื•ื•ื•ืขืจืœื™ื™ื– ืคึฟืึทืจ ืกื™ื ื’ืงืจืึทื ืึทื–ื™ื™ืฉืึทืŸ ืื•ืŸ ื˜ื™ืฃ ืงืึทืคึผื™ื™ื ื’ ืคื•ืŸ ืึธืคึผืขื ืงื•ื• ื‘ื™ืœื“ืขืจ.

ืกืึธืฃ

ืงื•ื™ืœืขืœื“ื™ืง, ื“ืขืจ ืขืงืกืคึผืขืจื™ืžืขื ื˜ ืึทืœืึทื•ื– ืื•ื ื“ื– ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ ืึทื– ืื•ื™ื‘ ืื™ืจ ืคึผืจื•ื‘ื™ืจืŸ, ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ืึทื•ื•ืขืง ืžื™ื˜ ืึท ืคึผืฉื•ื˜ ื•ื•ืึธืœืงืŸ.

ืึธื‘ืขืจ ืึท ืฉื˜ืึทืจืง ื“ืขืกืงื˜ืึทืคึผ ืึธื“ืขืจ ื”ื™ื’ืข ื™ื™ึทื–ื ื•ื•ืึทืจื’ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื“ืขืจื’ืจื™ื™ื›ืŸ ื‘ืขืกืขืจ ืจืขื–ื•ืœื˜ืึทื˜ืŸ, ืื•ืŸ ืึธืŸ ืงื™ื™ืŸ ื˜ืจื™ืงืก.

ืจืขืคึฟืขืจืขื ืฆืŸ

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’