Image Classification হল একটি ডিপ লার্নিং কাজ যেখানে একটি মডেল বা এলগরিদম একটি চিত্রের ভিত্তিতে এটি কোন শ্রেণীতে (class) অন্তর্ভুক্ত তা চিহ্নিত করে। উদাহরণস্বরূপ, একটি মডেল বিভিন্ন প্রাণীর ছবি দেখে প্রতিটি ছবির মধ্যে কুকুর, বিড়াল বা অন্য কোন প্রাণী আছে কি না তা নির্ধারণ করতে পারে।
এখানে একটি সাধারণ Image Classification প্রজেক্টের উদাহরণ দেওয়া হয়েছে, যেখানে PyTorch ব্যবহার করে একটি মডেল তৈরি করা হবে যা CIFAR-10 ডেটাসেট থেকে ছবির শ্রেণী চিহ্নিত করবে।
১. প্রয়োজনীয় লাইব্রেরি ইনস্টলেশন
প্রথমে, PyTorch, torchvision এবং অন্যান্য প্রয়োজনীয় লাইব্রেরি ইনস্টল করতে হবে:
pip install torch torchvision matplotlib
২. CIFAR-10 ডেটাসেট লোড করা
CIFAR-10 একটি ছোট ডেটাসেট যা ১০টি বিভিন্ন শ্রেণীর ৬০,০০০ ছবি নিয়ে গঠিত। প্রতিটি শ্রেণীতে ৬,০০০ ছবি থাকে এবং ডেটাসেটটি ৫০,০০০ ট্রেনিং এবং ১০,০০০ টেস্ট ছবি নিয়ে তৈরি।
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
# ডেটাসেট ট্রান্সফর্মেশন সেটআপ
transform = transforms.Compose(
[transforms.ToTensor(), # চিত্রকে টেনসরে রূপান্তরিত করা
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # নরমালাইজেশন
# CIFAR-10 ডেটাসেট লোড করা
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
৩. ক্লাস লেবেল (Classes) ডিফাইন করা
CIFAR-10 ডেটাসেট ১০টি শ্রেণীতে ছবি বিভক্ত। এগুলি হল:
classes = ('airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
৪. নিউরাল নেটওয়ার্ক মডেল তৈরি করা
এখন আমরা একটি সোজা Convolutional Neural Network (CNN) মডেল তৈরি করব যা CIFAR-10 ডেটাসেটের ছবি শ্রেণীবদ্ধ করবে।
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# কনভোলিউশনাল লেয়ার 1
self.conv1 = nn.Conv2d(3, 6, 5)
# কনভোলিউশনাল লেয়ার 2
self.conv2 = nn.Conv2d(6, 16, 5)
# ফুলি কানেক্টেড লেয়ার 1
self.fc1 = nn.Linear(16 * 5 * 5, 120)
# ফুলি কানেক্টেড লেয়ার 2
self.fc2 = nn.Linear(120, 84)
# আউটপুট লেয়ার
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = torch.relu(self.conv1(x)) # কনভোলিউশনাল লেয়ার 1
x = torch.max_pool2d(x, 2, 2) # পুলিং
x = torch.relu(self.conv2(x)) # কনভোলিউশনাল লেয়ার 2
x = torch.max_pool2d(x, 2, 2) # পুলিং
x = x.view(-1, 16 * 5 * 5) # ফ্ল্যাটিং
x = torch.relu(self.fc1(x)) # ফুলি কানেক্টেড লেয়ার 1
x = torch.relu(self.fc2(x)) # ফুলি কানেক্টেড লেয়ার 2
x = self.fc3(x) # আউটপুট লেয়ার
return x
# মডেল ইনস্ট্যান্স তৈরি
net = Net()
৫. লস ফাংশন এবং অপটিমাইজার সেটআপ
এখন, আমরা CrossEntropyLoss লস ফাংশন এবং SGD (Stochastic Gradient Descent) অপটিমাইজার ব্যবহার করব:
# লস ফাংশন এবং অপটিমাইজার
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
৬. মডেল ট্রেনিং
এখন আমরা মডেলটি ট্রেনিং শুরু করব:
# মডেল ট্রেনিং
for epoch in range(2): # 2 ইপোকের জন্য ট্রেনিং
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# ডেটা লোড করা
inputs, labels = data
# গ্রেডিয়েন্টস্ শূন্য করা
optimizer.zero_grad()
# ফরওয়ার্ড + ব্যাকওয়ার্ড + অপটিমাইজেশন
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# পরবর্তী ২০০০ ব্যাচের পর লোকস দেখানো
running_loss += loss.item()
if i % 2000 == 1999: # প্রতি ২০০০ ব্যাচে লোকস দেখানো
print(f"[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}")
running_loss = 0.0
print('Finished Training')
৭. মডেল পরীক্ষা করা
টেস্ট ডেটাসেটে মডেলের পারফরম্যান্স পরীক্ষা করা:
# টেস্ট সেটের উপর মডেল পরীক্ষা করা
correct = 0
total = 0
with torch.no_grad(): # গ্র্যাডিয়েন্ট হিসাব না করা
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')
৮. ফলাফল প্রদর্শন করা
প্রতিটি শ্রেণীর জন্য সঠিকতা চেক করতে:
# ক্লাস অনুযায়ী সঠিকতা
class_correct = [0] * 10
class_total = [0] * 10
with torch.no_grad():
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs, 1)
c = (predicted == labels).squeeze()
for i in range(4): # ব্যাচের সাইজ ৪
label = labels[i]
class_correct[label] += c[i].item()
class_total[label] += 1
for i in range(10):
print(f'Accuracy of {classes[i]}: {100 * class_correct[i] / class_total[i]}%')
সারাংশ
এই প্রজেক্টে আমরা PyTorch ব্যবহার করে CIFAR-10 ডেটাসেট থেকে একটি Image Classification মডেল তৈরি করেছি। এতে:
- ডেটাসেট লোডিং এবং ট্রান্সফরমেশন,
- একটি Convolutional Neural Network (CNN) মডেল তৈরি,
- ফিডফরোয়ার্ড, ব্যাকপ্রোপাগেশন এবং অপটিমাইজেশন প্রক্রিয়া,
- মডেল ট্রেনিং এবং পরীক্ষার জন্য কোড করা হয়েছে।
এই ধরনের প্রকল্পে আপনি নতুন ইমেজ ডেটাসেট ব্যবহার করে আরও উন্নত মডেল তৈরি করতে পারেন এবং মডেলের পারফরম্যান্স উন্নত করতে বিভিন্ন কৌশল প্রয়োগ করতে পারেন।