Hodeiko objektu detektagailuaren bideoa Raspberry Pi-n

Hitzaurrea

Bideo bat dabil orain Interneten Teslaren pilotu automatikoak errepidea nola ikusten duen erakusten duena.

Aspalditik nago detektagailu batekin aberastutako bideoa emititzeko, eta denbora errealean.

Hodeiko objektu detektagailuaren bideoa Raspberry Pi-n

Arazoa da Raspberry-tik bideoa igorri nahi dudala, eta sare neuronalaren detektagailuaren errendimenduak asko uzten duela.

Intel Neural Computer Stick

Irtenbide desberdinak kontuan hartu ditut.

Π’ azken artikulua Intel Neural Computer Stick-ekin esperimentatu zuen. Hardwarea indartsua da, baina sare formatua behar du.

Intelek marko nagusietarako bihurgailuak eskaintzen baditu ere, hainbat hutsune daude.

Esate baterako, beharrezkoa den sarearen formatua bateraezina izan daiteke, eta bateragarria bada, baliteke geruza batzuk ez onartzea gailuan, eta onartzen badira, akatsak gerta daitezke bihurtze-prozesuan zehar, eta horren ondorioz. gauza arraro batzuk ateratzen ditugu irteeran.

Oro har, sare neuronal arbitrarioren bat nahi baduzu, baliteke NCS-rekin ez funtzionatzea. Hori dela eta, arazoa konpontzen saiatzea erabaki nuen, tresnarik hedatuenak eta eskuragarrienak erabiliz.

Hodei

Tokiko hardware irtenbide baten alternatiba agerikoa da hodeira joatea.

Prest eginiko aukerak - begiak zoratuta daude.

Buruzagi guztiak:

... Eta dozenaka hain ezagunak ez direnak.

Barietate honen artean aukeratzea ez da batere erraza.

Eta ez aukeratzea erabaki nuen, OpenCV-n Docker-en lan-eskema zahar ona bildu eta hodeian exekutatu baizik.

Ikuspegi honen abantaila malgutasuna eta kontrola da - sare neuronalak, hostinga, zerbitzaria alda ditzakezu, oro har, edozein kapritxo.

zerbitzaria

Has gaitezen tokiko prototipo batekin.

Tradizionalki Flask erabiltzen dut REST APIrako, OpenCV eta MobileSSD sarerako.

Docker-en egungo bertsioak instalatu ondoren, OpenCV 4.1.2-k ez duela funtzionatzen Mobile SSD v1_coco_2018_01_28-rekin aurkitu nuen, eta frogatutako 11/06_2017ra itzuli behar izan nuen.

Zerbitzuaren hasieran, klaseen izenak eta sarea kargatzen ditugu:

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

Tokiko docker batean (eramangarri ez oso gazte batean) 0.3 segundo behar dira, Raspberry-n - 3.5.

Hasi gaitezen kalkulua:

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 seg, Mugurdi - 1.7.

Tentsorearen ihesa json irakurgarri bihurtzea:

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

gehiago esportatu eragiketa hau Flask bidez(sarrera irudi bat da, irteera detektagailuaren emaitzak json-en).

Aukera alternatibo bat, zeinetan lan gehiago zerbitzarira mugitzen den: berak aurkitutako objektuak inguratzen ditu eta amaitutako irudia itzultzen du.

Aukera hau ona da opencv zerbitzarira arrastatu nahi ez dugun tokian.

Docker

Irudia biltzen dugu.

Kodea orraztu eta argitaratzen da Github, docker-ek zuzenean hartuko du bertatik.

Plataforma gisa, Raspberry-n dagoen Debian Stretch bera hartuko dugu; ez gara desbideratuko frogatutako teknologia-pilatik.

Flask, protobuf, requests, opencv_python instalatu behar duzu, SSD mugikorra deskargatu, Github-etik zerbitzari-kodea eta zerbitzaria abiarazi.

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

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ detektagailuaren bezeroa eskaeretan oinarrituta.

Docker Hub-en argitaratzea

Docker erregistroak hodei detektagailuak baino abiadura txikiagoan ugaltzen ari dira.

Trabarik ez egiteko, modu kontserbadoreaz joango gara DockerHub.

  1. Izena eman
  2. Saioa hasi:
    docker saioa
  3. Asma dezagun izen esanguratsu bat:
    docker etiketa opencv-detect tprlab/opencv-detect-ssd
  4. Igo irudia zerbitzarira:
    docker push tprlab/opencv-detect-ssd

Hodeian abiarazten dugu

Edukiontzia non exekutatzeko aukera ere nahiko zabala da.

Eragile handi guztiek (Google, Microsoft, Amazon) mikroinstantzia bat eskaintzen dute doan lehen urtean.
Microsoft Azure eta Google Cloud-ekin esperimentatu ondoren, azken honekin adostu nintzen azkarrago atera zelako.

Ez dut hemen argibiderik idatzi, zati hau oso zehatza baita hautatutako hornitzailearentzat.

Hardware aukera desberdinak probatu nituen,
Maila baxuak (partekatuak eta dedikatuak) - 0.4 - 0.5 segundo.
Auto indartsuagoak - 0.25 - 0.3.
Beno, kasurik txarrenean ere, irabaziak hiru aldiz dira, saiatu zaitezke.

Video

OpenCV bideo-streamer soil bat abiarazten dugu Raspberry-n, Google Cloud bidez detektatzen.
Esperimenturako, behin ausazko bidegurutze batean filmatutako bideo-fitxategi bat erabili zen.


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

Detektagailuarekin segundoko hiru fotograma baino gehiago lortzen ditugu, dena oso poliki doa.
Makina indartsu bat GCloud-era hartzen baduzu, segundoko 4-5 fotograma detekta ditzakezu, baina aldea ia ikusezina da begiarentzat, motela da oraindik.

Hodeiko objektu detektagailuaren bideoa Raspberry Pi-n

Hodeiak eta garraio kostuek ez dute zerikusirik; detektagailuak hardware arruntean funtzionatzen du eta abiadura horretan funtzionatzen du.

Ordenagailuaren makila neuronal

Ezin izan nuen eutsi eta NCS-en erreferentea egin nuen.

Detektagailuaren abiadura 0.1 segundo baino apur bat motelagoa zen, nolanahi ere makina ahul batean hodeia baino 2-3 aldiz azkarragoa, hau da, 8-9 fotograma segundoko.

Hodeiko objektu detektagailuaren bideoa Raspberry Pi-n

Emaitzen aldea NCS Mobile SSD 2018_01_28 bertsioa exekutatzen ari zela azaltzen da.

PS Gainera, esperimentuek frogatu dute I7 ​​prozesadorea duen mahaigaineko makina nahiko indartsu batek emaitza apur bat hobeak erakusten dituela eta segundoko 10 fotograma estutu daitezkeela.

cluster

Esperimentua harago joan zen eta detektagailua Google Kubernetes-eko bost nodotan instalatu nuen.
Lekak berak ahulak ziren eta horietako bakoitzak ezin zuen segundoko 2 fotograma baino gehiago prozesatu.
Baina N nodo dituen kluster bat exekutatzen baduzu eta N haritako fotogramak analizatzen badituzu, orduan nodo kopuru nahikoarekin (5) segundoko 10 fotograma lortu ditzakezu.

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

Hona zer gertatu den:

Hodeiko objektu detektagailuaren bideoa Raspberry Pi-n

NCSrekin baino apur bat azkarrago, baina korronte batean baino indartsuagoa.

Irabazia, noski, ez da lineala - opencv irudiak sinkronizatzeko eta kopiatzeko gainjarpenak daude.

Ondorioa

Orokorrean, esperimentuak aukera ematen digu probatzen bazara, hodei soil batekin ihes egin dezakezula.

Baina mahaigaineko edo tokiko hardware indartsu batek emaitza hobeak lortzeko aukera ematen du, eta inolako trikimailurik gabe.

Erreferentziak

Iturria: www.habr.com

Gehitu iruzkin berria