7.7. Normalleştirme¶
ml.Model.predict(), bazı ağların birden fazla giriş tensörü olduğu için bir girişler listesi alır, ancak listenin giriş başına argümanları satır içinde taşımanın bir yolu yoktur – “bu girişi (x, y, w, h) boyutuna kırp ama diğer girişlere dokunma” için bir kwarg yuvası yoktur. ml.preprocessing.Normalization, bu boşluğu dolduran sarmalayıcıdır. Bir Normalization örneği, bir giriş için parametreleri tutar; betik, varsayılanlar dışında bir şeye ihtiyaç duyduğunda sarmalanmış girişi predict listesinde geçirir.
Ona başvurmanın en yaygın nedeni, görüntünün tamamı yerine yakalanan çerçevenin belirli bir bölgesini ağa kırpmaktır.
7.7.1. Parametreler¶
Normalization(scale=(0.0, 1.0),
mean=(0.0, 0.0, 0.0),
stdev=(1.0, 1.0, 1.0),
roi=None)
roi– yeniden boyutlandırmadan önce kaynak çerçevede kırpılacak(x, y, w, h)dikdörtgeni. Varsayılan olarak tüm çerçevedir.Normalizationkullanımlarının çoğu yalnızca bu parametreyi ayarlar.scale– normalleştirmeden sonra kayan noktalı giriş tensörlerinin beklediği(min, max)aralığı.0..255piksel aralığı bu aralığa doğrusal olarak eşlenir. Yaygın değerler, ReLU ile eğitilmiş ağlar için(0.0, 1.0)ve simetrik olarak normalleştirilmiş ağlar için(-1.0, 1.0)şeklindedir.mean– ölçekleme sonrası görüntüden çıkarılan kanal başına(R, G, B)ortalaması. Ağın üzerinde eğitildiği kanal istatistikleriyle eşleşir – ImageNet’ten türetilen ağlar için(0.485, 0.456, 0.406)kanonik örnektir. Gri tonlama ağları, ortalamayı standart0.299*R + 0.587*G + 0.114*Bkullanarak bir luma değerine indirger.stdev– ortalama çıkarıldıktan sonra görüntünün bölündüğü kanal başına(R, G, B)standart sapması; yine ağın eğitim istatistikleriyle eşleşir. Gri tonlama ağları için aynı şekilde luma’ya indirgenir.
7.7.2. Parametreler ne zaman önemlidir¶
Ağın input_dtype türü int8 ya da uint8 olduğunda scale, mean ve stdev yok sayılır. Tamsayı girişli ağlar için kırpılan görüntü baytları doğrudan tensöre yazılır ve ağın kendi input_scale ile input_zero_point özellikleri tamsayıdan gerçek değere dönüşümü yönetir. Üç parametre yalnızca ağ kayan noktalı giriş beklediğinde önemlidir.
roi her durumda okunur – giriş dtype’ından bağımsız olarak kaynak çerçevenin hangi bölümünün ağa ulaşacağını kontrol eder.
7.7.3. ROI ve yeniden boyutlandırma¶
ROI, kaynak boyutlarından ağın giriş boyutlarına çift doğrusal (bilinear) olarak ölçeklenir. Görüntü hedefte ortalanır ve ölçekleme hedefi doldurur – en boy oranını korumaz. Kare bir ağ girişine verilen kare olmayan bir ROI, yatay ya da dikey olarak gerilmiş çıkar.
Gerilmenin önemli olup olmadığı ağa bağlıdır. MediaPipe ailesi (BlazeFace, FaceLandmarks, HandLandmarks, MoveNet) gibi yüz tespiti ve işaret noktası modelleri kare kırpmalara karşı eğitilmiştir ve giriş en boy oranı bozuk olduğunda hızla bozulur; bunlar için uygulamanın onlara kare bir ROI vermesi gerekir – ya window() aracılığıyla kare bir çerçeve boyutunda yakalayarak ya da roi= parametresiyle kırparak. YOLO ailesi nesne tespit ediciler tipik olarak rastgele gerilmeleri içeren artırma (augmentation) ile eğitilir ve kare olmayan ROI’leri fazla doğruluk kaybı olmadan kabul eder; yakalanan tam çerçeveyi doğrudan geçirmek genellikle sorun değildir.
Ağın giriş boyutları ROI ile tam olarak eşleştiğinde ölçekleme bir kopyaya indirgenir, ki bu en ucuz durumdur.
7.7.4. Varsayılanın geçersiz kılınması¶
predict(), her image.Image girişini otomatik olarak Normalization() ile sarmalar – yukarıdaki varsayılan parametrelerle. Kamerayla birlikte gelen çoğu model, varsayılanların zaten kapsadığı piksel aralıklarına karşı eğitilmiştir, dolayısıyla yaygın durum görüntüyü doğrudan geçirmektir:
result = model.predict([img])
Özel bir ROI kullanmak için – en yaygın geçersiz kılma – ROI ayarlanmış bir Normalization oluşturun ve görüntüyü ona bağlayın:
from ml.preprocessing import Normalization
norm = Normalization(roi=(80, 60, 160, 120))
result = model.predict([norm(img)])
Bir ağın eğitim zamanındaki kanal istatistikleriyle eşleşmek için kayan noktalı parametreleri ayarlayın:
norm = Normalization(scale=(0.0, 1.0),
mean=(0.485, 0.456, 0.406),
stdev=(0.229, 0.224, 0.225))
result = model.predict([norm(img)])
Normalization örneğini görüntü üzerinde çağırmak, motorun tensörü doldurduğu yeni bir bağlı örnek döndürür. Bağlı örnek, predict’in ham görüntü yerine kabul ettiği şeydir ve giriş başına bir nesne olduğu için, çok girişli bir ağ aynı predict listesinde farklı ROI’lere sahip görüntüleri karıştırabilir.
Uygulamanın zaten tensör biçiminde ürettiği girişleri bekleyen ağlar için – bir çevre biriminden gelen bir arabellek, başka bir işlem hattı tarafından hesaplanan bir ndarray, görüntü olmayan sayısal veriler – Normalization aşamasını tamamen atlayın ve ndarray’i ya da onu üreten bir çağrılabilir nesneyi geçirin. predict(), bunları sarmalamadan motora geçirir.