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.