Home »
Blog »
AI/ML Engineer সিরিজ » Series 06 » Episode 06
CNN: computer কীভাবে ছবি 'দেখে' (Image Classifier প্রজেক্ট)
Project P4 — image classifier (Series 06, Episode 06)
🟡 INTERMEDIATE
Series 06 — Deep Learning with PyTorch
Episode 06 / 08
📑 এই পর্বে যা যা আছে
- ১. গল্প: MLP দিয়ে ছবি চেনার চেষ্টা — আর ব্যর্থতা
- ২. সমস্যা: ছবিতে MLP কেন দুর্বল?
- ৩. Convolution — "ছোট জানালা দিয়ে দেখা"
- ৪. Pooling — সারসংক্ষেপ করা
- ৫. তিন স্তরে বুঝি
- ৬. একটা CNN-এর গঠন
- ৭. Project P4: CNN Image Classifier (সম্পূর্ণ কোড)
- ৮. Visual: ছবি → conv → pool → উত্তর
- ৯. Experiment: filter সংখ্যা বদলে দেখুন
- ১০. বাংলাদেশের বাস্তব উদাহরণ
- ১১. AI Engineer-এর দৃষ্টিভঙ্গি
- ১২. Boss Question
- ১৩. Job Requirement Decoder
- ১৪. সাধারণ ভুল ধারণা
- ১৫. Interview Prep
- ১৬. হাতে-কলমে
- ১৭. Project Connection ও সারসংক্ষেপ
🧩 ১. গল্প: 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 কেন দুর্বল?
- অসংখ্য parameter: 224×224×3 = ১,৫০,৫২৮ input; প্রথম layer-এই লাখ লাখ weight — overfit ও ধীর।
- Spatial সম্পর্ক হারায়: flatten করলে "কোন pixel কার পাশে" তথ্য নষ্ট হয়। অথচ ছবিতে এটাই মূল।
- Translation-এ দুর্বল: একই বস্তু ছবির অন্য জায়গায় সরালে 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 হাতে বুঝুন।
🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ
- Health-tech: chest X-ray থেকে নিউমোনিয়া/টিবি স্ক্রিনিং — CNN।
- কৃষি-tech: ধান/আলুর পাতার ছবি থেকে রোগ শনাক্ত — কৃষকের ফোন থেকেই।
- Fintech/KYC: NID/document ছবি যাচাই, signature verification।
- E-commerce (Daraz): product image auto-categorization, ডুপ্লিকেট/ভুল ছবি ধরা।
👷 ১১. 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-এর প্রথম আভাস।