Bu yazımda kullanıcı araç doğrulama sürecini nasıl otomatikleştirdiğimizi anlatacağım. Kullandığımız bileşenleri ve süreci nasıl düzenlediğimizi sizlerle paylaşacağım.
inDrive'da oldukça fazla görsel içerik kullanıyoruz. Pasaportlar, sertifikalar ve araç belgeleri gibi çok sayıda farklı belgenin kullanıldığı, farklı zihniyetlerin damgasını vurduğu çok çeşitli farklı bölgelerde bulunuyoruz.
Bunun dışında sürücülerin kendileri ve araçlarıyla ilgilenmeleri gerekiyor.
Kullanıcılarımız için seyahat konforundan ve gelişmiş hizmet kalitesinden bahsederken, güvenlik ve beklenmedik durumların ortadan kaldırılması mutlak önem taşımaktadır. Örneğin, yaklaşan araba, rezervasyon yaptığınız araç olmadığında.
inDrive olarak şu anda düzenli araç doğrulamalarını nasıl gerçekleştirdiğimizi öğreneceksiniz. Bu yapıldıktan sonra moderatörlerimiz öncesi ve sonrası fotoğraflarını manuel olarak kontrol eder. Elbette doğrulama süreci başka şeyleri de içeriyor ama biz burada sadece bu konuya odaklanacağız.
Mevcut yaklaşımın sorunu, moderatör sayısını arttırmanın altyapıyı büyütmekten daha zor olmasıdır. Özellikle kullanıcıların kişisel verileriyle uğraşmak söz konusu olduğunda.
Sorunu bir çocuk içinmiş gibi çok basit bir şekilde ortaya koyalım: Elimizde bir arabanın iki fotoğrafı var; ikisi de aynı arabaya mı ait? Elbette bu soruyu herkes çözebilir ancak bir karşılaştırma kriteri eklediğimizde işler çok daha karmaşık hale geliyor.
Örneğin, bunun bir cep telefonundan alınan ekran görüntüsü olmadığından veya plaka numaralarının mükemmel bir şekilde eşleştiğinden emin olmak.
Küresel olarak bu sorun birkaç yolla çözülebilir: E2E modellerini ve bu model setlerini kullanmak.
E2E modeli, “Fotoğraftaki araçla aynı mı, değil mi?”, “Plaka numaraları eşleşiyor mu?” gibi sorularımızı bir çift görüntüye dayalı olarak yanıtlayabilen büyük bir modelin (büyük olasılıkla bir sinir ağı) dahil edilmesini ima ediyor. yukarı mı değil mi?” vb.
Bu tür modellerin sorunu, öğrenilecek çok fazla veriye ihtiyaç duymaları ve cevabın neden bu olduğuna dair bir anlayıştan yoksun olmalarıdır.
Örneğin, bir modeli bir çift fotoğrafa dayanarak "evet"/"hayır" yanıtı verecek şekilde eğitirsek, yanıtın nedenlerini anlamak artık mümkün olmaz.
Yani kullanıcılar onlardan ne istediğimizi anlayamayacak ve moderatörler getirmek zorunda kalacağız.
Bu uçtan uca yaklaşım bize yakışmıyor. Sağlanan fotoğrafın neden "amaca uymadığına" dair kullanıcıya ipuçları vermek istiyoruz: "Fotoğrafı iyi aydınlatılmış bir yerde çekmek en iyisidir", "Görünüşe göre arabanın tamamını göremiyoruz." resim" veya "Plaka numarası sağlanan bilgilerle eşleşmiyor."
Farklı araçlar olduğunda modelin “evet” yanıtı vermemesi bizim için çok önemli. Bu ölçümü "FPR" (yanlış pozitif oran) olarak adlandıralım ve bunu tüm olumsuz örneklere (araçların eşleşmediği durumlarda) karşı "evet" yanıtlarının yüzdesini göstermek için kullanalım.
Şimdi, "evet" yanıtlarının tüm olumlu yanıtlara oranını ölçmek için başka bir ölçüm olan TPR'yi tanıtalım.
Temel olarak bu iki ölçüm, modeli optimize ederken görevimizi tanımlamak için zaten yeterlidir: FPR'yi en aza indirmek ve TPR'nin çok fazla bozulmamasını sağlamak.
Model seti yaklaşımını benimsedik. Bu nedenle tüm fikirlerimizi bitmiş çözümün iskeletine ekleyebiliriz (bu iskelete “temel çizgi” adı verilecektir). Gelin neye benzediğini keşfedelim ve onu parçalara ayıralım.
Aslında girişte iki görüntüyü bağımsız olarak işleyen ve çıkışta aracın plaka numarasını ve vektörünü veren birkaç modelden oluşur. Sonuçta karşılaştırılan detaylara göre incelemeye alınan iki fotoğraf hakkında doğrulama kararı veriliyor.
Bu, birden fazla modele eklemek ve onları modelimizin farklı düğümlerine yerleştirmek için kullandığımız algoritmanın iskeletidir. Örneğin bir fotoğrafın kalitesini, netliğini, ışık ve doygunluk seviyelerini değerlendirirken.
Bazen orijinal olmayan fotoğrafları gönderme girişimlerini tespit etmemiz gerekir. Bunu yapmak için fotoğrafı sahtekarlık saldırılarına karşı kontrol eden bir ön işlemci ekliyoruz.
Böyle bir yaklaşımı kullanırken, net ürün yineleme döngülerine sahip olmak ve iyi bir test veri seti oluşturmak çok önemlidir. Bu iki faktörü değerlendirmek için yeni bir model ekliyoruz: "Atanan sorunu çözüyor mu?" ve "Önceki çözümün metriklerini ne kadar değiştiriyor?"
Şimdi çözümün temel yapı taşlarından bahsedelim.
Şimdi terminolojiye bir göz atalım. Aşağıda "sınırlayıcı kutu" ve "segmentasyon maskesi" gibi terimlerin anlamlarını açıklayacağım.
Sınırlayıcı kutu, belirli bir ilgi nesnesini çevrelemek için kullanılan dikdörtgen bir şekildir. Örneğin, kedinin yüzünü tanımlamak istiyorsak, onu kırmızıyla çerçeveleyerek bir sınırlayıcı kutu tanımlarız. Görüntüdeki sol alt ve sağ üst noktalarının koordinatları ile tanımlanır.
Segmentasyon, bir giriş görüntüsündeki her bir piksele bir sınıf etiketi atama görevini ifade eder. Tartışmamız bağlamında kediyi arka plandan ayırarak izole ettik.
Modelimizde aracın arka planı bizi ilgilendirmiyor çünkü bu, hedef çözümümüzü şekillendirmeyle ilgili hiçbir bilgi sağlamıyor. Ancak bu, arka planları kullanarak modellerimizi nasıl geliştirebileceğimiz konusunda hiçbir fikrimiz olmadığı anlamına gelmiyor.
Araçları arka plandan ayırma zorluğunu çözmek için YOLO ailesinin bir modelini (Yalnızca Bir Kez Bakarsınız) alıp onu araba görüntülerini bölümlere ayıracak şekilde eğiteceğiz. Buradaki sorun, resimde birden fazla araba bulunan kullanıcılardan gelen çok sayıda fotoğrafın olması.
Bu sorunu aşmak için aşağıdaki yaklaşımı kullanabiliriz:
Harika, ilk girdimizi aldık.
Bir sonraki adım aracın plaka numarasını bulmaktır. Hemen hemen tüm ülkelerde plaka ön taraftadır. Araç plakalarının alışılmadık yerlerde bulunması gibi nadir durumlar bu makalenin kapsamı dışındadır.
Plaka numarasını belirlemeye yönelik en yaygın yaklaşım, sınırlayıcı kutuyu tespit etmek ve ortaya çıkan yamaya OCR uygulamaktır.
Ancak deneylerimizin gösterdiği gibi, eğer aracın plakası ufka paralel değilse OCR çok daha az etkilidir (ve bazı modellerde daha uzun sürer).
Bu, özellikle sürücülerden belirli bir açıyla fotoğraf çekmelerini istediğimiz verilerimiz için geçerlidir.
Karar verdiğimiz çözüm, sayıyı bölümlere ayırmak ve ardından elde edilen kontur çizgisini düzeltmekti. Bizim durumumuzda segmentasyon görevine, araçların segmentlere ayrılmasına benzer şekilde yaklaşıldı ve aşağıdaki sonuç elde edildi:
Daha sonra maskeyi kullanarak bir kontur çizgisi çizdik ve onu yumuşatmak için ConvexHull uyguladık. Bu basit algoritma, kontur çizgimizin içbükeyliklerini yumuşatır (düzeltir), daha düz hale getirir. Bu, bir kontur çokgeninde daha az sayıda açı olarak tanımlanabilir.
İdeal bir dünyada bu işlem bize dört noktayla tanımlanan bir dikdörtgen verecektir.
Kenarlıkları hizaladıktan sonra, kayıt numarasının düzgün, iyi sunulmuş ve açıkça görülebilmesi için aynı alıştırmayı perspektifle tekrarlıyoruz. Bu yaklaşım özellikle bir arabanın fotoğrafı plakanın neredeyse hiç görülmeyeceği bir açıyla çekildiğinde faydalıdır.
Perspektif düzeltmesi nedir? Cebir dersimden dönme matrisinin nasıl çalıştığını hatırlıyorum. Kartezyen koordinat sisteminde bir kare alıp her koordinatı 30 derecelik bir dönme matrisiyle çarparsanız, yeni koordinat sistemindeki kareniz 30 derece döndürülecektir.
Burada da benzer bir görevle uğraşıyoruz; kontur çizgisini alalım ve tüm noktaları yeni koordinat sistemine taşıyalım. Sorun uygun bir dönüşüm matrisi bulmaktır.
Bu algoritmaların tümü zaten iyi kurulmuş olduğundan yapmamız gereken tek şey, bunların elimizdeki görev için doğru şekilde yapılandırıldığından emin olmaktır.
Sonuç harikaydı. Bu, TPR'yi yaklaşık yüzde 15 puan artırdı. Daha sonra PARSeq mimarisi gibi hafif, yüksek kaliteli OCR yazılımlarını uyguluyoruz.
Şu an itibariyle bu, araç fotoğraflarını işlemek için kullanılan en son sinir ağı teknolojisidir. Yerleştirmeler, arama, öneriler ve veri sıkıştırma dahil olmak üzere çeşitli makine öğrenimi alanlarında yaygın olarak benimsenen bir tekniktir.
Görevimiz kapsamında araçlar arasındaki benzerliği değerlendirmek için yerleştirmelerden yararlanılmaktadır.
Arabamın fotoğrafını önce sağ taraftan, sonra da sol taraftan çektiğim bir örneğe bakalım. Artık bu resimlerin gömülmelerini (vektörlerini) hesaplayabiliyorum ve eğer bu vektörler uzayda yakınsa bu onun aynı araç olduğunu gösterir.
Ancak gömmeler, üründe kullanılabilecek başka bir kullanışlı özellik daha sağlar: Gömme modeliniz iyi çalışıyorsa, gömme örnekleri arasından en yakın olanı bulmak için arama yapabilirsiniz. Örneğin sistemde benzersiz olmayan araçları bulmak için.
Gömme modelimizi inDrive verilerini kullanarak eğitirken titiz önlemler aldık. Fotoğraflardan her türlü kişisel veriyi titizlikle kaldırdık ve veri setinin, faaliyet gösterdiğimiz tüm ülkelerdeki görselleri ve değişen kalite düzeylerini kapsayacak şekilde normalleştirilmesini sağladık.
Bu yaklaşım, yüksek kaliteli fotoğraf çekmek için pahalı akıllı telefonlara erişimi olmayan kişilere karşı ayrımcılığı önlemeyi amaçlıyor.
Sonuç olarak, araç markası ve markasına göre gruplandırılmış bir veri seti elde edildi. Birkaç deneme yaptıktan sonra şimdilik araçların renklerini karşılaştırmadan yapmamız gerektiğini fark ettik.
Modelimiz için mimariyi seçerken performans ile hesaplama verimliliği arasında denge kuran bir omurga aradık. Temel çalışma süresini önemli ölçüde yavaşlatabileceğinden aşırı büyük bir omurga kullanmaktan kaçınmak çok önemliydi.
Dikkatli bir değerlendirmenin ardından, makine öğrenimi amacıyla Eklemeli Açısal Marj Kaybının kullanımıyla tamamlanan, omurga mimarimiz olarak activenet_b2'yi seçtik.
Modelimizin amacı, tüm Audi A4'ler gibi aynı marka ve modeldeki araçların vektör uzayında birbirine yakın konumlandırıldığı vektör temsillerini öğrenmektir.
Buna karşılık, Audi A5'ler Audi A4'lerden biraz daha uzakta, ancak örneğin Toyota Camry ile karşılaştırıldığında yine de daha yakın konumlandırılacaktır.
Şimdi birkaç araç karşılaştırma örneğini inceleyelim:
Üstte iki özdeş arabamız var, altta ise iki farklı arabamız var. Benzerlik puanlarına tekrar bakalım: En üstteki çiftin puanı 0,989, alttaki çiftin puanı ise 0,697. 0,98'lik bir eşik değeri ayarlayarak araçları aynı olarak sınıflandırabiliriz.
Ancak modelimizin henüz kusursuz bir şekilde çalışmadığını belirtmekte fayda var. İlgili faktörde bir önyargımız var:
Model 0,751 sonucunu üretirken, ideal olarak farklı araçlar için sıfıra yakın bir değer istiyoruz.
Buradaki asıl sorun, modelimizin öncelikle araç modelleri ve markalarına odaklanan veri setleri üzerinde eğitilmesinden kaynaklanmaktadır. Sonuç olarak model, farklı araçları ayırt etme konusunda uzmanlaştı ancak araç sınıfları içindeki farklılıkları değerlendirirken zorluk yaşadı.
Karşılaştığımız ikinci sorun ise aracın farklı açılarda gösterilebilmesidir, bu da sınırlı veri seti nedeniyle yerleştirmelerimizin kalitesini olumsuz etkilemektedir.
İlk adım olarak müşteri tarafında maskeler ekliyoruz ve sürücüye arabasının fotoğrafını nasıl çekeceğini bildiriyoruz. İkinci adım, aracın uzayda konumlandırılması ve dönüşünün tahmin edilmesi için aracın farklı kısımlarının tespit edilmesi olacaktır.
Doğru dönüş açısını seçmek için burada birçok buluşsal yöntem geliştirilebilir. Ve en önemlisi, bu modeller daha sonra aracın durumunun değerlendirilmesinde yeniden kullanılabilir. Ama bu başka bir zamanın hikayesi.
İlya Kaftanov tarafından gönderildi.