በ Raspberry Pi ላይ የክላውድ ነገር መፈለጊያ ቪዲዮ

መቅድም

የቴስላ አውቶፓይለት መንገዱን እንዴት እንደሚያይ የሚያሳይ ቪዲዮ አሁን በኢንተርኔት ላይ እየተሰራጨ ነው።

በፈላጊ የበለፀገ ቪዲዮ ለማሰራጨት እና በእውነተኛ ጊዜ ለረጅም ጊዜ እያሳከኩኝ ነው።

በ Raspberry Pi ላይ የክላውድ ነገር መፈለጊያ ቪዲዮ

ችግሩ ከ Raspberry ቪዲዮን ማሰራጨት እፈልጋለሁ, እና በእሱ ላይ ያለው የነርቭ አውታረመረብ መፈለጊያ አፈፃፀም ብዙ የሚፈለጉትን ይተዋል.

Intel Neural Computer Stick

የተለያዩ መፍትሄዎችን አስብ ነበር.

В የመጨረሻ ጽሑፍ በ Intel Neural Computer Stick ተሞክሯል። ሃርድዌሩ ኃይለኛ ነው, ግን የራሱን የአውታረ መረብ ቅርጸት ይፈልጋል.

ምንም እንኳን ኢንቴል ለዋና ማዕቀፎች ቀያሪዎችን ቢያቀርብም፣ በርካታ ወጥመዶች አሉ።

ለምሳሌ, የሚፈለገው የአውታረ መረብ ቅርጸት ተኳሃኝ ላይሆን ይችላል, እና ተኳሃኝ ከሆነ, አንዳንድ ንብርብሮች በመሣሪያው ላይ አይደገፉም, እና የሚደገፉ ከሆነ, በመቀየር ሂደት ውስጥ ስህተቶች ሊከሰቱ ይችላሉ, በዚህም ምክንያት. በውጤቱ ላይ አንዳንድ እንግዳ ነገሮችን እናገኛለን.

በአጠቃላይ፣ አንድ ዓይነት የዘፈቀደ የነርቭ ኔትወርክ ከፈለጉ፣ ከኤንሲኤስ ጋር ላይሰራ ይችላል። ስለዚህ, በጣም ሰፊ እና ተደራሽ የሆኑ መሳሪያዎችን በመጠቀም ችግሩን ለመፍታት ለመሞከር ወሰንኩ.

ደመና

ለአካባቢያዊ የሃርድዌር መፍትሄ ግልጽ የሆነው አማራጭ ወደ ደመና መሄድ ነው.

ዝግጁ የሆኑ አማራጮች - ዓይኖቼ ይሮጣሉ.

ሁሉም መሪዎች፡-

... እና በደርዘን የሚቆጠሩ ትንሽ የታወቁ።

ከእነዚህ ዝርያዎች መካከል መምረጥ ቀላል አይደለም.

እና ላለመምረጥ ወሰንኩ, ነገር ግን ጥሩውን የድሮውን የስራ መርሃ ግብር በ OpenCV በ Docker ለመጠቅለል እና በደመና ውስጥ ለማስኬድ.

የዚህ አቀራረብ ጥቅሙ ተለዋዋጭነት እና ቁጥጥር ነው - የነርቭ አውታረመረብ, ማስተናገጃ, አገልጋይ - በአጠቃላይ, ማንኛውንም ምኞት መቀየር ይችላሉ.

አገልጋይ

በአካባቢያዊ ፕሮቶታይፕ እንጀምር።

በተለምዶ እኔ Flask ለ REST API፣ OpenCV እና MobileSSD አውታረ መረብ እጠቀማለሁ።

አሁን ያሉትን ስሪቶች Docker ላይ ከጫንኩ በኋላ፣ OpenCV 4.1.2 ከሞባይል ኤስኤስዲ 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 ሰከንድ, Raspberry - 1.7.

የ tensor ጭስ ማውጫ ወደ ሊነበብ የሚችል 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, ዶከር በቀጥታ ከዚያ ይወስዳል.

እንደ መድረክ፣ ልክ እንደ Raspberry ላይ ያለውን የዴቢያን ዝርጋታ እንወስዳለን - ከተረጋገጠው የቴክኖሎጂ ቁልል አንለያይም።

ፍላስክ፣ ፕሮቶቡፍ፣ ጥያቄ፣ ክፍት cv_python፣ የሞባይል ኤስኤስዲ፣ የአገልጋይ ኮድ ከ 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. ትርጉም ያለው ስም እናምጣ፡-
    ዶከር መለያ opencv-detect tprlab/opencv-detect-ssd
  4. ምስሉን ወደ አገልጋዩ ይስቀሉ፡-
    docker push tprlab/opencv-detect-ssd

በደመና ውስጥ እንጀምራለን

መያዣውን የሚሠራበት ቦታ ምርጫም በጣም ሰፊ ነው.

ሁሉም ትላልቅ ተጫዋቾች (ጎግል፣ ማይክሮሶፍት፣ አማዞን) ለመጀመሪያው አመት ማይክሮ-ምሳሌን በነጻ ይሰጣሉ።
ከማይክሮሶፍት አዙር እና ጎግል ክላውድ ጋር ሙከራ ካደረግኩ በኋላ፣ በፍጥነት ስለጀመረ በመጨረሻው ላይ ተረጋጋሁ።

ይህ ክፍል ለተመረጠው አቅራቢ በጣም የተለየ ስለሆነ መመሪያን እዚህ አልጻፍኩም።

የተለያዩ የሃርድዌር አማራጮችን ሞከርኩ ፣
ዝቅተኛ ደረጃዎች (የተጋራ እና የተወሰነ) - 0.4 - 0.5 ሰከንድ.
የበለጠ ኃይለኛ መኪኖች - 0.25 - 0.3.
ደህና, በጣም በከፋ ሁኔታ ውስጥ እንኳን, አሸናፊዎቹ ሦስት ጊዜ ናቸው, መሞከር ይችላሉ.

Видео

በ Raspberry ላይ ቀላል የOpenCV ቪዲዮ ዥረት እንጀምራለን፣ በGoogle ክላውድ በኩል።
ለሙከራ አንድ ጊዜ በዘፈቀደ መስቀለኛ መንገድ ላይ የተቀረፀ የቪዲዮ ፋይል ጥቅም ላይ ውሏል።


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 ላይ የክላውድ ነገር መፈለጊያ ቪዲዮ

የደመና እና የመጓጓዣ ወጪዎች ከሱ ጋር ምንም ግንኙነት የላቸውም፤ ጠቋሚው በመደበኛ ሃርድዌር ይሰራል እና በዚያ ፍጥነት ይሰራል።

የነርቭ ኮምፒውተር ዱላ

መቃወም አልቻልኩም እና መለኪያውን በኤን.ሲ.ኤስ.

የማወቂያው ፍጥነት ከ 0.1 ሰከንድ በትንሹ ቀርፋፋ ነበር፣ በማንኛውም ሁኔታ በደካማ ማሽን ላይ ካለው ደመና ከ2-3 ጊዜ ፈጠነ፣ ማለትም 8-9 ክፈፎች በሰከንድ።

በ Raspberry Pi ላይ የክላውድ ነገር መፈለጊያ ቪዲዮ

የውጤቱ ልዩነት የተገለፀው NCS የሞባይል ኤስኤስዲ ስሪት 2018_01_28 እያሄደ በነበረበት ወቅት ነው።

PS በተጨማሪም፣ ሙከራዎች እንደሚያሳዩት ከ I7 ፕሮሰሰር ያለው በጣም ኃይለኛ የዴስክቶፕ ማሽን በትንሹ የተሻሉ ውጤቶችን እንደሚያሳይ እና በላዩ ላይ 10 ፍሬሞችን በሰከንድ መጭመቅ የሚቻል ሆኖ ተገኝቷል።

ክላስተር

ሙከራው የበለጠ ቀጠለ እና ፈላጊውን በጎግል ኩበርኔትስ ውስጥ በአምስት ኖዶች ላይ ጫንኩት።
ሾጣጣዎቹ እራሳቸው ደካማ ነበሩ እና እያንዳንዳቸው በሴኮንድ ከ2 ፍሬሞች በላይ ማካሄድ አይችሉም።
ነገር ግን ክላስተር ከኤን ኖዶች ጋር ካሄዱ እና ፍሬሞችን በ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 ላይ የክላውድ ነገር መፈለጊያ ቪዲዮ

ከኤንሲኤስ ትንሽ ፈጣን፣ ግን ከአንድ ዥረት የበለጠ ኃይለኛ።

ትርፉ በእርግጥ መስመራዊ አይደለም - ለማመሳሰል እና የ opencv ምስሎችን በጥልቀት ለመቅዳት ተደራቢዎች አሉ።

መደምደሚያ

በአጠቃላይ ሙከራው ከሞከርክ በቀላል ደመና ማምለጥ ትችላለህ ብለን መደምደም ያስችለናል።

ነገር ግን ኃይለኛ ዴስክቶፕ ወይም የአካባቢ ሃርድዌር የተሻሉ ውጤቶችን እንድታገኙ ይፈቅድልዎታል, እና ያለ ምንም ዘዴዎች.

ማጣቀሻዎች

ምንጭ: hab.com

አስተያየት ያክሉ