Computer Visionপড়তে ১১ মিনিট লাগবে

কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNNs)

একটার পর একটা কনভোলিউশন বসালে প্রথমে দেখা যায় দাগ, এরপর আকৃতি, আর শেষে পুরো বস্তু
scope:কোর কনসেপ্ট (মূল ধারণা)difficulty:মাঝারি

স্তরে স্তরে দৃষ্টিশক্তি তৈরি করা

আপনার চোখের দেখার ক্ষমতা কিন্তু চোখের পলকেই আলো থেকে সরাসরি "ওটা তো একটা গোল্ডেন রিট্রিভার কুকুর"-এ লাফ দেয় না। এটি ধাপে ধাপে জিনিসগুলোকে বুঝতে শেখে:

  • লেয়ার ১: সাধারণ দাগ বা সীমানা (edges) খুঁজে বের করে — যেমন, সোজা বা বাঁকা লাইন।
  • লেয়ার ২: দাগগুলোকে জোড়া লাগিয়ে বিভিন্ন আকৃতি বানায় — যেমন, গোলাকার, চারকোনা বা কোনাকুনি শেপ।
  • লেয়ার ৩: আকৃতিগুলোকে জোড়া লাগিয়ে বিভিন্ন অংশ তৈরি করে — যেমন, চোখ, কান, চাকা, বা জানালা।
  • আরও গভীর লেয়ার: এই ছোট ছোট অংশগুলো জোড়া লাগিয়ে পুরো বস্তুটাকে চিনে ফেলে — যেমন, চেহারা, গাড়ি, কুকুর, বা বিল্ডিং।

একটি কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNN) ঠিক এভাবেই একটার পর একটা স্তরে কাজ করে। এটি পরপর অনেকগুলো কনভোলিউশনাল লেয়ারকে একসাথে সাজায়, যেখানে প্রতিটি লেয়ার আগের লেয়ারের চিনে রাখা প্যাটার্নের ওপর ভিত্তি করে কাজ করে। প্রথম লেয়ার দেখে দাগ বা সীমানা। দ্বিতীয় লেয়ার দেখে সাধারণ আকৃতি। আর একদম ভেতরের গভীর লেয়ারগুলো পুরো বস্তুকে চিনে ফেলে। এটা মূলত প্যাটার্ন বা নকশা চেনার এক বিশাল রাজ্য, যা সে পুরোটাই নিজে নিজে ডেটা থেকে শেখে।

সিএনএনের (CNN) রেসিপি

সাধারণত একটি সিএনএনে তিন ধরনের লেয়ার পরপর সাজানো থাকে:

  1. কনভোলিউশনাল লেয়ার (Convolutional layers) — যেগুলো তাদের শিখে রাখা 'কার্নেল' বা ফিল্টার ব্যবহার করে বিভিন্ন প্যাটার্ন বা নকশা খুঁজে বের করে।
  2. পুলিং লেয়ার (Pooling layers) — যেগুলো ছবির ছোট ছোট অংশগুলোকে সামারি বা সংক্ষেপ করে ছবিটাকে সাইজে ছোট করে দেয় (যেমন, ম্যাক্স পুলিং একটি ২x২ ব্লকের সবচেয়ে বড় ভ্যালুটা রেখে বাকিগুলো ফেলে দেয়)। এতে কম্পিউটারের খাটুনি কমে এবং কিছুটা ট্রান্সলেশন ইনভ্যারিয়েন্স (translation invariance — অর্থাৎ ছবি একটু ডান-বামে সরলেও সে ঠিকই চিনে ফেলবে) যোগ হয়।
  3. ফুল্লি কানেক্টেড লেয়ার (Fully connected layers) — একদম শেষে এসে সবকিছুকে লম্বা একটা ভেক্টরে ফ্ল্যাট বা চ্যাপ্টা করে ফেলা হয় এবং সেটার মাধ্যমে জিনিসটাকে আলাদা করে চেনা হয় (যেমন, "এটা একটা কুকুর" নাকি "এটা একটা বিড়াল")।

বিখ্যাত সব সিএনএন (CNN) মডেল

যায়তগুলো বিখ্যাত সিএনএন মডেল তৈরি হয়েছে, তার প্রতিটি তার আগের মডেলের রেকর্ড ভেঙে নতুন মাইলফলক ছুঁয়েছে:

লিনেট-৫ (LeNet-5) - ১৯৯৮ (Yann LeCun)

এটাই পথপ্রদর্শক। ব্যাংকের চেকের হাতে লেখা সংখ্যা পড়ার কাজে এটি ব্যবহৃত হতো। এর লেয়ার ছিল মাত্র ৫টি, কিন্তু এটাই প্রথম প্রমাণ করেছিল যে ছবি চেনার কাজে কনভোলিউশন পদ্ধতি দারুণ কাজ করে।

অ্যালেক্সনেট (AlexNet) - ২০১২ (The Deep Learning Revolution)

ইমেজনেট (ImageNet) প্রতিযোগিতায় বিশাল ব্যবধানে জিতে এটি ভুলের হার ২৬% থেকে এক ধাক্কায় ১৬%-এ নামিয়ে আনে। এর পেছনে কাজ করেছিল দুটি জাদুর কাঠি: আগের চেয়ে গভীর আর্কিটেকচার (৮ লেয়ার) এবং জিপিইউ (GPU) ব্যবহার করে ট্রেনিং করা। এই একটা চমৎকার ফলই আধুনিক গভীর শিখন বা ডিপ লার্নিংয়ের যুগের দুয়ার খুলে দিয়েছিল।

ভিজিজিনেট (VGGNet) - ২০১৪ (Depth Wins)

এটি লেয়ারের সংখ্যা ১৯-এ নিয়ে যায়। এই মডেলটি প্রমাণ করে যে, নেটওয়ার্ক যত গভীর হবে, এটি তত নিখুঁত ফিচার শিখতে পারবে। এর দর্শন ছিল খুব সহজ: শুধু পরপর ৩x৩ কনভোলিউশন সাজাতে থাকো!

রেসনেট (ResNet) - ২০১৫ (Skip Connections)

মাথা খারাপ করা ১৫২ লেয়ারের নেটওয়ার্ক! এর পেছনের সবচেয়ে বড় উদ্ভাবনটি ছিল স্কিপ কানেকশন (skip connections), যা তথ্যকে সরাসরি মাঝের কিছু লেয়ার টপকে সামনে যাওয়ার রাস্তা করে দেয়। এই শর্টকাট রাস্তা না থাকলে এত গভীর নেটওয়ার্ককে ট্রেনিং দেওয়ানো একেবারেই অসম্ভব হতো (কারণ গ্রেডিয়েন্ট ভ্যানিশ বা উধাও হয়ে যেত)। রেসনেট প্রমাণ করেছিল যে, সঠিক আর্কিটেকচার থাকলে, নেটওয়ার্ক যত গভীর হবে ফলাফল ততই ভালো আসার সুযোগ রয়েছে।

একটি সাধারণ সিএনএনের কনসেপ্ট বানানো

import numpy as np
def relu(x):
return np.maximum(0, x)
def max_pool_2x2(feature_map):
"""প্রতিটি 2x2 ব্লক থেকে সবচেয়ে বড় মান বা ম্যাক্স ভ্যালু নিয়ে সাইজ ছোট করে ফেলে।"""
h, w = feature_map.shape
pooled = np.zeros((h // 2, w // 2))
for i in range(0, h, 2):
for j in range(0, w, 2):
pooled[i//2, j//2] = np.max(feature_map[i:i+2, j:j+2])
return pooled
def conv2d(image, kernel):
ih, iw = image.shape
kh, kw = kernel.shape
output = np.zeros((ih - kh + 1, iw - kw + 1))
for y in range(output.shape[0]):
for x in range(output.shape[1]):
output[y, x] = np.sum(image[y:y+kh, x:x+kw] * kernel)
return output
# একটি মিনি সিএনএন পাইপলাইন সিমুলেট করছি
image = np.array([
[0, 0, 0, 0, 10, 10, 10, 10],
[0, 0, 0, 0, 10, 10, 10, 10],
[0, 0, 0, 0, 10, 10, 10, 10],
[0, 0, 0, 0, 10, 10, 10, 10],
[10, 10, 10, 10, 0, 0, 0, 0],
[10, 10, 10, 10, 0, 0, 0, 0],
[10, 10, 10, 10, 0, 0, 0, 0],
[10, 10, 10, 10, 0, 0, 0, 0],
], dtype=float)
edge_kernel = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=float)
print("ধাপ ১: কনভোলিউশন (ছবির বর্ডার বা সীমানা খোঁজা)")
conv_out = conv2d(image, edge_kernel)
print(f" সাইজ: {image.shape}{conv_out.shape}")
print("\nধাপ ২: রিলু বা ReLU (শুধু নেগেটিভ মানগুলো বাদ দিয়ে দেওয়া)")
relu_out = relu(conv_out)
print(f" নেগেটিভ মানগুলো দূর করা হলো")
print("\nধাপ ৩: ম্যাক্স পুলিং (সাইজ বা রেজ্যুলেশন কমানো)")
pool_out = max_pool_2x2(relu_out)
print(f" সাইজ: {relu_out.shape}{pool_out.shape}")
print(f" ফলাফল:\n{pool_out.astype(int)}")
print("\nধাপ ৪: ক্লাসিফিকেশনের জন্য 1D ভেক্টরে চ্যাপ্টা বা ফ্ল্যাট করে ফেলা")
flat = pool_out.flatten()
print(f" সাইজ: {pool_out.shape} → ({len(flat)},)")
print(f" ভেক্টর: {flat.astype(int)}")
Output
ধাপ ১: কনভোলিউশন (ছবির বর্ডার বা সীমানা খোঁজা)
  সাইজ: (8, 8) → (6, 6)

ধাপ ২: রিলু বা ReLU (শুধু নেগেটিভ মানগুলো বাদ দিয়ে দেওয়া)
  নেগেটিভ মানগুলো দূর করা হলো

ধাপ ৩: ম্যাক্স পুলিং (সাইজ বা রেজ্যুলেশন কমানো)
  সাইজ: (6, 6) → (3, 3)
  ফলাফল:
[[30 30  0]
 [30 30  0]
 [ 0 30 30]]

ধাপ ৪: ক্লাসিফিকেশনের জন্য 1D ভেক্টরে চ্যাপ্টা বা ফ্ল্যাট করে ফেলা
  সাইজ: (3, 3) → (9,)
  ভেক্টর: [30 30  0 30 30  0  0 30 30]
Note: ২০১২ সালের অ্যালেক্সনেটের (AlexNet) মুহূর্তটি-কে বলা হয় ডিপ লার্নিংয়ের "বিগ ব্যাং (Big Bang)"। এর আগে কম্পিউটার ভিশনের কাজগুলো মূলত পিএইচডি (PhD) গবেষকেদের হাতে বানানো ফিচারের ওপর নির্ভরশীল ছিল। অ্যালেক্সনেট প্রমাণ করে দিল যে, একটি সিএনএন মডেলকে ছবির পিক্সেল থেকে পুরো কাজ একাই শিখিয়ে দিলে সেটি গবেষকেদের বানানো সেরা মডেলগুলোকেও স্রেফ উড়িয়ে দিতে পারে। আর এই একটা প্রমাণের পরই পুরো পৃথিবীর চোখ রাতারাতি ডিপ লার্নিংয়ের দিকে ঘুরে যায়। এই গবেষণা পত্রটিকে এ পর্যন্ত ১ লাখ ২০ হাজারের বেশিবার সাইট করা বা অন্য গবেষণায় ব্যবহার করা হয়েছে।

শুধু ছবি চেনার বাইরেও সিএনএনের (CNN) যুগান্তকারী ব্যবহার

সিএনএনগুলো কিন্তু শুধু ছবির নাম লেবেল করার কাজে থেমে নেই। এর আরও অনেক সুপারপাওয়ার আছে:

  • অবজেক্ট ডিটেকশন (Object detection) (যেমন: YOLO, Faster R-CNN) — ছবির ভেতরে থাকা প্রতিটি বস্তুর চারপাশে বাউন্ডারি বক্স বা বাক্স এঁকে সেগুলোকে আলাদা করে চিনিয়ে দেওয়া।
  • সিম্যান্টিক সেগমেন্টেশন (Semantic segmentation) — ছবির ভেতরের প্রতিটা পিক্সেল ধরে আলাদা করা (এই পিক্সেলটা আকাশ, এই পিক্সেলটা রাস্তা, ওই পিক্সেলটা একটা গাড়ি)।
  • ফেসিয়াল রিকগনিশন (Face recognition) — ছবিতে কে দাঁড়িয়ে আছে তার পরিচয় বের করা।
  • মেডিকেল ইমেজিং (Medical imaging) — এক্সরে রিপোর্টে টিউমার খুঁজে বের করা, স্কিনের বিভিন্ন দাগ বিশ্লেষণ করা বা চোখের রেটিনার স্ক্যান পরীক্ষা করা।
  • সেলফ-ড্রাইভিং গাড়ি (Self-driving cars) — রাস্তা চেনা, হেঁটে চলা মানুষ চিহ্নিত করা এবং রাস্তার সিগন্যালগুলো পড়ে সিদ্ধান্ত নেওয়া।

সম্প্রতি, ভিশন ট্রান্সফরমার (Vision Transformers বা ViT) ছবির কাজে ট্রান্সফরমার আর্কিটেকচার ব্যবহার করে সিএনএনের একাধিপত্যকে চ্যালেঞ্জ জানাতে শুরু করেছে। কিন্তু তবুও সিএনএন এখনো অবজেক্ট ডিটেকশন আর কম্পিউটার ভিশনের এক অত্যন্ত মজবুত ভিত্তি হিসেবে পরিচিত। বিশেষ করে মোবাইল ডিভাইসে এর দুর্দান্ত গতির কারণে এর চাহিদা এখনো আকাশচুম্বী।

ছোট কুইজ

একটি সিএনএনের ভেতরের দিকের গভীর লেয়ারগুলো সাধারণত কী খুঁজে বের করে?
Challenge

পড়া চালিয়ে যান