Kanema wa Cloud Object Detector pa Raspberry Pi

Mawu oyambira

Kanema tsopano akuzungulira pa intaneti akuwonetsa momwe autopilot wa Tesla amawonera msewu.

Ndakhala ndikuyabwa kwa nthawi yayitali kuulutsa kanema wolemetsedwa ndi chowunikira, komanso munthawi yeniyeni.

Kanema wa Cloud Object Detector pa Raspberry Pi

Vuto ndiloti ndikufuna kuulutsa kanema kuchokera ku Raspberry, ndipo machitidwe a neural network detector pa izo amasiya zambiri zofunika.

Intel Neural Computer Stick

Ndinalingalira njira zosiyanasiyana.

Π’ nkhani yomaliza adayesa Intel Neural Computer Stick. Hardware ndi yamphamvu, koma imafuna mawonekedwe ake a netiweki.

Ngakhale Intel imapereka zosintha zamakina akuluakulu, pali zovuta zingapo.

Mwachitsanzo, mawonekedwe a netiweki yofunikira angakhale osagwirizana, ndipo ngati ikugwirizana, ndiye kuti zigawo zina sizingagwirizane ndi chipangizocho, ndipo ngati zithandizidwa, ndiye kuti zolakwika zikhoza kuchitika panthawi yotembenuka, chifukwa chake timapeza zinthu zachilendo pazotulutsa.

Kawirikawiri, ngati mukufuna mtundu wina wa neural network, ndiye kuti sizingagwire ntchito ndi NCS. Choncho, ndinaganiza zoyesera kuthetsa vutoli pogwiritsa ntchito zida zofala kwambiri komanso zopezeka.

Mtambo

Njira yodziwikiratu yothetsera vuto la hardware lapafupi ndikupita kumtambo.

Zosankha zokonzeka - maso anga akuthamanga.

Atsogoleri onse:

... Ndipo ambiri osadziwika bwino.

Kusankha pakati pa mitundu iyi sikophweka konse.

Ndipo ndinaganiza kuti ndisasankhe, koma kukulunga dongosolo labwino lakale la OpenCV ku Docker ndikuyendetsa mumtambo.

Ubwino wa njirayi ndi kusinthasintha ndi kuwongolera - mutha kusintha neural network, hosting, seva - zambiri, zofuna zilizonse.

Seva

Tiyeni tiyambe ndi chitsanzo chapafupi.

Mwachikhalidwe ndimagwiritsa ntchito Flask pa REST API, OpenCV ndi MobileSSD network.

Nditayika zomasulira zamakono pa Docker, ndinapeza kuti OpenCV 4.1.2 sigwira ntchito ndi Mobile SSD v1_coco_2018_01_28, ndipo ndinayenera kubwerera ku 11/06_2017 yotsimikiziridwa.

Kumayambiriro kwa utumiki, timayika mayina a kalasi ndi maukonde:

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

Pa docker yakomweko (pa laputopu yaying'ono kwambiri) zimatengera masekondi 0.3, pa Raspberry - 3.5.

Tiyeni tiyambe kuwerengera:

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

Kutembenuza ma tensor exhaust kukhala json yowerengeka:

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

Kutali Tumizani izi kudzera pa Flask(zolowera ndi chithunzi, zotuluka ndi zotsatira za chowunikira mu json).

Njira ina, yomwe ntchito yochulukirapo imasinthidwa ku seva: iyo yokha imazungulira zinthu zomwe zapezeka ndikubwezeretsanso chithunzi chomalizidwa.

Izi ndi zabwino pomwe sitikufuna kukoka opencv ku seva.

Docker

Timasonkhanitsa chithunzi.

Codeyo imasinthidwa ndikuyikidwa Github, docker azitenga molunjika kuchokera pamenepo.

Monga nsanja, tidzatenga Debian Stretch yomweyi monga pa Rasipiberi - sitidzapatuka pamwambo wotsimikiziridwa waukadaulo.

Muyenera kukhazikitsa botolo, protobuf, zopempha, opencv_python, tsitsani Mobile SSD, kachidindo ka seva kuchokera ku Github ndikuyambitsa seva.

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

Zosavuta kasitomala kasitomala kutengera zopempha.

Kusindikiza ku Docker Hub

Ma registries a Docker akuchulukirachulukira mwachangu kuposa zowunikira pamtambo.

Kuti tisavutike, tidzadutsa mosamalitsa DockerHub.

  1. Register
  2. Lowani muakaunti:
    kulowa kwa docker
  3. Tiyeni tibwere ndi dzina latanthauzo:
    docker tag opencv-zindikirani tprlab/opencv-detect-ssd
  4. Kwezani chithunzichi ku seva:
    docker push tprlab/opencv-detect-ssd

Timayika mumtambo

Kusankha komwe mungayendetse chidebecho ndikwambiri.

Osewera onse akuluakulu (Google, Microsoft, Amazon) amapereka mawonekedwe ang'onoang'ono kwaulere kwa chaka choyamba.
Nditayesa Microsoft Azure ndi Google Cloud, ndidakhazikika pazomaliza chifukwa idachoka mwachangu.

Sindinalembe malangizo apa, popeza gawo ili ndilolunjika kwa wopereka wosankhidwayo.

Ndinayesa njira zosiyanasiyana za hardware,
Miyezo yotsika (yogawidwa ndi yodzipereka) - 0.4 - 0.5 masekondi.
Magalimoto amphamvu kwambiri - 0.25 - 0.3.
Chabwino, ngakhale pazovuta kwambiri, zopambana zimakhala katatu, mutha kuyesa.

Π’ΠΈΠ΄Π΅ΠΎ

Timakhazikitsa kanema wosavuta wa OpenCV pa Raspberry, kuzindikira kudzera pa Google Cloud.
Pakuyesako, fayilo ya kanema idagwiritsidwa ntchito yomwe idajambulidwapo pamadutsana mwachisawawa.


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

Ndi chojambulira sitipeza mafelemu osapitilira atatu pamphindikati, chilichonse chimayenda pang'onopang'ono.
Ngati mutenga makina amphamvu mu GCloud, mutha kuzindikira mafelemu 4-5 pamphindikati, koma kusiyana kwake kumakhala kosawoneka ndi maso, kumachedwa.

Kanema wa Cloud Object Detector pa Raspberry Pi

Mtengo wamtambo ndi zoyendera sizikugwirizana nazo; chojambulira chimayenda pazida wamba ndipo chimagwira ntchito mwachangu.

Neural Computer Stick

Sindinathe kukana ndikuyendetsa benchmark pa NCS.

Liwiro la chojambulira linali pang'onopang'ono kuposa masekondi 0.1, mulimonse 2-3 nthawi mofulumira kuposa mtambo pa makina ofooka, mwachitsanzo 8-9 mafelemu pamphindi.

Kanema wa Cloud Object Detector pa Raspberry Pi

Kusiyana kwazotsatira kumafotokozedwa ndi mfundo yakuti NCS inali kuyendetsa Mobile SSD version 2018_01_28.

PS Kuphatikiza apo, kuyesa kwawonetsa kuti makina apakompyuta amphamvu kwambiri okhala ndi purosesa ya I7 amawonetsa zotsatira zabwinoko pang'ono ndipo zidatheka kufinya mafelemu 10 pamphindikati.

Cluster

Kuyesako kudapitilira ndipo ndidayika chowunikira pamfundo zisanu mu Google Kubernetes.
Makokowo anali ofooka ndipo aliyense wa iwo sakanatha kukonza mafelemu opitilira 2 pamphindikati.
Koma ngati muthamanga gulu lokhala ndi mfundo za N ndikugawa mafelemu mu ulusi wa N, ndiye kuti ndi ma node okwanira (5) mutha kukwaniritsa mafelemu 10 omwe mukufuna pamphindikati.

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

Nazi zomwe zidachitika:

Kanema wa Cloud Object Detector pa Raspberry Pi

Kuthamanga pang'ono kuposa ndi NCS, koma mwamphamvu kuposa mumtsinje umodzi.

Kupindula, ndithudi, sikuli mzere - pali zowonjezera zogwirizanitsa ndikujambula mozama zithunzi za opencv.

Pomaliza

Ponseponse, kuyesako kumatilola kuganiza kuti ngati mutayesa, mutha kuchoka ndi mtambo wosavuta.

Koma kompyuta yamphamvu kapena zida zakomweko zimakupatsani mwayi wopeza zotsatira zabwino, komanso popanda zidule.

powatsimikizira

Source: www.habr.com

Kuwonjezera ndemanga