Video Detektor Objek Cloud ing Raspberry Pi

Prolog

Video saiki nyebar ing Internet sing nuduhake carane autopilot Tesla ndeleng dalan kasebut.

Aku wis gatel kanggo dangu kanggo siaran video enriched karo detektor, lan ing wektu nyata.

Video Detektor Objek Cloud ing Raspberry Pi

Masalahe yaiku aku pengin nyebarake video saka Raspberry, lan kinerja detektor jaringan syaraf kasebut akeh sing dikarepake.

Intel Neural Computer Stick

Aku dianggep solusi beda.

Π’ artikel pungkasan eksperimen karo Intel Neural Computer Stick. Hardware kuat, nanging mbutuhake format jaringan dhewe.

Sanajan Intel nyedhiyakake konverter kanggo kerangka utama, ana sawetara pitfalls.

Contone, format jaringan sing dibutuhake bisa uga ora kompatibel, lan yen kompatibel, sawetara lapisan bisa uga ora didhukung ing piranti kasebut, lan yen didhukung, kesalahan bisa kedadeyan sajrone proses konversi, minangka asil saka kita njaluk sawetara iku aneh ing output.

UmumΓ©, yen sampeyan pengin sawetara jinis jaringan saraf arbitrer, mula bisa uga ora bisa digunakake karo NCS. Mulane, aku mutusake kanggo nyoba ngatasi masalah kasebut kanthi nggunakake alat sing paling umum lan bisa diakses.

Awan

Alternatif sing jelas kanggo solusi hardware lokal yaiku pindhah menyang awan.

Opsi sing wis siap - mripatku dadi liar.

Kabeh pimpinan:

... Lan puluhan sing kurang dikenal.

Milih ing antarane macem-macem iki ora gampang.

Lan aku mutusake ora milih, nanging kanggo mbungkus skema kerja lawas sing apik ing OpenCV ing Docker lan mbukak ing mΓ©ga.

Kauntungan saka pendekatan iki yaiku keluwesan lan kontrol - sampeyan bisa ngganti jaringan saraf, hosting, server - umume, apa wae.

Server

Ayo dadi miwiti karo prototipe lokal.

Biasane aku nggunakake Flask kanggo REST API, OpenCV lan jaringan MobileSSD.

Sawise nginstal versi saiki ing Docker, aku nemokake OpenCV 4.1.2 ora bisa digunakake karo Mobile SSD v1_coco_2018_01_28, lan aku kudu bali menyang 11/06_2017 sing wis kabukten.

Ing wiwitan layanan, kita mbukak jeneng kelas lan jaringan:

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

Ing docker lokal (ing laptop ora enom banget) njupuk 0.3 detik, ing Raspberry - 3.5.

Ayo miwiti pitungan:

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

Ngowahi knalpot tensor dadi json sing bisa diwaca:

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

Luwih ngekspor operasi iki liwat Flask(input minangka gambar, output minangka asil saka detektor ing json).

Opsi alternatif, ing ngendi luwih akeh karya dipindhah menyang server: iku dhewe ngubengi obyek sing ditemokake lan ngasilake gambar sing wis rampung.

Opsi iki apik ing ngendi kita ora pengin nyeret opencv menyang server.

Docker

Kita ngumpulake gambar kasebut.

Kode wis combed lan dikirim ing Github, docker bakal njupuk langsung saka ing kono.

Kita bakal nggunakake Debian Stretch sing padha karo platform kaya ing Raspberry - kita ora bakal nyimpang saka tumpukan teknologi sing wis kabukten.

Sampeyan kudu nginstal flask, protobuf, panjalukan, opencv_python, download Mobile SSD, kode server saka Github lan miwiti server.

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

Prasaja klien detektor adhedhasar panyuwunan.

Nerbitake menyang Docker Hub

Registri Docker mundhak kanthi kacepetan ora kurang saka detektor awan.

Supaya ora keganggu, kita bakal kanthi konservatif DockerHub.

  1. Ndaftar
  2. mlebu:
    mlebu docker
  3. Ayo goleki jeneng sing migunani:
    tag docker opencv-detect tprlab/opencv-detect-ssd
  4. Unggah gambar menyang server:
    docker push tprlab/opencv-detect-ssd

Kita miwiti ing mΓ©ga

Pilihan ngendi kanggo mbukak wadhah uga cukup amba.

Kabeh pemain gedhe (Google, Microsoft, Amazon) nawakake conto mikro gratis kanggo taun pisanan.
Sawise nyobi karo Microsoft Azure lan Google Cloud, aku mapan ing terakhir amarga njupuk mati luwih cepet.

Aku ora nulis instruksi ing kene, amarga bagean iki khusus kanggo panyedhiya sing dipilih.

Aku nyoba macem-macem opsi hardware,
Tingkat kurang (dibagi lan darmabakti) - 0.4 - 0.5 detik.
Mobil sing luwih kuat - 0.25 - 0.3.
Inggih, sanajan ing skenario paling awon, menang kaping telu, sampeyan bisa nyoba.

Video

Kita miwiti streamer video OpenCV prasaja ing Raspberry, ndeteksi liwat Google Cloud.
Kanggo eksperimen, file video digunakake sing tau direkam ing persimpangan acak.


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

Kanthi detektor kita entuk ora luwih saka telung pigura per detik, kabeh dadi alon banget.
Yen sampeyan njupuk mesin kuat menyang GCloud, sampeyan bisa ndeteksi 4-5 pigura per detik, nanging prabΓ©dan meh ora katon ing mripat, iku isih alon.

Video Detektor Objek Cloud ing Raspberry Pi

Biaya awan lan transportasi ora ana hubungane; detektor kasebut nganggo piranti keras biasa lan bisa digunakake kanthi cepet.

Stik Komputer Neural

Aku ora bisa nolak lan mlayu pathokan ing NCS.

Kacepetan detektor rada luwih alon tinimbang 0.1 detik, ing kasus apa wae 2-3 kaping luwih cepet tinimbang awan ing mesin sing ringkih, yaiku 8-9 pigura per detik.

Video Detektor Objek Cloud ing Raspberry Pi

Bentenipun ing asil diterangake dening kasunyatan sing NCS mbukak Mobile SSD versi 2018_01_28.

P.S. Kajaba iku, eksperimen nuduhake manawa mesin desktop sing cukup kuat kanthi prosesor I7 nuduhake asil sing luwih apik lan bisa nyepetake 10 pigura per detik.

Kluster

Eksperimen kasebut luwih maju lan aku nginstal detektor ing limang simpul ing Google Kubernetes.
Polong kasebut ora kuwat lan saben-saben ora bisa ngolah luwih saka 2 pigura per detik.
Nanging yen sampeyan mbukak kluster karo N simpul lan parse pigura ing N Utas, banjur karo nomer cekap saka kelenjar (5) sampeyan bisa entuk 10 pigura per detik sing dikarepake.

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

Punika kedadosan:

Video Detektor Objek Cloud ing Raspberry Pi

A sethitik kurang cepet saka karo NCS, nanging luwih vigorous saka ing siji stream.

Keuntungan, mesthi, ora linear - ana overlay kanggo sinkronisasi lan nyalin jero gambar opencv.

kesimpulan

Sakabèhé, eksperimen ngidini kita nyimpulake yen sampeyan nyoba, sampeyan bisa lolos kanthi awan sing prasaja.

Nanging desktop utawa hardware lokal sing kuat ngidini sampeyan entuk asil sing luwih apik, lan tanpa trik.

referensi

Source: www.habr.com

Add a comment