YOLOE: Phát hiện và phân đoạn theo từ vựng mở theo thời gian thực#
Ultralytics YOLOE (Real-Time Seeing Anything) là model phát hiện theo từ vựng mở và phân đoạn đối tượng: thay vì dùng danh sách lớp cố định tại thời điểm huấn luyện, model nhận các danh mục bạn muốn tại thời điểm suy luận dưới dạng prompt văn bản, ví dụ hình ảnh hoặc từ vựng tích hợp gồm 4.585 tên. Được xây dựng trên các kiến trúc Ultralytics YOLO — YOLOv8, YOLO11 và YOLO26 — đồng thời lấy cảm hứng từ YOLO-World, YOLOE đạt độ chính xác zero-shot tiên tiến nhất với tốc độ gần bằng YOLO closed-set.
Xem: Cách sử dụng Ultralytics YOLOE-26 (mới) | Từ vựng mở và nhận diện mọi thứ theo thời gian thực 🚀
Bắt đầu nhanh#
Nêu tên các lớp bạn muốn rồi chạy model. YOLOE-26 trả về bbox và mask phân đoạn đối tượng cho những danh mục mà model chưa từng được huấn luyện.
from ultralytics import YOLOE
model = YOLOE("yoloe-26s-seg.pt")
# "double-decker bus" không phải là lớp COCO; YOLOE nhận diện lớp này chỉ dựa vào từ ngữ
model.set_classes(["double-decker bus", "person"])
results = model.predict("https://ultralytics.com/images/bus.jpg")
results[0].show()Lần gọi set_classes() đầu tiên sẽ tải xuống text encoder; hãy xem Cài đặt và yêu cầu trước khi triển khai lên máy không có quyền truy cập mạng.
Chọn chế độ prompting#
YOLOE hỗ trợ ba chế độ prompting; lựa chọn của bạn quyết định checkpoint cần tải và định dạng nhãn lớp. Hãy chọn hàng tương ứng với dữ liệu bạn có thể cung cấp tại thời điểm suy luận.

| Chế độ | Checkpoint | Bạn cung cấp | Tên lớp trong kết quả | Sử dụng khi |
|---|---|---|---|---|
| Prompt văn bản | *-seg.pt | Tên lớp dưới dạng chuỗi | Chính xác các tên bạn đã nhập | Bạn có thể mô tả mục tiêu bằng từ ngữ — lựa chọn thông thường |
| Prompt hình ảnh | *-seg.pt | BBox ví dụ trên ảnh tham chiếu | object0, object1, … chung chung | Bạn không thể diễn đạt mục tiêu bằng từ ngữ: một bộ phận cụ thể, logo hoặc lỗi |
| Không cần prompt | *-seg-pf.pt | Không có gì | Tên từ bộ từ vựng tích hợp gồm 4.585 tên | Bạn đang lập danh mục hoặc khám phá và chưa biết trước cần tìm gì |
- Prompt hình ảnh không mang theo nhãn của bạn. Các class ID trong
visual_promptsdùng để nhóm các ví dụ; model trả về chúng dưới dạngobject0,object1và tiếp tục như vậy. Bạn cần tự ánh xạ chúng về tên riêng của mình. - Checkpoint không cần prompt từ chối
set_classes(). Gọi mục này trên model*-seg-pf.ptsẽ gây ra lỗiAssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Thay vào đó, hãy tải checkpoint*-seg.ptkhi cần dùng các lớp của riêng bạn.
Cài đặt và yêu cầu#
YOLOE được tích hợp trong package Ultralytics chính:
pip install -U ultralyticsNgoài ra, prompting bằng văn bản cần có text encoder; text encoder được tải về khi sử dụng lần đầu chứ không phải lúc cài đặt:
- Lần gọi
set_classes()đầu tiên sẽ cài đặt ultralytics/CLIP từ GitHub bằngpip(package này cung cấp tokenizer) và tải text encoder TorchScript vào thư mục làm việc hiện tại. YOLOE-26 tảimobileclip2_b.ts, dung lượng khoảng 254 MB; YOLOE-11 và YOLOE-v8 tảimobileclip_blt.ts. Hãy chạy tải xuống một lần từ thư mục bạn sẽ chạy chương trình hoặc sao chép file vào đó; nếu không, file sẽ được tải lại. - Cả hai bước đều cần truy cập mạng, vì vậy hãy chạy một lượt dự đoán có prompt trước khi triển khai lên máy ngoại tuyến hoặc cách ly mạng.
- Prompt hình ảnh và checkpoint không cần prompt hoàn toàn không cần text encoder.
Các checkpoint YOLOE-26 yêu cầu ultralytics phiên bản 8.4.0 trở lên; các dòng YOLOE-11 và YOLOE-v8 có trong những bản phát hành cũ hơn. Một lượt dự đoán bằng prompt văn bản sẽ kiểm tra toàn bộ quy trình — tải checkpoint, cài đặt CLIP, text encoder và suy luận:
yolo predict model=yoloe-26s-seg.pt source="https://ultralytics.com/images/bus.jpg" classes="person"Để bỏ hoàn toàn việc tải text encoder tại thời điểm suy luận, hãy tích hợp prompt vào weights một lần rồi tái sử dụng — xem Tái sử dụng embedding của prompt.
Tổng quan kiến trúc#
YOLOE giữ cấu trúc YOLO tiêu chuẩn — backbone tích chập để trích xuất đặc trưng, neck để hợp nhất đa tỷ lệ và head không anchor, tách biệt để dự đoán lớp và bbox — đồng thời bổ sung ba module, mỗi module ứng với một chế độ prompting:
- Căn chỉnh vùng-văn bản có thể tái tham số hóa (RepRTA) tinh chỉnh embedding văn bản từ CLIP thông qua một mạng phụ trợ nhỏ. Mạng này chỉ chạy một lần cho mỗi lượt gọi
set_classes()và được gộp khi export, nên không tốn chi phí cho mỗi frame. Thao tác được thực hiện ở mỗi lượt forward là so sánh embedding prompt đã lưu với đặc trưng vùng; xem Giới hạn để biết chi phí khi dùng tập prompt lớn. - Bộ mã hóa prompt hình ảnh kích hoạt ngữ nghĩa (SAVPE) mã hóa đặc trưng ngữ nghĩa và kích hoạt từ một bbox ví dụ, điều kiện hóa model theo các đối tượng có hình dạng tương tự. Đây là quy trình one-shot dành cho các mục tiêu khó gọi tên, chẳng hạn như logo hoặc một bộ phận cụ thể.
- Đối sánh tương phản prompt vùng lười (LRPC) đối sánh embedding vùng với bộ từ vựng tích hợp gồm 4.585 tên, nhờ đó checkpoint không cần prompt có thể nhận diện đối tượng mà không cần prompt bên ngoài hay text encoder.
Phân đoạn đối tượng được thực hiện bằng một nhánh mask trên head phát hiện, giống như YOLOv8-Seg, và mỗi dự đoán đều chứa mask trên results[0].masks. Sau khi model được export, các module open-world được tái tham số hóa thành head YOLO tiêu chuẩn, vì vậy file đã export chạy theo quy trình detect/segment thông thường.
Các model hiện có#
Mỗi checkpoint dưới đây đều là model phân đoạn đối tượng và hỗ trợ val, predict, export và track. Tải file *-seg.pt để dùng prompting bằng văn bản hoặc hình ảnh, và file *-seg-pf.pt để suy luận không cần prompt; hai loại này không thể thay thế cho nhau, xem Chọn chế độ prompting. Chỉ các file *-seg.pt hỗ trợ train; checkpoint không cần prompt được tạo từ model đã huấn luyện bằng prompt văn bản, xem Huấn luyện các model chính thức từ đầu.
| Model | Prompt văn bản / hình ảnh | Không cần prompt |
|---|---|---|
| YOLOE-26n | yoloe-26n-seg.pt | yoloe-26n-seg-pf.pt |
| YOLOE-26s | yoloe-26s-seg.pt | yoloe-26s-seg-pf.pt |
| YOLOE-26m | yoloe-26m-seg.pt | yoloe-26m-seg-pf.pt |
| YOLOE-26l | yoloe-26l-seg.pt | yoloe-26l-seg-pf.pt |
| YOLOE-26x | yoloe-26x-seg.pt | yoloe-26x-seg-pf.pt |
| YOLOE-11s | yoloe-11s-seg.pt | yoloe-11s-seg-pf.pt |
| YOLOE-11m | yoloe-11m-seg.pt | yoloe-11m-seg-pf.pt |
| YOLOE-11l | yoloe-11l-seg.pt | yoloe-11l-seg-pf.pt |
| YOLOE-v8s | yoloe-v8s-seg.pt | yoloe-v8s-seg-pf.pt |
| YOLOE-v8m | yoloe-v8m-seg.pt | yoloe-v8m-seg-pf.pt |
| YOLOE-v8l | yoloe-v8l-seg.pt | yoloe-v8l-seg-pf.pt |
Hiệu năng YOLOE trên LVIS#
Kết quả zero-shot trên tập minival của LVIS ở độ phân giải 640 pixel, trích từ bài báo Ultralytics YOLO26.
Prompt văn bản và hình ảnh#
Mỗi ô độ chính xác và số tham số hiển thị theo thứ tự prompt văn bản / prompt hình ảnh; FLOPs chỉ được ghi một lần. Số tham số và FLOPs áp dụng cho cấu hình phát hiện được đánh giá trong bài báo. Độ chính xác là số liệu Non-E2E của bài báo, giao thức duy nhất được báo cáo cho mọi model trong phép so sánh; head end-to-end của YOLOE-26 có AP thấp hơn tối đa 1,1 AP với prompt văn bản và 2,6 AP với prompt hình ảnh.
| Model | mAP50-95 | mAPr | mAPc | mAPf | params (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| YOLOE-26n | 24.7 / 21.9 | 20.5 / 17.6 | 24.1 / 22.3 | 26.1 / 22.4 | 3.9 / 3.1 | 6.1 |
| YOLOE-26s | 30.8 / 28.6 | 23.9 / 25.1 | 29.6 / 27.8 | 33.0 / 29.9 | 10.7 / 11.0 | 21.9 |
| YOLOE-26m | 35.4 / 33.9 | 31.1 / 33.4 | 34.7 / 34.0 | 36.9 / 33.8 | 21.3 / 25.1 | 70.6 |
| YOLOE-26l | 37.8 / 36.3 | 35.1 / 37.6 | 37.6 / 36.2 | 38.5 / 36.1 | 25.5 / 29.3 | 89.0 |
| YOLOE-26x | 40.6 / 38.5 | 37.4 / 35.3 | 40.9 / 38.8 | 41.0 / 38.8 | 55.2 / 65.2 | 197.7 |
| YOLOE-11s | 27.5 / 26.3 | 21.4 / 22.5 | 26.8 / 27.1 | 29.3 / 26.4 | 10.7 / 10.9 | 22.7 |
| YOLOE-11m | 33.0 / 31.4 | 26.9 / 27.1 | 32.5 / 31.9 | 34.5 / 31.7 | 21.0 / 24.8 | 70.4 |
| YOLOE-11l | 35.2 / 33.7 | 29.1 / 28.1 | 35.0 / 34.6 | 36.5 / 33.8 | 26.0 / 29.8 | 89.5 |
| YOLOE-v8s | 27.9 / 26.2 | 22.3 / 21.3 | 27.8 / 27.7 | 29.0 / 25.7 | 12.3 / 12.6 | 29.8 |
| YOLOE-v8m | 32.6 / 31.0 | 26.9 / 27.0 | 31.9 / 31.7 | 34.4 / 31.1 | 26.4 / 28.4 | 80.7 |
| YOLOE-v8l | 35.9 / 34.2 | 33.2 / 33.2 | 34.8 / 34.6 | 37.3 / 34.1 | 43.5 / 47.3 | 167.6 |
Không cần prompt#
Checkpoint không cần prompt đưa ra kết quả dựa trên từ vựng tích hợp mà không cần cung cấp prompt. Mỗi ô độ chính xác hiển thị theo thứ tự end-to-end / Non-E2E, hai giao thức mà bài báo dùng để đánh giá YOLOE-26; trang YOLO26 trích dẫn cột Non-E2E.
| Model | mAP50-95 | mAPr | mAPc | mAPf | params (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| YOLOE-26n-pf | 16.6 / 17.7 | 15.7 / 15.8 | 15.3 / 16.4 | 17.9 / 19.2 | 2.3 | 5.3 |
| YOLOE-26s-pf | 21.4 / 22.6 | 16.2 / 20.2 | 20.1 / 20.9 | 23.5 / 24.5 | 9.0 | 20.8 |
| YOLOE-26m-pf | 25.7 / 26.4 | 26.7 / 24.5 | 24.0 / 25.0 | 26.9 / 27.9 | 19.4 | 68.4 |
| YOLOE-26l-pf | 27.2 / 28.0 | 26.3 / 25.7 | 25.7 / 26.8 | 28.7 / 29.5 | 23.6 | 86.8 |
| YOLOE-26x-pf | 29.9 / 31.1 | 27.5 / 28.9 | 29.1 / 30.7 | 31.1 / 31.7 | 53.1 | 194.4 |
Với prompt văn bản và hình ảnh, các model YOLOE-26 dẫn đầu các phiên bản YOLOE-11 và YOLOE-v8 tương ứng ở mọi kích thước tương ứng về mAP50-95, đồng thời có số tham số và FLOPs thấp hơn dòng v8. Trên cùng tập dữ liệu, bài báo báo cáo YOLO-Worldv2 đạt 24.4 (S), 32.4 (M) và 35.5 (L), còn các detector dựa trên Transformer là GLIP-T đạt 26.0, GDINO-T đạt 27.4 và DetCLIP-T đạt 34.4; mỗi model có từ 155 đến 232 M tham số. Bài báo YOLOE gốc bổ sung hai kết quả cho các model ở quy mô v8 được giới thiệu trong bài. Trên LVIS, YOLOE-v8s vượt YOLO-Worldv2-S 3.5 AP với chi phí huấn luyện bằng một phần ba và tốc độ suy luận nhanh hơn 1.4×. Khi chuyển sang COCO, YOLOE-v8l tăng 0.6 box AP và 0.4 mask AP so với YOLOv8-L closed-set, trong khi thời gian huấn luyện giảm gần 4×.
Bài báo YOLO26 đánh giá một cấu hình detection. Các weight được phát hành là checkpoint segmentation và có thêm nhánh mask, SAVPE cùng phép chiếu văn bản, vì vậy model yoloe-26l-seg.pt được tải báo cáo 35.4 M và 142.0 B thay vì 25.5 M và 89.0 B ở trên. Trong cả hai trường hợp, con số FLOPs không tính độ tương đồng giữa vùng và văn bản, do đó chi phí thực tế tăng theo kích thước của tập prompt dù giá trị trong cột không đổi; xem Các hạn chế.
Ví dụ sử dụng#
Mọi ví dụ YOLOE bên dưới đều chạy qua Python API. Dự đoán bằng prompt văn bản, validation, export, tracking và huấn luyện thông thường cũng hoạt động qua CLI; các công thức fine-tuning và visual prompting truyền một lớp trainer hoặc predictor làm đối số, chỉ Python API mới hỗ trợ cách này.
Cách sử dụng để huấn luyện#
Fine-tune bất kỳ checkpoint *-seg.pt nào đã phát hành trên dataset YOLO của riêng bạn. Quy trình này phần lớn tuân theo quy trình huấn luyện YOLO tiêu chuẩn; điểm khác biệt nằm ở trainer bạn truyền vào. YOLOEPESegTrainer gộp tên các class của bạn vào head rồi fine-tune từ đó, phù hợp khi dùng nhãn của riêng bạn; trainer mặc định không huấn luyện dựa trên tên class của bạn.
Xem: Cách huấn luyện YOLOE trên dataset phân đoạn phụ tùng ô tô | Model từ vựng mở, dự đoán và xuất 🚀
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
model = YOLOE("yoloe-26s-seg.pt")
results = model.train(
data="coco128-seg.yaml",
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Quan trọng: trainer fine-tuning, không phải trainer mặc định
)Mọi checkpoint được phát hành đều là model segmentation. Để huấn luyện detector, hãy tạo model từ YAML tương ứng, tải weight segmentation cùng kích thước rồi chuyển sang trainer detection. Mọi thứ khác giữ nguyên.
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
model = YOLOE("yoloe-26s.yaml").load("yoloe-26s-seg.pt")
results = model.train(data="coco128.yaml", epochs=80, patience=10, trainer=YOLOEPETrainer)Cách sử dụng Predict#
Lệnh gọi dùng prompt văn bản là lệnh được trình bày trong Bắt đầu nhanh. Hai chế độ còn lại cần thêm một đối số:
Visual prompt cung cấp cho model một ví dụ thay vì mô tả đối tượng. visual_prompts nhận một mảng bboxes chứa các box ví dụ và một mảng cls chứa ID class, mỗi box ứng với một ID. Các ID này chỉ là nhóm tạm thời, không phải nhãn — chúng phải là các số liên tiếp bắt đầu từ 0, và kết quả được trả về dưới dạng object0, object1, … chứ không theo tên do bạn chọn.
Các box ví dụ có thể nằm ngay trên hình ảnh bạn đang dự đoán:
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
# Mỗi đối tượng cần phát hiện có một box ví dụ riêng, kèm ID class riêng
visual_prompts = {
"bboxes": np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]), # người, kính
"cls": np.array([0, 1]),
}
results = model.predict(
"ultralytics/assets/bus.jpg",
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()Hoặc nằm trên một hình ảnh tham chiếu riêng được truyền vào dưới dạng refer_image; khi đó, bboxes và cls mô tả các đối tượng trong hình ảnh tham chiếu, không phải trong hình ảnh đích:
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
visual_prompts = {"bboxes": np.array([[221.52, 405.8, 344.98, 857.54]]), "cls": np.array([0])} # person
results = model.predict(
"ultralytics/assets/zidane.jpg", # Hình ảnh đích
refer_image="ultralytics/assets/bus.jpg", # Vị trí đặt các box ví dụ
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()
# refer_image cũng thiết lập class cố định, vì vậy các lệnh gọi sau không cần prompt
results = model("ultralytics/assets/bus.jpg")
model.export(format="onnx") # Và export cũng giữ lại chúngKhi source là video hoặc luồng dữ liệu, frame đầu tiên sẽ tự động trở thành refer_image, nên các prompt bạn truyền vào được áp dụng cho frame đó và duy trì xuyên suốt phần còn lại của video. Truyền refer_image một cách tường minh để chọn frame khác.
Cả source và refer_image đều nhận trực tiếp tensor torch, rất hữu ích khi hình ảnh đã có sẵn từ một pipeline hiện có. Cung cấp tọa độ box theo hệ tọa độ pixel của chính tensor:
import numpy as np
import torch
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-11l-seg.pt")
img_tensor = torch.rand(1, 3, 480, 480) # tensor float (1, 3, H, W) trong khoảng [0, 1]
visual_prompts = {"bboxes": np.array([[10, 10, 50, 50]]), "cls": np.array([0])}
results = model.predict(
img_tensor,
refer_image=img_tensor,
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
imgsz=640,
)Để dự đoán đồng thời trên nhiều hình ảnh, hãy lồng prompt sâu thêm một cấp: một mảng bboxes và một mảng cls cho mỗi hình ảnh nguồn, theo đúng thứ tự của các nguồn.
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
model = YOLOE("yoloe-26l-seg.pt")
visual_prompts = {
"bboxes": [
np.array([[221.52, 405.8, 344.98, 857.54], [120, 425, 160, 445]]), # bus.jpg: người, kính
np.array([[150, 200, 1150, 700]]), # zidane.jpg: người
],
"cls": [np.array([0, 1]), np.array([0])],
}
results = model.predict(
["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
results[0].show()Cách sử dụng Val#
Validation được thực hiện như với mọi model khác trên dataset segmentation:
from ultralytics import YOLOE
model = YOLOE("yoloe-26l-seg.pt") # hoặc yoloe-26s/m-seg.pt cho các kích thước khác
metrics = model.val(data="coco128-seg.yaml")Hai biến thể của cùng lệnh gọi hỗ trợ các chế độ prompting còn lại:
- Visual prompt —
model.val(data="coco128-seg.yaml", load_vp=True)trích xuất embedding hình ảnh cho mỗi danh mục trực tiếp từ dataset. Thêmrefer_data="coco.yaml"để lấy embedding từ dataset khác; dataset đó phải có chính xác cùng các danh mục. - Không cần prompt — tải checkpoint
*-seg-pf.ptvà truyềnsingle_cls=True.
Cách sử dụng export#
Có thể lưu embedding prompt một lần rồi tái sử dụng khi tạo các bản export tĩnh như ONNX, OpenVINO, TensorRT, CoreML, LiteRT và RKNN. Profile NPZ được model PyTorch gốc nạp trước khi export; đây không phải đầu vào runtime bổ sung, và model đã export không cần tệp NPZ.
Các class được cấu hình bằng set_classes() (hoặc qua refer_image đối với visual prompt) được tích hợp cố định vào weight đã export. Sau khi export, model không thể nhận prompt mới: gọi set_classes() hoặc truyền visual_prompts=... vào predict() trên bản export đã tải sẽ gây lỗi. Để thay đổi class cần phát hiện, hãy export lại từ checkpoint .pt gốc với prompt mới được cấu hình. Tệp đã export hoạt động như một model YOLO tiêu chuẩn và cũng có thể được tải bằng YOLO() thay vì YOLOE().
from ultralytics import YOLOE
model = YOLOE("yoloe-26n-seg.pt")
model.set_classes(["person", "bus"])
model.save_prompt_embeddings("person-bus.npz")
# Profile này gắn với checkpoint nguồn và có thể được tái sử dụng cho các lần export sau.
model = YOLOE("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="onnx")Cùng một profile prompt cũng có thể cấu hình model chỉ có detection được tạo từ kiến trúc YOLOE tương ứng. Cách này loại bỏ nhánh mask nhưng vẫn giữ các class được chỉ định bằng prompt:
from ultralytics import YOLOE
model = YOLOE("yoloe-26n.yaml").load("yoloe-26n-seg.pt")
model.load_prompt_embeddings("person-bus.npz")
model.export(format="rknn", name="rk3588", quantize=16)Theo dõi sử dụng#
Các class được chỉ định bằng prompt được đưa thẳng vào tracking, nhờ đó bạn có thể theo dõi những đối tượng mà tracker chưa từng được huấn luyện:
from ultralytics import YOLOE
model = YOLOE("yoloe-26s-seg.pt")
model.set_classes(["forklift", "pallet"])
# persist=True giữ ID track ổn định giữa các frame
for result in model.track("path/to/video.mp4", stream=True, persist=True):
print(result.boxes.id)So sánh YOLOE#
YOLOE nằm giữa detector closed-set và model open-vocabulary cỡ lớn. Ba phép so sánh giúp xác định liệu đây có phải lựa chọn phù hợp:
- So với YOLO closed-set. Sau khi thiết lập prompt, YOLOE dự đoán bằng quy trình detect/segment thông thường và export như mọi model khác. Điểm khác biệt là khả năng thay đổi danh sách class tại thời điểm suy luận thay vì huấn luyện lại; đổi lại, độ chính xác zero-shot thấp hơn nhiều so với model được huấn luyện trên các class của chính bạn.
- So với các dòng YOLOE đời trước. YOLOE-26 kế thừa head end-to-end không dùng NMS của YOLO26, hỗ trợ năm kích thước (n/s/m/l/x) so với ba kích thước trước đây (s/m/l), đồng thời dẫn đầu ở mọi kích thước tương ứng trong Hiệu năng.
- So với detector open-vocabulary dựa trên Transformer. GLIP và OWL-ViT chạy Transformer thị giác-ngôn ngữ tại thời điểm suy luận. YOLOE mã hóa prompt một lần rồi so sánh chúng với đặc trưng vùng bên trong head tích chập.
Các lựa chọn thay thế gần nhất đều nhận prompt văn bản, nhưng chỉ YOLOE và SAM 3 trả về mask; cả ba giải quyết các nhu cầu khác nhau:
| YOLOE | SAM 3 | YOLO-World | |
|---|---|---|---|
| Được thiết kế cho | Detection và segmentation thời gian thực cho các class được gọi tên | Segmentation khái niệm và tracking có thể điều khiển bằng prompt | Detection open-vocabulary thời gian thực |
| Masks | Có, với các checkpoint *-seg.pt | Có | Không, chỉ có box |
| Visual prompt | Có (SAVPE) | Có | Không |
| Chế độ không cần prompt | Có, từ vựng gồm 4,585 tên | Không | Không |
| Chọn model này khi | Bạn cần thông lượng cao và có thể nêu tên các class | Bạn cần segmentation khái niệm mạnh nhất và có thể dành thêm tài nguyên tính toán | Bạn đang sử dụng model này — xem ghi chú di chuyển bên dưới |
Đang dùng YOLO-World? API có cấu trúc tương tự: thay YOLOWorld bằng YOLOE, tải checkpoint *-seg.pt và giữ nguyên lệnh gọi set_classes(). Bạn sẽ có thêm mask và visual prompt; ghi chú về export liên quan đến class bị cố định áp dụng cho cả hai.
Các trường hợp sử dụng và ứng dụng#
Detection open-vocabulary loại bỏ bước huấn luyện lại cho từng class, đặc biệt hữu ích khi chưa xác định trước danh sách đối tượng cần phát hiện:
- Detection trong thế giới mở — robotics và hệ thống an ninh phải xử lý những đối tượng chưa được liệt kê khi huấn luyện.
- Detection một lần từ ví dụ — visual prompt nhận diện một linh kiện, logo hoặc lỗi cụ thể từ một box tham chiếu duy nhất, hữu ích trong kiểm tra công nghiệp.
- Lập danh mục đối tượng dài đuôi — từ vựng tích hợp gồm 4,585 tên đủ rộng cho các đợt giám sát đa dạng sinh học hoặc kiểm kê bán lẻ.
- Khởi tạo dataset — gán nhãn trước hình ảnh bằng box và mask để con người xem xét, sau đó huấn luyện một model closed-set nhanh trên dữ liệu thu được.
- Segmentation các đối tượng tùy ý — các checkpoint
*-seg.ptđược phát hành trả về mask cùng mỗi dự đoán, nhờ đó chẩn đoán hình ảnh y khoa và phân tích ảnh vệ tinh có được đầu ra chính xác đến từng pixel mà không cần model thứ hai.
Một quy trình phổ biến kết hợp hai chế độ: chạy chế độ không cần prompt một lần để phát hiện những gì có trong ảnh, sau đó chuyển sang prompt văn bản cho các danh mục cần quan tâm.
Hạn chế#
YOLOE đánh đổi độ chính xác để có khả năng thay đổi class tại thời điểm suy luận. Dưới đây là những hệ quả cần biết trước khi lựa chọn:
- Độ chính xác zero-shot thấp hơn nhiều so với model được huấn luyện trên các class của bạn. Các checkpoint dùng prompt đạt khoảng 22-40 mAP trên LVIS minival; YOLO closed-set được huấn luyện trên dữ liệu của bạn sẽ có kết quả tốt hơn ở những class đó. Hãy chọn YOLOE để xử lý các class bạn không thể huấn luyện, chứ không phải để thay thế việc huấn luyện.
- Các danh mục hiếm là điểm yếu. Cột mAPr trong Hiệu năng báo cáo riêng độ chính xác trên các class hiếm của LVIS; khi dùng prompt văn bản, chỉ số này thấp hơn các cột class phổ biến và thường gặp trong mọi hàng. Nếu đối tượng cần phát hiện ít gặp, hãy kiểm tra chỉ số này thay vì chỉ nhìn mAP tổng quát.
- Prompt mô tả hình dáng, không mô tả mối quan hệ. Detection hoạt động bằng cách so sánh đặc trưng vùng với embedding prompt, vì vậy các prompt phụ thuộc vào trạng thái, ngữ cảnh hoặc sự so sánh — như "bị hỏng", "ngoài cùng bên trái", "đối tượng đang được mang" — không có đặc điểm phù hợp đáng tin cậy để đối chiếu. Nên dùng cách diễn đạt gần với tên danh mục thông thường.
- Tập prompt lớn làm tăng độ trễ. Embedding prompt chỉ được tính một lần, nhưng được so sánh với đặc trưng vùng trong mỗi lượt forward. Đo trên CPU với
yoloe-26s-seg.pt, thời gian của một lượt forward tăng khoảng 19% khi chuyển từ 80 lên 1,203 class và tăng khoảng 89% với toàn bộ từ vựng gồm 4,585 tên. FLOPs được báo cáo không thay đổi vì phép tính độ tương đồng giữa vùng và văn bản không được tính, do đó profile sẽ không cảnh báo bạn. - Tên class chỉ là tên giữ chỗ cho đến khi bạn đặt prompt. Checkpoint
*-seg.ptvừa được tải sẽ trả vềnc=80với tên dạng số ("0","1", …), vì vậy hãy gọiset_classes()trước khi đọc nhãn. Các checkpoint không cần prompt đã có sẵn toàn bộ từ vựng.
Ghi chú triển khai#
- Phần cứng. Suy luận cần GPU NVIDIA với 4-8 GB VRAM; các kích thước
nvàschạy được trên GPU edge như Jetson hoặc trên CPU ở độ phân giải thấp hơn. Fine-tuning cần một GPU. - Mặc định, NMS không phụ thuộc class. YOLOE dự đoán bằng
agnostic_nms=True. Theo mặc định, cách này loại bỏ các box chồng lấp có điểm thấp hơn giữa các class khác nhau thay vì chỉ trong cùng một class, giúp tránh phát hiện trùng khi một đối tượng khớp với nhiều danh mục. Vớinms=False, YOLOE-26 không áp dụng suppression theo IoU; chế độ không phụ thuộc class chỉ giữ class tốt nhất cho mỗi anchor thay vì để một anchor xuất ra nhiều nhãn class. Truyềnagnostic_nms=Falseđể ghi đè. - Batching. Batch inference hoạt động trực tiếp, và visual prompt có thể khác nhau giữa các hình ảnh trong cùng một lệnh gọi.
Huấn luyện các model chính thức từ đầu#
Phần lớn người đọc không cần đến mục này. Quy trình này tái tạo các checkpoint open-vocabulary đã công bố từ Objects365, GQA và Flickr30k — khoảng 1.4 M mẫu huấn luyện trên 8× RTX 4090 — và không liên quan đến fine-tuning trên dữ liệu của bạn, nội dung được trình bày trong Cách sử dụng khi huấn luyện ở trên.
Mọi trainer kế thừa YOLOETrainer đều từ chối compile=True, bao gồm YOLOESegTrainer mặc định và tất cả trainer huấn luyện từ đầu bên dưới. Hãy truyền compile=False (giá trị mặc định). Hai trainer fine-tuning được dùng ở trên, YOLOEPESegTrainer và YOLOEPETrainer, không bị hạn chế này.
Huấn luyện cần có annotation phân đoạn. Bạn có thể tải các tệp đã xử lý bên dưới hoặc tự tạo bằng script do nhóm chính thức cung cấp, sử dụng SAM 2.1. Validation dùng LVIS minival.
| Dataset | Kiểu | Mẫu | Boxes | Annotation phân đoạn đã xử lý |
|---|---|---|---|---|
| Objects365v1 | Phát hiện | 609k | 9621k | objects365_train_segm.json |
| GQA | Grounding | 621k | 3681k | final_mixed_train_no_coco_segm.json |
| Flickr30k | Grounding | 149k | 641k | final_flickr_separateGT_train_segm.json |
Model dùng prompt văn bản được huấn luyện trước; hai chế độ prompting còn lại được tinh chỉnh từ model này:
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch
data = {
"train": {
"yolo_data": ["Objects365.yaml"],
"grounding_data": [
{
"img_path": "flickr/full_images/",
"json_file": "flickr/annotations/final_flickr_separateGT_train_segm.json",
},
{
"img_path": "mixed_grounding/gqa/images",
"json_file": "mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
},
],
},
"val": {"yolo_data": ["lvis.yaml"]},
}
model = YOLOE("yoloe-26l-seg.yaml")
model.train(
data=data, # hoặc đường dẫn đến tệp YAML chứa cùng cấu trúc
batch=128,
epochs=30,
close_mosaic=2,
optimizer="AdamW",
lr0=2e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOESegTrainerFromScratch,
device="0,1,2,3,4,5,6,7",
)Các checkpoint visual-prompt và prompt-free bắt đầu từ model text-prompt đã được huấn luyện đó và mỗi checkpoint cập nhật một module. YOLOESegVPTrainer là recipe visual-prompt, còn YOLOEPEFreeTrainer là recipe prompt-free, nhưng bản thân không lớp nào đóng băng bất cứ thứ gì: việc huấn luyện có chọn lọc đến từ danh sách freeze bạn truyền kèm, danh sách này nêu tên mọi phần tử con của head ngoại trừ savpe (tương ứng, mọi classification tower), và lần chạy prompt-free còn cần single_cls=True. Repository YOLOE chính thức lưu trữ đầy đủ các recipe cho model quy mô v8.
Sau khi hoàn tất, lần chạy prompt-free được tái tham số hóa thành checkpoint hiển thị tên mà không cần prompt khi inference, bằng cách dùng get_vocab và set_vocab:
from ultralytics import YOLOE
# Trọng số được ghi bởi lần chạy prompt-free và lần chạy text-prompt mà nó bắt đầu từ đó. Mỗi
# lần chạy lại tạo một thư mục mới (train-2, train-3, ...), vì vậy hãy dùng các đường dẫn mà các lần chạy đã in ra.
model = YOLOE("runs/segment/train-2/weights/best.pt") # lần chạy prompt-free, head của nó đã được hợp nhất
text_model = YOLOE("runs/segment/train/weights/best.pt") # lần chạy text-prompt, head của nó vẫn chưa được hợp nhất
names = list(YOLOE("yoloe-26l-seg-pf.pt").model.names.values()) # từ vựng gồm 4,585 tên, hoặc danh sách của riêng bạn
vocab = text_model.get_vocab(names)
model.set_vocab(vocab, names)
model.save("yoloe-26l-seg-pf-custom.pt") # không bao giờ ghi đè checkpoint đã phát hànhget_vocab trả về nhánh được chọn bởi flag end2end của model, còn set_vocab tái tham số hóa nhánh đó. Các tệp YOLOE-26 đã phát hành thay vào đó mang một bộ từ vựng cho mỗi nhánh, nhờ vậy nms có thể chọn giữa các nhánh; để tái tạo điều này, hãy lấy bộ từ vựng thứ hai từ một bản sao khác của model text-prompt. YOLOE-11 và YOLOE-v8 chỉ có một nhánh, vì vậy dùng nguyên lời gọi ở trên.
one2one_model = YOLOE("runs/segment/train/weights/best.pt") # get_vocab hợp nhất head mà nó đọc, vì vậy hãy tải một bản sao thứ hai
one2one_model.model.end2end = True # đọc nhánh không dùng NMS
model.set_vocab(vocab, names, one2one_vocab=one2one_model.get_vocab(names))Trích dẫn và lời cảm ơn#
Nếu YOLOE đã đóng góp cho nghiên cứu hoặc dự án của bạn, vui lòng trích dẫn bài báo gốc của Ao Wang, Lihao Liu, Hui Chen, Zijia Lin, Jungong Han, và Guiguang Ding thuộc Đại học Thanh Hoa:
@misc{wang2025yoloerealtimeseeing,
title={YOLOE: Real-Time Seeing Anything},
author={Ao Wang and Lihao Liu and Hui Chen and Zijia Lin and Jungong Han and Guiguang Ding},
year={2025},
eprint={2503.07465},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2503.07465},
}Để tìm hiểu thêm, bài báo YOLOE gốc có trên arXiv. Bạn có thể truy cập mã nguồn và các tài nguyên bổ sung của dự án qua repository GitHub.
Câu hỏi thường gặp#
Ultralytics YOLOE bổ sung hai khả năng mà YOLO-World không có: visual prompt, trong đó một box mẫu thay cho tên class, và checkpoint prompt-free có thể trả lời dựa trên từ vựng tích hợp gồm 4,585 tên mà không cần prompt. Mỗi dự đoán từ các checkpoint
*-seg.ptđã phát hành cũng đi kèm mask instance segmentation. Về độ chính xác, bài báo YOLOE gốc cho thấy YOLOE-v8s vượt YOLO-Worldv2-S 3.5 AP trên LVIS, với chi phí huấn luyện chỉ bằng một phần ba và tốc độ inference nhanh hơn 1.4×. Việc chuyển đổi chỉ cần thay đổi một dòng — xem So sánh YOLOE.Ultralytics YOLOE hỗ trợ ba chế độ prompting. Text prompt là tên class dưới dạng chuỗi trên checkpoint
*-seg.pt, và là lựa chọn thông thường. Visual prompt gồm một hoặc nhiều box mẫu trên ảnh tham chiếu, dành cho các đối tượng khó mô tả bằng lời. Inference prompt-free dùng checkpoint*-seg-pf.ptriêng, có thể trả lời dựa trên từ vựng tích hợp gồm 4,585 tên mà không cần đầu vào. Text prompt và visual prompt dùng chung checkpoint; prompt-free dùng các tệp khác và từ chốiset_classes(). Xem Chọn chế độ prompting để biết so sánh đầy đủ.Hãy bắt đầu với
yoloe-26s-seg.pt: dòng YOLOE-26 dẫn trước YOLOE-11 và YOLOE-v8 ở mọi quy mô tương ứng, và quy môslà nhỏ nhất đạt trên 30 mAP trên LVIS minival. Chuyển lênm,lhoặcxkhi độ chính xác trên các category hiếm quan trọng hơn độ trễ — cột mAPr trong Hiệu năng là cột cần so sánh. Chỉ giảm xuốngnkhi triển khai trên edge. Thay vào đó, hãy tải tệp*-seg-pf.ptcùng quy mô nếu bạn muốn dùng từ vựng tích hợp thay vì tên class của riêng mình.Các nhãn như
object0vàobject1có nghĩa là dự đoán đến từ visual prompt, nhóm các box mẫu thành những class tạm thời được đánh số thay vì giữ tên của bạn. Các class ID bạn truyền vàovisual_prompts["cls"]chỉ dùng để nhóm như vậy. Model báo cáo chúng dưới dạngobject0,object1, v.v., theo thứ tự ID bạn đã gán, vì vậy hãy ánh xạ chúng về nhãn riêng trong kết quả. Nếu muốn đầu ra có tên của bạn, hãy dùng text prompt.Checkpoint prompt-free (
*-seg-pf.pt) xác định class thông qua từ vựng tích hợp riêng và từ chối prompt bên ngoài bằngAssertionError: Prompt-free model does not support setting classes. Please try with Text/Visual prompt models.. Hãy tải checkpoint*-seg.ptkhi cần danh sách class của riêng bạn. Xem Chọn chế độ prompting.Text prompt đầu tiên khiến Ultralytics YOLOE cài đặt ultralytics/CLIP từ GitHub bằng
pipvà tải text encoder TorchScript vào thư mục làm việc hiện tại — khoảng 254 MB với YOLOE-26; xem Cài đặt và yêu cầu để biết chính xác asset cho từng dòng model. Visual prompt và checkpoint prompt-free không cần những thành phần này. Để tránh tải xuống trên máy đích, hãy thiết lập prompt một lần rồi lưu bằngsave_prompt_embeddings(), hoặc export model khi các class đã được cấu hình.Không — YOLOE tích hợp các class được prompt vào trọng số tại thời điểm export, vì vậy export đã tải sẽ từ chối cả
set_classes()lẫnvisual_prompts=. Hãy export lại từ checkpoint.ptgốc sau khi cấu hình prompt mới. Tệp đã export hoạt động như một model YOLO tiêu chuẩn và có thể được tải bằngYOLO()cũng nhưYOLOE().Dùng YOLOE khi bạn cần thông lượng thời gian thực và có thể nêu tên class; dùng SAM 3 khi chất lượng segmentation trên một khái niệm quan trọng hơn tốc độ. Cả hai đều chấp nhận ví dụ trực quan; chỉ YOLOE có chế độ prompt-free. Xem so sánh đầy đủ tại So sánh YOLOE.