Vîdyoya Detektora Cloud Object li ser Raspberry Pi

Prologue

Vîdyoyek nuha li ser Înternetê belav dibe ku nîşan dide ka otopîlotê Tesla çawa rê dibîne.

Ez demek dirêj diêşiyam ku vîdyoya bi dedektorek dewlemendkirî û di wextê rast de belav bikim.

Vîdyoya Detektora Cloud Object li ser Raspberry Pi

Pirsgirêk ev e ku ez dixwazim vîdyoyê ji Raspberry biweşînim, û performansa detektora torê ya neuralî ya li ser wê pir xwestek dihêle.

Intel Neural Computer Stick

Min çareseriyên cuda nirxand.

В gotara dawî bi Intel Neural Computer Stick ceribandin. Zehf hêzdar e, lê forma torê ya xwe hewce dike.

Her çend Intel ji bo çarçoveyên sereke veguherîneran peyda dike jî, gelek xeletî hene.

Mînakî, dibe ku formata tora hewce ne lihevhatî be, û heke ew lihevhatî be, wê hingê dibe ku hin qat li ser cîhazê neyên piştgirî kirin, û heke ew piştgirî bin, wê hingê dibe ku di pêvajoya veguheztinê de xeletî çêbibin, ku di encamê de em di encam de hin tiştên ecêb distînin.

Bi gelemperî, heke hûn celebek tora neuralî ya kêfî dixwazin, wê hingê dibe ku ew bi NCS re nexebite. Ji ber vê yekê, min biryar da ku hewl bidim ku pirsgirêkê bi karanîna amûrên herî berbelav û gihîştî çareser bikim.

Cloud

Alternatîfek eşkere ya çareseriyek hardware ya herêmî ev e ku biçin ewr.

Vebijarkên amade - çavên we hov dibin.

Hemû rêber:

... Û bi dehan yên kêm naskirî.

Hilbijartina di nav vê cûrbecûr de qet ne hêsan e.

Û min biryar da ku ez nekim, lê ez pilana xebata kevn a baş li ser OpenCV-ê li Docker-ê bixim û wê di ewrê de bimeşînim.

Feydeya vê nêzîkatiyê nermbûn û kontrol e - hûn dikarin tora neuralî, mêvandar, serverê biguhezînin - bi gelemperî, her kêfê.

Server

Ka em bi prototîpek herêmî dest pê bikin.

Bi kevneşopî ez Flask ji bo REST API, OpenCV û tora MobileSSD bikar tînim.

Piştî ku guhertoyên heyî yên li ser Docker saz kir, min kifş kir ku OpenCV 4.1.2 bi Mobile SSD v1_coco_2018_01_28 re naxebite, û neçar ma ku ez vegerim 11/06_2017-ya îsbatkirî.

Di destpêka karûbarê de, em navên polê û torê bar dikin:

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

Li ser dokerek herêmî (li ser laptopek ne pir ciwan) ew 0.3 saniye digire, li ser Raspberry - 3.5.

Ka em dest bi hesabkirinê bikin:

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.

Veguheztina eksoza tensorê li jsona xwendinê:

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

Zêdetir îxracata vê operasyonê bi rêya Flask(vedan wêneyek e, derketin encamên dedektorê di json de ye).

Vebijarkek alternatîf, ku tê de bêtir kar li serverê tê veguheztin: ew bixwe tiştên ku hatine dîtin dorpêç dike û wêneyê qediyayî vedigerîne.

Ev vebijark li cîhê ku em naxwazin opencv bikişîne ser serverê baş e.

Docker

Em wêneyê berhev dikin.

Kod tê komkirin û li ser tê şandin Github, docker wê rasterast ji wir bigire.

Wekî platformek, em ê heman Debian Stretch-ê wekî li ser Raspberry-ê bigirin - em ê ji stûna teknolojiya pejirandî dûr nekevin.

Pêdivî ye ku hûn flask, protobuf, daxwaz, opencv_python saz bikin, SSD-ya Mobîl, koda serverê ji Github dakêşin û serverê dest pê bikin.

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

Fransî muwekîlê detektor li ser bingeha daxwazan.

Weşandina Docker Hub

Tomarên Docker bi lezek ku ji detektorên ewr ne kêmtir zêde dibin.

Ji bo ku em aciz nebin, em ê bi awayekî kevneperest derbas bibin DockerHub.

  1. Fêhrist
  2. Têkeve:
    login docker
  3. Werin em navekî watedar bînin ziman:
    etîketa docker opencv-detect tprlab/opencv-detect-ssd
  4. Wêne li serverê barkirin:
    docker push tprlab/opencv-detect-ssd

Em di ewr de dest pê dikin

Hilbijartina cîhê ku konteynerê dimeşîne jî pir berfireh e.

Hemî lîstikvanên mezin (Google, Microsoft, Amazon) ji bo sala yekem mîkro-nimûneyek belaş pêşkêş dikin.
Piştî ceribandina Microsoft Azure û Google Cloud, ez li ser ya paşîn rûniştim ji ber ku ew zûtir rabû.

Min li vir rêwerzan nenivîsî, ji ber ku ev beş ji pêşkêşvanê hilbijartî re pir taybetî ye.

Min vebijarkên cûda yên hardware ceriband,
Asta kêm (hevbeş û veqetandî) - 0.4 - 0.5 çirke.
Otomobîlên bihêztir - 0.25 - 0.3.
Welê, di senaryoya herî xirab de jî, serketî sê carî ne, hûn dikarin biceribînin.

Видео

Em li ser Raspberry vîdyoyek vekirî ya OpenCV-ya hêsan didin destpêkirin, ku bi navgîniya Google Cloud ve tê kifş kirin.
Ji bo ceribandinê, dosyayek vîdyoyê hate bikar anîn ku carekê li xaçerêyek rasthatî hatî kişandin.


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

Bi dedektorê em di çirkeyê de ji sê çarçeweyan zêdetir nagirin, her tişt pir hêdî diçe.
Ger hûn makîneyek hêzdar bavêjin nav GCloud, hûn dikarin 4-5 çarçove di çirkeyê de tespît bikin, lê cûdahî hema hema ji çavê nayê dîtin, ew hîn jî hêdî ye.

Vîdyoya Detektora Cloud Object li ser Raspberry Pi

Mesrefên ewr û veguheztinê bi wê re tine ye; dedektor li ser cîhaza birêkûpêk dixebite û bi wê lezê dixebite.

Neural Computer Stick

Min nekarî li ber xwe bidim û pîvana li ser NCS-ê bazda.

Leza dedektorê ji 0.1 saniyeyan hinekî hêdîtir bû, di her hal de 2-3 carî ji ewrê li ser makîneyek qelstir, ango 8-9 çarçove di çirkeyê de.

Vîdyoya Detektora Cloud Object li ser Raspberry Pi

Cûdahiya di encaman de bi rastiya ku NCS guhertoya SSD-ya Mobîl 2018_01_28 dimeşand tê rave kirin.

P.S. Digel vê yekê, ceribandinan destnîşan kir ku makîneyek sermaseya pir bi hêz a bi pêvajoyek I7 re encamên hinekî çêtir nîşan dide û derket holê ku meriv di saniyeyê de 10 çarçove bişkîne.

Klaster

Ezmûn hê bêtir çû û min dedektor li ser pênc girêkên Google Kubernetes saz kir.
Pod bi xwe qels bûn û her yek ji wan nikarîbû di çirkeyê de zêdetirî 2 çarçeweyan bişopîne.
Lê heke hûn komek bi N girêkan bimeşînin û çarçeweyan di N têlan de parsek bikin, wê hingê bi hejmarek têr girêkan (5) hûn dikarin di çirkeyê de 10 çarçoveyên xwestinê bi dest bixin.

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

Li vir çi ye?

Vîdyoya Detektora Cloud Object li ser Raspberry Pi

Ji NCS-ê piçek kêmtir bilez, lê ji yek tîrêjê bi hêztir.

Qezenc, bê guman, ne rêzik e - ji bo hevdengkirin û kopîkirina kûr a wêneyên opencv-ê hene.

encamê

Bi tevayî, ceribandin destûrê dide me ku em encam bidin ku heke hûn biceribînin, hûn dikarin bi ewrek hêsan dûr bikevin.

Lê sermaseyek hêzdar an nermalava herêmî dihêle hûn bigihîjin encamên çêtir, û bêyî hîleyan.

references

Source: www.habr.com

Add a comment