फेस डिटेक्शन हे बहुतेक कॉम्प्युटर व्हिजन पाइपलाइन्सच्या प्रवेशद्वारावर असते. प्रत्येक व्हिडिओ कॉल, फोटो गॅलरी आणि सिक्युरिटी फीडमध्ये इतर काहीही करण्यापूर्वी मानवी चेहरे ओळखणे आवश्यक असते. तरीही, मॉडेलची निवड करताना सहसा एक कठीण तडजोड करावी लागते. जड नेटवर्क्स अचूकता देतात पण त्यासाठी महागड्या GPUs आणि रॅक-माउंटेड कूलिंगची गरज असते. लहान मॉडेल्स साध्या हार्डवेअरवर चालतात पण अनेकदा लहान चेहरे किंवा हाय-रिझोल्यूशन फीड्सवर अडखळतात. OpenCV Zoo मधील YuNet मॉडेल ही पद्धत बदलून टाकते. हे मॉडेल खरोखर रिअल प्रोजेक्ट्समध्ये वापरण्यायोग्य आहे की केवळ कागदावर चांगले दिसते, हे पाहण्यासाठी मी वेगवेगळ्या स्केलवर त्याचे बेंचमार्किंग केले.
YuNet कडे बारकाईने पाहण्याची गरज का आहे?
YuNet हे केवळ संशोधनासाठीचे कुतूहल नाही. ते OpenCV Zoo मध्ये आहे, जे OpenCV DNN मॉड्यूलसाठी ऑप्टिमाइझ केलेल्या प्री-ट्रेन्ड मॉडेल्सचा संग्रह आहे. मी तपासलेले विशिष्ट व्हेरिएंट INT8 क्वांटायझेशन वापरते, ज्याचा अर्थ असा की त्याचे वेट्स (weights) आणि ॲक्टिव्हेशन्स (activations) नेहमीच्या 32-बिट फ्लोटिंग-पॉइंट नंबरऐवजी 8-बिट इंटीजर्समध्ये कॉम्प्रेस होतात. ही केवळ एक तांत्रिक टीप नाही. INT8 मुळे मेमरी बँडविड्थ कमी होते, कॅशेवरील ताण कमी होतो आणि आधुनिक CPUs कोणत्याही कष्टाशिवाय इन्फरन्स (inference) करू शकतात. लॅपटॉप, एज डिव्हाइस किंवा समर्पित ग्राफिक्स कार्ड नसलेल्या सर्व्हरवर काम करणाऱ्यांसाठी, ही कार्यक्षमता एका स्मूथ पाइपलाइन आणि स्लो स्लाइडशोमधील फरक ठरवते.
याची आर्किटेक्चर स्वतःहून हलकी (lightweight) आहे. ते मोठ्या बॅकबोनचा भार टाळते आणि फक्त चेहरे शोधण्याच्या एकाच कार्यावर लक्ष केंद्रित करते. जेव्हा तुम्हाला डिटेक्शन एखाद्या मोठ्या ॲप्लिकेशनमध्ये समाविष्ट करायचे असते, जिथे CPU आणि बॅटरीचा वापर ट्रॅकिंग, रिकग्निशन किंवा व्हिडिओ एन्कोडिंगसाठी देखील करायचा असतो, तेव्हा ही शिस्त फायदेशीर ठरते.
सेटअप (The Setup)
सर्व चाचण्या Apple M4 Max चिप असलेल्या Mac Studio वर केल्या गेल्या. मॉडेल फाईल OpenCV Zoo रिपॉझिटरीमधील YuNet INT8 क्वांटाइज्ड ONNX बिल्ड होती. मी प्रथम 1280x720 इमेजवर इन्फरन्सचा वेग मोजला, त्यानंतर स्केलमुळे निकालांवर काय परिणाम होतो हे समजून घेण्यासाठी चार वेगवेगळ्या इनपुट रिझोल्यूशनवर डिटेक्शन काउंटची तुलना केली.
जर तुम्हाला तुमच्या स्वतःच्या मशीनवर हे आकडे तपासायचे असतील, तर ही प्रक्रिया पूर्णपणे पुन्हा करता येण्यासारखी (reproducible) आहे. स्पार्स रिपॉझिटरी मिळवण्यासाठी आणि बेंचमार्क चालवण्यासाठी खालील कमांड्स वापरा:
git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run
स्पार्स चेकआउटमुळे डाउनलोड लहान राहते आणि mise टास्क रनर पडद्यामागे डिपेंडेंसीज हाताळतो. तुम्हाला पायथन एन्व्हायरनमेंट किंवा मॅन्युअल पॅकेज इन्स्टॉलेशनशी झगडण्याची गरज नाही.
सुसंगत वेग (Speed That Stays Consistent)
1280x720 इमेजवर, INT8 YuNet मॉडेलचा सरासरी इन्फरन्स वेळ प्रति इन्फरन्स 9.21 मिलीसेकंद होता. सर्वात वेगवान पास 8.03 ms होता, तर सर्वात संथ 10.47 ms होता. हा एक अत्यंत मर्यादित फरक आहे. सर्वोत्तम आणि सर्वात खराब वेळेत दोन आणि अडीच मिलीसेकंदपेक्षाही कमी फरक आहे.
व्यवहारात, ही सुसंगतता (consistency) केवळ बढाई मारण्यापेक्षा जास्त महत्त्वाची आहे. रिअल-टाइम ॲप्लिकेशन्सना केवळ कमी सरासरी लॅटन्सी (latency) नको असते; त्यांना प्रेडिक्टेबल लॅटन्सी लागते. एखादे मॉडेल जे कधीकधी 50 ms घेते, ते वेबकॅम फीडमध्ये दृश्यमान अडथळा (stutter) निर्माण करते. YuNet स्थिर राहते. पुढचा फ्रेम येण्यापूर्वी हा फ्रेम पूर्ण होईल यावर तुम्ही विश्वास ठेवू शकता, ज्यामुळे तुमच्या पाइपलाइनचे शेड्युलिंग करणे खूप सोपे होते.
स्केल व्हेरिएन्स खऱ्या गोष्टीवर प्रकाश टाकतो
जर मॉडेलने सीनमधील अर्धे चेहरे चुकवले, तर केवळ वेगाचा काहीही अर्थ उरत नाही. हे तपासण्यासाठी, मी YuNet मध्ये चार वेगवेगळ्या रिझोल्यूशनवर तीच मूळ इमेज फीड केली. आकडेवारी एक स्पष्ट गोष्ट सांगते:
- 320 x 180: 6 चेहरे आढळले
- 640 x 360: 26 चेहरे आढळले
- 1280 x 720: 38 चेहरे आढळले
- 2560 x 1440: 52 चेहरे आढळले
हा फरक खूप मोठा आहे. 320 x 180 वर, फक्त सर्वात मोठे आणि जवळचे चेहरे ओळखले जातात. 640 x 360 वर गेल्यावर, ही संख्या चौपट होते. पूर्ण 1440p वर, YuNet ला सर्वात कमी रिझोल्यूशनच्या तुलनेत आठ पटीहून अधिक चेहरे सापडतात.
हे घडते कारण डाउनसॅम्पलिंगमुळे तपशील (details) कल्पनेपेक्षा वेगाने नष्ट होतात. 1440p फ्रेममधील मध्यम आकाराचा चेहरा 360p वर केवळ पाच बाय पाच पिक्सेलच्या डागासारखा लहान होऊ शकतो. एकदा का चेहऱ्याचे वैशिष्ट्य मॉडेलच्या रिसेप्टिव्ह फील्डच्या (receptive field) खाली आले की, ते अदृश्य नॉईज बनतात. डोळे भुवयांमध्ये मिसळतात. नाक गायब होते. YuNet कडे पकडण्यासाठी काहीच उरत नाही.
याचा व्यावहारिक निष्कर्ष लक्षात ठेवण्यासारखा आहे. जर तुमचा कॅमेरा क्लासरूम, कॉन्फरन्स रूम किंवा रस्त्याच्या कोपऱ्याचा वाईड-अँगल व्ह्यू घेत असेल, तर जोपर्यंत तुम्ही मॉडेलला पुरेसे पिक्सेल्स देत नाही, तोपर्यंत दूरचे चेहरे दिसणार नाहीत. येथे रिझोल्यूशन म्हणजे केवळ इमेज क्वालिटी नाही, तर ते 'रिकॉल' (recall) वाढवण्यासाठी थेट वापरता येणारे साधन आहे.
तुम्हाला खरोखर आवश्यक असलेली रिसाईज स्ट्रॅटेजी (The Resize Strategy You Actually Need)
YuNet इतके वेगवान आहे की सवयीने तुम्हाला तुमचे इनपुट ३२० x २४० पर्यंत कमी करण्याची गरज नाही. M4 Max वर, समर्पित GPU शिवाय देखील २५६० x १४४० रिझोल्यूशनवर ते चालते. यामुळे तुम्हाला तुमची पाइपलाइन कशी तयार करावी (architect) याचे स्वरूप बदलते.
प्रत्येक फ्रेम एका लहान ठराविक आकारात बसवण्याऐवजी, तुम्हाला काय शोधायचे आहे त्यानुसार तुमचे इनपुट रिझोल्यूशन निवडा. जर तुम्हाला फक्त कॅमेऱ्यासमोर असलेल्या व्यक्तीमध्ये रस असेल, तर 720p किंवा 640p देखील पुरेसे आहे. जर तुम्हाला मोठ्या हॉलमधील प्रत्येक सहभागीची नोंद करायची असेल, तर मॉडेलला उच्च-रिझोल्यूशन क्रॉप किंवा पूर्ण नेटिव्ह फ्रेम द्या. YuNet हलके (lightweight) असल्यामुळे, तुमच्याकडे हा निर्णय घेण्याचे स्वातंत्र्य आहे. २०० ms चा लॅग (lag) टाळण्यासाठी तुम्ही एकाच प्रीसेटमध्ये अडकून पडत नाही.
एक अडचण मात्र कायम आहे. मॉडेल अजूनही इनपुट टेन्सरच्या तुलनेत चेहऱ्याच्या आकारावर अवलंबून असते. येथे कोणतीही जादूची 'स्केल इनव्हेरियन्स' (scale invariance) नाही. जोपर्यंत लहान चेहरे पुरेसे पिक्सेल व्यापत नाहीत, तोपर्यंत ते दिसत नाहीत. याचे उपाय तांत्रिक आहेत: दूर असलेल्या विषयांना शोधताना, इन्फरन्स (inference) करण्यापूर्वी तुमच्या मूळ प्रतिमेचा आकार वाढवा आणि त्यानंतर मिळालेल्या बाउंडिंग बॉक्सेसना (bounding boxes) मूळ कोऑर्डिनेट्सवर मॅप करा. YuNet तुम्हाला हे पाऊल उचलण्यासाठी आवश्यक असलेला वेगाचा फायदा (speed budget) देते.
तुमच्या स्टॅक मध्ये हे कुठे बसते
YuNet हे चेहऱ्याशी संबंधित प्रत्येक संभाव्य कामासाठी उपाय नाही. चेहऱ्यावर आलेले मोठे अडथळे (heavy occlusion), अत्यंत तिरपे कोन (extreme profile angles), किंवा 3D मेश एक्स्ट्रॅक्शन (3D mesh extraction) हे त्याच्या कार्यक्षेत्राबाहेर आहेत. परंतु फोटो आणि व्हिडिओ स्ट्रीममध्ये चेहरे शोधण्याच्या मूलभूत कामासाठी, ते अत्यंत प्रभावी आहे. रिअल-टाइम वेबकॅम ॲप्स, ऑटोमेटेड फोटो कलिंग टूल्स आणि साधे एम्बेडेड सिस्टम्स या सर्वांना स्टँडर्ड CPU वर वेगाने चालणाऱ्या डिटेक्टरचा फायदा होतो.
INT8 ONNX फॉरमॅटमुळे डिप्लॉयमेंट देखील सोपे होते. तुम्हाला टार्गेट डिव्हाइसवर PyTorch किंवा TensorFlow इंस्टॉल करण्याची गरज नाही. OpenCV चा DNN मॉड्यूल थेट मॉडेल लोड करतो, ज्यामुळे तुमची बायनरी लहान राहते आणि तुमची डिपेंडन्सी ट्री (dependency tree) कमी होते.
थोडक्यात सांगायचे तर
YuNet हे सिद्ध करते की फेस डिटेक्शनसाठी औद्योगिक हार्डवेअर किंवा जड (bloated) फ्रेमवर्कची आवश्यकता नाही. आकडेवारी स्पष्ट बोलते: 720p फ्रेमसाठी दहा मिलीसेकंदपेक्षा कमी वेळ, आणि रिझोल्यूशन वाढल्यास डिटेक्शनच्या संख्येत थेट आणि अंदाजित वाढ. तुम्हाला मध्यम रिझोल्यूशनवर कमाल वेग हवा आहे की उच्च स्केलवर व्यापक कव्हरेज हवे आहे, हे निवडण्याचे स्वातंत्र्य तुम्हाला मिळते आणि त्या निवडीसाठी मॉडेल तुम्हाला दंडित करणार नाही.
जर तुम्ही वास्तविक जगातील प्रतिमांशी संबंधित काहीही तयार करत असाल, तर वरील पुनरुत्पादन पायऱ्या (reproduction steps) तुमच्या स्वतःच्या हार्डवेअरवर चालवून पहा. तुमच्या फुटेजवर त्याची चाचणी घ्या. त्यानंतर तुम्हाला प्रत्यक्षात शोधायच्या चेहऱ्यांशी जुळवण्यासाठी तुमच्या रिसाईज लॉजिकमध्ये बदल करा. वेग तेव्हाच उपयुक्त असतो जेव्हा तुम्ही तो योग्य दिशेने वापरू शकता. YuNet तुम्हाला वेग आणि नियंत्रण दोन्ही देते.
