Türk İşaret Dili Çevirisi
Kameradan gelen görüntüyü Türk İşaret Dili parmak alfabesine çeviren, gerçek zamanlı çalışan tanıma sistemi.
- Rol
- Süre
- Teknoloji

Problem
İşaret dili bilmeyen biriyle işaret dili kullanan biri arasındaki en basit alışveriş bile bir aracıya ihtiyaç duyuyor. Türkçe için hazır çözümler ise ya yok ya da İngiliz alfabesi üzerine kurulmuş; Türkçenin kendi harfleri (ç, ğ, ı, ö, ş, ü) hiçbirinde yer almıyor.
Hedef
Sıradan bir dizüstü kamerasıyla, ek donanım olmadan, harfleri gecikme hissettirmeden tanıyan bir model kurmak.
Mimari
- 01
Capture
Kameradan kare akışı; kare atlayarak yük dengeleme.
- OpenCV
- VideoCapture
- 02
Preprocess
El bölgesinin kırpılması, normalizasyon, yeniden boyutlandırma.
- ROI
- Normalize
- Resize
- 03
Model
Evrişimli sinir ağı; harf sınıflandırması.
- CNN
- TensorFlow
- Keras
- 04
Postprocess
Kare bazlı tahminlerin zaman penceresinde yumuşatılması.
- Smoothing
- Threshold
- 05
Output
Kararlı hale gelen harfin metne eklenmesi.
- Text buffer
Teknik kararlar
- SeçilenTensorFlow / KerasYerinePyTorch
Model mimarisini günde birkaç kez değiştiriyordum. Keras'ın kısa döngüsü bu aşamada PyTorch'un esnekliğinden daha çok işime yaradı.
- SeçilenEl bölgesini kırpmakYerineHam kareyi modele vermek
Ham kareyle model arka planı öğreniyordu — aynı işareti farklı bir odada yaptığımda tanımıyordu. Kırpma, veri setini büyütmeden doğruluğu ciddi biçimde toparladı.
- SeçilenZaman penceresinde yumuşatmaYerineKare başına tahmin
Kare başına tahminde çıktı titriyordu; el hareket ederken ekrana saçma harfler yazılıyordu. Son N karenin çoğunluğunu almak ekranı okunur hale getirdi.
Zorluklar
Birbirine benzeyen harfler
Parmak alfabesinde bazı harfler yalnızca başparmağın konumuyla ayrılıyor ve model bunları sürekli karıştırıyordu. Karışıklık matrisine bakıp yalnızca o sınıflar için hedefli veri topladım — genel veri setini büyütmek yerine doğru yeri büyütmek çok daha etkili oldu.
from collections import deque, Counter
class LetterStabilizer:
"""Kare başına tahminleri pencereler, kararlı harfi döndürür."""
def __init__(self, window: int = 12, min_ratio: float = 0.7):
self.buffer = deque(maxlen=window)
self.min_ratio = min_ratio
def push(self, letter: str, confidence: float) -> str | None:
if confidence < 0.6:
return None
self.buffer.append(letter)
if len(self.buffer) < self.buffer.maxlen:
return None
candidate, count = Counter(self.buffer).most_common(1)[0]
if count / len(self.buffer) >= self.min_ratio:
self.buffer.clear()
return candidate
return NoneGerçek zamanlılığı korumak
Her kareyi modele vermek dizüstünde görüntü akışını düşürüyordu. Kare atlayarak ve tahmini ayrı bir iş parçacığında çalıştırarak akışı modelden bağımsız hale getirdim; kamera akıcı kalırken tahmin kendi hızında ilerliyor.
Sayılarla
- 0
- Alfabedeki harf
- 0
- Kare yumuşatma penceresi
- 0
- Ek donanım gereksinimi
Çıkarımlar
Modelin sorununu anlamanın en hızlı yolu karışıklık matrisi. "Doğruluk yüzde şu kadar" cümlesi hiçbir şey söylemiyor; hangi sınıfın hangisiyle karıştığı her şeyi söylüyor.
Veri toplamak model ayarlamaktan çok daha uzun sürdü ve doğruluğa etkisi kat kat fazlaydı.