ultralytics 8.1.29__py3-none-any.whl → 8.3.62__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tests/__init__.py +22 -0
- tests/conftest.py +83 -0
- tests/test_cli.py +122 -0
- tests/test_cuda.py +155 -0
- tests/test_engine.py +131 -0
- tests/test_exports.py +216 -0
- tests/test_integrations.py +150 -0
- tests/test_python.py +615 -0
- tests/test_solutions.py +94 -0
- ultralytics/__init__.py +11 -8
- ultralytics/cfg/__init__.py +569 -131
- ultralytics/cfg/datasets/Argoverse.yaml +2 -1
- ultralytics/cfg/datasets/DOTAv1.5.yaml +3 -2
- ultralytics/cfg/datasets/DOTAv1.yaml +3 -2
- ultralytics/cfg/datasets/GlobalWheat2020.yaml +3 -2
- ultralytics/cfg/datasets/ImageNet.yaml +2 -1
- ultralytics/cfg/datasets/Objects365.yaml +5 -4
- ultralytics/cfg/datasets/SKU-110K.yaml +2 -1
- ultralytics/cfg/datasets/VOC.yaml +3 -2
- ultralytics/cfg/datasets/VisDrone.yaml +6 -5
- ultralytics/cfg/datasets/african-wildlife.yaml +25 -0
- ultralytics/cfg/datasets/brain-tumor.yaml +23 -0
- ultralytics/cfg/datasets/carparts-seg.yaml +3 -2
- ultralytics/cfg/datasets/coco-pose.yaml +7 -6
- ultralytics/cfg/datasets/coco.yaml +3 -2
- ultralytics/cfg/datasets/coco128-seg.yaml +4 -3
- ultralytics/cfg/datasets/coco128.yaml +4 -3
- ultralytics/cfg/datasets/coco8-pose.yaml +3 -2
- ultralytics/cfg/datasets/coco8-seg.yaml +3 -2
- ultralytics/cfg/datasets/coco8.yaml +3 -2
- ultralytics/cfg/datasets/crack-seg.yaml +3 -2
- ultralytics/cfg/datasets/dog-pose.yaml +24 -0
- ultralytics/cfg/datasets/dota8.yaml +3 -2
- ultralytics/cfg/datasets/hand-keypoints.yaml +26 -0
- ultralytics/cfg/datasets/lvis.yaml +1236 -0
- ultralytics/cfg/datasets/medical-pills.yaml +22 -0
- ultralytics/cfg/datasets/open-images-v7.yaml +2 -1
- ultralytics/cfg/datasets/package-seg.yaml +5 -4
- ultralytics/cfg/datasets/signature.yaml +21 -0
- ultralytics/cfg/datasets/tiger-pose.yaml +3 -2
- ultralytics/cfg/datasets/xView.yaml +2 -1
- ultralytics/cfg/default.yaml +14 -11
- ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +24 -0
- ultralytics/cfg/models/11/yolo11-cls.yaml +33 -0
- ultralytics/cfg/models/11/yolo11-obb.yaml +50 -0
- ultralytics/cfg/models/11/yolo11-pose.yaml +51 -0
- ultralytics/cfg/models/11/yolo11-seg.yaml +50 -0
- ultralytics/cfg/models/11/yolo11.yaml +50 -0
- ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +5 -2
- ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +5 -2
- ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +5 -2
- ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +5 -2
- ultralytics/cfg/models/v10/yolov10b.yaml +45 -0
- ultralytics/cfg/models/v10/yolov10l.yaml +45 -0
- ultralytics/cfg/models/v10/yolov10m.yaml +45 -0
- ultralytics/cfg/models/v10/yolov10n.yaml +45 -0
- ultralytics/cfg/models/v10/yolov10s.yaml +45 -0
- ultralytics/cfg/models/v10/yolov10x.yaml +45 -0
- ultralytics/cfg/models/v3/yolov3-spp.yaml +5 -2
- ultralytics/cfg/models/v3/yolov3-tiny.yaml +5 -2
- ultralytics/cfg/models/v3/yolov3.yaml +5 -2
- ultralytics/cfg/models/v5/yolov5-p6.yaml +5 -2
- ultralytics/cfg/models/v5/yolov5.yaml +5 -2
- ultralytics/cfg/models/v6/yolov6.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-cls.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +6 -2
- ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +6 -2
- ultralytics/cfg/models/v8/yolov8-ghost.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-obb.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-p2.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-p6.yaml +10 -7
- ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-pose.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-seg.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-world.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8-worldv2.yaml +5 -2
- ultralytics/cfg/models/v8/yolov8.yaml +5 -2
- ultralytics/cfg/models/v9/yolov9c-seg.yaml +41 -0
- ultralytics/cfg/models/v9/yolov9c.yaml +30 -25
- ultralytics/cfg/models/v9/yolov9e-seg.yaml +64 -0
- ultralytics/cfg/models/v9/yolov9e.yaml +46 -42
- ultralytics/cfg/models/v9/yolov9m.yaml +41 -0
- ultralytics/cfg/models/v9/yolov9s.yaml +41 -0
- ultralytics/cfg/models/v9/yolov9t.yaml +41 -0
- ultralytics/cfg/solutions/default.yaml +24 -0
- ultralytics/cfg/trackers/botsort.yaml +8 -5
- ultralytics/cfg/trackers/bytetrack.yaml +8 -5
- ultralytics/data/__init__.py +14 -3
- ultralytics/data/annotator.py +37 -15
- ultralytics/data/augment.py +1783 -289
- ultralytics/data/base.py +62 -27
- ultralytics/data/build.py +36 -8
- ultralytics/data/converter.py +196 -36
- ultralytics/data/dataset.py +233 -94
- ultralytics/data/loaders.py +199 -96
- ultralytics/data/split_dota.py +39 -29
- ultralytics/data/utils.py +110 -40
- ultralytics/engine/__init__.py +1 -1
- ultralytics/engine/exporter.py +569 -242
- ultralytics/engine/model.py +604 -252
- ultralytics/engine/predictor.py +22 -11
- ultralytics/engine/results.py +1228 -218
- ultralytics/engine/trainer.py +190 -129
- ultralytics/engine/tuner.py +18 -18
- ultralytics/engine/validator.py +18 -15
- ultralytics/hub/__init__.py +31 -13
- ultralytics/hub/auth.py +11 -7
- ultralytics/hub/google/__init__.py +159 -0
- ultralytics/hub/session.py +128 -94
- ultralytics/hub/utils.py +20 -21
- ultralytics/models/__init__.py +4 -2
- ultralytics/models/fastsam/__init__.py +2 -3
- ultralytics/models/fastsam/model.py +26 -4
- ultralytics/models/fastsam/predict.py +127 -63
- ultralytics/models/fastsam/utils.py +1 -44
- ultralytics/models/fastsam/val.py +1 -1
- ultralytics/models/nas/__init__.py +1 -1
- ultralytics/models/nas/model.py +21 -10
- ultralytics/models/nas/predict.py +3 -6
- ultralytics/models/nas/val.py +4 -4
- ultralytics/models/rtdetr/__init__.py +1 -1
- ultralytics/models/rtdetr/model.py +1 -1
- ultralytics/models/rtdetr/predict.py +6 -8
- ultralytics/models/rtdetr/train.py +6 -2
- ultralytics/models/rtdetr/val.py +3 -3
- ultralytics/models/sam/__init__.py +3 -3
- ultralytics/models/sam/amg.py +29 -23
- ultralytics/models/sam/build.py +211 -13
- ultralytics/models/sam/model.py +91 -30
- ultralytics/models/sam/modules/__init__.py +1 -1
- ultralytics/models/sam/modules/blocks.py +1129 -0
- ultralytics/models/sam/modules/decoders.py +381 -53
- ultralytics/models/sam/modules/encoders.py +515 -324
- ultralytics/models/sam/modules/memory_attention.py +237 -0
- ultralytics/models/sam/modules/sam.py +969 -21
- ultralytics/models/sam/modules/tiny_encoder.py +425 -154
- ultralytics/models/sam/modules/transformer.py +159 -60
- ultralytics/models/sam/modules/utils.py +293 -0
- ultralytics/models/sam/predict.py +1263 -132
- ultralytics/models/utils/__init__.py +1 -1
- ultralytics/models/utils/loss.py +36 -24
- ultralytics/models/utils/ops.py +3 -7
- ultralytics/models/yolo/__init__.py +3 -3
- ultralytics/models/yolo/classify/__init__.py +1 -1
- ultralytics/models/yolo/classify/predict.py +7 -8
- ultralytics/models/yolo/classify/train.py +17 -22
- ultralytics/models/yolo/classify/val.py +8 -4
- ultralytics/models/yolo/detect/__init__.py +1 -1
- ultralytics/models/yolo/detect/predict.py +3 -5
- ultralytics/models/yolo/detect/train.py +11 -4
- ultralytics/models/yolo/detect/val.py +90 -52
- ultralytics/models/yolo/model.py +14 -9
- ultralytics/models/yolo/obb/__init__.py +1 -1
- ultralytics/models/yolo/obb/predict.py +2 -2
- ultralytics/models/yolo/obb/train.py +5 -3
- ultralytics/models/yolo/obb/val.py +41 -23
- ultralytics/models/yolo/pose/__init__.py +1 -1
- ultralytics/models/yolo/pose/predict.py +3 -5
- ultralytics/models/yolo/pose/train.py +2 -2
- ultralytics/models/yolo/pose/val.py +51 -17
- ultralytics/models/yolo/segment/__init__.py +1 -1
- ultralytics/models/yolo/segment/predict.py +3 -5
- ultralytics/models/yolo/segment/train.py +2 -2
- ultralytics/models/yolo/segment/val.py +60 -19
- ultralytics/models/yolo/world/__init__.py +5 -0
- ultralytics/models/yolo/world/train.py +92 -0
- ultralytics/models/yolo/world/train_world.py +109 -0
- ultralytics/nn/__init__.py +1 -1
- ultralytics/nn/autobackend.py +228 -93
- ultralytics/nn/modules/__init__.py +39 -14
- ultralytics/nn/modules/activation.py +21 -0
- ultralytics/nn/modules/block.py +526 -66
- ultralytics/nn/modules/conv.py +24 -7
- ultralytics/nn/modules/head.py +177 -34
- ultralytics/nn/modules/transformer.py +6 -5
- ultralytics/nn/modules/utils.py +1 -2
- ultralytics/nn/tasks.py +225 -77
- ultralytics/solutions/__init__.py +30 -1
- ultralytics/solutions/ai_gym.py +96 -143
- ultralytics/solutions/analytics.py +247 -0
- ultralytics/solutions/distance_calculation.py +78 -135
- ultralytics/solutions/heatmap.py +93 -247
- ultralytics/solutions/object_counter.py +184 -259
- ultralytics/solutions/parking_management.py +246 -0
- ultralytics/solutions/queue_management.py +112 -0
- ultralytics/solutions/region_counter.py +116 -0
- ultralytics/solutions/security_alarm.py +144 -0
- ultralytics/solutions/solutions.py +178 -0
- ultralytics/solutions/speed_estimation.py +86 -174
- ultralytics/solutions/streamlit_inference.py +190 -0
- ultralytics/solutions/trackzone.py +68 -0
- ultralytics/trackers/__init__.py +1 -1
- ultralytics/trackers/basetrack.py +32 -13
- ultralytics/trackers/bot_sort.py +61 -28
- ultralytics/trackers/byte_tracker.py +83 -51
- ultralytics/trackers/track.py +21 -6
- ultralytics/trackers/utils/__init__.py +1 -1
- ultralytics/trackers/utils/gmc.py +62 -48
- ultralytics/trackers/utils/kalman_filter.py +166 -35
- ultralytics/trackers/utils/matching.py +40 -21
- ultralytics/utils/__init__.py +511 -239
- ultralytics/utils/autobatch.py +40 -22
- ultralytics/utils/benchmarks.py +266 -85
- ultralytics/utils/callbacks/__init__.py +1 -1
- ultralytics/utils/callbacks/base.py +1 -3
- ultralytics/utils/callbacks/clearml.py +7 -6
- ultralytics/utils/callbacks/comet.py +39 -17
- ultralytics/utils/callbacks/dvc.py +1 -1
- ultralytics/utils/callbacks/hub.py +16 -16
- ultralytics/utils/callbacks/mlflow.py +28 -24
- ultralytics/utils/callbacks/neptune.py +6 -2
- ultralytics/utils/callbacks/raytune.py +3 -4
- ultralytics/utils/callbacks/tensorboard.py +18 -18
- ultralytics/utils/callbacks/wb.py +27 -20
- ultralytics/utils/checks.py +160 -100
- ultralytics/utils/dist.py +2 -1
- ultralytics/utils/downloads.py +40 -34
- ultralytics/utils/errors.py +1 -1
- ultralytics/utils/files.py +72 -38
- ultralytics/utils/instance.py +41 -19
- ultralytics/utils/loss.py +83 -55
- ultralytics/utils/metrics.py +61 -56
- ultralytics/utils/ops.py +94 -89
- ultralytics/utils/patches.py +30 -14
- ultralytics/utils/plotting.py +600 -269
- ultralytics/utils/tal.py +67 -26
- ultralytics/utils/torch_utils.py +302 -102
- ultralytics/utils/triton.py +2 -1
- ultralytics/utils/tuner.py +21 -12
- ultralytics-8.3.62.dist-info/METADATA +370 -0
- ultralytics-8.3.62.dist-info/RECORD +241 -0
- {ultralytics-8.1.29.dist-info → ultralytics-8.3.62.dist-info}/WHEEL +1 -1
- ultralytics/data/explorer/__init__.py +0 -5
- ultralytics/data/explorer/explorer.py +0 -472
- ultralytics/data/explorer/gui/__init__.py +0 -1
- ultralytics/data/explorer/gui/dash.py +0 -268
- ultralytics/data/explorer/utils.py +0 -166
- ultralytics/models/fastsam/prompt.py +0 -357
- ultralytics-8.1.29.dist-info/METADATA +0 -373
- ultralytics-8.1.29.dist-info/RECORD +0 -197
- {ultralytics-8.1.29.dist-info → ultralytics-8.3.62.dist-info}/LICENSE +0 -0
- {ultralytics-8.1.29.dist-info → ultralytics-8.3.62.dist-info}/entry_points.txt +0 -0
- {ultralytics-8.1.29.dist-info → ultralytics-8.3.62.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
import itertools
|
4
|
+
|
5
|
+
from ultralytics.data import build_yolo_dataset
|
6
|
+
from ultralytics.models import yolo
|
7
|
+
from ultralytics.nn.tasks import WorldModel
|
8
|
+
from ultralytics.utils import DEFAULT_CFG, RANK, checks
|
9
|
+
from ultralytics.utils.torch_utils import de_parallel
|
10
|
+
|
11
|
+
|
12
|
+
def on_pretrain_routine_end(trainer):
|
13
|
+
"""Callback."""
|
14
|
+
if RANK in {-1, 0}:
|
15
|
+
# NOTE: for evaluation
|
16
|
+
names = [name.split("/")[0] for name in list(trainer.test_loader.dataset.data["names"].values())]
|
17
|
+
de_parallel(trainer.ema.ema).set_classes(names, cache_clip_model=False)
|
18
|
+
device = next(trainer.model.parameters()).device
|
19
|
+
trainer.text_model, _ = trainer.clip.load("ViT-B/32", device=device)
|
20
|
+
for p in trainer.text_model.parameters():
|
21
|
+
p.requires_grad_(False)
|
22
|
+
|
23
|
+
|
24
|
+
class WorldTrainer(yolo.detect.DetectionTrainer):
|
25
|
+
"""
|
26
|
+
A class to fine-tune a world model on a close-set dataset.
|
27
|
+
|
28
|
+
Example:
|
29
|
+
```python
|
30
|
+
from ultralytics.models.yolo.world import WorldModel
|
31
|
+
|
32
|
+
args = dict(model="yolov8s-world.pt", data="coco8.yaml", epochs=3)
|
33
|
+
trainer = WorldTrainer(overrides=args)
|
34
|
+
trainer.train()
|
35
|
+
```
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
|
39
|
+
"""Initialize a WorldTrainer object with given arguments."""
|
40
|
+
if overrides is None:
|
41
|
+
overrides = {}
|
42
|
+
super().__init__(cfg, overrides, _callbacks)
|
43
|
+
|
44
|
+
# Import and assign clip
|
45
|
+
try:
|
46
|
+
import clip
|
47
|
+
except ImportError:
|
48
|
+
checks.check_requirements("git+https://github.com/ultralytics/CLIP.git")
|
49
|
+
import clip
|
50
|
+
self.clip = clip
|
51
|
+
|
52
|
+
def get_model(self, cfg=None, weights=None, verbose=True):
|
53
|
+
"""Return WorldModel initialized with specified config and weights."""
|
54
|
+
# NOTE: This `nc` here is the max number of different text samples in one image, rather than the actual `nc`.
|
55
|
+
# NOTE: Following the official config, nc hard-coded to 80 for now.
|
56
|
+
model = WorldModel(
|
57
|
+
cfg["yaml_file"] if isinstance(cfg, dict) else cfg,
|
58
|
+
ch=3,
|
59
|
+
nc=min(self.data["nc"], 80),
|
60
|
+
verbose=verbose and RANK == -1,
|
61
|
+
)
|
62
|
+
if weights:
|
63
|
+
model.load(weights)
|
64
|
+
self.add_callback("on_pretrain_routine_end", on_pretrain_routine_end)
|
65
|
+
|
66
|
+
return model
|
67
|
+
|
68
|
+
def build_dataset(self, img_path, mode="train", batch=None):
|
69
|
+
"""
|
70
|
+
Build YOLO Dataset.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
img_path (str): Path to the folder containing images.
|
74
|
+
mode (str): `train` mode or `val` mode, users are able to customize different augmentations for each mode.
|
75
|
+
batch (int, optional): Size of batches, this is for `rect`. Defaults to None.
|
76
|
+
"""
|
77
|
+
gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
|
78
|
+
return build_yolo_dataset(
|
79
|
+
self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs, multi_modal=mode == "train"
|
80
|
+
)
|
81
|
+
|
82
|
+
def preprocess_batch(self, batch):
|
83
|
+
"""Preprocesses a batch of images for YOLOWorld training, adjusting formatting and dimensions as needed."""
|
84
|
+
batch = super().preprocess_batch(batch)
|
85
|
+
|
86
|
+
# NOTE: add text features
|
87
|
+
texts = list(itertools.chain(*batch["texts"]))
|
88
|
+
text_token = self.clip.tokenize(texts).to(batch["img"].device)
|
89
|
+
txt_feats = self.text_model.encode_text(text_token).to(dtype=batch["img"].dtype) # torch.float32
|
90
|
+
txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
|
91
|
+
batch["txt_feats"] = txt_feats.reshape(len(batch["texts"]), -1, txt_feats.shape[-1])
|
92
|
+
return batch
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
|
2
|
+
|
3
|
+
from ultralytics.data import YOLOConcatDataset, build_grounding, build_yolo_dataset
|
4
|
+
from ultralytics.data.utils import check_det_dataset
|
5
|
+
from ultralytics.models.yolo.world import WorldTrainer
|
6
|
+
from ultralytics.utils import DEFAULT_CFG
|
7
|
+
from ultralytics.utils.torch_utils import de_parallel
|
8
|
+
|
9
|
+
|
10
|
+
class WorldTrainerFromScratch(WorldTrainer):
|
11
|
+
"""
|
12
|
+
A class extending the WorldTrainer class for training a world model from scratch on open-set dataset.
|
13
|
+
|
14
|
+
Example:
|
15
|
+
```python
|
16
|
+
from ultralytics.models.yolo.world.train_world import WorldTrainerFromScratch
|
17
|
+
from ultralytics import YOLOWorld
|
18
|
+
|
19
|
+
data = dict(
|
20
|
+
train=dict(
|
21
|
+
yolo_data=["Objects365.yaml"],
|
22
|
+
grounding_data=[
|
23
|
+
dict(
|
24
|
+
img_path="../datasets/flickr30k/images",
|
25
|
+
json_file="../datasets/flickr30k/final_flickr_separateGT_train.json",
|
26
|
+
),
|
27
|
+
dict(
|
28
|
+
img_path="../datasets/GQA/images",
|
29
|
+
json_file="../datasets/GQA/final_mixed_train_no_coco.json",
|
30
|
+
),
|
31
|
+
],
|
32
|
+
),
|
33
|
+
val=dict(yolo_data=["lvis.yaml"]),
|
34
|
+
)
|
35
|
+
|
36
|
+
model = YOLOWorld("yolov8s-worldv2.yaml")
|
37
|
+
model.train(data=data, trainer=WorldTrainerFromScratch)
|
38
|
+
```
|
39
|
+
"""
|
40
|
+
|
41
|
+
def __init__(self, cfg=DEFAULT_CFG, overrides=None, _callbacks=None):
|
42
|
+
"""Initialize a WorldTrainer object with given arguments."""
|
43
|
+
if overrides is None:
|
44
|
+
overrides = {}
|
45
|
+
super().__init__(cfg, overrides, _callbacks)
|
46
|
+
|
47
|
+
def build_dataset(self, img_path, mode="train", batch=None):
|
48
|
+
"""
|
49
|
+
Build YOLO Dataset.
|
50
|
+
|
51
|
+
Args:
|
52
|
+
img_path (List[str] | str): Path to the folder containing images.
|
53
|
+
mode (str): `train` mode or `val` mode, users are able to customize different augmentations for each mode.
|
54
|
+
batch (int, optional): Size of batches, this is for `rect`. Defaults to None.
|
55
|
+
"""
|
56
|
+
gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
|
57
|
+
if mode != "train":
|
58
|
+
return build_yolo_dataset(self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs)
|
59
|
+
dataset = [
|
60
|
+
build_yolo_dataset(self.args, im_path, batch, self.data, stride=gs, multi_modal=True)
|
61
|
+
if isinstance(im_path, str)
|
62
|
+
else build_grounding(self.args, im_path["img_path"], im_path["json_file"], batch, stride=gs)
|
63
|
+
for im_path in img_path
|
64
|
+
]
|
65
|
+
return YOLOConcatDataset(dataset) if len(dataset) > 1 else dataset[0]
|
66
|
+
|
67
|
+
def get_dataset(self):
|
68
|
+
"""
|
69
|
+
Get train, val path from data dict if it exists.
|
70
|
+
|
71
|
+
Returns None if data format is not recognized.
|
72
|
+
"""
|
73
|
+
final_data = {}
|
74
|
+
data_yaml = self.args.data
|
75
|
+
assert data_yaml.get("train", False), "train dataset not found" # object365.yaml
|
76
|
+
assert data_yaml.get("val", False), "validation dataset not found" # lvis.yaml
|
77
|
+
data = {k: [check_det_dataset(d) for d in v.get("yolo_data", [])] for k, v in data_yaml.items()}
|
78
|
+
assert len(data["val"]) == 1, f"Only support validating on 1 dataset for now, but got {len(data['val'])}."
|
79
|
+
val_split = "minival" if "lvis" in data["val"][0]["val"] else "val"
|
80
|
+
for d in data["val"]:
|
81
|
+
if d.get("minival") is None: # for lvis dataset
|
82
|
+
continue
|
83
|
+
d["minival"] = str(d["path"] / d["minival"])
|
84
|
+
for s in ["train", "val"]:
|
85
|
+
final_data[s] = [d["train" if s == "train" else val_split] for d in data[s]]
|
86
|
+
# save grounding data if there's one
|
87
|
+
grounding_data = data_yaml[s].get("grounding_data")
|
88
|
+
if grounding_data is None:
|
89
|
+
continue
|
90
|
+
grounding_data = grounding_data if isinstance(grounding_data, list) else [grounding_data]
|
91
|
+
for g in grounding_data:
|
92
|
+
assert isinstance(g, dict), f"Grounding data should be provided in dict format, but got {type(g)}"
|
93
|
+
final_data[s] += grounding_data
|
94
|
+
# NOTE: to make training work properly, set `nc` and `names`
|
95
|
+
final_data["nc"] = data["val"][0]["nc"]
|
96
|
+
final_data["names"] = data["val"][0]["names"]
|
97
|
+
self.data = final_data
|
98
|
+
return final_data["train"], final_data["val"][0]
|
99
|
+
|
100
|
+
def plot_training_labels(self):
|
101
|
+
"""DO NOT plot labels."""
|
102
|
+
pass
|
103
|
+
|
104
|
+
def final_eval(self):
|
105
|
+
"""Performs final evaluation and validation for object detection YOLO-World model."""
|
106
|
+
val = self.args.data["val"]["yolo_data"][0]
|
107
|
+
self.validator.args.data = val
|
108
|
+
self.validator.args.split = "minival" if isinstance(val, str) and "lvis" in val else "val"
|
109
|
+
return super().final_eval()
|
ultralytics/nn/__init__.py
CHANGED