İlk yılımızda modeli bir kez eğitip sahaya atıyorduk. Üç ay sonra müşteri arıyordu: "sayım bozuldu". Bakıyorduk, model aynı, kamera aynı; değişen şey mağazanın kışlık koleksiyona geçmesiydi. Kalın mont, şapka, atkı. Eğitim setinde yazlık kıyafet vardı. O günden beri model bir ürün değil, bakımı olan bir sistem.
Drift nereden geliyor
Sahada gördüğümüz sapmaların kaynağı, sıklık sırasıyla:
- Mevsim ve kıyafet. Kış-yaz farkı kişi tespitinde değil, sınıflandırmada (personel yeleği, KKD) sorun çıkarıyor. Sarı yelek montun altında kalınca "yeleksiz" oluyor.
- Işık. Vitrin aydınlatması yenilendi, fabrikaya yeni LED takıldı, gün uzadı. Pozlama değişince modelin gördüğü dağılım değişiyor.
- Yerleşim. Raf taşındı, kapı önüne stand kondu, üretim hattı yeniden düzenlendi. Model bozulmuyor ama kural poligonları anlamsızlaşıyor.
- Kamera. Değiştirildi, çarpıldı, lens buğulandı, otomatik odak bozuldu. En sinsi olanı, kamera firmware güncellemesiyle görüntü işleme ayarlarının (keskinlik, gürültü azaltma) değişmesi.
- Yeni nesne. Depoya yeni tip forklift geldi, modelin hiç görmediği biçim. Tespit oranı o araç için sıfıra yakın.
Sapmayı fark etmek
Müşteri aramadan önce fark etmek gerekiyor. Üç sinyal izliyoruz:
Güven skoru dağılımı: her kamerada günlük ortalama tespit güveni. 0,85'ten 0,70'e inen bir kamera bir şeyler değişmiş demek. Sayım tutarlılığı: bugünün sayımı geçen haftanın aynı gününe göre %20'den fazla sapmışsa uyarı; bazen gerçek (kampanya), çoğu zaman teknik. Boş kare oranı: kameranın hiç tespit üretmediği saat dilimleri, gece hariç. Bunlar tek bir izleme panelinde, kamera başına. Sapma görünen kameradan örnek kare istenip bakılıyor.
Veri seti disiplini
Her müşteri, izin verdiyse, veri setine katkı veriyor. Kurallar:
- Yüz bulanıklaştırma etiketlemeden önce, otomatik. Etiketçi hiçbir zaman yüz görmüyor.
- Zor örnek önceliği. Rastgele kare değil, modelin düşük güvenle tespit ettiği ya da takibin kimlik kaybettiği kareler seçiliyor. Bin kolay örnek yerine yüz zor örnek.
- Etiket şeması sabit. "person", "vest", "helmet", "forklift", "pallet-jack"... Yeni sınıf eklemek bir karar; her müşteri isteğinde sınıf açılmıyor.
- Kaynak etiketi. Her örnek hangi tesisten, hangi kamera tipinden, hangi mevsimden. Yeni müşteriye en yakın alt küme ile ince ayar yapılabiliyor.
- Test seti dokunulmaz. Her müşteriden ayrılan test seti eğitime hiç girmiyor. Model sürümleri bu setle karşılaştırılıyor, "yeni model daha iyi" cümlesi bu tablo olmadan söylenmiyor.
Yeniden eğitim döngüsü
Genel model çeyrekte bir yeniden eğitiliyor. Müşteriye özel ince ayar (fine-tuning) ihtiyaç olduğunda: yeni forklift tipi, özel forma, sıra dışı kamera açısı. İnce ayar genel modelin üzerine, o müşterinin birkaç yüz örneğiyle, birkaç saatte bitiyor. Sonuç yalnızca o müşterinin test setinde değil, genel test setinde de kontrol ediliyor; ince ayar başka bir şeyi bozmuş olabilir.
Eğitim merkezde, GPU'lu bir makinede. Saha sunucularında eğitim yapılmıyor; oradaki GPU çıkarım için ayrılmış.
Sürüm ve dağıtım
Model TensorRT ile derlenip sahaya güncelleme olarak iniyor. Her saha sunucusunda iki model slotu var: aktif ve aday. Aday model bir gün boyunca aynı akışta gölge modda çalışıyor, çıktıları aktifle karşılaştırılıyor, fark raporu bakılıyor, sonra geçiş. Geri alma tek komut: slotları değiştir. Bunu kurmadan önce bir güncelleme 12 mağazada sayımı aynı anda bozmuştu; gölge mod o hafta doğdu.
Her olay kaydında model sürümü var. "Bu ayın ilk yarısı v14, ikinci yarısı v15 ile sayıldı" bilgisi olmadan aylık karşılaştırma yapılamıyor.
Model dışı çözümler
Sapmaların yarısı modelle değil, ayarla çözülüyor. Kamera pozlama ayarını sabitlemek, otomatik odağı kapatmak, kural poligonunu güncellemek, kare hızını artırmak. Yeniden eğitime gitmeden önce bu liste kontrol ediliyor. Modeli her sorunda yeniden eğitmek pahalı ve genellikle yanlış teşhis.
Kısa özet niyetine değil, ders olarak
Model eğitmek iki gün. Onu 40 lokasyonda bir yıl doğru tutmak, ekibin asıl işi. Teklif hazırlarken bakım kalemini bu yüzden ayrı yazıyoruz ve müşteri "model bitti, neden bakım?" dediğinde bu yazıyı gönderiyoruz.