แžœแžธแžŠแŸแžขแžผแž“แŸƒ Cloud Object Detector แž“แŸ…แž›แžพ Raspberry Pi

Prologue

แžœแžธแžŠแŸแžขแžผแž˜แžฝแž™แž€แŸ†แž–แžปแž„แž…แžšแžถแž…แžšแž“แŸ…แž›แžพแžขแŸŠแžธแž“แž’แžบแžŽแžทแž แžŠแŸ‚แž›แž”แž„แŸ’แž แžถแž‰แž–แžธแžšแž”แŸ€แž”แžŠแŸ‚แž›แžขแŸ’แž“แž€แž”แžพแž€แž”แžšแžšแžแž™แž“แŸ’แž Tesla แž˜แžพแž›แžƒแžพแž‰แž•แŸ’แž›แžผแžœแŸ”

แžแŸ’แž‰แžปแŸ†โ€‹แž”แžถแž“โ€‹แžšแž˜แžถแžŸแŸ‹โ€‹แž‡แžถโ€‹แž™แžผแžšโ€‹แž˜แž€โ€‹แž แžพแž™โ€‹แž€แŸ’แž“แžปแž„โ€‹แž€แžถแžšโ€‹แž…แžถแž€แŸ‹โ€‹แž•แŸ’แžŸแžถแž™โ€‹แžœแžธแžŠแŸแžขแžผโ€‹แžŠแŸ‚แž›โ€‹แžŸแŸ†แž”แžผแžšโ€‹แžŠแŸ„แž™โ€‹แžงแž”แž€แžšแžŽแŸโ€‹แž…แžถแž”แŸ‹โ€‹แžŸแž‰แŸ’แž‰แžถ แž แžพแž™โ€‹แž€แŸ’แž“แžปแž„โ€‹แž–แŸแž›โ€‹แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แŸ”

แžœแžธแžŠแŸแžขแžผแž“แŸƒ Cloud Object Detector แž“แŸ…แž›แžพ Raspberry Pi

แž”แž‰แŸ’แž แžถแž‚แžบแžแžถแžแŸ’แž‰แžปแŸ†แž…แž„แŸ‹แž…แžถแž€แŸ‹แž•แŸ’แžŸแžถแž™แžœแžธแžŠแŸแžขแžผแž–แžธ Raspberry แž แžพแž™แž€แžถแžšแžŸแž˜แŸ’แžแŸ‚แž„แžšแž”แžŸแŸ‹แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แž”แžŽแŸ’แžแžถแž‰แžŸแžšแžŸแŸƒแž”แŸ’แžšแžŸแžถแž‘แž“แŸ…แž›แžพแžœแžถแž‘แžปแž€แžฑแŸ’แž™แž˜แžถแž“แž€แžถแžšแž…แž„แŸ‹แž”แžถแž“แž…แŸ’แžšแžพแž“แŸ”

Intel Neural Computer Stick

แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž–แžทแž…แžถแžšแžŽแžถแžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž•แŸ’แžŸแŸแž„แŸ—แŸ”

ะ’ แžขแžแŸ’แžแž”แž‘แž…แžปแž„แž€แŸ’แžšแŸ„แž™ แž–แžทแžŸแŸ„แž’แž“แŸแž‡แžถแž˜แžฝแž™ Intel Neural Computer Stick แŸ” แž แžถแžŠแžœแŸ‚แžšแž˜แžถแž“แžแžถแž˜แž–แž›แžแŸ’แž›แžถแŸ†แž„ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž‘แžถแž˜แž‘แžถแžšแž‘แž˜แŸ’แžšแž„แŸ‹แž”แžŽแŸ’แžแžถแž‰แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“แžšแž”แžŸแŸ‹แžœแžถแŸ”

แž‘แŸ„แŸ‡แž”แžธแž‡แžถ Intel แž•แŸ’แžแž›แŸ‹แžงแž”แž€แžšแžŽแŸแž”แŸ†แž”แŸ’แž›แŸ‚แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แŸ’แžšแž”แžแŸแžŽแŸ’แžŒแžŸแŸ†แžแžถแž“แŸ‹แŸ—แž€แŸแžŠแŸ„แž™ แžœแžถแž˜แžถแž“แžงแž”แžŸแž‚แŸ’แž‚แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แŸ”

แžงแž‘แžถแž แžšแžŽแŸ แž‘แŸ’แžšแž„แŸ‹แž‘แŸ’แžšแžถแž™แž“แŸƒแž”แžŽแŸ’แžแžถแž‰แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžถแžšแžขแžถแž…แž˜แžทแž“แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถ แž แžพแž™แž”แŸ’แžšแžŸแžทแž“แž”แžพแžœแžถแžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถ แž“แŸ„แŸ‡แžŸแŸ’แžšแž‘แžถแž”แŸ‹แž˜แžฝแž™แž…แŸ†แž“แžฝแž“แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžšแž“แŸ…แž›แžพแžงแž”แž€แžšแžŽแŸแž“แŸ„แŸ‡แž‘แŸ แž แžพแž™แž”แŸ’แžšแžŸแžทแž“แž”แžพแž–แžฝแž€แžœแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžš แž“แŸ„แŸ‡แž€แŸ†แž แžปแžŸแžขแžถแž…แž€แžพแžแžกแžพแž„แž€แŸ’แž“แžปแž„แžขแŸ†แžกแžปแž„แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ†แž”แŸ’แž›แŸ‚แž„ แžŠแŸ‚แž›แž‡แžถแž›แž‘แŸ’แž’แž•แž› แž™แžพแž„แž‘แž‘แžฝแž›แž”แžถแž“แžšแž”แžŸแŸ‹แž…แž˜แŸ’แž›แŸ‚แž€แžแŸ’แž›แŸ‡แž“แŸ…แžฏแž‘แžทแž“แŸ’แž“แž•แž›แŸ”

แž‡แžถแž‘แžผแž‘แŸ… แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แž”แžถแž“แž”แžŽแŸ’แžแžถแž‰แžŸแžšแžŸแŸƒแž”แŸ’แžšแžŸแžถแž‘แžแžถแž˜แžขแŸ†แž–แžพแž…แžทแžแŸ’แžแž˜แžฝแž™แž…แŸ†แž“แžฝแž“ แž“แŸ„แŸ‡แžœแžถแž”แŸ’แžšแž แŸ‚แž›แž‡แžถแž˜แžทแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ NCS แž‘แŸแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แž แžพแž™ แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแž–แŸ’แž™แžถแž™แžถแž˜แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแžŠแŸ„แž™แž”แŸ’แžšแžพแžงแž”แž€แžšแžŽแŸแžŠแŸ‚แž›แžšแžธแž€แžšแžถแž›แžŠแžถแž›แž”แŸ†แž•แžปแž แž“แžทแž„แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แŸ”

แž–แž–แž€

แž‡แž˜แŸ’แžšแžพแžŸแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž…แŸ†แž–แŸ„แŸ‡แžŠแŸ†แžŽแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž•แŸ’แž“แŸ‚แž€แžšแžนแž„แž€แŸ’แž“แžปแž„แžŸแŸ’แžšแžปแž€แž‚แžบแžแŸ’แžšแžผแžœแž…แžผแž›แž‘แŸ…แž€แžถแž“แŸ‹แž–แž–แž€แŸ”

แž‡แž˜แŸ’แžšแžพแžŸแžŠแŸ‚แž›แžแŸ’แžšแŸ€แž˜แžšแžฝแž…แž‡แžถแžŸแŸ’แžšแŸแž… - แž—แŸ’แž“แŸ‚แž€แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แžšแžแŸ‹แž–แŸ’แžšแŸƒแŸ”

แžขแŸ’แž“แž€แžŠแžนแž€แž“แžถแŸ†แž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ–

... แž แžพแž™แž˜แž“แžปแžŸแŸ’แžŸแžšแžถแž”แŸ‹แžŸแžทแž”แž“แžถแž€แŸ‹แžŠแŸ‚แž›แž˜แžทแž“แžŸแžผแžœแžŸแŸ’แž‚แžถแž›แŸ‹แŸ”

แž€แžถแžšแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แž–แžผแž‡แž“แŸแŸ‡แž‚แžบแž˜แžทแž“แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž‘แžถแž›แŸ‹แžแŸ‚แžŸแŸ„แŸ‡แŸ”

แž แžพแž™แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแž˜แžทแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแžพแž˜แŸ’แž”แžธแžšแžปแŸ†แž‚แŸ’แžšแŸ„แž„แž€แžถแžšแžŽแŸแž€แžถแžšแž„แžถแžšแž…แžถแžŸแŸ‹แžŠแŸแž›แŸ’แžขแž“แŸ…แž›แžพ OpenCV แž“แŸ…แž€แŸ’แž“แžปแž„ Docker แž แžพแž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžœแžถแž“แŸ…แž€แŸ’แž“แžปแž„แž–แž–แž€แŸ”

แžขแžแŸ’แžแž”แŸ’แžšแž™แŸ„แž‡แž“แŸแž“แŸƒแžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž“แŸแŸ‡แž‚แžบแž—แžถแž–แž”แžแŸ‹แž”แŸ‚แž“แž“แžทแž„แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ - แžขแŸ’แž“แž€แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž”แžŽแŸ’แžแžถแž‰แžŸแžšแžŸแŸƒแž”แŸ’แžšแžŸแžถแž‘, แž”แž„แŸ’แž แŸ„แŸ‡, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ - แž‡แžถแž‘แžผแž‘แŸ…, whim แžŽแžถแž˜แžฝแž™แŸ”

แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ

แž…แžผแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž‡แžถแž˜แžฝแž™แž“แžนแž„แž‚แŸ†แžšแžผแž€แŸ’แž“แžปแž„แžŸแŸ’แžšแžปแž€แŸ”

แž‡แžถแž”แŸ’แžšแž–แŸƒแžŽแžธแžแŸ’แž‰แžปแŸ†แž”แŸ’แžšแžพ 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)

แž“แŸ…แž›แžพ docker แž€แŸ’แž“แžปแž„แžŸแŸ’แžšแžปแž€ (แž“แŸ…แž›แžพแž€แžปแŸ†แž–แŸ’แž™แžผแž‘แŸแžšแž™แžฝแžšแžŠแŸƒแžŠแŸ‚แž›แž˜แžทแž“แž€แŸ’แž˜แŸแž„แžแŸ’แž›แžถแŸ†แž„) แžœแžถแž…แŸ†แžŽแžถแž™แž–แŸแž› 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()

Docker - 0.2 แžœแžท, Raspberry - 1.7 แŸ”

แž”แŸ†แž›แŸ‚แž„ tensor exhaust แž‘แŸ…แž‡แžถ 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

แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแŸ” แž“แžถแŸ†แž…แŸแž‰แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž“แŸแŸ‡แžแžถแž˜แžšแž™แŸˆ Flask(แž€แžถแžšแž”แž‰แŸ’แž…แžผแž›แž‚แžบแž‡แžถแžšแžผแž”แž—แžถแž– แž›แž‘แŸ’แž’แž•แž›แž‚แžบแž‡แžถแž›แž‘แŸ’แž’แž•แž›แžšแž”แžŸแŸ‹แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„ json)แŸ”

แž‡แž˜แŸ’แžšแžพแžŸแž‡แŸ†แž“แžฝแžŸ แžŠแŸ‚แž›แž€แŸ’แž“แžปแž„แž“แŸ„แŸ‡แž€แžถแžšแž„แžถแžšแž€แžถแž“แŸ‹แžแŸ‚แž…แŸ’แžšแžพแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžแžผแžšแž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ– แžแŸ’แž›แžฝแž“แžœแžถแž‚แžผแžŸแžšแž„แŸ’แžœแž„แŸ‹แžœแžแŸ’แžแžปแžŠแŸ‚แž›แž”แžถแž“แžšแž€แžƒแžพแž‰ แž แžพแž™แžแŸ’แžšแžกแž”แŸ‹แžšแžผแž”แž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž…แž”แŸ‹แŸ”

แž‡แž˜แŸ’แžšแžพแžŸแž“แŸแŸ‡แž‚แžบแž›แŸ’แžขแžŠแŸ‚แž›แž™แžพแž„แž˜แžทแž“แž…แž„แŸ‹แžขแžผแžŸ opencv แž‘แŸ…แž€แžถแž“แŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ”

Docker

แž™แžพแž„แž”แŸ’แžšแž˜แžผแž›แžšแžผแž”แž—แžถแž–แŸ”

แž€แžผแžŠโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แžŸแžทแžโ€‹แž แžพแž™โ€‹แž”แž„แŸ’แž แŸ„แŸ‡ Github, docker แž“แžนแž„แž™แž€แžœแžถแžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž–แžธแž‘แžธแž“แŸ„แŸ‡แŸ”

แž‡แžถแžœแŸแž‘แžทแž€แžถแž˜แžฝแž™ แž™แžพแž„แž“แžนแž„แž™แž€ Debian Stretch แžŠแžผแž…แž“แŸ…แž›แžพ Raspberry - แž™แžพแž„แž“แžนแž„แž˜แžทแž“แž„แžถแž€แž…แŸแž‰แž–แžธแž‡แž„แŸ‹แž”แž…แŸ’แž…แŸแž€แžœแžทแž‘แŸ’แž™แžถแžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž‡แžถแž€แŸ‹แž“แŸ„แŸ‡แž‘แŸแŸ”

แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžŠแŸ†แžกแžพแž„ flask, protobuf, แžŸแŸ†แžŽแžพ, opencv_python, แž‘แžถแž‰แž™แž€ Mobile SSD, server code แž–แžธ Github แž แžพแž™แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ serverแŸ”

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 แž€แŸ†แž–แžปแž„แž€แžพแž“แžกแžพแž„แž€แŸ’แž“แžปแž„แž›แŸ’แž”แžฟแž“แž˜แžทแž“แžแžทแž…แž‡แžถแž„แžงแž”แž€แžšแžŽแŸแžšแžถแžœแžšแž€แž–แž–แž€แž‘แŸแŸ”

แžŠแžพแž˜แŸ’แž”แžธแž€แžปแŸ†แžฑแŸ’แž™แžšแŸ†แžแžถแž“แž™แžพแž„แž“แžนแž„แžขแž—แžทแžšแž€แŸ’แžŸ DockerHub.

  1. แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡
  2. แž…แžผแž›:
    แž…แžผแž› docker
  3. แžแŸ„แŸ‡แž˜แž€แžŸแŸ’แž‚แžถแž›แŸ‹แžˆแŸ’แž˜แŸ„แŸ‡แžŠแŸ‚แž›แž˜แžถแž“แžขแžแŸ’แžแž“แŸแž™แŸ–
    แžŸแŸ’แž›แžถแž€ docker opencv-detect tprlab/opencv-detect-ssd
  4. แž”แž„แŸ’แž แŸ„แŸ‡แžšแžผแž”แž—แžถแž–แž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ–
    docker แžšแžปแž‰ tprlab/opencv-detect-ssd

แž™แžพแž„แž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแž–แž–แž€

แž‡แž˜แŸ’แžšแžพแžŸแž“แŸƒแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แžปแž„แžแžบแž“แŸแžšแž€แŸแž’แŸ†แž‘แžผแž›แžถแž™แž•แž„แžŠแŸ‚แžšแŸ”

แžขแŸ’แž“แž€แž›แŸแž„แž’แŸ†แŸ—แž‘แžถแŸ†แž„แžขแžŸแŸ‹ (Google, Microsoft, Amazon) แž•แŸ’แžแž›แŸ‹แž‡แžผแž“ micro-instance แžŠแŸ„แž™แžฅแžแž‚แžทแžแžแŸ’แž›แŸƒแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž†แŸ’แž“แžถแŸ†แžŠแŸ†แž”แžผแž„แŸ”
แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž”แžถแž“แžŸแžถแž€แž›แŸ’แž”แž„แž‡แžถแž˜แžฝแž™ 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 แž แŸ’แžœแŸ’แžšแŸแž˜แž€แŸ’แž“แžปแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแž‚แžบแžŸแŸ’แž‘แžพแžšแžแŸ‚แž˜แžพแž›แž˜แžทแž“แžƒแžพแž‰แžŠแŸ„แž™แž—แŸ’แž“แŸ‚แž€ แžœแžถแž“แŸ…แžแŸ‚แž™แžบแžแŸ”

แžœแžธแžŠแŸแžขแžผแž“แŸƒ Cloud Object Detector แž“แŸ…แž›แžพ Raspberry Pi

แž–แž–แž€ แž“แžทแž„แžแŸ’แž›แŸƒแžŠแžนแž€แž‡แž‰แŸ’แž‡แžผแž“แž˜แžทแž“แž˜แžถแž“แž‡แžถแž”แŸ‹แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’แž‡แžถแž˜แžฝแž™แžœแžถแž‘แŸ แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแž•แŸ’แž“แŸ‚แž€แžšแžนแž„แž’แž˜แŸ’แž˜แžแžถ แž แžพแž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„แž›แŸ’แž”แžฟแž“แž“แŸ„แŸ‡แŸ”

Neural Computer Stick

แžแŸ’แž‰แžปแŸ†โ€‹แž˜แžทแž“โ€‹แžขแžถแž…โ€‹แž‘แž”แŸ‹แž‘แž›แŸ‹โ€‹แž“แžทแž„โ€‹แž”แžถแž“โ€‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšโ€‹แž‚แŸ„แž›โ€‹แžŠแŸ…โ€‹แž›แžพ NCS แž‘แŸแŸ”

แž›แŸ’แž”แžฟแž“แžšแž”แžŸแŸ‹แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แž‚แžบแž™แžบแžแž‡แžถแž„ 0.1 แžœแžทแž“แžถแž‘แžธ แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแžŽแžถแž€แŸแžŠแŸ„แž™ 2-3 แžŠแž„แž›แžฟแž“แž‡แžถแž„แž–แž–แž€แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แžแŸ’แžŸแŸ„แž™ แž–แŸ„แž›แž‚แžบ 8-9 แž แŸ’แžœแŸ’แžšแŸแž˜แž€แŸ’แž“แžปแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธแŸ”

แžœแžธแžŠแŸแžขแžผแž“แŸƒ Cloud Object Detector แž“แŸ…แž›แžพ Raspberry Pi

แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแž“แŸƒแž›แž‘แŸ’แž’แž•แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž–แž“แŸ’แž™แž›แŸ‹แžŠแŸ„แž™แž€แžถแžšแž–แžทแžแžŠแŸ‚แž›แžแžถ NCS แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš Mobile SSD แž€แŸ†แžŽแŸ‚ 2018_01_28แŸ”

P.S. แž›แžพแžŸแž–แžธแž“แŸแŸ‡แž‘แŸ€แžแž€แžถแžšแž–แžทแžŸแŸ„แž’แž“แŸแž”แžถแž“แž”แž„แŸ’แž แžถแž‰แžแžถแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž€แžปแŸ†แž–แŸ’แž™แžผแž‘แŸแžšแž›แžพแžแžปแžŠแŸ‚แž›แž˜แžถแž“แžแžถแž˜แž–แž›แžแŸ’แž›แžถแŸ†แž„แž‡แžถแž˜แžฝแž™แž”แŸ’แžšแž–แŸแž“แŸ’แž’แžŠแŸ†แžŽแžพแžšแž€แžถแžš I7 แž”แž„แŸ’แž แžถแž‰แž›แž‘แŸ’แž’แž•แž›แž”แŸ’แžšแžŸแžพแžšแž‡แžถแž„แž˜แžปแž“แž”แž“แŸ’แžแžทแž…แž แžพแž™แžœแžถแž”แžถแž“แž”แŸ’แžšแŸ‚แž‘แŸ…แž‡แžถแžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“แžŠแžพแž˜แŸ’แž”แžธแž…แŸ’แžšแž”แžถแž…แŸ‹แž…แŸแž‰ 10 แž แŸ’แžœแŸ’แžšแŸแž˜แž€แŸ’แž“แžปแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธแŸ”

แž…แž„แŸ’แž€แŸ„แž˜

แž€แžถแžšแž–แžทแžŸแŸ„แž’แž“แŸแž”แžถแž“แž”แž“แŸ’แžแž‘แŸ…แž˜แžปแžแž‘แŸ€แž แž แžพแž™แžแŸ’แž‰แžปแŸ†แž”แžถแž“แžŠแŸ†แžกแžพแž„แžงแž”แž€แžšแžŽแŸแž…แžถแž”แŸ‹แž“แŸ…แž›แžพแžแŸ’แž“แžถแŸ†แž„แž…แŸ†แž“แžฝแž“แž”แŸ’แžšแžถแŸ†แž“แŸ…แž€แŸ’แž“แžปแž„ Google Kubernetes แŸ”
แž•แžพแž„แžแŸ’แž›แžฝแž“แžฏแž„แžแŸ’แžŸแŸ„แž™ แž แžพแž™แž–แžฝแž€แžœแžถแž“แžธแž˜แžฝแž™แŸ—แž˜แžทแž“แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแžŸแž–แžธ 2 แž แŸ’แžœแŸ’แžšแŸแž˜แž€แŸ’แž“แžปแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธแž”แžถแž“แž‘แŸแŸ”
แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž…แž„แŸ’แž€แŸ„แž˜แž‡แžถแž˜แžฝแž™ N nodes แž“แžทแž„ parse frames แž€แŸ’แž“แžปแž„ N threads แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™แž“แžนแž„แž…แŸ†แž“แžฝแž“ nodes แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹ (5) แžขแŸ’แž“แž€แžขแžถแž…แžŸแž˜แŸ’แžšแŸแž…แž”แžถแž“ 10 frames แžŠแŸ‚แž›แž…แž„แŸ‹แž”แžถแž“แž€แŸ’แž“แžปแž„แž˜แžฝแž™แžœแžทแž“แžถแž‘แžธแŸ”

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

แž“แŸแŸ‡แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แž”แžถแž“แž€แžพแžแžกแžพแž„:

แžœแžธแžŠแŸแžขแžผแž“แŸƒ Cloud Object Detector แž“แŸ…แž›แžพ Raspberry Pi

แž›แžฟแž“แž‡แžถแž„ NCS แž”แž“แŸ’แžแžทแž… แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแŸ’แž›แžถแŸ†แž„แž‡แžถแž„แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸ’แž‘แŸ’แžšแžธแž˜แž˜แžฝแž™แŸ”

แž‡แžถแž€แžถแžšแž–แžทแžแžŽแžถแžŸแŸ‹แž€แžถแžšแž‘แž‘แžฝแž›แž”แžถแž“แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž›แžธแž“แŸแžขแŸŠแŸ‚แžšแž‘แŸ - แž˜แžถแž“แž€แžถแžšแžแŸ’แžšแžฝแžแž›แžพแž‚แŸ’แž“แžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพแžŸแž˜แž€แžถแž›แž€แž˜แŸ’แž˜แž“แžทแž„แž€แžถแžšแž…แž˜แŸ’แž›แž„แž™แŸ‰แžถแž„แžŸแŸŠแžธแž‡แž˜แŸ’แžšแŸ…แž“แŸƒแžšแžผแž”แž—แžถแž– opencv แŸ”

แžŸแŸแž…แž€แŸ’แžแžธแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“

แžŸแžšแžปแž”แž˜แž€ แž€แžถแžšแž–แžทแžŸแŸ„แž’แž“แŸแžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž™แžพแž„แžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“แžแžถ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž–แŸ’แž™แžถแž™แžถแž˜ แžขแŸ’แž“แž€แžขแžถแž…แžšแžฝแž…แž•แžปแžแž–แžธแž–แž–แž€แžŠแŸแžŸแžถแž˜แž‰แŸ’แž‰แž˜แžฝแž™แŸ”

แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž•แŸ’แž‘แŸƒแžแžปแžŠแŸแž˜แžถแž“แžขแžถแž“แžปแž—แžถแž– แžฌแž•แŸ’แž“แŸ‚แž€แžšแžนแž„แž€แŸ’แž“แžปแž„แžแŸ†แž”แž“แŸ‹แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžขแŸ’แž“แž€แžŸแž˜แŸ’แžšแŸแž…แž”แžถแž“แž›แž‘แŸ’แž’แž•แž›แž”แŸ’แžšแžŸแžพแžšแž‡แžถแž„แž˜แžปแž“ แž“แžทแž„แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž›แŸ’แž”แžทแž…แžŽแžถแž˜แžฝแž™แžกแžพแž™แŸ”

แžŸแŸแž…แž€แŸ’แžแžธแž™แŸ„แž„

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹