Cloud Object Detector-แƒ˜แƒก แƒ•แƒ˜แƒ“แƒ”แƒ Raspberry Pi-แƒ–แƒ”

แƒžแƒ แƒแƒšแƒแƒ’แƒ˜

แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒจแƒ˜ แƒแƒฎแƒšแƒ แƒ•แƒ แƒชแƒ”แƒšแƒ“แƒ”แƒ‘แƒ แƒ•แƒ˜แƒ“แƒ”แƒ, แƒกแƒแƒ“แƒแƒช แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฎแƒ”แƒ“แƒแƒ•แƒก แƒขแƒ”แƒกแƒšแƒแƒก แƒแƒ•แƒขแƒแƒžแƒ˜แƒšแƒแƒขแƒ˜ แƒ’แƒ–แƒแƒก.

แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒแƒœแƒ˜แƒ แƒ›แƒแƒฌแƒฃแƒฎแƒ”แƒ‘แƒก แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ— แƒ’แƒแƒ›แƒ“แƒ˜แƒ“แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ˜แƒ“แƒ”แƒแƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒ“แƒ แƒ แƒ”แƒแƒšแƒฃแƒ  แƒ“แƒ แƒแƒจแƒ˜.

Cloud Object Detector-แƒ˜แƒก แƒ•แƒ˜แƒ“แƒ”แƒ Raspberry Pi-แƒ–แƒ”

แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒ” แƒ›แƒ˜แƒœแƒ“แƒ แƒ•แƒ˜แƒ“แƒ”แƒแƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ Raspberry-แƒ“แƒแƒœ แƒ“แƒ แƒ›แƒแƒกแƒ–แƒ” แƒœแƒ”แƒ แƒ•แƒฃแƒšแƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒšแƒก แƒขแƒแƒ•แƒ”แƒ‘แƒก.

Intel Neural Computer Stick

แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒ” แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

ะ’ แƒ‘แƒแƒšแƒ แƒกแƒขแƒแƒขแƒ˜แƒ แƒฉแƒแƒแƒขแƒแƒ แƒ แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜ Intel Neural Computer Stick-แƒ˜แƒ—. แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒ แƒ›แƒซแƒšแƒแƒ•แƒ แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ  แƒฅแƒกแƒ”แƒšแƒฃแƒ  แƒคแƒแƒ แƒ›แƒแƒขแƒก.

แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› Intel แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒ แƒ”แƒ‘แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒฉแƒแƒ แƒฉแƒแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒ’แƒ˜ แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ”แƒ‘แƒ˜.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒกแƒแƒญแƒ˜แƒ แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒฃแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒแƒก แƒ“แƒ แƒ—แƒฃ แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒคแƒ”แƒœแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ  แƒ˜แƒงแƒแƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒแƒ–แƒ”, แƒฎแƒแƒšแƒ แƒ—แƒฃ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒšแƒ˜แƒ, แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜ แƒ™แƒแƒœแƒ•แƒ”แƒ แƒขแƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒจแƒ˜, แƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒฃแƒชแƒœแƒแƒฃแƒ  แƒœแƒ˜แƒ•แƒ—แƒ”แƒ‘แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ–แƒ”.

แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ˜แƒก แƒ—แƒ•แƒ˜แƒ—แƒœแƒ”แƒ‘แƒฃแƒ แƒ˜ แƒœแƒ”แƒ แƒ•แƒฃแƒšแƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ  แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก NCS-แƒ—แƒแƒœ. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒ˜

แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒก แƒแƒจแƒ™แƒแƒ แƒ แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒ•แƒ แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒ–แƒ” แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒแƒ.

แƒ›แƒ–แƒ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ”แƒ‘แƒ˜ - แƒ—แƒ•แƒแƒšแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒจแƒขแƒ”แƒ แƒ”แƒ‘แƒ.

แƒงแƒ•แƒ”แƒšแƒ แƒšแƒ˜แƒ“แƒ”แƒ แƒ˜:

... แƒ“แƒ แƒแƒ—แƒแƒ‘แƒ˜แƒ— แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜.

แƒแƒ› แƒฏแƒ˜แƒจแƒก แƒจแƒแƒ แƒ˜แƒก แƒแƒ แƒฉแƒ”แƒ•แƒ แƒกแƒฃแƒšแƒแƒช แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒ“แƒ•แƒ˜แƒšแƒ˜.

แƒ“แƒ แƒ›แƒ” แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ”, แƒ แƒแƒ› แƒแƒ  แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒ, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒจแƒ”แƒ›แƒ”แƒ™แƒ แƒ แƒซแƒ•แƒ”แƒšแƒ˜ แƒ™แƒแƒ แƒ’แƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒกแƒฅแƒ”แƒ›แƒ OpenCV-แƒ–แƒ” Docker-แƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜.

แƒแƒ› แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ˜แƒก แƒฃแƒžแƒ˜แƒ แƒแƒขแƒ”แƒกแƒแƒ‘แƒ แƒแƒ แƒ˜แƒก แƒ›แƒแƒฅแƒœแƒ˜แƒšแƒแƒ‘แƒ แƒ“แƒ แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜ - แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒ— แƒœแƒ”แƒ แƒ•แƒฃแƒšแƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜, แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜, แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ - แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒแƒฎแƒ˜แƒ แƒ”แƒ‘แƒ.

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒžแƒ แƒแƒขแƒแƒขแƒ˜แƒžแƒ˜แƒ—.

แƒ›แƒ” แƒขแƒ แƒแƒ“แƒ˜แƒชแƒ˜แƒฃแƒšแƒแƒ“ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ Flask-แƒก REST API, OpenCV แƒ“แƒ MobileSSD แƒฅแƒกแƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

Docker-แƒ–แƒ” แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒฆแƒ›แƒแƒ•แƒแƒฉแƒ˜แƒœแƒ”, แƒ แƒแƒ› 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 แƒฌแƒแƒ›แƒ˜, 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 แƒฌแƒ›, แƒŸแƒแƒšแƒ - 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

แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒแƒ› แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒ”แƒฅแƒกแƒžแƒแƒ แƒขแƒ˜ Flask-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—(แƒจแƒ”แƒงแƒ•แƒแƒœแƒ แƒแƒ แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜, แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒแƒ แƒ˜แƒก แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜ json-แƒจแƒ˜).

แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒ”แƒขแƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”: แƒ˜แƒก แƒ—แƒแƒ•แƒแƒ“ แƒแƒขแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒก แƒœแƒแƒžแƒแƒ•แƒœแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒš แƒกแƒฃแƒ แƒแƒ—แƒก.

แƒ”แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜ แƒ™แƒแƒ แƒ’แƒ˜แƒ แƒ˜แƒฅ, แƒกแƒแƒ“แƒแƒช แƒแƒ  แƒ’แƒ•แƒ˜แƒœแƒ“แƒ opencv แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ” แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ.

แƒ“แƒแƒ™แƒ”แƒ แƒ˜

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ— แƒกแƒฃแƒ แƒแƒ—แƒก.

แƒ™แƒแƒ“แƒ˜ แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒ˜แƒ—แƒฐแƒฃแƒ‘แƒ˜, แƒ“แƒแƒ™แƒ”แƒ แƒ˜ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ˜แƒฅแƒ˜แƒ“แƒแƒœ แƒฌแƒแƒ˜แƒฆแƒ”แƒ‘แƒก.

แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ, แƒฉแƒ•แƒ”แƒœ แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” Debian Stretch-แƒก, แƒ แƒแƒ’แƒแƒ แƒช Raspberry-แƒ–แƒ” - แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒแƒ“แƒแƒฃแƒฎแƒ•แƒ”แƒ•แƒ— แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒฃแƒš แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒฃแƒ  แƒ“แƒแƒกแƒขแƒแƒก.

แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒแƒ— แƒคแƒšแƒแƒ™แƒแƒœแƒ˜, แƒžแƒ แƒแƒขแƒแƒ‘แƒฃแƒคแƒ˜, แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜, 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"]

แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”.

แƒ’แƒแƒ›แƒแƒฅแƒ•แƒ”แƒงแƒœแƒ”แƒ‘แƒ Docker Hub-แƒจแƒ˜

แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒ แƒ”แƒ”แƒกแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ›แƒ แƒแƒ•แƒšแƒ“แƒ”แƒ‘แƒ แƒฆแƒ แƒฃแƒ‘แƒšแƒ˜แƒก แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ–แƒ” แƒแƒ แƒแƒœแƒแƒ™แƒšแƒ”แƒ‘ แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒ—.

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒแƒ  แƒจแƒ”แƒ•แƒแƒฌแƒฃแƒฎแƒแƒ—, แƒฉแƒ•แƒ”แƒœ แƒ™แƒแƒœแƒกแƒ”แƒ แƒ•แƒแƒขแƒ˜แƒฃแƒšแƒแƒ“ แƒ’แƒแƒ•แƒ˜แƒ•แƒšแƒ˜แƒ— DockerHub.

  1. แƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒแƒชแƒ˜แƒ
  2. แฒจแƒ”แƒกแƒ•แƒšแƒ:
    แƒ“แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒจแƒ”แƒกแƒ•แƒšแƒ
  3. แƒ›แƒแƒ“แƒ˜แƒ— แƒ›แƒแƒ•แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒ— แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ˜:
    docker tag opencv-detect tprlab/opencv-detect-ssd
  4. แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”:
    docker push tprlab/opencv-detect-ssd

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜

แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒฉแƒ”แƒ•แƒแƒœแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒคแƒแƒ แƒ—แƒแƒ.

แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒกแƒฎแƒ•แƒ˜แƒšแƒ˜ แƒ›แƒแƒ—แƒแƒ›แƒแƒจแƒ” (Google, Microsoft, Amazon) แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ›แƒ˜แƒ™แƒ แƒ แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒแƒก แƒฃแƒคแƒแƒกแƒแƒ“ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒฌแƒšแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜.
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-แƒ–แƒ”

แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒ˜ แƒ“แƒ แƒขแƒ แƒแƒœแƒกแƒžแƒแƒ แƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒฎแƒแƒ แƒฏแƒ”แƒ‘แƒ˜ แƒแƒ แƒแƒคแƒ”แƒ  แƒจแƒฃแƒแƒจแƒ˜แƒ, แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒแƒ–แƒ” แƒ“แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒแƒกแƒ”แƒ—แƒ˜ แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒ—.

แƒœแƒ”แƒ แƒ•แƒฃแƒšแƒ˜ แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ˜แƒก แƒฏแƒแƒฎแƒ˜

แƒ›แƒ” แƒ•แƒ”แƒ  แƒ’แƒแƒ•แƒฃแƒซแƒ”แƒšแƒ˜ แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’แƒแƒ‘แƒ˜แƒก แƒ’แƒแƒฌแƒ”แƒ•แƒ แƒ“แƒ NCS-แƒ˜แƒก แƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒ˜.

แƒ“แƒ”แƒขแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ” แƒแƒ“แƒœแƒแƒ• แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒ 0.1 แƒฌแƒแƒ›แƒ–แƒ”, แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ 2-3-แƒฏแƒ”แƒ  แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ•แƒ˜แƒ“แƒ แƒ” แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒ˜ แƒกแƒฃแƒกแƒข แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ”, แƒแƒœแƒฃ 8-9 แƒ™แƒแƒ“แƒ แƒ˜ แƒฌแƒแƒ›แƒจแƒ˜.

Cloud Object Detector-แƒ˜แƒก แƒ•แƒ˜แƒ“แƒ”แƒ Raspberry Pi-แƒ–แƒ”

แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ แƒแƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒ—, แƒ แƒแƒ› 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

แƒแƒ˜ แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ:

Cloud Object Detector-แƒ˜แƒก แƒ•แƒ˜แƒ“แƒ”แƒ Raspberry Pi-แƒ–แƒ”

แƒแƒ“แƒœแƒแƒ• แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒกแƒฌแƒ แƒแƒคแƒ˜, แƒ•แƒ˜แƒ“แƒ แƒ” NCS-แƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒคแƒ แƒ แƒ”แƒœแƒ”แƒ แƒ’แƒ˜แƒฃแƒšแƒ˜, แƒ•แƒ˜แƒ“แƒ แƒ” แƒ”แƒ แƒ— แƒœแƒแƒ™แƒแƒ“แƒจแƒ˜.

แƒ›แƒแƒ’แƒ”แƒ‘แƒ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒแƒ  แƒแƒ แƒ˜แƒก แƒฌแƒ แƒคแƒ˜แƒ•แƒ˜ - แƒแƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒคแƒแƒ แƒ•แƒ”แƒ‘แƒ˜ แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ opencv แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒฆแƒ แƒ›แƒ แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒกแƒแƒ”แƒ แƒ—แƒ แƒฏแƒแƒ›แƒจแƒ˜, แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒ“แƒแƒ•แƒแƒกแƒ™แƒ•แƒœแƒแƒ—, แƒ แƒแƒ› แƒ—แƒฃ แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ—, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ—แƒแƒ•แƒ˜ แƒ“แƒแƒแƒฆแƒฌแƒ˜แƒแƒ— แƒฃแƒ‘แƒ แƒแƒšแƒ แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒก.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒซแƒšแƒ˜แƒ”แƒ แƒ˜ แƒ“แƒ”แƒกแƒ™แƒขแƒแƒžแƒ˜แƒก แƒแƒœ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒแƒ— แƒฃแƒ™แƒ”แƒ—แƒ”แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒก แƒ“แƒ แƒงแƒแƒ•แƒ”แƒšแƒ’แƒ•แƒแƒ แƒ˜ แƒฎแƒ แƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒšแƒ˜แƒขแƒ”แƒ แƒแƒขแƒฃแƒ แƒ

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ