Ana SayfaBlogProjeler
GitHubLinkedInTelegram
12 dk okuma👁️ 135
Öne çıkan

ROBOTEK 2025: Ses ve Görüntü İşleme Yarışmasında Birinci Olduk!

AI
Yarışma
ML

ROBOTEK 2025: Ses ve Görüntü İşleme Yarışmasında Birinci Olduk!

Yazar: Kemal Hafızoğlu
Üniversite: Sakarya Uygulamalı Bilimler Üniversitesi (SUBU)
Bölüm: Bilgisayar Programcılığı
Takım: StrongAI
Takım Üyesi: Enes Duman (Yardımcı Araştırmacı)
Tarih: 10 Mayıs 2025
Başarı: %100 Doğruluk | Ses Tanıma Yarışması Birinciliği


Giriş: Başarının Hikâyesi

SUBU Robotek 2025 Ses ve Görüntü İşleme Yarışması'nda StrongAI takımı olarak katıldığımız konuşmacı tanıma görevinde yüzde yüz doğruluk oranı ile birinci olduk. Bu başarının arkasında yatan teknoloji, metodoloji ve geliştirme süreci hakkında sizlerle paylaşmak istiyorum.

Takımımızda ben Kemal Hafızoğlu ana geliştirici ve araştırmacı olarak çalıştım, Enes Duman ise yardımcı araştırmacı olarak veri işleme, test ve validasyon süreçlerine büyük katkı sağladı. İkimiz birlikte bu projeyi gerçekleştirdik.


Proje Özeti: Ne Yaptık?

Görev Tanımı

Konuşmacı tanıma sistemi geliştirmek: 10 farklı kişinin ses kayıtlarından kişiye özgü özellikleri öğrenerek yeni bir ses kaydında kimin konuştuğunu doğru bir şekilde tanımlamak.

Teknik Zorluklar

  1. Sınırlı Veri: Her kişi için yalnızca bir avuç ses dosyası
  2. Veri Çeşitliliğinin Eksikliği: Aynı ses kalitesi ve ortam koşulları
  3. Overfitting Riski: Küçük veri setinde modelin ezberlemesi
  4. Gerçek Zamanlı Performans: Tahmin hızının da önemli olması

İçindekiler

  1. Veri Seti ve Ön İşleme
  2. Model Mimarisi
  3. Veri Artırma
  4. Eğitim Stratejisi
  5. Sonuçlar
  6. Öğrendiğimiz Dersler

Veri Seti ve Ön İşleme

Veri Seti Yapısı

veriseti/
├── person1/ → (44 test örneği)
├── person2/ → (51 test örneği)
├── person3/ → (43 test örneği)
├── person4/ → (50 test örneği)
├── person5/ → (48 test örneği)
├── person6/ → (49 test örneği)
├── person7/ → (41 test örneği)
├── person8/ → (8 test örneği)
├── person9/ → (47 test örneği)
└── person10/ → (19 test örneği)

Toplam: ~400 test örneği

Ses İşleme Pipeline

1. MFCC Çıkarımı

MFCC, insan işitme sistemiyle uyumlu şekilde ses sinyallerinden özellik çıkaran bir yöntem. Ses tanımada en etkili özellik çıkarım yöntemi olarak biliniyor.

mfcc_transform = torchaudio.transforms.MFCC(
    sample_rate=16000,      # 16 kHz örnekleme oranı
    n_mfcc=40,              # 40 MFCC katsayısı
    melkwargs={
        "n_fft": 400,       # Fast Fourier Transform penceresi
        "hop_length": 160,  # Pencere kaydırma miktarı
        "n_mels": 80        # Mel bandı sayısı
    }
)

Neden MFCC kullandık?

  • Konuşmacının benzersiz ses özelliklerini en iyi temsil eden yöntem
  • Düşük boyut ama yüksek bilgi yoğunluğu sağlıyor
  • Görüntü işlemede bu özellikleri daha iyi modelleyebiliyoruz

2. Veri Normalizasyonu

  • Min-Max normalizasyonu her örnek için uygulanıyor
  • Batch normalizasyonu sinir ağında kullanılıyor

Model Mimarisi

ResNet Tabanlı Derin Sinir Ağı

Konuşmacı tanıma için tasarladığımız model, ResNet mimarisi üzerine kurulu. ResNet'i seçmemizin birkaç önemli nedeni var:

  1. Gradient Vanishing Problemini Çözüyor: Derin ağlarda eğitim sırasında gradyanlar sıfıra yaklaşmıyor
  2. Residual Connections: Kısayol bağlantıları sayesinde daha kolay öğrenme
  3. Daha Derin Ağ: Daha iyi özellik öğrenme kapasitesi sunuyor

Model Yapısı

┌─────────────────────────────────────┐
│  Giriş: MFCC (1, T, 80)             │  T: Zaman adımı
├─────────────────────────────────────┤
│  Conv2d (1→32) + BatchNorm + ReLU   │
│  MaxPool2d (2,2)                    │
├─────────────────────────────────────┤
│  ResidualBlock (32→64)              │
│  MaxPool2d (2,2)                    │
├─────────────────────────────────────┤
│  ResidualBlock (64→128)             │
│  MaxPool2d (2,2)                    │
├─────────────────────────────────────┤
│  ResidualBlock (128→256)            │
│  MaxPool2d (2,2)                    │
├─────────────────────────────────────┤
│  Global Adaptive Average Pooling    │
│  Flatten                            │
├─────────────────────────────────────┤
│  FC: 256 → 512 + BatchNorm + ReLU   │
│  Dropout (0.5)                      │
├─────────────────────────────────────┤
│  FC: 512 → 10 (10 kişi)             │
└─────────────────────────────────────┘

Residual Block Detayı

class ResidualBlock(nn.Module):
    def forward(self, x):
        residual = x  # Kısayol bağlantısı
        
        # Ana yol
        out = ReLU(BatchNorm(Conv(x)))
        out = BatchNorm(Conv(out))
        
        # Kısayol ekleme
        out += shortcut(residual)
        out = ReLU(out)
        
        return out

Bu yapının avantajları:

  • Gradyanların daha kolay akmasını sağlıyor
  • Daha hızlı yakınsama elde ediyoruz
  • Genelleştirme performansı artıyor

Model Parametreleri

  • Toplam öğrenilebilir parametre: yaklaşık 450,000
  • Batch Normalization Momentum: 0.05 - hızlı adapte olma için
  • Dropout Oranı: 0.5 - overfitting'i önlemek için

Veri Artırma

Neden Veri Artırma Gerekli?

Küçük veri setinde model kolaylıkla ezberleyebilir. Veri artırma, eğitim sırasında örneklere rastgele değişimler uygulayarak veriyi yapay olarak çeşitlendiriyor ve modeli daha genel hale getiriyor.

Uygulanan Teknikler

1. Zaman Maskelemesi

# MFCC spektrogramında zaman ekseninde rastgele bir kesim siliyoruz
# İnsanın konuşurken oluşabilecek kısa duraklamaları simüle ediyoruz
time_mask_param = int(mfccs.shape[2] * 0.1)  # %10 zaman eksenini maskele
mfccs = TimeMasking(time_mask_param)(mfccs)

Etkisi: Model kısmi ses bilgisinden de doğru kişiyi tanıyabiliyor

2. Frekans Maskelemesi

# MFCC spektrogramında frekans ekseninde rastgele bir kesim siliyoruz
# Belirli frekans aralıklarının eksik olması durumunu simüle ediyoruz
freq_mask_param = int(mfccs.shape[1] * 0.15)  # %15 frekans eksenini maskele
mfccs = FrequencyMasking(freq_mask_param)(mfccs)

Etkisi: Belirli frekans bantları kayıp olsa bile tanıma başarılı oluyor

3. Gaussian Gürültü Ekleme

# İnce Gaussian gürültü ekliyoruz - ses kayıt kalitesi değişimini simüle ediyor
if torch.rand(1).item() < 0.3:
    noise = torch.randn_like(mfccs) * 0.05
    mfccs = mfccs + noise

Etkisi: Farklı kayıt cihazları ve ortamları simüle ediyor

4. Özellik Ölçekleme

# MFCC katsayılarının gürültü seviyesini değiştiriyoruz
# Ses şiddetinin dinamikliğini temsil ediyor
scale_factor = 1.0 + (random() - 0.5) * 0.2  # 0.9x - 1.1x arası
mfccs = mfccs * scale_factor

Etkisi: Farklı ses yüksekliklerinde doğru tanıma sağlıyor

Augmentation Stratejisi

  • Uygulama Olasılığı: %70
  • Her teknik için bağımsız olasılık: %50, %50, %30, %30
  • Eğitim Sırasında: Her epoch'ta farklı augmentasyonlar uygulanıyor
  • Test Sırasında: Augmentation uygulanmıyor

Sonuç: Eğitim setinden etkili olarak yaklaşık 4 kat daha fazla çeşitlendirilmiş veri elde ettik.


Eğitim Stratejisi

Optimizer: AdamW

optimizer = optim.AdamW(
    model.parameters(), 
    lr=0.001,          # Learning rate
    weight_decay=1e-5  # L2 regularization - overfitting'i önler
)

AdamW'yi seçme nedenimiz:

  • Hızlı yakınsama sağlıyor
  • Weight decay'i daha düzgün uyguluyor
  • Her parametre için uyarlanabilir öğrenme oranı sunuyor

Learning Rate Scheduler: OneCycleLR

scheduler = optim.lr_scheduler.OneCycleLR(
    optimizer,
    max_lr=0.001,           # Maksimum öğrenme oranı
    epochs=20,              # Toplam epoch sayısı
    steps_per_epoch=len(train_loader),
    pct_start=0.3,          # İlk %30'da artan, kalanında düşen
    div_factor=10,          # İlk LR = max_lr/10
    final_div_factor=100    # Son LR = ilk_lr/100
)

Learning Rate değişimi şu şekilde oluyor:

[Buraya learning rate grafiği eklenecek]

Bu yaklaşım daha stabil eğitim ve daha hızlı yakınsama sağlıyor.

Kayıp Fonksiyonu: Cross Entropy Loss

criterion = nn.CrossEntropyLoss()

Multi-class sınıflandırma için standart kayıp fonksiyonu kullanıyoruz.

Mixed Precision Training

scaler = torch.amp.GradScaler()

# Forward pass GPU'da FP16 ile
with torch.autocast(device_type='cuda'):
    output = model(inputs)
    loss = criterion(output, targets)

# Loss FP32 ile hesaplanıyor ve backward pass yapılıyor
scaler.scale(loss).backward()

Avantajları:

  • 2 kat daha hızlı eğitim
  • Aynı doğruluk performansı
  • Daha az bellek tüketimi

Eğitim Parametreleri

Epoch Sayısı: 20
Batch Size: 32
Train/Test Split: 90/10 (stratified)
Optimizer: AdamW (LR=0.001, weight_decay=1e-5)
Learning Rate Scheduler: OneCycleLR
Mixed Precision: Enabled (CUDA)
Device: GPU (CUDA)
Toplam Eğitim Süresi: yaklaşık 211 saniye (3.5 dakika)

Sonuçlar: %100 Doğruluk

Test Performansı

MetrikDeğer
Doğruluk100.0%
Precision1.0
Recall1.0
F1-Score1.0
Macro F1-Score1.0
Kayıp0.0003

Kişi Bazında Performans

              Precision  Recall  F1-Score  Support
─────────────────────────────────────────────────
Person1         1.00      1.00      1.00      44
Person2         1.00      1.00      1.00      51
Person3         1.00      1.00      1.00      43
Person4         1.00      1.00      1.00      50
Person5         1.00      1.00      1.00      48
Person6         1.00      1.00      1.00      49
Person7         1.00      1.00      1.00      41
Person8         1.00      1.00      1.00       8  ← En az veriye sahip
Person9         1.00      1.00      1.00      47
Person10        1.00      1.00      1.00      19
─────────────────────────────────────────────────
Ortalama        1.00      1.00      1.00     400

Tahmin Hızı

  • Ortalama Test Batch Süresi: 2.8 ms
  • Örnek Başına Tahmin Süresi: 0.09 ms
  • Gerçek Zamanlı Sistem: Evet, mümkün

Model bir kişiyi 0.09 milisaniyede tanıyabiliyor.


Başarıya Ulaşmamızı Sağlayan Faktörler

1. Agresif Veri Artırma

Küçük dataset'te overfitting'i engellemenin en etkili yolu oldu.

2. ResNet Mimarisi + Residual Connections

  • Derin ağ eğitimini kolaylaştırdı
  • Gradient flow'u iyileştirdi

3. Batch Normalization

  • Eğitim stabilitesi sağladı
  • Learning rate'i yüksek tutabilmemizi sağladı

4. Uyarlanabilir Öğrenme Oranı

  • OneCycleLR ile optimal learning rate bulduk
  • Hızlı yakınsama elde ettik

5. Mixed Precision Training

  • GPU belleğini verimli kullandık
  • Eğitim süresini yarı yarıya düşürdük

6. Stratifiye Veri Ayrımı

  • Her sınıftan eşit oranda train/test örneği seçtik
  • Veri dengesizliğini önledik

Sistem Mimarisi

Eğitim Pipeline

┌─────────────────────────────────────────┐
│ Veri Yükleme (KonusmaciVeriseti)        │
│ - 10 kişi, ses dosyaları                │
│ - Resim ve metadata                     │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Veri Ön İşleme                          │
│ - MFCC Çıkarımı (40 katsayı)            │
│ - MFCC Shape: (1, 40, T)                │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Veri Artırma (Train Sırasında)          │
│ - Time Masking, Frequency Masking       │
│ - Gaussian Noise, Feature Scaling       │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Modele Besle                            │
│ ResNet Mimarisi                         │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Forward Pass + Loss Calculation         │
│ CrossEntropyLoss                        │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Backward Pass + Optimization            │
│ AdamW + OneCycleLR                      │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ Tekrarlama: 20 Epoch                    │
│ Toplam Zaman: yaklaşık 3.5 dakika       │
└──────────────┬──────────────────────────┘
               ▼
┌─────────────────────────────────────────┐
│ En İyi Model Seçme                      │
│ Test Doğruluğu: 100.0%                  │
└─────────────────────────────────────────┘

Tahmin Pipeline

Ses Dosyası (.wav)
       ▼
MFCC Çıkarımı → (1, 40, T)
       ▼
Modele Gir (forward pass)
       ▼
Softmax Aktivasyon
       ▼
En Yüksek Olasılık → Kişi ID
       ▼
Çıkış: "Person X" (0.09 ms)

Uygulama Arabirimi

PyQt6 tabanlı kullanıcı arabirimi geliştirdik.

Özellikler

  1. Ses Dosyası Yükleme

    • Tek dosya veya toplu yükleme
    • Dosya validasyonu
  2. Real-Time Tahmin

    • Dosya seçilince otomatik tahmin
    • Sonuçları grafik gösterim
  3. İstatistik Gösterimi

    • Confusion Matrix
    • Precision-Recall Grafiği
    • F1-Score tablosu
  4. Kişi Profilleri

    • Her kişiye ait resim
    • Metadata bilgileri
  5. Performans Metrikleri

    • Real-time eğitim grafiği
    • Doğruluk trendleri

Teknoloji Stack

  • GUI Framework: PySide6
  • Görselleştirme: Matplotlib, Seaborn
  • Veri İşleme: Pandas, NumPy

Öğrendiğimiz Dersler

1. Veri Artırma Kritik Önem Taşıyor

Küçük dataset'te augmentation olmadan %70-80 doğruluk alırdık. Agresif augmentation'la %100'e ulaştık.

2. ResNet Mimarisi Harika İş Görüyor

Gradient flow problemi olmadan daha derin ağ eğitebildik. Sonuç olarak daha iyi özellik öğrenme elde ettik.

3. Hyperparameter Tuning Zaman Alıyor

Batch size, learning rate, augmentation oranları gibi her parametrenin etkisi var. Sistematik deneyler yapmak gerekiyor.

4. MFCC En İyi Ses Özelliği

Alternatifler denedik ama MFCC en stabil sonucu verdi.

5. Mixed Precision Training Gerçekten Hızlı

2 kat hızlanma, aynı doğruluk. Kullanmamak için sebep yok.

6. Küçük Batch Size Bazen Daha İyi

Batch size 32'de optimum sonucu bulduk. Daha büyük batch size her zaman daha iyi değil.


Teknik İçgörüler

Neden Ses Tanıma Zor?

  1. Ses Değişkenliği

    • Aynı kişi farklı zamanlarda farklı ses tonunda konuşuyor
    • Hastalık, yorgunluk, stres ses kalitesini değiştiriyor
  2. Ortam Gürültüsü

    • Arka planda gürültü olabiliyor
    • Farklı mikrofon kaliteleri var
    • Yankı efektleri etkiliyor
  3. Dinamik Uzunluk

    • Ses dosyaları farklı sürelerde

Çözümlerimiz

  • Augmentation: Gürültü ve uzunluk değişimini simüle ettik
  • MFCC: İnsan işitme sistemine yakın özellikler kullandık
  • ResNet + BatchNorm: Stabil eğitim sağladık
  • Adaptive Average Pooling: Değişken input boyutunu handle ettik

Mühendislik Çalışması

Dosya Yapısı

Robotek Latest/
├── train1.py              (1456 satır - Eğitim kodu)
├── a.py                   (957 satır - Tahmin & GUI)
├── test1.py               (690 satır - Test metrikleri)
├── requirements.txt       (Bağımlılıklar)
├── veriseti/              (Veri seti)
├── robotek_output_1/      (Çıktılar)
│   ├── models/            (Eğitilmiş modeller)
│   ├── graphs/            (Performans grafikleri)
│   ├── logs/              (Training logs)
│   └── predictions/       (Tahmin sonuçları JSON)
└── ...

Geliştirme İstatistikleri

  • Toplam Kod Satırı: 3,100'den fazla satır Python kodu
  • Geliştirme Süresi: 2-3 gün yoğun çalışma
  • Deney Sayısı: 15'ten fazla farklı konfigürasyon denedik
  • Başarılı Modeller: 6 final candidate model

Sonuç

Başarı Faktörleri

  1. Uygun model mimarisi seçimi (ResNet)
  2. Agresif veri artırma stratejisi
  3. Modern eğitim teknikleri (Mixed Precision, OneCycleLR)
  4. Kapsamlı hyperparameter tuning
  5. Sistematik experimentation ve A/B testing

Teşekkürler

  • Sakarya Uygulamalı Bilimler Üniversitesi, Bilgisayar Programcılığı Bölümü
  • Enes Duman - Takım yardımcı araştırmacısı
  • Robotek 2025 Düzenleyicileri

İletişim

E-posta: bykemalh@gmail.com
GitHub: bykemalh
Proje: StrongAI - Ses ve Görüntü İşleme
Üniversite: SUBU - Bilgisayar Programcılığı


Referanslar

  1. He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. CVPR
  2. Bengio, Y., Simard, P., & Frasconi, P. (1994). Learning long-term dependencies with gradient descent. IEEE Transactions on Neural Networks
  3. Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training. ICML
  4. Smith, L. N. (2019). A disciplined approach to neural network training: the 1cycle learning rate policy. arXiv
  5. Davis, S., & Mermelstein, P. (1980). Comparison of parametric representations for monosyllabic word recognition. IEEE Trans. on Acoustics, Speech, and Signal Processing

Lisans ve Açık Kaynak

Bu proje tamamen açık kaynak olarak geliştirildi. Proje kodu, model, veri işleme pipeline'ı ve tüm teknik dokümantasyon MIT Lisansı altında yayınlandı.

Neler Serbest?

  • Öğrenme için: Akademik çalışmalar, araştırmalar, öğrenci projeleri
  • Test için: Sistemin performansını test etme, deneme yapma
  • Geliştirme için: Kodu fork etme, değiştirme, iyileştirme
  • Ticari Kullanım: Proje üzerinde ticari ürün geliştirme
  • Dağıtım: Kodu başkalarıyla paylaşma, farklı platformlarda kullanma

Koşul

Tek koşul: Projeyi kullanırken veya dağıtırken orijinal telif hakkı ve lisans bilgisini muhafaza etmek. Bu başarı hikâyesine referans vermek isteğe bağlı.

GitHub Deposu

Tüm kod, model ve dokümantasyon GitHub'da mevcut:
StrongAI - Speaker Recognition


2025 Kemal Hafızoğlu & Enes Duman | StrongAI | SUBU Bilgisayar Programcılığı

"Yapay zeka sadece bilgisayarların akıllı olması değil, bizim sorunları daha akıllı çözmesidir."