Raspberry Pi-də Bulud Obyekt Detektorunun Videosu

Ön söz

İndi internetdə Teslanın avtopilotunun yolu necə gördüyünü göstərən bir video yayılır.

Uzun müddətdir ki, detektorla zənginləşdirilmiş və real vaxt rejimində video yayımlamaq üçün qaşınıram.

Raspberry Pi-də Bulud Obyekt Detektorunun Videosu

Problem ondadır ki, mən Raspberry-dən video yayımlamaq istəyirəm və onun üzərindəki neyroşəbəkə detektorunun işləməsi çox arzuolunandır.

Intel Neyron Kompüter Çubuğu

Müxtəlif həll yollarını nəzərdən keçirdim.

В Son məqalə Intel Neural Computer Stick ilə sınaqdan keçirdi. Aparat güclüdür, lakin öz şəbəkə formatını tələb edir.

Intel əsas çərçivələr üçün çeviricilər təqdim etsə də, bir sıra tələlər var.

Məsələn, tələb olunan şəbəkənin formatı uyğunsuz ola bilər və əgər uyğundursa, o zaman bəzi təbəqələr cihazda dəstəklənməyə bilər və əgər onlar dəstəklənirsə, o zaman konvertasiya zamanı xətalar baş verə bilər ki, bunun da nəticəsində çıxışda qəribə şeylər əldə edirik.

Ümumiyyətlə, bir növ ixtiyari neyron şəbəkəsi istəyirsinizsə, o zaman NCS ilə işləməyə bilər. Buna görə də ən geniş yayılmış və əlçatan vasitələrdən istifadə edərək problemi həll etməyə çalışmaq qərarına gəldim.

Bulud

Yerli aparat həllinə açıq alternativ buluddan istifadə etməkdir.

Hazır variantlar - gözləriniz vəhşiləşir.

Bütün liderlər:

... Və daha az tanınan onlarla.

Bu çeşid arasında seçim etmək heç də asan deyil.

Və mən seçim etməmək qərarına gəldim, amma köhnə yaxşı iş sxemini Docker-də OpenCV-də büküb buludda işlətmək qərarına gəldim.

Bu yanaşmanın üstünlüyü çeviklik və nəzarətdir - neyron şəbəkəni, hostinqi, serveri - ümumiyyətlə, istənilən şıltaqlığı dəyişə bilərsiniz.

Server

Yerli prototiplə başlayaq.

Ənənəvi olaraq mən REST API, OpenCV və MobileSSD şəbəkəsi üçün Flask istifadə edirəm.

Cari versiyaları Docker-də quraşdıraraq, OpenCV 4.1.2-nin Mobil SSD v1_coco_2018_01_28 ilə işləmədiyini aşkar etdim və mən sübut edilmiş 11/06_2017 tarixinə qayıtmalı oldum.

Xidmətin başlanğıcında biz sinif adlarını və şəbəkəni yükləyirik:

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

Yerli dokerdə (çox gənc olmayan noutbukda) 0.3 saniyə, Raspberry-də isə 3.5 saniyə çəkir.

Hesablamağa başlayaq:

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

Tensor egzozunu oxuna bilən json-a çevirmək:

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

Əlavə bu əməliyyatı Flask vasitəsilə ixrac edin(giriş şəkildir, çıxış json-da detektorun nəticələridir).

Daha çox işin serverə köçürüldüyü alternativ bir seçim: özü tapılan obyektləri dövrələyir və bitmiş şəkli qaytarır.

Opencv-ni serverə sürükləmək istəmədiyimiz yerdə bu seçim yaxşıdır.

Doker

Şəkili yığırıq.

Kod taranır və yerləşdirilir Github, docker onu birbaşa oradan götürəcək.

Platforma olaraq, Raspberry-də olduğu kimi eyni Debian Stretch-i alacağıq - sübut edilmiş texnoloji yığından kənara çıxmayacağıq.

Siz flask, protobuf, sorğular, opencv_python quraşdırmalı, Mobil SSD-ni, Github-dan server kodunu endirməli və serveri işə salmalısınız.

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

Sadə detektor müştəri sorğular əsasında.

Docker Hub-da nəşr olunur

Docker registrləri bulud detektorlarından az olmayan sürətlə çoxalır.

Narahat olmamaq üçün mühafizəkar şəkildə keçəcəyik DockerHub.

  1. Qeydiyyatdan keçin
  2. Daxil ol:
    docker girişi
  3. Gəlin mənalı bir ad tapaq:
    docker tag opencv-detect tprlab/opencv-detect-ssd
  4. Şəkli serverə yükləyin:
    docker push tprlab/opencv-detect-ssd

Buludda işə başlayırıq

Konteynerin harada işlədiləcəyi seçimi də kifayət qədər genişdir.

Bütün böyük oyunçular (Google, Microsoft, Amazon) ilk il üçün pulsuz olaraq mikro nümunə təklif edir.
Microsoft Azure və Google Cloud ilə təcrübə etdikdən sonra, daha sürətli getdiyi üçün sonuncuya qərar verdim.

Mən burada təlimat yazmadım, çünki bu hissə seçilmiş provayder üçün çox spesifikdir.

Müxtəlif hardware variantlarını sınadım,
Aşağı səviyyələr (paylaşılan və ayrılmış) - 0.4 - 0.5 saniyə.
Daha güclü avtomobillər - 0.25 - 0.3.
Yaxşı, ən pis halda belə, uduşlar üç dəfədir, cəhd edə bilərsiniz.

video

Biz Raspberry-də Google Bulud vasitəsilə aşkarlanan sadə OpenCV video yayımlayıcısını işə salırıq.
Təcrübə üçün bir dəfə təsadüfi kəsişmədə çəkilmiş video fayldan istifadə edilmişdir.


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

Detektorla saniyədə üçdən çox kadr almırıq, hər şey çox yavaş gedir.
GCloud-a güclü bir maşın götürsəniz, saniyədə 4-5 kadr aşkar edə bilərsiniz, lakin fərq demək olar ki, gözə görünmür, hələ də yavaşdır.

Raspberry Pi-də Bulud Obyekt Detektorunun Videosu

Bulud və nəqliyyat xərclərinin bununla heç bir əlaqəsi yoxdur, detektor adi aparat üzərində işləyir və belə bir sürətlə işləyir.

Neyron kompüter çubuğu

Mən müqavimət göstərə bilmədim və NCS-də etalondan keçdim.

Detektorun sürəti 0.1 saniyədən bir qədər yavaş idi, istənilən halda zəif maşındakı buluddan 2-3 dəfə sürətli, yəni saniyədə 8-9 kadr.

Raspberry Pi-də Bulud Obyekt Detektorunun Videosu

Nəticələrdəki fərq NCS-nin 2018_01_28 Mobil SSD versiyası ilə işləməsi ilə izah olunur.

P.S. Bundan əlavə, təcrübələr göstərdi ki, I7 prosessoru olan kifayət qədər güclü masaüstü maşını bir az daha yaxşı nəticələr göstərir və saniyədə 10 kadrı sıxmaq mümkün oldu.

Qrup

Təcrübə daha da irəli getdi və mən detektoru Google Kubernetes-də beş qovşaqda quraşdırdım.
Podların özləri zəif idi və hər biri saniyədə 2 kadrdan çox emal edə bilmirdi.
Ancaq N qovşağı olan bir klaster işlədirsinizsə və N mövzuda çərçivələri təhlil etsəniz, kifayət qədər sayda qovşaqla (5) saniyədə istədiyiniz 10 kadr əldə edə bilərsiniz.

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

Nə oldu:

Raspberry Pi-də Bulud Obyekt Detektorunun Videosu

NCS ilə müqayisədə bir az daha az sürətli, lakin bir axınla müqayisədə daha güclü.

Qazanc, əlbəttə ki, xətti deyil - sinxronizasiya və opencv şəkillərinin dərin surətini çıxarmaq üçün örtüklər var.

Nəticə

Ümumilikdə, təcrübə bizə belə qənaətə gəlməyə imkan verir ki, cəhd etsəniz, sadə buluddan qurtula bilərsiniz.

Ancaq güclü bir iş masası və ya yerli avadanlıq daha yaxşı nəticələr əldə etməyə imkan verir və heç bir hiylə olmadan.

References

Mənbə: www.habr.com

Добавить комментарий