Videyo detektè objè nwaj sou Franbwaz Pi

Prologue

Yon videyo ap sikile kounye a sou entènèt la ki montre kijan otopilòt Tesla a wè wout la.

Mwen te grate pou yon tan long difize videyo anrichi ak yon detektè, ak nan tan reyèl.

Videyo detektè objè nwaj sou Franbwaz Pi

Pwoblèm lan se ke mwen vle difize videyo soti nan Franbwaz, ak pèfòmans nan detektè a rezo neral sou li kite anpil yo dwe vle.

Intel Neural Computer Stick

Mwen konsidere diferan solisyon.

В dènye atik te fè eksperyans ak Intel Neural Computer Stick. Pyès ki nan konpitè a pwisan, men li mande pwòp fòma rezo li.

Menm si Intel bay konvètisè pou gwo kad, gen yon kantite enkonvenyans.

Pou egzanp, fòma rezo obligatwa a ka enkonpatib, epi si li konpatib, Lè sa a, kèk kouch ka pa sipòte sou aparèy la, epi si yo sipòte, Lè sa a, erè ka rive pandan pwosesis konvèsyon an, kòm yon rezilta. nou jwenn kèk bagay etranj nan pwodiksyon an.

An jeneral, si ou vle yon kalite rezo neral abitrè, Lè sa a, li ka pa travay ak NCS. Se poutèt sa, mwen deside eseye rezoud pwoblèm nan lè l sèvi avèk zouti ki pi gaye ak aksesib.

Cloud

Altènatif la evidan nan yon solisyon pyès ki nan konpitè lokal se ale nan nwaj la.

Opsyon pare yo - je m 'kouri sovaj.

Tout lidè yo:

... Ak plizyè douzèn pi piti li te ye.

Chwazi nan mitan varyete sa a se pa ditou fasil.

Apre sa, mwen deside pa chwazi, men vlope bon ansyen konplo k ap travay sou OpenCV nan Docker epi kouri li nan nwaj la.

Avantaj nan apwòch sa a se fleksibilite ak kontwòl - ou ka chanje rezo a neral, hosting, sèvè - an jeneral, nenpòt kapris.

Sèvè

Ann kòmanse ak yon pwototip lokal.

Tradisyonèlman mwen itilize Flask pou REST API, OpenCV ak rezo MobileSSD.

Lè m te enstale vèsyon aktyèl yo sou Docker, mwen te dekouvri ke OpenCV 4.1.2 pa travay ak Mobile SSD v1_coco_2018_01_28, epi mwen te oblije retounen nan pwouve 11/06_2017 la.

Nan kòmansman sèvis la, nou chaje non klas yo ak rezo a:

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

Sou yon docker lokal (sou yon laptop ki pa trè jèn) li pran 0.3 segonn, sou Franbwaz - 3.5.

Ann kòmanse kalkil la:

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

Vire echapman tensor nan json lizib:

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

Pli lwen ekspòte operasyon sa a atravè Flask(Entre se yon foto, pwodiksyon se rezilta detektè a nan json).

Yon opsyon altènatif, nan ki plis travay deplase nan sèvè a: li menm li sèk objè yo jwenn epi retounen imaj la fini.

Opsyon sa a bon kote nou pa vle trennen opencv sou sèvè a.

Docker

Nou kolekte imaj la.

Kòd la penyen epi afiche sou li Github, Docker pral pran li dirèkteman nan la.

Kòm yon platfòm, nou pral pran menm Debian Detire ak sou Franbwaz - nou pa pral devye de pil teknoloji pwouve.

Ou bezwen enstale flask, protobuf, demann, opencv_python, telechaje SSD mobil, kòd sèvè soti nan Github epi kòmanse sèvè a.

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

Plenn kliyan detektè baze sou demann.

Pibliye nan Docker Hub

Rejis Docker yo ap miltipliye nan yon vitès ki pa mwens pase detektè nwaj yo.

Nan lòd pa anmède, nou pral konsèvativman ale nan DockerHub.

  1. Enskri
  2. Ouvri sesyon an:
    docker login
  3. Ann vini ak yon non ki gen sans:
    Docker tag opencv-detect tprlab/opencv-detect-ssd
  4. Voye imaj la sou sèvè a:
    docker pouse tprlab/opencv-detect-ssd

Nou lanse nan nwaj la

Chwa a nan kote yo kouri veso a se tou byen lajè.

Tout gwo jwè yo (Google, Microsoft, Amazon) ofri yon mikwo-enstans gratis pou premye ane a.
Apre fè eksperyans ak Microsoft Azure ak Google Cloud, mwen rezoud sou lèt la paske li te pran pi vit.

Mwen pa t ekri enstriksyon isit la, paske pati sa a trè espesifik pou founisè yo chwazi a.

Mwen te eseye diferan opsyon pyès ki nan konpitè,
Nivo ki ba (pataje ak dedye) - 0.4 - 0.5 segonn.
Machin ki pi pwisan - 0.25 - 0.3.
Oke, menm nan pi move senaryo a, gaye yo se twa fwa, ou ka eseye.

Videyo

Nou lanse yon senp videyo OpenCV sou Franbwaz, detekte atravè Google Cloud.
Pou eksperyans la, yo te itilize yon dosye videyo ki te yon fwa filme-li nan yon entèseksyon o aza.


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

Avèk detektè a nou pa jwenn plis pase twa ankadreman pou chak segonn, tout bagay ale trè dousman.
Si ou pran yon machin pwisan nan GCloud, ou ka detekte 4-5 ankadreman pou chak segonn, men diferans lan prèske envizib nan je a, li toujou dousman.

Videyo detektè objè nwaj sou Franbwaz Pi

Nwaj la ak depans transpò pa gen anyen fè ak li; detektè a kouri sou pyès ki nan konpitè òdinè epi li travay nan yon vitès konsa.

Baton Odinatè Neural

Mwen pa t 'kapab reziste ak kouri referans a sou NCS.

Vitès detektè a te yon ti kras pi dousman pase 0.1 segonn, nan nenpòt ka 2-3 fwa pi vit pase nwaj la sou yon machin fèb, sa vle di 8-9 ankadreman pou chak segonn.

Videyo detektè objè nwaj sou Franbwaz Pi

Diferans nan rezilta yo eksplike pa lefèt ke NCS te kouri mobil SSD vèsyon 2018_01_28.

PS Anplis de sa, eksperyans yo te montre ke yon machin Desktop jistis pwisan ak yon processeur I7 montre yon ti kras pi bon rezilta epi li te tounen soti yo dwe posib peze 10 ankadreman pou chak segonn sou li.

Cluster

Eksperyans lan te ale pi lwen epi mwen enstale detektè a sou senk nœuds nan Google Kubernetes.
Gous yo tèt yo te fèb ak chak nan yo pa t 'kapab trete plis pase 2 ankadreman pou chak segonn.
Men, si ou kouri yon gwoup ak N nœuds ak analize ankadreman nan N fil, Lè sa a, ak yon kantite ase nan nœuds (5) ou ka reyalize 10 ankadreman yo vle pou chak segonn.

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

Men sa k te pase:

Videyo detektè objè nwaj sou Franbwaz Pi

Yon ti kras mwens vit pase ak NCS, men plis wòdpòte pase nan yon sèl kouran.

Benefis la, nan kou, se pa lineyè - gen superpositions pou senkronizasyon ak kopi gwo twou san fon nan imaj opencv.

Konklizyon

An jeneral, eksperyans la pèmèt nou konkli ke si ou eseye, ou ka jwenn lwen ak yon nwaj senp.

Men, yon Desktop pwisan oswa pyès ki nan konpitè lokal pèmèt ou reyalize pi bon rezilta, epi san okenn ke trik nouvèl.

Referans

Sous: www.habr.com

Add nouvo kòmantè