# तपाईंको IoT उपकरणबाट स्टक गन्नुहोस् - भर्चुअल IoT हार्डवेयर र रास्पबेरी पाई पूर्वानुमानहरू र तिनका बाउन्डिङ बक्सहरूको संयोजन प्रयोग गरेर छविमा स्टक गन्न सकिन्छ। ## बाउन्डिङ बक्सहरू देखाउनुहोस् डिबगिङको लागि उपयोगी कदमको रूपमा, तपाईं बाउन्डिङ बक्सहरू प्रिन्ट मात्र गर्न सक्नुहुन्न, तर छवि डिस्कमा लेखिएको बेला तिनलाई छविमा पनि कोर्न सक्नुहुन्छ। ### कार्य - बाउन्डिङ बक्सहरू प्रिन्ट गर्नुहोस् 1. सुनिश्चित गर्नुहोस् कि `stock-counter` प्रोजेक्ट VS Code मा खुला छ, र यदि तपाईं भर्चुअल IoT उपकरण प्रयोग गर्दै हुनुहुन्छ भने भर्चुअल वातावरण सक्रिय छ। 1. `for` लूपमा रहेको `print` स्टेटमेन्टलाई निम्नमा परिवर्तन गर्नुहोस् ताकि बाउन्डिङ बक्सहरू कन्सोलमा प्रिन्ट होस्: ```python print(f'{prediction.tag_name}:\t{prediction.probability * 100:.2f}%\t{prediction.bounding_box}') ``` 1. एप चलाउनुहोस् र क्यामेरालाई शेल्फमा रहेको केही स्टकतर्फ सोझ्याउनुहोस्। बाउन्डिङ बक्सहरू कन्सोलमा प्रिन्ट हुनेछन्, जसमा 0-1 को दायरा भित्रका left, top, width, र height मानहरू हुनेछन्। ```output 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} ``` ### कार्य - छविमा बाउन्डिङ बक्सहरू कोर्नुहोस् 1. [Pillow](https://pypi.org/project/Pillow/) नामक Pip प्याकेज छविमा कोर्न प्रयोग गर्न सकिन्छ। यसलाई निम्न आदेश प्रयोग गरेर इन्स्टल गर्नुहोस्: ```sh pip3 install pillow ``` यदि तपाईं भर्चुअल IoT उपकरण प्रयोग गर्दै हुनुहुन्छ भने, यो सक्रिय भर्चुअल वातावरणभित्रबाट चलाउनुहोस्। 1. `app.py` फाइलको माथिल्लो भागमा निम्न इम्पोर्ट स्टेटमेन्ट थप्नुहोस्: ```python from PIL import Image, ImageDraw, ImageColor ``` यो कोड छवि सम्पादन गर्न आवश्यक कोड इम्पोर्ट गर्दछ। 1. `app.py` फाइलको अन्त्यमा निम्न कोड थप्नुहोस्: ```python 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) प्रयोग गरेर तल्लो दायाँ समन्वय गणना गर्छ। यी मानहरू छविको सम्बन्धित आयामसँग गुणा गरेर छवि समन्वयमा रूपान्तरण गरिन्छ। उदाहरणका लागि, यदि left मान 0.5 छवि 600 पिक्सेल चौडाइ भएको छ भने, यो 300 मा रूपान्तरण हुन्छ (0.5 x 600 = 300)। प्रत्येक बाउन्डिङ बक्स छविमा रातो रेखा प्रयोग गरेर कोरिन्छ। अन्ततः सम्पादित छवि बचत गरिन्छ, मूल छविलाई ओभरराइट गर्दै। 1. एप चलाउनुहोस् र क्यामेरालाई शेल्फमा रहेको केही स्टकतर्फ सोझ्याउनुहोस्। तपाईं VS Code एक्सप्लोररमा `image.jpg` फाइल देख्नुहुनेछ, र यसलाई चयन गरेर बाउन्डिङ बक्सहरू हेर्न सक्नुहुन्छ। ![टमाटर पेस्टका ४ क्यानहरू, प्रत्येक क्यान वरिपरि बाउन्डिङ बक्सहरू](../../../../../translated_images/rpi-stock-with-bounding-boxes.b5540e2ecb7cd49f1271828d3be412671d950e87625c5597ea97c90f11e01097.ne.jpg) ## स्टक गन्नुहोस् माथि देखाइएको छविमा, बाउन्डिङ बक्सहरूमा सानो ओभरल्याप छ। यदि यो ओभरल्याप धेरै ठूलो भएमा, बाउन्डिङ बक्सहरूले एउटै वस्तु संकेत गर्न सक्छ। वस्तुहरू सही रूपमा गन्न, तपाईंले महत्त्वपूर्ण ओभरल्याप भएका बक्सहरूलाई बेवास्ता गर्न आवश्यक छ। ### कार्य - ओभरल्याप बेवास्ता गर्दै स्टक गन्नुहोस् 1. [Shapely](https://pypi.org/project/Shapely/) नामक Pip प्याकेज प्रयोग गरेर इन्टरसेक्सन गणना गर्न सकिन्छ। यदि तपाईं रास्पबेरी पाई प्रयोग गर्दै हुनुहुन्छ भने, पहिले पुस्तकालय निर्भरता इन्स्टल गर्नुहोस्: ```sh sudo apt install libgeos-dev ``` 1. Shapely Pip प्याकेज इन्स्टल गर्नुहोस्: ```sh pip3 install shapely ``` यदि तपाईं भर्चुअल IoT उपकरण प्रयोग गर्दै हुनुहुन्छ भने, यो सक्रिय भर्चुअल वातावरणभित्रबाट चलाउनुहोस्। 1. `app.py` फाइलको माथिल्लो भागमा निम्न इम्पोर्ट स्टेटमेन्ट थप्नुहोस्: ```python from shapely.geometry import Polygon ``` यो कोड ओभरल्याप गणना गर्न बहुभुजहरू बनाउन आवश्यक कोड इम्पोर्ट गर्दछ। 1. बाउन्डिङ बक्सहरू कोर्ने कोडभन्दा माथि निम्न कोड थप्नुहोस्: ```python overlap_threshold = 0.20 ``` यो बाउन्डिङ बक्सहरू एउटै वस्तु मानिने ओभरल्यापको प्रतिशत परिभाषित गर्दछ। 0.20 ले 20% ओभरल्यापलाई जनाउँछ। 1. Shapely प्रयोग गरेर ओभरल्याप गणना गर्न, बाउन्डिङ बक्सहरूलाई Shapely बहुभुजहरूमा रूपान्तरण गर्न आवश्यक छ। यो गर्न निम्न कार्य थप्नुहोस्: ```python 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. ओभरल्याप भएका वस्तुहरू हटाउने तर्कले सबै बाउन्डिङ बक्सहरूको तुलना समावेश गर्दछ। यदि कुनै जोडीको बाउन्डिङ बक्सहरू ओभरल्याप थ्रेसहोल्डभन्दा बढी छ भने, तीमध्ये एउटा पूर्वानुमान मेटाइन्छ। यो गर्न निम्न कोड प्रयोग गर्नुहोस्: ```python 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 सेवामा पठाउन सकिन्छ ताकि स्टक स्तर कम भएमा सतर्क गराउन सकियोस्। यो सबै कोड बाउन्डिङ बक्सहरू कोर्ने कोडभन्दा अघि छ, त्यसैले तपाईंले ओभरल्याप बिना स्टक पूर्वानुमानहरू उत्पन्न छविहरूमा देख्नुहुनेछ। > 💁 यो ओभरल्याप हटाउने धेरै साधारण तरिका हो, जसले ओभरल्याप भएको जोडीमा पहिलोलाई मात्र हटाउँछ। उत्पादन कोडका लागि, तपाईंले यहाँ थप तर्क राख्न चाहनुहुनेछ, जस्तै धेरै वस्तुहरू बीचको ओभरल्याप विचार गर्नु, वा यदि एउटा बाउन्डिङ बक्स अर्कोमा समावेश छ भने। 1. एप चलाउनुहोस् र क्यामेरालाई शेल्फमा रहेको केही स्टकतर्फ सोझ्याउनुहोस्। आउटपुटले थ्रेसहोल्ड नाघ्ने ओभरल्याप बिना बाउन्डिङ बक्सहरूको संख्या देखाउनेछ। `overlap_threshold` मान समायोजन गरेर पूर्वानुमानहरू बेवास्ता भइरहेको हेर्न प्रयास गर्नुहोस्। > 💁 तपाईं यो कोड [code-count/pi](../../../../../5-retail/lessons/2-check-stock-device/code-count/pi) वा [code-count/virtual-iot-device](../../../../../5-retail/lessons/2-check-stock-device/code-count/virtual-iot-device) फोल्डरमा फेला पार्न सक्नुहुन्छ। 😀 तपाईंको स्टक काउन्टर प्रोग्राम सफल भयो! --- **अस्वीकरण**: यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटि वा अशुद्धता हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।