ফেস ডিটেকশন বা মুখমণ্ডল শনাক্তকরণ বেশিরভাগ কম্পিউটার ভিশন পাইপলাইনের প্রবেশদ্বারে অবস্থান করে। প্রতিটি ভিডিও কল, ফটো গ্যালারি এবং সিকিউরিটি ফিড অন্য কিছু করার আগে মানুষের মুখ শনাক্ত করার ওপর নির্ভর করে। তবুও মডেল নির্বাচনের ক্ষেত্রে সাধারণত একটি অপ্রীতিকর আপস করতে হয়। ভারী নেটওয়ার্কগুলো নির্ভুলতা প্রদান করে কিন্তু দামি GPU এবং র্যাক-মাউন্টেড কুলিংয়ের প্রয়োজন হয়। ছোট মডেলগুলো সাধারণ হার্ডওয়্যারে চলে কিন্তু প্রায়শই ছোট মুখ বা উচ্চ-রেজোলিউশনের ফিডের ক্ষেত্রে হিমশিম খায়। OpenCV Zoo-এর YuNet মডেলটি এই ধারাটি ভেঙে দেয়। এটি বাস্তব প্রজেক্টে জায়গা পাওয়ার যোগ্য কি না, নাকি কেবল কাগজে-কলমে ভালো দেখায়, তা দেখার জন্য আমি বিভিন্ন স্কেলে এর বেঞ্চমার্কিংয়ে সময় কাটিয়েছি।
Why YuNet Deserves a Closer Look
YuNet কেবল কোনো গবেষণার কৌতূহল নয়। এটি OpenCV Zoo-এর অন্তর্ভুক্ত, যা OpenCV DNN মডিউলের জন্য অপ্টিমাইজ করা প্রি-ট্রেইনড মডেলের একটি সংগ্রহ। আমি যে নির্দিষ্ট ভেরিয়েন্টটি পরীক্ষা করেছি তাতে INT8 quantization ব্যবহার করা হয়েছে, যার অর্থ হলো এর weights এবং activations সাধারণ ৩২-বিট ফ্লোটিং-পয়েন্ট নম্বরের পরিবর্তে ৮-বিট ইন্টিজারে সংকুচিত হয়। এটি কোনো সামান্য প্রযুক্তিগত বিষয় নয়। INT8 মেমরি ব্যান্ডউইথ কমায়, ক্যাশ প্রেশার হ্রাস করে এবং আধুনিক CPU-গুলোকে কোনো রকম বেগতিক অবস্থা ছাড়াই দ্রুত ইনফারেন্স (inference) সম্পন্ন করতে সাহায্য করে। ল্যাপটপ, এজ ডিভাইস (edge device), বা ডেডিকেটেড গ্রাফিক্স কার্ডহীন কোনো সার্ভারে কাজ করার ক্ষেত্রে, এই দক্ষতা একটি মসৃণ পাইপলাইন এবং একটি স্লো-মোশন স্লাইডশোর মধ্যে পার্থক্য গড়ে দেয়।
এর আর্কিটেকচারটি ডিজাইনের দিক থেকেই লাইটওয়েট। এটি বিশাল ব্যাকবোনগুলোর বোঝা এড়িয়ে শুধুমাত্র মুখমণ্ডল শনাক্ত করার একক কাজে মনোনিবেশ করে। যখন আপনাকে একটি বড় অ্যাপ্লিকেশনে ডিটেকশন ইন্টিগ্রেট করতে হয় যেখানে CPU এবং ব্যাটারি বাজেট ট্র্যাকিং, রিকগনিশন বা ভিডিও এনকোডিংয়ের সাথে ভাগ করে নিতে হয়, তখন এই সুশৃঙ্খলতা কাজে দেয়।
The Setup
সমস্ত পরীক্ষা একটি Apple M4 Max চিপযুক্ত Mac Studio-তে চালানো হয়েছে। মডেল ফাইলটি ছিল OpenCV Zoo রিপোজিটরি থেকে প্রাপ্ত YuNet INT8 quantized ONNX বিল্ড। আমি প্রথমে একটি 1280x720 ইমেজের ওপর ইনফারেন্স স্পিড পরিমাপ করেছি, তারপর স্কেল কীভাবে ফলাফলের ওপর প্রভাব ফেলে তা বোঝার জন্য চারটি ভিন্ন ইনপুট রেজোলিউশনে ডিটেকশন কাউন্ট তুলনা করেছি।
আপনি যদি আপনার নিজের মেশিনে এই সংখ্যাগুলো যাচাই করতে চান, তবে প্রক্রিয়াটি সম্পূর্ণ অনুসরণযোগ্য। স্পার্স রিপোজিটরি (sparse repository) নামাতে এবং বেঞ্চমার্কটি চালাতে নিচের কমান্ডগুলো চালান:
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 মডেলটি প্রতি ইনফারেন্সে গড়ে ৯.২১ মিলিসেকেন্ড সময় নিয়েছে। দ্রুততম সময় ছিল ৮.০৩ ms, যেখানে ধীরতম সময় ছিল ১০.৪৭ ms। এটি একটি উল্লেখযোগ্যভাবে ছোট ব্যবধান। সেরা এবং সবচেয়ে খারাপ সময়ের মধ্যে পার্থক্য মাত্র আড়াই মিলিসেকেন্ডের কম।
বাস্তবে, এই ধারাবাহিকতা বড় বড় দাবি করার চেয়ে বেশি গুরুত্বপূর্ণ। রিয়েল-টাইম অ্যাপ্লিকেশনগুলোর কেবল কম গড় ল্যাটেন্সি (latency) প্রয়োজন নয়; তাদের প্রয়োজন প্রেডিক্টেবল বা অনুমানযোগ্য ল্যাটেন্সি। একটি মডেল যা মাঝে মাঝে ৫০ ms সময় নেয়, তা ওয়েবক্যাম ফিডে দৃশ্যমান ল্যাগ বা স্টাটার তৈরি করে। YuNet স্থিতিশীল থাকে। আপনি পরবর্তী ফ্রেম আসার আগেই এটি একটি ফ্রেম শেষ করবে বলে ভরসা করতে পারেন, যা আপনার পাইপলাইনের বাকি অংশ শিডিউল করা অনেক সহজ করে তোলে।
Scale Variance Reveals the Real Story
যদি মডেলটি একটি দৃশ্যের অর্ধেক মুখমণ্ডল মিস করে, তবে শুধু গতির কোনো মানে হয় না। এটি পরীক্ষা করার জন্য, আমি চারটি ভিন্ন রেজোলিউশনে একই সোর্স ইমেজ YuNet-এর মাধ্যমে চালিয়েছি। প্রাপ্ত সংখ্যাগুলো একটি পরিষ্কার চিত্র তুলে ধরে:
- 320 x 180: ৬টি মুখ শনাক্ত হয়েছে
- 640 x 360: ২৬টি মুখ শনাক্ত হয়েছে
- 1280 x 720: ৩৮টি মুখ শনাক্ত হয়েছে
- 2560 x 1440: ৫২টি মুখ শনাক্ত হয়েছে
এই লাফটি নাটকীয়। 320 x 180 রেজোলিউশনে কেবল সবচেয়ে বড় এবং কাছের মুখগুলো শনাক্ত হয়। রেজোলিউশন বাড়িয়ে 640 x 360 করলে শনাক্ত হওয়ার সংখ্যা চারগুণ বেড়ে যায়। পূর্ণ 1440p-তে, YuNet সর্বনিম্ন রেজোলিউশনের তুলনায় আট গুণেরও বেশি মুখ খুঁজে পায়।
এটি ঘটে কারণ ডাউনস্যাম্পলিং (downsampling) আমাদের ধারণার চেয়েও দ্রুত ডিটেইল বা সূক্ষ্মতা নষ্ট করে দেয়। একটি 1440p ফ্রেমের মাঝারি আকারের মুখ 360p-তে মাত্র পাঁচ বাই পাঁচ পিক্সেলের একটি অস্পষ্ট দাগে পরিণত হতে পারে। একবার মুখের বৈশিষ্ট্যগুলো মডেলের রিসেপ্টিভ ফিল্ডের (receptive field) নিচে নেমে গেলে, সেগুলো অদৃশ্য নয়েজে পরিণত হয়। চোখ ভ্রুর সাথে মিশে যায়। নাক অদৃশ্য হয়ে যায়। YuNet-এর ধরার মতো কিছুই থাকে না।
এর ব্যবহারিক ফলাফলটি মনে রাখা জরুরি। আপনার ক্যামেরা যদি ক্লাসরুম, কনফারেন্স রুম বা রাস্তার কোনো মোড়ের ওয়াইড-অ্যাঙ্গেল ভিউ ক্যাপচার করে, তবে মডেলটিকে পর্যাপ্ত পিক্সেল না দিলে দূরের মুখগুলো দেখা যাবে না। এখানে রেজোলিউশন কেবল ছবির গুণমান নয়; এটি রিকল (recall)-এর ওপর একটি সরাসরি প্রভাব বিস্তারকারী মাধ্যম।
The Resize Strategy You Actually Need
YuNet এতটাই দ্রুত যে অভ্যাসবশত আপনার ইনপুটকে ৩২০ x ২৪০-এ নামিয়ে আনার প্রয়োজন নেই। M4 Max-এ, এমনকি ২৫৬০ x ১৪৪০ রেজোলিউশনও কোনো ডেডিকেটেড GPU ছাড়াই চলতে পারে। এটি আপনার পাইপলাইন আর্কিটেকচার করার পদ্ধতি বদলে দেয়।
প্রতিটি ফ্রেমকে একটি ছোট নির্দিষ্ট সাইজে বাধ্য করার পরিবর্তে, আপনি কী খুঁজছেন তার ওপর ভিত্তি করে ইনপুট রেজোলিউশন বেছে নিন। আপনি যদি কেবল ক্যামেরার ঠিক সামনে থাকা ব্যক্তির বিষয়ে আগ্রহী হন, তবে 720p বা এমনকি 640p-ই যথেষ্ট। যদি একটি বড় হলে উপস্থিত প্রতিটি ব্যক্তিকে তালিকাভুক্ত করার প্রয়োজন হয়, তবে মডেলটিকে একটি উচ্চ-রেজোলিউশনের ক্রপ বা সম্পূর্ণ নেটিভ ফ্রেম প্রদান করুন। যেহেতু YuNet ওজনে হালকা (lightweight), তাই এই সিদ্ধান্ত নেওয়ার মতো যথেষ্ট সুযোগ আপনার রয়েছে। ২০০ মিলি-সেকেন্ডের ল্যাগ এড়ানোর জন্য আপনি কোনো একটি নির্দিষ্ট প্রিসেটের মধ্যে আটকে থাকবেন না।
একটি সতর্কতা বা সীমাবদ্ধতা রয়ে গেছে। মডেলটি এখনও ইনপুট টেন্সরের সাপেক্ষে মুখের আকারের ওপর নির্ভর করে। এখানে কোনো জাদুকরী স্কেল ইনভ্যারিয়েন্স (scale invariance) নেই। ছোট মুখগুলো ততক্ষণ অদৃশ্যই থেকে যাবে যতক্ষণ না সেগুলো পর্যাপ্ত পিক্সেল দখল করছে। এর সমাধানটি যান্ত্রিক: দূরের বিষয়বস্তু খোঁজার সময় ইনফারেন্সের (inference) আগে আপনার সোর্স ইমেজটিকে বড় করে নিন (resize upward), তারপর প্রাপ্ত বাউন্ডিং বক্সগুলোকে মূল স্থানাঙ্কে (original coordinates) ম্যাপ করুন। YuNet আপনাকে সেই ধাপটি সম্পন্ন করার মতো পর্যাপ্ত স্পিড বা গতি প্রদান করে।
আপনার স্ট্যাকে এটি কোথায় মানানসই
YuNet প্রতিটি সম্ভাব্য ফেস টাস্কের সমাধান নয়। ভারী অবক্লুশন (occlusion), চরম প্রোফাইল অ্যাঙ্গেল বা 3D মেশ এক্সট্রাকশন এর আওতার বাইরে। কিন্তু ছবি এবং ভিডিও স্ট্রিমে মুখ শনাক্ত করার মতো মৌলিক কাজের জন্য এটি একটি আদর্শ জায়গা দখল করে আছে। রিয়েল-টাইম ওয়েবক্যাম অ্যাপ, স্বয়ংক্রিয় ফটো কলিং টুল এবং সাধারণ এমবেডেড সিস্টেম—সবই এমন একটি ডিটেক্টর থেকে উপকৃত হয় যা স্ট্যান্ডার্ড CPU-তে দ্রুত চলে।
INT8 ONNX ফরম্যাটটি ডেপ্লয়মেন্টকেও সহজ করে তোলে। টার্গেট ডিভাইসে আপনার PyTorch বা TensorFlow ইনস্টল করার প্রয়োজন নেই। OpenCV-এর DNN মডিউল সরাসরি মডেলটি লোড করে, যা আপনার বাইনারিকে ছোট এবং ডিপেন্ডেন্সি ট্রি-কে হালকা রাখে।
মূল কথা
YuNet প্রমাণ করে যে ফেস ডিটেকশনের জন্য কোনো ইন্ডাস্ট্রিয়াল হার্ডওয়্যার বা ভারী ফ্রেমওয়ার্কের প্রয়োজন নেই। সংখ্যাগুলো স্পষ্টভাবে বলছে: একটি 720p ফ্রেমের জন্য দশ মিলিসেকেন্ডের কম সময় লাগে, এবং রেজোলিউশন বাড়ার সাথে সাথে ডিটেকশন সংখ্যা সরাসরি এবং অনুমানযোগ্যভাবে বৃদ্ধি পায়। আপনি মাঝারি রেজোলিউশনে সর্বোচ্চ গতি নাকি উচ্চ স্কেলে ব্যাপক কভারেজ চান তা বেছে নিতে পারেন, এবং মডেলটি আপনার সেই সিদ্ধান্তের জন্য কোনো নেতিবাচক প্রভাব ফেলবে না।
আপনি যদি বাস্তব জগতের ইমেজিং সংক্রান্ত কিছু তৈরি করেন, তবে উপরের ধাপগুলো আপনার নিজস্ব হার্ডওয়্যারে চালিয়ে দেখুন। আপনার ফুটেজের বিপরীতে এটি পরীক্ষা করুন। তারপর আপনার প্রয়োজনীয় মুখগুলোর সাথে সামঞ্জস্য রাখতে আপনার রিসাইজ লজিকটি টিউন করুন। গতি তখনই কার্যকর যখন আপনি এটিকে লক্ষ্য করতে পারেন। YuNet আপনাকে গতি এবং নিয়ন্ত্রণ—উভয়ই প্রদান করে।
