ultralytics 8.1.29__py3-none-any.whl → 8.1.31__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.

Potentially problematic release.


This version of ultralytics might be problematic. Click here for more details.

ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics YOLO 🚀, AGPL-3.0 license
2
2
 
3
- __version__ = "8.1.29"
3
+ __version__ = "8.1.31"
4
4
 
5
5
  from ultralytics.data.explorer.explorer import Explorer
6
6
  from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
@@ -30,8 +30,8 @@ from ultralytics.utils import (
30
30
  )
31
31
 
32
32
  # Define valid tasks and modes
33
- MODES = "train", "val", "predict", "export", "track", "benchmark"
34
- TASKS = "detect", "segment", "classify", "pose", "obb"
33
+ MODES = {"train", "val", "predict", "export", "track", "benchmark"}
34
+ TASKS = {"detect", "segment", "classify", "pose", "obb"}
35
35
  TASK2DATA = {
36
36
  "detect": "coco8.yaml",
37
37
  "segment": "coco8-seg.yaml",
@@ -93,8 +93,8 @@ CLI_HELP_MSG = f"""
93
93
  """
94
94
 
95
95
  # Define keys for arg type checks
96
- CFG_FLOAT_KEYS = "warmup_epochs", "box", "cls", "dfl", "degrees", "shear", "time"
97
- CFG_FRACTION_KEYS = (
96
+ CFG_FLOAT_KEYS = {"warmup_epochs", "box", "cls", "dfl", "degrees", "shear", "time"}
97
+ CFG_FRACTION_KEYS = {
98
98
  "dropout",
99
99
  "iou",
100
100
  "lr0",
@@ -118,8 +118,8 @@ CFG_FRACTION_KEYS = (
118
118
  "conf",
119
119
  "iou",
120
120
  "fraction",
121
- ) # fraction floats 0.0 - 1.0
122
- CFG_INT_KEYS = (
121
+ } # fraction floats 0.0 - 1.0
122
+ CFG_INT_KEYS = {
123
123
  "epochs",
124
124
  "patience",
125
125
  "batch",
@@ -133,8 +133,8 @@ CFG_INT_KEYS = (
133
133
  "workspace",
134
134
  "nbs",
135
135
  "save_period",
136
- )
137
- CFG_BOOL_KEYS = (
136
+ }
137
+ CFG_BOOL_KEYS = {
138
138
  "save",
139
139
  "exist_ok",
140
140
  "verbose",
@@ -169,7 +169,7 @@ CFG_BOOL_KEYS = (
169
169
  "nms",
170
170
  "profile",
171
171
  "multi_scale",
172
- )
172
+ }
173
173
 
174
174
 
175
175
  def cfg2dict(cfg):
@@ -219,33 +219,46 @@ def get_cfg(cfg: Union[str, Path, Dict, SimpleNamespace] = DEFAULT_CFG_DICT, ove
219
219
  LOGGER.warning(f"WARNING ⚠️ 'name=model' automatically updated to 'name={cfg['name']}'.")
220
220
 
221
221
  # Type and Value checks
222
+ check_cfg(cfg)
223
+
224
+ # Return instance
225
+ return IterableSimpleNamespace(**cfg)
226
+
227
+
228
+ def check_cfg(cfg, hard=True):
229
+ """Check Ultralytics configuration argument types and values."""
222
230
  for k, v in cfg.items():
223
231
  if v is not None: # None values may be from optional args
224
232
  if k in CFG_FLOAT_KEYS and not isinstance(v, (int, float)):
225
- raise TypeError(
226
- f"'{k}={v}' is of invalid type {type(v).__name__}. "
227
- f"Valid '{k}' types are int (i.e. '{k}=0') or float (i.e. '{k}=0.5')"
228
- )
229
- elif k in CFG_FRACTION_KEYS:
230
- if not isinstance(v, (int, float)):
233
+ if hard:
231
234
  raise TypeError(
232
235
  f"'{k}={v}' is of invalid type {type(v).__name__}. "
233
236
  f"Valid '{k}' types are int (i.e. '{k}=0') or float (i.e. '{k}=0.5')"
234
237
  )
238
+ cfg[k] = float(v)
239
+ elif k in CFG_FRACTION_KEYS:
240
+ if not isinstance(v, (int, float)):
241
+ if hard:
242
+ raise TypeError(
243
+ f"'{k}={v}' is of invalid type {type(v).__name__}. "
244
+ f"Valid '{k}' types are int (i.e. '{k}=0') or float (i.e. '{k}=0.5')"
245
+ )
246
+ cfg[k] = float(v)
235
247
  if not (0.0 <= v <= 1.0):
236
248
  raise ValueError(f"'{k}={v}' is an invalid value. " f"Valid '{k}' values are between 0.0 and 1.0.")
237
249
  elif k in CFG_INT_KEYS and not isinstance(v, int):
238
- raise TypeError(
239
- f"'{k}={v}' is of invalid type {type(v).__name__}. " f"'{k}' must be an int (i.e. '{k}=8')"
240
- )
250
+ if hard:
251
+ raise TypeError(
252
+ f"'{k}={v}' is of invalid type {type(v).__name__}. " f"'{k}' must be an int (i.e. '{k}=8')"
253
+ )
254
+ cfg[k] = int(v)
241
255
  elif k in CFG_BOOL_KEYS and not isinstance(v, bool):
242
- raise TypeError(
243
- f"'{k}={v}' is of invalid type {type(v).__name__}. "
244
- f"'{k}' must be a bool (i.e. '{k}=True' or '{k}=False')"
245
- )
246
-
247
- # Return instance
248
- return IterableSimpleNamespace(**cfg)
256
+ if hard:
257
+ raise TypeError(
258
+ f"'{k}={v}' is of invalid type {type(v).__name__}. "
259
+ f"'{k}' must be a bool (i.e. '{k}=True' or '{k}=False')"
260
+ )
261
+ cfg[k] = bool(v)
249
262
 
250
263
 
251
264
  def get_save_dir(args, name=None):
@@ -464,10 +477,10 @@ def entrypoint(debug=""):
464
477
  overrides = {} # basic overrides, i.e. imgsz=320
465
478
  for a in merge_equals_args(args): # merge spaces around '=' sign
466
479
  if a.startswith("--"):
467
- LOGGER.warning(f"WARNING ⚠️ '{a}' does not require leading dashes '--', updating to '{a[2:]}'.")
480
+ LOGGER.warning(f"WARNING ⚠️ argument '{a}' does not require leading dashes '--', updating to '{a[2:]}'.")
468
481
  a = a[2:]
469
482
  if a.endswith(","):
470
- LOGGER.warning(f"WARNING ⚠️ '{a}' does not require trailing comma ',', updating to '{a[:-1]}'.")
483
+ LOGGER.warning(f"WARNING ⚠️ argument '{a}' does not require trailing comma ',', updating to '{a[:-1]}'.")
471
484
  a = a[:-1]
472
485
  if "=" in a:
473
486
  try:
@@ -504,7 +517,7 @@ def entrypoint(debug=""):
504
517
  mode = overrides.get("mode")
505
518
  if mode is None:
506
519
  mode = DEFAULT_CFG.mode or "predict"
507
- LOGGER.warning(f"WARNING ⚠️ 'mode' is missing. Valid modes are {MODES}. Using default 'mode={mode}'.")
520
+ LOGGER.warning(f"WARNING ⚠️ 'mode' argument is missing. Valid modes are {MODES}. Using default 'mode={mode}'.")
508
521
  elif mode not in MODES:
509
522
  raise ValueError(f"Invalid 'mode={mode}'. Valid modes are {MODES}.\n{CLI_HELP_MSG}")
510
523
 
@@ -520,7 +533,7 @@ def entrypoint(debug=""):
520
533
  model = overrides.pop("model", DEFAULT_CFG.model)
521
534
  if model is None:
522
535
  model = "yolov8n.pt"
523
- LOGGER.warning(f"WARNING ⚠️ 'model' is missing. Using default 'model={model}'.")
536
+ LOGGER.warning(f"WARNING ⚠️ 'model' argument is missing. Using default 'model={model}'.")
524
537
  overrides["model"] = model
525
538
  stem = Path(model).stem.lower()
526
539
  if "rtdetr" in stem: # guess architecture
@@ -554,15 +567,15 @@ def entrypoint(debug=""):
554
567
  # Mode
555
568
  if mode in ("predict", "track") and "source" not in overrides:
556
569
  overrides["source"] = DEFAULT_CFG.source or ASSETS
557
- LOGGER.warning(f"WARNING ⚠️ 'source' is missing. Using default 'source={overrides['source']}'.")
570
+ LOGGER.warning(f"WARNING ⚠️ 'source' argument is missing. Using default 'source={overrides['source']}'.")
558
571
  elif mode in ("train", "val"):
559
572
  if "data" not in overrides and "resume" not in overrides:
560
573
  overrides["data"] = DEFAULT_CFG.data or TASK2DATA.get(task or DEFAULT_CFG.task, DEFAULT_CFG.data)
561
- LOGGER.warning(f"WARNING ⚠️ 'data' is missing. Using default 'data={overrides['data']}'.")
574
+ LOGGER.warning(f"WARNING ⚠️ 'data' argument is missing. Using default 'data={overrides['data']}'.")
562
575
  elif mode == "export":
563
576
  if "format" not in overrides:
564
577
  overrides["format"] = DEFAULT_CFG.format or "torchscript"
565
- LOGGER.warning(f"WARNING ⚠️ 'format' is missing. Using default 'format={overrides['format']}'.")
578
+ LOGGER.warning(f"WARNING ⚠️ 'format' argument is missing. Using default 'format={overrides['format']}'.")
566
579
 
567
580
  # Run command in python
568
581
  getattr(model, mode)(**overrides) # default args from model
@@ -0,0 +1,22 @@
1
+ # Ultralytics YOLO 🚀, AGPL-3.0 license
2
+ # Brain-tumor dataset by Ultralytics
3
+ # Documentation: https://docs.ultralytics.com/datasets/detect/brain-tumor/
4
+ # Example usage: yolo train data=brain-tumor.yaml
5
+ # parent
6
+ # ├── ultralytics
7
+ # └── datasets
8
+ # └── brain-tumor ← downloads here (4.05 MB)
9
+
10
+ # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
11
+ path: ../datasets/brain-tumor # dataset root dir
12
+ train: train/images # train images (relative to 'path') 893 images
13
+ val: valid/images # val images (relative to 'path') 223 images
14
+ test: # test images (relative to 'path')
15
+
16
+ # Classes
17
+ names:
18
+ 0: negative
19
+ 1: positive
20
+
21
+ # Download script/URL (optional)
22
+ download: https://ultralytics.com/assets/brain-tumor.zip
ultralytics/data/build.py CHANGED
@@ -129,7 +129,7 @@ def check_source(source):
129
129
  webcam, screenshot, from_img, in_memory, tensor = False, False, False, False, False
130
130
  if isinstance(source, (str, int, Path)): # int for local usb camera
131
131
  source = str(source)
132
- is_file = Path(source).suffix[1:] in (IMG_FORMATS + VID_FORMATS)
132
+ is_file = Path(source).suffix[1:] in (IMG_FORMATS | VID_FORMATS)
133
133
  is_url = source.lower().startswith(("https://", "http://", "rtsp://", "rtmp://", "tcp://"))
134
134
  webcam = source.isnumeric() or source.endswith(".streams") or (is_url and not is_file)
135
135
  screenshot = source.lower() == "screen"
ultralytics/data/utils.py CHANGED
@@ -35,8 +35,8 @@ from ultralytics.utils.downloads import download, safe_download, unzip_file
35
35
  from ultralytics.utils.ops import segments2boxes
36
36
 
37
37
  HELP_URL = "See https://docs.ultralytics.com/datasets/detect for dataset formatting guidance."
38
- IMG_FORMATS = "bmp", "dng", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp", "pfm" # image suffixes
39
- VID_FORMATS = "asf", "avi", "gif", "m4v", "mkv", "mov", "mp4", "mpeg", "mpg", "ts", "wmv", "webm" # video suffixes
38
+ IMG_FORMATS = {"bmp", "dng", "jpeg", "jpg", "mpo", "png", "tif", "tiff", "webp", "pfm"} # image suffixes
39
+ VID_FORMATS = {"asf", "avi", "gif", "m4v", "mkv", "mov", "mp4", "mpeg", "mpg", "ts", "wmv", "webm"} # video suffixes
40
40
  PIN_MEMORY = str(os.getenv("PIN_MEMORY", True)).lower() == "true" # global pin_memory for dataloaders
41
41
 
42
42
 
@@ -124,7 +124,7 @@ class Model(nn.Module):
124
124
  # Check if Ultralytics HUB model from https://hub.ultralytics.com
125
125
  if self.is_hub_model(model):
126
126
  # Fetch model from HUB
127
- checks.check_requirements("hub-sdk>0.0.2")
127
+ checks.check_requirements("hub-sdk>=0.0.5")
128
128
  self.session = self._get_hub_session(model)
129
129
  model = self.session.model_file
130
130
 
@@ -385,14 +385,12 @@ class Results(SimpleClass):
385
385
  BGR=True,
386
386
  )
387
387
 
388
- def tojson(self, normalize=False):
389
- """Convert the object to JSON format."""
388
+ def summary(self, normalize=False):
389
+ """Convert the results to a summarized format."""
390
390
  if self.probs is not None:
391
- LOGGER.warning("Warning: Classify task do not support `tojson` yet.")
391
+ LOGGER.warning("Warning: Classify task do not support `summary` and `tojson` yet.")
392
392
  return
393
393
 
394
- import json
395
-
396
394
  # Create list of detection dictionaries
397
395
  results = []
398
396
  data = self.boxes.data.cpu().tolist()
@@ -413,8 +411,13 @@ class Results(SimpleClass):
413
411
  result["keypoints"] = {"x": (x / w).tolist(), "y": (y / h).tolist(), "visible": visible.tolist()}
414
412
  results.append(result)
415
413
 
416
- # Convert detections to JSON
417
- return json.dumps(results, indent=2)
414
+ return results
415
+
416
+ def tojson(self, normalize=False):
417
+ """Convert the results to JSON format."""
418
+ import json
419
+
420
+ return json.dumps(self.summary(normalize=normalize), indent=2)
418
421
 
419
422
 
420
423
  class Boxes(BaseTensor):
@@ -170,10 +170,19 @@ class HUBTrainingSession:
170
170
 
171
171
  return api_key, model_id, filename
172
172
 
173
- def _set_train_args(self, **kwargs):
174
- """Initializes training arguments and creates a model entry on the Ultralytics HUB."""
173
+ def _set_train_args(self):
174
+ """
175
+ Initializes training arguments and creates a model entry on the Ultralytics HUB.
176
+
177
+ This method sets up training arguments based on the model's state and updates them with any additional
178
+ arguments provided. It handles different states of the model, such as whether it's resumable, pretrained,
179
+ or requires specific file setup.
180
+
181
+ Raises:
182
+ ValueError: If the model is already trained, if required dataset information is missing, or if there are
183
+ issues with the provided training arguments.
184
+ """
175
185
  if self.model.is_trained():
176
- # Model is already trained
177
186
  raise ValueError(emojis(f"Model is already trained and uploaded to {self.model_url} 🚀"))
178
187
 
179
188
  if self.model.is_resumable():
@@ -182,26 +191,16 @@ class HUBTrainingSession:
182
191
  self.model_file = self.model.get_weights_url("last")
183
192
  else:
184
193
  # Model has no saved weights
185
- def get_train_args(config):
186
- """Parses an identifier to extract API key, model ID, and filename if applicable."""
187
- return {
188
- "batch": config["batchSize"],
189
- "epochs": config["epochs"],
190
- "imgsz": config["imageSize"],
191
- "patience": config["patience"],
192
- "device": config["device"],
193
- "cache": config["cache"],
194
- "data": self.model.get_dataset_url(),
195
- }
196
-
197
- self.train_args = get_train_args(self.model.data.get("config"))
194
+ self.train_args = self.model.data.get("train_args") # new response
195
+
198
196
  # Set the model file as either a *.pt or *.yaml file
199
197
  self.model_file = (
200
198
  self.model.get_weights_url("parent") if self.model.is_pretrained() else self.model.get_architecture()
201
199
  )
202
200
 
203
- if not self.train_args.get("data"):
204
- raise ValueError("Dataset may still be processing. Please wait a minute and try again.") # RF fix
201
+ if "data" not in self.train_args:
202
+ # RF bug - datasets are sometimes not exported
203
+ raise ValueError("Dataset may still be processing. Please wait a minute and try again.")
205
204
 
206
205
  self.model_file = checks.check_yolov5u_filename(self.model_file, verbose=False) # YOLOv5->YOLOv5u
207
206
  self.model_id = self.model.id
@@ -73,7 +73,7 @@ class ClassificationTrainer(BaseTrainer):
73
73
  elif model in torchvision.models.__dict__:
74
74
  self.model = torchvision.models.__dict__[model](weights="IMAGENET1K_V1" if self.args.pretrained else None)
75
75
  else:
76
- FileNotFoundError(f"ERROR: model={model} not found locally or online. Please check model name.")
76
+ raise FileNotFoundError(f"ERROR: model={model} not found locally or online. Please check model name.")
77
77
  ClassificationModel.reshape_outputs(self.model, self.data["nc"])
78
78
 
79
79
  return ckpt
@@ -509,14 +509,9 @@ class AutoBackend(nn.Module):
509
509
  # NCNN
510
510
  elif self.ncnn:
511
511
  mat_in = self.pyncnn.Mat(im[0].cpu().numpy())
512
- ex = self.net.create_extractor()
513
- input_names, output_names = self.net.input_names(), self.net.output_names()
514
- ex.input(input_names[0], mat_in)
515
- y = []
516
- for output_name in output_names:
517
- mat_out = self.pyncnn.Mat()
518
- ex.extract(output_name, mat_out)
519
- y.append(np.array(mat_out)[None])
512
+ with self.net.create_extractor() as ex:
513
+ ex.input(self.net.input_names()[0], mat_in)
514
+ y = [np.array(ex.extract(x)[1])[None] for x in self.net.output_names()]
520
515
 
521
516
  # NVIDIA Triton Inference Server
522
517
  elif self.triton:
ultralytics/nn/tasks.py CHANGED
@@ -560,7 +560,8 @@ class WorldModel(DetectionModel):
560
560
 
561
561
  def __init__(self, cfg="yolov8s-world.yaml", ch=3, nc=None, verbose=True):
562
562
  """Initialize YOLOv8 world model with given config and parameters."""
563
- self.txt_feats = torch.randn(1, nc or 80, 512) # placeholder
563
+ self.txt_feats = torch.randn(1, nc or 80, 512) # features placeholder
564
+ self.clip_model = None # CLIP model placeholder
564
565
  super().__init__(cfg=cfg, ch=ch, nc=nc, verbose=verbose)
565
566
 
566
567
  def set_classes(self, text):
@@ -571,10 +572,11 @@ class WorldModel(DetectionModel):
571
572
  check_requirements("git+https://github.com/openai/CLIP.git")
572
573
  import clip
573
574
 
574
- model, _ = clip.load("ViT-B/32")
575
- device = next(model.parameters()).device
575
+ if not self.clip_model:
576
+ self.clip_model = clip.load("ViT-B/32")[0]
577
+ device = next(self.clip_model.parameters()).device
576
578
  text_token = clip.tokenize(text).to(device)
577
- txt_feats = model.encode_text(text_token).to(dtype=torch.float32)
579
+ txt_feats = self.clip_model.encode_text(text_token).to(dtype=torch.float32)
578
580
  txt_feats = txt_feats / txt_feats.norm(p=2, dim=-1, keepdim=True)
579
581
  self.txt_feats = txt_feats.reshape(-1, len(text), txt_feats.shape[-1]).detach()
580
582
  self.model[-1].nc = len(text)
@@ -841,7 +843,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
841
843
  args[j] = locals()[a] if a in locals() else ast.literal_eval(a)
842
844
 
843
845
  n = n_ = max(round(n * depth), 1) if n > 1 else n # depth gain
844
- if m in (
846
+ if m in {
845
847
  Classify,
846
848
  Conv,
847
849
  ConvTranspose,
@@ -867,7 +869,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
867
869
  DWConvTranspose2d,
868
870
  C3x,
869
871
  RepC3,
870
- ):
872
+ }:
871
873
  c1, c2 = ch[f], args[0]
872
874
  if c2 != nc: # if c2 not equal to number of classes (i.e. for Classify() output)
873
875
  c2 = make_divisible(min(c2, max_channels) * width, 8)
@@ -883,7 +885,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
883
885
  n = 1
884
886
  elif m is AIFI:
885
887
  args = [ch[f], *args]
886
- elif m in (HGStem, HGBlock):
888
+ elif m in {HGStem, HGBlock}:
887
889
  c1, cm, c2 = ch[f], args[0], args[1]
888
890
  args = [c1, cm, c2, *args[2:]]
889
891
  if m is HGBlock:
@@ -895,7 +897,7 @@ def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)
895
897
  args = [ch[f]]
896
898
  elif m is Concat:
897
899
  c2 = sum(ch[x] for x in f)
898
- elif m in (Detect, WorldDetect, Segment, Pose, OBB, ImagePoolingAttn):
900
+ elif m in {Detect, WorldDetect, Segment, Pose, OBB, ImagePoolingAttn}:
899
901
  args.append([ch[x] for x in f])
900
902
  if m is Segment:
901
903
  args[2] = make_divisible(min(args[2], max_channels) * width, 8)
@@ -978,7 +980,7 @@ def guess_model_task(model):
978
980
  def cfg2task(cfg):
979
981
  """Guess from YAML dictionary."""
980
982
  m = cfg["head"][-1][-2].lower() # output module name
981
- if m in ("classify", "classifier", "cls", "fc"):
983
+ if m in {"classify", "classifier", "cls", "fc"}:
982
984
  return "classify"
983
985
  if m == "detect":
984
986
  return "detect"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ultralytics
3
- Version: 8.1.29
3
+ Version: 8.1.31
4
4
  Summary: Ultralytics YOLOv8 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification.
5
5
  Author: Glenn Jocher, Ayush Chaurasia, Jing Qiu
6
6
  Maintainer: Glenn Jocher, Ayush Chaurasia, Jing Qiu
@@ -1,7 +1,7 @@
1
- ultralytics/__init__.py,sha256=7UA9LH2W9UWNw5SAvHbloCjYzJAGxqcg52Yz3eQ9wjc,625
1
+ ultralytics/__init__.py,sha256=rDgevqxLqhO8NJR6otxXOqpbVQbtuhyXvkKoXK1rhL8,625
2
2
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
3
3
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
4
- ultralytics/cfg/__init__.py,sha256=Dk0UPabXlPX5iCDzqf8MIxCNtY7HMhVRcd_B2tZw9_w,20767
4
+ ultralytics/cfg/__init__.py,sha256=rNlOdOpORYyqCj97ePycRxGr-gVvmmr2KOVFdXE262Y,21258
5
5
  ultralytics/cfg/default.yaml,sha256=jc6iBzaQIg_uohd5hHPBtYp6gJIRtYqsChwYVTRjIkI,8091
6
6
  ultralytics/cfg/datasets/Argoverse.yaml,sha256=FyeuJT5CHq_9d4hlfAf0kpZlnbUMO0S--UJ1yIqcdKk,3134
7
7
  ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=YDsyFPI6F6-OQXLBM3hOXo3vADYREwZzmMQfJNdpWyM,1193
@@ -12,6 +12,7 @@ ultralytics/cfg/datasets/Objects365.yaml,sha256=kiiV4KLMH2mcPPRrg6cQGygnbiTrHxwt
12
12
  ultralytics/cfg/datasets/SKU-110K.yaml,sha256=geRkccBRl2eKgfNYTOPYwD9mTfqktTBGiMJoE3PZEnA,2493
13
13
  ultralytics/cfg/datasets/VOC.yaml,sha256=3-CDpjIq_s5pkbsJ9TjrYIeV24rYGuJGu4Qg6uktEZE,3655
14
14
  ultralytics/cfg/datasets/VisDrone.yaml,sha256=NfrbjVnE48E7TPbxtF7rtQHvVBO0DchFJFEuGrG1VRU,3073
15
+ ultralytics/cfg/datasets/brain-tumor.yaml,sha256=o1rX1_iw97HjiG904l4u42x13jyHOGvfmWEzz0BpOZg,795
15
16
  ultralytics/cfg/datasets/carparts-seg.yaml,sha256=pvTi3EH2j6UuG0LHoQJ7JjQv_cJoO8UKSXPptUTnl8U,1207
16
17
  ultralytics/cfg/datasets/coco-pose.yaml,sha256=w7H-J2e87GIV_PZdRDgqEFa75ObScpBK_l85U4ZMsMo,1603
17
18
  ultralytics/cfg/datasets/coco.yaml,sha256=xbim-GcWpvF_uwlStjbPjxXFhVfL0U_WNQI99b5gjdY,2584
@@ -61,12 +62,12 @@ ultralytics/data/__init__.py,sha256=A3i0n-2MnNzSdYqhM8xynBO2HJNKGSXWhPvRyO0_u1I,
61
62
  ultralytics/data/annotator.py,sha256=evXQzARVerc0hb9ol-n_GrrHf-dlXO4lCMMWEZoJ2UM,2117
62
63
  ultralytics/data/augment.py,sha256=ORotqUN-qulkHxzoW5hFF_CZDlBhuaqGgAsiPUVIf4I,52000
63
64
  ultralytics/data/base.py,sha256=_rbKt666SKVUqQtoMyzmYMCEE4rDNryPM_uweRqE4hA,13363
64
- ultralytics/data/build.py,sha256=z3hirjrw5BeLhqz3fRWQvPAS-alaJKY5KdfVnmTuiug,6406
65
+ ultralytics/data/build.py,sha256=ktZEi8RJ93kYdLWBlX7R4Hx1M2XrpHl833CdC6Hav9I,6406
65
66
  ultralytics/data/converter.py,sha256=DJ5aSk7w-RBKqrrABUoOahP_Lgccn7ujJSmVufOkBps,16503
66
67
  ultralytics/data/dataset.py,sha256=aBia_ZUUqynstW2BRS1sGp2ggnhUkeUSZ_QC2nyJmvo,17616
67
68
  ultralytics/data/loaders.py,sha256=zrfxXQ5CMFXKTR_FUPk3oKHwXruKmoXfuJq4B0vcSyA,23045
68
69
  ultralytics/data/split_dota.py,sha256=1q2FZC0SE4deRpXUSbKTbUAjX9VeejUIFM2DBLF8Cco,9961
69
- ultralytics/data/utils.py,sha256=VBmVJFUyR9M8Wu7FQ0QCLS8bIFk0KHT2IH8oqePZOhs,29778
70
+ ultralytics/data/utils.py,sha256=5R-GRSvyyrZ2yOnTZ4utuek3NSHYAsjW_4aURgMkeG8,29782
70
71
  ultralytics/data/explorer/__init__.py,sha256=-Y3m1ZedepOQUv_KW82zaGxvU_PSHcuwUTFqG9BhAr4,113
71
72
  ultralytics/data/explorer/explorer.py,sha256=9i_TlOfC87m2_tL4UR6ZjRb_T_mZNCMLIYMVWtD4pkY,18782
72
73
  ultralytics/data/explorer/utils.py,sha256=a6ugY8rKpFM8dIRcUwRyjRkRJ-zXEwe-NiJr6CLVlus,7041
@@ -74,15 +75,15 @@ ultralytics/data/explorer/gui/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2
74
75
  ultralytics/data/explorer/gui/dash.py,sha256=a2s8oJKI8kqnWEcIyqCCzvIyvM_uZmfMaxrOdwmiq7k,10044
75
76
  ultralytics/engine/__init__.py,sha256=mHtJuK4hwF8cuV-VHDc7tp6u6D1gHz2Z7JI8grmQDTs,42
76
77
  ultralytics/engine/exporter.py,sha256=pwTQCo88Sd41NqYKx5Jp15fSqhFgaY3Z5gfLm8uzLR0,53882
77
- ultralytics/engine/model.py,sha256=Kh5Bs3Rq6xJnpwCBtKFonNBLXYScg81uhj6zXx16bBw,39193
78
+ ultralytics/engine/model.py,sha256=SD9bLH30PGqnIxXT1uxgHu5xlrgca8jV2luErK9Fh8w,39194
78
79
  ultralytics/engine/predictor.py,sha256=wQRKdWGDTP5A6CS0gTC6U3RPDMhP3QkEzWSPm6eqCkU,17022
79
- ultralytics/engine/results.py,sha256=SY3sn2OBMfAFaPoaDKo0Wu-jSi7avISYohjtR_bur9M,30120
80
+ ultralytics/engine/results.py,sha256=njylLUuhZQE0ry9IPH0uN8zXV_q89ZfRqghNEF5PQw0,30246
80
81
  ultralytics/engine/trainer.py,sha256=C04cEN9v-kvR2dIIjgAN8dBAx8XSTChlQkDxAxfwTlU,34527
81
82
  ultralytics/engine/tuner.py,sha256=DzgTH3uk-VUUVoJ0K3tM4N5TJ6A3fMNlcDYr5g2I9lA,11763
82
83
  ultralytics/engine/validator.py,sha256=rcmJSGrsAfj-ryQktv6-fe0hAT7Z8CLNhUUUf0VsPYI,14645
83
84
  ultralytics/hub/__init__.py,sha256=hNKAjBFZAi8_ZYasurDpDMlEOmFw0GrXCV7kLb2A-zE,5068
84
85
  ultralytics/hub/auth.py,sha256=hc97pJ01OfI8oQ7uw3ubKbiVCDSGxSGJHoo9W6hrrNw,5403
85
- ultralytics/hub/session.py,sha256=DXPQcPHFS84DlSbXnsfwUfCgjv5W4F3ioA7ADMWzm7w,14703
86
+ ultralytics/hub/session.py,sha256=kFwufDIY7TeV79DdEQBKYrU5883WxgCrpJoTr1S5QuE,14649
86
87
  ultralytics/hub/utils.py,sha256=BoqNvi7yLUGrTNVEugFALhJkmpobW87gMVZ2dzDckRk,9734
87
88
  ultralytics/models/__init__.py,sha256=xrzn2dcLBG6Ujxll8LtlTIblPar2gjNhAwjAQg7u8sk,197
88
89
  ultralytics/models/fastsam/__init__.py,sha256=0dt65jZ_5b7Q-mdXN8MSEkgnFRA0FIwlel_LS2RaOlU,254
@@ -118,7 +119,7 @@ ultralytics/models/yolo/__init__.py,sha256=2mwHIBLgpsrrVgXPJiAWGQ1vIUIEdUT_fygac
118
119
  ultralytics/models/yolo/model.py,sha256=88d-Jf2MBb8daLawuMtViegljifIwb4C0z20dFvbUVQ,3939
119
120
  ultralytics/models/yolo/classify/__init__.py,sha256=t-4pUHmgI2gjhc-l3bqNEcEtKD1dO40nD4Vc6Y2xD6o,355
120
121
  ultralytics/models/yolo/classify/predict.py,sha256=wFY4GIlWxe7idMndEw1RnDI63o53MTfiHKz0s2fOjAY,2513
121
- ultralytics/models/yolo/classify/train.py,sha256=-DOLOM7OCN3RvH6iv8k7mMh7BDehsfJCO2LiwXMM0vU,6832
122
+ ultralytics/models/yolo/classify/train.py,sha256=BY_tGilj0w0OEgdvA9FTa-_lIcdt1w9lOGVFEai9yzg,6838
122
123
  ultralytics/models/yolo/classify/val.py,sha256=EP_hjRExXgdI4xojTKvj_YeNdaz_i2CoUzorl55r0OA,4861
123
124
  ultralytics/models/yolo/detect/__init__.py,sha256=JR8gZJWn7wMBbh-0j_073nxJVZTMFZVWTOG5Wnvk6w0,229
124
125
  ultralytics/models/yolo/detect/predict.py,sha256=_a9vH3DmKFY6eeztFTdj3nkfu_MKG6n7zb5rRKGjs9I,1510
@@ -137,8 +138,8 @@ ultralytics/models/yolo/segment/predict.py,sha256=xtA0ZZyuh9WVpX7zZFdAeCkWnxhQ30
137
138
  ultralytics/models/yolo/segment/train.py,sha256=aOQpDIptZfKSl9mFa6B-3W3QccMRlmBINBkI9K8-3sQ,2298
138
139
  ultralytics/models/yolo/segment/val.py,sha256=njiF6RWddS-HOWxVvlk5PXRw6UOgEt_HEOZVPF7rruQ,11745
139
140
  ultralytics/nn/__init__.py,sha256=4BPLHY89xEM_al5uK0aOmFgiML6CMGEZbezxOvTjOEs,587
140
- ultralytics/nn/autobackend.py,sha256=guDUpClKObK2Bwl4NH0C3EDVl3UEOvqRn1mr3c3j9Gs,29021
141
- ultralytics/nn/tasks.py,sha256=JuXiYgnZBDC51MNTsaeSjz8H1ohio1Mx58l0EjdTm8c,42674
141
+ ultralytics/nn/autobackend.py,sha256=ldDepfx4mfQVgk4w6lAqhLtxng3kchJRNSb35qMrpUg,28836
142
+ ultralytics/nn/tasks.py,sha256=G0OrHmSN4QW2SlkmGSfjXzXmOWZUiCQ4QKPHb0_9SwM,42806
142
143
  ultralytics/nn/modules/__init__.py,sha256=Ga3MDpwX6DeI7VSH8joti5uleP4mgkQGolbe8RLZ2T8,2326
143
144
  ultralytics/nn/modules/block.py,sha256=n0ilrK3Vjdoc9-OwvY_Bp8Hw5N2BMHwgt-jfH4CzxFQ,25589
144
145
  ultralytics/nn/modules/conv.py,sha256=ndUYNL2f9DK41y1vVbtEusMByXy-LMMsBKlcWjRQ9Z8,12722
@@ -189,9 +190,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=5Z3ua5YBTUS56FH8VQKQG1aaIo9fH8GEyz
189
190
  ultralytics/utils/callbacks/raytune.py,sha256=6OgGNuC35F29lw8Dl_d0lue4-iBR6dqrBVQnIRQDx4E,632
190
191
  ultralytics/utils/callbacks/tensorboard.py,sha256=hRmWjbqdA4RNaLuSZznuDcpOBW-_-_Ga0u-B8UU-7ZI,4134
191
192
  ultralytics/utils/callbacks/wb.py,sha256=4QI81nHdzgwhXHlmTiRxLqunvkKakLXYUhHTUY1ZeHA,6635
192
- ultralytics-8.1.29.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
193
- ultralytics-8.1.29.dist-info/METADATA,sha256=1OiGudI0YbTVUtgIC8sG-0FyPFhnx5e20ZDamo8wGyo,40330
194
- ultralytics-8.1.29.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
195
- ultralytics-8.1.29.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
196
- ultralytics-8.1.29.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
197
- ultralytics-8.1.29.dist-info/RECORD,,
193
+ ultralytics-8.1.31.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
194
+ ultralytics-8.1.31.dist-info/METADATA,sha256=e4f4Z8r6jRG5M_RoEfX0BDtwKwAx5S0HJEOLZDgZDZM,40330
195
+ ultralytics-8.1.31.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
196
+ ultralytics-8.1.31.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
197
+ ultralytics-8.1.31.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
198
+ ultralytics-8.1.31.dist-info/RECORD,,