Core ML
Core ML adalah format model on-device milik Apple. LibreYOLO melakukan tracing pada detektor di balik wrapper preprocessing per family, sehingga graph hasil konversi selalu menerima input gambar RGB yang kanonis, lalu menulis .mlpackage ML Program dengan metadata model terlampir.
- Flag
export(format="coreml")- Menulis
- Satu bundle .mlpackage (sebuah direktori) dalam format ML Program
- Tambahan
pip install "libreyolo[coreml]"- Dimuat kembali
LibreYOLO("weights/LibreYOLO9t.mlpackage") on macOS- Bentuk
- Tetap. Input berupa ct.ImageType dengan bentuk terkunci.
- Presisi
- FP32, FP16 (half=True). Tidak ada INT8.
- Family
- Hanya deteksi, untuk yolox, yolo9, rtdetr dan rfdetr
Instalasi
pip install "libreyolo[coreml]"Prediksi membutuhkan macOS. LibreYOLO() menolak .mlpackage di platform lain
dengan pesan yang menyebutkan platform saat ini, dan matriks dukungan mencatat
kombinasi ini sebagai tersedia dengan alasan bahwa paritas runtime membutuhkan runner macOS.
Ekspor
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Menulis bundle weights/LibreYOLO9t.mlpackagepath = model.export(format="coreml")print(path)libreyolo export --model LibreYOLO9t.pt --format coremlmodel.export( format="coreml", imgsz=640, batch=1, half=False, # True mengonversi dengan presisi komputasi FLOAT16 compute_units="all", # all | cpu_and_gpu | cpu_and_ne | cpu_only output_path=None, # None menulis weights/<stem>.mlpackage) # dynamic diterima, tetapi input berupa ct.ImageType dengan bentuk tetap,# dan metadata yang tertanam tetap mencatat dynamic=False.Bundle ditulis ke weights/ memakai stem checkpoint, dengan _fp16 ditambahkan
saat half=True. Sebuah .mlpackage adalah direktori, jadi salin seluruh isinya.
Setiap family melalui tracing di balik wrapper preprocessing, sehingga graph hasil
konversi menerima satu input kanonis: RGB, scale=1/255, tanpa bias, dideklarasikan
sebagai ct.ImageType. Wrapper itu menyerap konvensi milik masing-masing family,
yaitu BGR dalam rentang 0 sampai 255 untuk YOLOX, mean dan standar deviasi ImageNet
untuk RF-DETR, serta identitas untuk YOLO9 dan RT-DETR. Karena itu konsumen Core ML
cukup memberikan gambar biasa, bukan tensor khusus per family.
Konversi menargetkan ML Program dengan deployment target minimum iOS 15.
compute_units disimpan pada model hasil konversi dan dapat ditimpa lagi saat
artefak dimuat.
Metadata model masuk ke user_defined_metadata sebagai string, dan dari sanalah
backend membaca family, task, nama kelas, ukuran input dan skema pose.
NMS tertanam
from libreyolo import LibreYOLO # Hanya deteksi YOLOX dan YOLO9, batch 1.LibreYOLO("LibreYOLO9t.pt").export( format="coreml", nms=True, conf=0.25, iou=0.45,)libreyolo export --model LibreYOLO9t.pt --format coreml --nms \ --conf 0.25 --iou 0.45nms=True membungkus model dalam pipeline Core ML yang diakhiri layer
NonMaximumSuppression milik Apple. Hasilnya punya dua output: confidence,
berbentuk N kali jumlah kelas, dan coordinates, berbentuk N kali 4 sebagai
xywh ternormalisasi.
Ini hanya berlaku untuk deteksi YOLOX dan YOLO9, dan mensyaratkan batch 1. Family
bergaya DETR ditolak berdasarkan nama, karena set prediction mengambil top-k atas
query dan kelas tanpa langkah IoU sehingga tidak bisa memakai layer tersebut.
max_det juga tidak diekspos di sini; kalau batas jumlah deteksi penting, pakai
NMS tertanam ONNX.
Menjalankan artefak
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO( "weights/LibreYOLO9t.mlpackage", compute_units="all", # atau cpu_and_ne untuk mengunci Neural Engine)result = model.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])import coremltools as ctfrom PIL import Image mlmodel = ct.models.MLModel("weights/LibreYOLO9t.mlpackage")print(mlmodel.user_defined_metadata["model_family"])print(mlmodel.user_defined_metadata["names"]) # Input berupa gambar bernama "image" dengan ukuran ekspor yang tetap.image = Image.open(SAMPLE_IMAGE).convert("RGB").resize((640, 640))out = mlmodel.predict({"image": image})print({name: value.shape for name, value in out.items()}) # Letterboxing dan postprocessing menjadi tanggung jawab Anda di jalur ini.LibreYOLO() mengenali direktori berakhiran .mlpackage dan mengembalikan objek
Results yang sama seperti checkpoint. compute_units adalah satu-satunya argumen
yang diteruskan factory untuk format ini, dan nilainya bisa all, cpu_and_gpu,
cpu_and_ne dan cpu_only. Argumen device diabaikan, karena Core ML mengarahkan
pekerjaan lewat compute unit.
Snippet kedua adalah jalur runtime langsung. Letterboxing, decoding, NMS dan
penyesuaian skala koordinat menjadi tanggung jawab Anda di sana, dan nama kelas
tersimpan di user_defined_metadata.
Batasan
Empat family, hanya deteksi: yolox, yolo9, rtdetr dan rfdetr. Selain itu
ditolak saat preflight, karena wrapper preprocessing yang sadar family itulah yang
membuat kontrak input gambar tetap benar, dan family di luar daftar itu akan
dikonversi dengan normalisasi yang salah. Pesan error menyebut ONNX dan TorchScript
sebagai alternatif.
Bentuk input dikunci mati oleh ct.ImageType, jadi dynamic=True tidak mengubah
apa pun dan metadata mencatat dynamic=False. Ekspor bundle kedua untuk resolusi
kedua.
half=True mengonversi dengan presisi komputasi FP16. Tidak ada jalur INT8 dari
exporter ini.
Untuk grid family dan task lengkap, lihat matriks ekspor. Untuk format on-device Apple yang lebih baru, lihat Core AI. Untuk satu kombinasi:
libreyolo formats --family yolo9 --task detect