Π’ΠΈΠ΄Π΅ΠΎ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Raspberry Pi

ΠŸΡ€ΠΎΠ»ΠΎΠ³

По сСти сСйчас гуляСт Π²ΠΈΠ΄Π΅ΠΎ β€” ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠΏΠΈΠ»ΠΎΡ‚ ВСслы Π²ΠΈΠ΄ΠΈΡ‚ Π΄ΠΎΡ€ΠΎΠ³Ρƒ.

Π£ мСня Π΄Π°Π²Π½ΠΎ Ρ‡Π΅ΡΠ°Π»ΠΈΡΡŒ Ρ€ΡƒΠΊΠΈ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄Π΅ΠΎ, ΠΎΠ±ΠΎΠ³Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ, Π΄Π° ΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’ΠΈΠ΄Π΅ΠΎ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Raspberry Pi

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄Π΅ΠΎ я Ρ…ΠΎΡ‡Ρƒ с Raspberry, Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ нСйросСтСвого Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° Π½Π΅ΠΉ оставляСт ΠΆΠ΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ.

Intel Neural Computer Stick

Π― рассматривал Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ экспСримСнтировал с Intel Neural Computer Stick. Π–Π΅Π»Π΅Π·ΠΊΠ° мощная, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ своСго Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° сСти.

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π˜Π½Ρ‚Π΅Π» прСдоставляСт ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π΅Ρ€Ρ‹ для основных Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², здСсь Π΅ΡΡ‚ΡŒ ряд ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ.

НапримСр, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½ΡƒΠΆΠ½ΠΎΠΉ сСти ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсовмСстим, Π° Ссли совмСстим, Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ слои ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° дСвайсС, Π° Ссли ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ, Ρ‚ΠΎ Π² процСссС ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ошибки, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ странныС Π²Π΅Ρ‰ΠΈ.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Ссли хочСтся ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ, Ρ‚ΠΎ с 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.

ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ‚Π΅Π½Π·ΠΎΡ€Π½Ρ‹ΠΉ Π²Ρ‹Ρ…Π»ΠΎΠΏ Π² Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΉ 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 β€” Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ тСхстСка.

Надо ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ flask, protobuf, requests, opencv_python, ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Mobile SSD, ΠΊΠΎΠ΄ сСрвСра с Π“ΠΈΡ‚Ρ…Π°Π±Π° ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр.

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"]

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Π½Π° основС requests.

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ Π½Π° Docker Hub

РССстры Π΄ΠΎΠΊΠ΅Ρ€Π° плодятся со ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Π½Π΅ мСньшСй, Ρ‡Π΅ΠΌ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ, ΠΌΡ‹ консСрвативно ΠΏΠΎΠΉΠ΄Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Π”ΠΎΠΊΠ΅Ρ€Π₯Π°Π±.

  1. РСгистрируСмся
  2. АвторизуСмся:
    docker login
  3. ΠŸΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅ΠΌ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ имя:
    docker tag opencv-detect tprlab/opencv-detect-ssd
  4. Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π· Π½Π° сСрвСр:
    docker push tprlab/opencv-detect-ssd

ЗапускаСм Π² ΠΎΠ±Π»Π°ΠΊΠ΅

Π’Ρ‹Π±ΠΎΡ€, Π³Π΄Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ‚ΠΎΠΆΠ΅ вСсьма ΡˆΠΈΡ€ΠΎΠΊ.

ВсС большиС ΠΈΠ³Ρ€ΠΎΠΊΠΈ (Π“ΡƒΠ³Π», ΠœΠΈΠΊΡ€ΠΎΡΠΎΡ„Ρ‚, Амазон) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ микроинстанс бСсплатно Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π³ΠΎΠ΄.
ΠŸΠΎΡΠΊΡΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π² с Microsoft Azure ΠΈ Google Cloud, остановился Π½Π° послСднСм β€” ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ быстрСС Π²Π·Π»Π΅Ρ‚Π΅Π»ΠΎ.

НС стал ΠΏΠΈΡΠ°Ρ‚ΡŒ здСсь ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эта Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ спСцифичная для Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Ρ€Π°Π·Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΆΠ΅Π»Π΅Π·Π°,
НизкиС ΡƒΡ€ΠΎΠ²Π½ΠΈ (shared ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅) β€” 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 ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² сСкунду, Π½ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Π° Π³Π»Π°Π·ΠΎΠΌ практичСски Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Π°, всС Ρ€Π°Π²Π½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

Π’ΠΈΠ΄Π΅ΠΎ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Raspberry Pi

Облако ΠΈ транспортныС расходы здСсь Π½Π΅ ΠΏΡ€ΠΈΡ‡Π΅ΠΌ, Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ ΠΆΠ΅Π»Π΅Π·Π΅ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ‚Π°ΠΊΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ.

Neural Computer Stick

НС удСрТался ΠΈ ΠΏΡ€ΠΎΠ³Π½Π°Π» Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π½Π° NCS.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° Π±Ρ‹Π»Π° Ρ‡ΡƒΡ‚ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ 0.1 сСкунды, Π² любом случаС Π² 2-3 Ρ€Π°Π·Π° быстрСС ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° слабой машинС, Ρ‚.Π΅ 8-9 ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² сСкунду.

Π’ΠΈΠ΄Π΅ΠΎ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Raspberry Pi

Π Π°Π·Π½ΠΈΡ†Π° Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° NCS запускался Mobile 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

Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

Π’ΠΈΠ΄Π΅ΠΎ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Raspberry Pi

НСмного Π½Π΅ Ρ‚Π°ΠΊ Ρ€Π΅Π·Π²ΠΎ ΠΊΠ°ΠΊ с NCS, Π½ΠΎ Π±ΠΎΠ΄Ρ€Π΅Π΅ Ρ‡Π΅ΠΌ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ.

Π’Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ Π»ΠΈΠ½Π΅Π΅Π½ β€” Π²Ρ‹ΡΡ‚Ρ€Π΅Π»ΠΈΠ²Π°ΡŽΡ‚ Π½Π°ΠΊΠ»Π°Π΄ΠΊΠΈ Π½Π° ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ opencv.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ Ρ†Π΅Π»ΠΎΠΌ, экспСримСнт позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ, Ссли ΠΏΠΎΡΡ‚Π°Ρ€Π°Ρ‚ΡŒΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒΡΡ с простым ΠΎΠ±Π»Π°ΠΊΠΎΠΌ.

Но ΠΌΠΎΡ‰Π½Ρ‹ΠΉ дСсктоп ΠΈΠ»ΠΈ локальная ΠΆΠ΅Π»Π΅Π·ΠΊΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π»ΡƒΡ‡ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π±Π΅Π· всяких ΡƒΡ…ΠΈΡ‰Ρ€Π΅Π½ΠΈΠΉ.

Бсылки

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com