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

Bölüm 7 · Görüntü işleme · Ders 32

Yüz doğrulama: gömme, benzerlik, eşik

Kosinüs benzerliği ve yanlış kabul / yanlış ret dengesi

Veri. Laboratuvar kapısındaki robot, içeri girmek isteyenin yüzünü kayıtlı yüzle karşılaştırıyor. Laboratuvarda 6 kişi çalışıyor; her birinden farklı ışık ve açılarda 15 fotoğraf var, toplam 90. Bir sinir ağı her fotoğrafı 64 sayılık bir gömme vektörüne çevirmiş (burada benzetim: kişi başına bir merkez yön, üstüne fotoğrafın kalitesine göre gürültü). 4005 fotoğraf çiftinin 630'u aynı kişiye, 3375'i farklı kişilere ait.

kişi 1: 15 fotoğraf → 15 gömme90 yüz · 64 boyut · eşik 0,42
1 / 68
yuz.pypython
  1. import numpy as np
  2. rng = np.random.default_rng(1)
  3. D, P, K = 64, 6, 15 # boyut, kişi, kişi başı foto
  4. unit = lambda v: v / np.linalg.norm(v, axis=-1)[..., None] # birim vektör
  5. g = unit(rng.normal(size=D)) # ortak "yüz" yönü
  6. C = unit(0.8 * g + unit(rng.normal(size=(P, D)))) # kişi merkezleri
  7. lab = np.repeat(np.arange(P), K)
  8. sig = 0.8 * (0.5 + rng.random(P * K)) # foto kalitesi (ışık, açı)
  9. N = rng.normal(size=(P * K, D)) / np.sqrt(D)
  10. X = unit(C[lab] + sig[:, None] * N) # 90 gömme vektörü
  11. S = X @ X.T # kosinüs benzerliği
  12. i, j = np.triu_indices(P * K, 1) # bütün çiftler
  13. same = lab[i] == lab[j]
  14. gen, imp = S[i, j][same], S[i, j][~same] # aynı / farklı kişi
  15. print(f'aynı: {gen.mean():.2f}, farklı: {imp.mean():.2f}')
  16. for th in [0.3, 0.42, 0.55]: # eşik süpürme
  17. far = (imp >= th).mean() # yanlış kabul
  18. frr = (gen < th).mean() # yanlış ret
  19. print(f'eşik {th}: FAR {far:.1%}, FRR {frr:.1%}')
  20. tpl = unit(X[lab == 2][:5].mean(0)) # kayıt şablonu: 5 foto
  21. print(X[lab == 2][-1] @ tpl, X[lab == 4][0] @ tpl) # kapıda iki deneme
  22. history = {'threshold': [], 'far': [], 'frr': [], 'accuracy': []} # eşik süpürme geçmişi
  23. for th in np.arange(101) / 100:
  24. acc = ((S[i, j] >= th) == same).mean()
  25. r = [th, (imp >= th).mean(), (gen < th).mean(), acc]
  26. for k, v in zip(history, r): history[k].append(float(v))
  27. d = np.abs(np.array(history['far']) - np.array(history['frr'])) # eşit hata noktası
  28. e = d.argmin(); eer = (history['far'][e] + history['frr'][e]) / 2
  29. for k, v in [('eer_esik', history['threshold'][e]), ('eer', eer), # son ölçümler
  30. ('far_042', history['far'][42]), ('frr_042', history['frr'][42])]:
  31. print(f'{k:<10}{v:>8.3f}')
  32. import csv
  33. with open('egitim_gecmisi.csv', 'w', newline='') as f: # satır başına bir eşik
  34. csv.writer(f).writerows([list(history), *zip(*history.values())])
  35. try:
  36. import matplotlib.pyplot as plt # varsa grafik çiz
  37. for k in ('far', 'frr'): plt.plot(history['threshold'], history[k], label=k)
  38. plt.xlabel('threshold'); plt.legend(); plt.show()
  39. except ImportError:
  40. print('matplotlib yok: grafik atlandı')

Eğitim paneli

Eğitim çalıştırılıyor…

Sahnedeki her sayı, aynı algoritmanın tarayıcında yapılan gerçek çalıştırmasından gelir (sabit tohum, her seferinde aynı sonuç). Python kodunu kendi bilgisayarında çalıştırırsan rastgele başlangıçlar farklı olacağı için sayılar biraz değişebilir.

Bu dersin kodu verisini kendi içinde üretir; indirilecek dosya yok. Kodu yine de aşağıda tarayıcında çalıştırabilirsin.

Kodu tarayıcıda çalıştırPython · NumPy · matplotlib · Pyodide

Python ve NumPy bu sayfada, tarayıcında çalışır (Pyodide). Kodu değiştirip yeniden çalıştırabilirsin; dersin veri setleri çalışma klasöründe hazır. Kod matplotlib kullanırsa grafikler çıktının altında görünür, yazdığı dosyalar (ör. egitim_gecmisi.csv) indirilebilir.

yuz.pypython

Çıktı

Çıktı burada görünecek.

Nasıl çalışır

  1. Her yüz 64 boyutlu bir birim vektördür. İki yüzün benzerliği, vektörler arasındaki açının kosinüsüdür: 1 aynı yön, 0 dik.
  2. Bütün çiftler iki gruba ayrılır: aynı kişi (ortalama yaklaşık 0,6) ve farklı kişi (yaklaşık 0,2). İki dağılım biraz örtüşür: kötü ışıkta çekilmiş fotoğraflar.
  3. Benzerlik eşiği geçerse kapı açılır. Eşiği geçen farklı kişi çiftlerinin oranı FAR (yanlış kabul), eşiğin altında kalan aynı kişi çiftlerinin oranı FRR'dir (yanlış ret).
  4. Eşik 0'dan 1'e süpürülür: FAR hep azalır, FRR hep artar. İkisinin eşit olduğu nokta EER'dir; sistemin tek sayılık karnesi.
  5. Şunu dene: eşiği 0,3'e indir, yabancıların dörtte biri içeri girer. 0,55'e çıkar, çalışanların neredeyse üçte biri kapıda kalır.

Neden önemli

Telefon kilidi, pasaport kapıları ve bina girişleri aynı adımla çalışır: yüzü vektöre çevir, kayıtlı vektörle kosinüs benzerliğini karşılaştır. Eşiği güvenlik ister: kasa dairesinde yanlış kabul pahalıdır, telefon kilidinde yanlış ret can sıkar. Robotlar da aynı yöntemle sahiplerini, ziyaretçileri ve hatta nesneleri yeniden tanır.

ESOF 323, 11. hafta: robotlarda derin öğrenme →
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ç