Video sa Cloud Object Detector sa Raspberry Pi

Prologue

Usa ka video ang naglibot karon sa Internet nga nagpakita kung giunsa nakita sa autopilot ni Tesla ang dalan.

Dugay na kong nangalisang sa pagsibya sa video nga gipadato sa usa ka detector, ug sa tinuod nga panahon.

Video sa Cloud Object Detector sa Raspberry Pi

Ang problema mao nga gusto nakong i-broadcast ang video gikan sa Raspberry, ug ang pasundayag sa neural network detector niini nagbilin ug daghan nga gitinguha.

Intel Neural Computer Stick

Gikonsiderar nako ang lainlaing mga solusyon.

Π’ miaging artikulo nag-eksperimento sa Intel Neural Computer Stick. Gamhanan ang hardware, apan nanginahanglan sa kaugalingon nga format sa network.

Bisan kung naghatag ang Intel og mga converter alang sa dagkong mga balangkas, adunay daghang mga lit-ag.

Pananglitan, ang format sa gikinahanglan nga network mahimong dili magkauyon, ug kung kini magkatugma, nan ang pipila ka mga lut-od mahimong dili suportahan sa device, ug kung kini gisuportahan, nan ang mga sayup mahimong mahitabo sa panahon sa proseso sa pagkakabig, ingon nga resulta niini. nakakuha kami pipila ka katingad-an nga mga butang sa output.

Sa kinatibuk-an, kung gusto nimo ang usa ka matang sa arbitraryong neural network, nan dili kini mahimo sa NCS. Busa, nakahukom ko nga sulayan ang pagsulbad sa problema gamit ang labing kaylap ug ma-access nga mga himan.

Panganod

Ang klaro nga alternatibo sa usa ka lokal nga solusyon sa hardware mao ang pag-adto sa panganod.

Andam nga gihimo nga mga kapilian - ang akong mga mata nagdilaab.

Tanan nga mga lider:

... Ug daghang mga dili kaayo nailhan.

Ang pagpili sa kini nga lahi dili gyud kadali.

Ug nakahukom ko nga dili mopili, apan ibutang ang maayo nga daan nga pamaagi sa pagtrabaho sa OpenCV sa Docker ug ipadagan kini sa panganod.

Ang bentaha sa kini nga pamaagi mao ang pagka-flexible ug pagkontrol - mahimo nimong usbon ang neural network, hosting, server - sa kinatibuk-an, bisan unsang kapritso.

Server

Magsugod kita sa usa ka lokal nga prototype.

Sa naandan akong gigamit ang Flask para sa REST API, OpenCV ug MobileSSD network.

Sa pag-instalar sa kasamtangan nga mga bersyon sa Docker, akong nadiskobrehan nga ang OpenCV 4.1.2 wala magtrabaho sa Mobile SSD v1_coco_2018_01_28, ug kinahanglan kong mobalik sa napamatud-an nga 11/06_2017.

Sa pagsugod sa serbisyo, among gikarga ang mga ngalan sa klase ug network:

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

Sa usa ka lokal nga pantalan (sa usa ka dili kaayo bata nga laptop) nagkinahanglan kini og 0.3 segundos, sa Raspberry - 3.5.

Atong sugdan ang kalkulasyon:

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 ka segundo, Raspberry - 1.7.

Ang paghimo sa tensor nga tambutso ngadto sa mabasa nga 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

Dugang pa i-eksport kini nga operasyon pinaagi sa Flask(ang input usa ka hulagway, ang output mao ang resulta sa detector sa json).

Usa ka alternatibo nga kapilian, diin daghang trabaho ang gibalhin sa server: kini mismo ang naglibot sa nakit-an nga mga butang ug gibalik ang nahuman nga imahe.

Maayo kini nga opsyon diin dili namo gusto nga i-drag ang opencv ngadto sa server.

Docker

Gikolekta namon ang imahe.

Ang code gisuklay ug gibutang sa Github, dad-on kini sa docker direkta gikan didto.

Ingon usa ka plataporma, kuhaon namon ang parehas nga Debian Stretch sama sa Raspberry - dili kami motipas gikan sa napamatud-an nga tech stack.

Kinahanglan nimo nga i-install ang flask, protobuf, mga hangyo, opencv_python, pag-download sa Mobile SSD, server code gikan sa Github ug pagsugod sa 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"]

Kapatagan kliyente sa detector base sa mga hangyo.

Pagmantala sa Docker Hub

Ang mga rehistro sa Docker nagkadaghan sa katulin nga dili moubos sa mga detektor sa panganod.

Aron dili na mahasol, konserbatibo ta nga moagi DockerHub.

  1. Pagrehistro
  2. Sulod:
    pag-login sa docker
  3. Maghimo kita og usa ka makahuluganon nga ngalan:
    tag sa docker opencv-detect tprlab/opencv-detect-ssd
  4. I-upload ang imahe sa server:
    pagduso sa docker tprlab/opencv-detect-ssd

Naglunsad kami sa panganod

Ang pagpili kung asa modagan ang sudlanan medyo lapad usab.

Ang tanan nga dagkong mga magdudula (Google, Microsoft, Amazon) nagtanyag usa ka micro-instance nga libre sa unang tuig.
Pagkahuman sa pag-eksperimento sa Microsoft Azure ug Google Cloud, gihusay nako ang ulahi tungod kay mas paspas kini.

Wala ako magsulat og mga instruksyon dinhi, tungod kay kini nga bahin espesipiko kaayo sa pinili nga provider.

Gisulayan nako ang lainlaing mga kapilian sa hardware,
Ubos nga lebel (gipaambit ug gipahinungod) - 0.4 - 0.5 segundos.
Mas kusgan nga mga awto - 0.25 - 0.3.
Aw, bisan sa pinakagrabe nga senaryo sa kaso, ang mga kadaugan tulo ka beses, mahimo nimong sulayan.

Video

Naglunsad kami og usa ka yano nga OpenCV video streamer sa Raspberry, nga nakamatikod pinaagi sa Google Cloud.
Alang sa eksperimento, usa ka video file ang gigamit nga kaniadto gi-film sa usa ka random nga intersection.


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

Uban sa detector nga kita dili mosobra sa tulo ka mga frame kada segundo, ang tanan hinay kaayo.
Kung magdala ka usa ka kusgan nga makina sa GCloud, makit-an nimo ang 4-5 nga mga frame matag segundo, apan ang kalainan hapit dili makita sa mata, hinay ra gihapon.

Video sa Cloud Object Detector sa Raspberry Pi

Ang mga gasto sa panganod ug transportasyon wala’y kalabotan niini; ang detector nagdagan sa ordinaryong hardware ug nagtrabaho sa ingon ka tulin.

Neural Computer Stick

Wala ko makasukol ug midagan sa benchmark sa NCS.

Ang katulin sa detector gamay nga hinay kaysa 0.1 segundos, sa bisan unsang kaso 2-3 ka beses nga mas paspas kaysa sa panganod sa usa ka huyang nga makina, i.e. 8-9 nga mga frame matag segundo.

Video sa Cloud Object Detector sa Raspberry Pi

Ang kalainan sa mga resulta gipatin-aw sa kamatuoran nga ang NCS nagpadagan sa Mobile SSD nga bersyon 2018_01_28.

P.S. Dugang pa, gipakita sa mga eksperimento nga ang usa ka medyo kusgan nga makina sa desktop nga adunay usa ka processor sa I7 nagpakita nga labi ka maayo nga mga sangputanan ug nahimo’g posible nga pug-on ang 10 nga mga frame matag segundo.

Cluster

Ang eksperimento nagpadayon ug akong gi-install ang detector sa lima ka node sa Google Kubernetes.
Ang mga pod mismo huyang ug ang matag usa kanila dili makaproseso labaw pa sa 2 ka mga frame matag segundo.
Apan kung nagpadagan ka usa ka kumpol nga adunay mga N node ug nag-parse sa mga frame sa N nga mga hilo, unya sa igo nga gidaghanon sa mga node (5) mahimo nimong makab-ot ang gitinguha nga 10 ka mga frame matag segundo.

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

Ania ang nahitabo:

Video sa Cloud Object Detector sa Raspberry Pi

Dili kaayo paspas kaysa sa NCS, apan labi ka kusog kaysa sa usa ka sapa.

Ang ganansya, siyempre, dili linear - adunay mga overlay alang sa pag-synchronize ug lawom nga pagkopya sa mga imahe sa opencv.

konklusyon

Sa kinatibuk-an, ang eksperimento nagtugot kanamo sa paghinapos nga kung imong sulayan, mahimo ka nga makalayo sa usa ka yano nga panganod.

Apan ang usa ka gamhanan nga desktop o lokal nga hardware nagtugot kanimo sa pagkab-ot sa mas maayo nga mga resulta, ug walay bisan unsa nga mga limbong.

mga pakisayran

Source: www.habr.com

Idugang sa usa ka comment