Có gì tiếp theo
Phát hiện và phân đoạn là các quy trình cốt lõi đã được kiểm chứng. Trang này ghi lại các head tác vụ và kỹ thuật huấn luyện mới mà chúng tôi đang tích cực xây dựng trên nền tảng đó: phân loại, hộp xoay, tư thế và tinh chỉnh tiết kiệm tham số.
Tổng quan
LibreYOLO là framework đa tác vụ: cùng một họ mô hình có thể dùng các head khác nhau. Bên cạnh quy trình phát hiện và phân đoạn đã được kiểm chứng, một số tác vụ mới đang được bổ sung cho hai họ chủ lực là YOLO9 và RF-DETR. Tất cả đều tích hợp vào cùng factory LibreYOLO(...) và cùng container Results, nên sau khi nắm API cốt lõi, đây chỉ là những phần bổ sung nhỏ.
- Phân loại cho YOLO9 và RF-DETR. Nhãn cho toàn bộ ảnh với xác suất top-1 / top-5.
- Hộp xoay (OBB) cho YOLO9 và RF-DETR. Hộp xoay dành cho ảnh hàng không và ảnh tài liệu.
- Keypoint / tư thế cho YOLO9 và RF-DETR. Keypoint người theo COCO-17.
- Phát hiện đối tượng nhỏ bằng YOLO9-P2, một biến thể YOLOv9 có thang stride 4 cho các đối tượng 4-16 px trong ảnh hàng không và ảnh từ drone, kèm một checkpoint xem trước nghiên cứu cho VisDrone.
- LoRA / DoRA để tinh chỉnh RF-DETR. Thích nghi backbone transformer chỉ với một phần nhỏ bộ nhớ.
Đọc phần này trước
Mọi nội dung trên trang này đều ở giai đoạn thử nghiệm và một số vẫn đang được phát triển trên các nhánh tính năng. API, giá trị mặc định và định dạng nhãn có thể thay đổi trước khi được đưa vào phần cốt lõi đã kiểm chứng. Phần Độ ổn định theo dõi chính xác trạng thái của từng tính năng.
Chọn tác vụ
Mỗi họ mặc định dùng tác vụ phát hiện. Bạn chọn một tác vụ khác theo một trong ba cách, được phân giải theo thứ tự ưu tiên sau:
| Mức ưu tiên | Cơ chế | Ví dụ |
|---|---|---|
| 1 | Đối số tường minh | task="obb" |
| 2 | Metadata của checkpoint | tác vụ được lưu trong tệp .pt đã huấn luyện |
| 3 | Hậu tố tên tệp | -cls, -obb, -pose |
| 4 | Mặc định của họ | detect |
Vì factory công khai LibreYOLO(...) cần một tệp trọng số thực, cách rõ ràng nhất để bắt đầu một trong các tác vụ này từ đầu là khởi tạo trực tiếp class của họ mô hình và truyền task=. Các checkpoint đã huấn luyện được tải lại qua factory hợp nhất và tự động nhận diện tác vụ.
1 from libreyolo import LibreYOLO, LibreYOLO9, LibreRFDETR 2 3 # Start a task from scratch via the family class 4 m = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 5 6 # Load a trained checkpoint via the unified factory (task auto-detected) 7 m = LibreYOLO("LibreYOLO9t-obb.pt")
Phân loại ảnh
Phân loại gán một nhãn cho toàn bộ ảnh. YOLO9 giữ nguyên backbone và gắn thêm một head phân loại gọn nhẹ; RF-DETR tái sử dụng encoder DINOv2 và thêm một head tuyến tính sau pooling. Cả hai chạy ở độ phân giải 224 x 224.
Suy luận và kết quả Probs
Dự đoán trả về một đối tượng Results có trường probs chứa phân phối softmax trên các lớp đối tượng.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-cls.pt") 4 r = model.predict("cat.jpg") 5 6 print(r.probs.top1) # class id of the argmax 7 print(r.probs.top1conf) # its probability 8 print(r.probs.top5) # [id, id, id, id, id] 9 print(model.names[r.probs.top1]) # human-readable label
| Trường | Loại | Ý nghĩa |
|---|---|---|
probs.top1 | int | ID lớp đối tượng argmax. |
probs.top5 | list[int] | ID của 5 lớp đối tượng hàng đầu, theo thứ tự giảm dần. |
probs.top1conf | float | Xác suất của lớp đối tượng top-1. |
probs.top5conf | tensor | Xác suất của các lớp đối tượng top-5. |
probs.data | tensor | Vector softmax đầy đủ. |
Định dạng dataset và huấn luyện
Phân loại dùng bố cục ImageFolder, không dùng YAML. Tên lớp đối tượng là tên các thư mục con đã sắp xếp, cố định theo split train.
1 dataset/ 2 train/ 3 cat/ img001.jpg ... 4 dog/ img104.jpg ... 5 val/ 6 cat/ ... 7 dog/ ...
Đối số data= nhận một thư mục, URL .zip hoặc tên tự động tải xuống đã biết (imagenette160 và imagenet10). Head được tái tạo tự động để khớp với số lớp đối tượng của tập dữ liệu (dataset).
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 4 result = model.train( 5 data="imagenette160", # folder, .zip URL, or known name 6 epochs=10, batch=64, imgsz=224, 7 optimizer="adamw", lr0=1e-3, 8 ) 9 # Validation reports metrics/accuracy_top1 and metrics/accuracy_top5
Các lần chạy tham chiếu
Kiểm tra nhanh trong quá trình phát triển: YOLO9-t đạt top-1 0.79 / top-5 0.975 trên imagenette160 (10 epoch), còn RF-DETR-n đạt top-1 0.69 / top-5 0.96 (6 epoch). RF-DETR cần truy cập internet trong lần chạy đầu tiên để lấy backbone DINOv2; khi ngoại tuyến, mô hình dùng khởi tạo ngẫu nhiên dự phòng.
Hộp xoay (OBB)
Hộp xoay có thêm góc xoay, phù hợp với ảnh hàng không, tài liệu và các cảnh dày đặc. YOLO9 thêm một nhánh góc vào detect head; RF-DETR thêm một embedding góc có thể học vào decoder.
Suy luận và kết quả OBB
Đối tượng Results cung cấp trường obb. Góc dùng đơn vị radian.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-obb.pt") 4 r = model.predict("aerial.jpg") 5 6 for i in range(len(r.obb.cls)): 7 cx, cy, w, h, angle = r.obb.xywhr[i] # angle in radians 8 corners = r.obb.xyxyxyxy[i] # 4 (x, y) corner points 9 conf, cls = r.obb.conf[i], r.obb.cls[i]
| Trường | Hình dạng | Ý nghĩa |
|---|---|---|
obb.xywhr | N x 5 | [cx, cy, w, h, angle], góc tính bằng radian. |
obb.xyxyxyxy | N x 4 x 2 | Bốn điểm góc cho mỗi hộp. |
obb.conf | N | Độ tin cậy của mỗi hộp. |
obb.cls | N | ID lớp đối tượng của mỗi hộp. |
Định dạng dataset và huấn luyện
OBB dùng data YAML theo kiểu phát hiện tiêu chuẩn, nhưng nhãn là các tệp văn bản YOLO-OBB với chính xác chín trường trên mỗi dòng: một ID lớp đối tượng, theo sau là bốn điểm góc đã chuẩn hóa. Góc được suy ra từ các điểm góc, không được lưu.
1 # class_id x1 y1 x2 y2 x3 y3 x4 y4 (all normalized to [0, 1]) 2 0 0.51 0.32 0.66 0.38 0.62 0.55 0.47 0.49 3 2 0.10 0.71 0.18 0.69 0.20 0.80 0.12 0.82
Không thể tải trực tiếp checkpoint phát hiện thông thường vào mô hình OBB. Chuyển từ detect sang OBB chỉ được phép để warm-start huấn luyện: truyền pretrained=True (YOLO9) hoặc cờ transfer tường minh trên RF-DETR. Mosaic và mixup bị tắt cho OBB cho đến khi có augmentation nhận biết điểm góc, đồng thời suy luận chia ô không được hỗ trợ.
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="obb") 4 # Warm-start the backbone from a same-family detect checkpoint 5 result = model.train(data="dota8.yaml", pretrained=True, epochs=100, imgsz=640) 6 7 # CLI equivalent 8 # libreyolo train model=LibreYOLO9t.pt data=dota8.yaml --task obb
Kiểm định dùng AP theo IoU xoay, được báo cáo dưới dạng mAP50 và mAP50-95 trong nhóm metric OBB.
Keypoint / Tư thế
Ước lượng tư thế dự đoán keypoint cho từng thực thể được phát hiện. Bố cục mặc định là keypoint người COCO-17. Trong phiên bản đầu tiên, tư thế YOLO9 và RF-DETR chỉ hỗ trợ người với một lớp đối tượng; trọng số tư thế YOLO-NAS và EdgeCrafter đã có sẵn trong repo.
Suy luận và kết quả Keypoints
Đối tượng Results cung cấp trường keypoints có hình dạng (N, K, 3), trong đó channel cuối là độ hiển thị hoặc độ tin cậy, theo tọa độ pixel của ảnh gốc.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-pose.pt") 4 r = model.predict("athletes.jpg") 5 6 kp = r.keypoints 7 print(kp.xy.shape) # (N, 17, 2) pixel coordinates 8 print(kp.conf) # (N, 17) per-keypoint visibility / confidence 9 print(kp.xyn) # normalized coordinates 10 print(r.boxes.xyxy) # person boxes still come along
| Trường | Hình dạng | Ý nghĩa |
|---|---|---|
keypoints.xy | N x K x 2 | Tọa độ keypoint theo pixel. |
keypoints.xyn | N x K x 2 | Tọa độ keypoint đã chuẩn hóa. |
keypoints.conf | N x K | Độ hiển thị / độ tin cậy của từng keypoint. |
keypoints.has_visible | N x K | Mặt nạ Boolean cho các keypoint nhìn thấy. |
Định dạng dataset và huấn luyện
Pose dùng một data YAML phải khai báo kpt_shape: [K, 2|3] và, để tăng cường lật ngang, một flip_idx. Nhãn là các dòng văn bản YOLO-pose: một ID lớp đối tượng, một hộp đã chuẩn hóa, sau đó là K bộ ba keypoint (x, y, v) với độ hiển thị v thuộc {0, 1, 2}.
1 path: coco8-pose 2 train: images/train 3 val: images/val 4 nc: 1 5 names: 6 0: person 7 kpt_shape: [17, 3] 8 flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
1 from libreyolo import LibreYOLO9 2 3 # Warm-start from a detection checkpoint; the keypoint head is reinitialized 4 model = LibreYOLO9("LibreYOLO9t.pt", size="t", task="pose") 5 model.train(data="coco8-pose.yaml", epochs=100, imgsz=640) 6 7 # Validation reports OKS-based AP via the pose validator
Đang được phát triển tích cực
Tư thế YOLO9 và RF-DETR nằm trên một nhánh tính năng và chưa được hợp nhất; hãy coi API trên là contract dự kiến thay vì contract đã cố định. Trọng số tư thế YOLO-NAS được liên kết từ thượng nguồn thay vì được sao chép và phải được chuẩn bị thủ công.
Phát hiện đối tượng nhỏ (YOLO9-P2)
YOLO9-P2 là YOLOv9 với thang phát hiện thứ tư ở stride 4. YOLOv9 gốc phát hiện ở các stride 8/16/32, vì vậy các đối tượng nhỏ hơn ~16 px nằm dưới lưới mịn nhất; head P2 bắt được dải 4-16 px phổ biến trong cảnh quay hàng không và từ drone.
Trong thử nghiệm A/B có kiểm soát trên VisDrone (cùng recipe, cùng độ phân giải, cùng khởi tạo; thay đổi duy nhất là head P2), AP của đối tượng nhỏ tăng +49% so với YOLOv9 gốc cùng kích thước. Độ phân giải huấn luyện cao hơn cùng kích thước s lớn hơn đã làm AP đối tượng nhỏ tăng gần gấp đôi trong toàn dự án:
| Mô hình | AP | AP50 | AP_small |
|---|---|---|---|
| YOLO9-t gốc @640 (đối chứng) | 0.123 | 0.220 | 0.047 |
| YOLO9-P2-t @640 (A/B cùng recipe) | 0.138 | 0.254 | 0.070 |
| YOLO9-P2-s @768 (bản xem trước đã phát hành) | 0.226 | 0.385 | 0.141 |
VisDrone2019-DET val (548 ảnh), pycocotools, một seed; chênh lệch ±1 điểm được xem là nhiễu.
Bản xem trước nghiên cứu VisDrone
Một checkpoint đã huấn luyện được phát hành với tên LibreYOLO9P2s-visdrone. Họ mô hình đã được hợp nhất vào dev nhưng chưa có trong bản phát hành PyPI, vì vậy hãy cài đặt từ mã nguồn cho đến bản phát hành tiếp theo.
1 from libreyolo import LibreYOLO 2 3 # Auto-downloads from the LibreYOLO Hugging Face org 4 model = LibreYOLO("LibreYOLO9P2s-visdrone.pt") 5 6 # Evaluate/predict at 768 - the resolution it was trained at 7 results = model.predict("aerial.jpg", imgsz=768, conf=0.25)
Giấy phép phi thương mại
Checkpoint xem trước được huấn luyện trên VisDrone2019-DET (AISKYEYE, Tianjin University) theo giấy phép CC BY-NC-SA 3.0: chỉ sử dụng cho mục đích phi thương mại, khác với mã nguồn MIT và trọng số mặc định COCO của LibreYOLO. Checkpoint này phát hiện 10 lớp đối tượng hàng không VisDrone, không phải COCO. Model card đi kèm recipe huấn luyện chính xác, các chỉ số theo từng epoch và bộ chuyển đổi dataset theo nguyên tắc clean-room để bạn có thể tái tạo kết quả hoặc huấn luyện lại trên dữ liệu của riêng mình.
Khi nào (không) nên dùng
Chọn kiến trúc phù hợp với bối cảnh. Trên dữ liệu giống COCO ("small" nghĩa là 16-32 px), head P2 không giúp cải thiện; YOLOv9 gốc là lựa chọn tốt hơn. Hãy dùng YOLO9-P2 khi các đối tượng nhỏ hơn ~16 px: cảnh quay từ drone và trên không, CCTV ở xa, các ô ảnh vệ tinh. Thang bổ sung làm lượng tính toán và số anchor tăng gần gấp đôi. Đó là cái giá của lưới stride 4.
Huấn luyện mô hình của riêng bạn
YOLO9-P2 khởi tạo transfer từ các checkpoint detect YOLOv9 gốc: backbone, neck dùng chung và các tower head hiện có được tải; các module P2 mới bắt đầu từ đầu. Recipe dưới đây ghi lại những gì chúng tôi đã phải vất vả mới rút ra được trên dữ liệu đối tượng rất nhỏ:
1 from libreyolo import LibreYOLO9P2 2 3 model = LibreYOLO9P2(None, size="s") 4 model.train( 5 data="/abs/path/tiny_objects.yaml", 6 imgsz=768, # resolution is the biggest lever for tiny objects 7 lr0=0.005, # the family default 0.01 diverges on transfer init 8 mosaic_prob=0.0, # mosaic tiling shrinks tiny objects below detectability 9 mixup_prob=0.0, 10 hsv_prob=1.0, flip_prob=0.5, 11 max_labels=600, # dense aerial frames exceed the default 100-box cap 12 pretrained="LibreYOLO9s.pt", # transfer init from stock YOLOv9 13 epochs=60, 14 )
Tinh chỉnh LoRA / DoRA
Các adapter kiểu LoRA cho phép tinh chỉnh backbone transformer của RF-DETR bằng cách huấn luyện một tập nhỏ ma trận hạng thấp trong khi trọng số cơ sở vẫn được giữ cố định. Cách này giảm bộ nhớ cho optimizer và gradient, lý tưởng để thích nghi một checkpoint mạnh với miền dữ liệu mới trên phần cứng vừa phải.
Bật tính năng
Toàn bộ API công khai chỉ là một cờ duy nhất trong train(). Không có núm rank, alpha hoặc target-module nào cần tinh chỉnh; recipe được cố định ở một cấu hình đã kiểm thử kỹ. Bên trong, mã sử dụng DoRA (LoRA phân rã trọng số, rank 16) cho các projection query, key và value của attention DINOv2.
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("rf-detr-nano.pth") # sizes n, s, m, l 4 result = model.train( 5 data="data.yaml", 6 lora=True, # DoRA on the frozen DINOv2 backbone 7 epochs=100, batch_size=4, lr=1e-4, 8 ) 9 10 # Resume: LoRA is auto-detected from the checkpoint, no need to repeat the flag 11 model.train(data="data.yaml", resume=True)
1 # CLI equivalent 2 libreyolo train --model rf-detr-nano.pth --data data.yaml --lora
Checkpoint và xuất
- Các checkpoint huấn luyện giữ lại tensor adapter và config ghi lại rằng LoRA đã được dùng, vì vậy việc tải và tiếp tục huấn luyện sẽ tự động tái tạo đồ thị adapter.
- Detect head luôn có thể huấn luyện, vì vậy bạn vẫn có thể thích nghi với số lớp đối tượng mới.
export()hợp nhất các adapter trở lại trọng số dense. Mô hình đã xuất là mô hình thông thường và không mang dependencypeft.- LoRA chỉ dành cho RF-DETR; truyền
lora=Truecho các họ khác sẽ phát sinh lỗi rõ ràng.
Cài thêm
Huấn luyện LoRA cần dependency adapter: pip install "libreyolo[lora]", lệnh này cài stack RF-DETR và peft. Các mô hình đã xuất (đã hợp nhất) không cần dependency này khi suy luận.
Độ ổn định
Trạng thái hiện tại của từng tính năng. Mọi thứ ở đây đều mang tính thử nghiệm; bảng này phản ánh trung thực tình hình.
| Tính năng | Các họ | Trạng thái |
|---|---|---|
| Phân loại | YOLO9, RF-DETR | PR đang mở |
| Hộp xoay (OBB) | YOLO9, RF-DETR | Thử nghiệm |
| Keypoint / tư thế | YOLO9, RF-DETR | Sắp được tích hợp |
| Keypoint / tư thế | YOLO-NAS, EdgeCrafter | Có sẵn |
| Phát hiện đối tượng nhỏ | YOLO9-P2 | Bản xem trước nghiên cứu |
| LoRA / DoRA | RF-DETR | Đã được đánh giá |
Đang tìm quy trình ổn định?
Đối với ứng dụng production, phần cốt lõi đã được kiểm chứng gồm phát hiện bằng YOLO9 và phát hiện, phân đoạn bằng RF-DETR. Xem tài liệu cốt lõi cho các tác vụ đó và LibreVLM cho phát hiện với từ vựng mở.