Core ML
Core ML là định dạng mô hình chạy trên thiết bị của Apple. LibreYOLO trace mô hình phát hiện đối tượng phía sau một wrapper tiền xử lý riêng cho từng họ, nên đồ thị sau khi chuyển đổi luôn nhận một đầu vào ảnh RGB chuẩn, rồi ghi ra một .mlpackage ở định dạng ML Program kèm theo metadata của mô hình.
- Flag
export(format="coreml")- Kết quả ghi ra
- Một bundle .mlpackage (là một thư mục) ở định dạng ML Program
- Phụ thuộc thêm
pip install "libreyolo[coreml]"- Tải lại bằng
LibreYOLO("weights/LibreYOLO9t.mlpackage") trên macOS- Hình dạng
- Cố định. Đầu vào là một ct.ImageType có hình dạng cứng.
- Precision
- FP32, FP16 (half=True). Không có INT8.
- Họ mô hình
- Chỉ phát hiện đối tượng, cho yolox, yolo9, rtdetr và rfdetr
Cài đặt
pip install "libreyolo[coreml]"Dự đoán cần macOS. LibreYOLO() từ chối một .mlpackage trên mọi nền tảng khác,
kèm thông báo nêu tên nền tảng hiện tại, và ma trận hỗ trợ ghi nhận các tổ hợp này
là khả dụng với lý do việc đối chiếu runtime cần một máy chạy macOS.
Xuất mô hình
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9t.pt") # Ghi ra 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 chuyển đổi với compute precision FLOAT16 compute_units="all", # all | cpu_and_gpu | cpu_and_ne | cpu_only output_path=None, # None ghi ra weights/<stem>.mlpackage) # dynamic được chấp nhận nhưng đầu vào là ct.ImageType có hình dạng cố định,# và metadata nhúng kèm vẫn ghi dynamic=False trong mọi trường hợpBundle được ghi vào weights/ theo stem của checkpoint, thêm _fp16 vào sau khi
half=True. Một .mlpackage là một thư mục, nên hãy sao chép nguyên cả cây thư mục.
Mọi họ mô hình đều được trace phía sau một wrapper tiền xử lý, nên đồ thị sau khi
chuyển đổi chỉ nhận một đầu vào chuẩn duy nhất: RGB, scale=1/255, không có bias,
khai báo dưới dạng ct.ImageType. Wrapper hấp thụ quy ước riêng của từng họ, đó là
BGR trong khoảng 0 đến 255 với YOLOX, mean và standard deviation của ImageNet với
RF-DETR, và identity với YOLO9 cùng RT-DETR. Đó là lý do một bên tiêu thụ Core ML
đưa vào một ảnh thông thường thay vì một tensor riêng của từng họ.
Việc chuyển đổi nhắm tới ML Program với deployment target tối thiểu là iOS 15.
compute_units được lưu trên mô hình đã chuyển đổi và có thể ghi đè lại lần nữa khi
artifact được tải.
Metadata của mô hình đi vào user_defined_metadata dưới dạng chuỗi, và đó là nơi
backend đọc ra họ mô hình, tác vụ, tên các lớp đối tượng, kích thước đầu vào và schema pose.
NMS nhúng sẵn
from libreyolo import LibreYOLO # Chỉ phát hiện đối tượng với YOLOX và YOLO9, batch 1LibreYOLO("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 bọc mô hình trong một pipeline Core ML kết thúc bằng lớp
NonMaximumSuppression của Apple. Kết quả có hai đầu ra: confidence, hình dạng
N nhân với số lớp đối tượng, và coordinates, hình dạng N nhân 4 theo xywh đã chuẩn hóa.
Nó chỉ áp dụng cho phát hiện đối tượng với YOLOX và YOLO9, và đòi hỏi batch 1. Các họ
theo kiểu DETR bị từ chối theo tên, vì dự đoán theo tập hợp lấy top-k trên các query và
các lớp đối tượng mà không có bước IoU nào và không dùng được lớp đó. max_det cũng
không được phơi ra ở đây; khi số lượng detection tối đa là điều quan trọng, hãy dùng
NMS nhúng sẵn của ONNX thay thế.
Chạy artifact
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO( "weights/LibreYOLO9t.mlpackage", compute_units="all", # hoặc cpu_and_ne để ghim vào 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"]) # Đầu vào là một ảnh tên "image" ở đúng kích thước đã xuấtimage = Image.open(SAMPLE_IMAGE).convert("RGB").resize((640, 640))out = mlmodel.predict({"image": image})print({name: value.shape for name, value in out.items()}) # Trên đường này letterboxing và hậu xử lý là việc của bạnLibreYOLO() nhận ra một thư mục có phần đuôi .mlpackage và trả về cùng đối tượng
Results như khi dùng checkpoint. compute_units là đối số duy nhất mà factory chuyển
tiếp cho định dạng này, và nó chấp nhận all, cpu_and_gpu, cpu_and_ne và
cpu_only. Đối số device bị bỏ qua, vì thay vào đó Core ML định tuyến qua compute units.
Snippet thứ hai là đường chạy runtime trần. Ở đó letterboxing, việc giải mã, NMS và
việc rescale lại tọa độ trở thành việc của bạn, còn tên các lớp đối tượng nằm trong
user_defined_metadata.
Giới hạn
Bốn họ mô hình, chỉ phát hiện đối tượng: yolox, yolo9, rtdetr và rfdetr. Bất cứ
thứ gì khác đều bị từ chối ở bước preflight, vì chính wrapper tiền xử lý theo từng họ là
thứ làm cho hợp đồng đầu vào ảnh cố định trở nên đúng đắn, và một họ nằm ngoài đó sẽ
chuyển đổi với phép chuẩn hóa sai. Thông báo lỗi nêu tên ONNX và TorchScript là các
phương án thay thế.
Hình dạng đầu vào bị cố định cứng bởi ct.ImageType, nên dynamic=True không thay đổi
gì và metadata ghi dynamic=False. Hãy xuất một bundle thứ hai cho một độ phân giải thứ hai.
half=True chuyển đổi với compute precision FP16. Không có đường INT8 nào từ exporter này.
Để xem toàn bộ lưới họ mô hình và tác vụ, xem ma trận xuất mô hình. Với định dạng chạy trên thiết bị mới hơn của Apple, xem Core AI. Để kiểm tra một tổ hợp:
libreyolo formats --family yolo9 --task detect