Video ngeunaan Cloud Object Detector on Raspberry Pi

Prolog

Pidéo ayeuna beredar di Internét anu nunjukkeun kumaha autopilot Tesla ningali jalanna.

Kuring geus itching pikeun lila pikeun siaran video enriched kalawan detektor a, sarta sacara real waktu.

Video ngeunaan Cloud Object Detector on Raspberry Pi

Masalahna nyaéta kuring hoyong nyiarkeun pidéo tina Raspberry, sareng kinerja detektor jaringan neural dina éta seueur anu dipikahoyong.

Intel Neural Komputer Stick

Kuring dianggap solusi béda.

В tulisan panungtung experimented kalawan Intel Neural Computer Stick. Hardware anu kuat, tapi merlukeun format jaringan sorangan.

Sanaos Intel nyayogikeun konvérsi pikeun kerangka utama, aya sababaraha pitfalls.

Contona, format jaringan diperlukeun bisa jadi sauyunan, sarta lamun éta cocog, sababaraha lapisan bisa jadi teu dirojong dina alat, sarta lamun aranjeunna dirojong, kasalahan bisa lumangsung salila prosés konvérsi, salaku hasil tina nu. urang meunang sababaraha hal aneh dina kaluaran.

Sacara umum, upami anjeun hoyong sababaraha jinis jaringan neural sawenang, maka éta moal tiasa dianggo sareng NCS. Ku alatan éta, kuring mutuskeun pikeun nyobaan pikeun ngajawab masalah ngagunakeun alat paling nyebar sarta diaksés.

Méga

Alternatif anu jelas pikeun solusi hardware lokal nyaéta angkat ka méga.

Pilihan siap-dijieun - panon kuring ngajalankeun liar.

Sadaya pimpinan:

... Jeung puluhan leuwih Lesser dipikawanoh.

Milih diantara rupa-rupa ieu henteu gampang pisan.

Sareng kuring mutuskeun henteu milih, tapi pikeun ngabungkus skéma kerja lami anu saé dina OpenCV di Docker sareng ngajalankeun éta dina méga.

Kauntungannana pendekatan ieu kalenturan jeung kontrol - Anjeun bisa ngarobah jaringan neural, hosting, server - sacara umum, whim nanaon.

server

Hayu urang mimitian ku prototipe lokal.

Sacara tradisional kuring nganggo Flask pikeun REST API, OpenCV sareng jaringan MobileSSD.

Saatos dipasang versi ayeuna dina Docker, kuring mendakan yén OpenCV 4.1.2 henteu tiasa dianggo sareng Mobile SSD v1_coco_2018_01_28, sareng kuring kedah ngagulung deui ka 11/06_2017 anu kabuktian.

Dina mimiti jasa, urang muka nami kelas sareng jaringan:

def init():
    tf_labels.initLabels(dnn_conf.DNN_LABELS_PATH)
    return cv.dnn.readNetFromTensorflow(dnn_conf.DNN_PATH, dnn_conf.DNN_TXT_PATH)

Dina docker lokal (dina laptop teu ngora pisan) butuh 0.3 detik, dina buah prambus - 3.5.

Hayu urang mimitian itungan:

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 detik, buah prambus - 1.7.

Ngarobih knalpot tensor janten json anu tiasa dibaca:

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

Salajengna ékspor operasi ieu via Flask(input mangrupikeun gambar, kaluaran mangrupikeun hasil detektor dina json).

Pilihan alternatip, dimana langkung seueur padamelan dialihkeun ka server: éta nyalira ngurilingan objék anu kapendak sareng ngabalikeun gambar anu parantos réngsé.

Pilihan ieu saé dimana urang henteu hoyong nyered opencv ka server.

Docker

Urang ngumpulkeun gambar.

Kode ieu combed tur dipasang dina Github, Docker bakal nyandak éta langsung ti dinya.

Salaku platform, kami bakal nyandak Debian Stretch anu sami sareng Raspberry - kami moal nyimpang tina tumpukan téknologi anu kabuktian.

Anjeun kudu masang flask, protobuf, requests, opencv_python, ngundeur Mobile SSD, kode server ti Github tur mimitian 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"]

Простой klien detektor dumasar kana pamundut.

Publikasikeun ka Docker Hub

Pendaptaran Docker ngalikeun dina laju teu kurang ti detéktor awan.

Dina raraga teu ganggu, urang bakal konservatif ngaliwatan DockerHub.

  1. Ngadaptar
  2. Lebet:
    login docker
  3. Hayu urang datang kalayan ngaran bermakna:
    tag docker opencv-deteksi tprlab/opencv-detect-ssd
  4. Unggah gambar ka server:
    docker push tprlab/opencv-detect-ssd

Urang ngajalankeun dina awan

Pilihan dimana ngajalankeun wadahna ogé rada lega.

Sadaya pamaén gedé (Google, Microsoft, Amazon) nawiskeun conto mikro gratis kanggo taun kahiji.
Saatos ékspérimén sareng Microsoft Azure sareng Google Cloud, kuring netepkeun anu terakhir sabab éta langkung gancang.

Kuring henteu nyerat paréntah di dieu, sabab bagian ieu khusus pikeun panyadia anu dipilih.

Kuring nyobian sababaraha pilihan hardware,
tingkat low (dibagikeun sarta dedicated) - 0.4 - 0.5 detik.
Mobil anu langkung kuat - 0.25 - 0.3.
sumur, sanajan dina skenario hal awon, nu winnings tilu kali, anjeun tiasa nyobian.

Видео

Urang ngajalankeun streamer video OpenCV basajan dina Raspberry, ngadeteksi ngaliwatan Google Cloud.
Pikeun ékspérimén, file vidéo dianggo anu sakali difilmkeun di simpang acak.


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

Kalawan detektor urang meunang teu leuwih ti tilu pigura per detik, sagalana mana lambat pisan.
Lamun nyandak hiji mesin kuat kana GCloud, Anjeun bisa ngadeteksi 4-5 pigura per detik, tapi bédana ampir halimunan ku panon, éta masih slow.

Video ngeunaan Cloud Object Detector on Raspberry Pi

Biaya awan sareng transportasi henteu aya hubunganana; detektor dijalankeun dina hardware biasa sareng tiasa dianggo dina laju sapertos kitu.

Neural Komputer Stick

Abdi henteu tiasa nolak sareng ngajalankeun patokan dina NCS.

Laju detektor éta rada laun ti 0.1 detik, dina sagala hal 2-3 kali leuwih gancang ti awan dina mesin lemah, nyaéta 8-9 pigura per detik.

Video ngeunaan Cloud Object Detector on Raspberry Pi

Bédana dina hasil dijelaskeun ku kanyataan yén NCS ngajalankeun versi Mobile SSD 2018_01_28.

PS Salaku tambahan, percobaan nunjukkeun yén mesin desktop anu cukup kuat kalayan prosésor I7 nunjukkeun hasil anu langkung saé sareng tétéla tiasa squeeze 10 pigura per detik dina éta.

Kluster

Eksperimen langkung jauh sareng kuring masang detektor dina lima titik dina Google Kubernetes.
Polong sorangan lemah sareng masing-masing henteu tiasa ngolah langkung ti 2 pigura per detik.
Tapi lamun ngajalankeun klaster kalawan N titik sarta parse pigura dina N threads, lajeng kalawan jumlah cukup titik (5) anjeun bisa ngahontal 10 pigura per detik nu dipikahoyong.

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

Kieu anu kajantenan:

Video ngeunaan Cloud Object Detector on Raspberry Pi

A saeutik kirang gancang ti kalawan NCS, tapi leuwih vigorous ti dina hiji aliran.

Keuntungan, tangtosna, henteu linier - aya overlays pikeun sinkronisasi sareng nyalin jero gambar opencv.

kacindekan

Gemblengna, percobaan ngamungkinkeun urang pikeun nyimpulkeun yén upami anjeun nyobian, anjeun tiasa kabur ku awan anu sederhana.

Tapi desktop anu kuat atanapi hardware lokal ngamungkinkeun anjeun ngahontal hasil anu langkung saé, sareng tanpa trik.

rujukan

sumber: www.habr.com

Tambahkeun komentar