OpenCV ব্যবহার করে যেকোন অবজেক্ট ট্র্যাকিং।
যারা মেশিন লার্নিং এবং ইমেজ প্রসেসিং নিয়ে কাজ করে, তারা সবাই কমবেশি OpenCV এর সাথে পরিচিত। ইমেজ নিয়ে ঘাটাঘাটি করার জন্য এর জুড়ি নেই। আজ আমরা দেখব কিভাবে OpenCV ব্যবহার করে কোন ভিডিও থেকে যেকোন ধরনের অবজেক্ট ট্র্যাক করা যায়।
অবজেক্ট ট্র্যাকিং এর জন্য OpenCV 3.4 পর থেকে সব ভার্সনেই ৮টি এলগরিদম লাইব্রেরি হিসেবে দেয়া আসছে। মাত্র ৫ লাইনের কোড লিখে এর মধ্য থেকে পছন্দমতো যেকোন একটি এলগরিদম ব্যবহার করে অবজেক্ট ট্র্যাক করা সম্ভব। সবগুলো এলগরিদমেরই কোন না কোন বিশেষত্ব আছে। প্রজেক্টের জন্য কোনটা সবচেয়ে মানানসই সেটার সিদ্ধান্ত নেয়ার আগে প্রতিটা এলগরিদম সম্পর্কে জানা অনেক বেশি জরুরী। আজকে আমি সাধারণভাবে এলগরিদম গুলো সম্পর্কে লেখার চেষ্টা করবো।
BOOSTING Tracker: OpenCV তে ব্যবহৃত সবচেয়ে পুরোনো এলগরিদম। আপনার ভিডিও এর রেজুলেশন যদি একটি বেশি হয়, তাহলে এটার ফ্রেম রেট ৫ থেকেও নিচে নেমে যাবে। অনেক বেশি স্লো আর একুরেসিও খুব ভালো না। এটার বিশেষত্ব হলো এটা অনেক পুরোনো। সম্মান জানানোর জন্য ব্যবহার করে দেখতে পারেন। তবে এটা ব্যবহার না করাই ভালো।
MIL Tracker: এটাও ব্যবহার না করার জন্য আমার সাজেশন থাকবে। এটার একুরেসি বুস্টিং থেকে যথেষ্ট ভালো। কিন্তু ফ্রেম থেকে যদি কাংখিত অবজেক্ট বের হয়ে যায়, তবুও এটা আন্দাজে কোনকিছু ট্র্যাক করতে থাকে। যেটা কোন প্রজেক্টের জন্যই ভালো খবর নয়।
KCF Tracker: আমার পছন্দের এলগরিদম। অনেক বেশি দ্রুত প্রসেস করতে পারে। তবে MIL এর মতো অবজেক্ট না থাকলেও ট্র্যাক করার জটিলতা রয়েছে।
CSRT Tracker: আগের এলগরিদমগুলো থেকে এটার উপর বেশি ভরসা করতে পারেন। তবে KCF থেকে এটা যথেষ্ট স্লো প্রসেস করে।
TLD Tracker: এটা সম্পর্কে না জানাই ভালো। এটার বিশেষত্ব্য হলো এটা অনেক বেশি ফলস পজিটিভ রেজাল্ট জেনারেট করে। অব্জেক্ট যদি অনেক বেশি দ্রুত মুভ করে, তাহলে এটার থেকে র্যান্ডম জেনারেটর ব্যবহার করলেও ভালো রেজাল্ট পাবেন।
MOSSE Tracker: এলগরিদমগুলোর মধ্যে এটাকে আপনি ‘ফ্ল্যাশ’ নাম দিতে পারেন। সুপারফাস্ট এলগরিদম। একুরেসি একটু কম, কিন্তু এটার স্পীডে আপনাকে মুগ্ধ করবে।
MedianFlow Tracker: একুরেসি অনেক ভালো। ফাস্ট মুভিং অবজেক্ট ট্র্যাকিং এর জন্য রিকমেন্ড করবো না।
GOTURN Tracker: একমাত্র ডিপ-লার্নিং বেসড ট্র্যাকিং এলগরিদম। এটা ব্যবহারের জন্য আপনাকে OpenCV ছাড়াও কিছু প্রি-ট্রেইনড মডেল ডাউনলোড করে নিতে হবে। ইনশা-আল্লাহ, এটার ব্যবহার নিয়ে আলাদা একটা পোস্টই লিখব।
বাড়তি কথা অনেক হয়েছে। চলুন এবার আমাদের প্রোজেক্টে চলে যাই। যদি OpenCV আগে থেকে ইনস্টল না থাকে তাহলে নিচের কমান্ড ব্যবহার করে ইন্সটল করে নিন।
pip install opencv-python
প্রথমেই আমরা দরকারি লাইব্রেরি/API ইমপোর্ট করে নিবো। এবং ট্র্যাকার ইনিশিয়ালাইজ করব। এছাড়াও অবজেক্ট ট্র্যাকিং এর জন্য আমাদের বাউন্ডিং বক্সও লাগবে। বাউন্ডিং বক্স সাধারণত ৪ টি ভেরিয়েবল সমন্বয়। left-up co-ordinate(x,y) এবং right-bottom co-ordinate(x,y) । প্রথমে এটার ভ্যালু None থাকবে, কারণ এখনও আমরা ডিসাইড করিনি যে কোন অবজেক্ট আমরা ট্র্যাক করব।
import cv2 tracker = cv2.TrackerKCF_create() #Initializing KCF tracker BBox = None #Bounding box variable to store the
এরপর আমরা যেকোন ভিডিও ফাইল থেকে ফ্রেম ইমেজ হিসেবে নিতে থাকবো। OpenCV ব্যবহার করে এটা খুব সহজেই করা সম্ভব।
cap = cv2.VideoCapture('test.mp4') #reading the video file while True: ret, frame = cap.read() #reading frame by frame if ret == False: #if there is no more frames, ret will return false. break
এখন আমরা ব্যবহারকারীর সুবিদ্বার্থে, ইচ্ছামতো বাউন্ডিং বক্স ড্র করার সুযোগ দিবো। যদি ব্যবহারকারী ‘s’ প্রেস করে তাহলে আমাদের প্রোগ্রাম তাকে বাউন্ডিং বক্স ড্র করার সুযোগ দিবে এবং Enter প্রেস করার সাথে সাথে বাউন্ডিং বক্সের ভেতরের অবজেক্টটাকে ট্র্যাক করা শুরু করবে।
key = cv2.waitKey(1) & 0xFF #get the pressed key if key == ord("s"): initBB = cv2.selectROI("Frame", frame, fromCenter=False,showCrosshair=True) #get the selected area as bounding box object tracker.init(frame, initBB) $start our tracker with the bound object
পূর্বের ফ্রেমে আমরা ইউজার থেকে কাংখিত অবজেক্ট নিয়ে আমাদের ট্র্যাকার স্টার্ট করে দিয়েছি। এখন নেক্সট ফ্রেম থেকে আমাদের প্রেডিকশন শুরু হবে। প্রতিটা ফ্রেমকে আমরা ট্র্যাকারের মাধ্যমে প্রসেস করব এবং ট্র্যাকার আমাদেরকে দুইটা ভ্যালু রিটার্ন করবে। প্রথম ভ্যালু শুধু True or False রিটার্ন করবে। যদি অবজেক্ট ফ্রেমের মধ্যে থাকে তাহলে True অন্যথায় False রিটার্ন করবে। ২য় ভ্যালু প্রেডিক্টেড ৪ টি ভেরিয়েবল রিটার্ন করবে। Left top co-ordinate(x,y) এবং বাউন্ডিং বক্স এর Height, Width ।
if initBB is not None: #already started, now we can start prediction (success, box) = tracker.update(frame) #get the predicted values if success: #object found (x, y, w, h) = [int(v) for v in box] cv2.rectangle(frame, (x, y), (x + w, y + h),(255, 0, 0), 2) #draw rectangle to bind the object
That’s it. হ্যা, এটা এতটাই সহজ। নিচে প্রোগ্রামটির আউটপুট দেখানো হলো।

এখানে শুধু আমি KCF ব্যবহার করেছি। তবে আপনারা চাইলে সবগুলোই একবার করে রান করে তুলনা করে দেখতে পারেন। অন্যগুলো কিভাবে ইনিশিয়ালাইজ করতে হবে, নিচে সেটা উল্লেখ করে দিচ্ছি।
boosting = cv2.TrackerBoosting_create, mil = cv2.TrackerMIL_create, csrt = cv2.TrackerCSRT_create, tld = cv2.TrackerTLD_create, medianflow = cv2.TrackerMedianFlow_create, mosse = cv2.TrackerMOSSE_create
Just awesome
I have been waiting for such a Bangla blog for a long time.
Looking forward to writing next.
Hope to share soon.