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 کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔