5.20. Regresyon ve benzerlik¶
Image sınıfı üzerindeki iki ölçüm daha, görüntüyü piksel değerlerinin bir dağılımı dışında bir şey olarak özetler. Eşiklenmiş piksellerin doğrusal regresyonu, bir uygulamaya üzerine eylemde bulunabileceği bir çizgi verir – çizgi izleyen bir robotun klasik girdisi. Benzerlik ölçümü, bir uygulamaya iki görüntünün ne kadar benzer olduğunu tanımlayan tek bir sayı verir – bir altın görüntü regresyon testinin ya da kaba değişiklik dedektörünün doğal girdisi.
5.20.1. Doğrusal regresyon¶
Bir görüntünün ön plan pikselleri çerçeve boyunca bir çizgi oluşturduğunda – bir robotun izlediği piste yapıştırılmış bant, bir ufuk çizgisi, bir yolun ya da koridorun kenarı – uygulama genellikle her bir ön plan pikselini tek tek istemez. Hepsinin içinden geçen en iyi uyan çizgiyi ister; bu çizgi, çizginin nasıl yönlendirildiğine ve çerçeveyi nerede kestiğine karar verebilecek şekilde parametrelendirilmiştir.
get_regression() bu uydurmayı yapar. binary() ve find_blobs() yöntemlerinin kullandığı aynı eşik tuple biçimini alır, eşikle eşleşen her pikseli belirler ve bu piksellerin içinden geçen en iyi uyan çizgiyi tanımlayan tek bir line sonucu döndürür:
line = img.get_regression([(0, 60)])
if line:
img.draw_line((line.x1(), line.y1(),
line.x2(), line.y2()),
color=(255, 0, 0))
Uydurma, Theil-Sen doğrusal regresyonudur – daha bilinen en küçük kareler uydurmasından aykırı değerlere daha iyi dayanan sağlam bir yöntem. Gerçek çizgiden uzaktaki bir avuç piksel, en küçük karelerde olacağı gibi sonucu çarpıtmaz; bu da gerçek bir eşik çıktısının gürültülü ön plan gerçekliğiyle uyuşur.
line sonucu, görüntü dikdörtgenine kırpılmış uç noktaları (x1, y1, x2, y2), çizgi uzunluğunu ve büyüklüğünü (length, magnitude) ve çizginin kutupsal biçimdeki geometrik tanımını (theta, rho) – çizginin yataydan açısını ve orijine olan dik uzaklığını – taşır. Kutupsal biçim, bir kontrol döngüsünün genellikle istediği şeydir: theta robota çizginin hangi yöne eğildiğini, rho çizginin görüntüyü nerede kestiğini söyler ve ikisi üzerindeki bir geri besleme döngüsü robotu çizgide merkezde tutar.
Bir avuç anahtar sözcük argümanı sağlamlığı ve maliyeti ayarlar. x_stride ve y_stride uydurma sırasında pikselleri atlar – daha büyük adımlar, daha az piksel uydurma pahasına regresyonu ucuzlatır. area_threshold ve pixels_threshold, ardında yeterli eşleşen piksel bulunmayan çizgileri reddeder. target_size girdiyi uydurmadan önce daha küçük bir boyuta yeniden ölçekler – regresyon, görüntünün 80’e 60’lık bir vekili üzerinde çizgi yönü doğruluğunda fazla kayıp olmadan daha hızlı çalışır.
Kabul edilebilir bir çizgi uydurulamazsa – eşik hiçbir pikselle eşleşmediyse ya da çizgiye benzemeyen bir desenle eşleştiyse – yöntem None döndürür. Gerçek çizgi izleme kodu, çizginin özniteliklerine uzanmadan önce her get_regression() çağrısını bir None denetimiyle korur.
5.20.2. Görüntü benzerliği¶
Farklı türde bir ölçüm: “görüntü neyi içeriyor?” diye sormak yerine, “bu iki görüntü ne kadar benzer?” diye sorun. Başvurulacak işlem, kaynak görüntü ile bir referans görüntü arasındaki Yapısal Benzerlik İndeksi‘ni (SSIM) hesaplayan get_similarity() yöntemidir.
s = img.get_similarity(reference)
print(s.mean, s.stdev)
SSIM, görüntü işleme genelinde kullanılan standart görüntü benzerliği ölçütüdür çünkü bir insanın benzerlik sezgisinin davrandığı gibi davranır – küçük bir kayma ya da küçük bir parlaklık değişikliği skoru hafifçe düşürürken, büyük bir yapısal değişiklik (eksik nesne, farklı sahne) onu önemli ölçüde düşürür. Skor -1 ile +1 arasında değişir: +1 iki görüntünün özdeş olduğu, 0 ilişkisiz oldukları, -1 ise yapısal olarak zıt oldukları anlamına gelir. Döndürülen bir similarity nesnesi, görüntü genelindeki ortalama SSIM’i, ayrıca karo başına skorların standart sapmasını, min ve maks değerlerini açığa çıkarır.
Büyük bir sayıdan ziyade küçük bir sayının daha iyi olduğu türde bir karşılaştırma için – “hiçbir şey değişmedi”de sıfır raporlaması ve değişiklikler biriktikçe yükselmesi gereken bir regresyon testi – dssim=True bayrağı yapısal farklılığı döndürür: ortalama SSIM’in 1 değerinden çıkarılmış hali, böylece dönüş değeri özdeş görüntüler için 0.0 olur ve farklılaştıkça yükselir.
5.20.3. SSIM için kullanım örnekleri¶
İki yaygın uygulama:
Altın görüntü regresyon testi. Bir test çerçevesi, bilinen iyi koşullarda bir referans çerçevesi yakalar ve onu altın görüntü olarak saklar. Sonraki test çalıştırmaları aynı koşullarda yakalama yapar ve SSIM ile altın görüntüyle karşılaştırır. Belirli bir eşiğin (toleransa bağlı olarak 0.95 ya da 0.98) üzerindeki bir skor geçer; altındaki başarısız olur. Test çerçevesinin neyin değiştiğini bilmesine gerek yoktur – SSIM skoru sinyaldir.
Kaba değişiklik tespiti. Çerçeve farkının daha kaba bir sürümünü – küçük parlaklık değişikliklerini yok sayan ama büyük yapısal değişikliklere tepki veren – isteyen bir uygulama, piksel başına difference() ardından bir eşik yerine bir referans çerçevesine karşı SSIM kullanabilir. SSIM, aydınlatma kaymasına piksel başına farktan daha az duyarlıdır; bu da amaç “herhangi bir tekil piksel değişti” yerine “sahne maddi olarak farklı görünüyor”yu tespit etmek olduğunda onu daha iyi bir tercih yapar.
Her iki uygulama da aynı çağrıyı – img.get_similarity(reference) – kullanır ve döndürülen skorun bir eşiğinde tetiklenir. Fark yalnızca eşiğin yüksek (regresyon testi, neredeyse özdeş bir eşleşme arar) ya da düşük (değişiklik tespiti, herhangi bir büyük yapısal değişiklik arar) olmasıdır.
5.20.4. Dönüştür-ve-karşılaştır biçimi¶
Kullanışlı bir incelik: get_similarity(), draw_image() ile aynı x, y, x_scale, y_scale, roi, rgb_channel, alpha, color_palette, alpha_palette, hint ve transform parametrelerini kabul eder. Referans görüntü, SSIM karşılaştırması çalışmadan önce bu parametrelerle konumlandırılır, ölçeklenir ve dönüştürülür.
Bu, bir uygulamanın önceden dönüştürülmüş bir referans görüntü hazırlamadan “bu sahne, bilinen bir kayma / döndürme / ölçekten sonra bir referans çerçevesine ne kadar benzer” diye sorabileceği anlamına gelir. Bu, bir parametre uzayını arayan ve referansın hangi dönüşümünün geçerli çerçeveyle en iyi eşleştiğini raporlayan bir izleyici oluşturmanın ucuz yoludur.