Ividiyo ye-Cloud Object Detector kwiRaspberry Pi

Isingeniso

Ividiyo ngoku ijikeleza kwi-Intanethi ebonisa indlela i-autopilot kaTesla ebona ngayo indlela.

Kudala ndirhawuzelelwa ukusasaza ividiyo etyetyisiweyo ngesixhobo, kwaye ngexesha lokwenyani.

Ividiyo ye-Cloud Object Detector kwiRaspberry Pi

Ingxaki kukuba ndifuna ukusasaza ividiyo kwiRaspberry, kwaye ukusebenza kwe-neural network detector kuyo kushiya okuninzi okufunwayo.

Intel Neural Computer Stick

Ndaqwalasela izicombululo ezahlukahlukeneyo.

Π’ inqaku lokugqibela yalinga i-Intel Neural Computer Stick. I-hardware inamandla, kodwa ifuna ifomathi yayo yenethiwekhi.

Nangona i-Intel ibonelela ngabaguquli bezakhelo eziphambili, kukho inani lemigibe.

Ngokomzekelo, ifomathi yenethiwekhi efunekayo isenokungahambelani, kwaye ukuba iyahambelana, ke ezinye iileyile azinakuxhaswa kwisixhobo, kwaye ukuba zixhaswa, iimpazamo zinokuthi zenzeke ngexesha lokuguqulwa kwenkqubo, ngenxa yoko. sifumana izinto ezingaqhelekanga kwimveliso.

Ngokubanzi, ukuba ufuna uhlobo oluthile lwenethiwekhi ye-neural engafanelekanga, ngoko ayinakusebenza kunye ne-NCS. Ngoko ke, ndagqiba ekubeni ndizame ukusombulula ingxaki ngokusebenzisa izixhobo ezixhaphake kakhulu kwaye zifikeleleke.

Ilifu

Enye indlela ecacileyo kwisisombululo se-hardware sasekhaya kukuya kwilifu.

Iinketho esele zenziwe - amehlo am abaleka.

Zonke iinkokeli:

... Kwaye uninzi lwabaziwayo kancinci.

Ukukhetha phakathi kwezi ndidi akulula kwaphela.

Kwaye ndaye ndagqiba kwelokuba ndingakhethi, kodwa ndisonge iskimu esihle sokusebenza esidala kwi-OpenCV eDocker kwaye ndiyiqhube efini.

Inzuzo yale ndlela iguquguqukayo kunye nokulawula - unokutshintsha inethiwekhi ye-neural, i-hosting, iseva - ngokubanzi, nayiphi na i-whim.

UmSebenzi

Masiqale ngeprototype yasekhaya.

Ngokwesiko ndisebenzisa iFlask ye-REST API, i-OpenCV kunye nenethiwekhi ye-MobileSSD.

Emva kokufaka iinguqulelo zangoku kwi-Docker, ndafumanisa ukuba i-OpenCV 4.1.2 ayisebenzi nge-Mobile SSD v1_coco_2018_01_28, kwaye kwafuneka ndibuyele kwi-11/06_2017 eqinisekisiweyo.

Ekuqaleni kwenkonzo, silayisha amagama eklasi kunye nenethiwekhi:

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

Kwi-docker yendawo (kwi-laptop engekho kakhulu) kuthatha imizuzwana eyi-0.3, kwi-Raspberry - 3.5.

Masiqale ukubala:

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

I-Docker - i-0.2 sec, i-Raspberry - 1.7.

Ukuguqula i-tensor exhaust ibe yi-json efundekayo:

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

Ngapha koko thumela ngaphandle lo msebenzi ngeFlask(igalelo ngumfanekiso, imveliso ziziphumo ze detector kwi json).

Olunye ukhetho, apho umsebenzi omninzi utshintshelwa kumncedisi: yona ngokwayo isangqa izinto ezifunyenweyo kwaye ibuyisela umfanekiso ogqityiweyo.

Olu khetho lulungile apho singafuni ukutsala i-opencv kumncedisi.

Docker

Siqokelela umfanekiso.

Ikhowudi ikanwe kwaye iposwe Github, idocker iyakuyithatha ngqo ukusuka apho.

Njengeqonga, siya kuthabatha iDebian Stretch efanayo njengakwiRaspberry - asiyi kuphambuka kwisitaki setekhnoloji esiqinisekisiweyo.

Kufuneka ufake i-flask, i-protobuf, izicelo, i-opencv_python, khuphela i-Mobile SSD, ikhowudi yomncedisi kwi-Github kwaye uqale iseva.

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

Elula umxhasi wesixhobo ngokusekelwe kwizicelo.

Ukupapasha kwi-Docker Hub

Iirejistri zeDocker ziyaphindaphindeka ngesantya esingekho ngaphantsi kwee-detectors zamafu.

Ukuze singazikhathazi, siya kudlula ngokungqongqo DockerHub.

  1. Bhalisa
  2. Ngema:
    ukungena kwidocker
  3. Makhe size negama elinentsingiselo:
    docker tag opencv-bona i-tprlab/opencv-detect-ssd
  4. Layisha umfanekiso kwiseva:
    docker push tprlab/opencv-detect-ssd

Siqalisa efini

Ukhetho lwendawo yokuqhuba isikhongozeli nalo lubanzi kakhulu.

Bonke abadlali abakhulu (uGoogle, iMicrosoft, iAmazon) banikezela nge-micro-instance simahla kunyaka wokuqala.
Emva kokuzama iMicrosoft Azure kunye neLifu likaGoogle, ndazinza kokugqibela kuba yasuka ngokukhawuleza.

Andiyibhalanga imiyalelo apha, kuba le nxalenye igxile kakhulu kumnikezeli okhethiweyo.

Ndizame iinketho ezahlukeneyo zehardware,
Amanqanaba aphantsi (kwabelwana kwaye anikezelwe) - 0.4 - 0.5 imizuzwana.
Iimoto ezinamandla ngakumbi - 0.25 - 0.3.
Ewe, nakwimeko embi kakhulu, impumelelo iphindwe kathathu, ungazama.

Π’ΠΈΠ΄Π΅ΠΎ

Siphehlelela ividiyo elula ye-OpenCV kwiRaspberry, sibona ngeLifu likaGoogle.
Kuvavanyo, kwasetyenziswa ifayile yevidiyo eyayikhe yafotwa kwindawo engacwangciswanga.


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

Ngesixhobo asifumani ngaphezu kwezakhelo ezintathu ngomzuzwana, yonke into ihamba ngokucotha kakhulu.
Ukuba uthatha umatshini onamandla kwi-GCloud, unokubona iifreyimu ezi-4-5 ngomzuzwana, kodwa umahluko uphantse ungabonakali emehlweni, usacotha.

Ividiyo ye-Cloud Object Detector kwiRaspberry Pi

Ilifu kunye neendleko zothutho azinanto yakwenza nayo; umtshini uqhuba kwi-hardware eqhelekileyo kwaye usebenza ngeso santya.

Intonga yeKhompyutha yeNeural

Andikwazanga ukuxhathisa kwaye ndiqhube i-benchmark kwi-NCS.

Isantya somtshini sasicotha kancinci kunemizuzwana eyi-0.1, kuyo nayiphi na imeko amaxesha angama-2-3 ngokukhawuleza kunelifu kumatshini obuthathaka, oko kukuthi iifreyimu eziyi-8-9 ngesekhondi.

Ividiyo ye-Cloud Object Detector kwiRaspberry Pi

Umahluko kwiziphumo uchazwa yinyaniso yokuba i-NCS yayiqhuba i-Mobile SSD version 2018_01_28.

P.S. Ukongeza, iimvavanyo zibonise ukuba umatshini wedesktop onamandla ngokufanelekileyo oneprosesa ye-I7 ubonisa iziphumo ezingcono kancinci kwaye kuye kwenzeka ukuba ucinezele iifreyimu ezili-10 ngomzuzwana.

Iqela

Uvavanyo luye lwaya phambili kwaye ndafaka umtshina kwiindawo ezintlanu zikaGoogle Kubernetes.
Iipods ngokwazo zazibuthathaka kwaye ngamnye kubo wayengenakukwazi ukucubungula ngaphezu kweefreyimu ezi-2 ngomzuzwana.
Kodwa ukuba uqhuba iqela elinamaqhuqhuva e-N kwaye ucazulule izakhelo kwimisonto engu-N, emva koko ngenani elaneleyo leenodi (5) ungafezekisa iifreyimu ezili-10 ezifunwayo ngomzuzwana.

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

Nantsi into eyenzekayo:

Ividiyo ye-Cloud Object Detector kwiRaspberry Pi

Ukukhawuleza okuncinci kune-NCS, kodwa yomelele ngakumbi kunomlambo omnye.

Inzuzo, ngokuqinisekileyo, ayikho imigca - kukho ukugqithiswa kongqamaniso kunye nokukopa okunzulu kwemifanekiso ye-opencv.

isiphelo

Ngokubanzi, uvavanyo lusivumela ukuba sigqibe kwelokuba ukuba uyazama, ungabaleka ngelifu elilula.

Kodwa i-desktop enamandla okanye i-hardware yendawo ikuvumela ukuba ufezekise iziphumo ezingcono, kwaye ngaphandle kwamaqhinga.

iimbekiselo

umthombo: www.habr.com

Yongeza izimvo