فیس ڈیٹیکشن زیادہ تر کمپیوٹر ویژن پائپ لائنز کے داخلی دروازے پر واقع ہوتی ہے۔ ہر ویڈیو کال، فوٹو گیلری، اور سیکیورٹی فیڈ کسی بھی دوسری چیز سے پہلے انسانی چہروں کی شناخت پر منحصر ہوتی ہے۔ پھر بھی، ماڈل کا انتخاب عام طور پر ایک ناخوشگوار سمجھوتہ کرنے پر مجبور کرتا ہے۔ بھاری نیٹ ورکس درستگی تو فراہم کرتے ہیں لیکن مہنگے GPUs اور ریک ماؤنٹڈ کولنگ کا تقاضا کرتے ہیں۔ چھوٹے ماڈلز معمولی ہارڈ ویئر پر چلتے ہیں لیکن اکثر چھوٹے چہروں یا ہائی ریزولوشن فیڈز پر ناکام ہو جاتے ہیں۔ OpenCV Zoo کا YuNet ماڈل اس پیٹرن کو توڑتا ہے۔ میں نے یہ دیکھنے کے لیے مختلف اسکیلز پر اس کی بینچ مارکنگ کی کہ آیا یہ حقیقی پروجیکٹس میں جگہ بنانے کے قابل ہے یا صرف کاغذ پر ہی اچھا لگتا ہے۔

YuNet کو قریب سے دیکھنے کی ضرورت کیوں ہے

YuNet محض ایک تحقیقی تجسس نہیں ہے۔ یہ OpenCV Zoo کے اندر موجود ہے، جو کہ OpenCV DNN ماڈیول کے لیے آپٹیمائزڈ پری ٹرینڈ ماڈلز کا ایک مجموعہ ہے۔ میں نے جس مخصوص ورژن کی جانچ کی ہے وہ INT8 quantization استعمال کرتا ہے، جس کا مطلب ہے کہ اس کے ویٹس (weights) اور ایکٹیویشنز عام 32-bit فلوٹنگ پوائنٹ نمبروں کے بجائے 8-bit انٹیجرز میں کمپریس ہو جاتے ہیں۔ یہ کوئی معمولی تکنیکی بات نہیں ہے۔ INT8 میموری بینڈوتھ کو کم کرتا ہے، کیش پریشر (cache pressure) کو کم کرتا ہے، اور جدید CPUs کو بغیر کسی مشکل کے انفرنس (inference) کرنے کی اجازت دیتا ہے۔ کسی بھی ایسے شخص کے لیے جو لیپ ٹاپ، ایج ڈیوائس، یا بغیر کسی مخصوص گرافکس کارڈ کے سرور پر کام کر رہا ہے، یہ کارکردگی ایک ہموار پائپ لائن اور ایک سلائیڈ شو کے درمیان فرق پیدا کرتی ہے۔

اس کا آرکیٹیکچر بذات خود ڈیزائن کے لحاظ سے ہلکا پھلکا (lightweight) ہے۔ یہ بڑے بیک بونز (backbones) کے بوجھ سے بچتا ہے اور صرف چہروں کی نشاندہی کے کام پر توجہ مرکوز کرتا ہے۔ یہ نظم و ضبط اس وقت کام آتا ہے جب آپ کو ڈیٹیکشن کو کسی بڑے ایپلی کیشن میں شامل کرنا ہو جہاں CPU اور بیٹری کا بجٹ ٹریکنگ، ریکگنیشن، یا ویڈیو انکوڈنگ کے ساتھ شیئر کیا جاتا ہے۔

The Setup

تمام ٹیسٹ Apple M4 Max چپ والے Mac Studio پر کیے گئے۔ ماڈل فائل OpenCV Zoo ریپوزٹری سے YuNet INT8 quantized 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 ٹاسک رنر پس منظر میں ڈیپینڈنسیز کو سنبھالتا ہے۔ آپ کو Python انوائرمنٹ یا دستی طور پر پیکجز انسٹال کرنے کی ضرورت نہیں ہے۔

Speed That Stays Consistent

1280x720 امیج پر، INT8 YuNet ماڈل کی اوسط انفرنس 9.21 ملی سیکنڈ فی انفرنس رہی۔ سب سے تیز رفتار 8.03 ms رہی، جبکہ سب سے سست 10.47 ms تک گئی۔ یہ ایک حیرت انگیز طور پر محدود حد ہے۔ بہترین اور بدترین وقت کے درمیان دو اور اڑھ ملی سیکنڈ سے بھی کم کا فرق ہے۔

عملی طور پر، یہ مستقل مزاجی دکھاوے سے زیادہ اہم ہے۔ ریئل ٹائم ایپلی کیشنز کو صرف کم اوسط لیٹنسی (latency) کی ضرورت نہیں ہوتی؛ انہیں قابلِ پیشن گوئی لیٹنسی کی ضرورت ہوتی ہے۔ ایک ماڈل جو کبھی کبھی 50 ms لیتا ہے، ویب کیم فیڈ میں واضح جھٹکے (stutter) پیدا کرتا ہے۔ YuNet مستحکم رہتا ہے۔ آپ اس پر بھروسہ کر سکتے ہیں کہ یہ اگلا فریم آنے سے پہلے موجودہ فریم مکمل کر لے گا، جس سے آپ کے پائپ لائن کی باقی شیڈولنگ بہت آسان ہو جاتی ہے۔

Scale Variance Reveals the Real Story

اگر ماڈل منظر میں آدھے چہروں کو چھوڑ دے تو محض رفتار کا کوئی فائدہ نہیں۔ اس کی جانچ کے لیے، میں نے ایک ہی امیج کو چار مختلف ریزولوشنز پر 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 اتنے چہرے ڈھونڈ لیتا ہے جو سب سے کم ریزولوشن کے مقابلے میں آٹھ گنا سے بھی زیادہ ہیں۔

ایسا اس لیے ہوتا ہے کیونکہ ڈاؤن سیمپلنگ (downsampling) تفصیلات کو اس سے کہیں زیادہ تیزی سے ختم کر دیتی ہے جتنا کہ ہم سوچتے ہیں۔ ایک چہرہ جو 1440p فریم میں ایک مناسب حصے پر مشتمل ہو، وہ 360p پر صرف پانچ بائی پانچ پکسلز کے دھبے میں تبدیل ہو سکتا ہے۔ ایک بار جب چہرے کے خدوخال ماڈل کے receptive field سے نیچے گر جاتے ہیں، تو وہ نظر نہ آنے والے شور (noise) بن جاتے ہیں۔ آنکھیں بھنوؤں میں ضم ہو جاتی ہیں۔ ناک غائب ہو جاتی ہے۔ YuNet کے پاس پکڑنے کے لیے کچھ نہیں بچتا۔

اس کا عملی نتیجہ یاد رکھنا ضروری ہے۔ اگر آپ کا کیمرہ کلاس روم، کانفرنس روم، یا گلی کے کونے کا وائیڈ اینگل ویو لے رہا ہے، تو دور کے چہرے تب تک ظاہر نہیں ہوں گے جب تک آپ ماڈل کو کافی پکسلز فراہم نہ کریں۔ یہاں ریزولوشن کا مطلب صرف امیج کوالٹی نہیں ہے۔ یہ براہ راست recall پر اثر انداز ہوتا ہے۔

The Resize Strategy You Actually Need

YuNet اتنا تیز ہے کہ آپ کو عادت کے طور پر اپنے ان پٹ کو 320 x 240 تک محدود کرنے کی ضرورت نہیں ہے۔ M4 Max پر، 2560 x 1440 بھی بغیر کسی مخصوص GPU کے چل جاتا ہے۔ یہ اس بات کو بدل دیتا ہے کہ آپ کو اپنی پائپ لائن کو کس طرح ڈیزائن کرنا چاہیے۔

ہر فریم کو ایک چھوٹے سے مقررہ سائز پر مجبور کرنے کے بجائے، اپنی ان پٹ ریزولوشن کا انتخاب اس بنیاد پر کریں کہ آپ کیا تلاش کرنے کی کوشش کر رہے ہیں۔ اگر آپ کو صرف کیمرے کے بالکل سامنے موجود شخص سے مطلب ہے، تو 720p یا 640p بھی کافی ہے۔ اگر آپ کو ایک بڑے ہال میں موجود ہر شریک ہونے والے کا ریکارڈ رکھنا ہے، تو ماڈل کو زیادہ ریزولوشن والا کراپ (crop) یا مکمل نیٹیو فریم فراہم کریں۔ چونکہ YuNet ہلکا پھلکا (lightweight) ہے، اس لیے آپ کے پاس یہ انتخاب کرنے کی گنجائش موجود ہے۔ آپ 200 ms کے لیگ (lag) سے بچنے کے لیے کسی ایک پہلے سے طے شدہ سیٹنگ (preset) تک محدود نہیں ہیں۔

ایک احتیاطی تدبیر باقی رہتی ہے۔ ماڈل اب بھی ان پٹ ٹینسر (input tensor) کے مقابلے میں چہرے کے سائز پر منحصر ہے۔ یہاں کوئی جادوئی اسکیل انوئیریئنس (scale invariance) نہیں ہے۔ چھوٹے چہرے تب تک نظر نہیں آتے جب تک وہ کافی پکسلز پر محیط نہ ہوں۔ اس کا حل تکنیکی ہے: دور موجود موضوعات کی تلاش کے دوران انفرنس (inference) سے پہلے اپنی اصل تصویر کا سائز بڑھا دیں، پھر حاصل ہونے والے باؤنڈنگ باکسز (bounding boxes) کو اصل کوآرڈینیٹس (coordinates) پر واپس میپ کریں۔ YuNet آپ کو اس مرحلے کے لیے رفتار کی گنجائش فراہم کرتا ہے۔

یہ آپ کے اسٹیک (Stack) میں کہاں فٹ بیٹھتا ہے

YuNet چہرے سے متعلق ہر ممکن کام کا حل نہیں ہے۔ شدید رکاوٹ (occlusion)، انتہائی پروفائل زاویے، یا 3D میش ایکسٹریکشن (mesh extraction) اس کے دائرہ کار سے باہر ہیں۔ لیکن تصاویر اور ویڈیو اسٹریمز میں چہروں کی نشاندہی کے بنیادی کام کے لیے، یہ ایک بہترین مقام (sweet spot) پر ہے۔ ریئل ٹائم ویب کیم ایپس، خودکار فوٹو کلنگ ٹولز، اور معمولی ایمبیڈڈ سسٹمز، وہ تمام چیزیں ایک ایسے ڈیٹیکٹر سے فائدہ اٹھاتی ہیں جو اسٹینڈرڈ CPUs پر تیزی سے چلتا ہے۔

INT8 ONNX فارمیٹ ڈیپلائمنٹ کو بھی آسان بناتا ہے۔ آپ کو ٹارگٹ ڈیوائس پر PyTorch یا TensorFlow انسٹال کرنے کی ضرورت نہیں ہے۔ OpenCV کا DNN ماڈیول ماڈل کو براہ راست لوڈ کرتا ہے، جو آپ کی بائنری کو چھوٹا اور آپ کے ڈیپینڈنسی ٹری (dependency tree) کو سادہ رکھتا ہے۔

خلاصہ

YuNet ثابت کرتا ہے کہ چہرے کی شناخت کے لیے صنعتی ہارڈ ویئر یا بھاری بھرکم فریم ورکس کی ضرورت نہیں ہے۔ اعداد و شمار صاف بتاتے ہیں: 720p فریم کے لیے دس ملی سیکنڈ سے بھی کم وقت، اور جیسے جیسے ریزولوشن بڑھتا ہے، ڈیٹیکشن کی تعداد میں براہ راست اور قابل پیش گوئی اضافہ ہوتا ہے۔ آپ یہ انتخاب کر سکتے ہیں کہ آپ درمیانی ریزولوشن پر زیادہ سے زیادہ رفتار چاہتے ہیں یا زیادہ اسکیل پر وسیع تر کوریج، اور ماڈل اس انتخاب پر آپ کو نقصان نہیں پہنچائے گا۔

اگر آپ ایسی کوئی چیز بنا رہے ہیں جو حقیقی دنیا کی تصاویر سے متعلق ہے، تو اوپر دیے گئے طریقہ کار کو اپنے ہارڈ ویئر پر چلا کر دیکھیں۔ اسے اپنی فوٹیج کے ساتھ ٹیسٹ کریں۔ پھر اپنے ریزائز لاجک (resize logic) کو ان چہروں کے مطابق ٹیون کریں جنہیں آپ کو اصل میں تلاش کرنے کی ضرورت ہے۔ رفتار صرف اسی وقت مفید ہے جب آپ اسے صحیح سمت میں استعمال کر سکیں۔ YuNet آپ کو رفتار اور کنٹرول دونوں فراہم کرتا ہے۔