আমাদের কথা খুঁজে নিন

   

মেশিনকে দেয়া একজোড়া ভাল চোখ - 5: ডিজিটালের উপর এ্যানালগ ফিটিঙ

যার ঘড়ি সে তৈয়ার করে, ঘড়ির ভিতর লুকাইছে

**(এই লেখাটা 'মেশিনকে দেয়া একজোড়া ভাল চোখ - 1 - 4' এর পরবর্তী অংশ; আজ একটা কঠিন বিষয় খুব সহজ করে লেখার নিয়ত নিয়ে নামছি; জানিনা বোঝানো যাবে কিনা!! ) //////////////////////////////////////////////// প্রথমে একটু ব্যায়াম করে নিই আসুন; কাগজকলম নিয়ে বসে ছোট বেলায় যে কাটাকুটি খেলতেন সেরকম করে পাশাপাশি 11 ঘর, উপরে নিচে 11 ঘরের একটা ছক এঁকে ফেলুন। এই ছকটাই আসলে একটা ইমেজের Structure; ইমেজটার সাইজ হলো 11 x 11; এখন, এই ছকটার সর্ববামের সবার উপরের ঘরটিতে একটা চিনহ দিন; এই ঘরটিকে এখন থেকে আমরা বলব ইমেজ/ছকের (1,1) নম্বর কম্পোনেন্ট; একঘর ডানে মুভ করুন; এই ঘরটিকে বলব (2,1) নম্বর কম্পোনেন্ট; এখন (2,1) নম্বর কম্পোনেন্ট ঘর থেকে একঘর নিচে নামুন; এটি তাহলে কত নম্বর কম্পোনেন্টের ঘর? (2,2) -- রাইট? এখন (6,6) নম্বর কম্পনেন্টের ঘরটি খুঁজে বের করুন। পেয়েছেন? একদম মাঝেরটা, তাইনা? (11,11) নম্বরটা? সর্বডানের সবচেয়ে নিচের ঘরটা, ঠিক? এতক্ষণ আমরা যা শিখলাম তাকে বলতে পারেন ম্যাট্রিক্স/ইমেজ ইন্ডেক্সিং; প্রোগ্রামিংয়ের জন্য মাস্ট একটা আইডিয়া। এখন আসুন মূল কথায় যাই, আগের পর্বে বলেছি: বাম আর ডান ক্যামেরায় দুটো ইমেজ নেয়া হলো; ধরা যাক তাদের সাইজ 32 x 32; এখন, ডান ও বাম ইমেজে যেহেতু একই বস্তুর (ধরুন মানুষের মুখ) ইমেজ আসবে কাজেই ইমেজ দুটো সদৃশ। কিন্তু, ইমেজদুটোর মাঝে 'ডিসপ্যারিটি' আছে, অর্থাৎ বাম ইমেজে মানুষটার মুখ যদি (2,3) নম্বর পিক্সেল থেকে শুরু হয়, তবে ডান ইমেজে তা কখনই (2,3) নম্বর পিক্সেল থেকে শুরু হবেনা; ডান ইমেজে তা, ধরুন, (10,4) নম্বর পিক্সেল থেকে শুরু হল।

এখন, আগের পর্বে বর্ণিত POC ফাংশান এই দুটি বাম ও ডান ইমেজের সাপেক্ষে হিসেব করলে, তাও 32 x 32 সাইজের একটা ম্যাট্রিক্স হবে; যেহেতু বাম ও ডান ইমেজের ডিসপ্যারিটি (10-2, 4-3)=(8,1), কাজেই 32 x 32 সাইজের POC ফাংশানের (8,1) নম্বর কম্পোনেন্ট বা উপাদানটার মান অন্যান্য কম্পোনেন্টের তুলনায় অনেক বেশী হবে; অর্থাৎ (8,1) লোকেশানে পীক দেখা যাবে। (মনে করার চেষ্টা করুন, POC খুব শার্প পীক দেখায়, এবং 'ডিসপ্যারিটির' লোকেশানে পীক দেখায়। ) এখন কথা হলো, ডান ও বাম ইমেজের ডিসপ্যারিটি পূর্ণসংখ্যা হবার সম্ভাবনা একদমই নেই; কারণ যে বস্তুটির ছবি আমরা তুলছি তা Discrete না!! এখন ধরা যাক, বাস্তবে বাম ও ডান ইমেজের 'ডিসপ্যারিটি' হলো (8.4,1.7); তাহলে, POC ফাংশানের (8.4,1.7) নম্বর কম্পোনেন্টটাটে পীক দেখা যাবার কথা। কিন্তু POC তো 32 x 32 সাইজের Discrete ফাংশান; তার কম্পোনেন্টগুলোর নম্বর শুধু পূর্ণসংখ্যাই হতে পারে!! কাজেই এক্ষেত্রে আমরা হয়ত (8,1) নম্বর এবং (8,2) নম্বর কম্পোনেন্টে দুটো পীক দেখতে পাব। তারমানে আসল পীকটা হলো এই (8,1) এবং (8,2) এর মাঝখানে, অর্থাৎ (8.4,1.7) এ।

এই দশমিকযুক্ত ডিসপ্যারিটিকেই বলা হয় 'সাব-পিক্সেল' ডিসপ্যারিটি!! (সফটওয়্যারের বাহাদূরীটাই এখানে!! হার্ডওয়্যারে যেখানে পিক্সেল পর্যায়ে গিয়েই আমাদের থেমে যেতে হচ্ছে, সফটওয়্যার সেখানে আরও গভীরে প্রবেশের পথকরে দিতে পারে -- বাই দ্য ওয়ে, সফটওয়্যার হলো মানুষের চিন্তাশক্তির সবচেয়ে কাছাকাছি মেশিনাইজড রূপ) এখন এই আসল পীকের (8.4,1.7) অবস্থান কিভাবে বের করব? সেজন্য খুব পরিচিত পদ্ধতি হলো ফাংশান ফিটিং; একটা উদাহরণ দিচ্ছি (কঠিন হতে পারে): ধরুন X আর Y এর মাঝে নিচের সম্পর্কটা আছে; X=0 হলে Y=0; X=1 হলে Y=2; X=2 হলে Y=4; X=3 হলে Y=6; X=4 হলে Y=6; X=5 হলে Y=4; X=6 হলে Y=2; X=7 হলে Y=0; উপরের আলোচনার সাথে মিলিয়ে বললে, এখানে Y হলো POC এর মতোই একটা ফাংশান, কিন্তু POC দ্্বিমাত্রিক আর Y একমাত্রিক। আর, X হলো এখানে একমাত্রিক ইনডেক্স; এখন বলুনতো, X এর কোন মানের জন্য Y এর মান সর্বোচ্চ হবে? এখানে লক্ষ্য করুন, X এর মান 0 থেকে 3 পর্যন্ত Y এর মান সমান হারে বাড়ল, তারপর আবার দেখা যাচ্ছে X এর মান 4 থেকে 7 পর্যন্ত Y এর মান একই হারে কমল। এখন দেখুন, যদি X এর মান 3 এর পরপরই Y এর মান কমা শুরু করত, তাহলে X এর মান 3 ও 4 এর জন্য Y এর মান একই হতনা; 4 এর জন্য মানটা কম হতো। কাজেই, বলা যায় যে Y এর মান 3 ও 4 এর মাঝখানে কোনস্থান থেকে Y এর মান কমা শুরু করেছে। X and Y এর মাণগুলো বসিয়ে গ্রাফ এঁকে ফেললে দেখবেন যে, X = 0 to 3 এর জন্য একটা ঊর্ধমুখী সরলরেখা, আর X = 4 to 7 এর জন্য একটা নিন্মমুখী সরলরেখা আঁকা গেছে।

লক্ষ্য করুন, আমরা X এর জন্য শুধু পূর্ণসংখ্যা মান নিয়েছি; কাজেই Y একটা Discrete ফাংশান। প্রাপ্ত সরলরেখাদুটোকে উপরের দিকে বাড়াতে থাকলে একসময় তারা ছেদ করবে; এই ছেদবিন্দুটাই Y এর সর্বোচ্চ মান, অর্থাৎ পীক!! এভাবে গ্রাফের (আসলে ম্যাথমেটিক্সে বলা হয় কার্ভের) মাধ্যমে Discrete ফাংশানের পীকের দশমিক ইনডেক্স (Non-integer location/coordinate) বের করা যায়। বুঝবেন যে, Y এর মান 3.5 এর পর থেকেই Y এর মান কমা শুরু করেছে। এটাই ফাংশান ফিটিং!!! এই ক্ষেত্রে X=3.5 এ Y এর সর্বোচ্চ মান বা পীক পাওয়া যাবে; অর্থাৎ, Discrete ফাংশান Y এর পীকের Non-integer location/coordinate X হবে 3.5। এখন, পরের সমস্যা হলো -- কার্ভটা কিভাবে বুঝব।

উপরের উদাহরণটা সহজ ছিল বলে আমরা বুঝেছি যে সরলরেখাদুটোকে উপরের দিকে টেনে নিলে পীক পাওয়া যাবে। কিন্তু দ্্বিমাত্রিক কোন 32 x 32 ম্যাট্রিক্সের ক্ষেত্রে এই কার্ভ ঠিক করাটা আসলেই কঠিণ!! এখন একটা ব্ল্যাকবক্স মারি আমাদের POC ফাংশান ব্যাব হার করলে আগে বর্ণিত জেনারেলি ব্যাবহৃত SAD, SSD, NCC এর তুলনায় বেশী Accuracy তে ফাংশান ফিটিং করা যায়। কারণ, POC ফাংশান সবসময়ই নির্দিষ্ট আকৃতি ধারণ করে, তাই ফিটিঙে সুবিধা। অন্যান্যরা ডেটাভেদে ভিন্ন ভিন্ন আকৃতি ধারণ করে। ব্ল্যাকবক্স শেষ ..... (উপরের ব্ল্যাকবক্সের ব্যাখ্যা ....) দ্্বিমাত্রিক ফাংশানের ক্ষেত্রে তাই প্রাপ্ত Discrete ডেটার সাথে 2nd order function ফিটিং করে Interpolation ব্যাবহার করা হয় ।

তারপর দেখা হয় কোন 2nd order function টা সবচেয়ে ভাল ফিট করে। দুই পর্ব আগে উল্লেখিত প্রচলিত SAD, SSD, NCC পদ্ধতিগুলোতে এভাবেই ফাংশান ফিটিঙের মাধ্যমে 'সাব-পিক্সেল ডিসপ্যারিটি' বের করা হয়। কিন্তু Interpolation ব্যাবহারের কারনে Accuracy টা কমে যায়। কারণ, Interpoaltion মানেই হলো কিছু Assumed মান বসানো। POC ফাংশান ব্যাবহারের আরেকটি বড় সুবিধা এখানে আমরা পেয়েছি; আমাদের ল্যাবে আমরা এই POC ফাংশানের Continuous space এর মডেল ডিফাইন করতে পেরেছি, যেটার shape হলো Periodic SINC function এর মতো।

এটা আমাদের কাজের একটা খুব বড় Theoritical originality; কাজেই, আমাদের POC ফাংশানের ক্ষেত্রে 2nd order function assume করার প্রয়োজন নেই; ডাইরেক্ট Periodic SINC function ফিট করে দিলেই হলো!! (ব্ল্যাকবক্সের ব্যাখ্যা শেষ .................) এর বাইরে Windowing, Spectral weighting function এসব ব্যাবহার করে ব্লক-ম্যাচিঙের Accuracy বাড়ানো হয়েছে; বড় বড় সাইজের (আমার সিস্টেমে 640 x 480 সাইজ) দুটো ইমেজ থেকে 32 x 32 সাইজের দুটো সদৃশ ইমেজ কেটে নেয়া কঠিন!! সেজন্য একটা coarse-to-fine স্ট্র্যাটেজি প্রয়োগ করেছি, যা POC এর জন্য খুব উপযোগী। স্টেরেও ভিশনে Projective Distortion নামের একটা ভয়াবহ ঝামেলা আছে বলে, কোনভাবেই ব্লক সাইজ বেশী বড় নেয়া যায়না। খুব ছোট লোকাল অঞ্চলেই এরা সদৃশ বলে ধরে নেয়া যায় -- বেশী বড় হলে কখনই সদৃশ হয়না। খুব ছোট ব্লক নিলে, ব্লকদুটোর ডিসপ্যারিটি যদি একটু বড় হয় তাহলে আবার বাম ও ডান ব্লকে ওভারল্যাপিং অংশের পরিমাণ এত কম হয় যে ম্যাচিঙে মাঝেমাঝে ভাল রেজালট পাওয়া যায়না। এই সমস্যার সমাধানে আমি প্রস্তাব করেছি একটি পদ্ধতি -- Sub-pixel window alignment technique।

এটা একটা Iterative Process, যার মাধ্যমে কয়েকবার সার্চ করে প্রতিবারই window alignment এর মাধ্যমে ওভারল্যাপিং অংশের পরিমান বাড়ানো হয়। মোটামুটি এই সব মিলিয়ে করেসপন্ডেন্স সার্চ। পরের পর্বে এর সামারি দেব; ছোট হবে সেই পর্বটা -- আশা করি।

অনলাইনে ছড়িয়ে ছিটিয়ে থাকা কথা গুলোকেই সহজে জানবার সুবিধার জন্য একত্রিত করে আমাদের কথা । এখানে সংগৃহিত কথা গুলোর সত্ব (copyright) সম্পূর্ণভাবে সোর্স সাইটের লেখকের এবং আমাদের কথাতে প্রতিটা কথাতেই সোর্স সাইটের রেফারেন্স লিংক উধৃত আছে ।