ROBOTEK 2025: Ses ve Görüntü İşleme Yarışmasında Birinci Olduk!
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
- Sınırlı Veri: Her kişi için yalnızca bir avuç ses dosyası
- Veri Çeşitliliğinin Eksikliği: Aynı ses kalitesi ve ortam koşulları
- Overfitting Riski: Küçük veri setinde modelin ezberlemesi
- Gerçek Zamanlı Performans: Tahmin hızının da önemli olması
İçindekiler
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:
- Gradient Vanishing Problemini Çözüyor: Derin ağlarda eğitim sırasında gradyanlar sıfıra yaklaşmıyor
- Residual Connections: Kısayol bağlantıları sayesinde daha kolay öğrenme
- 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ı
| Metrik | Değer |
|---|---|
| Doğruluk | 100.0% |
| Precision | 1.0 |
| Recall | 1.0 |
| F1-Score | 1.0 |
| Macro F1-Score | 1.0 |
| Kayıp | 0.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
-
Ses Dosyası Yükleme
- Tek dosya veya toplu yükleme
- Dosya validasyonu
-
Real-Time Tahmin
- Dosya seçilince otomatik tahmin
- Sonuçları grafik gösterim
-
İstatistik Gösterimi
- Confusion Matrix
- Precision-Recall Grafiği
- F1-Score tablosu
-
Kişi Profilleri
- Her kişiye ait resim
- Metadata bilgileri
-
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?
-
Ses Değişkenliği
- Aynı kişi farklı zamanlarda farklı ses tonunda konuşuyor
- Hastalık, yorgunluk, stres ses kalitesini değiştiriyor
-
Ortam Gürültüsü
- Arka planda gürültü olabiliyor
- Farklı mikrofon kaliteleri var
- Yankı efektleri etkiliyor
-
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
- Uygun model mimarisi seçimi (ResNet)
- Agresif veri artırma stratejisi
- Modern eğitim teknikleri (Mixed Precision, OneCycleLR)
- Kapsamlı hyperparameter tuning
- 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
- He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. CVPR
- Bengio, Y., Simard, P., & Frasconi, P. (1994). Learning long-term dependencies with gradient descent. IEEE Transactions on Neural Networks
- Ioffe, S., & Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training. ICML
- Smith, L. N. (2019). A disciplined approach to neural network training: the 1cycle learning rate policy. arXiv
- 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."