মূল ধারণা।
একটি detector-কে দুটি প্রশ্নের উত্তর দিতে হয়: বিড়াল আছে কি? আর ঠিক কোথায়? সবচেয়ে পুরনো
পদ্ধতিটি এই পাতায়। একটি বিড়ালের ছোট একটি ছবি নিন — template — আর edge detection পাতার
filter-এর মতোই সেটিকে ছবির ওপর দিয়ে সরান, একবারে এক অবস্থান। প্রতিটি অবস্থানে, নিচের window কতটা মেলে তার
একটি score দিন। যে window-এর score cut-off-এর ওপরে, সেটি একটি box হয়।
এখানে score হলো normalized correlation: window আর template দুটো থেকেই গড় উজ্জ্বলতা বাদ দিন, তারপর
মাপুন দুটি নকশা কতটা মেলে। এটি +1 (একই নকশা) থেকে 0 (সম্পর্কহীন) হয়ে −1 (ঠিক উল্টো) পর্যন্ত যায়, আর
window-টি সব মিলিয়ে বেশি উজ্জ্বল না অন্ধকার, তাতে এর কিছু যায় আসে না।
sweep যে সমস্যা রেখে যায়।
বিড়াল থেকে এক-দুই pixel সরে থাকা একটি window তখনও বিড়ালের বেশিরভাগ ঢেকে রাখে, তাই তার score প্রায় সমান উঁচু।
ফলে প্রতিটি বিড়াল প্রায় একই রকম box-এর একটি স্তূপে মোড়া থাকে। Non-max suppression একটি নিয়ম বারবার
চালিয়ে এটি পরিষ্কার করে: বাকিগুলোর মধ্যে সবচেয়ে বেশি score-এর box রাখুন, তারপর যে box এর সঙ্গে একটি নির্দিষ্ট
পরিমাণের বেশি মিলে যায় তা মুছে ফেলুন। মিলে যাওয়া মাপা হয় IoU দিয়ে — দুটি box-এর
সাধারণ অংশের ক্ষেত্রফল, ভাগ দুটি মিলে যতটা ঢাকে তার ক্ষেত্রফল। একই box-এর IoU 1; যে box দুটি ছোঁয় না
তাদের IoU 0।
আধুনিক detector কোথায় আলাদা।
YOLO, Faster R-CNN আর বাকিরা হাতে বানানো template-এর বদলে এমন একটি CNN ব্যবহার করে যা শিখেছে বিড়াল দেখতে
কেমন, আর একটি স্থির window-এর বদলে box-এর মাপ অনুমান করে। কিন্তু তারাও মিলে-যাওয়া box-এর একটি স্তূপ তৈরি
করে, আর বেশিরভাগই ঠিক এই NMS ধাপ দিয়ে তা পরিষ্কার করে।