Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Projeler · Proje 4

Depoda nesne sınıflandırma

Konveyör bandındaki nesneleri biçim, renk ve boydan tanıyıp doğru kutuya iten model

Senaryo. Bir e-ticaret deposunda konveyör bandı karışık ürün getiriyor. Bandın üstündeki kapıda bir kamera nesnenin silüetinden yuvarlaklığını ve rengini, bir lazer ölçer boyunu okur. Kapıdan sonra dört itici var: oyuncak, elektronik, gıda ve büyük koli kutuları. Depo görevlisi daha önce bir grup ürünü elle etiketledi; robot gerisini kendisi ayıracak.

Amaç. Banttan geçen 200 yeni nesneyi doğru kutuya ayırmak: doğruluk %85’in üstünde, hiçbir kutunun duyarlılığı çok düşük olmasın.

3B sahne yükleniyor…

k-NN (k = 5) · 0 / 200 nesne tarandı
Sürükle: döndür · iki parmak / tekerlek: yakınlaş

Eğitim paneli

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

Model bu sayfada, tarayıcında sıfırdan eğitilir (sabit tohum: aynı ayarlarla her seferinde aynı sonuç). Eğitim her karede küçük parçalar hâlinde yapılır; sekme ya da sahne görünmezken durur.

Adımlar

  1. Kapıdaki sensörler her nesneden üç sayı okur: yuvarlaklık (küp 0,1 civarı, küre 0,95 civarı), renk tonu (0–1) ve boy (cm). Sensör gürültüsü bu sayıları biraz oynatır.
  2. Model, görevlinin etiketlediği örneklerle eğitilir. k-NN yalnız örnekleri saklar; ağaç eşik soruları seçer; naive Bayes her kutu için ortalama ve varyans hesaplar.
  3. Her yeni nesne kapıdan geçerken sınıflanır ve tahmin edilen kutunun hizasında yana itilir. Yanlış kutuya düşen nesnenin üstünde kırmızı bir işaret yanar.
  4. Gerçek kutu bilindiği için her tarama karışıklık matrisine bir sayı ekler: satır gerçek kutu, sütun tahmin. Köşegen doğrular, geri kalan her hücre belirli bir karışıklıktır (ör. büyük koli sanılan elektronik).
  5. Kutu başına duyarlılık (o kutuya ait olanların ne kadarı oraya gitti) ve kesinlik (kutuya gidenlerin ne kadarı ona ait) ayrı ayrı izlenir: ortalama doğruluk tek bir zayıf kutuyu gizleyebilir.

Model

Üç klasik sınıflandırıcıdan biri, tarayıcıda etiketli örneklerle eğitilir: k en yakın komşu (ölçeklenmiş üç özellikte en yakın k örneğin oyu), karar ağacı (Gini ile seçilen eşik soruları) ve Gauss naive Bayes (sınıf başına ortalama ve varyans). Derslerdeki iki özellikli sürümlerin üç özellikli hâlidir; sonuç kesinlik ve duyarlılık dersindeki gibi karışıklık matrisiyle okunur.

Kullanılan dersler: k en yakın komşu (k-NN) · Karar ağacı · Naive Bayes: olasılıkla karar · Kesinlik, duyarlılık ve F1

Kendin dene

  1. Modeli 1 (karar ağacı) yap ve derinliği 1’e indir. Tek soru bandı yalnız ikiye bölebilir: dört kutudan ikisi hiç kullanılmaz ve saklı nesnelerde doğruluk %48’e düşer. Derinlik 3’te ağaç yeniden %92’ye çıkar; daha derin ağaç bir şey kazandırmaz.
  2. Sensör gürültüsünü 0,3’ten 1’e çıkar. Saklı nesnelerde k-NN %92’den %85’e, ağaç %91’den %81’e, naive Bayes %92’den %87’ye düşer. Karışıklık matrisine bak: hataların çoğu oyuncak, gıda ve büyük koli arasında toplanır; elektronik mavi rengi sayesinde az karışır.
  3. Etiketli örneği 20’ye indir. k-NN %92’den %74’e düşer, naive Bayes ise %86’da kalır: k-NN birkaç komşuya güvenmek zorundadır, naive Bayes her kutu için yalnız birkaç ortalama ve varyans öğrenir. Tohumu değiştir: bu kadar az örnekte sonuç tohuma göre çok oynar.

Python karşılığı

depo_siniflandirma.pypython
  1. import numpy as np
  2. D = np.genfromtxt('depo-nesneleri.csv', delimiter=',', names=True) # 120 etiketli, 200 yeni nesne
  3. F, k, et = np.c_[D['yuvarlaklik'], D['ton'], D['boy']], D['kutu'].astype(int), D['grup'] == 0 # özellikler: yuvarlaklık, ton, boy (cm)
  4. X, y, X_yeni, y_yeni = F[et], k[et], F[~et], k[~et]
  5. mu, sd = X.mean(0), X.std(0)
  6. Z, Z_yeni = (X - mu) / sd, (X_yeni - mu) / sd # ölçekle: boy (cm) tonu ezmesin
  7. def knn(z, k=5):
  8. d = ((Z - z) ** 2).sum(1) # her etiketli örneğe uzaklık
  9. oy = np.bincount(y[np.argsort(d)[:k]], minlength=4) # en yakın k örneğin oyu
  10. return oy.argmax()
  11. m = np.array([X[y == c].mean(0) for c in range(4)]) # naive Bayes: kutu başına ortalama
  12. v = np.array([X[y == c].var(0) for c in range(4)]) # ve varyans
  13. p = np.bincount(y, minlength=4) / len(y) # kutuların oranı (önsel)
  14. def nb(x):
  15. lp = np.log(p) - 0.5 * (np.log(2 * np.pi * v) + (x - m) ** 2 / v).sum(1)
  16. return lp.argmax() # log olasılığı en büyük kutu
  17. M = np.zeros((4, 4), int) # karışıklık matrisi
  18. history = {'n': [], 'true': [], 'pred': [], 'correct': [], 'accuracy': []} # geçmiş: taranan her nesne bir satır
  19. for z, x, c in zip(Z_yeni, X_yeni, y_yeni): # banttan gelen her yeni nesne
  20. tahmin = knn(z) # ya da nb(x)
  21. M[c, tahmin] += 1 # satır gerçek, sütun tahmin
  22. for k, v in zip(history, (M.sum(), c, tahmin, c == tahmin, np.trace(M) / M.sum())): history[k].append(float(v) if k == 'accuracy' else int(v))
  23. print(M)
  24. print("doğruluk", np.trace(M) / M.sum()) # köşegen / toplam
  25. print("duyarlılık", np.diag(M) / M.sum(1)) # kutu başına
  26. print("kesinlik", np.diag(M) / M.sum(0))
  27. P, R = np.diag(M) / np.maximum(1, M.sum(0)), np.diag(M) / np.maximum(1, M.sum(1))
  28. F1 = 2 * P * R / np.maximum(1e-12, P + R) # kutu başına F1
  29. for ad, p_, r_, f_ in zip(['oyuncak', 'elektronik', 'gida', 'buyuk koli'], P, R, F1): # son ölçümler tablosu
  30. print(f'{ad:<12}kesinlik {p_:.2f} duyarlılık {r_:.2f} F1 {f_:.2f}')
  31. import csv
  32. with open('egitim_gecmisi.csv', 'w', newline='') as f: # geçmişi CSV'ye yaz
  33. csv.writer(f).writerows([list(history), *zip(*history.values())])
  34. try:
  35. import matplotlib.pyplot as plt # varsa grafik çiz
  36. fig, (a1, a2) = plt.subplots(1, 2, figsize=(9, 3.5))
  37. a1.plot(history['n'], history['accuracy']); a1.set_xlabel('n'); a1.set_ylabel('accuracy')
  38. a2.imshow(M, cmap='Greens'); a2.set_xlabel('tahmin'); a2.set_ylabel('gerçek') # karışıklık matrisi
  39. plt.show()
  40. except ImportError:
  41. print('matplotlib yok: grafik atlandı')
  • Depo konveyörü: nesnelerdepo-nesneleri.csv · 320 satır · 5 sütun
    Veri setini indir
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.

depo_siniflandirma.pypython

Çıktı

Çıktı burada görünecek.
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ç