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 -- instansi Model, berguna untuk parameter kuantisasi (output_scale, output_zero_point, output_dtype) dan dimensi input (input_shape).

  • inputs -- daftar input yang diteruskan aplikasi ke predict(). Elemen pertama biasanya instansi Normalization yang terikat; atribut roi-nya adalah yang diharapkan NMS untuk memetakan ulang kotak kembali ke citra asli.

  • outputs -- tensor output mentah sebagai daftar objek ndarray, 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.