Físeán de Cloud Object Dector ar Raspberry Pi

Prologue

Tá físeán á scaipeadh anois ar an Idirlíon a thaispeánann conas a fheiceann uathphíolóta Tesla an bóthar.

Tá mé ag tochas le fada an lá físeáin a chraoladh saibhrithe le brathadóir, agus i bhfíor-am.

Físeán de Cloud Object Dector ar Raspberry Pi

Is í an fhadhb atá ann go bhfuil mé ag iarraidh físeáin a chraoladh ó Sú craobh, agus fágann feidhmíocht an bhrathadóra líonra néaraigh air go bhfuil go leor le bheith inmhianaithe.

Bata Ríomhaire Intel Neural

Mheas mé réitigh éagsúla.

В an t-alt deireanach turgnamh le Intel Neural Computer Stick. Tá na crua-earraí cumhachtach, ach éilíonn a bhformáid líonra féin.

Cé go soláthraíonn Intel tiontairí do chreataí móra, tá roinnt gaistí ann.

Mar shampla, d'fhéadfadh go mbeadh formáid an líonra riachtanach neamh-chomhoiriúnach, agus má tá sé ag luí, ansin b'fhéidir nach dtacaítear le roinnt sraitheanna ar an bhfeiste, agus má thacaítear leo, d'fhéadfadh earráidí a bheith ann le linn an phróisis chomhshó, agus mar thoradh air sin faigheann muid roinnt rudaí aisteacha ag an aschur.

Go ginearálta, más mian leat líonra néarúil treallach de chineál éigin, b'fhéidir nach n-oibreoidh sé le NCS. Mar sin, chinn mé iarracht a dhéanamh an fhadhb a réiteach ag baint úsáide as na huirlisí is forleithne agus is inrochtana.

Cloud

Is é an rogha eile is léir do réiteach crua-earraí áitiúil ná dul go dtí an scamall.

Roghanna réamhdhéanta - ritheann mo shúile fiáin.

Gach ceannaire:

... Agus mórán de na cinn is lú aithne.

Níl sé éasca ar chor ar bith a roghnú i measc an éagsúlacht seo.

Agus chinn mé gan a roghnú, ach an sean-scéim oibre maith a fhilleadh ar OpenCV in Docker agus é a rith sa scamall.

Is é an buntáiste a bhaint as an gcur chuige seo solúbthacht agus rialú - is féidir leat athrú ar an líonra neural, óstáil, freastalaí - go ginearálta, aon whim.

Freastalaí

Tosaímid le fréamhshamhail áitiúil.

Go traidisiúnta úsáidim Flask le haghaidh líonra REST API, OpenCV agus MobileSSD.

Tar éis na leaganacha reatha a shuiteáil ar Docker, fuair mé amach nach n-oibríonn OpenCV 4.1.2 le Mobile SSD v1_coco_2018_01_28, agus bhí orm rolladh ar ais go dtí an 11/06_2017 cruthaithe.

Ag tús na seirbhíse, lódálann muid ainmneacha na ranganna agus an líonra:

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

Ar dhugaire áitiúil (ar ríomhaire glúine nach bhfuil an-óg) tógann sé 0.3 soicind, ar Sú craobh - 3.5.

Cuirimis tús leis an ríomh:

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 sec, Sú craobh - 1.7.

Ag iompú sceite tensor go json inléite:

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

Tuilleadh easpórtáil an oibríocht seo trí Fhleascán(is pictiúr é an t-ionchur, is é an t-aschur torthaí an bhrathadóra in json).

Rogha eile, ina n-aistrítear níos mó oibre chuig an bhfreastalaí: ciorcail sé féin na réada aimsithe agus filleann sé an íomhá críochnaithe.

Tá an rogha seo go maith nuair nach dteastaíonn uainn opencv a tharraingt chuig an bhfreastalaí.

Docker

Bailímid an íomhá.

Cíortar an cód agus postáiltear é Github, déanfaidh docker é go díreach ó ann.

Mar ardán, tógfaimid an Debian Stretch céanna agus atá ar Sú craobh - ní chlaonfaimid ón gcruach cruthaithe teicneolaíochta.

Ní mór duit fleascán, protobuf, iarratais, opencv_python a shuiteáil, SSD Soghluaiste a íoslódáil, cód freastalaí ó Github agus an freastalaí a thosú.

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

Próifíl cliant brathadóir bunaithe ar iarratais.

Foilsitheoireacht chuig Docker Hub

Tá clárlanna duga ag méadú ar luas nach lú ná brathadóirí néil.

Chun nach gcuirfí isteach orainn, rachaimid tríd go coimeádach DockerHub.

  1. Clár
  2. Logáil isteach:
    logáil isteach docker
  3. Déanaimis teacht suas le hainm brí:
    clib docker opencv-braith tprlab/opencv-detect-ssd
  4. Íoslódáil an pictiúr chuig an bhfreastalaí
    brúigh docker tprlab/opencv-detect-ssd

Seolaimid sa scamall

Tá an rogha cá háit leis an gcoimeádán a rith sách leathan freisin.

Tairgeann na himreoirí móra go léir (Google, Microsoft, Amazon) micrea-chás saor in aisce don chéad bhliain.
Tar éis triail a bhaint as Microsoft Azure agus Google Cloud, shocraigh mé ar an dara ceann toisc gur tháinig sé amach níos tapúla.

Níor scríobh mé treoracha anseo, ós rud é go bhfuil an chuid seo an-sonrach don soláthraí roghnaithe.

Bhain mé triail as roghanna crua-earraí éagsúla,
Leibhéil ísle (roinnte agus tiomnaithe) - 0.4 - 0.5 soicind.
Gluaisteáin níos cumhachtaí - 0.25 - 0.3.
Bhuel, fiú amháin sa chás is measa, tá na buaiteanna faoi thrí, is féidir leat triail a bhaint as.

Video

Seolaimid sruthóir físeán OpenCV simplí ar Sú craobh, á bhrath trí Google Cloud.
Don turgnamh, úsáideadh comhad físe a scannánaíodh uair amháin ag crosbhealach randamach.


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

Leis an brathadóir ní fhaigheann muid níos mó ná trí fhráma in aghaidh an tsoicind, téann gach rud go han-mhall.
Má ghlacann tú meaisín cumhachtach isteach i GCloud, is féidir leat 4-5 fráma in aghaidh an tsoicind a bhrath, ach tá an difríocht beagnach dofheicthe don tsúil, tá sé fós mall.

Físeán de Cloud Object Dector ar Raspberry Pi

Níl baint ar bith ag na costais scamall agus iompair leis; ritheann an brathadóir ar chrua-earraí rialta agus oibríonn sé ag an luas sin.

Bata Ríomhaire Neural

Níorbh fhéidir liom cur i gcoinne agus rith an tagarmharc ar NCS.

Bhí luas an bhrathadóra beagán níos moille ná 0.1 soicind, in aon chás 2-3 huaire níos tapúla ná an scamall ar mheaisín lag, i.e. 8-9 fráma in aghaidh an tsoicind.

Físeán de Cloud Object Dector ar Raspberry Pi

Mínítear an difríocht sna torthaí ag an bhfíric go raibh NCS ag rith Mobile SSD leagan 2018_01_28.

P.S. Ina theannta sin, léirigh turgnaimh go léiríonn meaisín deisce sách cumhachtach le próiseálaí I7 torthaí beagán níos fearr agus d'éirigh sé amach go bhféadfaí 10 bhfráma in aghaidh an tsoicind a bhrú amach.

Braisle

Chuaigh an turgnamh níos faide agus chuir mé an brathadóir isteach ar chúig nód in Google Kubernetes.
Bhí na pods féin lag agus níorbh fhéidir gach ceann acu níos mó ná 2 fhráma in aghaidh an tsoicind a phróiseáil.
Ach má ritheann tú braisle le nóid N agus frámaí pharsáil i snáitheanna N, ansin le líon leordhóthanach nóid (5) is féidir leat na 10 bhfráma atá ag teastáil in aghaidh an tsoicind a bhaint amach.

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

Seo a tharla:

Físeán de Cloud Object Dector ar Raspberry Pi

Beagán níos lú tapa ná le NCS, ach níos fuinniúla ná in aon sruth amháin.

Níl an gnóthachan, ar ndóigh, líneach - tá forleagan ann maidir le sioncrónú agus cóipeáil dhomhain ar íomhánna opencv.

Conclúid

Tríd is tríd, ligeann an turgnamh dúinn a thabhairt i gcrích má dhéanann tú iarracht, is féidir leat éalú le scamall simplí.

Ach ligeann deasc chumhachtach nó crua-earraí áitiúil duit torthaí níos fearr a bhaint amach, agus gan cleasanna ar bith.

tagairtí

Foinse: will.com

Add a comment