CNN: computer কীভাবে ছবি 'দেখে' (Image Classifier প্রজেক্ট)

Project P4 — image classifier (Series 06, Episode 06)

🟡 INTERMEDIATE Series 06 — Deep Learning with PyTorch Episode 06 / 08

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: MLP দিয়ে ছবি চেনার চেষ্টা — আর ব্যর্থতা

Rahim আত্মবিশ্বাসী — MLP তো শিখে ফেলেছে! সে ভাবল, "একটা ছবির সব pixel সোজা করে (flatten) একটা লম্বা vector বানিয়ে MLP-তে দিলেই তো হবে।" চেষ্টা করল হাতে লেখা সংখ্যার (MNIST) ছবিতে। কাজ করল বটে, কিন্তু...

Maya: "MNIST-এ তোমার MLP মোটামুটি চলল, কারণ ছবিগুলো ছোট (28×28) আর সাদাকালো। এবার একটা 224×224 রঙিন ছবি নাও — flatten করলে দেড় লাখ input! আর একটা বিড়াল ছবির বাঁদিকে থাকলে MLP শিখবে এক রকম, ডানদিকে সরালে আবার নতুন করে শিখতে হবে। MLP জানেই না যে পাশাপাশি pixel-রা সম্পর্কিত।"

Rahim: "তাহলে ছবির জন্য কী লাগবে?"

Maya: "CNN — Convolutional Neural Network। যেটা ছবির গঠন (structure) বোঝে।"

২. সমস্যা: ছবিতে MLP কেন দুর্বল?

দরকার এমন একটা layer যা (ক) ছোট প্যাটার্ন (edge, corner) খুঁজবে, (খ) সেই প্যাটার্ন ছবির যেকোনো জায়গায় থাকলেও চিনবে, (গ) কম parameter-এ কাজ চালাবে। এটাই convolution

🔲 ৩. Convolution — "ছোট জানালা দিয়ে দেখা"

একটা ছোট "জানালা" (filter/kernel, যেমন 3×3) পুরো ছবির উপর ধাপে ধাপে স্লাইড করে। প্রতিটা অবস্থানে সেই জানালার নিচের pixel-দের সাথে filter-এর weight গুণ করে যোগ করে একটা সংখ্যা বানায়। এভাবে তৈরি হয় একটা feature map — যা বলে "এই filter যে প্যাটার্ন খোঁজে, তা ছবির কোথায় কোথায় আছে"।

একটা 3×3 filter পুরো ছবির উপর স্লাইড করছে: ছবি (5×5) filter (3×3) feature map ▦▦▦▢▢ ▨▨▨ ┌───┐ ▦▦▦▢▢ × ▨▨▨ ─> │ e │ ← এখানে edge পাওয়া গেল ▦▦▦▢▢ ▨▨▨ └───┘ একই filter সব জায়গায় ব্যবহৃত হয় (weight sharing) → কম parameter, আর প্যাটার্ন যেখানেই থাকুক ধরা পড়ে
মূল দুই সুবিধা: (১) weight sharing — একই filter সারা ছবিতে, তাই অনেক কম parameter। (২) translation invariance — বস্তু যেখানেই থাক, filter তাকে চিনবে। শুরুর layer edge/corner শেখে, গভীর layer চোখ/চাকা/মুখের মতো জটিল অংশ।

🔻 ৪. Pooling — সারসংক্ষেপ করা

Pooling (সাধারণত Max Pooling) feature map-কে ছোট করে — যেমন 2×2 এলাকা থেকে সবচেয়ে বড় মানটা রাখে। এতে (ক) গণনা কমে, (খ) ছোটখাটো সরে যাওয়ায় model কম সংবেদনশীল হয় (robustness), (গ) গুরুত্বপূর্ণ signal থাকে, বাকিটা বাদ।

feature map (4×4) Max Pool 2×2 ছোট (2×2) 1 3 | 2 0 প্রতি 2×2 থেকে ┌──────┐ 4 2 | 1 1 সর্বোচ্চ মান ─> │ 4 2 │ -----+----- │ 6 8 │ 0 6 | 3 8 └──────┘ 1 2 | 7 5

🎯 ৫. তিন স্তরে বুঝি

Level 1 — intuition: ছবি বুঝতে আপনি প্রথমে ছোট ছোট বৈশিষ্ট্য দেখেন (রেখা, কোণ), তারপর সেগুলো জুড়ে বড় জিনিস (চোখ, মুখ)। CNN ঠিক তাই করে — layer-এর পর layer আরও বড় প্যাটার্ন।

Level 2 — technical: convolution = filter-এর সাথে local region-এর dot product, সারা ছবিতে slide। pooling = downsample। শেষে flatten করে একটা MLP class predict করে।

Level 3 — engineer: বাস্তবে scratch থেকে CNN কম train করা হয় — pretrained model (ResNet ইত্যাদি) দিয়ে transfer learning করা হয় (পরের পর্ব)। তবু CNN-এর গঠন জানা জরুরি, নাহলে model কেন কাজ করছে/করছে না বোঝা যায় না।

🏛️ ৬. একটা CNN-এর গঠন

Input ছবি │ ▼ [Conv → ReLU → Pool] ← edge/corner শেখে │ ▼ [Conv → ReLU → Pool] ← আকৃতি/texture শেখে │ ▼ Flatten ← 2D feature map → 1D vector │ ▼ [Linear → ReLU → Linear] ← MLP অংশ: চূড়ান্ত সিদ্ধান্ত │ ▼ Class probabilities (Softmax)

💻 ৭. Project P4: CNN Image Classifier (সম্পূর্ণ কোড)

আমরা torchvision-এর FashionMNIST দিয়ে একটা CNN বানাব (জুতা, শার্ট, ব্যাগ ইত্যাদি ১০ class)। কেন torchvision? — এটা dataset download, image→tensor transform আর ready pipeline দেয়, তাই আমরা model-এ মন দিতে পারি।

import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision import datasets, transforms device = "cuda" if torch.cuda.is_available() else "cpu" # 1) data: ছবি -> tensor, normalize tf = transforms.Compose([ transforms.ToTensor(), # [0,255] -> [0,1], shape (1,28,28) transforms.Normalize((0.5,), (0.5,)), # কেন্দ্রে আনা ]) train_ds = datasets.FashionMNIST(root="data", train=True, download=True, transform=tf) test_ds = datasets.FashionMNIST(root="data", train=False, download=True, transform=tf) train_loader = DataLoader(train_ds, batch_size=64, shuffle=True) test_loader = DataLoader(test_ds, batch_size=256) # 2) CNN model class SmallCNN(nn.Module): def __init__(self, n_classes=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), # 28 -> 14 nn.Conv2d(16, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), # 14 -> 7 ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(32 * 7 * 7, 128), nn.ReLU(), nn.Linear(128, n_classes), ) def forward(self, x): return self.classifier(self.features(x)) model = SmallCNN().to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 3) training for epoch in range(5): model.train() for xb, yb in train_loader: xb, yb = xb.to(device), yb.to(device) optimizer.zero_grad() loss = criterion(model(xb), yb) loss.backward() optimizer.step() # 4) evaluation model.eval() correct = total = 0 with torch.no_grad(): for xb, yb in test_loader: xb, yb = xb.to(device), yb.to(device) pred = model(xb).argmax(1) correct += (pred == yb).sum().item() total += yb.size(0) print(f"epoch {epoch+1} | test acc {correct/total:.3f}") # 5) model save (deployment-এর জন্য) torch.save(model.state_dict(), "fashion_cnn.pt")
মাত্র ৫ epoch-এ ~০.৯০ accuracy পাওয়ার কথা — অথচ parameter সংখ্যা একই কাজের MLP-এর চেয়ে অনেক কম। এটাই convolution-এর দক্ষতা। padding=1 ছবির সাইজ ধরে রাখে; 32*7*7 এসেছে দুই pool-এর পর (28→14→7) ও শেষ conv-এর 32 channel থেকে।

🖼️ ৮. Visual: ছবি → conv → pool → উত্তর

(1×28×28) --Conv(16)-> (16×28×28) --Pool-> (16×14×14) --Conv(32)-> (32×14×14) --Pool-> (32×7×7) --Flatten-> (1568) --Linear-> (128) --Linear-> (10) │ ▼ কোন পোশাক?

🧪 ৯. Experiment: filter সংখ্যা বদলে দেখুন

উপরের কোডে nn.Conv2d(1, 16, ...)-এর 16 কে 8 বা 32 করুন (এবং সেই অনুযায়ী পরের layer)। খেয়াল করুন — বেশি filter মানে বেশি capacity ও parameter, একটু ভালো accuracy কিন্তু ধীর। কম filter দ্রুত কিন্তু কম শেখে। এই trade-off হাতে বুঝুন।

🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ

👷 ১১. AI Engineer-এর দৃষ্টিভঙ্গি

Engineer scratch থেকে বড় CNN কমই লেখে — বেশিরভাগ সময় pretrained model নিয়ে transfer learning করে (পরের পর্ব)। কিন্তু এই ছোট CNN নিজে লেখার অভিজ্ঞতা জরুরি: এটা শেখায় conv/pool/flatten কীভাবে জোড়া লাগে, shape কীভাবে বদলায় (সবচেয়ে সাধারণ bug — shape mismatch)। এই ভিত্তি ছাড়া বড় model debug করা কঠিন।

💼 ১২. Boss Question

Boss: "এই ছবি চেনার model — আমাদের business-এ কোথায় টাকা আনবে?"

উত্তর: "স্যার, ভাবুন আমাদের KYC-তে হাজার হাজার NID ছবি হাতে যাচাই হয় — একটা CNN সেটা স্বয়ংক্রিয় করে সময় ও খরচ কমায়। বা agri-app-এ কৃষক পাতার ছবি তুললেই রোগ বলে দেওয়া — এটা সরাসরি নতুন product feature, নতুন user। CNN হলো সেই capability যা মানুষ দিয়ে করলে ধীর ও ব্যয়বহুল।"

🔎 ১৩. Job Requirement Decoder

"Experience with CNNs / computer vision (image classification)."
প্রশ্নউত্তর
কী বোঝায়?আপনি CNN দিয়ে image classification model বানাতে ও train করতে পারেন।
কেন চায়?image-ভিত্তিক feature (medical, KYC, agri, retail) CNN ছাড়া হয় না।
কোন সমস্যা সমাধান করে?ছবি থেকে স্বয়ংক্রিয় শনাক্তকরণ/শ্রেণিবিন্যাস।
junior-এর কী জানা লাগে?conv/pool/flatten, একটা CNN train করা, shape হিসাব, model save/load।
এখনই কী master লাগে না?নতুন architecture design, object detection/segmentation-এর গভীরতা, GAN।
GitHub-এ কীভাবে দেখাবে?এই P4 image classifier project — README-তে accuracy, confusion matrix, কয়েকটা prediction ছবি।
interview-তে কী?"CNN কেন MLP-র চেয়ে ছবিতে ভালো?", "convolution ও pooling কী করে?"

⚠️ ১৪. সাধারণ ভুল ধারণা

ভুল ১: "ছবির জন্য MLP-ই যথেষ্ট।" → বড়/রঙিন ছবিতে অকার্যকর; CNN লাগে।

ভুল ২: Flatten-এর পর Linear-এর input size ভুল দেওয়া → shape mismatch error (সবচেয়ে সাধারণ)।

ভুল ৩: image normalize না করা → training ধীর/অস্থির।

ভুল ৪: "বেশি conv layer = সবসময় ভালো" → কম data-তে overfit; transfer learning ভালো।

ভুল ৫: test set-এর ছবিতে ভিন্ন preprocessing → train/test mismatch।

🎤 ১৫. Interview Prep

প্রশ্ন ১: CNN কেন ছবিতে MLP-র চেয়ে ভালো?
উত্তর: weight sharing (কম parameter), spatial সম্পর্ক রক্ষা, translation invariance।

প্রশ্ন ২: Convolution কী করে?
উত্তর: একটা filter ছবির উপর slide করে local প্যাটার্ন (edge/texture) শনাক্ত করে feature map বানায়।

প্রশ্ন ৩: Pooling কেন?
উত্তর: feature map ছোট করা, গণনা কমানো, ছোট সরণে robustness।

প্রশ্ন ৪: শুরুর ও গভীর layer কী শেখে?
উত্তর: শুরুর layer edge/corner, গভীর layer জটিল অংশ (চোখ, চাকা, বস্তু)।

✍️ ১৬. হাতে-কলমে

১. উপরের P4 CNN চালিয়ে test accuracy রিপোর্ট করুন; ১০ epoch-এ কত ওঠে?
২. একটা ভুল prediction খুঁজে সেই ছবিটা দেখুন — model কেন ভুল করল ভাবুন।
৩. একটা conv+pool block বাড়ান — accuracy ও গতিতে কী প্রভাব?
৪. save করা fashion_cnn.pt নতুন করে load করে একটা ছবিতে predict করুন (inference)।

📌 ১৭. Project Connection ও সারসংক্ষেপ

এটাই আমাদের প্রথম Deep Learning portfolio project (P4) এবং flagship-এর V4 module — job post-এর সাথে দেওয়া company logo/screenshot চেনা বা document image যাচাইয়ের ভিত্তি। save করা .pt model পরে Series 09-এ FastAPI দিয়ে serve করব — মানে এই ছবি classifier একদিন একটা আসল API হবে।

এই পর্বে শিখলাম:
✓ MLP ছবিতে দুর্বল কেন (parameter বিস্ফোরণ, spatial তথ্য হারানো)
✓ convolution = filter slide করে local প্যাটার্ন খোঁজা (weight sharing, translation invariance)
✓ pooling = downsample; conv→pool→flatten→linear গঠন
✓ torchvision দিয়ে একটা সম্পূর্ণ CNN image classifier (P4) train ও save
✓ shape হিসাব ও normalize — বাস্তব CNN-এর অপরিহার্য detail
পরবর্তী পর্ব (S06E07): "Transfer Learning" — scratch থেকে না শিখে pretrained model (ResNet) ব্যবহার করে অল্প data দিয়েই দুর্দান্ত ফল পাওয়া; embedding-এর প্রথম আভাস।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.