เชฐเชพเชธเซเชชเชฌเซ‡เชฐเซ€ เชชเซ€ เชชเชฐ เช•เซเชฒเชพเช‰เชก เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชกเชฟเชŸเซ‡เช•เซเชŸเชฐเชจเซ‹ เชตเชฟเชกเชฟเช“

เชชเซเชฐเชธเซเชคเชพเชตเชจเชพ

เชŸเซ‡เชธเซเชฒเชพเชจเชพ เช“เชŸเซ‹เชชเชพเชฏเชฒเชŸ เชฐเชธเซเชคเชพเชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเซเช เช›เซ‡ เชคเซ‡ เชฆเชฐเซเชถเชพเชตเชคเซ‹ เชเช• เชตเซ€เชกเชฟเชฏเซ‹ เชนเชตเซ‡ เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เชซเชฐเชคเซ‹ เชฅเชˆ เชฐเชนเซเชฏเซ‹ เช›เซ‡.

เชฎเชจเซ‡ เชกเชฟเชŸเซ‡เช•เซเชŸเชฐ เชธเชพเชฅเซ‡ เชธเชฎเซƒเชฆเซเชง เชตเชฟเชกเชฟเช“ เชชเซเชฐเชธเชพเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เช–เช‚เชœเชตเชพเชณ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฏเชฎเชพเช‚.

เชฐเชพเชธเซเชชเชฌเซ‡เชฐเซ€ เชชเซ€ เชชเชฐ เช•เซเชฒเชพเช‰เชก เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชกเชฟเชŸเซ‡เช•เซเชŸเชฐเชจเซ‹ เชตเชฟเชกเชฟเช“

เชธเชฎเชธเซเชฏเชพ เช เช›เซ‡ เช•เซ‡ เชนเซเช‚ เชฐเชพเชธเซเชชเชฌเซ‡เชฐเซ€เชฎเชพเช‚เชฅเซ€ เชตเชฟเชกเชฟเช“ เชชเซเชฐเชธเชพเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚, เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชจเซเชฏเซเชฐเชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชกเชฟเชŸเซ‡เช•เซเชŸเชฐเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เช‡เชšเซเช›เชฟเชค เชฅเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซเช‚ เช›เซ‹เชกเซ€ เชฆเซ‡ เช›เซ‡.

เช‡เชจเซเชŸเซ‡เชฒ เชจเซเชฏเซเชฐเชฒ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชธเซเชŸเชฟเช•

เชฎเซ‡เช‚ เชตเชฟเชตเชฟเชง เช‰เช•เซ‡เชฒเซ‹ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ.

ะ’ เช›เซ‡เชฒเซเชฒเชพ เชฒเซ‡เช– เช‡เชจเซเชŸเซ‡เชฒ เชจเซเชฏเซเชฐเชฒ เช•เชฎเซเชชเซเชฏเซเชŸเชฐ เชธเซเชŸเชฟเช• เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹. เชนเชพเชฐเซเชกเชตเซ‡เชฐ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชญเชฒเซ‡ เช‡เชจเซเชŸเซ‡เชฒ เชฎเซเช–เซเชฏ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชฎเชพเชŸเซ‡ เช•เชจเซเชตเชฐเซเชŸเชฐ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเช‚ เช˜เชฃเซ€ เชฌเชงเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเชฐเซ‚เชฐเซ€ เชจเซ‡เชŸเชตเชฐเซเช•เชจเซเช‚ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เช…เชธเช‚เช—เชค เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชœเซ‹ เชคเซ‡ เชธเซเชธเช‚เช—เชค เชนเซ‹เชฏ, เชคเซ‹ เช•เซ‡เชŸเชฒเชพเช• เชธเซเชคเชฐเซ‹ เช‰เชชเช•เชฐเชฃ เชชเชฐ เชธเชฎเชฐเซเชฅเชฟเชค เชจ เชนเซ‹เชˆ เชถเช•เซ‡, เช…เชจเซ‡ เชœเซ‹ เชคเซ‡ เชธเชฎเชฐเซเชฅเชฟเชค เชนเซ‹เชฏ, เชคเซ‹ เชชเช›เซ€ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชญเซ‚เชฒเซ‹ เช†เชตเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เช…เชฎเชจเซ‡ เช†เช‰เชŸเชชเซเชŸ เชชเชฐ เช•เซ‡เชŸเชฒเซ€เช• เชตเชฟเชšเชฟเชคเซเชฐ เชตเชธเซเชคเซเช“ เชฎเชณเซ‡ เช›เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เชœเซ‹ เชคเชฎเชจเซ‡ เช•เซ‹เชˆ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชฎเชจเชธเซเชตเซ€ เชจเซเชฏเซเชฐเชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชœเซ‹เชˆเช เช›เซ‡, เชคเซ‹ เชคเซ‡ 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)

เชธเซเชฅเชพเชจเชฟเช• เชกเซ‹เช•เชฐ เชชเชฐ (เช–เซ‚เชฌ เชœเซเชตเชพเชจ เชฒเซ‡เชชเชŸเซ‹เชช เชชเชฐ) เชคเซ‡ 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

เช†เช—เชณ เชซเซเชฒเชพเชธเซเช• เชฆเซเชตเชพเชฐเชพ เช† เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เชจเชฟเช•เชพเชธ เช•เชฐเซ‹(เช‡เชจเชชเซเชŸ เชเช• เชšเชฟเชคเซเชฐ เช›เซ‡, เช†เช‰เชŸเชชเซเชŸ เช json เชฎเชพเช‚ เชกเชฟเชŸเซ‡เช•เซเชŸเชฐเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช›เซ‡).

เชเช• เชตเซˆเช•เชฒเซเชชเชฟเช• เชตเชฟเช•เชฒเซเชช, เชœเซ‡เชฎเชพเช‚ เชตเชงเซ เช•เชพเชฐเซเชฏ เชธเชฐเซเชตเชฐ เชชเชฐ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡: เชคเซ‡ เชชเซ‹เชคเซ‡ เชฎเชณเซ‡เชฒเซ€ เชตเชธเซเชคเซเช“เชจเซ‡ เชตเชฐเซเชคเซเชณ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเซ‡เชฒเซ€ เช›เชฌเซ€ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡.

เช† เชตเชฟเช•เชฒเซเชช เชธเชพเชฐเซ‹ เช›เซ‡ เชœเซเชฏเชพเช‚ เช†เชชเชฃเซ‡ opencv เชจเซ‡ เชธเชฐเซเชตเชฐ เชชเชฐ เช–เซ‡เช‚เชšเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€.

เชกเซ‹เช•เชฐ

เช…เชฎเซ‡ เช›เชฌเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช.

เช•เซ‹เชก เช•เซ‹เชฎเซเชฌเซ‡เชก เช…เชจเซ‡ เชชเชฐ เชชเซ‹เชธเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช—เซ€เชฅเชฌ, เชกเซ‹เช•เชฐ เชคเซ‡เชจเซ‡ เชคเซเชฏเชพเช‚เชฅเซ€ เชธเซ€เชงเซเช‚ เชฒเชˆ เชœเชถเซ‡.

เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชคเชฐเซ€เช•เซ‡, เช…เชฎเซ‡ เชฐเชพเชธเซเชชเชฌเซ‡เชฐเซ€เชจเซ€ เชœเซ‡เชฎ เชœ เชกเซ‡เชฌเชฟเชฏเชจ เชธเซเชŸเซเชฐเซ‡เชš เชฒเชˆเชถเซเช‚ - เช…เชฎเซ‡ เชธเชพเชฌเชฟเชค เชŸเซ‡เช• เชธเซเชŸเซ‡เช•เชฅเซ€ เชตเชฟเชšเชฒเชฟเชค เชฅเชˆเชถเซเช‚ เชจเชนเซ€เช‚.

เชคเชฎเชพเชฐเซ‡ เชซเซเชฒเชพเชธเซเช•, เชชเซเชฐเซ‹เชŸเซ‹เชฌเชซ, เชตเชฟเชจเช‚เชคเซ€เช“, 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) เชชเซเชฐเชฅเชฎ เชตเชฐเซเชท เชฎเชพเชŸเซ‡ เชฎเชซเชคเชฎเชพเช‚ เชฎเชพเช‡เช•เซเชฐเซ‹-เช‡เชจเซเชธเซเชŸเชจเซเชธ เช“เชซเชฐ เช•เชฐเซ‡ เช›เซ‡.
เชฎเชพเชˆเช•เซเชฐเซ‹เชธเซ‹เชซเซเชŸ เชเชเซเชฏเซเชฐ เช…เชจเซ‡ เช—เซ‚เช—เชฒ เช•เซเชฒเชพเช‰เชก เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชฌเชพเชฆเชฎเชพเช‚ เชธเซ‡เชŸเชฒ เช•เชฐเซเชฏเซเช‚ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชเชกเชชเชฅเซ€ เช‰เชชเชกเซเชฏเซเช‚.

เชฎเซ‡เช‚ เช…เชนเซ€เช‚ เชธเซ‚เชšเชจเชพเช“ เชฒเช–เซ€ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เช† เชญเชพเช— เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เชชเซเชฐเชฆเชพเชคเชพ เชฎเชพเชŸเซ‡ เช–เซ‚เชฌ เชœ เชตเชฟเชถเชฟเชทเซเชŸ เช›เซ‡.

เชฎเซ‡เช‚ เชตเชฟเชตเชฟเชง เชนเชพเชฐเซเชกเชตเซ‡เชฐ เชตเชฟเช•เชฒเซเชชเซ‹ เช…เชœเชฎเชพเชตเซเชฏเชพ,
เชจเซ€เชšเชพ เชธเซเชคเชฐเซ‹ (เชถเซ‡เชฐ เช•เชฐเซ‡เชฒ เช…เชจเซ‡ เชธเชฎเชฐเซเชชเชฟเชค) - 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹