14 KiB
اپنے IoT ڈیوائس سے اسٹاک گنیں - ورچوئل IoT ہارڈویئر اور راسپبیری پائی
پیشگوئیوں اور ان کے باؤنڈنگ باکسز کے امتزاج کو تصویر میں اسٹاک گننے کے لیے استعمال کیا جا سکتا ہے۔
باؤنڈنگ باکسز دکھائیں
ایک مددگار ڈیبگنگ قدم کے طور پر، آپ نہ صرف باؤنڈنگ باکسز کو پرنٹ کر سکتے ہیں بلکہ انہیں اس تصویر پر بھی کھینچ سکتے ہیں جو تصویر کیپچر ہونے پر ڈسک پر لکھی گئی تھی۔
کام - باؤنڈنگ باکسز پرنٹ کریں
-
یقینی بنائیں کہ
stock-counterپروجیکٹ VS Code میں کھلا ہے، اور اگر آپ ورچوئل IoT ڈیوائس استعمال کر رہے ہیں تو ورچوئل ماحول فعال ہے۔ -
forلوپ میں موجودprintبیان کو درج ذیل میں تبدیل کریں تاکہ باؤنڈنگ باکسز کو کنسول پر پرنٹ کیا جا سکے:print(f'{prediction.tag_name}:\t{prediction.probability * 100:.2f}%\t{prediction.bounding_box}') -
ایپ کو چلائیں اور کیمرے کو شیلف پر موجود اسٹاک کی طرف رکھیں۔ باؤنڈنگ باکسز کنسول پر پرنٹ ہوں گے، جن میں بائیں، اوپر، چوڑائی اور اونچائی کی قدریں 0-1 کے درمیان ہوں گی۔
pi@raspberrypi:~/stock-counter $ python3 app.py tomato paste: 33.42% {'additional_properties': {}, 'left': 0.3455171, 'top': 0.09916268, 'width': 0.14175442, 'height': 0.29405564} tomato paste: 34.41% {'additional_properties': {}, 'left': 0.48283678, 'top': 0.10242918, 'width': 0.11782813, 'height': 0.27467814} tomato paste: 31.25% {'additional_properties': {}, 'left': 0.4923783, 'top': 0.35007596, 'width': 0.13668466, 'height': 0.28304994} tomato paste: 31.05% {'additional_properties': {}, 'left': 0.36416405, 'top': 0.37494493, 'width': 0.14024884, 'height': 0.26880276}
کام - تصویر پر باؤنڈنگ باکسز کھینچیں
-
Pip پیکیج Pillow تصاویر پر کھینچنے کے لیے استعمال کیا جا سکتا ہے۔ اسے درج ذیل کمانڈ کے ذریعے انسٹال کریں:
pip3 install pillowاگر آپ ورچوئل IoT ڈیوائس استعمال کر رہے ہیں، تو یقینی بنائیں کہ یہ فعال ورچوئل ماحول کے اندر سے چلایا گیا ہے۔
-
app.pyفائل کے اوپر درج ذیل درآمدی بیان شامل کریں:from PIL import Image, ImageDraw, ImageColorیہ کوڈ درآمد کرتا ہے جو تصویر میں ترمیم کرنے کے لیے ضروری ہے۔
-
app.pyفائل کے آخر میں درج ذیل کوڈ شامل کریں:with Image.open('image.jpg') as im: draw = ImageDraw.Draw(im) for prediction in predictions: scale_left = prediction.bounding_box.left scale_top = prediction.bounding_box.top scale_right = prediction.bounding_box.left + prediction.bounding_box.width scale_bottom = prediction.bounding_box.top + prediction.bounding_box.height left = scale_left * im.width top = scale_top * im.height right = scale_right * im.width bottom = scale_bottom * im.height draw.rectangle([left, top, right, bottom], outline=ImageColor.getrgb('red'), width=2) im.save('image.jpg')یہ کوڈ پہلے محفوظ کی گئی تصویر کو ترمیم کے لیے کھولتا ہے۔ پھر یہ پیشگوئیوں کے ذریعے لوپ کرتا ہے، باؤنڈنگ باکسز حاصل کرتا ہے، اور 0-1 کی قدروں کا استعمال کرتے ہوئے نیچے دائیں کوآرڈینیٹ کا حساب لگاتا ہے۔ یہ قدریں تصویر کے کوآرڈینیٹس میں تبدیل کی جاتی ہیں، تصویر کے متعلقہ طول و عرض سے ضرب دے کر۔ مثال کے طور پر، اگر بائیں قدر 0.5 ہو اور تصویر 600 پکسلز چوڑی ہو، تو یہ 300 میں تبدیل ہو جائے گی (0.5 x 600 = 300)۔
ہر باؤنڈنگ باکس تصویر پر ایک سرخ لائن کے ذریعے کھینچا جاتا ہے۔ آخر میں ترمیم شدہ تصویر محفوظ کی جاتی ہے، اور اصل تصویر کو اوور رائٹ کر دیا جاتا ہے۔
-
ایپ کو چلائیں اور کیمرے کو شیلف پر موجود اسٹاک کی طرف رکھیں۔ آپ VS Code ایکسپلورر میں
image.jpgفائل دیکھیں گے، اور آپ اسے منتخب کر کے باؤنڈنگ باکسز دیکھ سکیں گے۔
اسٹاک گنیں
اوپر دکھائی گئی تصویر میں، باؤنڈنگ باکسز میں تھوڑا سا اوورلیپ ہے۔ اگر یہ اوورلیپ بہت زیادہ ہو، تو باؤنڈنگ باکسز ایک ہی چیز کی نشاندہی کر سکتے ہیں۔ اشیاء کو صحیح طریقے سے گننے کے لیے، آپ کو ان باکسز کو نظر انداز کرنا ہوگا جن میں نمایاں اوورلیپ ہو۔
کام - اوورلیپ کو نظر انداز کرتے ہوئے اسٹاک گنیں
-
Pip پیکیج Shapely انٹرسیکشن کا حساب لگانے کے لیے استعمال کیا جا سکتا ہے۔ اگر آپ راسپبیری پائی استعمال کر رہے ہیں، تو آپ کو پہلے ایک لائبریری ڈیپینڈنسی انسٹال کرنی ہوگی:
sudo apt install libgeos-dev -
Shapely Pip پیکیج انسٹال کریں:
pip3 install shapelyاگر آپ ورچوئل IoT ڈیوائس استعمال کر رہے ہیں، تو یقینی بنائیں کہ یہ فعال ورچوئل ماحول کے اندر سے چلایا گیا ہے۔
-
app.pyفائل کے اوپر درج ذیل درآمدی بیان شامل کریں:from shapely.geometry import Polygonیہ کوڈ درآمد کرتا ہے جو اوورلیپ کا حساب لگانے کے لیے پولیگونز بنانے کے لیے ضروری ہے۔
-
باؤنڈنگ باکسز کھینچنے والے کوڈ کے اوپر درج ذیل کوڈ شامل کریں:
overlap_threshold = 0.20یہ اس فیصد اوورلیپ کی وضاحت کرتا ہے جو باؤنڈنگ باکسز کو ایک ہی چیز سمجھنے سے پہلے اجازت دی جاتی ہے۔ 0.20 ایک 20% اوورلیپ کی وضاحت کرتا ہے۔
-
Shapely کا استعمال کرتے ہوئے اوورلیپ کا حساب لگانے کے لیے، باؤنڈنگ باکسز کو Shapely پولیگونز میں تبدیل کرنے کی ضرورت ہے۔ ایسا کرنے کے لیے درج ذیل فنکشن شامل کریں:
def create_polygon(prediction): scale_left = prediction.bounding_box.left scale_top = prediction.bounding_box.top scale_right = prediction.bounding_box.left + prediction.bounding_box.width scale_bottom = prediction.bounding_box.top + prediction.bounding_box.height return Polygon([(scale_left, scale_top), (scale_right, scale_top), (scale_right, scale_bottom), (scale_left, scale_bottom)])یہ پیشگوئی کے باؤنڈنگ باکس کا استعمال کرتے ہوئے ایک پولیگون بناتا ہے۔
-
اوورلیپنگ اشیاء کو ہٹانے کی منطق میں تمام باؤنڈنگ باکسز کا موازنہ شامل ہوتا ہے، اور اگر کسی بھی پیشگوئی کے جوڑے کے باؤنڈنگ باکسز اوورلیپ تھریشولڈ سے زیادہ اوورلیپ کرتے ہیں، تو ایک پیشگوئی کو حذف کر دیا جاتا ہے۔ تمام پیشگوئیوں کا موازنہ کرنے کے لیے، آپ پیشگوئی 1 کا موازنہ 2، 3، 4 وغیرہ سے کرتے ہیں، پھر 2 کا موازنہ 3، 4 وغیرہ سے۔ درج ذیل کوڈ یہ کام کرتا ہے:
to_delete = [] for i in range(0, len(predictions)): polygon_1 = create_polygon(predictions[i]) for j in range(i+1, len(predictions)): polygon_2 = create_polygon(predictions[j]) overlap = polygon_1.intersection(polygon_2).area smallest_area = min(polygon_1.area, polygon_2.area) if overlap > (overlap_threshold * smallest_area): to_delete.append(predictions[i]) break for d in to_delete: predictions.remove(d) print(f'Counted {len(predictions)} stock items')اوورلیپ کا حساب Shapely کے
Polygon.intersectionطریقے کا استعمال کرتے ہوئے لگایا جاتا ہے، جو ایک پولیگون واپس کرتا ہے جس میں اوورلیپ ہوتا ہے۔ اس پولیگون سے ایریا کا حساب لگایا جاتا ہے۔ یہ اوورلیپ تھریشولڈ ایک مطلق قدر نہیں ہے، بلکہ یہ باؤنڈنگ باکس کے فیصد کے طور پر ہونا چاہیے، لہذا سب سے چھوٹا باؤنڈنگ باکس پایا جاتا ہے، اور اوورلیپ تھریشولڈ کا استعمال کرتے ہوئے حساب لگایا جاتا ہے کہ اوورلیپ کا ایریا کتنا ہو سکتا ہے تاکہ سب سے چھوٹے باؤنڈنگ باکس کے فیصد اوورلیپ تھریشولڈ سے تجاوز نہ کرے۔ اگر اوورلیپ اس سے تجاوز کرتا ہے، تو پیشگوئی کو حذف کرنے کے لیے نشان زد کیا جاتا ہے۔ایک بار جب پیشگوئی کو حذف کرنے کے لیے نشان زد کیا جاتا ہے، تو اسے دوبارہ چیک کرنے کی ضرورت نہیں ہوتی، لہذا اندرونی لوپ اگلی پیشگوئی کو چیک کرنے کے لیے ختم ہو جاتا ہے۔ آپ فہرست کے آئٹمز کو اس پر چلتے ہوئے حذف نہیں کر سکتے، لہذا وہ باؤنڈنگ باکسز جو اوورلیپ تھریشولڈ سے زیادہ اوورلیپ کرتے ہیں،
to_deleteفہرست میں شامل کیے جاتے ہیں، اور آخر میں حذف کر دیے جاتے ہیں۔آخر میں اسٹاک کی تعداد کنسول پر پرنٹ کی جاتی ہے۔ یہ پھر IoT سروس کو بھیجا جا سکتا ہے تاکہ اگر اسٹاک کی سطح کم ہو تو الرٹ کیا جا سکے۔ یہ تمام کوڈ باؤنڈنگ باکسز کھینچنے سے پہلے ہے، لہذا آپ جنریٹ کردہ تصاویر پر اوورلیپ کے بغیر اسٹاک پیشگوئیاں دیکھیں گے۔
💁 یہ اوورلیپ کو ہٹانے کا ایک بہت ہی سادہ طریقہ ہے، صرف اوورلیپنگ جوڑے میں سے پہلے کو ہٹانا۔ پروڈکشن کوڈ کے لیے، آپ یہاں مزید منطق شامل کرنا چاہیں گے، جیسے متعدد اشیاء کے درمیان اوورلیپ پر غور کرنا، یا اگر ایک باؤنڈنگ باکس دوسرے کے اندر موجود ہو۔
-
ایپ کو چلائیں اور کیمرے کو شیلف پر موجود اسٹاک کی طرف رکھیں۔ آؤٹ پٹ ان باؤنڈنگ باکسز کی تعداد کی نشاندہی کرے گا جو تھریشولڈ سے زیادہ اوورلیپ کے بغیر ہیں۔
overlap_thresholdقدر کو ایڈجسٹ کرنے کی کوشش کریں تاکہ نظر انداز کی گئی پیشگوئیاں دیکھ سکیں۔
💁 آپ یہ کوڈ code-count/pi یا code-count/virtual-iot-device فولڈر میں تلاش کر سکتے ہیں۔
😀 آپ کا اسٹاک کاؤنٹر پروگرام کامیاب رہا!
ڈسکلیمر:
یہ دستاویز AI ترجمہ سروس Co-op Translator کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔
