Video ya Cloud Object Detector kwenye Raspberry Pi

Dibaji

Video sasa inazunguka kwenye Mtandao inayoonyesha jinsi dereva wa Tesla anavyoona barabara.

Nimekuwa nikiwasha kwa muda mrefu kutangaza video iliyoboreshwa na kigunduzi, na kwa wakati halisi.

Video ya Cloud Object Detector kwenye Raspberry Pi

Shida ni kwamba ninataka kutangaza video kutoka kwa Raspberry, na utendaji wa kigunduzi cha mtandao wa neural juu yake huacha kuhitajika.

Fimbo ya Kompyuta ya Neural ya Intel

Nilizingatia suluhisho tofauti.

Π’ makala ya mwisho ilijaribu Fimbo ya Kompyuta ya Neural ya Intel. Vifaa ni nguvu, lakini inahitaji muundo wake wa mtandao.

Ingawa Intel hutoa vigeuzi kwa mifumo mikuu, kuna idadi ya mitego.

Kwa mfano, muundo wa mtandao unaohitajika unaweza kuwa hauendani, na ikiwa ni sambamba, basi baadhi ya tabaka haziwezi kuungwa mkono kwenye kifaa, na ikiwa zinaungwa mkono, basi makosa yanaweza kutokea wakati wa mchakato wa uongofu, kama matokeo ambayo tunapata vitu vya kushangaza kwenye pato.

Kwa ujumla, ikiwa unataka aina fulani ya mtandao wa neva wa kiholela, basi huenda usifanye kazi na NCS. Kwa hiyo, niliamua kujaribu kutatua tatizo kwa kutumia zana zilizoenea zaidi na zinazoweza kupatikana.

Wingu

Mbadala dhahiri kwa suluhisho la vifaa vya ndani ni kwenda kwenye wingu.

Chaguzi zilizopangwa tayari - macho yangu yanakimbia.

Viongozi wote:

... Na kadhaa ya wale wasiojulikana sana.

Kuchagua kati ya aina hii si rahisi kabisa.

Na niliamua kutochagua, lakini kufunika mpango mzuri wa zamani wa kufanya kazi kwenye OpenCV huko Docker na kuiendesha kwenye wingu.

Faida ya njia hii ni kubadilika na udhibiti - unaweza kubadilisha mtandao wa neural, mwenyeji, seva - kwa ujumla, whim yoyote.

Seva

Wacha tuanze na mfano wa ndani.

Kijadi mimi hutumia Flask kwa REST API, OpenCV na mtandao wa MobileSSD.

Baada ya kusanikisha matoleo ya sasa kwenye Docker, niligundua kuwa OpenCV 4.1.2 haifanyi kazi na Simu ya SSD v1_coco_2018_01_28, na ilibidi nirudi kwenye iliyothibitishwa 11/06_2017.

Mwanzoni mwa huduma, tunapakia majina ya darasa na mtandao:

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

Kwenye docker ya ndani (kwenye kompyuta ndogo sana) inachukua sekunde 0.3, kwenye Raspberry - 3.5.

Wacha tuanze kuhesabu:

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.

Kubadilisha kutolea nje kwa tensor kuwa json inayoweza kusomeka:

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

Mbali Hamisha shughuli hii kupitia Flask(pembejeo ni picha, matokeo ni matokeo ya kigunduzi katika json).

Chaguo mbadala, ambayo kazi zaidi inabadilishwa kwa seva: yenyewe inazunguka vitu vilivyopatikana na inarudi picha iliyokamilishwa.

Chaguo hili ni nzuri ambapo hatutaki kuburuta opencv hadi kwenye seva.

Doka

Tunakusanya picha.

Msimbo umechanwa na kuchapishwa Github, docker itachukua moja kwa moja kutoka hapo.

Kama jukwaa, tutachukua Debian Stretch sawa na kwenye Raspberry - hatutakengeuka kutoka kwa rundo la teknolojia lililothibitishwa.

Unahitaji kusakinisha chupa, protobuf, maombi, opencv_python, pakua SSD ya Simu, msimbo wa seva kutoka Github na uanze 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"]

Rahisi mteja wa detector kulingana na maombi.

Kuchapisha kwa Docker Hub

Rejesta za Docker zinaongezeka kwa kasi isiyopungua vigunduzi vya wingu.

Ili tusijisumbue, tutapitia kihafidhina DockerHub.

  1. Sajili
  2. Ingia:
    kuingia kwa docker
  3. Hebu tuje na jina la maana:
    lebo ya docker opencv-gundua tprlab/opencv-detect-ssd
  4. Pakia picha kwenye seva:
    docker push tprlab/opencv-detect-ssd

Tunazindua katika wingu

Chaguo la mahali pa kuendesha chombo pia ni pana kabisa.

Wachezaji wote wakubwa (Google, Microsoft, Amazon) hutoa mfano mdogo bila malipo kwa mwaka wa kwanza.
Baada ya kujaribu na Microsoft Azure na Google Cloud, nilitulia kwa mwisho kwa sababu ilianza haraka.

Sikuandika maagizo hapa, kwa kuwa sehemu hii ni maalum sana kwa mtoa huduma aliyechaguliwa.

Nilijaribu chaguzi tofauti za vifaa,
Viwango vya chini (kushirikiwa na kujitolea) - sekunde 0.4 - 0.5.
Magari yenye nguvu zaidi - 0.25 - 0.3.
Kweli, hata katika hali mbaya zaidi, ushindi ni mara tatu, unaweza kujaribu.

Video

Tunazindua kipeperushi rahisi cha video cha OpenCV kwenye Raspberry, kinachogundua kupitia Google Cloud.
Kwa jaribio, faili ya video ilitumiwa ambayo ilirekodiwa kwenye makutano ya nasibu.


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

Kwa kigunduzi hatupati zaidi ya fremu tatu kwa sekunde, kila kitu huenda polepole sana.
Ukipeleka mashine yenye nguvu kwenye GCloud, unaweza kugundua fremu 4-5 kwa sekunde, lakini tofauti hiyo karibu haionekani kwa macho, bado iko polepole.

Video ya Cloud Object Detector kwenye Raspberry Pi

Gharama za wingu na usafirishaji hazina uhusiano wowote nayo; kigunduzi huendesha vifaa vya kawaida na hufanya kazi kwa kasi kama hiyo.

Fimbo ya Kompyuta ya Neural

Sikuweza kupinga na nikaweka alama kwenye NCS.

Kasi ya kigunduzi ilikuwa polepole kidogo kuliko sekunde 0.1, kwa hali yoyote mara 2-3 haraka kuliko wingu kwenye mashine dhaifu, i.e. fremu 8-9 kwa sekunde.

Video ya Cloud Object Detector kwenye Raspberry Pi

Tofauti katika matokeo inaelezewa na ukweli kwamba toleo la Simu ya SSD 2018_01_28 ilizinduliwa kwenye NCS.

P.S. Kwa kuongezea, majaribio yameonyesha kuwa mashine yenye nguvu ya eneo-kazi yenye kichakataji cha I7 inaonyesha matokeo bora zaidi na ikawa inawezekana kubana fremu 10 kwa sekunde.

Nguzo

Jaribio lilienda zaidi na niliweka kigunduzi kwenye nodi tano kwenye Google Kubernetes.
Maganda yenyewe yalikuwa dhaifu na kila mmoja wao hakuweza kusindika zaidi ya viunzi 2 kwa sekunde.
Lakini ikiwa unaendesha kikundi na nodi za N na kuchanganua fremu katika nyuzi N, basi kwa idadi ya kutosha ya nodi (5) unaweza kufikia muafaka 10 unaotaka kwa sekunde.

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

Hiki ndicho kilichotokea:

Video ya Cloud Object Detector kwenye Raspberry Pi

Haraka kidogo kuliko NCS, lakini ina nguvu zaidi kuliko mkondo mmoja.

Faida, kwa kweli, sio ya mstari - kuna mwingiliano wa maingiliano na kunakili kwa kina kwa picha za opencv.

Hitimisho

Kwa ujumla, jaribio huturuhusu kuhitimisha kwamba ukijaribu, unaweza kuondokana na wingu rahisi.

Lakini desktop yenye nguvu au vifaa vya ndani hukuruhusu kufikia matokeo bora, na bila hila yoyote.

marejeo

Chanzo: mapenzi.com

Kuongeza maoni