Yüz algılama, çoğu bilgisayarlı görü (computer vision) hattının giriş kapısında yer alır. Her görüntülü görüşme, fotoğraf galerisi ve güvenlik kamerası görüntüsü, başka bir şey gerçekleşmeden önce insan yüzlerini tespit etmeye dayanır. Ancak model seçimi genellikle mutsuz edici bir ödünleşim (trade-off) gerektirir. Ağır ağlar doğruluk sunar ancak pahalı GPU'lar ve kabin tipi soğutma sistemleri gerektirir. Daha küçük modeller mütevazı donanımlarda çalışır ancak genellikle küçük yüzlerde veya yüksek çözünürlüklü görüntülerde tıkanır. OpenCV Zoo'daki YuNet modeli bu kalıbı kırıyor. Gerçek projelerde yer almaya değer mi yoksa sadece kağıt üzerinde mi iyi görünüyor anlamak için farklı ölçeklerde kıyaslama (benchmarking) yaparak zaman harcadım.

YuNet Neden Daha Yakından İncelenmeyi Hak Ediyor

YuNet bir araştırma merakı değildir. OpenCV DNN modülü için optimize edilmiş önceden eğitilmiş modeller koleksiyonu olan OpenCV Zoo içinde yer alır. Test ettiğim özel varyant INT8 kuantizasyonu (quantization) kullanıyor; bu da ağırlıkların ve aktivasyonların alışılagelmiş 32-bit kayan noktalı sayılar yerine 8-bit tam sayılara sıkıştırıldığı anlamına gelir. Bu, küçük bir teknik not değildir. INT8 bellek bant genişliğini ciddi oranda düşürür, önbellek (cache) baskısını azaltır ve modern CPU'ların zorlanmadan çıkarım (inference) yapmasına olanak tanır. Bir dizüstü bilgisayar, uç cihaz (edge device) veya özel bir grafik kartı olmayan bir sunucu üzerinde geliştirme yapan herkes için bu verimlilik, sorunsuz bir iş akışı ile bir slayt gösterisi arasındaki farktır.

Mimarinin kendisi tasarım gereği hafiftir. Devasa omurga (backbone) ağlarının yükünden kaçınır ve sadece yüzleri konumlandırma görevine odaklanır. CPU ve pil bütçesinin takip (tracking), tanıma (recognition) veya video kodlama ile paylaşıldığı daha büyük bir uygulamaya algılamayı entegre etmeniz gerektiğinde bu disiplin meyvesini verir.

Kurulum

Tüm testler, Apple M4 Max çipli bir Mac Studio üzerinde gerçekleştirildi. Model dosyası, OpenCV Zoo deposundaki YuNet INT8 kuantize edilmiş ONNX sürümüydü. Önce 1280x720 bir görüntü üzerinde çıkarım hızını ölçtüm, ardından ölçeğin sonuçları nasıl etkilediğini anlamak için dört farklı giriş çözünürlüğü arasında tespit sayılarını karşılaştırdım.

Bu sayıları kendi makinenizde doğrulamak isterseniz, süreç tamamen tekrarlanabilir. Sparse depoyu çekmek ve kıyaslamayı çalıştırmak için aşağıdaki komutları çalıştırın:

git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run

Sparse checkout indirmeyi küçük tutar ve mise görev çalıştırıcısı (task runner) bağımlılıkları arka planda halleder. Python ortamlarıyla veya manuel paket kurulumlarıyla boğuşmanıza gerek yoktur.

Tutarlı Kalan Hız

1280x720 bir görüntüde, INT8 YuNet modeli çıkarım başına ortalama 9,21 milisaniye sürdü. En hızlı geçiş 8,03 ms olarak kaydedilirken, en yavaşı 10,47 ms'ye ulaştı. Bu, dikkat çekici derecede dar bir aralıktır. En iyi ve en kötü süreler arasında iki buçuk milisaniyeden daha az fark var.

Pratikte bu tutarlılık, gösteriş yapmaktan daha önemlidir. Gerçek zamanlı uygulamaların sadece düşük ortalama gecikmeye değil, öngörülebilir bir gecikmeye de ihtiyacı vardır. Bazen 50 ms süren bir model, bir web kamerası görüntüsünde gözle görülür takılmalara neden olur. YuNet sabit kalır. Bir sonraki kare gelmeden mevcut kareyi bitireceğine güvenebilirsiniz, bu da iş akışınızın geri kalanını planlamayı çok daha basit hale getirir.

Ölçek Farklılığı Gerçek Hikayeyi Ortaya Çıkarıyor

Model bir sahnedeki yüzlerin yarısını kaçırıyorsa, ham hızın pek bir anlamı yoktur. Bunu test etmek için aynı kaynak görüntüleri dört farklı çözünürlükte YuNet'e besledim. Sayılar net bir tablo çiziyor:

  • 320 x 180: 6 yüz tespit edildi
  • 640 x 360: 26 yüz tespit edildi
  • 1280 x 720: 38 yüz tespit edildi
  • 2560 x 1440: 52 yüz tespit edildi

Artış çarpıcıdır. 320 x 180 çözünürlükte sadece en büyük ve en yakın yüzler kaydedilir. 640 x 360'a çıktığınızda sayı dört katına çıkar. Tam 1440p çözünürlükte YuNet, en düşük çözünürlükte bulduğundan sekiz katından daha fazla yüz bulur.

Bu, alt örneklemenin (downsampling) detayları sezgilerin öngördüğünden daha hızlı yok etmesi nedeniyle olur. 1440p bir karede mütevazı bir alanı kaplayan bir yüz, 360p'de beş çarpı beş piksellik bir lekeye dönüşebilir. Yüz özellikleri modelin alıcı alanı (receptive field) altına düştüğünde, görünmez bir gürültü haline gelirler. Gözler kaşlarla birleşir. Burunlar kaybolur. YuNet'in tutunabileceği hiçbir şey kalmaz.

Pratik sonuç hatırlanmaya değerdir. Kameranız bir sınıfın, konferans salonunun veya bir sokak köşesinin geniş açılı görüntüsünü yakalıyorsa, modele yeterli piksel vermediğiniz sürece uzak yüzler görünmeyecektir. Burada çözünürlük sadece görüntü kalitesiyle ilgili değildir; doğrudan geri çağırma (recall) oranı üzerinde bir kaldıraç görevi görür.

Gerçekten İhtiyacınız Olan Yeniden Boyutlandırma Stratejisi

YuNet o kadar hızlıdır ki alışkanlık gereği girdinizi 320 x 240 boyutuna düşürmenize gerek kalmaz. M4 Max üzerinde, 2560 x 1440 çözünürlük bile özel bir GPU olmadan çalışır. Bu durum, bir veri hattını (pipeline) nasıl tasarlamanız gerektiğini değiştirir.

Her kareyi küçük ve sabit bir boyuta zorlamak yerine, giriş çözünürlüğünüzü neyi bulmaya çalıştığınıza bağlı olarak seçin. Eğer sadece kameranın tam önündeki kişiyle ilgileniyorsanız, 720p hatta 640p bile fazlasıyla yeterlidir. Büyük bir salondaki her katılımcıyı kataloglamanız gerekiyorsa, modele daha yüksek çözünürlüklü bir kırpılmış görüntü veya tam yerel kareyi besleyin. YuNet hafif olduğu için bu seçimi yapacak alanınız vardır. 200 ms'lik bir gecikmeden kaçınmak için tek bir ön ayara mahkum değilsiniz.

Bir uyarı hala mevcuttur. Model, hala giriş tensörüne göre yüz boyutuna bağlıdır. Burada sihirli bir ölçek değişmezliği (scale invariance) yoktur. Küçük yüzler, yeterli piksel kaplamadıkları sürece görünmez kalırlar. Çözüm mekaniktir: Uzaktaki nesneleri ararken çıkarımdan (inference) önce kaynak görüntünüzü yukarı doğru yeniden boyutlandırın, ardından elde edilen sınırlayıcı kutuları (bounding boxes) orijinal koordinatlara geri eşleyin. YuNet, bu adımı gerçekleştirebilmeniz için size gereken hız bütçesini sağlar.

Bu, Teknoloji Yığınınızda Nereye Oturuyor?

YuNet, akla gelebilecek her yüz görevi için bir çözüm değildir. Yoğun oklüzyon (engellenme), aşırı profil açıları veya 3D mesh çıkarımı kapsamı dışındadır. Ancak fotoğraflarda ve video akışlarında yüzlerin yerini belirleme gibi temel işler için ideal bir noktadadır. Gerçek zamanlı web kamerası uygulamaları, otomatik fotoğraf ayıklama araçları ve mütevazı gömülü sistemlerin tamamı, standart CPU'larda hızlı çalışan bir dedektörden fayda sağlar.

INT8 ONNX formatı da dağıtımı (deployment) zahmetsiz hale getirir. Hedef cihaza PyTorch veya TensorFlow kurmanıza gerek yoktur. OpenCV'nin DNN modülü modeli doğrudan yükler; bu da ikili dosyanızı (binary) küçük, bağımlılık ağacınızı (dependency tree) ise sığ tutar.

Özetle

YuNet, yüz tespitinin endüstriyel donanım veya hantal çerçeveler (frameworks) gerektirmediğini kanıtlıyor. Rakamlar net bir şekilde şunu söylüyor: 720p bir kare için on milisaniyenin altında bir süre ve çözünürlük arttıkça tespit sayısında doğrudan, öngörülebilir bir artış. Orta düzey çözünürlükte maksimum hız mı yoksa daha yüksek ölçekte daha geniş kapsam mı istediğinizi seçebilirsiniz ve model bu seçiminiz için sizi cezalandırmayacaktır.

Gerçek dünya görüntüleriyle temas eden herhangi bir şey inşa ediyorsanız, yukarıdaki adımları kendi donanımınızda çalıştırın. Kendi görüntülerinize karşı test edin. Ardından, yeniden boyutlandırma mantığınızı gerçekten bulmanız gereken yüzlerle eşleşecek şekilde ayarlayın. Hız, yalnızca onu yönlendirebildiğinizde yararlıdır. YuNet size hem hızı hem de kontrolü sağlar.