Raspberry Pi жүйесіндегі бұлтты нысан детекторының бейнесі

Проглог

Қазір интернетте Tesla автопилоты жолды қалай көретінін көрсететін видео таралып жатыр.

Мен ұзақ уақыт бойы детектормен байытылған бейнені нақты уақыт режимінде көрсету үшін қышидым.

Raspberry Pi жүйесіндегі бұлтты нысан детекторының бейнесі

Мәселе мынада, мен Raspberry-ден бейнені таратқым келеді және ондағы нейрондық желі детекторының өнімділігі көп нәрсені қалаусыз қалдырады.

Intel нейрондық компьютер таяқшасы

Мен әртүрлі шешімдерді қарастырдым.

В соңғы мақала Intel Neural Computer Stick көмегімен тәжірибе жасады. Аппараттық құрал қуатты, бірақ өзінің желілік пішімін қажет етеді.

Intel негізгі фреймворктар үшін түрлендіргіштерді қамтамасыз етсе де, бірқатар қателіктер бар.

Мысалы, қажетті желінің пішімі үйлесімсіз болуы мүмкін, ал егер ол үйлесімді болса, құрылғыда кейбір қабаттарға қолдау көрсетілмеуі мүмкін, ал егер оларға қолдау көрсетілсе, түрлендіру процесінде қателер туындауы мүмкін, соның салдарынан шығысында біз кейбір оғаш нәрселерді аламыз.

Жалпы, егер сіз кез келген нейрондық желіні қаласаңыз, онда ол NCS-пен жұмыс істемеуі мүмкін. Сондықтан мен ең кең таралған және қол жетімді құралдарды пайдалана отырып, мәселені шешуге тырысуды шештім.

Бұлтты

Жергілікті аппараттық шешімнің айқын баламасы бұлтқа өту болып табылады.

Дайын опциялар - менің көзім жабайы.

Барлық жетекшілер:

...Ал оншақты онша танымал емес.

Осы сорттың арасынан таңдау оңай емес.

Мен таңдауды емес, ескі жақсы жұмыс схемасын Docker ішіндегі OpenCV-ге орап, оны бұлтта іске қосуды шештім.

Бұл тәсілдің артықшылығы - икемділік пен басқару - сіз нейрондық желіні, хостингті, серверді - жалпы, кез келген қыңырлықты өзгерте аласыз.

Сервер

Жергілікті прототиптен бастайық.

Дәстүрлі түрде 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)

Жергілікті докерде (өте жас емес ноутбукта) бұл 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 сек, таңқурай - 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 файлын серверге апарғымыз келмейтін жерде жақсы.

Доктор

Біз суретті жинаймыз.

Код таралады және орналастырылады Github, докер оны тікелей сол жерден алады.

Платформа ретінде біз Raspberry-дегідей Debian Stretch-ті аламыз - біз дәлелденген технологиялық стектен ауытқымаймыз.

Сізге flask, protobuf, сұраулар, opencv_python орнату керек, Mobile 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. Мағыналы атау ойлап көрейік:
    докер тегі 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.
Тіпті ең нашар сценарийде де ұтыс үш есе болады, сіз көріңіз.

Видео

Біз Raspberry-де Google Cloud арқылы анықтайтын қарапайым OpenCV бейне ағынын іске қосамыз.
Эксперимент үшін бір кездері кездейсоқ қиылыста түсірілген бейнефайл пайдаланылды.


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 жүйесіндегі бұлтты нысан детекторының бейнесі

Бұлт пен көлік шығындарының оған ешқандай қатысы жоқ, детектор қарапайым жабдықта жұмыс істейді және осындай жылдамдықпен жұмыс істейді.

Нейрондық компьютер таяқшасы

Мен қарсы тұра алмадым және NCS-те эталонды жүргіздім.

Детектордың жылдамдығы 0.1 секундтан сәл баяу болды, кез келген жағдайда әлсіз машинадағы бұлттан 2-3 есе жылдам, яғни секундына 8-9 кадр.

Raspberry Pi жүйесіндегі бұлтты нысан детекторының бейнесі

Нәтижелердің айырмашылығы 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

Міне, не болды:

Raspberry Pi жүйесіндегі бұлтты нысан детекторының бейнесі

NCS-ке қарағанда жылдамырақ, бірақ бір ағынға қарағанда күштірек.

Табыс, әрине, сызықты емес - opencv кескіндерін синхрондау және терең көшіру үшін қабаттасулар бар.

қорытынды

Жалпы, эксперимент егер сіз тырыссаңыз, қарапайым бұлттан құтылуға болады деген қорытынды жасауға мүмкіндік береді.

Бірақ қуатты жұмыс үстелі немесе жергілікті жабдық сізге жақсы нәтижелерге қол жеткізуге мүмкіндік береді және ешқандай айласыз.

сілтемелер

Ақпарат көзі: www.habr.com

пікір қалдыру