Raspberry Pi تي Cloud Object Detector جو وڊيو

اڳڀرائي

هڪ وڊيو هاڻ انٽرنيٽ تي گردش ڪري رهي آهي جنهن ۾ ڏيکاريو ويو آهي ته ڪيئن ٽسلا جو آٽو پائلٽ روڊ کي ڏسي ٿو.

مان هڪ ڊگهي وقت کان خارش ڪري رهيو آهيان وڊيو نشر ڪرڻ لاءِ هڪ ڊيڪٽر سان ڀرپور ۽ حقيقي وقت ۾.

Raspberry Pi تي Cloud Object Detector جو وڊيو

مسئلو اهو آهي ته مان Raspberry کان وڊيو نشر ڪرڻ چاهيان ٿو، ۽ ان تي نيورل نيٽ ورڪ ڊيڪٽر جي ڪارڪردگي گهڻو ڪري ڇڏي ٿي.

Intel Neural Computer Stick

مون مختلف حلن تي غور ڪيو.

В آخري مضمون Intel Neural Computer Stick سان تجربو ڪيو. هارڊويئر طاقتور آهي، پر ان جي پنهنجي نيٽ ورڪ فارميٽ جي ضرورت آهي.

جيتوڻيڪ Intel وڏن فريم ورڪ لاء ڪنورٽرز مهيا ڪري ٿي، اتي ڪيترائي نقصان آهن.

مثال طور، گهربل نيٽ ورڪ جو فارميٽ غير مطابقت رکندڙ ٿي سگهي ٿو، ۽ جيڪڏهن اهو مطابقت رکندڙ آهي، ته پوءِ ڊوائيس تي ڪجهه پرتون سهڪار نه ٿيون ڪري سگهن، ۽ جيڪڏهن انهن کي سپورٽ ڪيو وڃي، ته پوءِ تبديليءَ جي عمل دوران غلطيون ٿي سگهن ٿيون، جنهن جي نتيجي ۾ اسان کي پيداوار تي ڪجهه عجيب شيون مليون آهن.

عام طور تي، جيڪڏھن توھان چاھيو ٿا ڪنھن قسم جو صوابديدي نيٽ ورڪ، ته پوءِ اھو NCS سان ڪم نه ڪري سگھي. تنهن ڪري، مون فيصلو ڪيو ته سڀ کان وڌيڪ وسيع ۽ رسائي وارو اوزار استعمال ڪندي مسئلو حل ڪرڻ جي ڪوشش ڪئي.

Cloud

مقامي هارڊويئر حل جو واضح متبادل بادل ڏانهن وڃڻ آهي.

تيار ڪيل اختيارن - منهنجون اکيون جهنگلي هلن ٿيون.

سڀ اڳواڻ:

... ۽ درجن کان گهٽ سڃاتل.

هن قسم جي وچ ۾ چونڊڻ بلڪل آسان ناهي.

۽ مون فيصلو نه ڪيو چونڊڻ جو، پر ڊاکر ۾ OpenCV تي سٺي پراڻي ڪم ڪندڙ اسڪيم کي لپائڻ ۽ ان کي ڪلائوڊ ۾ هلائڻ لاءِ.

هن طريقي جو فائدو لچڪدار ۽ ڪنٽرول آهي - توهان تبديل ڪري سگهو ٿا نيورل نيٽورڪ، هوسٽنگ، سرور - عام طور تي، ڪنهن به قسم جي.

سرور

اچو ته هڪ مقامي پروٽوٽائپ سان شروع ڪريون.

روايتي طور تي مان استعمال ڪريان ٿو Flask لاءِ REST API، OpenCV ۽ MobileSSD نيٽ ورڪ.

Docker تي موجوده نسخن کي نصب ڪرڻ سان، مون دريافت ڪيو ته OpenCV 4.1.2 موبائل 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 سيڪنڊ وٺندو آهي، راسبي تي - 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

پري هن آپريشن کي فلاسڪ ذريعي برآمد ڪريو(ان پٽ هڪ تصوير آهي، آئوٽ پٽ json ۾ ڊيڪٽر جو نتيجو آهي).

ھڪڙو متبادل اختيار، جنھن ۾ وڌيڪ ڪم سرور ڏانھن منتقل ڪيو ويو آھي: اھو پاڻ کي مليل شين کي حلقو ڏئي ٿو ۽ مڪمل تصوير کي واپس ڪري ٿو.

هي اختيار سٺو آهي جتي اسان Opencv کي سرور ڏانهن ڇڪڻ نٿا چاهيون.

ڊاڪر

اسان تصوير گڏ ڪريون ٿا.

ڪوڊ گڏ ڪيو ويو آهي ۽ پوسٽ ڪيو ويو آهي گيتب، docker ان کي سڌو اتان کان وٺي ويندي.

پليٽ فارم جي طور تي، اسان ساڳيو ڊيبين اسٽريچ کڻنداسين جيئن راسبي تي - اسان ثابت ٿيل ٽيڪ اسٽيڪ کان انحراف نه ڪنداسين.

توھان کي انسٽال ڪرڻ جي ضرورت آھي flask، protobuf، درخواستون، opencv_python، ڊائون لوڊ ڪريو موبائل 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. لاگ ان:
    docker لاگ ان
  3. اچو ته هڪ معنيٰ وارو نالو وٺي:
    ڊاکر ٽيگ opencv-detect tprlab/opencv-detect-ssd
  4. تصوير کي سرور تي اپلوڊ ڪريو:
    docker push tprlab/opencv-detect-ssd

اسان بادل ۾ لانچ ڪيو

جتي ڪنٽينر کي هلائڻ جو انتخاب پڻ ڪافي وسيع آهي.

سڀ وڏا رانديگر (گوگل، مائڪروسافٽ، ايمازون) پهرين سال لاءِ مفت ۾ مائڪرو مثال پيش ڪن ٿا.
Microsoft Azure ۽ Google Cloud سان تجربو ڪرڻ کان پوء، مون بعد ۾ آباد ڪيو ڇاڪاڻ ته اهو تيزيء سان بند ٿي ويو.

مون هتي هدايتون نه لکيون آهن، ڇو ته هي حصو خاص طور تي چونڊيل مهيا ڪندڙ لاء آهي.

مون ڪوشش ڪئي مختلف هارڊويئر آپشنز،
گھٽ سطحون (شيئر ٿيل ۽ وقف ٿيل) - 0.4 - 0.5 سيڪنڊ.
وڌيڪ طاقتور ڪارون - 0.25 - 0.3.
خير، جيتوڻيڪ بدترين حالتن ۾، کٽڻ وارا ٽي ڀيرا آهن، توهان ڪوشش ڪري سگهو ٿا.

Видео

اسان Raspberry تي هڪ سادي 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 موبائل SSD ورزن 2018_01_28 هلائي رهيو هو.

PS ان کان علاوه، تجربن مان اهو ظاهر ڪيو ويو آهي ته هڪ انتهائي طاقتور ڊيسڪ ٽاپ مشين I7 پروسيسر سان ٿورڙي بهتر نتيجا ڏيکاري ٿي ۽ اهو ممڪن آهي ته ان تي 10 فريم في سيڪنڊ کي نچوض ڪرڻ ممڪن آهي.

ڪلستر

تجربو اڳتي وڌيو ۽ مون گوگل ڪبرنيٽس ۾ پنج نوڊس تي ڊيڪٽر انسٽال ڪيو.
پوڊ پاڻ ۾ ڪمزور هئا ۽ انهن مان هر هڪ في سيڪنڊ کان وڌيڪ 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

تبصرو شامل ڪريو