ultralytics 8.3.136__py3-none-any.whl → 8.3.137__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/test_cuda.py CHANGED
@@ -41,7 +41,7 @@ def test_amp():
41
41
 
42
42
 
43
43
  @pytest.mark.slow
44
- # @pytest.mark.skipif(IS_JETSON, reason="Temporary disable ONNX for Jetson")
44
+ @pytest.mark.skipif(IS_JETSON, reason="Temporary disable ONNX for Jetson")
45
45
  @pytest.mark.skipif(not DEVICES, reason="No CUDA devices available")
46
46
  @pytest.mark.parametrize(
47
47
  "task, dynamic, int8, half, batch, simplify, nms",
@@ -50,12 +50,7 @@ def test_amp():
50
50
  for task, dynamic, int8, half, batch, simplify, nms in product(
51
51
  TASKS, [True, False], [False], [False], [1, 2], [True, False], [True, False]
52
52
  )
53
- if not (
54
- (int8 and half)
55
- or (task == "classify" and nms)
56
- or (task == "obb" and nms and (not TORCH_1_13 or IS_JETSON)) # obb nms fails on NVIDIA Jetson
57
- or (simplify and dynamic) # onnxslim is slow when dynamic=True
58
- )
53
+ if not ((int8 and half) or (task == "classify" and nms) or (task == "obb" and nms and not TORCH_1_13))
59
54
  ],
60
55
  )
61
56
  def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
tests/test_exports.py CHANGED
@@ -83,12 +83,7 @@ def test_export_openvino_matrix(task, dynamic, int8, half, batch, nms):
83
83
  for task, dynamic, int8, half, batch, simplify, nms in product(
84
84
  TASKS, [True, False], [False], [False], [1, 2], [True, False], [True, False]
85
85
  )
86
- if not (
87
- (int8 and half)
88
- or (task == "classify" and nms)
89
- or (task == "obb" and nms and not TORCH_1_13)
90
- or (simplify and dynamic) # onnxslim is slow when dynamic=True
91
- )
86
+ if not ((int8 and half) or (task == "classify" and nms) or (task == "obb" and nms and not TORCH_1_13))
92
87
  ],
93
88
  )
94
89
  def test_export_onnx_matrix(task, dynamic, int8, half, batch, simplify, nms):
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.136"
3
+ __version__ = "8.3.137"
4
4
 
5
5
  import os
6
6
 
@@ -557,7 +557,7 @@ class Exporter:
557
557
  """YOLO ONNX export."""
558
558
  requirements = ["onnx>=1.12.0,<1.18.0"]
559
559
  if self.args.simplify:
560
- requirements += ["onnxslim>=0.1.46", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
560
+ requirements += ["onnxslim>=0.1.53", "onnxruntime" + ("-gpu" if torch.cuda.is_available() else "")]
561
561
  check_requirements(requirements)
562
562
  import onnx # noqa
563
563
 
@@ -928,7 +928,7 @@ class Exporter:
928
928
  "ai-edge-litert>=1.2.0", # required by 'onnx2tf' package
929
929
  "onnx>=1.12.0,<1.18.0",
930
930
  "onnx2tf>=1.26.3",
931
- "onnxslim>=0.1.46",
931
+ "onnxslim>=0.1.53",
932
932
  "onnxruntime-gpu" if cuda else "onnxruntime",
933
933
  "protobuf>=5",
934
934
  ),
@@ -1,11 +1,14 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
3
  import itertools
4
+ from pathlib import Path
5
+
6
+ import torch
4
7
 
5
8
  from ultralytics.data import build_yolo_dataset
6
- from ultralytics.models import yolo
9
+ from ultralytics.models.yolo.detect import DetectionTrainer
7
10
  from ultralytics.nn.tasks import WorldModel
8
- from ultralytics.utils import DEFAULT_CFG, RANK, checks
11
+ from ultralytics.utils import DEFAULT_CFG, LOGGER, RANK
9
12
  from ultralytics.utils.torch_utils import de_parallel
10
13
 
11
14
 
@@ -15,13 +18,9 @@ def on_pretrain_routine_end(trainer):
15
18
  # Set class names for evaluation
16
19
  names = [name.split("/")[0] for name in list(trainer.test_loader.dataset.data["names"].values())]
17
20
  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
21
 
23
22
 
24
- class WorldTrainer(yolo.detect.DetectionTrainer):
23
+ class WorldTrainer(DetectionTrainer):
25
24
  """
26
25
  A class to fine-tune a world model on a close-set dataset.
27
26
 
@@ -54,14 +53,7 @@ class WorldTrainer(yolo.detect.DetectionTrainer):
54
53
  if overrides is None:
55
54
  overrides = {}
56
55
  super().__init__(cfg, overrides, _callbacks)
57
-
58
- # Import and assign clip
59
- try:
60
- import clip
61
- except ImportError:
62
- checks.check_requirements("git+https://github.com/ultralytics/CLIP.git")
63
- import clip
64
- self.clip = clip
56
+ self.text_embeddings = None
65
57
 
66
58
  def get_model(self, cfg=None, weights=None, verbose=True):
67
59
  """
@@ -102,18 +94,72 @@ class WorldTrainer(yolo.detect.DetectionTrainer):
102
94
  (Dataset): YOLO dataset configured for training or validation.
103
95
  """
104
96
  gs = max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)
105
- return build_yolo_dataset(
97
+ dataset = build_yolo_dataset(
106
98
  self.args, img_path, batch, self.data, mode=mode, rect=mode == "val", stride=gs, multi_modal=mode == "train"
107
99
  )
100
+ if mode == "train":
101
+ self.set_text_embeddings([dataset], batch) # cache text embeddings to accelerate training
102
+ return dataset
103
+
104
+ def set_text_embeddings(self, datasets, batch):
105
+ """
106
+ Set text embeddings for datasets to accelerate training by caching category names.
107
+
108
+ This method collects unique category names from all datasets, then generates and caches text embeddings
109
+ for these categories to improve training efficiency.
110
+
111
+ Args:
112
+ datasets (List[Dataset]): List of datasets from which to extract category names.
113
+ batch (int | None): Batch size used for processing.
114
+
115
+ Notes:
116
+ This method collects category names from datasets that have the 'category_names' attribute,
117
+ then uses the first dataset's image path to determine where to cache the generated text embeddings.
118
+ """
119
+ text_embeddings = {}
120
+ for dataset in datasets:
121
+ if not hasattr(dataset, "category_names"):
122
+ continue
123
+ text_embeddings.update(
124
+ self.generate_text_embeddings(
125
+ list(dataset.category_names), batch, cache_dir=Path(dataset.img_path).parent
126
+ )
127
+ )
128
+ self.text_embeddings = text_embeddings
129
+
130
+ def generate_text_embeddings(self, texts, batch, cache_dir):
131
+ """
132
+ Generate text embeddings for a list of text samples.
133
+
134
+ Args:
135
+ texts (List[str]): List of text samples to encode.
136
+ batch (int): Batch size for processing.
137
+ cache_dir (Path): Directory to save/load cached embeddings.
138
+
139
+ Returns:
140
+ (dict): Dictionary mapping text samples to their embeddings.
141
+ """
142
+ model = "clip:ViT-B/32"
143
+ cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
144
+ if cache_path.exists():
145
+ LOGGER.info(f"Reading existed cache from '{cache_path}'")
146
+ txt_map = torch.load(cache_path)
147
+ if sorted(txt_map.keys()) == sorted(texts):
148
+ return txt_map
149
+ LOGGER.info(f"Caching text embeddings to '{cache_path}'")
150
+ assert self.model is not None
151
+ txt_feats = self.model.get_text_pe(texts, batch, cache_clip_model=False)
152
+ txt_map = dict(zip(texts, txt_feats.squeeze(0)))
153
+ torch.save(txt_map, cache_path)
154
+ return txt_map
108
155
 
109
156
  def preprocess_batch(self, batch):
110
157
  """Preprocess a batch of images and text for YOLOWorld training."""
111
- batch = super().preprocess_batch(batch)
158
+ batch = DetectionTrainer.preprocess_batch(self, batch)
112
159
 
113
160
  # Add text features
114
161
  texts = list(itertools.chain(*batch["texts"]))
115
- text_token = self.clip.tokenize(texts).to(batch["img"].device)
116
- txt_feats = self.text_model.encode_text(text_token).to(dtype=batch["img"].dtype) # torch.float32
162
+ txt_feats = torch.stack([self.text_embeddings[text] for text in texts]).to(self.device)
117
163
  txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
118
164
  batch["txt_feats"] = txt_feats.reshape(len(batch["texts"]), -1, txt_feats.shape[-1])
119
165
  return batch
@@ -100,6 +100,7 @@ class WorldTrainerFromScratch(WorldTrainer):
100
100
  else build_grounding(self.args, im_path["img_path"], im_path["json_file"], batch, stride=gs)
101
101
  for im_path in img_path
102
102
  ]
103
+ self.set_text_embeddings(datasets, batch) # cache text embeddings to accelerate training
103
104
  return YOLOConcatDataset(datasets) if len(datasets) > 1 else datasets[0]
104
105
 
105
106
  def get_dataset(self):
@@ -2,7 +2,6 @@
2
2
 
3
3
  import itertools
4
4
  from copy import copy, deepcopy
5
- from pathlib import Path
6
5
 
7
6
  import torch
8
7
 
@@ -157,40 +156,7 @@ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
157
156
  Returns:
158
157
  (YOLOConcatDataset | Dataset): The constructed dataset for training or validation.
159
158
  """
160
- datasets = WorldTrainerFromScratch.build_dataset(self, img_path, mode, batch)
161
- if mode == "train":
162
- self.set_text_embeddings(
163
- datasets.datasets if hasattr(datasets, "datasets") else [datasets], batch
164
- ) # cache text embeddings to accelerate training
165
- return datasets
166
-
167
- def set_text_embeddings(self, datasets, batch):
168
- """
169
- Set text embeddings for datasets to accelerate training by caching category names.
170
-
171
- This method collects unique category names from all datasets, then generates and caches text embeddings
172
- for these categories to improve training efficiency.
173
-
174
- Args:
175
- datasets (List[Dataset]): List of datasets from which to extract category names.
176
- batch (int | None): Batch size used for processing.
177
-
178
- Notes:
179
- This method collects category names from datasets that have the 'category_names' attribute,
180
- then uses the first dataset's image path to determine where to cache the generated text embeddings.
181
- """
182
- # TODO: open up an interface to determine whether to do cache
183
- category_names = set()
184
- for dataset in datasets:
185
- if not hasattr(dataset, "category_names"):
186
- continue
187
- category_names |= dataset.category_names
188
-
189
- # TODO: enable to update the path or use a more general way to get the path
190
- img_path = datasets[0].img_path
191
- self.text_embeddings = self.generate_text_embeddings(
192
- category_names, batch, cache_path=Path(img_path).parent / "text_embeddings.pt"
193
- )
159
+ return WorldTrainerFromScratch.build_dataset(self, img_path, mode, batch)
194
160
 
195
161
  def preprocess_batch(self, batch):
196
162
  """Process batch for training, moving text features to the appropriate device."""
@@ -202,23 +168,28 @@ class YOLOETrainerFromScratch(YOLOETrainer, WorldTrainerFromScratch):
202
168
  batch["txt_feats"] = txt_feats
203
169
  return batch
204
170
 
205
- def generate_text_embeddings(self, texts, batch, cache_path="embeddings.pt"):
171
+ def generate_text_embeddings(self, texts, batch, cache_dir):
206
172
  """
207
173
  Generate text embeddings for a list of text samples.
208
174
 
209
175
  Args:
210
176
  texts (List[str]): List of text samples to encode.
211
177
  batch (int): Batch size for processing.
212
- cache_path (str | Path): Path to save/load cached embeddings.
178
+ cache_dir (Path): Directory to save/load cached embeddings.
213
179
 
214
180
  Returns:
215
181
  (dict): Dictionary mapping text samples to their embeddings.
216
182
  """
183
+ model = "mobileclip:blt"
184
+ cache_path = cache_dir / f"text_embeddings_{model.replace(':', '_').replace('/', '_')}.pt"
217
185
  if cache_path.exists():
218
186
  LOGGER.info(f"Reading existed cache from '{cache_path}'")
219
- return torch.load(cache_path)
187
+ txt_map = torch.load(cache_path)
188
+ if sorted(txt_map.keys()) == sorted(texts):
189
+ return txt_map
190
+ LOGGER.info(f"Caching text embeddings to '{cache_path}'")
220
191
  assert self.model is not None
221
- txt_feats = self.model.get_text_pe(texts, batch, without_reprta=True)
192
+ txt_feats = self.model.get_text_pe(texts, batch, without_reprta=True, cache_clip_model=False)
222
193
  txt_map = dict(zip(texts, txt_feats.squeeze(0)))
223
194
  torch.save(txt_map, cache_path)
224
195
  return txt_map
ultralytics/nn/tasks.py CHANGED
@@ -146,6 +146,8 @@ class BaseModel(torch.nn.Module):
146
146
  (torch.Tensor): The last output of the model.
147
147
  """
148
148
  y, dt, embeddings = [], [], [] # outputs
149
+ embed = frozenset(embed) if embed is not None else {-1}
150
+ max_idx = max(embed)
149
151
  for m in self.model:
150
152
  if m.f != -1: # if not from previous layer
151
153
  x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers
@@ -155,9 +157,9 @@ class BaseModel(torch.nn.Module):
155
157
  y.append(x if m.i in self.save else None) # save output
156
158
  if visualize:
157
159
  feature_visualization(x, m.type, m.i, save_dir=visualize)
158
- if embed and m.i in embed:
160
+ if m.i in embed:
159
161
  embeddings.append(torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze(-1).squeeze(-1)) # flatten
160
- if m.i == max(embed):
162
+ if m.i == max_idx:
161
163
  return torch.unbind(torch.cat(embeddings, 1), dim=0)
162
164
  return x
163
165
 
@@ -677,6 +679,8 @@ class RTDETRDetectionModel(DetectionModel):
677
679
  (torch.Tensor): Model's output tensor.
678
680
  """
679
681
  y, dt, embeddings = [], [], [] # outputs
682
+ embed = frozenset(embed) if embed is not None else {-1}
683
+ max_idx = max(embed)
680
684
  for m in self.model[:-1]: # except the head part
681
685
  if m.f != -1: # if not from previous layer
682
686
  x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers
@@ -686,9 +690,9 @@ class RTDETRDetectionModel(DetectionModel):
686
690
  y.append(x if m.i in self.save else None) # save output
687
691
  if visualize:
688
692
  feature_visualization(x, m.type, m.i, save_dir=visualize)
689
- if embed and m.i in embed:
693
+ if m.i in embed:
690
694
  embeddings.append(torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze(-1).squeeze(-1)) # flatten
691
- if m.i == max(embed):
695
+ if m.i == max_idx:
692
696
  return torch.unbind(torch.cat(embeddings, 1), dim=0)
693
697
  head = self.model[-1]
694
698
  x = head([y[j] for j in head.f], batch) # head inference
@@ -721,24 +725,33 @@ class WorldModel(DetectionModel):
721
725
  batch (int): Batch size for processing text tokens.
722
726
  cache_clip_model (bool): Whether to cache the CLIP model.
723
727
  """
724
- try:
725
- import clip
726
- except ImportError:
727
- check_requirements("git+https://github.com/ultralytics/CLIP.git")
728
- import clip
729
-
730
- if (
731
- not getattr(self, "clip_model", None) and cache_clip_model
732
- ): # for backwards compatibility of models lacking clip_model attribute
733
- self.clip_model = clip.load("ViT-B/32")[0]
734
- model = self.clip_model if cache_clip_model else clip.load("ViT-B/32")[0]
735
- device = next(model.parameters()).device
736
- text_token = clip.tokenize(text).to(device)
728
+ self.txt_feats = self.get_text_pe(text, batch=batch, cache_clip_model=cache_clip_model)
729
+ self.model[-1].nc = len(text)
730
+
731
+ @smart_inference_mode()
732
+ def get_text_pe(self, text, batch=80, cache_clip_model=True):
733
+ """
734
+ Set classes in advance so that model could do offline-inference without clip model.
735
+
736
+ Args:
737
+ text (List[str]): List of class names.
738
+ batch (int): Batch size for processing text tokens.
739
+ cache_clip_model (bool): Whether to cache the CLIP model.
740
+
741
+ Returns:
742
+ (torch.Tensor): Text positional embeddings.
743
+ """
744
+ from ultralytics.nn.text_model import build_text_model
745
+
746
+ device = next(self.model.parameters()).device
747
+ if not getattr(self, "clip_model", None) and cache_clip_model:
748
+ # For backwards compatibility of models lacking clip_model attribute
749
+ self.clip_model = build_text_model("clip:ViT-B/32", device=device)
750
+ model = self.clip_model if cache_clip_model else build_text_model("clip:ViT-B/32", device=device)
751
+ text_token = model.tokenize(text)
737
752
  txt_feats = [model.encode_text(token).detach() for token in text_token.split(batch)]
738
753
  txt_feats = txt_feats[0] if len(txt_feats) == 1 else torch.cat(txt_feats, dim=0)
739
- txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
740
- self.txt_feats = txt_feats.reshape(-1, len(text), txt_feats.shape[-1])
741
- self.model[-1].nc = len(text)
754
+ return txt_feats.reshape(-1, len(text), txt_feats.shape[-1])
742
755
 
743
756
  def predict(self, x, profile=False, visualize=False, txt_feats=None, augment=False, embed=None):
744
757
  """
@@ -760,6 +773,8 @@ class WorldModel(DetectionModel):
760
773
  txt_feats = txt_feats.expand(x.shape[0], -1, -1)
761
774
  ori_txt_feats = txt_feats.clone()
762
775
  y, dt, embeddings = [], [], [] # outputs
776
+ embed = frozenset(embed) if embed is not None else {-1}
777
+ max_idx = max(embed)
763
778
  for m in self.model: # except the head part
764
779
  if m.f != -1: # if not from previous layer
765
780
  x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers
@@ -777,9 +792,9 @@ class WorldModel(DetectionModel):
777
792
  y.append(x if m.i in self.save else None) # save output
778
793
  if visualize:
779
794
  feature_visualization(x, m.type, m.i, save_dir=visualize)
780
- if embed and m.i in embed:
795
+ if m.i in embed:
781
796
  embeddings.append(torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze(-1).squeeze(-1)) # flatten
782
- if m.i == max(embed):
797
+ if m.i == max_idx:
783
798
  return torch.unbind(torch.cat(embeddings, 1), dim=0)
784
799
  return x
785
800
 
@@ -976,6 +991,8 @@ class YOLOEModel(DetectionModel):
976
991
  """
977
992
  y, dt, embeddings = [], [], [] # outputs
978
993
  b = x.shape[0]
994
+ embed = frozenset(embed) if embed is not None else {-1}
995
+ max_idx = max(embed)
979
996
  for m in self.model: # except the head part
980
997
  if m.f != -1: # if not from previous layer
981
998
  x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers
@@ -997,9 +1014,9 @@ class YOLOEModel(DetectionModel):
997
1014
  y.append(x if m.i in self.save else None) # save output
998
1015
  if visualize:
999
1016
  feature_visualization(x, m.type, m.i, save_dir=visualize)
1000
- if embed and m.i in embed:
1017
+ if m.i in embed:
1001
1018
  embeddings.append(torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze(-1).squeeze(-1)) # flatten
1002
- if m.i == max(embed):
1019
+ if m.i == max_idx:
1003
1020
  return torch.unbind(torch.cat(embeddings, 1), dim=0)
1004
1021
  return x
1005
1022
 
@@ -324,6 +324,7 @@ class MobileCLIPTS(TextModel):
324
324
  >>> features.shape
325
325
  torch.Size([2, 512]) # Actual dimension depends on model size
326
326
  """
327
+ # NOTE: no need to do normalization here as it's embedded in the torchscript model
327
328
  return self.encoder(texts)
328
329
 
329
330
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ultralytics
3
- Version: 8.3.136
3
+ Version: 8.3.137
4
4
  Summary: Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,13 +1,13 @@
1
1
  tests/__init__.py,sha256=xnMhv3O_DF1YrW4zk__ZywQzAaoTDjPKPoiI1Ktss1w,670
2
2
  tests/conftest.py,sha256=rsIAipRKfrVNoTaJ1LdpYue8AbcJ_fr3d3WIlM_6uXY,2982
3
3
  tests/test_cli.py,sha256=vXUC_EK0fa87JRhHsCOZf7AJQ5_Jm1sL8u-yhmsaQh0,5851
4
- tests/test_cuda.py,sha256=eKwaqLxWTRRYNROnkH24Ch-HmxTRKQLSIxbMYFYq_p0,8123
4
+ tests/test_cuda.py,sha256=L_2xp2TH-pInsdI8UrbZ5onRtHQGdUVoPXnyX6Ot4_U,7950
5
5
  tests/test_engine.py,sha256=aGqZ8P7QO5C_nOa1b4FOyk92Ysdk5WiP-ST310Vyxys,4962
6
- tests/test_exports.py,sha256=UeeBloqYYGZNh520R3CR80XBxA9XFrNmbK9An6V6C4w,9838
6
+ tests/test_exports.py,sha256=dhZn86LdbapW15RthQF870LGxDjC1MUZhlGdBgPmgIQ,9716
7
7
  tests/test_integrations.py,sha256=dQteeRsRVuT_p5-T88-7jqT65Zm9iAXkyKg-KQ1_TQ8,6341
8
8
  tests/test_python.py,sha256=KWsncKpeDdRmjRftmJpsMl7bBLI3TG_I7Lb4kuemZzQ,25618
9
9
  tests/test_solutions.py,sha256=IFlqyOUCvGbLe_YZqWmNCe_afg4as0p-SfAv3j7VURI,6205
10
- ultralytics/__init__.py,sha256=eHclh3QJTVw22eqcJwLs0T_o2qu2cint1eUqK2QuSJs,730
10
+ ultralytics/__init__.py,sha256=8hzZtbr1IMQwOTdqbcNED-RHZiqww--zXivCgQOzujQ,730
11
11
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
12
12
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
13
13
  ultralytics/cfg/__init__.py,sha256=h0UVCvX6DIpoR4_pthpZD_Ihq7eCaS8HbXsPOm82G0E,39540
@@ -118,7 +118,7 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
118
118
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
119
119
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
120
120
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
121
- ultralytics/engine/exporter.py,sha256=tXqZlcOZnDqtK7A0nwago7FfDAb3ftnYui-VeOFzVs0,70823
121
+ ultralytics/engine/exporter.py,sha256=JucFVR_RAfzrRWM9kJK6MHALEbdzrf93ReTnAhiRTBo,70823
122
122
  ultralytics/engine/model.py,sha256=fWhPNWUQzjjWfTEXzTaqSSearV4THRkEa_fl4dDvzWw,52930
123
123
  ultralytics/engine/predictor.py,sha256=AwKpOGY2G-thNNiRw4Kf_MBLamq5tbRhXLNSMRArqFo,21803
124
124
  ultralytics/engine/results.py,sha256=MhbyMCwgslmtV53fqii4UJUaLQ4gKTKdkXi7vvmJDAE,79628
@@ -185,17 +185,17 @@ ultralytics/models/yolo/segment/predict.py,sha256=mIC3aHI7Jg4dU1k2UZnjVj4unE-5TW
185
185
  ultralytics/models/yolo/segment/train.py,sha256=EIyIAjYp127Mb-DomyjPORaONu57OY_gOTK9p2MwW6E,5359
186
186
  ultralytics/models/yolo/segment/val.py,sha256=cXJM1JNuzDraU0SJQRIdzNxabd0bfcxiRE8wozHZChY,18415
187
187
  ultralytics/models/yolo/world/__init__.py,sha256=nlh8I6t8hMGz_vZg8QSlsUW1R-2eKvn9CGUoPPQEGhA,131
188
- ultralytics/models/yolo/world/train.py,sha256=HUJ0XiJIGx_FA9kqNYnSFsaKWMiZUDxgkpfGoBH6UNc,4896
189
- ultralytics/models/yolo/world/train_world.py,sha256=DSa-t9jDbtwF43SJlvtESh1Ux7M77zo9f945eR2D-5w,8363
188
+ ultralytics/models/yolo/world/train.py,sha256=4e54RghcrpdtpxG3n2Nicwo-tcj-wI4nLcUo8_4cf30,6898
189
+ ultralytics/models/yolo/world/train_world.py,sha256=fFhhI-toaEy1_-XcPM1_mF395WRQ26gZ4UxqyUAZmWw,8461
190
190
  ultralytics/models/yolo/yoloe/__init__.py,sha256=6SLytdJtwu37qewf7CobG7C7Wl1m-xtNdvCXEasfPDE,760
191
191
  ultralytics/models/yolo/yoloe/predict.py,sha256=N0oYcr_mdw8wyUAWprAwJhrA0r23BaTeYXEjw2e8_mI,6993
192
- ultralytics/models/yolo/yoloe/train.py,sha256=St3zw_XWRol9pODWU4lvKlJnWYr1lmWQNuhLFwWMge4,12989
192
+ ultralytics/models/yolo/yoloe/train.py,sha256=xRPDJ3nUWxtqjESfmUtsZslVhpgzrZRw8z_QU5hV6nc,11710
193
193
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=BYFBd04k5WQaJPcFbCvVIbEf2IOQyW8_sGeoVT_74j0,4632
194
194
  ultralytics/models/yolo/yoloe/val.py,sha256=oA8cVT3pBXF6aPZy7ITq0mDcktRuIgks8tTtqMRISyY,8431
195
195
  ultralytics/nn/__init__.py,sha256=rjociYD9lo_K-d-1s6TbdWklPLjTcEHk7OIlRDJstIE,615
196
196
  ultralytics/nn/autobackend.py,sha256=X2cxCytBu9fmniy8uJ5aZb28IukQ-uxV1INXeS1lclA,39368
197
- ultralytics/nn/tasks.py,sha256=o7QZvlZyvmECxkITJjtDCPf-hAxXcZOLXP7PKtegOPQ,63594
198
- ultralytics/nn/text_model.py,sha256=8_7SRejKZA4Pi-ha0gjcWrQDDCDMBhtwlg8pPMWgjDE,13145
197
+ ultralytics/nn/tasks.py,sha256=iJWpwRr4yZg1dTT-9jXuzIqkdFmbZm1b7hejnO-CiZk,64337
198
+ ultralytics/nn/text_model.py,sha256=wr5yPRbMqtSr2N5Rzdd0vuv9PcQe8qw4uO596ZHZVGU,13236
199
199
  ultralytics/nn/modules/__init__.py,sha256=dXLtIk9rt944WfsTdpgEdWOg3HQEHdwQztuZ6WNJygs,3144
200
200
  ultralytics/nn/modules/activation.py,sha256=PvXZkA9AzEntR575JkFORdmtcRwATyy0lje-uHA5_8w,2210
201
201
  ultralytics/nn/modules/block.py,sha256=yd6Ao9T2UJNAWc8oB1-CSxyF6-exqbFcN3hTWUZNU3M,66701
@@ -264,9 +264,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=yYUgEgSv6L39sSev6vjwhAWU3DlPDsbSDV
264
264
  ultralytics/utils/callbacks/raytune.py,sha256=A8amUGpux7dYES-L1iSeMoMXBySGWCD1aUqT7vcG-pU,1284
265
265
  ultralytics/utils/callbacks/tensorboard.py,sha256=jgYnym3cUQFAgN1GzTyO7l3jINtfAh8zhrllDvnLuVQ,5339
266
266
  ultralytics/utils/callbacks/wb.py,sha256=iDRFXI4IIDm8R5OI89DMTmjs8aHLo1HRCLkOFKdaMG4,7507
267
- ultralytics-8.3.136.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
268
- ultralytics-8.3.136.dist-info/METADATA,sha256=_0wkrDo-3iree01UfTJ_ayCZ0Wsjt0JtFvNzwwn02jc,37200
269
- ultralytics-8.3.136.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
270
- ultralytics-8.3.136.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
271
- ultralytics-8.3.136.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
272
- ultralytics-8.3.136.dist-info/RECORD,,
267
+ ultralytics-8.3.137.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
268
+ ultralytics-8.3.137.dist-info/METADATA,sha256=Bz_PCfMcXAGRbHyRMyfMC7bpsCsW-jIfnWBTnymx43k,37200
269
+ ultralytics-8.3.137.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
270
+ ultralytics-8.3.137.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
271
+ ultralytics-8.3.137.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
272
+ ultralytics-8.3.137.dist-info/RECORD,,