7.15. Menulis sendiri#
Ketika katalog tidak mencakup suatu model -- jaringan riset yang tata letak outputnya bersifat khusus, modifikasi pada arsitektur yang ada, tensor yang interpretasi semantiknya spesifik untuk aplikasi -- aplikasi menyediakan post-processor-nya sendiri. Protokolnya sederhana: callable yang mengambil (model, inputs, outputs) dan mengembalikan apapun yang diharapkan aplikasi dari predict().
Kelas dengan __call__ adalah bentuk konvensional:
class MyPostprocessor:
def __init__(self, threshold=0.5):
self.threshold = threshold
def __call__(self, model, inputs, outputs):
...
return result
Fungsi biasa juga berfungsi -- mesin hanya memeriksa bahwa objek tersebut dapat dipanggil.
7.15.1. Menghubungkannya#
Dua titik pemasangan. Kwarg postprocess= pada konstruktor mengikat callable untuk setiap panggilan predict() pada model:
model = ml.Model("/rom/my_model.tflite",
postprocess=MyPostprocessor())
Untuk mengganti binding untuk satu panggilan -- tukar dekoder tanpa memuat ulang model -- berikan callback= ke predict secara langsung:
result = model.predict([img], callback=MyOtherPostprocessor())
Tanda tangan callable sama dalam kedua kasus.
7.15.2. Apa yang diterima callable#
model-- instansiModel, berguna untuk parameter kuantisasi (output_scale,output_zero_point,output_dtype) dan dimensi input (input_shape).inputs-- daftar input yang diteruskan aplikasi kepredict(). Elemen pertama biasanya instansiNormalizationyang terikat; atributroi-nya adalah yang diharapkanNMSuntuk memetakan ulang kotak kembali ke citra asli.outputs-- tensor output mentah sebagai daftar objekndarray, dalam dtype aslinya. Output float tiba apa adanya; output integer tiba dalam bentuk terkuantisasi.
7.15.3. Aritmatika terkuantisasi#
Semua dekoder yang tersedia menggunakan helper yang sama di ml.utils, dan yang kustom biasanya menginginkan pola yang sama: quantize() mengangkat ambang batas float ke ruang terkuantisasi model, threshold() menyaring tanpa men-dequantize seluruh tensor, dan dequantize() berjalan sekali pada para penyintas. sigmoid() dan logit() tersedia untuk jaringan yang saluran outputnya adalah logit pre-sigmoid (detektor MediaPipe adalah kasus kanonik).
Untuk model dengan output float -- regression head, model dengan layer dequantize akhir yang sudah dipanggang -- helper kuantisasi melewati tanpa perubahan, sehingga kode post-processor yang sama bekerja terhadap kedua dtype tanpa perlu kasus khusus.
7.15.4. Nilai kembalian#
Apapun yang dikembalikan callable adalah apa yang dikembalikan predict(). Untuk dekoder yang memancarkan kotak, konvensinya adalah mendorong kandidat melalui NMS dan mengembalikan daftar per-kelasnya -- bentuk panggilan yang didokumentasikan oleh non-max suppression dan dibangun dalam konteks oleh panduan YOLOv8. Untuk hal lainnya, kembalikan apapun yang dianggap nyaman oleh aplikasi: satu ndarray, string label, tuple (class, score, embedding), atau kamus.