CNN ve Self-Attention Tabanlı Çiçek Sınıflandırması

Deep Learning • Convolutional Neural Networks • Self-Attention • Feature Embedding Analysis


Proje Özeti

Bu projede, çiçek görüntülerinin otomatik olarak sınıflandırılması amacıyla Convolutional Neural Network (CNN) tabanlı bir derin öğrenme mimarisi geliştirilmiştir. Klasik CNN yapısına ek olarak, modelin ayırt edici özellikleri daha etkin öğrenebilmesi için Self-Attention mekanizması entegre edilmiştir.

Çalışma kapsamında yalnızca sınıflandırma doğruluğu değil, aynı zamanda öğrenilen özniteliklerin (feature embeddings) yapısı da analiz edilmiştir. Bu amaçla PCA ve UMAP gibi boyut indirgeme teknikleri kullanılarak, modelin iç temsilleri görselleştirilmiştir.

Veri Seti

  • Veri seti: Oxford Flowers102 (toplam 102 sınıf içinden 1–20 arası sınıflar kullanıldı)
  • Split: Eğitim 200 / Doğrulama 200 / Test 755

Veri Önişleme ve Artırma

Veriler torchvision.datasets.Flowers102 ile yüklenmiştir. Eğitim verisine yatay çevirme, döndürme ve renk jitter gibi artırma teknikleri uygulanmıştır. Doğrulama ve testte yalnızca yeniden boyutlandırma ve tensöre çevirme kullanılmıştır.


Metodoloji

  • Görüntüler CNN tabanlı bir ağ kullanılarak öznitelik vektörlerine dönüştürüldü
  • Self-Attention katmanı ile uzamsal olarak önemli bölgelerin ağırlığı artırıldı
  • CNN, CNN+Self-Attention ve EfficientNet modelleri karşılaştırmalı olarak eğitildi
  • Eğitim sürecinde accuracy ve loss metrikleri epoch bazında takip edildi

Self-Attention Mekanizması (Örnek Kod)


class SelfAttention(nn.Module):
    def __init__(self, in_dim):
        super(SelfAttention, self).__init__()
        self.query = nn.Conv2d(in_dim, in_dim // 8, 1)
        self.key   = nn.Conv2d(in_dim, in_dim // 8, 1)
        self.value = nn.Conv2d(in_dim, in_dim, 1)
        self.gamma = nn.Parameter(torch.zeros(1))

    def forward(self, x):
        B, C, H, W = x.size()
        q = self.query(x).view(B, -1, H*W)
        k = self.key(x).view(B, -1, H*W)
        v = self.value(x).view(B, -1, H*W)

        attention = torch.softmax(torch.bmm(q.permute(0,2,1), k), dim=-1)
        out = torch.bmm(v, attention.permute(0,2,1))
        out = out.view(B, C, H, W)

        return self.gamma * out + x

Bu yapı sayesinde model, görüntü üzerindeki farklı bölgeler arasındaki ilişkileri öğrenerek sınıflandırma performansını artırmaktadır.


Kod Bloğu: Veri artırma (train transforms)

from torchvision import transforms

train_tfms = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),
    transforms.ToTensor()
])

val_tfms = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor()
])
            

Model Mimarileri

1) Base CNN

  • 3 adet Conv katmanı + ReLU + MaxPooling
  • 2 adet Fully Connected katman
  • Dropout: 0.5
  • Çıkış: 20 sınıf

2) CNN + Self-Attention (SE Bloğu)

Base CNN korunarak her konvolüsyon bloğunun sonuna Squeeze-and-Excitation eklenmiştir. SE bloğu kanallar üzerinde “dikkat” (attention) ağırlıkları üretir.

Kod Bloğu: Squeeze-and-Excitation (SE) bloğu (PyTorch)

import torch
import torch.nn as nn

class SEBlock(nn.Module):
    def __init__(self, channels, reduction=16):
        super().__init__()
        self.pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channels, channels // reduction),
            nn.ReLU(inplace=True),
            nn.Linear(channels // reduction, channels),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        w = self.pool(x).view(b, c)          # squeeze
        w = self.fc(w).view(b, c, 1, 1)      # excitation
        return x * w
            

3) EfficientNet B0 (Transfer Learning)

ImageNet üzerinde önceden eğitilmiş EfficientNet B0 kullanılmış; son katman 20 sınıfa göre değiştirilmiştir. Transfer learning ile küçük veri senaryosunda yüksek doğruluk hedeflenmiştir.

Kod Bloğu: EfficientNet B0 (Transfer Learning)

import torch.nn as nn
from torchvision import models

model = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT)

# son katmanı 20 sınıfa uyarlama
in_features = model.classifier[1].in_features
model.classifier[1] = nn.Linear(in_features, 20)
            

Model Performans Karşılaştırmaları

CNN, Self-Attention ve EfficientNet modellerinin doğruluk (accuracy) karşılaştırması

Eğitim ve doğrulama loss eğrilerinin karşılaştırılması

Öznitelik (Feature) Uzayı Analizi

Modelin öğrendiği temsil uzayını incelemek amacıyla, CNN katmanlarından elde edilen öznitelikler PCA ve UMAP yöntemleri ile 3 boyuta indirgenmiştir. Bu analiz, sınıflar arasındaki ayrışmanın görsel olarak değerlendirilmesini sağlamaktadır.

3D PCA – CNN Feature Embeddings

3D UMAP – CNN Feature Embeddings


Eğitim Ayarları

  • Epoch: 10
  • Loss: CrossEntropyLoss
  • Optimizer: Adam (CNN/SE için lr=0.001, EfficientNet TL için lr=0.0005)

Sonuçlar

Base CNN ve CNN+SE modelleri düşük veri miktarı ile (200 eğitim örneği) 20 sınıflı problem çözdüğü için doğruluk oranları sınırlı kalmıştır. Transfer learning yaklaşımı ile EfficientNet modeli belirgin şekilde daha yüksek test doğruluğu elde etmiştir.

Base CNN
Validation Accuracy: %36.50
Test Accuracy: %36.95
CNN + SE (Self-Attention)
Validation Accuracy: %33.50
Test Accuracy: %32.98
EfficientNet B0 (Transfer Learning)
Best Test Accuracy: %90.60

Kaynak Kod

Bu proje için GitHub linki paylaşılmamıştır. Proje çıktıları ve metodoloji rapor üzerinden dokümante edilmiştir.


Proje Raporu (PDF)

Bu projeye ait detaylı teknik raporu aşağıdan görüntüleyebilir veya yeni sekmede açabilirsiniz.

PDF’yi Yeni Sekmede Aç