7.15. Kendinizinkini yazma¶
Katalog bir modeli kapsamadığında – çıkış düzeni özel olan bir araştırma ağı, mevcut bir mimaride yapılan bir ince ayar, anlamsal yorumu uygulamaya özgü olan bir tensör – uygulama kendi son işlemcisini sağlar. Protokol sadedir: (model, inputs, outputs) alan ve uygulamanın predict() öğesinden beklediği her ne ise onu döndüren çağrılabilir bir nesne.
__call__ içeren bir sınıf alışılagelmiş biçimdir:
class MyPostprocessor:
def __init__(self, threshold=0.5):
self.threshold = threshold
def __call__(self, model, inputs, outputs):
...
return result
Düz bir işlev de işe yarar – motor yalnızca nesnenin çağrılabilir olup olmadığını denetler.
7.15.1. Bağlama¶
İki bağlanma noktası. Kurucu üzerindeki postprocess= anahtar argümanı, çağrılabilir nesneyi model üzerindeki her predict() çağrısı için bağlar:
model = ml.Model("/rom/my_model.tflite",
postprocess=MyPostprocessor())
Tek bir çağrı için bağlamayı geçersiz kılmak – modeli yeniden yüklemeden kod çözücüleri değiştirmek – üzere doğrudan predict öğesine callback= geçirin:
result = model.predict([img], callback=MyOtherPostprocessor())
Çağrılabilir imza her iki durumda da aynıdır.
7.15.2. Çağrılabilir nesnenin aldığı şeyler¶
model–Modelörneği; kuantizasyon parametreleri (output_scale,output_zero_point,output_dtype) ve giriş boyutları (input_shape) için kullanışlıdır.inputs– uygulamanınpredict()öğesine geçirdiği girişlerin listesi. İlk öğe genellikle bağlıNormalizationörneğidir;roiözniteliği,NMSöğesinin kutuları orijinal görüntüye geri eşlemek için beklediği şeydir.outputs– ham çıkış tensörleri, kendi yerel dtype’larındandarraynesnelerinden oluşan bir liste olarak. Kayan noktalı çıkışlar olduğu gibi gelir; tamsayı çıkışlar kuantize edilmiş olarak gelir.
7.15.3. Kuantize aritmetik¶
Sevk edilen kod çözücülerin hepsi ml.utils içindeki aynı yardımcılara başvurur ve özel bir kod çözücü genellikle aynı kalıbı ister: quantize() bir kayan noktalı eşiği modelin kuantize uzayına yükseltir, threshold() tüm tensörü kuantizasyondan çıkarmadan filtreler ve dequantize() hayatta kalanlar üzerinde bir kez çalışır. sigmoid() ve logit(), çıkış kanalları sigmoid öncesi logitler olan ağlar için kullanılabilir (MediaPipe tespitçileri kanonik örnektir).
Kayan noktalı çıkışlara sahip modeller için – regresyon başlıkları, son bir kuantizasyondan çıkarma katmanı gömülmüş modeller – kuantizasyon yardımcıları değişmeden geçer, böylece aynı son işlemci kodu, özel bir durum gözetmeden her iki dtype için de çalışır.
7.15.4. Döndürülen değer¶
Çağrılabilir nesne her ne döndürürse, predict() öğesinin döndürdüğü şey odur. Kutu yayan kod çözücüler için alışıldık olan, adayları bir NMS üzerinden geçirmek ve onun sınıf başına listelerini döndürmektir – maksimum olmayanların bastırılması belgesinin belgelediği ve YOLOv8 adım adım kılavuzunun bağlam içinde oluşturduğu çağrı yapısı. Başka her şey için, uygulamanın kullanışlı bulduğu her neyse onu döndürün: tek bir ndarray, bir etiket dizesi, bir (class, score, embedding) demeti, bir sözlük.