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.