YOLOE: Real-Time Seeing Anything
소개
YOLOE (Real-Time Seeing Anything)는 개방형 어휘 감지 및 분할을 위해 설계된 제로샷, 프롬프트 가능한 YOLO 모델의 새로운 발전입니다. 고정된 범주로 제한된 이전 YOLO 모델과 달리 YOLOE는 텍스트, 이미지 또는 내부 어휘 프롬프트를 사용하여 모든 객체 클래스의 실시간 감지를 가능하게 합니다. YOLOv10을 기반으로 하고 YOLO-World에서 영감을 받은 YOLOE는 속도와 정확도에 미치는 영향을 최소화하면서 최첨단 제로샷 성능을 달성합니다.
참고: Ultralytics python 패키지로 YOLOE를 사용하는 방법: 개방형 어휘 및 실시간으로 모든 것을 보기 🚀
이전 YOLO 모델과 비교했을 때, YOLOE는 효율성과 정확성을 크게 향상시킵니다. 단 1/3의 학습 리소스를 사용하고 1.4배 더 빠른 추론 속도를 달성하면서 LVIS에서 YOLO-Worldv2보다 +3.5 AP 향상을 보입니다. COCO에서 미세 조정된 YOLOE-v8-large는 YOLOv8-L보다 0.1 mAP 더 뛰어나며, 학습 시간은 거의 4배 더 적게 소요됩니다. 이는 YOLOE의 뛰어난 정확성, 효율성 및 다재다능함의 균형을 보여줍니다. 아래 섹션에서는 YOLOE의 아키텍처, 벤치마크 비교 및 Ultralytics 프레임워크와의 통합에 대해 살펴봅니다.
아키텍처 개요
YOLOE는 표준 YOLO 구조(특징 추출을 위한 컨볼루션 백본(예: CSP-Darknet), 다중 스케일 융합을 위한 넥(예: PAN-FPN) 및 객체성, 클래스 및 상자를 독립적으로 예측하는 앵커 프리, 분리된 감지 헤드(YOLOv8/YOLO11에서와 같이))를 유지합니다. YOLOE는 개방형 어휘 감지를 가능하게 하는 세 가지 새로운 모듈을 도입했습니다.
-
재매개변수화 가능한 영역-텍스트 정렬(RepRTA): 작은 보조 네트워크를 통해 텍스트 임베딩(예: CLIP에서)을 개선하여 텍스트 프롬프트 감지를 지원합니다. 추론 시 이 네트워크는 기본 모델로 통합되어 오버헤드가 발생하지 않습니다. 따라서 YOLOE는 런타임 페널티 없이 임의의 텍스트 레이블 객체(예: 보이지 않는 "신호등")를 감지합니다.
-
시맨틱 활성화 시각적 프롬프트 인코더(SAVPE): 경량 임베딩 분기를 통해 시각적 프롬프트 감지를 활성화합니다. 참조 이미지가 주어지면 SAVPE는 시맨틱 및 활성화 기능을 인코딩하여 시각적으로 유사한 객체를 감지하도록 모델을 조정합니다. 이는 로고 또는 특정 부분에 유용한 원샷 감지 기능입니다.
-
Lazy Region-Prompt Contrast (LRPC): 프롬프트-프리 모드에서 YOLOE는 대규모 어휘(LVIS 및 Objects365의 1200개 이상의 범주)에 대해 학습된 내부 임베딩을 사용하여 개방형 집합 인식을 수행합니다. 외부 프롬프트나 인코더 없이 YOLOE는 임베딩 유사성 조회를 통해 객체를 식별하여 추론 시 대규모 레이블 공간을 효율적으로 처리합니다.
또한 YOLOE는 마스크 예측 분기(YOLACT 또는 YOLOv8-Seg와 유사)로 detection 헤드를 확장하여 최소한의 오버헤드를 추가함으로써 실시간 인스턴스 분할을 통합합니다.
결정적으로, YOLOE의 개방형 세계 모듈은 일반 폐쇄형 YOLO로 사용될 때 추론 비용이 발생하지 않습니다. 훈련 후 YOLOE 파라미터는 표준 YOLO 헤드로 재파라미터화될 수 있으며, 동일한 FLOP 및 속도를 유지합니다(예: YOLO11과 정확히 일치).
사용 가능한 모델, 지원되는 작업 및 작동 모드
이 섹션에서는 사용 가능한 모델과 특정 사전 학습된 가중치, 지원하는 작업, 그리고 추론, 유효성 검사, 학습 및 내보내기와 같은 다양한 작동 모드와의 호환성에 대해 자세히 설명합니다. 지원되는 모드는 ✅로, 지원되지 않는 모드는 ❌로 표시됩니다.
텍스트/시각적 프롬프트 모델
모델 유형 | 사전 훈련된 가중치 | 지원되는 작업 | 추론 | 검증 | 훈련 | 내보내기 |
---|---|---|---|---|---|---|
YOLOE-11S | yoloe-11s-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-11M | yoloe-11m-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-11L | yoloe-11l-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8S | yoloe-v8s-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8M | yoloe-v8m-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8L | yoloe-v8l-seg.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
프롬프트 없음 모델
모델 유형 | 사전 훈련된 가중치 | 지원되는 작업 | 추론 | 검증 | 훈련 | 내보내기 |
---|---|---|---|---|---|---|
YOLOE-11S-PF | yoloe-11s-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-11M-PF | yoloe-11m-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-11L-PF | yoloe-11l-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8S-PF | yoloe-v8s-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8M-PF | yoloe-v8m-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
YOLOE-v8L-PF | yoloe-v8l-seg-pf.pt | 인스턴스 분할 | ✅ | ✅ | ✅ | ✅ |
사용 예시
YOLOE 모델은 Python 애플리케이션에 쉽게 통합할 수 있습니다. Ultralytics는 개발을 간소화하기 위해 사용하기 쉬운 Python API 및 CLI 명령어를 제공합니다.
학습 사용법
맞춤형 데이터 세트에 대한 미세 조정
detection 및 instance segmentation 작업 모두를 위해 사용자 정의 YOLO 데이터 세트에서 사전 학습된 YOLOE 모델을 fine-tuning할 수 있습니다.
예시
Instance segmentation
YOLOE 사전 학습된 체크포인트를 fine-tuning하는 것은 대부분 다음을 따릅니다. 표준 YOLO 학습 절차. 주요 차이점은 명시적으로 다음을 전달하는 것입니다. YOLOEPESegTrainer
로 trainer
parameter를 model.train()
:
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
model = YOLOE("yoloe-11s-seg.pt")
# Fine-tune on your segmentation dataset
results = model.train(
data="coco128-seg.yaml", # Segmentation dataset
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Important: use segmentation trainer
)
객체 감지는
모든 사전 학습된 YOLOE 모델 은 기본적으로 instance segmentation을 수행합니다. 이러한 사전 학습된 체크포인트를 사용하여 detection 모델을 학습하려면 YAML 구성을 사용하여 처음부터 detection 모델을 초기화한 다음 동일한 스케일의 사전 학습된 segmentation 체크포인트를 로드합니다. 여기서는 다음을 사용합니다. YOLOEPETrainer
대신 YOLOEPESegTrainer
detection 모델을 학습하기 때문입니다.
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
# Initialize a detection model from a config
model = YOLOE("yoloe-11s.yaml")
# Load weights from a pretrained segmentation checkpoint (same scale)
model.load("yoloe-11s-seg.pt")
# Fine-tune on your detection dataset
results = model.train(
data="coco128.yaml", # Detection dataset
epochs=80,
patience=10,
trainer=YOLOEPETrainer, # <- Important: use detection trainer
)
Linear probing은 모델의 나머지 부분을 고정하면서 분류 분기만 fine-tuning합니다. 이 접근 방식은 제한된 데이터로 작업할 때 유용합니다. 이전에 학습된 기능을 활용하면서 분류 헤드만 조정하여 과적합을 방지하기 때문입니다.
Instance segmentation
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPESegTrainer
# Load a pretrained segmentation model
model = YOLOE("yoloe-11s-seg.pt")
# Identify the head layer index
head_index = len(model.model.model) - 1
# Freeze all backbone and neck layers (i.e. everything before the head)
freeze = [str(i) for i in range(0, head_index)]
# Freeze parts of the segmentation head, keeping only the classification branch trainable
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
# Freeze detection branch components
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
# Train only the classification branch
results = model.train(
data="coco128-seg.yaml", # Segmentation dataset
epochs=80,
patience=10,
trainer=YOLOEPESegTrainer, # <- Important: use segmentation trainer
freeze=freeze,
)
객체 감지는
객체 감지 작업의 경우, 학습 과정은 위의 인스턴스 분할 예제와 거의 동일하지만 다음을 사용합니다. YOLOEPETrainer
대신 YOLOEPESegTrainer
YAML을 사용하여 객체 감지 모델을 초기화한 다음, 사전 학습된 인스턴스 분할 체크포인트에서 가중치를 로드합니다.
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEPETrainer
# Initialize a detection model from a config
model = YOLOE("yoloe-11s.yaml")
# Load weights from a pretrained segmentation checkpoint (same scale)
model.load("yoloe-11s-seg.pt")
# Identify the head layer index
head_index = len(model.model.model) - 1
# Freeze all backbone and neck layers (i.e. everything before the head)
freeze = [str(i) for i in range(0, head_index)]
# Freeze parts of the segmentation head, keeping only the classification branch trainable
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
# Freeze detection branch components
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
# Train only the classification branch
results = model.train(
data="coco128.yaml", # Detection dataset
epochs=80,
patience=10,
trainer=YOLOEPETrainer, # <- Important: use detection trainer
freeze=freeze,
)
예측 사용법
YOLOE는 텍스트 기반 및 시각적 프롬프팅을 모두 지원합니다. 프롬프트 사용은 간단합니다. 그냥 다음을 통해 전달하기만 하면 됩니다. predict
메서드는 아래와 같습니다.
예시
텍스트 프롬프트를 사용하면 텍스트 설명을 통해 감지하려는 클래스를 지정할 수 있습니다. 다음 코드는 YOLOE를 사용하여 이미지에서 사람과 버스를 감지하는 방법을 보여줍니다.
from ultralytics import YOLOE
# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt") # or select yoloe-11s/m-seg.pt for different sizes
# Set text prompt to detect person and bus. You only need to do this once after you load the model.
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
# Run detection on the given image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
시각적 프롬프트를 통해 텍스트로 설명하는 대신 대상 클래스의 시각적 예제를 보여줌으로써 모델을 안내할 수 있습니다.
에 지정되어 있습니다. visual_prompts
인수는 두 개의 키가 있는 사전을 사용합니다. bboxes
및 cls
. 다음의 각 경계 상자 bboxes
모델이 감지해야 할 객체의 예시를 정확하게 둘러싸고, 해당 항목을 cls
해당 상자에 대한 클래스 레이블을 지정합니다. 이 쌍은 모델에게 "이것이 X 클래스의 모습입니다. 이제 이와 유사한 것을 더 찾으세요."라고 알려줍니다.
클래스 ID (cls
) 위치: visual_prompts
프롬프트 내에서 각 경계 상자를 특정 범주와 연결하는 데 사용됩니다. 고정된 레이블이 아니라 각 예에 할당하는 임시 식별자입니다. 유일한 요구 사항은 클래스 ID가 0부터 시작하여 순차적이어야 한다는 것입니다. 이는 모델이 각 상자를 해당 클래스와 올바르게 연결하는 데 도움이 됩니다.
추론을 실행하려는 동일한 이미지 내에서 직접 시각적 프롬프트를 제공할 수 있습니다. 예를 들어 다음과 같습니다.
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")
# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
bboxes=np.array(
[
[221.52, 405.8, 344.98, 857.54], # Box enclosing person
[120, 425, 160, 445], # Box enclosing glasses
],
),
cls=np.array(
[
0, # ID to be assigned for person
1, # ID to be assigned for glassses
]
),
)
# Run inference on an image, using the provided visual prompts as guidance
results = model.predict(
"ultralytics/assets/bus.jpg",
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
또는 다음을 사용하여 별도의 참조 이미지에서 예제를 제공할 수 있습니다. refer_image
인수. 이 경우, bboxes
및 cls
에서 visual_prompts
예측하려는 대상 이미지가 아닌, 참조 이미지 내 객체를 설명해야 합니다.
참고
만약 source
비디오 또는 스트림인 경우 모델은 첫 번째 프레임을 자동으로 refer_image
즉, visual_prompts
해당 초기 프레임에 적용되어 모델이 비디오의 나머지 부분에서 무엇을 찾아야 하는지 이해하도록 돕습니다. 또는 특정 프레임을 명시적으로 전달할 수 있습니다. refer_image
모델이 참조로 사용하는 시각적 예제를 제어합니다.
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")
# Define visual prompts based on a separate reference image
visual_prompts = dict(
bboxes=np.array([[221.52, 405.8, 344.98, 857.54]]), # Box enclosing person
cls=np.array([0]), # ID to be assigned for person
)
# Run prediction on a different image, using reference image to guide what to look for
results = model.predict(
"ultralytics/assets/zidane.jpg", # Target image for detection
refer_image="ultralytics/assets/bus.jpg", # Reference image used to get visual prompts
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
사용: refer_image
또한 클래스를 영구적으로 설정하므로 동일한 시각적 프롬프트를 다시 제공하지 않고도 예측을 실행하고 내보내기 후에도 동일한 클래스를 계속 감지할 수 있는 기능을 유지하면서 모델을 내보낼 수 있습니다.
# After making prediction with `refer_image`, you can run predictions without passing visual_prompts again and still get the same classes back
results = model("ultralytics/assets/bus.jpg")
# Or export it to a different format while retaining the classes
model.export(format="onnx")
여러 대상 이미지를 전달하여 예측을 실행할 수도 있습니다.
import numpy as np
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor
# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg.pt")
# Define visual prompts using bounding boxes and their corresponding class IDs.
# Each box highlights an example of the object you want the model to detect.
visual_prompts = dict(
bboxes=[
np.array(
[
[221.52, 405.8, 344.98, 857.54], # Box enclosing person
[120, 425, 160, 445], # Box enclosing glasses
],
),
np.array([[150, 200, 1150, 700]]),
],
cls=[
np.array(
[
0, # ID to be assigned for person
1, # ID to be assigned for glasses
]
),
np.array([0]),
],
)
# Run inference on multiple image, using the provided visual prompts as guidance
results = model.predict(
["ultralytics/assets/bus.jpg", "ultralytics/assets/zidane.jpg"],
visual_prompts=visual_prompts,
predictor=YOLOEVPSegPredictor,
)
# Show results
results[0].show()
YOLOE는 또한 내장된 어휘를 제공하는 프롬프트 없는 변형을 포함합니다. 이러한 모델은 프롬프트가 필요하지 않으며 기존 YOLO 모델처럼 작동합니다. 사용자 제공 레이블이나 시각적 예제에 의존하는 대신 Recognize Anything Model Plus (RAM++)에서 사용하는 태그 세트를 기반으로 미리 정의된 4,585개 클래스 목록에서 객체를 감지합니다.
from ultralytics import YOLOE
# Initialize a YOLOE model
model = YOLOE("yoloe-11l-seg-pf.pt")
# Run prediction. No prompts required.
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
Val 사용법
데이터 세트에 대한 모델 유효성 검사는 다음과 같이 간소화됩니다.
예시
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt") # or select yoloe-11s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml")
기본적으로 제공된 데이터 세트를 사용하여 각 범주에 대한 시각적 임베딩을 추출합니다.
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt") # or select yoloe-11s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True)
또는 다른 데이터 세트를 참조 데이터 세트로 사용하여 각 범주에 대한 시각적 임베딩을 추출할 수 있습니다. 참고로 이 참조 데이터 세트는 제공된 데이터 세트와 정확히 동일한 범주를 가져야 합니다.
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-11l-seg.pt") # or select yoloe-11s/m-seg.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", load_vp=True, refer_data="coco.yaml")
from ultralytics import YOLOE
# Create a YOLOE model
model = YOLOE("yoloe-11l-seg-pf.pt") # or select yoloe-11s/m-seg-pf.pt for different sizes
# Conduct model validation on the COCO128-seg example dataset
metrics = model.val(data="coco128-seg.yaml", single_cls=True)
내보내기 사용법
내보내기 프로세스는 다른 YOLO 모델과 유사하며 텍스트 및 시각적 프롬프트를 처리하는 유연성이 추가되었습니다.
예시
from ultralytics import YOLOE
# Select yoloe-11s/m-seg.pt for different sizes
model = YOLOE("yoloe-11l-seg.pt")
# Configure the set_classes() before exporting the model
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
export_model = model.export(format="onnx")
model = YOLOE(export_model)
# Run detection on the given image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()
공식 모델 학습
데이터 세트 준비
참고
공식 YOLOE 모델을 학습하려면 학습 데이터에 대한 세그먼트 주석이 필요합니다. 다음은 공식 팀에서 제공하는 스크립트 데이터 세트를 세그먼트 주석으로 변환하는 기능 (제공: SAM2.1 모델또는 제공된 파일을 직접 다운로드할 수도 있습니다. Processed Segment Annotations
공식 팀에서 제공한 다음 표에 있습니다.
- 학습 데이터
데이터세트 | 유형 | 샘플 | 상자 | Raw Detection Annotations | 처리된 세그먼트 주석 |
---|---|---|---|---|---|
Objects365v1 | 객체 탐지 | 609k | 9621k | objects365_train.json | objects365_train_segm.json |
GQA | Grounding | 621k | 3681k | final_mixed_train_no_coco.json | final_mixed_train_no_coco_segm.json |
Flickr30k | Grounding | 149k | 641k | final_flickr_separateGT_train.json | final_flickr_separateGT_train_segm.json |
- Val 데이터
데이터세트 | 유형 | 어노테이션 파일 |
---|---|---|
LVIS minival | 객체 탐지 | minival.txt |
처음부터 학습 시작하기
참고
Visual Prompt
모델은 학습이 잘 된 모델을 기반으로 미세 조정됩니다. Text Prompt
모델.
예시
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegTrainerFromScratch
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-11l-seg.yaml")
model.train(
data=data,
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",
)
이후에만 SAVPE
모듈은 학습 중에 업데이트해야 합니다.
학습이 잘 된 텍스트 프롬프트 모델을 탐지 모델로 변환하고 더 적은 학습 비용으로 탐지 파이프라인을 채택합니다.
이 단계는 선택 사항이며 분할부터 직접 시작할 수도 있습니다.
from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load
det_model = YOLOE("yoloe-11l.yaml")
state = torch_load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")
학습 시작:
from ultralytics import YOLOE
from ultralytics.models.yolo.yoloe import YOLOESegVPTrainer
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")
# freeze every layer except of the savpe module.
head_index = len(model.model.model) - 1
freeze = list(range(0, head_index))
for name, child in model.model.model[-1].named_children():
if "savpe" not in name:
freeze.append(f"{head_index}.{name}")
model.train(
data=data,
batch=128,
epochs=2,
close_mosaic=2,
optimizer="AdamW",
lr0=16e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOESegVPTrainer, # use YOLOEVPTrainer if converted to detection model
device="0,1,2,3,4,5,6,7",
freeze=freeze,
)
훈련 후 분할 모델로 다시 변환합니다. 훈련 전에 분할 모델을 감지 모델로 변환한 경우에만 필요합니다.
from copy import deepcopy
from ultralytics import YOLOE
model = YOLOE("yoloe-11l-seg.yaml")
model.load("yoloe-11l-seg.pt")
vp_model = YOLOE("yoloe-11l-vp.pt")
model.model.model[-1].savpe = deepcopy(vp_model.model.model[-1].savpe)
model.eval()
model.save("yoloe-11l-seg.pt")
시각적 프롬프트 학습과 유사하게 프롬프트가 없는 모델의 경우 특수화된 프롬프트 임베딩만 학습 중에 업데이트해야 합니다. 학습이 잘 된 텍스트 프롬프트 모델을 감지 모델로 변환하고 더 적은 학습 비용으로 감지 파이프라인을 채택합니다. 이 단계는 선택 사항이며 분할부터 직접 시작할 수도 있습니다.
from ultralytics import YOLOE
from ultralytics.utils.patches import torch_load
det_model = YOLOE("yoloe-11l.yaml")
state = torch_load("yoloe-11l-seg.pt")
det_model.load(state["model"])
det_model.save("yoloe-11l-seg-det.pt")
from ultralytics import YOLOE
data = dict(
train=dict(
yolo_data=["Objects365.yaml"],
grounding_data=[
dict(
img_path="flickr/full_images/",
json_file="flickr/annotations/final_flickr_separateGT_train_segm.json",
),
dict(
img_path="mixed_grounding/gqa/images",
json_file="mixed_grounding/annotations/final_mixed_train_no_coco_segm.json",
),
],
),
val=dict(yolo_data=["lvis.yaml"]),
)
model = YOLOE("yoloe-11l-seg.pt")
# replace to yoloe-11l-seg-det.pt if converted to detection model
# model = YOLOE("yoloe-11l-seg-det.pt")
# freeze layers.
head_index = len(model.model.model) - 1
freeze = [str(f) for f in range(0, head_index)]
for name, child in model.model.model[-1].named_children():
if "cv3" not in name:
freeze.append(f"{head_index}.{name}")
freeze.extend(
[
f"{head_index}.cv3.0.0",
f"{head_index}.cv3.0.1",
f"{head_index}.cv3.1.0",
f"{head_index}.cv3.1.1",
f"{head_index}.cv3.2.0",
f"{head_index}.cv3.2.1",
]
)
model.train(
data=data,
batch=128,
epochs=1,
close_mosaic=1,
optimizer="AdamW",
lr0=2e-3,
warmup_bias_lr=0.0,
weight_decay=0.025,
momentum=0.9,
workers=4,
trainer=YOLOEPEFreeTrainer,
device="0,1,2,3,4,5,6,7",
freeze=freeze,
single_cls=True, # this is needed
)
훈련 후 분할 모델로 다시 변환합니다. 훈련 전에 분할 모델을 감지 모델로 변환한 경우에만 필요합니다.
from copy import deepcopy
from ultralytics import YOLOE
model = YOLOE("yoloe-11l-seg.pt")
model.eval()
pf_model = YOLOE("yoloe-11l-seg-pf.pt")
names = ["object"]
tpe = model.get_text_pe(names)
model.set_classes(names, tpe)
model.model.model[-1].fuse(model.model.pe)
model.model.model[-1].cv3[0][2] = deepcopy(pf_model.model.model[-1].cv3[0][2]).requires_grad_(True)
model.model.model[-1].cv3[1][2] = deepcopy(pf_model.model.model[-1].cv3[1][2]).requires_grad_(True)
model.model.model[-1].cv3[2][2] = deepcopy(pf_model.model.model[-1].cv3[2][2]).requires_grad_(True)
del model.model.pe
model.save("yoloe-11l-seg-pf.pt")
YOLOE 성능 비교
YOLOE는 속도나 모델 크기를 저하시키지 않으면서 COCO와 같은 표준 벤치마크에서 폐쇄형 YOLO 모델의 정확도와 일치하거나 초과합니다. 아래 표는 해당 YOLOv8 및 YOLO11 모델에 대해 YOLOE-L(YOLO11 기반)을 비교한 것입니다.
모델 | COCO mAP50-95 | 추론 속도 (T4) | 파라미터 | GFLOP (640px) |
---|---|---|---|---|
YOLOv8-L (폐쇄형) | 52.9% | 9.06 ms (110 FPS) | 43.7 M | 165.2 B |
YOLO11-L (폐쇄형) | 53.5% | 6.2 ms (130 FPS) | 26.2 M | 86.9 B |
YOLOE-L (개방형 어휘) | 52.6% | 6.2 ms (130 FPS) | 26.2 M | 86.9 B† |
† YOLO11-L과 YOLOE-L은 동일한 아키텍처를 가지고 있으며(YOLO11-L에서 프롬프트 모듈이 비활성화됨), 결과적으로 추론 속도가 동일하고 GFLOP 추정치가 유사합니다.
YOLOE-L은 52.6% mAP를 달성하여 YOLOv8-L(52.9%)보다 약 40% 더 적은 파라미터(26M vs. 43.7M)로 더 나은 성능을 보입니다. YOLO11의 효율성을 강조하면서 YOLOv8-L의 9.06ms (110 FPS)에 비해 6.2ms (161 FPS)로 640x640 이미지를 처리합니다. 중요한 것은 YOLOE의 개방형 어휘 모듈은 추론 비용이 발생하지 않는다는 점이며, 이는 "공짜 점심은 없다(no free lunch trade-off)"는 설계를 보여줍니다.
제로샷 및 전이 학습 작업에서 YOLOE는 뛰어난 성능을 보입니다. LVIS에서 YOLOE-small은 YOLO-Worldv2보다 +3.5 AP 향상되었으며, 3배 적은 학습 리소스를 사용합니다. 또한 LVIS에서 COCO로 YOLOE-L을 미세 조정하는 데 YOLOv8-L보다 4배 적은 학습 시간이 소요되어 효율성과 적응성을 입증했습니다. YOLOE는 YOLO의 특징인 속도를 유지하여 T4 GPU에서 300+ FPS, CoreML을 통해 iPhone 12에서 ~64 FPS를 달성하여 에지 및 모바일 배포에 이상적입니다.
참고
벤치마크 조건: YOLOE 결과는 Objects365, GoldG 및 LVIS에서 사전 학습된 모델을 기반으로 하며, COCO에서 미세 조정 또는 평가되었습니다. YOLOv8에 비해 YOLOE가 약간 더 높은 mAP를 보이는 이유는 광범위한 사전 학습 때문입니다. 이러한 개방형 어휘 학습이 없으면 YOLOE는 비슷한 크기의 YOLO 모델과 유사하며, 성능 저하 없이 SOTA 정확도와 개방형 세계 유연성을 제공합니다.
이전 모델과의 비교
YOLOE는 이전 YOLO 모델 및 개방형 어휘 감지기에 비해 주목할 만한 발전을 도입했습니다.
-
YOLOE 대 YOLOv5: YOLOv5 는 속도와 정확도의 균형이 좋았지만 새로운 클래스에 대한 재교육이 필요하고 앵커 기반 헤드를 사용했습니다. 반면 YOLOE는 앵커가 없고 새로운 클래스를 동적으로 감지합니다. YOLOv8 개선 사항을 기반으로 하는 YOLOE는 더 높은 정확도(52.6% 대 YOLOv5~50% mAP on COCO)를 달성하고 YOLOv5 달리 인스턴스 세분화를 통합합니다.
-
YOLOE 대 YOLOv8: YOLOE 확장 YOLOv8의 재설계된 아키텍처를 확장하여 유사하거나 더 뛰어난 정확도를 달성합니다(52.6% mAP, 최대 2600만 개의 매개변수 대 52.9%, 최대 4400만 개의 매개변수). 강력한 사전 훈련으로 훈련 시간이 크게 단축됩니다. 핵심적인 발전은 YOLOv8 오픈 월드 기능으로, 폐쇄형 설계인 YOLOv8 달리 프롬프트를 통해 보이지 않는 물체(예:'새 스쿠터' 또는'평화 상징')를 감지할 수 있다는 점입니다.
-
YOLOE 대 YOLO11: YOLO11 은 향상된 효율성과 더 적은 매개변수(~22% 감소)로 YOLOv8 개선합니다. YOLOE는 이러한 이점을 직접 계승하여 YOLO11 추론 속도와 파라미터 수(~2,600만 개의 파라미터)와 일치하는 동시에 개방 어휘 감지 및 세분화 기능을 추가합니다. 폐쇄형 시나리오에서 YOLOE는 YOLO11 동등하지만 보이지 않는 클래스를 감지하는 적응성을 추가하여 속도 저하 없이 YOLO11 + 오픈 월드 기능을 달성합니다.
-
이전 개방형 어휘 탐지기와 YOLOE 비교: 이전의 개방형 어휘 모델(GLIP, OWL-ViT, YOLO)은 시각 언어 트랜스포머에 크게 의존했기 때문에 추론 속도가 느렸습니다. YOLOE는 훨씬 적은 학습 리소스로 1.4배 더 빠르게 실행하면서 제로 샷 정확도(예: +3.5 AP vs. YOLO)에서 이를 능가합니다. 트랜스포머 기반 접근 방식(예: GLIP)과 비교했을 때, YOLOE는 훨씬 빠른 추론을 제공하여 오픈 세트 탐지에서 정확도와 효율성 간의 격차를 효과적으로 해소합니다.
요약하자면, YOLOE는 YOLO의 뛰어난 속도와 효율성을 유지하고, 정확도 면에서 이전 모델을 능가하며, 분할을 통합하고, 강력한 개방형 세계 감지를 도입하여 독보적으로 다재다능하고 실용적입니다.
사용 사례 및 응용 분야
YOLOE의 개방형 어휘 감지 및 분할 기능은 기존의 고정 클래스 모델을 넘어 다양한 애플리케이션을 가능하게 합니다.
-
오픈 월드 객체 감지: 로봇이 프롬프트를 사용하여 이전에 보이지 않던 물체를 인식하는 로봇 공학이나 재교육 없이 새로운 위협(예: 위험한 물건)에 빠르게 적응하는 보안 시스템과 같은 동적 시나리오에 이상적입니다.
-
몇 샷 및 원샷 감지: 산업용 검사 (부품이나 결함을 즉시 식별) 또는 맞춤형 감시에 적합한 시각적 프롬프트(SAVPE)를 사용하여 YOLOE는 단일 참조 이미지에서 새로운 물체를 빠르게 학습하여 최소한의 설정으로 시각적 검색을 가능하게 합니다.
-
대규모 어휘 및 롱테일 인식: 1000개 이상의 클래스로 구성된 어휘를 갖춘 YOLOE는 생물 다양성 모니터링 (희귀종 탐지), 박물관 소장품, 소매 재고 또는 전자상거래와 같은 작업에 탁월하여 클래스별 대규모 교육 없이도 많은 클래스를 안정적으로 식별합니다.
-
대화형 감지 및 세분화: YOLOE는 자연스러운 입력(텍스트 또는 시각적 프롬프트)을 통해 검색 가능한 비디오/이미지 검색, 증강 현실(AR), 직관적인 이미지 편집과 같은 실시간 인터랙티브 애플리케이션을 지원합니다. 사용자는 세그먼테이션 마스크를 사용하여 개체를 동적으로 분리, 식별 또는 정확하게 편집할 수 있습니다.
-
자동화된 데이터 라벨링 및 부트스트랩: YOLOE는 초기 바운딩 박스 및 세분화 주석을 제공함으로써 신속한 데이터 세트 생성을 용이하게 하여 사람의 라벨링 작업을 크게 줄여줍니다. 특히 대규모 미디어 컬렉션의 분석에 유용하며, 존재하는 개체를 자동으로 식별하여 전문화된 모델을 더 빠르게 구축할 수 있도록 지원합니다.
-
모든 물체를 위한 세분화: 의료 영상, 현미경 또는 위성 이미지 분석에 특히 유용한 프롬프트를 통해 임의의 물체로 세분화 기능을 확장하여 사전 학습된 특수 모델 없이 구조를 자동으로 식별하고 정밀하게 세분화합니다. 다음과 같은 모델과 달리 SAM과 같은 모델과 달리 YOLOE는 물체를 자동으로 인식하고 세그먼트화하여 콘텐츠 제작이나 장면 이해와 같은 작업을 지원합니다.
이러한 모든 사용 사례에서 YOLOE의 핵심 장점은 다재다능함으로, 동적 시나리오에서 감지, 인식 및 분할을 위한 통합 모델을 제공합니다. 효율성은 리소스가 제한된 장치에서 실시간 성능을 보장하므로 로봇 공학, 자율 주행, 국방 등에 이상적입니다.
팁
필요에 따라 YOLOE의 모드를 선택하십시오.
- 폐쇄형 세트 모드: 고정 클래스 작업용(최대 속도 및 정확도).
- 프롬프트 모드: 텍스트 또는 시각적 프롬프트를 통해 새로운 객체를 빠르게 추가합니다.
- 프롬프트 없는 개방형 세트 모드: 여러 범주에 걸친 일반적인 감지 (카탈로그 작성 및 검색에 이상적).
종종 프롬프트 없는 검색 후 타겟 프롬프트를 사용하는 것과 같이 모드를 결합하면 YOLOE의 잠재력을 최대한 활용할 수 있습니다.
학습 및 추론
YOLOE는 다른 YOLO 모델(YOLOv8, YOLO-World)과 마찬가지로 Ultralytics Python API 및 CLI와 원활하게 통합됩니다. 시작하는 방법은 다음과 같습니다.
YOLOE를 사용한 학습 및 추론
from ultralytics import YOLO
# Load pre-trained YOLOE model and train on custom data
model = YOLO("yoloe-11s-seg.pt")
model.train(data="path/to/data.yaml", epochs=50, imgsz=640)
# Run inference using text prompts ("person", "bus")
model.set_classes(["person", "bus"])
results = model.predict(source="test_images/street.jpg")
results[0].save() # save annotated output
여기서 YOLOE는 기본적으로 표준 검출기처럼 작동하지만 클래스를 지정하여 프롬프트된 검출로 쉽게 전환할 수 있습니다(set_classes
). 결과에는 경계 상자, 마스크 및 레이블이 포함됩니다.
# Training YOLOE on custom dataset
yolo train model=yoloe-11s-seg.pt data=path/to/data.yaml epochs=50 imgsz=640
# Inference with text prompts
yolo predict model=yoloe-11s-seg.pt source="test_images/street.jpg" classes="person,bus"
CLI 프롬프트(classes
) 가이드는 Python의 가이드와 유사하게 YOLOE를 안내합니다. set_classes
현재 시각적 프롬프트(이미지 기반 쿼리)는 python API가 필요합니다.
기타 지원 작업
- 유효성 검사: 정확도를 쉽게 평가
model.val()
또는yolo val
. - 내보내기: YOLOE 모델 내보내기 (
model.export()
)을 ONNX, TensorRT 등으로 변환하여 배포를 용이하게 합니다. - 추적: YOLOE는 객체 추적을 지원하며(
yolo track
)은 통합 시 비디오에서 프롬프트된 클래스를 추적하는 데 유용합니다.
참고
YOLOE는 자동으로 다음을 포함합니다. 분할 마스크 추론 결과에서 (results[0].masks
), 별도의 모델 없이 객체 추출 또는 측정과 같이 픽셀 단위로 정확한 작업을 간소화합니다.
시작하기
다음 단계에 따라 Ultralytics로 YOLOE를 빠르게 설정하십시오.
-
설치: Ultralytics 패키지를 설치하거나 업데이트합니다.
pip install -U ultralytics
-
YOLOE 가중치 다운로드: 기 학습된 YOLOE 모델(e.g., YOLOE-v8-S/L, YOLOE-11 변형)은 YOLOE GitHub 발행판에서 사용할 수 있습니다. 피리한 모델을 다운로드하세요
.pt
Ultralytics YOLO 클래스로 로드할 파일입니다. -
하드웨어 요구 사항:
- 추론: GPU 권장(NVIDIA, ≥4-8GB VRAM). 소형 모델은 낮은 해상도에서 에지 GPU(예: Jetson) 또는 CPU에서 효율적으로 실행됩니다.
- 학습: 사용자 지정 데이터에 대해 YOLOE를 미세 조정하는 데는 일반적으로 GPU 하나만 필요합니다. 저자가 사용한 광범위한 개방형 어휘 사전 학습(LVIS/Objects365)에는 상당한 컴퓨팅 성능(8× RTX 4090 GPU)이 필요했습니다.
-
구성: YOLOE 구성은 표준 Ultralytics YAML 파일을 사용합니다. 기본 구성(e.g.,
yoloe-11s-seg.yaml
)이면 충분하지만 필요에 따라 백본, 클래스 또는 이미지 크기를 수정할 수 있습니다. -
YOLOE 실행:
- 빠른 추론 (프롬프트 없음):
yolo predict model=yoloe-11s-seg-pf.pt source="image.jpg"
-
프롬프트 기반 감지 (텍스트 프롬프트 예시):
from ultralytics import YOLO model = YOLO("yoloe-11s-seg.pt") names = ["bowl", "apple"] model.set_classes(names, model.get_text_pe(names)) results = model.predict("kitchen.jpg") results[0].save()
- 빠른 추론 (프롬프트 없음):
-
통합 팁:
- 클래스 이름: 기본 YOLOE 출력은 LVIS 카테고리를 사용합니다. 다음을 사용하세요.
set_classes()
자신의 레이블을 지정합니다. - 속도: YOLOE는 프롬프트를 사용하지 않는 한 오버헤드가 없습니다. 텍스트 프롬프트는 영향이 미미하고 시각적 프롬프트는 약간 더 큽니다.
- 배치 추론: 직접 지원됩니다(
model.predict([img1, img2])
). 이미지별 프롬프트의 경우 이미지를 개별적으로 실행합니다.
- 클래스 이름: 기본 YOLOE 출력은 LVIS 카테고리를 사용합니다. 다음을 사용하세요.
Ultralytics 문서에서 더 많은 리소스를 제공합니다. YOLOE를 사용하면 친숙한 YOLO 생태계 내에서 강력한 개방형 세계 기능을 쉽게 탐색할 수 있습니다.
팁
Pro Tip: YOLOE의 제로샷 정확도를 최대화하려면 처음부터 훈련하는 대신 제공된 체크포인트에서 미세 조정하십시오. 감지 정확도를 높이기 위해 일반적인 훈련 레이블(LVIS 범주 참조)에 맞춰 프롬프트 단어를 사용하십시오.
인용 및 감사의 말씀
YOLOE가 귀하의 연구 또는 프로젝트에 기여한 경우, 칭화대학교의 Ao Wang, Lihao Liu, Hui Chen, Zijia Lin, Jungong Han, Guiguang Ding의 원본 논문을 인용해 주십시오:
@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},
}
더 자세한 내용은 원본 YOLOE 논문이 arXiv에 게시되어 있습니다. 프로젝트의 소스 코드 및 추가 리소스는 GitHub 저장소를 통해 액세스할 수 있습니다.
FAQ
YOLOE는 YOLO-World와 어떻게 다른가요?
YOLOE와 YOLO-World는 모두 개방형 어휘 감지를 지원하지만, YOLOE는 몇 가지 장점을 제공합니다. YOLOE는 LVIS에서 +3.5 AP 더 높은 정확도를 달성하면서 YOLO-Worldv2보다 3배 적은 훈련 리소스를 사용하고 1.4배 더 빠르게 실행됩니다. 또한 YOLOE는 세 가지 프롬프트 모드(텍스트, 시각적, 내부 어휘)를 지원하는 반면, YOLO-World는 주로 텍스트 프롬프트에 중점을 둡니다. 또한 YOLOE에는 추가 오버헤드 없이 감지된 객체에 대한 픽셀 단위의 정확한 마스크를 제공하는 내장 인스턴스 분할 기능이 포함되어 있습니다.
YOLOE를 일반적인 YOLO 모델처럼 사용할 수 있나요?
예, YOLOE는 성능 저하 없이 표준 YOLO 모델과 똑같이 작동할 수 있습니다. 폐쇄형 세트 모드(프롬프트 없음)에서 사용하면 YOLOE의 개방형 어휘 모듈이 표준 감지 헤드로 다시 매개변수화되어 동등한 YOLO11 모델과 동일한 속도와 정확도를 제공합니다. 따라서 YOLOE는 매우 다재다능합니다. 최대 속도를 위해 기존 감지기로 사용할 수 있으며 필요한 경우에만 개방형 어휘 모드로 전환할 수 있습니다.
YOLOE와 함께 어떤 유형의 프롬프트를 사용할 수 있나요?
YOLOE는 세 가지 유형의 프롬프트를 지원합니다:
- 텍스트 프롬프트: 자연어(예: "사람", "신호등", "전동 킥보드")를 사용하여 객체 클래스를 지정합니다.
- 시각적 프롬프트: 감지하려는 객체의 참조 이미지를 제공합니다.
- 내부 어휘: 외부 프롬프트 없이 YOLOE의 1200개 이상의 카테고리 내장 어휘를 사용합니다.
이러한 유연성을 통해 모델을 재학습하지 않고도 다양한 시나리오에 YOLOE를 적용할 수 있으므로 탐지 요구 사항이 자주 변경되는 동적 환경에 특히 유용합니다.
YOLOE는 인스턴스 분할을 어떻게 처리하나요?
YOLOE는 마스크 예측 분기를 사용하여 감지 헤드를 확장함으로써 인스턴스 분할을 아키텍처에 직접 통합합니다. 이 접근 방식은 YOLOv8-Seg와 유사하지만 프롬프트된 모든 객체 클래스에 대해 작동합니다. 분할 마스크는 추론 결과에 자동으로 포함되며 다음을 통해 액세스할 수 있습니다. results[0].masks
이 통합 접근 방식은 별도의 감지 및 분할 모델이 필요 없으므로 픽셀 단위로 정확한 객체 경계가 필요한 애플리케이션의 워크플로를 간소화합니다.
YOLOE는 사용자 정의 프롬프트로 추론을 어떻게 처리하나요?
YOLO-World와 유사하게 YOLOE는 오프라인 어휘를 활용하여 효율성을 향상시키는 "프롬프트 후 감지" 전략을 지원합니다. 캡션 또는 특정 객체 범주와 같은 사용자 지정 프롬프트는 미리 인코딩되어 오프라인 어휘 임베딩으로 저장됩니다. 이 접근 방식은 재학습 없이 감지 프로세스를 간소화합니다. 모델 내에서 이러한 프롬프트를 동적으로 설정하여 특정 감지 작업에 맞게 조정할 수 있습니다.
from ultralytics import YOLO
# Initialize a YOLOE model
model = YOLO("yoloe-11s-seg.pt")
# Define custom classes
names = ["person", "bus"]
model.set_classes(names, model.get_text_pe(names))
# Execute prediction on an image
results = model.predict("path/to/image.jpg")
# Show results
results[0].show()