Video Cloud Object Detectorista Raspberry Pi:llä

prologi

Internetissä liikkuu nyt video, joka näyttää kuinka Teslan autopilotti näkee tien.

Olen jo pitkään halunnut lähettää videota ilmaisimen avulla ja reaaliajassa.

Video Cloud Object Detectorista Raspberry Pi:llä

Ongelmana on, että haluan lähettää videota Raspberrystä, ja sen hermoverkkotunnistimen suorituskyky jättää paljon toivomisen varaa.

Intel Neural Computer Stick

Mietin erilaisia ​​ratkaisuja.

В viimeinen artikkeli kokeili Intel Neural Computer Stickillä. Laitteisto on tehokas, mutta vaatii oman verkkomuodon.

Vaikka Intel tarjoaa muuntimia suurille kehyksille, siinä on useita sudenkuoppia.

Esimerkiksi vaaditun verkon muoto voi olla yhteensopimaton, ja jos se on yhteensopiva, laite ei välttämättä tue kaikkia kerroksia, ja jos niitä tuetaan, muuntoprosessin aikana voi tapahtua virheitä, joiden seurauksena saamme outoja asioita ulostulossa.

Yleensä, jos haluat jonkinlaisen mielivaltaisen hermoverkon, se ei välttämättä toimi NCS:n kanssa. Siksi päätin yrittää ratkaista ongelman käyttämällä yleisimpiä ja helposti saatavilla olevia työkaluja.

pilvi

Ilmeinen vaihtoehto paikalliselle laitteistoratkaisulle on siirtyä pilveen.

Valmiit vaihtoehdot - silmäni juoksevat villisti.

Kaikki johtajat:

... Ja kymmeniä vähemmän tunnettuja.

Valinta tämän lajikkeen joukosta ei ole ollenkaan helppoa.

И я решил не выбирать, а завернуть старую добрую рабочую схему на OpenCV в докер и запустить его в облаке.

Tämän lähestymistavan etuna on joustavuus ja hallinta - voit muuttaa hermoverkkoa, isännöintiä, palvelinta - yleensä mitä tahansa päähänpistoa.

Server

Aloitetaan paikallisesta prototyypistä.

Perinteisesti käytän Flaskia REST API-, OpenCV- ja MobileSSD-verkkoon.

Asentuttuani nykyiset versiot Dockeriin huomasin, että OpenCV 4.1.2 ei toimi Mobile SSD v1_coco_2018_01_28 kanssa, ja minun oli palattava todistettuun versioon 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)

Paikallisella telakalla (ei kovin nuorella kannettavalla tietokoneella) se kestää 0.3 sekuntia, Raspberryssä - 3.5.

Aloitetaan laskeminen:

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 s, Vadelma - 1.7.

Tensorin pakokaasun muuttaminen luettavaksi jsoniksi:

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

edelleen Vie tämä toiminto Flaskin kautta(tulo on kuva, lähtö on ilmaisimen tulokset jsonissa).

Vaihtoehtoinen vaihtoehto, jossa enemmän työtä siirtyy palvelimelle: se itse kiertää löydetyt kohteet ja palauttaa valmiin kuvan.

Tämä vaihtoehto on hyvä silloin, kun emme halua vetää opencv:tä palvelimelle.

satamatyöläinen

Keräämme kuvan.

Koodi kampataan ja postitetaan Github, Docker ottaa sen suoraan sieltä.

Alustana käytämme samaa Debian Stretchiä kuin Raspberryssä – emme poikkea todistetusta teknologiasta.

Sinun on asennettava flask, protobuf, requests, opencv_python, ladattava Mobile SSD, palvelinkoodi Githubista ja käynnistettävä palvelin.

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

yksinkertainen ilmaisimen asiakas pyyntöjen perusteella.

Julkaistaan ​​Docker Hubiin

Docker-rekisterit lisääntyvät yhtä nopeudella kuin pilvitunnistimet.

Jotta ei häiritse, käymme läpi konservatiivisesti DockerHub.

  1. Rekisteröidy
  2. Kirjaudu sisään:
    Docker-kirjautuminen
  3. Keksitään mielekäs nimi:
    Docker-tunniste opencv-detect tprlab/opencv-detect-ssd
  4. Lataa kuva palvelimelle:
    Docker push tprlab/opencv-detect-ssd

Aloitamme pilvessä

Valikoima, missä kontti ajetaan, on myös melko laaja.

Kaikki suuret pelaajat (Google, Microsoft, Amazon) tarjoavat mikroinstanssin ilmaiseksi ensimmäisen vuoden ajan.
Kokeiltuani Microsoft Azurea ja Google Cloudia, päädyin jälkimmäiseen, koska se lähti nopeammin.

En kirjoittanut tänne ohjeita, koska tämä osa on hyvin valittu valitulle palveluntarjoajalle.

Kokeilin erilaisia ​​laitteistovaihtoehtoja,
Matalat tasot (jaetut ja omistetut) - 0.4 - 0.5 sekuntia.
Tehokkaammat autot - 0.25 - 0.3.
No, pahimmassakin tapauksessa voitot ovat kolminkertaiset, voit kokeilla.

video

Julkaisemme yksinkertaisen OpenCV-videosuoratoistolaitteen Raspberryssä, joka havaitsee Google Cloudin kautta.
Kokeessa käytettiin videotiedostoa, joka on kerran kuvattu satunnaisessa risteyksessä.


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

Ilmaisimen avulla saamme enintään kolme kuvaa sekunnissa, kaikki menee hyvin hitaasti.
Jos otat tehokkaan koneen GCloudiin, voit havaita 4-5 kuvaa sekunnissa, mutta ero on melkein näkymätön silmälle, se on silti hidasta.

Video Cloud Object Detectorista Raspberry Pi:llä

Pilvellä ja kuljetuskustannuksilla ei ole mitään tekemistä sen kanssa, ilmaisin toimii tavallisella laitteistolla ja toimii sellaisella nopeudella.

Neural Computer Stick

Не удержался и прогнал бенчмарк на NCS.

Ilmaisimen nopeus oli hieman hitaampi kuin 0.1 sekuntia, joka tapauksessa 2-3 kertaa nopeampi kuin pilvi heikolla koneella, eli 8-9 kuvaa sekunnissa.

Video Cloud Object Detectorista Raspberry Pi:llä

Tulosten ero selittyy sillä, että NCS:ssä oli Mobile SSD -versio 2018_01_28.

PS Lisäksi kokeet ovat osoittaneet, että melko tehokas pöytäkone, jossa on I7-prosessori, näyttää hieman parempia tuloksia ja osoittautui mahdolliseksi puristaa 10 kuvaa sekunnissa.

rykelmä

Kokeilu meni pidemmälle ja asensin ilmaisimen viiteen solmuun Google Kubernetesissa.
Itse podit olivat heikkoja, ja jokainen niistä ei pystynyt käsittelemään enempää kuin 2 kuvaa sekunnissa.
Mutta jos käytät klusteria, jossa on N solmua ja jäsentät kehystä N säikeessä, riittävällä määrällä solmuja (5) voit saavuttaa halutut 10 kehystä sekunnissa.

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

Tässä tapahtui:

Video Cloud Object Detectorista Raspberry Pi:llä

Hieman hitaampi kuin NCS:llä, mutta voimakkaampi kuin yhdessä streamissa.

Vahvistus ei tietenkään ole lineaarinen - Opencv-kuvien synkronointia ja syväkopiointia varten on peittokuvat.

Johtopäätös

Kaiken kaikkiaan kokeilu antaa meille mahdollisuuden päätellä, että jos yrität, voit päästä eroon yksinkertaisesta pilvestä.

Mutta tehokkaan työpöydän tai paikallisen laitteiston avulla voit saavuttaa parempia tuloksia ja ilman temppuja.

viittaukset

Lähde: will.com

Lisää kommentti