- अवयव आवश्यक
- YOLO
- रास्पबेरी पाई में OpenCV स्थापित करना
- रास्पबेरी पाई में अन्य आवश्यक पैकेज स्थापित करना
- कार्यक्रम की व्याख्या
- सामाजिक दूरी डिटेक्टर परियोजना का परीक्षण
कोविद -19 के समय में, संक्रामक विषाणुओं के संचरण को धीमा करने के लिए सोशल-डिस्टेंसिंग एक प्रभावी तरीका है। लोगों को सलाह दी जाती है कि वे सीधे संपर्क के माध्यम से प्रेषित होने वाले रोग के जोखिम को कम करने के लिए एक-दूसरे के साथ अपने संपर्क को कम करें। कई स्थानों जैसे कारखानों, बैंकों, बसों या रेलवे स्टेशनों, आदि के लिए एक सुरक्षित दूरी बनाए रखना एक चुनौती है।
तो हमारे पिछले कोरोना सुरक्षा परियोजनाओं जैसे कि स्वचालित सैनिटाइज़र मशीन और संपर्क रहित तापमान की निगरानी में जारी रखने के लिए, यहाँ हम OpenCV और रास्पबेरी पाई का उपयोग करके एक सोशल डिस्टेंसिंग डिटेक्टर सिस्टम बनाने जा रहे हैं । हम डीप न्यूरल नेटवर्क मॉड्यूल के साथ YOLO v3 ऑब्जेक्ट डिटेक्शन एल्गोरिथम के वज़न का उपयोग करेंगे।
रास्पबेरी पाई छवि प्रसंस्करण परियोजनाओं के लिए हमेशा एक अच्छा विकल्प है क्योंकि इसमें अन्य नियंत्रकों की तुलना में अधिक स्मृति और गति है। हमने पहले कुछ जटिल छवि प्रसंस्करण परियोजनाओं के लिए रास्पबेरी पाई का उपयोग किया था जैसे कि चेहरे का लैंडमार्क डिटेक्शन और फेस रिकग्निशन एप्लीकेशन।
अवयव आवश्यक
- रसभरी पाई ४
यहां हमें केवल आरपीआई 4 की आवश्यकता है जिसके साथ ओपनसीवी स्थापित है। OpenCV का उपयोग यहां डिजिटल इमेज प्रोसेसिंग के लिए किया जाता है। डिजिटल इमेज प्रोसेसिंग के सबसे आम एप्लिकेशन ऑब्जेक्ट डिटेक्शन, फेस रिकॉग्निशन और लोग काउंटर हैं।
YOLO
YOLO (आप केवल एक बार देखें) वास्तविक समय वस्तु पहचान के लिए एक स्मार्ट कन्वर्सेशन न्यूरल नेटवर्क (CNN) है। YOLOv3, ऑब्जेक्ट डिटेक्शन एल्गोरिथम का नवीनतम संस्करण, YOLO छवियों और वीडियो में 80 विभिन्न वस्तुओं को पहचान सकता है, और यह सुपर फास्ट है और इसमें उत्कृष्ट सटीकता है। एल्गोरिथ्म पूरी छवि में एक एकल तंत्रिका नेटवर्क को लागू करता है, फिर छवि को क्षेत्रों में अलग करता है और प्रत्येक क्षेत्र के लिए सीमा बक्से और संभावनाओं की गणना करता है। बेस YOLO मॉडल छवियों को वास्तविक समय में 45 फ्रेम प्रति सेकंड पर संसाधित कर सकता है। YOLO मॉडल SSD और R-CNN जैसी अन्य सभी पहचान विधियों को बेहतर बनाता है।
YOLOV3 मॉडल जिसे हम इस परियोजना में उपयोग करने जा रहे हैं, यहाँ से डाउनलोड किया जा सकता है।
रास्पबेरी पाई में OpenCV स्थापित करना
OpenCV और अन्य निर्भरताओं को स्थापित करने से पहले, रास्पबेरी पाई को पूरी तरह से अपडेट करने की आवश्यकता है। रास्पबेरी पाई को उसके नवीनतम संस्करण में अपडेट करने के लिए नीचे दिए गए आदेशों का उपयोग करें:
sudo apt-get update
फिर अपने रास्पबेरी पाई पर OpenCV स्थापित करने के लिए आवश्यक निर्भरता स्थापित करने के लिए निम्न आदेशों का उपयोग करें।
sudo apt-get libhdf5-देव -y स्थापित sudo apt-get libhdf5 धारावाहिक-देव -y स्थापित sudo apt-get libatlas आधार-देव -y स्थापित sudo apt-get स्थापित libjasper-देव -y sudo apt-get libqtgui4 स्थापित -Y sudo apt-get install libqt4-test –y
अंत में, नीचे के आदेशों का उपयोग करके रास्पबेरी पाई पर ओपनसीवी स्थापित करें।
पिप 3 ओपेंनव-कंट्रीब-पाइथन == 4.1.0.25 स्थापित करें
यदि आप OpenCV के लिए नए हैं, तो रास्पबेरी पाई के साथ हमारे पिछले OpenCV ट्यूटोरियल देखें:
- रास्पबेरी पाई पर CMC का उपयोग करके OpenCV स्थापित करना
- रास्पबेरी पाई और OpenCV के साथ वास्तविक समय चेहरा पहचान
- रास्पबेरी पाई और ओपनसीवी का उपयोग करके लाइसेंस प्लेट मान्यता
- OpenCV और रास्पबेरी पाई का उपयोग करके भीड़ का आकार अनुमान
हमने शुरुआती स्तर से शुरू होने वाले ओपनसीवी ट्यूटोरियल की एक श्रृंखला भी बनाई है।
रास्पबेरी पाई में अन्य आवश्यक पैकेज स्थापित करना
सामाजिक दूरी डिटेक्टर के लिए रास्पबेरी पाई प्रोग्रामिंग करने से पहले, अन्य आवश्यक पैकेज स्थापित करें।
Imutils इंस्टॉल करना: imutils का उपयोग आवश्यक छवि प्रसंस्करण कार्यों जैसे अनुवाद, रोटेशन, आकार बदलने, कंकाल बनाने और OpenCV के साथ Matplotlib छवियों को प्रदर्शित करने के लिए किया जाता है। Imutils स्थापित करने के लिए नीचे दिए गए आदेश का उपयोग करें:
pip3 इंस्टॉल करें
कार्यक्रम की व्याख्या
पेज के अंत में पूरा कोड दिया गया है। यहां हम बेहतर स्पष्टीकरण के लिए कोड के महत्वपूर्ण खंडों की व्याख्या कर रहे हैं।
इसलिए कोड की शुरुआत में, सभी आवश्यक पुस्तकालयों को आयात करें जो इस परियोजना में उपयोग होने जा रहे हैं।
आयात सुन्न के रूप में एनपी आयात cv2 आयात imutils ओएस आयात समय आयात करते हैं
चेक () समारोह वीडियो की एक फ्रेम में दो वस्तुओं या दो अंक के बीच दूरी की गणना करने के लिए इस्तेमाल किया जाता है। अंक एक और ख फ्रेम में दो वस्तुओं को दर्शाते हैं। इन दो बिंदुओं का उपयोग वस्तुओं के बीच यूक्लिडियन दूरी की गणना करने के लिए किया जाता है ।
def चेक (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * ((a - b) ** 2) ** 0.5 अंशांकन = (a + b)) / २ अगर ० <डिस्ट <०.२५ * अंशांकन: वापस लौटाएं सच: लौटें
सेटअप फ़ंक्शन का उपयोग YOLO वज़न, cfg फ़ाइल, COCO नाम फ़ाइल के लिए पथ सेट करने के लिए किया जाता है। os.path मॉड्यूल का उपयोग सामान्य पथनाम हेरफेर के लिए किया जाता है। os.path.join () मॉड्यूल की एक उप-मॉड्यूल है os.path और समझदारी से एक या अधिक पथ घटकों में शामिल होने के लिए इस्तेमाल किया। cv2.dnn.readNetFromDarknet () विधि का उपयोग नेटवर्क में सहेजे गए भार को लोड करने के लिए किया जाता है। भार लोड करने के बाद, net.getLayerNames मॉडल का उपयोग करके नेटवर्क में उपयोग की जाने वाली सभी परतों की सूची निकालें ।
def setup (yolo): ग्लोबल न्यूरल_नेट, ln, LABELS वेट = os.path.sep.join () config = os.path.sep.join () लेबलPath = os.path.sep.join () लेबल (ओपन) लेबल).्रेड।
इमेज प्रोसेसिंग फ़ंक्शन के अंदर, हम वीडियो का एक फ्रेम लेते हैं और फिर इसे हर व्यक्ति-भीड़ के बीच सामाजिक दूरी का पता लगाने के लिए संसाधित करते हैं। फ़ंक्शन की पहली दो पंक्तियों में, हम शुरू में वीडियो फ्रेम (डब्ल्यू, एच) के आयाम (कोई नहीं, कोई नहीं) के रूप में सेट करते हैं। अगली पंक्ति में, हमने cv2.dnn.blobFromImage () पद्धति का उपयोग एक बैच में फ़्रेम लोड करने और उन्हें नेटवर्क के माध्यम से चलाने के लिए किया। बूँद फंक्शन मीन घटाव, स्केलिंग और चैनल को एक फ्रेम पर स्वैप करता है।
(एच, डब्ल्यू) = (कोई नहीं, कोई नहीं) फ्रेम = इमेज.कॉपी () अगर डब्ल्यू कोई नहीं है या एच कोई नहीं है: (एच, डब्ल्यू) = फ्रेम। ब्लॉप = cv2.dnn.blobFromImage (फ्रेम, १ / २५५.०, (416, 416), swapRB = सत्य, फसल = गलत) neural_net.setInput (बूँद) starttime = time.time () layerOutputs = neural_net.forward (ln)
YOLO से लेयर आउटपुट मानों के एक सेट से मिलकर बनता है। ये मूल्य हमें यह परिभाषित करने में मदद करते हैं कि कौन सी वस्तु किस वर्ग की है । हम लेयरऑउटपुट में हर आउटपुट पर लूप करते हैं और जैसा कि हम लोगों का पता लगा रहे हैं, हम क्लास लेबल को "व्यक्ति" के रूप में सेट करते हैं। प्रत्येक खोज से, हमें एक बाउंडिंग बॉक्स मिलता है जो हमें आउटपुट में पता लगाने के लिए X केंद्र, Y केंद्र, चौड़ाई और बॉक्स की ऊँचाई देता है:
स्कोर = पता लगाना maxi_class = np.argmax (स्कोर) आत्मविश्वास = स्कोर अगर LABELS == "व्यक्ति": यदि आत्मविश्वास> 0.5: बॉक्स = डिटेक्शन * np.array () (centerX, centerY, चौड़ाई, ऊंचाई = box.astype ("int") x = int (centerX - (चौड़ाई / 2)) y = int (centerY - (ऊँचाई / 2)) outline.append () confidences.append (float (आत्मविश्वास))
उसके बाद, अन्य सभी ज्ञात बक्सों के साथ वर्तमान बॉक्स के केंद्र के बीच की दूरी की गणना करें। यदि बाउंडिंग बॉक्स करीब हैं, तो स्थिति को सच में बदलें।
i for रेंज (len (केंद्र)): j के लिए श्रेणी (len (केंद्र)): close = check (केंद्र, केंद्र) यदि close: जोड़े ।append (, केंद्र)) status = सही स्थिति = True index = 0
अगली पंक्तियों में, मॉडल से प्राप्त बॉक्स आयामों का उपयोग करते हुए व्यक्ति के चारों ओर एक आयत बनाएं, फिर जांचें कि क्या बॉक्स सुरक्षित या असुरक्षित है। यदि बक्से के बीच की दूरी करीब है, तो बॉक्स का रंग लाल रंग का होगा और बॉक्स का रंग हरा होगा।
(x, y) = (बाह्यरेखा, रूपरेखा) (w, h) = (बाह्यरेखा, रूपरेखा) यदि स्थिति == सत्य: cv2.rectangle (फ्रेम, (x, y), (x + w, y + h), (0, 0, 150), 2) योगिनी स्थिति == झूठी: cv2.rectangle (फ्रेम, (x, y), (x + w, y + h), (0, 255, 0), 2)
अब लूप फ़ंक्शन के अंदर, हम वीडियो के हर फ्रेम को पढ़ रहे हैं और फिर प्रत्येक फ्रेम को व्यक्तियों के बीच की दूरी की गणना करने के लिए प्रोसेस कर रहे हैं।
ret, फ्रेम = cap.read () नॉट रिटेन: ब्रेक करें current_img = फ्रेम.copy () current_img = imutils.resize (current_img, width = 480) वीडियो = current_img.shape फ्रेमवर्क + = 1 अगर (frameno% 2 == 0) या frameno == 1): सेटअप (yolo) ImageProcess (current_img) फ़्रेम = संसाधित आईजीएम
अगली पंक्तियों में, आउटपुट वीडियो को opname द्वारा निर्दिष्ट स्थान पर संग्रहीत करने के लिए cv2.VideoWriter () फ़ंक्शन का उपयोग करें जिसे हमने पहले परिभाषित किया है।
अगर क्रिएट कोई नहीं है: Fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, और (Frame.shape, Frame -shape), True) create.write (फ़्रेम)
सामाजिक दूरी डिटेक्टर परियोजना का परीक्षण
एक बार आपका कोड तैयार हो जाने के बाद, एक पाई टर्मिनल खोलें और प्रोजेक्ट डायरेक्टरी पर जाएँ। कोड, योलो मॉडल और डेमो वीडियो उसी फ़ोल्डर में होना चाहिए जैसा कि नीचे दिखाया गया है।
आप यहाँ से YoloV3 निर्देशिका को डाउनलोड कर सकते हैं, Pexels के वीडियो और नीचे दिए गए पायथन कोड को कॉपी कर सकते हैं, और उन्हें उसी निर्देशिका में रख सकते हैं जैसा कि ऊपर दिखाया गया है।
एक बार जब आप प्रोजेक्ट डायरेक्टरी में होते हैं, तो कोड शुरू करने के लिए निम्नलिखित कमांड निष्पादित करें:
पायथन 3 डिटेक्टर
मैंने इस कोड को एक वीडियो उदाहरण पर आज़माया जो Pexels से प्राप्त किया गया था। मेरे लिए, एफपीएस बहुत धीमा था और पूरे वीडियो को संसाधित करने में लगभग 10 से 11 मिनट का समय लगा।
एक वीडियो का उपयोग कर के बजाय, आप भी बदल कर एक रास्पबेरी Pi कैमरा के साथ इस कोड का परीक्षण कर सकते cv2.VideoCapture (इनपुट) के साथ cv2.VideoCapture (0) 98 में वें कोड की पंक्ति। लिंक का अनुसरण करके रास्पबेरी पाई के साथ PiCamera का उपयोग करने के बारे में अधिक जानें।
इस तरह आप रास्पबेरी पाई के साथ OpenCV का उपयोग कर सकते हैं ताकि सामाजिक दूरियों के उल्लंघन का पता लगाया जा सके। आउटपुट वीडियो और कोड नीचे दिया गया है: