परिचय
ऑब्जेक्ट डिटेक्शन भाप प्राप्त कर रहा है, और इसे हल करने के लिए कई तरीकों में सुधार किए जा रहे हैं। पिछले कुछ वर्षों में, YOLOv7 और YOLOv6 (जो YOLOv7 के बाद स्वतंत्र रूप से जारी किया गया था) जैसी हालिया प्रगति के साथ, YOLO- आधारित विधियाँ सटीकता और गति के मामले में दूसरों से बेहतर प्रदर्शन कर रही हैं।
हालाँकि - ये सभी संबंधित हैं 2डी ऑब्जेक्ट डिटेक्शनहै, जो अपने आप में एक कठिन कार्य है। हाल ही में, हम सफलतापूर्वक प्रदर्शन करने में सक्षम हुए हैं 3डी ऑब्जेक्ट डिटेक्शन, और जबकि ये डिटेक्टर अभी भी 2D ऑब्जेक्ट डिटेक्टरों की तुलना में अधिक अस्थिर अवस्था में हैं, उनकी सटीकता बढ़ रही है।
इस गाइड में, हम MediaPipe's Objectron के साथ Python में 3D ऑब्जेक्ट डिटेक्शन का प्रदर्शन करेंगे।
नोट: MediaPipe मुख्य रूप से मोबाइल उपकरणों के लिए छवियों, वीडियो और ऑडियो स्ट्रीम को संसाधित करने के लिए मशीन लर्निंग पाइपलाइन बनाने के लिए Google का ओपन सोर्स फ्रेमवर्क है। यह आंतरिक और बाहरी दोनों तरह से उपयोग किया जा रहा है, और विभिन्न कार्यों के लिए पूर्व-प्रशिक्षित मॉडल प्रदान करता है, जैसे कि चेहरा पहचानना, चेहरे की जाली लगाना, हाथ और मुद्रा का अनुमान, बालों का विभाजन, वस्तु का पता लगाना, बॉक्स ट्रैकिंग, आदि।
इन सभी का उपयोग डाउनस्ट्रीम कार्यों के लिए किया जा सकता है और इनका उपयोग किया जा सकता है - जैसे कि चेहरों पर फ़िल्टर लगाना, स्वचालित कैमरा फ़ोकसिंग, बायोमेट्रिक सत्यापन, हाथ से नियंत्रित रोबोटिक्स, आदि। अधिकांश प्रोजेक्ट एंड्रॉइड, आईओएस, सी ++, पायथन और जावास्क्रिप्ट के लिए एपीआई के साथ उपलब्ध हैं, जबकि कुछ केवल कुछ निश्चित भाषाओं के लिए उपलब्ध हैं।
इस गाइड में, हम साथ काम करेंगे मीडियापाइप का ऑब्जेक्ट्रोन, Android, C++, Python और JavaScript के लिए उपलब्ध है।
मीडियापाइप और 3डी ऑब्जेक्ट डिटेक्शन
RSI ऑब्जेक्ट्रोन समाधान पर प्रशिक्षित किया गया था ऑब्जेक्ट्रोन डेटासेट, जिसमें लघु वस्तु-केंद्रित वीडियो हैं। डेटासेट में केवल 9 ऑब्जेक्ट होते हैं: बाइक, किताबें, बोतलें, कैमरा, अनाज के डिब्बे, कुर्सियाँ, कप, लैपटॉप और जूते, इसलिए यह बहुत सामान्य डेटासेट नहीं है, लेकिन इन वीडियो का प्रसंस्करण और खरीद काफी महंगा है (कैमरा पोज़, विरल प्रत्येक वीडियो के प्रत्येक फ्रेम के लिए पॉइंट-क्लाउड, प्लानर सतहों का लक्षण वर्णन, आदि), डेटासेट को आकार में लगभग 2 टेराबाइट बनाते हैं।
प्रशिक्षित ऑब्जेक्ट्रॉन मॉडल (जिसे a . के रूप में जाना जाता है) समाधान मीडियापाइप परियोजनाओं के लिए) को चार श्रेणियों - जूते, कुर्सियों, मग और कैमरों पर प्रशिक्षित किया जाता है।
2D ऑब्जेक्ट डिटेक्शन "बाउंडिंग बॉक्स" शब्द का उपयोग करता है, जबकि वे वास्तव में आयताकार होते हैं। 3D ऑब्जेक्ट डिटेक्शन वास्तव में भविष्यवाणी करता है बक्से वस्तुओं के आसपास, जिससे आप उनके अभिविन्यास, आकार, मोटे आयतन आदि का अनुमान लगा सकते हैं। यह एक काफी कठिन कार्य है, विशेष रूप से उपयुक्त डेटासेट की कमी और उन्हें बनाने की लागत को देखते हुए। मुश्किल होने पर, समस्या विभिन्न के लिए वादा रखती है संवर्धित वास्तविकता (AR) अनुप्रयोग!
ऑब्जेक्ट्रोन समाधान एक-चरण या दो-चरण मोड में चल सकता है - जहां एक-चरण मोड कई वस्तुओं का पता लगाने में बेहतर होता है, जबकि दो-चरण मोड दृश्य में एकल मुख्य वस्तु का पता लगाने में बेहतर होता है, और महत्वपूर्ण रूप से चलता है और तेज। सिंगल-स्टेज पाइपलाइन MobileNetV2 बैकबोन का उपयोग करती है, जबकि टू-स्टेज पाइपलाइन TensorFlow ऑब्जेक्ट डिटेक्शन एपीआई का उपयोग करती है।
जब किसी वीडियो में किसी वस्तु का पता लगाया जाता है, तो दो कारणों से प्रत्येक फ्रेम पर इसके लिए आगे की भविष्यवाणी नहीं की जाती है:
- निरंतर भविष्यवाणियां उच्च घबराहट का परिचय देती हैं (भविष्यवाणियों में अंतर्निहित स्थिरता के कारण)
- हर फ्रेम पर बड़े मॉडल चलाना महंगा है
टीम भारी भविष्यवाणियों को केवल पहले मुठभेड़ों के लिए उतार देती है और फिर उस बॉक्स को तब तक ट्रैक करती है जब तक प्रश्न में वस्तु अभी भी दृश्य में है। एक बार जब दृष्टि रेखा टूट जाती है और वस्तु को फिर से पेश किया जाता है, तो एक भविष्यवाणी फिर से की जाती है। यह कम्प्यूटेशनल आवश्यकताओं को कम रखते हुए उच्च सटीकता के साथ बड़े मॉडल का उपयोग करना संभव बनाता है, और वास्तविक समय के अनुमान के लिए हार्डवेयर आवश्यकताओं को कम करता है!
आइए आगे बढ़ते हैं और MediaPipe स्थापित करते हैं, Objectron समाधान आयात करते हैं और इसे स्थिर छवियों और सीधे कैमरे से आने वाले वीडियो फ़ीड पर लागू करते हैं।
मीडियापाइप स्थापित करना
आइए पहले MediaPipe स्थापित करें और किसी दिए गए URL से चित्र लाने के लिए एक सहायक विधि तैयार करें:
! pip install mediapipe
ढांचे को स्थापित करने के साथ, आइए इसे सामान्य पुस्तकालयों के साथ आयात करें:
import mediapipe as mp
import cv2
import numpy as np
import matplotlib.pyplot as plt
आइए एक यूआरएल दिए गए छवियों को लाने के लिए एक सहायक विधि को परिभाषित करें और जो उस छवि का प्रतिनिधित्व करने वाला आरजीबी सरणी देता है:
import PIL
import urllib
def url_to_array(url):
req = urllib.request.urlopen(url)
arr = np.array(bytearray(req.read()), dtype=np.int8)
arr = cv2.imdecode(arr, -1)
arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
return arr
mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)
अंत में, हम भविष्यवाणियों की कल्पना करने के लिए ऑब्जेक्ट्रोन समाधान और ड्राइंग उपयोगिताओं दोनों को आयात करना चाहेंगे:
mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils
MediaPipe के साथ स्थिर छवियों पर 3D ऑब्जेक्ट डिटेक्शन
RSI Objectron
वर्ग कई तर्कों की अनुमति देता है, जिनमें शामिल हैं:
static_image_mode
: चाहे आप एक छवि या छवियों की एक धारा (वीडियो) में खिला रहे होंmax_num_objects
: वस्तुओं की अधिकतम पहचान योग्य संख्याmin_detection_confidence
: डिटेक्शन कॉन्फिडेंस थ्रेशोल्ड (दिए गए वर्ग के लिए किसी ऑब्जेक्ट को वर्गीकृत करने के लिए नेटवर्क को कितना सुनिश्चित होना चाहिए)model_name
: आप किस मॉडल के बीच में लोड करना चाहेंगे'Cup'
,'Shoe'
,'Camera'
और'Chair'
.
इन बातों को ध्यान में रखते हुए - आइए एक ऑब्जेक्ट्रॉन इंस्टेंस को इंस्टेंट करें और process()
इनपुट छवि:
objectron = mp_objectron.Objectron(
static_image_mode=True,
max_num_objects=5,
min_detection_confidence=0.2,
model_name='Cup')
results = objectron.process(mug)
RSI results
खोजी गई वस्तु (वस्तुओं) के 2डी और 3डी लैंडमार्क के साथ-साथ प्रत्येक के लिए रोटेशन, अनुवाद और स्केल शामिल हैं। हम प्रदान किए गए ड्राइंग बर्तनों का उपयोग करके परिणामों को संसाधित कर सकते हैं और बाउंडिंग बॉक्स को काफी आसानी से खींच सकते हैं:
सर्वोत्तम प्रथाओं, उद्योग-स्वीकृत मानकों और शामिल चीट शीट के साथ, Git सीखने के लिए व्यावहारिक मार्गदर्शिका देखें। Googling Git कमांड को रोकें और वास्तव में सीखना यह!
if not results.detected_objects:
print(f'No box landmarks detected.')
annotated_image = mug.copy()
for detected_object in results.detected_objects:
mp_drawing.draw_landmarks(annotated_image,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(annotated_image,
detected_object.rotation,
detected_object.translation)
fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()
इसका परिणाम यह होगा:
MediaPipe के साथ वीडियो या वेबकैम से 3D ऑब्जेक्ट डिटेक्शन
वीडियो पर एक और रोमांचक एप्लिकेशन है! वीडियो को समायोजित करने के लिए आपको कोड को ज्यादा बदलने की जरूरत नहीं है, चाहे आप वेबकैम से उपलब्ध करा रहे हों या मौजूदा वीडियो फ़ाइल। OpenCV वीडियो फ्रेम को ऑब्जेक्ट्रोन मॉडल में पढ़ने, हेरफेर करने और फीड करने के लिए एक प्राकृतिक फिट है:
cap = cv2.VideoCapture(0)
objectron = mp_objectron.Objectron(static_image_mode=False,
max_num_objects=5,
min_detection_confidence=0.4,
min_tracking_confidence=0.70,
model_name='Cup')
while cap.isOpened():
success, image = cap.read()
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = objectron.process(image)
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
if results.detected_objects:
for detected_object in results.detected_objects:
mp_drawing.draw_landmarks(image,
detected_object.landmarks_2d,
mp_objectron.BOX_CONNECTIONS)
mp_drawing.draw_axis(image,
detected_object.rotation,
detected_object.translation)
cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
छवि को गैर-लिखने योग्य बनाना image.flags.writeable = False
प्रक्रिया को कुछ तेज चलाता है, और यह एक वैकल्पिक परिवर्तन है। अंतिम cv2.flip()
परिणामी छवि पर भी वैकल्पिक है - और इसे थोड़ा और सहज बनाने के लिए आउटपुट को प्रतिबिंबित करता है।
जब एक कैमरे और विश्व स्तर पर आम Ikea मग पर चलाया जाता है, तो ये परिणाम होते हैं:
आउटपुट थोड़ा परेशान करने वाला है, लेकिन कम-रिज़ॉल्यूशन वाले कैमरे को पकड़े हुए कांपते हुए हाथ से भी, घूर्णी अनुवाद को अच्छी तरह से संभालता है। क्या होता है जब किसी वस्तु को फ्रेम से बाहर निकाला जाता है?
पहली पहचान पर वस्तु के लिए पूर्वानुमान रुक जाते हैं, और बॉक्स ट्रैकिंग स्पष्ट रूप से उठाती है कि वस्तु ने फ्रेम छोड़ दिया है, और जैसे ही वस्तु फिर से फ्रेम में प्रवेश करती है, भविष्यवाणी और ट्रैकिंग एक बार फिर से करता है। ऐसा प्रतीत होता है कि जब मॉडल देख सकता है तो ट्रैकिंग कुछ बेहतर काम करती है मग संभाल, क्योंकि जब हैंडल दिखाई नहीं देता है तो आउटपुट अधिक चिड़चिड़े होते हैं (संभवतः इसलिए कि मग के वास्तविक अभिविन्यास का सटीक रूप से पता लगाना कठिन है)।
इसके अतिरिक्त, कुछ कोण चुनौतीपूर्ण प्रकाश स्थितियों में दूसरों की तुलना में काफी अधिक स्थिर आउटपुट उत्पन्न करते हैं। विशेष रूप से मग के लिए, यह मग के होंठ को देखने में सक्षम होने में मदद करता है क्योंकि यह वस्तु के ऑर्थोगोनल प्रक्षेपण को देखने के बजाय परिप्रेक्ष्य में मदद करता है।
इसके अतिरिक्त, जब एक पारदर्शी मग पर परीक्षण किया गया, तो मॉडल को मग के रूप में यह पता लगाने में कठिनाई हुई। यह संभवतः एक का एक उदाहरण है वितरण से बाहर वस्तु, क्योंकि अधिकांश मग अपारदर्शी होते हैं और उनमें विभिन्न रंग होते हैं।
निष्कर्ष
3D ऑब्जेक्ट डिटेक्शन अभी भी कुछ हद तक युवा है, और MediaPipe's Objectron एक सक्षम प्रदर्शन है! प्रकाश की स्थिति के प्रति संवेदनशील होते हुए, वस्तु के प्रकार (पारदर्शी बनाम अपारदर्शी मग, आदि) और थोड़े झटकेदार - ऑब्जेक्ट्रॉन एक अच्छी झलक है कि जल्द ही पहले से कहीं अधिक सटीकता और पहुंच के साथ क्या करना संभव होगा।