Fideo o Cloud Object Detector ar Raspberry Pi

Prologue

Mae fideo bellach yn cylchredeg ar y Rhyngrwyd yn dangos sut mae awtobeilot Tesla yn gweld y ffordd.

Rydw i wedi bod yn cosi ers amser maith i ddarlledu fideo wedi'i gyfoethogi â synhwyrydd, ac mewn amser real.

Fideo o Cloud Object Detector ar Raspberry Pi

Y broblem yw fy mod am ddarlledu fideo o Raspberry, ac mae perfformiad y synhwyrydd rhwydwaith niwral arno yn gadael llawer i'w ddymuno.

Ffon Gyfrifiadurol Newral Intel

Ystyriais atebion gwahanol.

В erthygl olaf arbrofi gyda Intel Neural Computer Stick. Mae'r caledwedd yn bwerus, ond mae angen ei fformat rhwydwaith ei hun.

Er bod Intel yn darparu trawsnewidwyr ar gyfer fframweithiau mawr, mae yna nifer o beryglon.

Er enghraifft, efallai y bydd fformat y rhwydwaith gofynnol yn anghydnaws, ac os yw'n gydnaws, yna efallai na fydd rhai haenau'n cael eu cefnogi ar y ddyfais, ac os cânt eu cefnogi, yna gall gwallau ddigwydd yn ystod y broses drosi, ac o ganlyniad i hynny rydym yn cael rhai pethau rhyfedd yn yr allbwn.

Yn gyffredinol, os ydych chi eisiau rhyw fath o rwydwaith niwral mympwyol, yna efallai na fydd yn gweithio gyda NCS. Felly, penderfynais geisio datrys y broblem gan ddefnyddio'r offer mwyaf eang a hygyrch.

Cwmwl

Y dewis arall amlwg yn lle datrysiad caledwedd lleol yw mynd i'r cwmwl.

Opsiynau parod - mae fy llygaid yn rhedeg yn wyllt.

Pob arweinydd:

... A dwsinau o rai llai adnabyddus.

Nid yw dewis ymhlith yr amrywiaeth hon yn hawdd o gwbl.

A phenderfynais beidio â dewis, ond lapio'r hen gynllun gweithio da ar OpenCV yn Docker a'i redeg yn y cwmwl.

Mantais y dull hwn yw hyblygrwydd a rheolaeth - gallwch newid y rhwydwaith niwral, cynnal, gweinydd - yn gyffredinol, unrhyw fympwy.

Gweinydd

Gadewch i ni ddechrau gyda phrototeip lleol.

Yn draddodiadol rwy'n defnyddio Fflasg ar gyfer rhwydwaith REST API, OpenCV a MobileSSD.

Ar ôl gosod y fersiynau cyfredol ar Docker, darganfyddais nad yw OpenCV 4.1.2 yn gweithio gyda Mobile SSD v1_coco_2018_01_28, a bu'n rhaid i mi rolio'n ôl i'r 11/06_2017 profedig.

Ar ddechrau'r gwasanaeth, rydyn ni'n llwytho enwau'r dosbarthiadau a'r rhwydwaith:

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

Ar dociwr lleol (ar liniadur nad yw'n ifanc iawn) mae'n cymryd 0.3 eiliad, ar Raspberry - 3.5.

Gadewch i ni ddechrau'r cyfrifiad:

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

Dociwr - 0.2 eiliad, Mafon - 1.7.

Troi gwacáu tensor yn json darllenadwy:

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

Ymhellach allforio'r llawdriniaeth hon trwy Fflasg(mewnbwn yw llun, allbwn yw canlyniadau'r synhwyrydd yn json).

Opsiwn arall, lle mae mwy o waith yn cael ei symud i'r gweinydd: mae ei hun yn cylchu'r gwrthrychau a ddarganfuwyd ac yn dychwelyd y ddelwedd orffenedig.

Mae'r opsiwn hwn yn dda lle nad ydym am lusgo opencv i'r gweinydd.

Dociwr

Rydyn ni'n casglu'r ddelwedd.

Mae'r cod yn cael ei gribo a'i bostio ymlaen Github, bydd docker yn mynd ag ef yn uniongyrchol oddi yno.

Fel platfform, byddwn yn cymryd yr un Debian Stretch ag ar Raspberry - ni fyddwn yn gwyro oddi wrth y pentwr technoleg profedig.

Mae angen i chi osod fflasg, protobuf, ceisiadau, opencv_python, lawrlwytho SSD Symudol, cod gweinydd o Github a chychwyn y gweinydd.

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

Syml cleient synhwyrydd yn seiliedig ar geisiadau.

Cyhoeddi i Docker Hub

Mae cofrestrfeydd docwyr yn lluosi ar gyflymder nad yw'n llai na synwyryddion cwmwl.

Er mwyn peidio â thrafferthu, byddwn yn mynd drwodd yn geidwadol DockerHub.

  1. Cofrestrwch
  2. Mewngofnodi:
    mewngofnodi docwr
  3. Gadewch i ni feddwl am enw ystyrlon:
    tag docwr opencv-canfod tprlab/opencv-detect-ssd
  4. Llwythwch y ddelwedd i'r gweinydd:
    gwthio docwr tprlab/opencv-detect-ssd

Rydym yn lansio yn y cwmwl

Mae'r dewis o ble i redeg y cynhwysydd hefyd yn eithaf eang.

Mae'r holl chwaraewyr mawr (Google, Microsoft, Amazon) yn cynnig micro-enghraifft am ddim am y flwyddyn gyntaf.
Ar ôl arbrofi gyda Microsoft Azure a Google Cloud, fe wnes i setlo ar yr olaf oherwydd iddo gymryd i ffwrdd yn gyflymach.

Ni ysgrifennais gyfarwyddiadau yma, gan fod y rhan hon yn benodol iawn i'r darparwr a ddewiswyd.

Rhoddais gynnig ar wahanol opsiynau caledwedd,
Lefelau isel (rhannu ac ymroddedig) - 0.4 - 0.5 eiliad.
Ceir mwy pwerus - 0.25 - 0.3.
Wel, hyd yn oed yn y senario waethaf, mae'r enillion dair gwaith, gallwch chi geisio.

Fideo

Rydym yn lansio ffrwd fideo OpenCV syml ar Raspberry, gan ganfod trwy Google Cloud.
Ar gyfer yr arbrawf, defnyddiwyd ffeil fideo a gafodd ei ffilmio ar un adeg ar groesffordd ar hap.


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

Gyda'r synhwyrydd nid ydym yn cael mwy na thair ffrâm yr eiliad, mae popeth yn mynd yn araf iawn.
Os cymerwch beiriant pwerus i mewn i GCloud, gallwch ganfod 4-5 ffrâm yr eiliad, ond mae'r gwahaniaeth bron yn anweledig i'r llygad, mae'n dal yn araf.

Fideo o Cloud Object Detector ar Raspberry Pi

Nid oes gan y cwmwl a chostau cludiant unrhyw beth i'w wneud ag ef; mae'r synhwyrydd yn rhedeg ar galedwedd arferol ac yn gweithio mor gyflym.

Ffyn Cyfrifiadur Niwral

Ni allwn wrthsefyll a rhedeg y meincnod ar NCS.

Roedd cyflymder y synhwyrydd ychydig yn arafach na 0.1 eiliad, beth bynnag 2-3 gwaith yn gyflymach na'r cwmwl ar beiriant gwan, h.y. 8-9 ffrâm yr eiliad.

Fideo o Cloud Object Detector ar Raspberry Pi

Esbonnir y gwahaniaeth mewn canlyniadau gan y ffaith bod NCS yn rhedeg fersiwn SSD Symudol 2018_01_28.

PS Yn ogystal, mae arbrofion wedi dangos bod peiriant bwrdd gwaith eithaf pwerus gyda phrosesydd I7 yn dangos canlyniadau ychydig yn well a bu'n bosibl gwasgu 10 ffrâm yr eiliad arno.

Clwstwr

Aeth yr arbrawf ymhellach a gosodais y synhwyrydd ar bum nod yn Google Kubernetes.
Roedd y codennau eu hunain yn wan ac ni allai pob un ohonynt brosesu mwy na 2 ffrâm yr eiliad.
Ond os ydych chi'n rhedeg clwstwr gyda nodau N a fframiau dosrannu mewn edafedd N, yna gyda nifer digonol o nodau (5) gallwch chi gyflawni'r 10 ffrâm yr eiliad a ddymunir.

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

Dyma beth ddigwyddodd:

Fideo o Cloud Object Detector ar Raspberry Pi

Ychydig yn llai cyflym na gyda NCS, ond yn fwy egnïol nag mewn un ffrwd.

Nid yw'r fantais, wrth gwrs, yn llinol - mae troshaenau ar gyfer cydamseru a chopïo dwfn o ddelweddau opencv.

Casgliad

Yn gyffredinol, mae'r arbrawf yn ein galluogi i ddod i'r casgliad, os ceisiwch, y gallwch chi ddianc â chwmwl syml.

Ond mae bwrdd gwaith pwerus neu galedwedd lleol yn caniatáu ichi gyflawni canlyniadau gwell, a heb unrhyw driciau.

cyfeiriadau

Ffynhonnell: hab.com

Ychwanegu sylw