ultralytics 8.1.28__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.
Files changed (247) hide show
  1. tests/__init__.py +22 -0
  2. tests/conftest.py +83 -0
  3. tests/test_cli.py +122 -0
  4. tests/test_cuda.py +155 -0
  5. tests/test_engine.py +131 -0
  6. tests/test_exports.py +216 -0
  7. tests/test_integrations.py +150 -0
  8. tests/test_python.py +615 -0
  9. tests/test_solutions.py +94 -0
  10. ultralytics/__init__.py +11 -8
  11. ultralytics/cfg/__init__.py +569 -131
  12. ultralytics/cfg/datasets/Argoverse.yaml +2 -1
  13. ultralytics/cfg/datasets/DOTAv1.5.yaml +3 -2
  14. ultralytics/cfg/datasets/DOTAv1.yaml +3 -2
  15. ultralytics/cfg/datasets/GlobalWheat2020.yaml +3 -2
  16. ultralytics/cfg/datasets/ImageNet.yaml +2 -1
  17. ultralytics/cfg/datasets/Objects365.yaml +5 -4
  18. ultralytics/cfg/datasets/SKU-110K.yaml +2 -1
  19. ultralytics/cfg/datasets/VOC.yaml +3 -2
  20. ultralytics/cfg/datasets/VisDrone.yaml +6 -5
  21. ultralytics/cfg/datasets/african-wildlife.yaml +25 -0
  22. ultralytics/cfg/datasets/brain-tumor.yaml +23 -0
  23. ultralytics/cfg/datasets/carparts-seg.yaml +3 -2
  24. ultralytics/cfg/datasets/coco-pose.yaml +7 -6
  25. ultralytics/cfg/datasets/coco.yaml +3 -2
  26. ultralytics/cfg/datasets/coco128-seg.yaml +4 -3
  27. ultralytics/cfg/datasets/coco128.yaml +4 -3
  28. ultralytics/cfg/datasets/coco8-pose.yaml +3 -2
  29. ultralytics/cfg/datasets/coco8-seg.yaml +3 -2
  30. ultralytics/cfg/datasets/coco8.yaml +3 -2
  31. ultralytics/cfg/datasets/crack-seg.yaml +3 -2
  32. ultralytics/cfg/datasets/dog-pose.yaml +24 -0
  33. ultralytics/cfg/datasets/dota8.yaml +3 -2
  34. ultralytics/cfg/datasets/hand-keypoints.yaml +26 -0
  35. ultralytics/cfg/datasets/lvis.yaml +1236 -0
  36. ultralytics/cfg/datasets/medical-pills.yaml +22 -0
  37. ultralytics/cfg/datasets/open-images-v7.yaml +2 -1
  38. ultralytics/cfg/datasets/package-seg.yaml +5 -4
  39. ultralytics/cfg/datasets/signature.yaml +21 -0
  40. ultralytics/cfg/datasets/tiger-pose.yaml +3 -2
  41. ultralytics/cfg/datasets/xView.yaml +2 -1
  42. ultralytics/cfg/default.yaml +14 -11
  43. ultralytics/cfg/models/11/yolo11-cls-resnet18.yaml +24 -0
  44. ultralytics/cfg/models/11/yolo11-cls.yaml +33 -0
  45. ultralytics/cfg/models/11/yolo11-obb.yaml +50 -0
  46. ultralytics/cfg/models/11/yolo11-pose.yaml +51 -0
  47. ultralytics/cfg/models/11/yolo11-seg.yaml +50 -0
  48. ultralytics/cfg/models/11/yolo11.yaml +50 -0
  49. ultralytics/cfg/models/rt-detr/rtdetr-l.yaml +5 -2
  50. ultralytics/cfg/models/rt-detr/rtdetr-resnet101.yaml +5 -2
  51. ultralytics/cfg/models/rt-detr/rtdetr-resnet50.yaml +5 -2
  52. ultralytics/cfg/models/rt-detr/rtdetr-x.yaml +5 -2
  53. ultralytics/cfg/models/v10/yolov10b.yaml +45 -0
  54. ultralytics/cfg/models/v10/yolov10l.yaml +45 -0
  55. ultralytics/cfg/models/v10/yolov10m.yaml +45 -0
  56. ultralytics/cfg/models/v10/yolov10n.yaml +45 -0
  57. ultralytics/cfg/models/v10/yolov10s.yaml +45 -0
  58. ultralytics/cfg/models/v10/yolov10x.yaml +45 -0
  59. ultralytics/cfg/models/v3/yolov3-spp.yaml +5 -2
  60. ultralytics/cfg/models/v3/yolov3-tiny.yaml +5 -2
  61. ultralytics/cfg/models/v3/yolov3.yaml +5 -2
  62. ultralytics/cfg/models/v5/yolov5-p6.yaml +5 -2
  63. ultralytics/cfg/models/v5/yolov5.yaml +5 -2
  64. ultralytics/cfg/models/v6/yolov6.yaml +5 -2
  65. ultralytics/cfg/models/v8/yolov8-cls-resnet101.yaml +5 -2
  66. ultralytics/cfg/models/v8/yolov8-cls-resnet50.yaml +5 -2
  67. ultralytics/cfg/models/v8/yolov8-cls.yaml +5 -2
  68. ultralytics/cfg/models/v8/yolov8-ghost-p2.yaml +6 -2
  69. ultralytics/cfg/models/v8/yolov8-ghost-p6.yaml +6 -2
  70. ultralytics/cfg/models/v8/yolov8-ghost.yaml +5 -2
  71. ultralytics/cfg/models/v8/yolov8-obb.yaml +5 -2
  72. ultralytics/cfg/models/v8/yolov8-p2.yaml +5 -2
  73. ultralytics/cfg/models/v8/yolov8-p6.yaml +10 -7
  74. ultralytics/cfg/models/v8/yolov8-pose-p6.yaml +5 -2
  75. ultralytics/cfg/models/v8/yolov8-pose.yaml +5 -2
  76. ultralytics/cfg/models/v8/yolov8-rtdetr.yaml +5 -2
  77. ultralytics/cfg/models/v8/yolov8-seg-p6.yaml +5 -2
  78. ultralytics/cfg/models/v8/yolov8-seg.yaml +5 -2
  79. ultralytics/cfg/models/v8/yolov8-world.yaml +5 -2
  80. ultralytics/cfg/models/v8/yolov8-worldv2.yaml +5 -2
  81. ultralytics/cfg/models/v8/yolov8.yaml +5 -2
  82. ultralytics/cfg/models/v9/yolov9c-seg.yaml +41 -0
  83. ultralytics/cfg/models/v9/yolov9c.yaml +30 -25
  84. ultralytics/cfg/models/v9/yolov9e-seg.yaml +64 -0
  85. ultralytics/cfg/models/v9/yolov9e.yaml +46 -42
  86. ultralytics/cfg/models/v9/yolov9m.yaml +41 -0
  87. ultralytics/cfg/models/v9/yolov9s.yaml +41 -0
  88. ultralytics/cfg/models/v9/yolov9t.yaml +41 -0
  89. ultralytics/cfg/solutions/default.yaml +24 -0
  90. ultralytics/cfg/trackers/botsort.yaml +8 -5
  91. ultralytics/cfg/trackers/bytetrack.yaml +8 -5
  92. ultralytics/data/__init__.py +14 -3
  93. ultralytics/data/annotator.py +37 -15
  94. ultralytics/data/augment.py +1783 -289
  95. ultralytics/data/base.py +62 -27
  96. ultralytics/data/build.py +36 -8
  97. ultralytics/data/converter.py +196 -36
  98. ultralytics/data/dataset.py +233 -94
  99. ultralytics/data/loaders.py +199 -96
  100. ultralytics/data/split_dota.py +39 -29
  101. ultralytics/data/utils.py +110 -40
  102. ultralytics/engine/__init__.py +1 -1
  103. ultralytics/engine/exporter.py +569 -242
  104. ultralytics/engine/model.py +604 -252
  105. ultralytics/engine/predictor.py +22 -11
  106. ultralytics/engine/results.py +1228 -218
  107. ultralytics/engine/trainer.py +190 -129
  108. ultralytics/engine/tuner.py +18 -18
  109. ultralytics/engine/validator.py +18 -15
  110. ultralytics/hub/__init__.py +31 -13
  111. ultralytics/hub/auth.py +11 -7
  112. ultralytics/hub/google/__init__.py +159 -0
  113. ultralytics/hub/session.py +128 -94
  114. ultralytics/hub/utils.py +20 -21
  115. ultralytics/models/__init__.py +4 -2
  116. ultralytics/models/fastsam/__init__.py +2 -3
  117. ultralytics/models/fastsam/model.py +26 -4
  118. ultralytics/models/fastsam/predict.py +127 -63
  119. ultralytics/models/fastsam/utils.py +1 -44
  120. ultralytics/models/fastsam/val.py +1 -1
  121. ultralytics/models/nas/__init__.py +1 -1
  122. ultralytics/models/nas/model.py +21 -10
  123. ultralytics/models/nas/predict.py +3 -6
  124. ultralytics/models/nas/val.py +4 -4
  125. ultralytics/models/rtdetr/__init__.py +1 -1
  126. ultralytics/models/rtdetr/model.py +1 -1
  127. ultralytics/models/rtdetr/predict.py +6 -8
  128. ultralytics/models/rtdetr/train.py +6 -2
  129. ultralytics/models/rtdetr/val.py +3 -3
  130. ultralytics/models/sam/__init__.py +3 -3
  131. ultralytics/models/sam/amg.py +29 -23
  132. ultralytics/models/sam/build.py +211 -13
  133. ultralytics/models/sam/model.py +91 -30
  134. ultralytics/models/sam/modules/__init__.py +1 -1
  135. ultralytics/models/sam/modules/blocks.py +1129 -0
  136. ultralytics/models/sam/modules/decoders.py +381 -53
  137. ultralytics/models/sam/modules/encoders.py +515 -324
  138. ultralytics/models/sam/modules/memory_attention.py +237 -0
  139. ultralytics/models/sam/modules/sam.py +969 -21
  140. ultralytics/models/sam/modules/tiny_encoder.py +425 -154
  141. ultralytics/models/sam/modules/transformer.py +159 -60
  142. ultralytics/models/sam/modules/utils.py +293 -0
  143. ultralytics/models/sam/predict.py +1263 -132
  144. ultralytics/models/utils/__init__.py +1 -1
  145. ultralytics/models/utils/loss.py +36 -24
  146. ultralytics/models/utils/ops.py +3 -7
  147. ultralytics/models/yolo/__init__.py +3 -3
  148. ultralytics/models/yolo/classify/__init__.py +1 -1
  149. ultralytics/models/yolo/classify/predict.py +7 -8
  150. ultralytics/models/yolo/classify/train.py +17 -22
  151. ultralytics/models/yolo/classify/val.py +8 -4
  152. ultralytics/models/yolo/detect/__init__.py +1 -1
  153. ultralytics/models/yolo/detect/predict.py +3 -5
  154. ultralytics/models/yolo/detect/train.py +11 -4
  155. ultralytics/models/yolo/detect/val.py +90 -52
  156. ultralytics/models/yolo/model.py +14 -9
  157. ultralytics/models/yolo/obb/__init__.py +1 -1
  158. ultralytics/models/yolo/obb/predict.py +2 -2
  159. ultralytics/models/yolo/obb/train.py +5 -3
  160. ultralytics/models/yolo/obb/val.py +41 -23
  161. ultralytics/models/yolo/pose/__init__.py +1 -1
  162. ultralytics/models/yolo/pose/predict.py +3 -5
  163. ultralytics/models/yolo/pose/train.py +2 -2
  164. ultralytics/models/yolo/pose/val.py +51 -17
  165. ultralytics/models/yolo/segment/__init__.py +1 -1
  166. ultralytics/models/yolo/segment/predict.py +3 -5
  167. ultralytics/models/yolo/segment/train.py +2 -2
  168. ultralytics/models/yolo/segment/val.py +60 -19
  169. ultralytics/models/yolo/world/__init__.py +5 -0
  170. ultralytics/models/yolo/world/train.py +92 -0
  171. ultralytics/models/yolo/world/train_world.py +109 -0
  172. ultralytics/nn/__init__.py +1 -1
  173. ultralytics/nn/autobackend.py +228 -93
  174. ultralytics/nn/modules/__init__.py +39 -14
  175. ultralytics/nn/modules/activation.py +21 -0
  176. ultralytics/nn/modules/block.py +527 -67
  177. ultralytics/nn/modules/conv.py +24 -7
  178. ultralytics/nn/modules/head.py +177 -34
  179. ultralytics/nn/modules/transformer.py +6 -5
  180. ultralytics/nn/modules/utils.py +1 -2
  181. ultralytics/nn/tasks.py +225 -77
  182. ultralytics/solutions/__init__.py +30 -1
  183. ultralytics/solutions/ai_gym.py +96 -143
  184. ultralytics/solutions/analytics.py +247 -0
  185. ultralytics/solutions/distance_calculation.py +78 -135
  186. ultralytics/solutions/heatmap.py +93 -247
  187. ultralytics/solutions/object_counter.py +184 -259
  188. ultralytics/solutions/parking_management.py +246 -0
  189. ultralytics/solutions/queue_management.py +112 -0
  190. ultralytics/solutions/region_counter.py +116 -0
  191. ultralytics/solutions/security_alarm.py +144 -0
  192. ultralytics/solutions/solutions.py +178 -0
  193. ultralytics/solutions/speed_estimation.py +86 -174
  194. ultralytics/solutions/streamlit_inference.py +190 -0
  195. ultralytics/solutions/trackzone.py +68 -0
  196. ultralytics/trackers/__init__.py +1 -1
  197. ultralytics/trackers/basetrack.py +32 -13
  198. ultralytics/trackers/bot_sort.py +61 -28
  199. ultralytics/trackers/byte_tracker.py +83 -51
  200. ultralytics/trackers/track.py +21 -6
  201. ultralytics/trackers/utils/__init__.py +1 -1
  202. ultralytics/trackers/utils/gmc.py +62 -48
  203. ultralytics/trackers/utils/kalman_filter.py +166 -35
  204. ultralytics/trackers/utils/matching.py +40 -21
  205. ultralytics/utils/__init__.py +511 -239
  206. ultralytics/utils/autobatch.py +40 -22
  207. ultralytics/utils/benchmarks.py +266 -85
  208. ultralytics/utils/callbacks/__init__.py +1 -1
  209. ultralytics/utils/callbacks/base.py +1 -3
  210. ultralytics/utils/callbacks/clearml.py +7 -6
  211. ultralytics/utils/callbacks/comet.py +39 -17
  212. ultralytics/utils/callbacks/dvc.py +1 -1
  213. ultralytics/utils/callbacks/hub.py +16 -16
  214. ultralytics/utils/callbacks/mlflow.py +28 -24
  215. ultralytics/utils/callbacks/neptune.py +6 -2
  216. ultralytics/utils/callbacks/raytune.py +3 -4
  217. ultralytics/utils/callbacks/tensorboard.py +18 -18
  218. ultralytics/utils/callbacks/wb.py +27 -20
  219. ultralytics/utils/checks.py +160 -100
  220. ultralytics/utils/dist.py +2 -1
  221. ultralytics/utils/downloads.py +44 -37
  222. ultralytics/utils/errors.py +1 -1
  223. ultralytics/utils/files.py +72 -38
  224. ultralytics/utils/instance.py +41 -19
  225. ultralytics/utils/loss.py +84 -56
  226. ultralytics/utils/metrics.py +61 -56
  227. ultralytics/utils/ops.py +94 -89
  228. ultralytics/utils/patches.py +30 -14
  229. ultralytics/utils/plotting.py +600 -269
  230. ultralytics/utils/tal.py +67 -26
  231. ultralytics/utils/torch_utils.py +302 -102
  232. ultralytics/utils/triton.py +2 -1
  233. ultralytics/utils/tuner.py +21 -12
  234. ultralytics-8.3.62.dist-info/METADATA +370 -0
  235. ultralytics-8.3.62.dist-info/RECORD +241 -0
  236. {ultralytics-8.1.28.dist-info → ultralytics-8.3.62.dist-info}/WHEEL +1 -1
  237. ultralytics/data/explorer/__init__.py +0 -5
  238. ultralytics/data/explorer/explorer.py +0 -472
  239. ultralytics/data/explorer/gui/__init__.py +0 -1
  240. ultralytics/data/explorer/gui/dash.py +0 -268
  241. ultralytics/data/explorer/utils.py +0 -166
  242. ultralytics/models/fastsam/prompt.py +0 -357
  243. ultralytics-8.1.28.dist-info/METADATA +0 -373
  244. ultralytics-8.1.28.dist-info/RECORD +0 -197
  245. {ultralytics-8.1.28.dist-info → ultralytics-8.3.62.dist-info}/LICENSE +0 -0
  246. {ultralytics-8.1.28.dist-info → ultralytics-8.3.62.dist-info}/entry_points.txt +0 -0
  247. {ultralytics-8.1.28.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()
@@ -1,4 +1,4 @@
1
- # Ultralytics YOLO 🚀, AGPL-3.0 license
1
+ # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
3
  from .tasks import (
4
4
  BaseModel,