Raspberry Pi дээрх Cloud Object Detector-ийн видео

Оршил

Теслагийн автомат нисгэгч замыг хэрхэн харж байгааг харуулсан видео одоо интернэтэд тархаж байна.

Би детектороор баяжуулсан видеог бодит цаг хугацаанд нь цацахыг удаан хугацаанд загатнаж байсан.

Raspberry Pi дээрх Cloud Object Detector-ийн видео

Асуудал нь би Raspberry-ээс видео цацахыг хүсч байгаа бөгөөд үүн дээрх мэдрэлийн сүлжээний илрүүлэгчийн гүйцэтгэл нь хүссэн зүйлээ орхиж байна.

Intel мэдрэлийн компьютерийн зөөгч

Би янз бүрийн шийдлүүдийг авч үзсэн.

В Сүүлийн нийтлэл Intel Neural Computer Stick дээр туршилт хийсэн. Техник хангамж нь хүчирхэг боловч өөрийн сүлжээний форматыг шаарддаг.

Хэдийгээр Intel нь үндсэн хүрээний хөрвүүлэгчийг хангадаг ч олон тооны бэрхшээлүүд байдаг.

Жишээлбэл, шаардлагатай сүлжээний формат нь тохирохгүй байж магадгүй бөгөөд хэрэв энэ нь нийцтэй байвал төхөөрөмж дээрх зарим давхаргууд дэмжигдэхгүй, хэрэв дэмжигдсэн бол хөрвүүлэх явцад алдаа гарч болзошгүй. Бид гаралт дээр хачирхалтай зүйлсийг олж авдаг.

Ерөнхийдөө хэрэв та ямар нэгэн дурын мэдрэлийн сүлжээг хүсч байвал NCS-тэй ажиллахгүй байж магадгүй юм. Тиймээс би хамгийн өргөн тархсан, хүртээмжтэй хэрэгслийг ашиглан асуудлыг шийдэхээр шийдсэн.

Үүл

Орон нутгийн техник хангамжийн шийдлийн тодорхой хувилбар бол үүлэнд шилжих явдал юм.

Бэлэн сонголтууд - миний нүд гүйж байна.

Бүх удирдагчид:

... Мөн бага мэддэг олон арван.

Энэ сортуудын дундаас сонгох нь тийм ч хялбар биш юм.

Би сонгохгүй, харин Docker дахь OpenCV дээр хуучин сайн ажлын схемийг боож, үүлэн дээр ажиллуулахаар шийдсэн.

Энэ аргын давуу тал нь уян хатан байдал, хяналт юм - та мэдрэлийн сүлжээ, хостинг, серверийг ерөнхийд нь дурын дураараа өөрчилж болно.

Сервер

Орон нутгийн прототипээс эхэлье.

Уламжлал ёсоор би 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()

Docker - 0.2 сек, Raspberry - 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

Цааш нь энэ үйлдлийг колбоноор экспортлох(оролт нь зураг, гаралт нь json дахь детекторын үр дүн юм).

Өөр сонголт бөгөөд үүнд илүү их ажлыг сервер рүү шилжүүлдэг: энэ нь өөрөө олсон объектуудыг дугуйлж, дууссан зургийг буцаана.

Энэ сонголт нь бид opencv-г сервер рүү чирэхийг хүсэхгүй байгаа тохиолдолд тохиромжтой.

Докер

Бид зургийг цуглуулдаг.

Кодыг самнаж, дээр нь байрлуулсан Github, docker үүнийг тэндээс шууд авах болно.

Платформын хувьд бид Raspberry дээрхтэй ижил Debian Stretch-ийг авах болно - бид батлагдсан технологийн стекээс хазайхгүй.

Та 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-д нийтэлж байна

Докерын бүртгэлүүд үүл илрүүлэгчээс багагүй хурдаар үржиж байна.

Санаа зовохгүйн тулд бид консерватив замаар явах болно DockerHub.

  1. Бүртгүүлэх
  2. Нэвтрэх:
    докерын нэвтрэлт
  3. Утга учиртай нэр олцгооё:
    docker tag opencv-detect tprlab/opencv-detect-ssd
  4. Зургийг серверт байршуулах:
    docker түлхэх tprlab/opencv-detect-ssd

Бид үүлэн дээр ажилладаг

Савыг хаана ажиллуулах сонголт бас нэлээд өргөн.

Бүх том тоглогчид (Google, Microsoft, Amazon) эхний жилдээ үнэ төлбөргүй микро инстанцыг санал болгодог.
Microsoft Azure болон Google Cloud-ийг туршиж үзсэний дараа энэ нь илүү хурдан болсон тул сүүлийнх нь дээр тогтсон.

Энэ хэсэг нь сонгосон үйлчилгээ үзүүлэгчийн онцлог шинж чанартай тул би энд зааврыг бичээгүй.

Би янз бүрийн техник хангамжийн сонголтыг туршиж үзсэн.
Доод түвшин (хуваалцсан болон зориулалтын) - 0.4 - 0.5 секунд.
Илүү хүчирхэг машинууд - 0.25 - 0.3.
За, хамгийн муу тохиолдолд ч гэсэн ялалт нь гурван удаа, та оролдож болно.

Видео

Бид Raspberry дээр Google Cloud-ээр дамжуулан илрүүлдэг энгийн OpenCV видео дамжуулагчийг ажиллуулж байна.
Туршилтын хувьд санамсаргүй уулзвар дээр зураг авалт хийсэн видео файлыг ашигласан.


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 дээрх Cloud Object Detector-ийн видео

Үүл болон тээврийн зардал нь үүнтэй ямар ч холбоогүй бөгөөд детектор нь энгийн тоног төхөөрөмж дээр ажилладаг бөгөөд ийм хурдтай ажилладаг.

Мэдрэлийн компьютерийн зөөгч

Би эсэргүүцэж чадаагүй бөгөөд NCS дээр жишиг шалгалтыг явуулсан.

Илрүүлэгчийн хурд нь 0.1 секундээс бага зэрэг удаан байсан бөгөөд ямар ч тохиолдолд сул машин дээрх үүлнээс 2-3 дахин хурдан, өөрөөр хэлбэл секундэд 8-9 кадр байв.

Raspberry Pi дээрх Cloud Object Detector-ийн видео

Үр дүнгийн ялгааг NCS нь Mobile SSD 2018_01_28 хувилбарыг ажиллуулж байсантай холбон тайлбарлаж байна.

Жич Нэмж дурдахад 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 дээрх Cloud Object Detector-ийн видео

NCS-ээс арай бага хурдтай, гэхдээ нэг урсгалаас илүү хүчтэй.

Олз нь мэдээж шугаман биш - opencv зургийг синхрончлох, гүнзгий хуулбарлах давхар давхаргууд байдаг.

дүгнэлт

Ерөнхийдөө туршилт нь хэрэв та оролдвол энгийн үүлнээс салж чадна гэж дүгнэх боломжийг олгодог.

Гэхдээ хүчирхэг ширээний компьютер эсвэл орон нутгийн техник хангамж нь ямар ч заль мэхгүйгээр илүү сайн үр дүнд хүрэх боломжийг олгодог.

лавлагаа

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх