TFLite
TFLite adalah format FlatBuffer yang dijalankan LiteRT di target mobile dan embedded. LibreYOLO mengekspor graph ONNX statis, mengonversinya dengan onnx2tf dalam mode flatbuffer-direct, lalu menulis metadata model di samping artefaknya sebagai sidecar JSON.
- Flag
export(format="tflite")- Menulis
- Satu berkas .tflite plus sidecar metadata .tflite.json
- Tambahan
pip install "libreyolo[tflite]"- Dimuat kembali
LibreYOLO("weights/LibreYOLO9t.tflite")- Bentuk
- Hanya statis. dynamic=True ditolak.
- Presisi
- Hanya FP32. half=True dan int8=True ditolak.
- Membutuhkan
- Python 3.12 atau lebih baru, karena onnx2tf 2.4.x tidak menerbitkan wheel yang lebih lama
Instalasi
# LiteRT adalah nama Google saat ini untuk TensorFlow Lite. Kedua extra# memasang toolchain yang sama dan menghasilkan output .tflite yang sama.pip install "libreyolo[tflite]"python -c "import sys; print(sys.version_info >= (3, 12))"Extra ini menarik onnx2tf untuk konversinya dan ai-edge-litert untuk
menjalankan hasilnya, keduanya di balik marker Python 3.12. Pada interpreter yang
lebih lama, ekspor memunculkan ImportError yang menyebutkan syarat versi, bukan
gagal di dalam converter.
libreyolo[litert] memasang hal yang persis sama. String format litert adalah
alias untuk tflite, dan berkas keluarannya tetap .tflite.
Ekspor
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Menulis weights/LibreYOLO9t.tflite dan weights/LibreYOLO9t.tflite.jsonpath = model.export(format="tflite", imgsz=640)print(path)libreyolo export --model LibreYOLO9t.pt --format tflite --imgsz 640 # "litert" diterima sebagai alias dan mengarah ke exporter yang sama.libreyolo export --model LibreYOLO9t.pt --format litert --imgsz 640model.export( format="tflite", imgsz=640, # int, atau (tinggi, lebar) batch=1, simplify=True, # onnxsim atas ONNX perantara output_path=None, # None menulis weights/<stem>.tflite verbose=False, # True menampilkan log onnx2tf) # dynamic=True memunculkan ValueError: converter butuh bentuk statis.# half=True dan int8=True ditolak sebelum tracing.Family dan task diperiksa sebelum hal lain terjadi, sehingga kombinasi yang tidak
didukung langsung gagal dengan error converter atau runtime spesifik yang membuatnya
tidak masuk daftar, bukan pesan generik. Konversinya sendiri adalah panggilan
subprocess ke onnx2tf dalam mode flatbuffer_direct atas ONNX perantara yang statis.
Metadata ditulis sebagai sidecar. weights/LibreYOLO9t.tflite.json memuat family,
task, nama kelas, ukuran input dan skema pose; FlatBuffer sendiri tidak punya field
metadata LibreYOLO, jadi kedua berkas itu harus selalu berpasangan.
Menjalankan artefaknya
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("weights/LibreYOLO9t.tflite")result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])import json import numpy as npfrom ai_edge_litert.interpreter import Interpreter interpreter = Interpreter(model_path="weights/LibreYOLO9t.tflite")interpreter.allocate_tensors()detail = interpreter.get_input_details()[0]print(detail["shape"], detail["dtype"]) # NHWC, bukan NCHW interpreter.set_tensor(detail["index"], np.zeros(detail["shape"], np.float32))interpreter.invoke()for output in interpreter.get_output_details(): print(output["name"], interpreter.get_tensor(output["index"]).shape) # Nama kelas, task dan ukuran input tersimpan di sidecar.meta = json.load(open("weights/LibreYOLO9t.tflite.json"))print(meta["model_family"], meta["task"], meta["names"]) # Preprocessing, transpose NCHW ke NHWC dan postprocessing jadi milik Anda.LibreYOLO() melakukan dispatch berdasarkan sufiks .tflite dan mengembalikan
objek Results yang sama seperti dari checkpoint. Backend membaca sidecar, melakukan
transpose blob NCHW menjadi NHWC ketika interpreter meminta input channels-last,
menerapkan skala kuantisasi dan zero point milik interpreter bila ada, lalu
melakukan transpose output kembali ke layout yang diharapkan postprocessing LibreYOLO.
Snippet kedua adalah jalur runtime langsung. Preprocessing, transpose layout,
decoding, NMS dan penskalaan ulang koordinat semuanya menjadi milik Anda di sana,
dan detail layout adalah bagian yang paling mudah terlewat: onnx2tf menghasilkan
input channels-last, jadi blob berbentuk (1, 3, 640, 640) tidak akan terikat.
Batasan
Hanya bentuk statis. dynamic=True memunculkan ValueError sebelum tracing, dan
kanvas ekspor terkunci pada nilai yang dihasilkan imgsz.
Hanya FP32. half=True dan int8=True sama-sama ditolak saat validasi, sehingga
deployment terkuantisasi belum bisa dicapai dari exporter ini hari ini.
Cakupan di sini lebih sempit dibanding format graph, dan ditentukan oleh pengukuran, bukan oleh family. Kombinasi yang sudah tervalidasi mencakup deteksi YOLO9, YOLOX dan YOLO-NAS, segmentasi semantik PIDNet, empat family klasifikasi CNN, embedding DINOv2 dan SigLIP2, klasifikasi SigLIP2, edge TEED dan DexiNed, serta restorasi Real-ESRGAN dan SwinIR. SwinIR punya satu catatan tambahan: paritas hanya berlaku bila dimensi sumber persis sama dengan kanvas ekspor, dan sumber yang lebih kecil diberi padding sampai ukuran kanvas sebelum transformer berjalan, yang bisa berbeda dari inferensi native berukuran variabel.
Entri yang diblokir menyebutkan kegagalan persisnya, dan itu layak dibaca sebelum
mencoba workaround. Beberapa contoh: deteksi RF-DETR terkonversi pada kanvas 384
native-nya tetapi LiteRT tidak bisa mengalokasikannya karena STRIDED_SLICE
menerima input di atas rank 5-D yang didukungnya; PicoDet ditolak karena sebuah
RESHAPE memetakan 19.200 elemen input menjadi 9.600 elemen output; D-FINE membuat
converter crash pada penanganan bentuk GatherElements; RTMDet berhasil diekspor
dan dimuat ulang dengan paritas raw yang utuh, tetapi box publik turun ke 0.911 IoU
dengan pergeseran koordinat 29.9 px.
Untuk grid family dan task lengkap, lihat matriks ekspor. Untuk satu kombinasi, termasuk string alasan di balik sebuah blokir:
libreyolo formats --family yolo9 --task detect