EdgeCrafter
Một vision transformer nhỏ gọn cho dự đoán dày đặc trên phần cứng biên, được upstream công bố dưới dạng ba mô hình cùng họ: ECDet, ECPose và ECSeg. LibreYOLO nạp cả ba thành một family, với tác vụ được xác định bởi checkpoint.
- Tác vụ
- detection, pose, instance segmentation
- Kích thước
- s, m, l, x at 640 px
- Cài đặt
pip install libreyolo- Bậc hỗ trợ
- Cốt lõi, từ v1.2.0. Các bộ phát hiện cốt lõi có thể huấn luyện: tính năng theo sau các mô hình chủ lực trong cùng đợt phát hành.
- Thượng nguồn
- EdgeCrafter của Intellindust AI Lab, Apache-2.0 original COCO weights; restricted obj2coco weights. Bài báo, mã nguồn
- Giấy phép
- Mã nguồn Apache-2.0, trọng số Apache-2.0 original COCO weights; restricted obj2coco weights. Sử dụng thương mại
Cài đặt
EdgeCrafter không cần thành phần tùy chọn nào. Mọi nội dung mà mô hình import đều có trong bản cài đặt cơ sở.
pip install libreyoloTinh chỉnh adapter với lora=True là ngoại lệ và cần thành phần bổ sung lora.
pip install "libreyolo[lora]"Dự đoán
Trọng số được tải từ Hugging Face trong lần sử dụng đầu tiên và lưu vào cache cục bộ.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreECs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreECs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Hậu tố -pose trong tên tệp chọn keypoint head, vì vậy không cần# đối số task ở đây.model = LibreYOLO("LibreECs-pose.pt")result = model(SAMPLE_IMAGE, save=True) print(result.keypoints.xy)print(result.boxes.conf)from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreECs-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)Tác vụ được xác định từ tên tệp, vì vậy checkpoint có -pose hoặc -seg sẽ tự
chọn head và không nhận đối số task. Cả ba đều trả về đối tượng Results giống
mọi family khác, với result.keypoints được thêm cho tư thế và result.masks
cho phân đoạn. Tác vụ tư thế bao gồm một lớp đối tượng là người, với 17 keypoint
COCO, và số lượng được cố định khi dựng mô hình. Nó không có box head, vì vậy
mỗi hộp tư thế là phạm vi bao của chính các keypoint, còn kênh keypoint thứ ba
là một hằng số thay vì điểm số theo từng điểm.
conf và max_det lọc quá trình chọn query; iou được chấp nhận để giữ tính
tương thích API nhưng không có tác dụng, vì cả ba head đều decode một tập query
không có bước NMS. Xem dự đoán để biết về nguồn, stream và cách
xử lý kết quả.
Dự đoán phát hiện chấp nhận imgsz=(height, width) hình chữ nhật; huấn luyện và xuất vẫn có các ràng buộc hình dạng riêng.
Biến thể
Có bốn kích thước. Tất cả đều chạy ở cùng độ phân giải đầu vào, vì vậy bảng phân biệt chúng theo số lượng tham số và độ chính xác.
| Checkpoint | Đầu vào (px) | mAP 50-95 | Tham số (M) |
|---|---|---|---|
| LibreECl | 640 | 60.1 | 32.97 |
| LibreECm | 640 | 58.4 | 19.43 |
| LibreECs | 640 | 54.3 | 9.88 |
| LibreECx | 640 | 61.1 | 49.94 |
COCO val2017, 500 images. Được đo bằng bộ benchmark LibreYOLO và công bố trên Vision Analysis, nơi so sánh độ trễ giữa các phần cứng và runtime, đồng thời lưu trữ đầy đủ bản ghi của từng lần chạy.
Upstream công bố ECDet, ECPose và ECSeg dưới dạng ba mô hình riêng thay vì một mô hình có ba head. Chúng dùng chung backbone ECViT và hybrid encoder, chỉ khác ở head, nên LibreYOLO gộp chúng thành một family và để tên tệp checkpoint mang thông tin tác vụ. Do đó, một chữ cái chỉ kích thước biểu thị cùng backbone và encoder trên cả ba mô hình, còn các lệnh dự đoán, xác thực và xuất nhận cùng đối số bất kể bạn nạp mô hình nào.
Huấn luyện
Cả ba tác vụ đều huấn luyện qua train(). Phương thức này đọc tác vụ từ
checkpoint đã nạp và chọn trainer tương ứng.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train( data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=5e-4,)libreyolo train model=LibreECs.pt data=my-dataset.yaml epochs=50 imgsz=640 batch=8 lr0=5e-4from libreyolo import LibreYOLO # Cần dataset keypoint một lớp có data.yaml khai báo kpt_shape,# và imgsz bằng kích thước gốc của checkpoint.model = LibreYOLO("LibreECs-pose.pt")model.train( data="my-pose-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO # Cần nhãn polygon và imgsz bằng kích thước gốc của checkpoint.model = LibreYOLO("LibreECs-seg.pt")model.train( data="my-dataset.yaml", epochs=50, imgsz=640,)from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.train( data="my-dataset.yaml", epochs=50, lora=True,)Những nội dung đã được kiểm tra cho phát hiện và phân đoạn: độ tương đồng
inference với upstream ở mức 1e-5, theo từng lớp và từng kích thước, cùng khả
năng chạy loss và một bước huấn luyện trên đầu vào tổng hợp. Những nội dung chưa
được kiểm tra, theo docstring của chính train(): độ hội tụ của một lượt tinh
chỉnh đầy đủ, huấn luyện multi-GPU, bước nạp lại mô hình tốt nhất sau khi dừng
augmentation và ánh xạ lại lớp đối tượng từ Objects365 sang COCO. Đường dẫn tư
thế tuân theo recipe đã công bố của DETRPose, dùng Hungarian matcher trên chi
phí lớp đối tượng, keypoint L1 và OKS với cơ chế khử nhiễu keypoint tương phản;
độ hội tụ đầu cuối của nó cũng chưa được kiểm tra.
Nếu giữ nguyên, trainer chạy 74 epoch ở lr0=5e-4 và bật mixed precision, theo
recipe upstream: AdamW, lịch flat cosine, EMA ở 0.9999 và đầu vào được chuẩn hóa
theo ImageNet. Cả tư thế lẫn phân đoạn đều yêu cầu imgsz bằng kích thước gốc
của checkpoint vì evaluation anchor grid được dựng khi khởi tạo mô hình; giá
trị khác sẽ phát sinh lỗi trước khi lượt chạy bắt đầu. Tư thế còn yêu cầu
dataset một lớp có data.yaml khai báo kpt_shape, với số lượng keypoint khớp
với head.
lora=True chỉ áp dụng cho phát hiện; tư thế và phân đoạn sẽ phát sinh
ValueError khi dùng tùy chọn này. Trên Apple silicon, trainer giữ lượt chạy
trên GPU và gửi một phép toán sang CPU, đó là phép lan truyền ngược grid-sample
bên trong deformable attention mà PyTorch chưa triển khai trong Metal.
Xem huấn luyện để biết về dataset, tăng cường dữ liệu (data augmentation), multi-GPU và logger.
Xác thực
val() trả về một dictionary được lập chỉ mục bằng tên metric và in kết quả
theo từng lớp đối tượng khi vẫn bật verbose.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreECs.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreECs-pose.pt")metrics = model.val(data="my-pose-dataset.yaml") print(metrics["metrics/keypoints_mAP50-95"])print(metrics["metrics/keypoints_mAP50"])from libreyolo import LibreYOLO model = LibreYOLO("LibreECs-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # mặt nạprint(metrics["metrics/mAP50-95(B)"]) # hộpTác vụ tư thế báo cáo metric OKS của keypoint dưới metrics/keypoints_*. Tác vụ
phân đoạn báo cáo mặt nạ dưới key metrics/mAP50-95 thuần và lặp lại cả hai góc
nhìn trong một lượt, hộp dưới (B) và mặt nạ dưới (M).
Xuất
| Tác vụ | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: được hỗ trợ | Detection to TorchScript: được hỗ trợ | Detection to ExecuTorch: được hỗ trợ | Detection to TensorRT: được hỗ trợ | Detection to OpenVINO: được hỗ trợ | Detection to Paddle: được hỗ trợ | Detection to MNN: được hỗ trợ | Detection to RKNN: không được hỗ trợ | Detection to ncnn: không được hỗ trợ | Detection to TFLite: không được hỗ trợ | Detection to CoreML: không được hỗ trợ | Detection to Core AI: được hỗ trợ |
| Pose | Pose to ONNX: được hỗ trợ | Pose to TorchScript: được hỗ trợ | Pose to ExecuTorch: được hỗ trợ | Pose to TensorRT: được hỗ trợ | Pose to OpenVINO: được hỗ trợ | Pose to Paddle: được hỗ trợ | Pose to MNN: không được hỗ trợ | Pose to RKNN: không được hỗ trợ | Pose to ncnn: không được hỗ trợ | Pose to TFLite: không được hỗ trợ | Pose to CoreML: không được hỗ trợ | Pose to Core AI: không được hỗ trợ |
| Instance segmentation | Instance segmentation to ONNX: được hỗ trợ | Instance segmentation to TorchScript: được hỗ trợ | Instance segmentation to ExecuTorch: được hỗ trợ | Instance segmentation to TensorRT: được hỗ trợ | Instance segmentation to OpenVINO: được hỗ trợ | Instance segmentation to Paddle: được hỗ trợ | Instance segmentation to MNN: không được hỗ trợ | Instance segmentation to RKNN: không được hỗ trợ | Instance segmentation to ncnn: không được hỗ trợ | Instance segmentation to TFLite: không được hỗ trợ | Instance segmentation to CoreML: không được hỗ trợ | Instance segmentation to Core AI: không được hỗ trợ |
Artifact đã xuất được nạp lại qua LibreYOLO() dựa trên hậu tố tệp, vì vậy tệp
.onnx hoặc .engine hoạt động như một checkpoint và trả về cùng một đối tượng
Results. Tư thế và phân đoạn xuất ở đầu vào cố định 640 x 640 thay vì shape
động, và một số target phát hiện cũng dùng canvas cố định, gồm OpenVINO, Paddle,
MNN, ExecuTorch và Core AI. Phần Xuất liệt kê các đối số mà mọi
định dạng chấp nhận và những thành phần bổ sung mà một số định dạng yêu cầu.
from libreyolo import LibreYOLO model = LibreYOLO("LibreECs.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreECs.pt format=onnx imgsz=640libreyolo export model=LibreECs-pose.pt format=onnx imgsz=640libreyolo export model=LibreECs-seg.pt format=onnx imgsz=640from libreyolo import LibreYOLO, SAMPLE_IMAGE # Factory định tuyến theo hậu tố tệp, vì vậy artifact đã xuất được nạp# như mọi checkpoint khác và trả về cùng một đối tượng Results.model = LibreYOLO("LibreECs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Đầu vào và đầu ra ONNX
| Tensor | images float32 [batch, 3, height, width] |
|---|---|
| Màu | RGB |
| Chuẩn hóa tỉ lệ | pixel / 255 |
| Chuẩn hóa | trung bình [0.485,0.456,0.406], độ lệch chuẩn [0.229,0.224,0.225] |
| Đổi kích thước | kéo giãn về rộng x cao (không đệm, không giữ tỉ lệ khung hình), Pillow bilinear |
Cách tái tạo phép đổi kích thước bilinear của Pillow
LibreYOLO đổi kích thước bằng bộ lọc BILINEAR của Pillow (Image.resize). Đó không phải OpenCV INTER_LINEAR hay INTER_AREA: khi thu nhỏ, Pillow nới rộng bộ lọc theo hệ số thu nhỏ, còn các phép đổi kích thước của OpenCV làm thay đổi kết quả phát hiện và dịch các hộp đi vài pixel. Để tái tạo mà không dùng Pillow, hãy đổi kích thước một trục, làm tròn về 8 bit, rồi đổi kích thước trục còn lại và làm tròn lần nữa. Với mỗi trục, đặt s = in_size / out_size và f = max(s, 1). Pixel đầu ra i có tâm c = (i + 0.5) * s và đọc các pixel nguồn j từ int(c - f + 0.5) đến int(c + f + 0.5) - 1, giới hạn trong ảnh, mỗi pixel có trọng số max(0, 1 - |j + 0.5 - c| / f), chia cho tổng các trọng số. Pillow tính bằng dấu phẩy cố định và chọn thứ tự trục theo hình dạng ảnh, nên trọng số dấu phẩy động có thể lệch một mức ở vài pixel. Điều đó không làm thay đổi kết quả trong các kiểm tra của chúng tôi.
Square input only. Export rejects a non-square imgsz, and height and width are 640 by default.
Detect and segment: batch size 1 only. The graph declares a dynamic batch axis, but batches of 2 or more fail in 1.7.0. Pose runs with any batch size.
For a bit-exact match, use Pillow's integer math: multiply each weight by 2^22 and round half away from zero, sum weight x pixel in integers, add 2^21, shift right by 22 and clip to 0 to 255.
Divide by 255 after the resize, then subtract the ImageNet mean and divide by the ImageNet std per channel.
Detection, xuất mặc định
| Đầu ra | Hình dạng | Ý nghĩa |
|---|---|---|
pred_logits | [batch, queries, nc] | Raw class logits per query, sigmoid not applied. 300 queries and 80 classes for the COCO checkpoints. |
pred_boxes | [batch, queries, 4] | Boxes as cx, cy, w, h, normalized 0 to 1 of the input. |
Hậu xử lý
- Apply sigmoid to pred_logits.
- Flatten the scores to queries x nc and take the top max_det (300 by default) over all queries x classes. For flat index k, the query is k // nc and the class is k % nc. One query can yield several classes.
- Keep the entries whose score is strictly above the confidence threshold (0.25 by default). There is no NMS.
- Convert the query's box to x1, y1, x2, y2 with x1 = cx - w / 2, y1 = cy - h / 2, x2 = cx + w / 2, y2 = cy + h / 2.
- Map boxes back to the original image: multiply x by the original width and y by the original height. The input was stretched, so no pad offset applies. LibreYOLO does not clip these boxes to the image.
- nms=True is not available for this family: export raises NotImplementedError.
Instance segmentation, xuất mặc định
| Đầu ra | Hình dạng | Ý nghĩa |
|---|---|---|
pred_logits | [batch, queries, nc] | Raw class logits per query, sigmoid not applied. 300 queries and 80 classes for the COCO checkpoints. |
pred_boxes | [batch, queries, 4] | Boxes as cx, cy, w, h, normalized 0 to 1 of the input. |
pred_masks | [batch, queries, mask_h, mask_w] | Raw mask logits per query over the whole input canvas, sigmoid not applied. mask_h and mask_w are a quarter of the input, 160 x 160 at 640 x 640. |
Hậu xử lý
- Select detections exactly as for detect: sigmoid on pred_logits, top max_det (300 by default) over all queries x classes, keep scores strictly above the confidence threshold (0.25 by default). There is no NMS.
- Convert and map the boxes as for detect: cx, cy, w, h to x1, y1, x2, y2, then multiply x by the original width and y by the original height. LibreYOLO does not clip these boxes to the image.
- For each kept detection, take the mask logits of its query and resize them straight to the original image size with bilinear interpolation, half-pixel centers (align_corners=False) and no antialiasing. cv2.resize with INTER_LINEAR on float32 does this.
- The mask is the pixels whose resized logit is above 0. Masks are not cropped to the box.
- nms=True is not available for this family: export raises NotImplementedError.
Pose, xuất mặc định
| Đầu ra | Hình dạng | Ý nghĩa |
|---|---|---|
pred_logits | [batch, queries, 2] | Raw logits per query, sigmoid not applied. 60 queries. Index 1, the last one, is the person class. Index 0 is an unused slot. |
pred_keypoints | [batch, queries, num_keypoints * 2] | Keypoints as x0, y0, x1, y1 and so on, normalized 0 to 1 of the input. num_keypoints is 17 (COCO order) and is recorded in the num_keypoints metadata key. There is no box output and no keypoint visibility or confidence. |
Hậu xử lý
- Apply sigmoid to the last logit of each query. That is the person score.
- Sort the queries by score, highest first, and keep at most max_det (300 by default, so all 60 queries). Keep the queries whose score is at or above the confidence threshold (0.25 by default). Note at or above here, strictly above for detect and segment. There is no NMS.
- Reshape each kept query's keypoints to [num_keypoints, 2]. Map them back to the original image: multiply x by the original width and y by the original height.
- The box is the extent of the mapped keypoints: x1, y1 are the minimum x and y, x2, y2 the maximum. The class is always 0 (person).
- LibreYOLO reports visibility 1 for every keypoint, since the graph predicts xy only.
- nms=True is not available for this family: export raises NotImplementedError.
Để kiểm tra bản triển khai của bạn, hãy chạy cùng tệp đó qua LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") trả về kết quả tham chiếu. Đã kiểm chứng với LibreYOLO 1.7.0.
Checkpoint
Tất cả tệp trọng số đã công bố cho family này.
| Tệp | Đầu vào (px) | Giấy phép trọng số |
|---|---|---|
| Detection | ||
| LibreECs.pt | 640 | apache-2.0 |
| LibreECm.pt | 640 | apache-2.0 |
| LibreECl.pt | 640 | apache-2.0 |
| LibreECx.pt | 640 | apache-2.0 |
| LibreECl-obj2coco.pt | other | |
| LibreECm-obj2coco.pt | other | |
| LibreECs-obj2coco.pt | other | |
| LibreECx-obj2coco.pt | other | |
| Pose | ||
| LibreECs-pose.pt | 640 | apache-2.0 |
| LibreECm-pose.pt | 640 | apache-2.0 |
| LibreECl-pose.pt | 640 | apache-2.0 |
| LibreECx-pose.pt | 640 | apache-2.0 |
| LibreECl-pose-obj2coco.pt | other | |
| LibreECm-pose-obj2coco.pt | other | |
| LibreECs-pose-obj2coco.pt | other | |
| LibreECx-pose-obj2coco.pt | other | |
| Instance segmentation | ||
| LibreECs-seg.pt | 640 | apache-2.0 |
| LibreECm-seg.pt | 640 | apache-2.0 |
| LibreECl-seg.pt | 640 | apache-2.0 |
| LibreECx-seg.pt | 640 | apache-2.0 |
| LibreECm-seg-obj2coco.pt | other | |
| LibreECs-seg-obj2coco.pt | other | |
| LibreECl-seg-obj2coco.pt | other | |
| LibreECx-seg-obj2coco.pt | other | |
Mọi tệp ở trên hiện đều có trong tổ chức LibreYOLO và được tải xuống trong lần sử dụng đầu tiên.
Các biến thể obj2coco bao gồm phát hiện, phân đoạn và tư thế. Bạn phải chủ động đồng ý tải chúng và các điều khoản upstream hạn chế sử dụng thương mại. Checkpoint COCO gốc giữ giấy phép Apache-2.0 đã ghi.
Giấy phép
Hãy kiểm tra giấy phép trong repo Hugging Face của trọng số cụ thể mà bạn tải xuống. Mỗi checkpoint trong tổ chức LibreYOLO đều có giấy phép riêng và giấy phép có thể khác nhau trong cùng một họ. Repo đó là nguồn có thẩm quyền; phần tóm tắt dưới đây mô tả các điều khoản áp dụng khi trang này được kiểm chứng lần gần nhất.
Đây là phần mô tả các giấy phép liên quan, không phải tư vấn pháp lý. Nếu câu trả lời có ý nghĩa về mặt thương mại, hãy tự đọc các giấy phép và tham khảo cố vấn của riêng bạn.
- Công trình gốc
- EdgeCrafter, Intellindust AI Lab
- Giấy phép thượng nguồn
- Apache-2.0 original COCO weights; restricted obj2coco weights
- Nguồn thượng nguồn
- github.com/Intellindust-AI-Lab/EdgeCrafter
- Mã nguồn LibreYOLO
- MIT
- Trọng số
- Apache-2.0 original COCO weights; restricted obj2coco weights, được phát hành lại tại huggingface.co/LibreYOLO
- Diễn giải
- Original COCO checkpoints retain their recorded Apache-2.0 grant. The obj2coco detection, segmentation and pose variants require explicit opt-in and retain non-commercial upstream terms. The library code license does not replace those weight terms.
Trích dẫn
@article{liu2026edgecrafter,
title={EdgeCrafter: Compact ViTs for Edge Dense Prediction via Task-Specialized Distillation},
author={Liu, Longfei and Hou, Yongjie and Li, Yang and Wang, Qirui and Sha, Youyang and Yu, Yongjun and Wang, Yinzhi and Ru, Peizhe and Yu, Xuanlong and Shen, Xi},
journal={arXiv},
year={2026}
}Được sao chép từ khối trích dẫn của tác giả tại github.com/Intellindust-AI-Lab/EdgeCrafter#-citation.