Видеои детектори объекти абрӣ дар Raspberry Pi

Prologue

Ҳоло дар Интернет видеое паҳн мешавад, ки нишон медиҳад, ки автопилоти Тесла чӣ гуна роҳро мебинад.

Ман муддати тӯлонӣ барои пахши видеои бо детектор бойшуда ва дар вақти воқеӣ хориш мекардам.

Видеои детектори объекти абрӣ дар Raspberry Pi

Мушкилот дар он аст, ки ман мехоҳам видеоро аз Raspberry пахш кунам ва кори детектори шабакаи нейронӣ дар он чизи дилхоҳро мегузорад.

Intel Neural Stick компютерӣ

Ман роҳҳои ҳалли гуногунро баррасӣ кардам.

В мақолаи охирин бо Intel Neural Computer Stick озмоиш кардааст. Сахтафзор пурқувват аст, аммо формати шабакавии худро талаб мекунад.

Гарчанде ки Intel конвертерҳоро барои чаҳорчӯбаҳои асосӣ таъмин мекунад, як қатор домҳо мавҷуданд.

Масалан, формати шабакаи зарурӣ метавонад номувофиқ бошад ва агар он мувофиқ бошад, пас баъзе қабатҳо метавонанд дар дастгоҳ дастгирӣ нашаванд ва агар онҳо дастгирӣ карда шаванд, пас дар ҷараёни табдилдиҳӣ хатогиҳо рух дода метавонанд, ки дар натиҷа дар баромади мо чизҳои аҷибе мегирем.

Умуман, агар шумо хоҳед, ки ягон шабакаи нейронӣ дошта бошед, он метавонад бо NCS кор накунад. Аз ин рӯ, ман тасмим гирифтам, ки мушкилотро бо истифода аз воситаҳои паҳншуда ва дастрас ҳал кунам.

Cloud

Алтернативаи равшани ҳалли сахтафзори маҳаллӣ ин рафтан ба абр аст.

Вариантҳои тайёр - чашмони ман ваҳшӣ мекунанд.

Ҳама роҳбарон:

...Ва даҳҳо нафарони камтар маълум.

Интихоб дар байни ин навъҳо осон нест.

Ва ман қарор додам, ки интихоб накунам, балки нақшаи хуби кории кӯҳнаро дар OpenCV дар Docker печонам ва онро дар абр иҷро кунам.

Бартарии ин равиш чандирӣ ва назорат аст - шумо метавонед шабакаи нейрон, хостинг, серверро тағир диҳед - дар маҷмӯъ, ҳама гуна ҳавас.

Сервер

Биёед бо прототипи маҳаллӣ оғоз кунем.

Одатан ман Flask-ро барои REST API, OpenCV ва шабакаи MobileSSD истифода мебарам.

Пас аз насб кардани версияҳои ҷорӣ дар Docker, ман фаҳмидам, ки OpenCV 4.1.2 бо Mobile SSD v1_coco_2018_01_28 кор намекунад ва ман маҷбур будам, ки ба 11/06_2017 собитшуда баргардам.

Дар оғози хидмат, мо номҳои синф ва шабакаро бор мекунем:

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

Дар докери маҳаллӣ (дар ноутбуки на он қадар ҷавон) 0.3 сония, дар Raspberry - 3.5 вақт лозим аст.

Биёед ҳисобро оғоз кунем:

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

Докер - 0.2 сония, Малина - 1.7.

Табдил додани ихроҷи тензор ба json хондашаванда:

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

Минбаъд ин амалиётро тавассути Flask содирот кунед(ворид расм аст, баромад натиҷаи детектор дар json аст).

Варианти алтернативӣ, ки дар он кори бештар ба сервер гузаронида мешавад: худи он объектҳои ёфтшударо давр мезанад ва тасвири тайёрро бармегардонад.

Ин хосият хуб аст, ки мо намехоҳем opencv-ро ба сервер кашем.

Докер

Мо тасвирро ҷамъ мекунем.

Рамз шона карда, дар он ҷойгир карда мешавад Github, докер онро бевосита аз он ҷо мегирад.

Ҳамчун платформа, мо ҳамон Debian Stretch-ро ба мисли Raspberry мегирем - мо аз стеки собитшудаи технологӣ дур намешавем.

Шумо бояд flask, protobuf, requests, opencv_python насб кунед, Mobile SSD, рамзи серверро аз Github зеркашӣ кунед ва серверро оғоз кунед.

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

Содда муштарии детектор дар асоси дархостҳо.

Нашр ба Docker Hub

Реестрҳои Docker бо суръати на камтар аз детекторҳои абрӣ афзоиш меёбанд.

Барои он ки ташвиш надиҳем, мо ба таври консервативӣ мегузарем DockerHub.

  1. Сабти ном
  2. Даромадан:
    воридшавии докер
  3. Биёед бо як номи пурмаъно биёем:
    теги docker opencv-detect tprlab/opencv-detect-ssd
  4. Тасвирро ба сервер бор кунед:
    docker push tprlab/opencv-detect-ssd

Мо дар абр оғоз мекунем

Интихоби дар куҷо ҷойгир кардани контейнер низ хеле васеъ аст.

Ҳама бозигарони калон (Google, Microsoft, Amazon) барои соли аввал микро-насабро ройгон пешниҳод мекунанд.
Пас аз таҷриба бо Microsoft Azure ва Google Cloud, ман ба охирин қарор гирифтам, зеро он тезтар парвоз мекард.

Ман дастурҳоро дар ин ҷо нанавиштам, зеро ин қисм барои провайдери интихобшуда хеле мушаххас аст.

Ман вариантҳои гуногуни сахтафзорро санҷидам,
Сатҳи паст (мубодила ва бахшидашуда) - 0.4 - 0.5 сония.
Мошинҳои пурқувваттар - 0.25 - 0.3.
Хуб, ҳатто дар сенарияи бадтарин, бурдҳо се маротиба мебошанд, шумо метавонед кӯшиш кунед.

Видео

Мо як стримери оддии видеои OpenCV-ро дар Raspberry оғоз мекунем, ки тавассути Google Cloud муайян мекунад.
Барои таҷриба, файли видеоие истифода шуд, ки як вақт дар чорроҳаи тасодуфӣ ба навор гирифта шуда буд.


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

Бо детектор мо на бештар аз се кадр дар як сония мегирем, ҳама чиз хеле суст мегузарад.
Агар шумо як мошини пуриқтидорро ба GCloud гиред, шумо метавонед дар як сония 4-5 кадрро муайян кунед, аммо фарқият ба чашм қариб ноаён аст, он ҳанӯз ҳам суст аст.

Видеои детектори объекти абрӣ дар Raspberry Pi

Абр ва хароҷоти нақлиёт ба он ҳеҷ иртиботе надоранд; детектор дар сахтафзори муқаррарӣ кор мекунад ва бо ин суръат кор мекунад.

Stick Neural Computer Stick

Ман муқобилат карда натавонистам ва нишондиҳандаи NCS-ро иҷро кардам.

Суръати детектор аз 0.1 сония андаке суст, дар хар сурат назар ба абри мошини суст 2—3 баробар тезтар, яъне 8—9 кадр дар як сония.

Видеои детектори объекти абрӣ дар Raspberry Pi

Фарқияти натиҷаҳо бо он шарҳ дода мешавад, ки NCS версияи Mobile SSD 2018_01_28-ро иҷро мекард.

P.S. Илова бар ин, таҷрибаҳо нишон доданд, ки як мошини хеле пуриқтидори мизи корӣ бо протсессори I7 каме беҳтар аст ва маълум шуд, ки 10 кадр дар як сония фишурда шавад.

кластер

Таҷриба минбаъд рафт ва ман детекторро дар панҷ гиреҳ дар Google Kubernetes насб кардам.
Худи подахо суст буда, хар кадоми онхо дар як сония аз 2 кадр зиёд кор карда наметавонист.
Аммо агар шумо кластерро бо N гиреҳ иҷро кунед ва чаҳорчӯбҳоро дар N ришта таҳлил кунед, пас бо миқдори кофии гиреҳҳо (5) шумо метавонед ба 10 кадри дилхоҳ дар як сония ноил шавед.

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

Ин ҳодиса рӯй дод:

Видеои детектори объекти абрӣ дар Raspberry Pi

Нисбат ба NCS каме тезтар, аммо назар ба як ҷараён пурқувваттар.

Фоида, албатта, хаттӣ нест - қабатҳои синхронизатсия ва нусхабардории амиқи тасвирҳои opencv мавҷуданд.

хулоса

Умуман, таҷриба ба мо имкон медиҳад, ки ба хулосае ояд, ки агар шумо кӯшиш кунед, шумо метавонед бо абри оддӣ дур шавед.

Аммо мизи кории пурқувват ё сахтафзори маҳаллӣ ба шумо имкон медиҳад, ки ба натиҷаҳои беҳтар ва бидуни ҳилаҳо ноил шавед.

мурожиат

Манбаъ: will.com

Илова Эзоҳ