Okullar için Robotik ve Mühendislik · anaokulundan liseye

11. ünite / 12

Yüz ve insan algılama: Haar kademesi, HOG ve modern algılayıcılar

Integral görüntü, Haar benzeri öznitelikler, kayan pencere ve kademe, NMS; HOG + SVM ile insan; cihaz içi derin ağlar (MediaPipe).

Bu ünitenin sonunda

  • Integral görüntüyle herhangi bir dikdörtgen toplamının dört okumayla bulunduğunu göstermek
  • Kayan pencere, ölçek piramidi ve kademenin (cascade) neden hızlı olduğunu açıklamak
  • Örtüşen bulguları birleştirmek (minNeighbors, NMS)
  • Klasik algılayıcıları modern derin ağlarla doğruluk, hız ve gizlilik açısından karşılaştırmak

Ders notları

2001'de Viola ve Jones yüzü gerçek zamanlı bulan ilk yöntemi yayımladı; bugün hâlâ cv2.CascadeClassifier olarak OpenCV'dedir. Üç fikirden oluşur.

1. Integral görüntü

I(x, y), sol üst köşeden (x, y)'ye kadar olan dikdörtgenin toplamıdır. Herhangi bir dikdörtgenin toplamı dört okumadır:

ΣABCD = I(D) − I(B) − I(C) + I(A)

Pencere boyu ne olursa olsun maliyet aynıdır.

2. Haar benzeri öznitelikler

Bir öznitelik, açık dikdörtgenlerin ortalaması eksi koyu dikdörtgenlerin ortalamasıdır: "göz bandı yanaklardan koyu", "burun köprüsü gözlerden açık". Gerçek kademede bu öznitelikler AdaBoost ile binlerce aday arasından öğrenilir; oyun alanında üç tanesini elle seçtik.

3. Kademe

Pencere birçok konum ve ölçekte gezer: 320×240 bir karede on binlerce pencere. Kademede her aşama ucuz bir testtir; bir aşamayı geçemeyen pencere hemen atılır. Pencerelerin çoğu ilk bir iki aşamada elenir, pahalı aşamalara az pencere ulaşır. Sonunda örtüşen bulgular birleştirilir: minNeighbors, bir bulgunun kabul edilmesi için kaç örtüşen pencere gerektiğidir.

HOG ve derin ağlar

HOG (yönlü gradyan histogramı) + doğrusal SVM, ayakta insan algılamanın klasik yoludur (HOGDescriptor_getDefaultPeopleDetector). Bugün yüz ve insan algılamada küçük derin ağlar (BlazeFace, MediaPipe, YuNet) kullanılır: yan profile, kötü ışığa ve kısmi örtülmeye çok daha dayanıklıdır ve telefonda bile gerçek zamanlıdır. Aşağıdaki canlı araç, Robotun Gözleri'ndeki MediaPipe yüz modelini kameranda, cihaz içinde çalıştırır.

Oyun alanları

Haar benzeri öznitelikler ve integral görüntü

Viola-Jones fikri: integral görüntüyle herhangi bir dikdörtgenin toplamı dört okumayla bulunur. Üç basit öznitelik (gözler yanaklardan koyu, burun köprüsü gözlerden açık…) kayan pencerede sırayla sınanır; erken eleyen kademe pencerelerin çoğunu ucuza atar.

Yeşil: birleştirilmiş bulgu; mavi koyu, beyaz açık dikdörtgenler
denenen pencere: 10277 aşama 1: 10277 → 362 aşama 2: 362 → 51 aşama 3: 51 → 3 bulgu (birleşik): 1

Canlı yüz algılama (MediaPipe, cihaz içi)

Robotun Gözleri'ndeki MediaPipe yüz modeli kameranda çalışır; görüntü cihazından çıkmaz. Yüz noktalarından sınırlayıcı kutu ve göz arası uzaklık hesaplanır.

📷 Bu oyun kamerayla oynanır. Görüntün bu cihazdan hiçbir yere gitmez.

Kamerayı başlat. Model ve görüntü cihazında kalır.

Uzaklık, ortalama 6,3 cm göz arası ve yaklaşık 600 px odak uzaklığı varsayımıyla kaba bir kestirimdir (iğne deliği kamera modeli).

Kendin dene

Haar aracında çizgi yüz sahnesini aç ve aşama aşama kaç pencerenin elendiğini oku. "Göz" eşiğini düşürünce yanlış bulgular nerede çıkıyor? Sayfa sahnesine geç: yazı satırları neden yüz sanılıyor? minNeighbors'ı 1'den 4'e çıkar. Sonra canlı yüz algılamayı aç: başını yana çevir, elinle yüzünün yarısını kapat; MediaPipe ne zaman kaybediyor?

Kod

Python: integral görüntü ve bir Haar benzeri öznitelik
import cv2
import numpy as np

img = cv2.imread('girdi.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ii = cv2.integral(gray)                           # (h+1) x (w+1), ilk satır ve sütun 0

def rect_sum(x, y, w, h):                         # her boyutta dört okuma
    return int(ii[y + h, x + w] - ii[y, x + w] - ii[y + h, x] + ii[y, x])

h, w = gray.shape
x, y, s = w // 4, h // 4, min(w, h) // 4
assert rect_sum(x, y, s, s) == int(gray[y: y + s, x: x + s].sum())   # doğrudan toplamla aynı

# iki dikdörtgenli öznitelik: üst yarı koyu, alt yarı açık (göz ve yanak gibi)
def haar_two(x, y, w, h):
    top, bottom = rect_sum(x, y, w, h // 2), rect_sum(x, y + h // 2, w, h // 2)
    return (bottom - top) / (w * h // 2)

scores = [(haar_two(xx, yy, 24, 24), xx, yy) for yy in range(0, h - 24, 4) for xx in range(0, w - 24, 4)]
best = max(scores)
print('pencere sayısı:', len(scores), 'en güçlü yanıt:', round(best[0], 1), 'at', best[1:])
out = img.copy()
cv2.rectangle(out, best[1:], (best[1] + 24, best[2] + 24), (0, 255, 0), 2)
cv2.imwrite('cikti.png', out)
Python: Haar kademesiyle yüz, HOG ile insan algılama
import cv2

face = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())   # 64x128 pencere, doğrusal SVM

cap = cv2.VideoCapture(0)                         # görüntü bilgisayardan çıkmaz
while True:
    ok, frame = cap.read()
    if not ok:
        break
    gray = cv2.equalizeHist(cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY))
    faces = face.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(60, 60))
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    people, _ = hog.detectMultiScale(frame, winStride=(8, 8), scale=1.05)
    for (x, y, w, h) in people:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
    cv2.imshow('detect', frame)                   # kayıt yok: kare yalnız ekranda
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Sık yapılan hatalar

  • Haar kademesini renkli görüntüde çalıştırmak: gri görüntü ister; önce equalizeHist çoğu zaman yardımcı olur.
  • minNeighbors'ı 0–1 bırakmak: her yerde yanlış bulgu çıkar. 3–6 tipik.
  • Ön yüz kademesinin yan profili bulmasını beklemek: her kademe yalnız eğitildiği görünüşü bulur.
  • Yüz algılamayı yüz tanımayla karıştırmak: algılama "burada bir yüz var" der, kim olduğunu söylemez. Kişisel veri ve izin kuralları ayrıca geçerlidir.

Yazılım mühendisliği bağlantısı

Algılayıcılar iki tür hata yapar: yanlış pozitif (olmayan yüz) ve yanlış negatif (kaçan yüz). Hangisinin daha pahalı olduğu uygulamaya bağlıdır.

  • Etiketli küçük bir test seti kur ve kesinlik/duyarlılık (precision/recall) hesapla; eşik değişikliklerini bu sayılarla değerlendir.
  • Görüntü işleyen her özellik için gizlilik tasarımı: görüntü cihazda kalıyor mu, kaydediliyor mu, kim erişiyor? KVKK açısından yazılı tut.

Kendini sına

  1. Integral görüntüyle 50×50 ve 5×5 bir dikdörtgenin toplamını bulmanın maliyeti nasıl karşılaştırılır?

  2. Kademenin (cascade) hızlı olmasının asıl nedeni nedir?

  3. detectMultiScale'deki minNeighbors artırılınca genellikle ne olur?

  4. Modern derin ağ tabanlı yüz algılayıcıların Haar kademesine göre en önemli üstünlüğü hangisidir?

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç