Raspberry Pi پر کلاؤڈ آبجیکٹ ڈیٹیکٹر کی ویڈیو

طول وعرض

اب انٹرنیٹ پر ایک ویڈیو گردش کر رہی ہے جس میں دکھایا گیا ہے کہ ٹیسلا کا آٹو پائلٹ سڑک کو کیسے دیکھتا ہے۔

مجھے ایک لمبے عرصے سے ڈیٹیکٹر سے بھرپور ویڈیو نشر کرنے میں اور حقیقی وقت میں خارش ہو رہی ہے۔

Raspberry Pi پر کلاؤڈ آبجیکٹ ڈیٹیکٹر کی ویڈیو

مسئلہ یہ ہے کہ میں Raspberry سے ویڈیو نشر کرنا چاہتا ہوں، اور اس پر نیورل نیٹ ورک ڈٹیکٹر کی کارکردگی بہت زیادہ مطلوبہ چھوڑ دیتی ہے۔

انٹیل نیورل کمپیوٹر اسٹک

میں نے مختلف حلوں پر غور کیا۔

В آخری آرٹیکل Intel Neural Computer Stick کے ساتھ تجربہ کیا۔ ہارڈ ویئر طاقتور ہے، لیکن اس کا اپنا نیٹ ورک فارمیٹ درکار ہے۔

اگرچہ انٹیل بڑے فریم ورک کے لیے کنورٹرز فراہم کرتا ہے، اس میں بہت سے نقصانات ہیں۔

مثال کے طور پر، مطلوبہ نیٹ ورک کا فارمیٹ غیر موافق ہو سکتا ہے، اور اگر یہ مطابقت رکھتا ہے، تو ہو سکتا ہے کہ کچھ پرتیں ڈیوائس پر سپورٹ نہ ہوں، اور اگر وہ سپورٹ ہوں، تو تبدیلی کے عمل کے دوران غلطیاں ہو سکتی ہیں، جس کے نتیجے میں ہمیں آؤٹ پٹ پر کچھ عجیب چیزیں ملتی ہیں۔

عام طور پر، اگر آپ کسی قسم کا من مانی نیورل نیٹ ورک چاہتے ہیں، تو یہ NCS کے ساتھ کام نہیں کر سکتا۔ لہذا، میں نے سب سے زیادہ وسیع اور قابل رسائی ٹولز کا استعمال کرتے ہوئے مسئلہ کو حل کرنے کی کوشش کرنے کا فیصلہ کیا۔

بادل

مقامی ہارڈویئر حل کا واضح متبادل کلاؤڈ پر جانا ہے۔

تیار شدہ اختیارات - میری آنکھیں جنگلی چلتی ہیں۔

تمام رہنما:

... اور درجنوں غیر معروف۔

اس قسم کا انتخاب کرنا بالکل آسان نہیں ہے۔

اور میں نے انتخاب نہ کرنے کا فیصلہ کیا، لیکن Docker میں OpenCV پر اچھی پرانی ورکنگ اسکیم کو لپیٹ کر کلاؤڈ میں چلانے کا فیصلہ کیا۔

اس نقطہ نظر کا فائدہ لچک اور کنٹرول ہے - آپ اعصابی نیٹ ورک، ہوسٹنگ، سرور - عام طور پر، کسی بھی خواہش کو تبدیل کر سکتے ہیں.

سرور

آئیے ایک مقامی پروٹو ٹائپ کے ساتھ شروع کریں۔

روایتی طور پر میں REST API، OpenCV اور MobileSSD نیٹ ورک کے لیے Flask استعمال کرتا ہوں۔

ڈوکر پر موجودہ ورژن انسٹال کرنے کے بعد، میں نے دریافت کیا کہ 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 سیکنڈ لگتے ہیں، 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

مزید اس آپریشن کو فلاسک کے ذریعے برآمد کریں۔(ان پٹ ایک تصویر ہے، آؤٹ پٹ json میں ڈیٹیکٹر کے نتائج ہیں)۔

ایک متبادل آپشن، جس میں زیادہ کام سرور پر منتقل کیا جاتا ہے: یہ خود ہی پائی جانے والی اشیاء کو گھیرتا ہے اور تیار شدہ تصویر کو واپس کرتا ہے۔

یہ آپشن اچھا ہے جہاں ہم اوپن سی وی کو سرور پر گھسیٹنا نہیں چاہتے ہیں۔

ڈوکر

ہم تصویر جمع کرتے ہیں۔

کوڈ کو کنگھی اور پوسٹ کیا جاتا ہے۔ گیتھب، ڈاکر اسے وہاں سے براہ راست لے جائے گا۔

ایک پلیٹ فارم کے طور پر، ہم Raspberry کی طرح Debian Stretch لیں گے - ہم ثابت شدہ ٹیک اسٹیک سے انحراف نہیں کریں گے۔

آپ کو فلاسک، پروٹوبف، درخواستیں، 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"]

سادہ ڈیٹیکٹر کلائنٹ درخواستوں کی بنیاد پر۔

ڈاکر ہب میں اشاعت

ڈاکر رجسٹریاں اس رفتار سے بڑھ رہی ہیں جو کلاؤڈ ڈیٹیکٹرز سے کم نہیں۔

پریشان نہ ہونے کے لیے، ہم قدامت پسندی سے گزریں گے۔ ڈاکر ہب.

  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 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 پر کلاؤڈ آبجیکٹ ڈیٹیکٹر کی ویڈیو

کلاؤڈ اور نقل و حمل کے اخراجات کا اس سے کوئی تعلق نہیں ہے؛ ڈیٹیکٹر باقاعدہ ہارڈ ویئر پر چلتا ہے اور اسی رفتار سے کام کرتا ہے۔

نیورل کمپیوٹر اسٹک

میں مزاحمت نہیں کر سکا اور NCS پر بینچ مارک چلا گیا۔

ڈیٹیکٹر کی رفتار 0.1 سیکنڈ سے تھوڑی سست تھی، کسی بھی صورت میں کمزور مشین پر بادل سے 2-3 گنا تیز، یعنی 8-9 فریم فی سیکنڈ۔

Raspberry Pi پر کلاؤڈ آبجیکٹ ڈیٹیکٹر کی ویڈیو

نتائج میں فرق کی وضاحت اس حقیقت سے ہوتی ہے کہ 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 پر کلاؤڈ آبجیکٹ ڈیٹیکٹر کی ویڈیو

NCS کے مقابلے میں تھوڑا کم تیز، لیکن ایک سلسلہ کے مقابلے میں زیادہ زوردار۔

فائدہ، یقیناً، لکیری نہیں ہے - اوپن سی وی امیجز کی ہم وقت سازی اور گہری کاپی کرنے کے لیے اوورلیز موجود ہیں۔

حاصل يہ ہوا

مجموعی طور پر، تجربہ ہمیں یہ نتیجہ اخذ کرنے کی اجازت دیتا ہے کہ اگر آپ کوشش کرتے ہیں، تو آپ ایک سادہ بادل سے بچ سکتے ہیں۔

لیکن ایک طاقتور ڈیسک ٹاپ یا مقامی ہارڈویئر آپ کو بہتر نتائج حاصل کرنے کی اجازت دیتا ہے، اور بغیر کسی چال کے۔

حوالہ جات

ماخذ: www.habr.com

نیا تبصرہ شامل کریں