Видео детектора објеката у облаку на Распберри Пи

Прологуе

Интернетом сада кружи видео који показује како Теслин аутопилот види пут.

Већ дуго ме сврби да емитујем видео обогаћен детектором, и то у реалном времену.

Видео детектора објеката у облаку на Распберри Пи

Проблем је што желим да емитујем видео са Распберри-ја, а перформансе детектора неуронске мреже на њему остављају много да се пожеле.

Интел Неурал Цомпутер Стицк

Размишљао сам о различитим решењима.

В последњи чланак експериментисао са Интел Неурал Цомпутер Стицк-ом. Хардвер је моћан, али захтева сопствени мрежни формат.

Иако Интел обезбеђује конверторе за главне оквире, постоје бројне замке.

На пример, формат тражене мреже може бити некомпатибилан, а ако је компатибилан, неки слојеви можда неће бити подржани на уређају, а ако су подржани, може доћи до грешака током процеса конверзије, услед чега добијамо неке чудне ствари на излазу.

Генерално, ако желите неку врсту произвољне неуронске мреже, онда можда неће радити са НЦС-ом. Стога сам одлучио да покушам да решим проблем користећи најраспрострањеније и најприступачније алате.

Облак

Очигледна алтернатива локалном хардверском решењу је одлазак у облак.

Готове опције - моје очи дивљају.

Сви лидери:

... И на десетине мање познатих.

Избор између ове сорте није нимало лак.

И одлучио сам да не бирам, већ да умотам стару добру радну шему на ОпенЦВ у Доцкер и покренем је у облаку.

Предност овог приступа је флексибилност и контрола - можете променити неуронску мрежу, хостинг, сервер - уопште, било који хир.

Сервер

Почнимо са локалним прототипом.

Традиционално користим Фласк за РЕСТ АПИ, ОпенЦВ и МобилеССД мрежу.

Након што сам инсталирао тренутне верзије на Доцкер-у, открио сам да ОпенЦВ 4.1.2 не ради са мобилним ССД-ом в1_цоцо_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.

Претварање издувавања тензора у читљив јсон:

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

Даље извезите ову операцију преко Фласк-а(улаз је слика, излаз су резултати детектора у јсон-у).

Алтернативна опција, у којој се више посла пребацује на сервер: он сам кружи пронађене објекте и враћа готову слику.

Ова опција је добра тамо где не желимо да превучемо опенцв на сервер.

Доцкер

Сакупљамо слику.

Шифра је прочешљана и објављена Гитхуб, Доцкер ће га преузети директно одатле.

Узмимо исту платформу као Debian Истезање, као на Распбери-ју, нећемо одступати од провереног технолошког стека.

Потребно је да инсталирате фласк, протобуф, рекуестс, опенцв_питхон, преузмете Мобиле ССД, серверски код са Гитхуб-а и покренете сервер.

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. Хајде да смислимо смислено име:
    доцкер ознака опенцв-детецт тпрлаб/опенцв-детецт-ссд
  4. Отпремите слику на сервер:
    доцкер пусх тпрлаб/опенцв-детецт-ссд

Покрећемо у облаку

Избор места за покретање контејнера је такође прилично широк.

Сви велики играчи (Гоогле, Мицрософт, Амазон) нуде микро инстанцу бесплатно у првој години.
Након експериментисања са Мицрософт Азуре-ом и Гоогле Цлоуд-ом, одлучио сам се на ово друго јер је брже напредовало.

Овде нисам писао упутства, пошто је овај део веома специфичан за изабраног провајдера.

Пробао сам различите хардверске опције,
Ниски нивои (дељени и наменски) - 0.4 - 0.5 секунди.
Снажнији аутомобили - 0.25 - 0.3.
Па, чак и у најгорем случају, добитак је три пута, можете покушати.

Видео

Покрећемо једноставан ОпенЦВ видео стример на Распберри-ју, откривајући преко Гоогле Цлоуд-а.
За експеримент је коришћен видео фајл који је једном снимљен на случајном раскрсници.


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

Са детектором не добијамо више од три кадра у секунди, све иде веома споро.
Ако унесете моћну машину у ГЦлоуд, можете открити 4-5 кадрова у секунди, али разлика је скоро невидљива за око, и даље је спора.

Видео детектора објеката у облаку на Распберри Пи

Облак и транспортни трошкови немају никакве везе са тим, детектор ради на обичном хардверу и ради таквом брзином.

Неурал Цомпутер Стицк

Нисам могао да одолим и покренуо сам бенцхмарк на НЦС-у.

Брзина детектора је била нешто спорија од 0.1 секунде, у сваком случају 2-3 пута већа од облака на слабој машини, односно 8-9 фрејмова у секунди.

Видео детектора објеката у облаку на Распберри Пи

Разлика у резултатима се објашњава чињеницом да је НЦС користио Мобиле ССД верзију 2018_01_28.

ПС Поред тога, експерименти су показали да прилично моћна десктоп машина са И7 процесором показује нешто боље резултате и испоставило се да је на њој могуће стиснути 10 фрејмова у секунди.

Цлустер

Експеримент је отишао даље и инсталирао сам детектор на пет чворова у Гоогле Кубернетес-у.
Саме махуне су биле слабе и свака од њих није могла да обради више од 2 кадра у секунди.
Али ако покренете кластер са Н чворова и рашчланите оквире у Н нити, онда са довољним бројем чворова (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

Ево шта се догодило:

Видео детектора објеката у облаку на Распберри Пи

Мало мање брзо него код НЦС-а, али енергичније него у једном току.

Добитак, наравно, није линеаран – постоје прекривачи за синхронизацију и дубоко копирање опенцв слика.

Закључак

Све у свему, експеримент нам омогућава да закључимо да ако покушате, можете се извући једноставним облаком.

Али моћан десктоп или локални хардвер вам омогућава да постигнете боље резултате, и то без икаквих трикова.

референце

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster