다음 기능
탐지 및 분할 경로는 검증된 코어입니다. 이 페이지에서는 그 위에 적극적으로 개발 중인 새로운 작업 헤드와 학습 기법인 분류, 회전 바운딩 박스, 자세, 파라미터 효율적 파인튜닝을 설명합니다.
개요
LibreYOLO는 다중 작업 프레임워크로, 동일한 모델 계열에 서로 다른 헤드를 결합할 수 있습니다. 검증된 탐지 및 분할 경로와 함께 두 플래그십 계열인 YOLO9과 RF-DETR 모델에 여러 새로운 작업을 추가하고 있습니다. 모두 동일한 LibreYOLO(...) 팩토리와 Results 컨테이너에 연결되므로 코어 API를 알면 간단히 추가할 수 있습니다.
- YOLO9 및 RF-DETR 모델의 분류입니다. 전체 이미지 레이블과 top-1 / top-5 확률을 제공합니다.
- YOLO9 및 RF-DETR 모델의 회전 바운딩 박스(OBB)입니다. 항공 및 문서 이미지용 회전 바운딩 박스를 제공합니다.
- YOLO9 및 RF-DETR 모델의 키포인트 / 자세입니다. COCO-17 사람 키포인트를 제공합니다.
- YOLOv9 변형인 YOLO9-P2를 사용한 소형 객체 탐지입니다. 항공 및 드론 이미지의 4-16 px 객체를 위한 stride-4 스케일과 VisDrone 연구 미리 보기 체크포인트를 포함합니다.
- RF-DETR 모델의 LoRA / DoRA 파인튜닝입니다. 일부 메모리만 사용하여 트랜스포머 백본을 조정합니다.
먼저 읽어야 할 내용
이 페이지의 모든 기능은 실험적이며 일부는 기능 브랜치에서 아직 개발 중입니다. 검증된 코어로 승격되기 전까지 API, 기본값, 레이블 형식이 변경될 수 있습니다. 안정성 섹션에서 각 기능의 정확한 상태를 추적합니다.
작업 선택
모든 계열의 기본 작업은 탐지입니다. 다음 세 가지 방법으로 다른 작업을 선택하며 아래 우선순위에 따라 결정됩니다.
| 우선순위 | 방식 | 예제 |
|---|---|---|
| 1 | 명시적 인수 | task="obb" |
| 2 | 체크포인트 메타데이터 | 학습된 .pt에 기록된 task |
| 3 | 파일 이름 접미사 | -cls, -obb, -pose |
| 4 | 계열 기본값 | detect |
공개 LibreYOLO(...) 팩토리는 실제 가중치 파일을 요구하므로 이러한 작업 중 하나를 처음부터 시작하는 가장 깔끔한 방법은 계열 클래스를 직접 생성하고 task=를 전달하는 것입니다. 학습된 체크포인트는 통합 팩토리로 다시 불러오며 작업을 자동으로 탐지합니다.
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")
이미지 분류
분류는 전체 이미지에 단일 레이블을 제공합니다. YOLO9은 백본을 유지하면서 경량 분류 헤드를 추가하고, RF-DETR 모델은 DINOv2 인코더를 재사용하고 풀링된 선형 헤드를 추가합니다. 둘 다 224 x 224에서 실행됩니다.
추론 및 Probs 결과
예측은 클래스에 대한 소프트맥스 값을 probs 필드에 담은 Results 객체를 반환합니다.
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
| 필드 | 유형 | 의미 |
|---|---|---|
probs.top1 | int | 최댓값 클래스 ID. |
probs.top5 | list[int] | 내림차순 top-5 클래스 ID. |
probs.top1conf | float | top-1 클래스의 확률. |
probs.top5conf | tensor | top-5 클래스의 확률. |
probs.data | tensor | 전체 소프트맥스 벡터. |
데이터셋 형식 및 학습
분류에는 YAML이 아닌 ImageFolder 레이아웃을 사용합니다. 클래스 이름은 정렬된 하위 폴더 이름이며 train 분할을 기준으로 고정됩니다.
1 dataset/ 2 train/ 3 cat/ img001.jpg ... 4 dog/ img104.jpg ... 5 val/ 6 cat/ ... 7 dog/ ...
data= 인수에는 폴더, .zip URL 또는 알려진 자동 다운로드 이름(imagenette160과 imagenet10)을 전달할 수 있습니다. 데이터셋의 클래스 수에 맞게 헤드를 자동으로 다시 구성합니다.
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
참조 실행
개발 중 진행한 빠른 정상 동작 확인 결과입니다. YOLO9-t는 imagenette160에서 top-1 0.79 / top-5 0.975(10 에포크), RF-DETR-n은 top-1 0.69 / top-5 0.96(6 에포크)에 도달했습니다. RF-DETR 모델은 처음 실행할 때 인터넷으로 DINOv2 백본을 가져오면 더 좋은 결과를 얻으며, 오프라인에서는 무작위 초기화로 대체합니다.
회전 바운딩 박스(OBB)
회전 바운딩 박스에는 회전 각도가 포함되어 항공 이미지, 문서, 객체가 빽빽한 장면에 적합합니다. YOLO9은 탐지 헤드에 각도 분기를 추가하고 RF-DETR 모델은 디코더에 학습 가능한 각도 임베딩을 추가합니다.
추론 및 OBB 결과
Results는 obb 필드를 제공합니다. 각도는 라디안 단위입니다.
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]
| 필드 | 형태 | 의미 |
|---|---|---|
obb.xywhr | N x 5 | [cx, cy, w, h, angle]에서 angle은 라디안 단위입니다. |
obb.xyxyxyxy | N x 4 x 2 | 바운딩 박스당 모서리 점 4개. |
obb.conf | N | 바운딩 박스별 신뢰도. |
obb.cls | N | 바운딩 박스별 클래스 ID. |
데이터셋 형식 및 학습
OBB는 표준 탐지 형식의 데이터 YAML을 사용하지만 레이블은 행마다 정확히 9개 필드가 있는 YOLO-OBB 텍스트 파일입니다. 클래스 ID 다음에 정규화된 모서리 점 4개가 옵니다. 각도는 저장하지 않고 모서리에서 계산합니다.
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
일반 탐지 체크포인트는 OBB 모델로 직접 불러올 수 없습니다. 탐지에서 OBB로 전환하는 것은 학습 웜 스타트로만 허용됩니다. pretrained=True(YOLO9) 또는 RF-DETR 모델의 명시적 전이 플래그를 전달합니다. 모서리를 인식하는 데이터 증강 기능이 추가될 때까지 OBB에서 Mosaic와 mixup을 비활성화하며 타일 추론은 지원하지 않습니다.
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
검증에는 회전 IoU AP를 사용하며 OBB 메트릭 그룹에서 mAP50과 mAP50-95로 보고합니다.
키포인트 / 자세
자세 추정은 탐지된 인스턴스별 키포인트를 예측합니다. 기본 레이아웃은 COCO-17 사람 키포인트입니다. YOLO9 및 RF-DETR 자세 모델의 첫 버전은 사람 전용 단일 클래스이며 YOLO-NAS 및 EdgeCrafter 자세 모델은 이미 코드 트리에서 사용할 수 있습니다.
추론 및 Keypoints 결과
Results는 원본 이미지 픽셀 좌표에서 (N, K, 3) 형태의 keypoints 필드를 제공합니다. 마지막 채널은 가시성 또는 신뢰도입니다.
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
| 필드 | 형태 | 의미 |
|---|---|---|
keypoints.xy | N x K x 2 | 픽셀 키포인트 좌표. |
keypoints.xyn | N x K x 2 | 정규화된 키포인트 좌표. |
keypoints.conf | N x K | 키포인트별 가시성 / 신뢰도. |
keypoints.has_visible | N x K | 불리언 가시 마스크. |
데이터셋 형식 및 학습
자세 작업에는 kpt_shape: [K, 2|3]을 선언하고 수평 뒤집기 데이터 증강을 위해 flip_idx를 선언한 데이터 YAML을 사용해야 합니다. 레이블은 클래스 ID, 정규화된 바운딩 박스, K개의 키포인트 삼중항 (x, y, v) 순서인 YOLO-pose 텍스트 행이며 가시성 v는 {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
개발 진행 중
YOLO9 및 RF-DETR 자세 모델은 기능 브랜치에 있으며 아직 병합되지 않았습니다. 위 API는 고정된 계약이 아니라 의도한 계약으로 간주하십시오. YOLO-NAS 자세 가중치는 미러링하지 않고 업스트림에 연결하므로 수동으로 준비해야 합니다.
소형 객체 탐지(YOLO9-P2)
YOLO9-P2는 stride 4에 네 번째 탐지 스케일을 추가한 YOLOv9입니다. 기본 YOLOv9은 stride 8/16/32에서 탐지하므로 ~16 px 미만의 객체는 가장 세밀한 그리드보다 작습니다. P2 헤드는 항공 및 드론 영상에서 많은 4-16 px 범위를 포착합니다.
VisDrone에서 제어된 A/B 실험을 진행했습니다. 학습 방식, 해상도, 초기화는 같고 P2 헤드만 변경했습니다. 소형 객체 AP는 같은 크기의 기본 YOLOv9보다 +49% 향상되었습니다. 더 높은 학습 해상도와 더 큰 s 크기를 추가하자 프로젝트 전반에서 소형 객체 AP가 약 2배가 되었습니다.
| 모델 | AP | AP50 | AP_small |
|---|---|---|---|
| 기본 YOLO9-t @640(대조군) | 0.123 | 0.220 | 0.047 |
| YOLO9-P2-t @640(동일한 학습 방식의 A/B) | 0.138 | 0.254 | 0.070 |
| YOLO9-P2-s @768(출시된 미리 보기) | 0.226 | 0.385 | 0.141 |
VisDrone2019-DET val(이미지 548개), pycocotools, 단일 시드이며 ±1 포인트는 노이즈로 간주합니다.
VisDrone 연구 미리 보기
학습된 체크포인트는 LibreYOLO9P2s-visdrone으로 공개되어 있습니다. 이 계열은 dev에 병합되었지만 아직 PyPI 릴리스에는 포함되지 않았으므로 다음 릴리스까지 소스에서 설치하십시오.
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)
비상업적 라이선스
미리 보기 체크포인트는 VisDrone2019-DET(AISKYEYE, Tianjin University)에서 학습했으며 CC BY-NC-SA 3.0 라이선스가 적용됩니다. LibreYOLO의 MIT 코드와 COCO 기본 가중치와 달리 비상업적 용도로만 사용할 수 있습니다. COCO가 아닌 VisDrone 항공 클래스 10개를 탐지합니다. 모델 카드에는 정확한 학습 방식, 에포크별 메트릭, 클린룸 데이터셋 변환기가 포함되어 있어 결과를 재현하거나 자체 데이터로 다시 학습할 수 있습니다.
사용 여부
환경에 맞는 아키텍처를 선택합니다. COCO와 유사한 데이터("소형"은 16-32 px를 의미)에서는 P2 헤드가 도움이 되지 않으므로 기본 YOLOv9이 더 적합합니다. 객체가 ~16 px 미만인 드론 및 항공 영상, 원거리 CCTV, 위성 타일에는 YOLO9-P2를 사용합니다. 추가 스케일은 연산량과 앵커 수를 약 2배로 늘립니다. 이것이 stride-4 그리드의 비용입니다.
직접 학습
YOLO9-P2는 기본 YOLOv9 탐지 체크포인트에서 전이 초기화합니다. 백본, 공유 넥, 기존 헤드 타워는 불러오고 새 P2 모듈은 처음부터 시작합니다. 아래 학습 방식에는 소형 객체 데이터에서 시행착오로 얻은 내용을 반영했습니다.
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 )
LoRA / DoRA 파인튜닝
LoRA 방식 어댑터는 기본 가중치를 동결한 상태에서 소수의 저랭크 행렬을 학습하여 RF-DETR 모델의 트랜스포머 백본을 파인튜닝합니다. 옵티마이저와 그래디언트 메모리를 줄이므로 제한된 하드웨어에서 강력한 체크포인트를 새 도메인에 맞추는 데 적합합니다.
활성화
전체 공개 API는 train()의 단일 플래그입니다. rank, alpha 또는 대상 모듈을 조정하는 설정은 없으며 학습 방식은 충분히 검증된 구성으로 고정됩니다. 내부 구현은 DINOv2 어텐션의 쿼리, 키, 값 프로젝션에 적용한 DoRA(가중치 분해 LoRA, rank 16)를 사용합니다.
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
체크포인트 및 내보내기
- 학습 체크포인트는 어댑터 텐서를 유지하고 구성에는 LoRA 사용 여부를 기록하므로 불러오기 및 이어서 학습 시 어댑터 그래프를 자동으로 다시 구성합니다.
- 탐지 헤드는 항상 학습 가능한 상태를 유지하므로 새로운 클래스 수에 맞게 계속 조정할 수 있습니다.
export()는 어댑터를 밀집 가중치에 다시 병합합니다. 내보낸 모델은 일반 모델이며peft의존성이 없습니다.- LoRA는 RF-DETR 전용입니다. 다른 계열에
lora=True를 전달하면 명확한 오류가 발생합니다.
추가 패키지 설치
LoRA 학습에는 어댑터 의존성인 pip install "libreyolo[lora]"가 필요하며, 이 명령은 RF-DETR 스택과 peft를 설치합니다. 내보내 병합된 모델은 추론할 때 이 의존성이 필요하지 않습니다.
안정성
각 기능의 현재 상태를 보여 줍니다. 모두 실험적이며 이 표는 정확한 현황을 제공합니다.
| 기능 | 계열 | 상태 |
|---|---|---|
| 분류 | YOLO9, RF-DETR | PR 진행 중 |
| 회전 바운딩 박스(OBB) | YOLO9, RF-DETR | 실험적 |
| 키포인트 / 자세 | YOLO9, RF-DETR | 곧 병합 |
| 키포인트 / 자세 | YOLO-NAS, EdgeCrafter | 사용 가능 |
| 소형 객체 탐지 | YOLO9-P2 | 연구 미리 보기 |
| LoRA / DoRA | RF-DETR | 검토 완료 |