طول وعرض
اب انٹرنیٹ پر ایک ویڈیو گردش کر رہی ہے جس میں دکھایا گیا ہے کہ ٹیسلا کا آٹو پائلٹ سڑک کو کیسے دیکھتا ہے۔
مجھے ایک لمبے عرصے سے ڈیٹیکٹر سے بھرپور ویڈیو نشر کرنے میں اور حقیقی وقت میں خارش ہو رہی ہے۔
مسئلہ یہ ہے کہ میں Raspberry سے ویڈیو نشر کرنا چاہتا ہوں، اور اس پر نیورل نیٹ ورک ڈٹیکٹر کی کارکردگی بہت زیادہ مطلوبہ چھوڑ دیتی ہے۔
انٹیل نیورل کمپیوٹر اسٹک
میں نے مختلف حلوں پر غور کیا۔
В
اگرچہ انٹیل بڑے فریم ورک کے لیے کنورٹرز فراہم کرتا ہے، اس میں بہت سے نقصانات ہیں۔
مثال کے طور پر، مطلوبہ نیٹ ورک کا فارمیٹ غیر موافق ہو سکتا ہے، اور اگر یہ مطابقت رکھتا ہے، تو ہو سکتا ہے کہ کچھ پرتیں ڈیوائس پر سپورٹ نہ ہوں، اور اگر وہ سپورٹ ہوں، تو تبدیلی کے عمل کے دوران غلطیاں ہو سکتی ہیں، جس کے نتیجے میں ہمیں آؤٹ پٹ پر کچھ عجیب چیزیں ملتی ہیں۔
عام طور پر، اگر آپ کسی قسم کا من مانی نیورل نیٹ ورک چاہتے ہیں، تو یہ 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
مزید
ایک متبادل آپشن، جس میں زیادہ کام سرور پر منتقل کیا جاتا ہے: یہ خود ہی پائی جانے والی اشیاء کو گھیرتا ہے اور تیار شدہ تصویر کو واپس کرتا ہے۔
یہ آپشن اچھا ہے جہاں ہم اوپن سی وی کو سرور پر گھسیٹنا نہیں چاہتے ہیں۔
ڈوکر
ہم تصویر جمع کرتے ہیں۔
کوڈ کو کنگھی اور پوسٹ کیا جاتا ہے۔
ایک پلیٹ فارم کے طور پر، ہم 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"]
سادہ
ڈاکر ہب میں اشاعت
ڈاکر رجسٹریاں اس رفتار سے بڑھ رہی ہیں جو کلاؤڈ ڈیٹیکٹرز سے کم نہیں۔
پریشان نہ ہونے کے لیے، ہم قدامت پسندی سے گزریں گے۔
- رجسٹر کریں۔
- لاگ ان کریں:
ڈاکر لاگ ان - آئیے ایک معنی خیز نام کے ساتھ آتے ہیں:
ڈاکر ٹیگ opencv-detect tprlab/opencv-detect-ssd - تصویر کو سرور پر اپ لوڈ کریں:
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 فریموں کا پتہ لگا سکتے ہیں، لیکن یہ فرق آنکھوں سے تقریباً پوشیدہ ہے، یہ اب بھی سست ہے۔
کلاؤڈ اور نقل و حمل کے اخراجات کا اس سے کوئی تعلق نہیں ہے؛ ڈیٹیکٹر باقاعدہ ہارڈ ویئر پر چلتا ہے اور اسی رفتار سے کام کرتا ہے۔
نیورل کمپیوٹر اسٹک
میں مزاحمت نہیں کر سکا اور NCS پر بینچ مارک چلا گیا۔
ڈیٹیکٹر کی رفتار 0.1 سیکنڈ سے تھوڑی سست تھی، کسی بھی صورت میں کمزور مشین پر بادل سے 2-3 گنا تیز، یعنی 8-9 فریم فی سیکنڈ۔
نتائج میں فرق کی وضاحت اس حقیقت سے ہوتی ہے کہ 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
یہاں کیا ہوا ہے:
NCS کے مقابلے میں تھوڑا کم تیز، لیکن ایک سلسلہ کے مقابلے میں زیادہ زوردار۔
فائدہ، یقیناً، لکیری نہیں ہے - اوپن سی وی امیجز کی ہم وقت سازی اور گہری کاپی کرنے کے لیے اوورلیز موجود ہیں۔
حاصل يہ ہوا
مجموعی طور پر، تجربہ ہمیں یہ نتیجہ اخذ کرنے کی اجازت دیتا ہے کہ اگر آپ کوشش کرتے ہیں، تو آپ ایک سادہ بادل سے بچ سکتے ہیں۔
لیکن ایک طاقتور ڈیسک ٹاپ یا مقامی ہارڈویئر آپ کو بہتر نتائج حاصل کرنے کی اجازت دیتا ہے، اور بغیر کسی چال کے۔
حوالہ جات
ماخذ: www.habr.com