ultralytics 8.3.102__py3-none-any.whl → 8.3.103__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_exports.py +14 -5
 - ultralytics/__init__.py +1 -1
 - ultralytics/cfg/__init__.py +1 -1
 - ultralytics/engine/exporter.py +3 -3
 - ultralytics/engine/tuner.py +8 -2
 - ultralytics/nn/autobackend.py +9 -8
 - ultralytics/nn/tasks.py +3 -0
 - ultralytics/solutions/instance_segmentation.py +15 -7
 - ultralytics/solutions/solutions.py +2 -47
 - ultralytics/utils/metrics.py +1 -1
 - ultralytics/utils/torch_utils.py +14 -6
 - ultralytics/utils/tuner.py +17 -9
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/METADATA +3 -3
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/RECORD +18 -18
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/WHEEL +0 -0
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/entry_points.txt +0 -0
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/licenses/LICENSE +0 -0
 - {ultralytics-8.3.102.dist-info → ultralytics-8.3.103.dist-info}/top_level.txt +0 -0
 
    
        tests/test_exports.py
    CHANGED
    
    | 
         @@ -1,7 +1,9 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            import io
         
     | 
| 
       3 
4 
     | 
    
         
             
            import shutil
         
     | 
| 
       4 
5 
     | 
    
         
             
            import uuid
         
     | 
| 
      
 6 
     | 
    
         
            +
            from contextlib import redirect_stderr, redirect_stdout
         
     | 
| 
       5 
7 
     | 
    
         
             
            from itertools import product
         
     | 
| 
       6 
8 
     | 
    
         
             
            from pathlib import Path
         
     | 
| 
       7 
9 
     | 
    
         | 
| 
         @@ -167,12 +169,19 @@ def test_export_tflite_matrix(task, dynamic, int8, half, batch, nms): 
     | 
|
| 
       167 
169 
     | 
    
         
             
            @pytest.mark.skipif(LINUX and ARM64, reason="CoreML not supported on aarch64 Linux")
         
     | 
| 
       168 
170 
     | 
    
         
             
            @pytest.mark.skipif(checks.IS_PYTHON_3_13, reason="CoreML not supported in Python 3.13")
         
     | 
| 
       169 
171 
     | 
    
         
             
            def test_export_coreml():
         
     | 
| 
       170 
     | 
    
         
            -
                """Test YOLO exports to CoreML format 
     | 
| 
       171 
     | 
    
         
            -
                 
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
       173 
     | 
    
         
            -
             
     | 
| 
       174 
     | 
    
         
            -
                else:
         
     | 
| 
      
 172 
     | 
    
         
            +
                """Test YOLO exports to CoreML format and check for errors."""
         
     | 
| 
      
 173 
     | 
    
         
            +
                # Capture stdout and stderr
         
     | 
| 
      
 174 
     | 
    
         
            +
                stdout, stderr = io.StringIO(), io.StringIO()
         
     | 
| 
      
 175 
     | 
    
         
            +
                with redirect_stdout(stdout), redirect_stderr(stderr):
         
     | 
| 
       175 
176 
     | 
    
         
             
                    YOLO(MODEL).export(format="coreml", nms=True, imgsz=32)
         
     | 
| 
      
 177 
     | 
    
         
            +
                    if MACOS:
         
     | 
| 
      
 178 
     | 
    
         
            +
                        file = YOLO(MODEL).export(format="coreml", imgsz=32)
         
     | 
| 
      
 179 
     | 
    
         
            +
                        YOLO(file)(SOURCE, imgsz=32)  # model prediction only supported on macOS for nms=False models
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                # Check captured output for errors
         
     | 
| 
      
 182 
     | 
    
         
            +
                output = stdout.getvalue() + stderr.getvalue()
         
     | 
| 
      
 183 
     | 
    
         
            +
                assert "Error" not in output, f"CoreML export produced errors: {output}"
         
     | 
| 
      
 184 
     | 
    
         
            +
                assert "You will not be able to run predict()" not in output, "CoreML export has predict() error"
         
     | 
| 
       176 
185 
     | 
    
         | 
| 
       177 
186 
     | 
    
         | 
| 
       178 
187 
     | 
    
         
             
            @pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10, reason="TFLite export requires Python>=3.10")
         
     | 
    
        ultralytics/__init__.py
    CHANGED
    
    
    
        ultralytics/cfg/__init__.py
    CHANGED
    
    | 
         @@ -700,7 +700,7 @@ def handle_yolo_solutions(args: List[str]) -> None: 
     | 
|
| 
       700 
700 
     | 
    
         
             
                    solution_name = "count"  # Default for invalid solution
         
     | 
| 
       701 
701 
     | 
    
         | 
| 
       702 
702 
     | 
    
         
             
                if solution_name == "inference":
         
     | 
| 
       703 
     | 
    
         
            -
                    checks.check_requirements("streamlit>=1.29.0")
         
     | 
| 
      
 703 
     | 
    
         
            +
                    checks.check_requirements("streamlit>=1.29.0,<1.44.0")
         
     | 
| 
       704 
704 
     | 
    
         
             
                    LOGGER.info("💡 Loading Ultralytics live inference app...")
         
     | 
| 
       705 
705 
     | 
    
         
             
                    subprocess.run(
         
     | 
| 
       706 
706 
     | 
    
         
             
                        [  # Run subprocess with Streamlit custom argument
         
     | 
    
        ultralytics/engine/exporter.py
    CHANGED
    
    | 
         @@ -818,7 +818,7 @@ class Exporter: 
     | 
|
| 
       818 
818 
     | 
    
         
             
                        ts,
         
     | 
| 
       819 
819 
     | 
    
         
             
                        inputs=[ct.ImageType("image", shape=self.im.shape, scale=scale, bias=bias)],  # expects ct.TensorType
         
     | 
| 
       820 
820 
     | 
    
         
             
                        classifier_config=classifier_config,
         
     | 
| 
       821 
     | 
    
         
            -
                        minimum_deployment_target=ct.target. 
     | 
| 
      
 821 
     | 
    
         
            +
                        minimum_deployment_target=ct.target.iOS15,  # warning: >=16 causes pipeline errors
         
     | 
| 
       822 
822 
     | 
    
         
             
                        convert_to="neuralnetwork" if mlmodel else "mlprogram",
         
     | 
| 
       823 
823 
     | 
    
         
             
                    )
         
     | 
| 
       824 
824 
     | 
    
         
             
                    bits, mode = (8, "kmeans") if self.args.int8 else (16, "linear") if self.args.half else (32, None)
         
     | 
| 
         @@ -1464,7 +1464,7 @@ class Exporter: 
     | 
|
| 
       1464 
1464 
     | 
    
         | 
| 
       1465 
1465 
     | 
    
         
             
                    # 3. Create NMS protobuf
         
     | 
| 
       1466 
1466 
     | 
    
         
             
                    nms_spec = ct.proto.Model_pb2.Model()
         
     | 
| 
       1467 
     | 
    
         
            -
                    nms_spec.specificationVersion =  
     | 
| 
      
 1467 
     | 
    
         
            +
                    nms_spec.specificationVersion = 9
         
     | 
| 
       1468 
1468 
     | 
    
         
             
                    for i in range(2):
         
     | 
| 
       1469 
1469 
     | 
    
         
             
                        decoder_output = model._spec.description.output[i].SerializeToString()
         
     | 
| 
       1470 
1470 
     | 
    
         
             
                        nms_spec.description.input.add()
         
     | 
| 
         @@ -1517,7 +1517,7 @@ class Exporter: 
     | 
|
| 
       1517 
1517 
     | 
    
         
             
                    pipeline.spec.description.output[1].ParseFromString(nms_model._spec.description.output[1].SerializeToString())
         
     | 
| 
       1518 
1518 
     | 
    
         | 
| 
       1519 
1519 
     | 
    
         
             
                    # Update metadata
         
     | 
| 
       1520 
     | 
    
         
            -
                    pipeline.spec.specificationVersion =  
     | 
| 
      
 1520 
     | 
    
         
            +
                    pipeline.spec.specificationVersion = 9
         
     | 
| 
       1521 
1521 
     | 
    
         
             
                    pipeline.spec.description.metadata.userDefined.update(
         
     | 
| 
       1522 
1522 
     | 
    
         
             
                        {"IoU threshold": str(nms.iouThreshold), "Confidence threshold": str(nms.confidenceThreshold)}
         
     | 
| 
       1523 
1523 
     | 
    
         
             
                    )
         
     | 
    
        ultralytics/engine/tuner.py
    CHANGED
    
    | 
         @@ -93,8 +93,9 @@ class Tuner: 
     | 
|
| 
       93 
93 
     | 
    
         
             
                        "copy_paste": (0.0, 1.0),  # segment copy-paste (probability)
         
     | 
| 
       94 
94 
     | 
    
         
             
                    }
         
     | 
| 
       95 
95 
     | 
    
         
             
                    self.args = get_cfg(overrides=args)
         
     | 
| 
      
 96 
     | 
    
         
            +
                    self.args.exist_ok = self.args.resume  # resume w/ same tune_dir
         
     | 
| 
       96 
97 
     | 
    
         
             
                    self.tune_dir = get_save_dir(self.args, name=self.args.name or "tune")
         
     | 
| 
       97 
     | 
    
         
            -
                    self.args.name = None  # reset to not affect training 
     | 
| 
      
 98 
     | 
    
         
            +
                    self.args.name, self.args.exist_ok, self.args.resume = (None, False, False)  # reset to not affect training
         
     | 
| 
       98 
99 
     | 
    
         
             
                    self.tune_csv = self.tune_dir / "tune_results.csv"
         
     | 
| 
       99 
100 
     | 
    
         
             
                    self.callbacks = _callbacks or callbacks.get_default_callbacks()
         
     | 
| 
       100 
101 
     | 
    
         
             
                    self.prefix = colorstr("Tuner: ")
         
     | 
| 
         @@ -173,7 +174,12 @@ class Tuner: 
     | 
|
| 
       173 
174 
     | 
    
         
             
                    t0 = time.time()
         
     | 
| 
       174 
175 
     | 
    
         
             
                    best_save_dir, best_metrics = None, None
         
     | 
| 
       175 
176 
     | 
    
         
             
                    (self.tune_dir / "weights").mkdir(parents=True, exist_ok=True)
         
     | 
| 
       176 
     | 
    
         
            -
                     
     | 
| 
      
 177 
     | 
    
         
            +
                    start = 0
         
     | 
| 
      
 178 
     | 
    
         
            +
                    if self.tune_csv.exists():
         
     | 
| 
      
 179 
     | 
    
         
            +
                        x = np.loadtxt(self.tune_csv, ndmin=2, delimiter=",", skiprows=1)
         
     | 
| 
      
 180 
     | 
    
         
            +
                        start = x.shape[0]
         
     | 
| 
      
 181 
     | 
    
         
            +
                        LOGGER.info(f"{self.prefix}Resuming tuning run {self.tune_dir} from iteration {start + 1}...")
         
     | 
| 
      
 182 
     | 
    
         
            +
                    for i in range(start, iterations):
         
     | 
| 
       177 
183 
     | 
    
         
             
                        # Mutate hyperparameters
         
     | 
| 
       178 
184 
     | 
    
         
             
                        mutated_hyp = self._mutate()
         
     | 
| 
       179 
185 
     | 
    
         
             
                        LOGGER.info(f"{self.prefix}Starting iteration {i + 1}/{iterations} with hyperparameters: {mutated_hyp}")
         
     | 
    
        ultralytics/nn/autobackend.py
    CHANGED
    
    | 
         @@ -6,6 +6,7 @@ import platform 
     | 
|
| 
       6 
6 
     | 
    
         
             
            import zipfile
         
     | 
| 
       7 
7 
     | 
    
         
             
            from collections import OrderedDict, namedtuple
         
     | 
| 
       8 
8 
     | 
    
         
             
            from pathlib import Path
         
     | 
| 
      
 9 
     | 
    
         
            +
            from typing import List, Optional, Union
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
       10 
11 
     | 
    
         
             
            import cv2
         
     | 
| 
       11 
12 
     | 
    
         
             
            import numpy as np
         
     | 
| 
         @@ -96,14 +97,14 @@ class AutoBackend(nn.Module): 
     | 
|
| 
       96 
97 
     | 
    
         
             
                @torch.no_grad()
         
     | 
| 
       97 
98 
     | 
    
         
             
                def __init__(
         
     | 
| 
       98 
99 
     | 
    
         
             
                    self,
         
     | 
| 
       99 
     | 
    
         
            -
                    weights="yolo11n.pt",
         
     | 
| 
       100 
     | 
    
         
            -
                    device=torch.device("cpu"),
         
     | 
| 
       101 
     | 
    
         
            -
                    dnn=False,
         
     | 
| 
       102 
     | 
    
         
            -
                    data=None,
         
     | 
| 
       103 
     | 
    
         
            -
                    fp16=False,
         
     | 
| 
       104 
     | 
    
         
            -
                    batch=1,
         
     | 
| 
       105 
     | 
    
         
            -
                    fuse=True,
         
     | 
| 
       106 
     | 
    
         
            -
                    verbose=True,
         
     | 
| 
      
 100 
     | 
    
         
            +
                    weights: Union[str, List[str], torch.nn.Module] = "yolo11n.pt",
         
     | 
| 
      
 101 
     | 
    
         
            +
                    device: torch.device = torch.device("cpu"),
         
     | 
| 
      
 102 
     | 
    
         
            +
                    dnn: bool = False,
         
     | 
| 
      
 103 
     | 
    
         
            +
                    data: Optional[Union[str, Path]] = None,
         
     | 
| 
      
 104 
     | 
    
         
            +
                    fp16: bool = False,
         
     | 
| 
      
 105 
     | 
    
         
            +
                    batch: int = 1,
         
     | 
| 
      
 106 
     | 
    
         
            +
                    fuse: bool = True,
         
     | 
| 
      
 107 
     | 
    
         
            +
                    verbose: bool = True,
         
     | 
| 
       107 
108 
     | 
    
         
             
                ):
         
     | 
| 
       108 
109 
     | 
    
         
             
                    """
         
     | 
| 
       109 
110 
     | 
    
         
             
                    Initialize the AutoBackend for inference.
         
     | 
    
        ultralytics/nn/tasks.py
    CHANGED
    
    | 
         @@ -912,6 +912,9 @@ class YOLOEModel(DetectionModel): 
     | 
|
| 
       912 
912 
     | 
    
         
             
                        names (List[str]): List of class names.
         
     | 
| 
       913 
913 
     | 
    
         
             
                        embeddings (torch.Tensor): Embeddings tensor.
         
     | 
| 
       914 
914 
     | 
    
         
             
                    """
         
     | 
| 
      
 915 
     | 
    
         
            +
                    assert not hasattr(self.model[-1], "lrpc"), (
         
     | 
| 
      
 916 
     | 
    
         
            +
                        "Prompt-free model does not support setting classes. Please try with Text/Visual prompt models."
         
     | 
| 
      
 917 
     | 
    
         
            +
                    )
         
     | 
| 
       915 
918 
     | 
    
         
             
                    assert embeddings.ndim == 3
         
     | 
| 
       916 
919 
     | 
    
         
             
                    self.pe = embeddings
         
     | 
| 
       917 
920 
     | 
    
         
             
                    self.model[-1].nc = len(names)
         
     | 
| 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            from ultralytics. 
     | 
| 
       4 
     | 
    
         
            -
            from ultralytics. 
     | 
| 
      
 3 
     | 
    
         
            +
            from ultralytics.engine.results import Results
         
     | 
| 
      
 4 
     | 
    
         
            +
            from ultralytics.solutions.solutions import BaseSolution, SolutionResults
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            class InstanceSegmentation(BaseSolution):
         
     | 
| 
         @@ -41,6 +41,10 @@ class InstanceSegmentation(BaseSolution): 
     | 
|
| 
       41 
41 
     | 
    
         
             
                    kwargs["model"] = kwargs.get("model", "yolo11n-seg.pt")
         
     | 
| 
       42 
42 
     | 
    
         
             
                    super().__init__(**kwargs)
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
      
 44 
     | 
    
         
            +
                    self.show_conf = self.CFG.get("show_conf", True)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    self.show_labels = self.CFG.get("show_labels", True)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    self.show_boxes = self.CFG.get("show_boxes", True)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       44 
48 
     | 
    
         
             
                def process(self, im0):
         
     | 
| 
       45 
49 
     | 
    
         
             
                    """
         
     | 
| 
       46 
50 
     | 
    
         
             
                    Perform instance segmentation on the input image and annotate the results.
         
     | 
| 
         @@ -58,17 +62,21 @@ class InstanceSegmentation(BaseSolution): 
     | 
|
| 
       58 
62 
     | 
    
         
             
                        >>> print(summary)
         
     | 
| 
       59 
63 
     | 
    
         
             
                    """
         
     | 
| 
       60 
64 
     | 
    
         
             
                    self.extract_tracks(im0)  # Extract tracks (bounding boxes, classes, and masks)
         
     | 
| 
       61 
     | 
    
         
            -
                    annotator = SolutionAnnotator(im0, self.line_width)
         
     | 
| 
       62 
65 
     | 
    
         | 
| 
       63 
66 
     | 
    
         
             
                    # Iterate over detected classes, track IDs, and segmentation masks
         
     | 
| 
       64 
67 
     | 
    
         
             
                    if self.masks is None:
         
     | 
| 
       65 
68 
     | 
    
         
             
                        self.LOGGER.warning("⚠️ No masks detected! Ensure you're using a supported Ultralytics segmentation model.")
         
     | 
| 
      
 69 
     | 
    
         
            +
                        plot_im = im0
         
     | 
| 
       66 
70 
     | 
    
         
             
                    else:
         
     | 
| 
       67 
     | 
    
         
            -
                         
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                             
     | 
| 
      
 71 
     | 
    
         
            +
                        results = Results(im0, path=None, names=self.names, boxes=self.track_data.data, masks=self.masks.data)
         
     | 
| 
      
 72 
     | 
    
         
            +
                        plot_im = results.plot(
         
     | 
| 
      
 73 
     | 
    
         
            +
                            line_width=self.line_width,
         
     | 
| 
      
 74 
     | 
    
         
            +
                            boxes=self.show_boxes,
         
     | 
| 
      
 75 
     | 
    
         
            +
                            conf=self.show_conf,
         
     | 
| 
      
 76 
     | 
    
         
            +
                            labels=self.show_labels,
         
     | 
| 
      
 77 
     | 
    
         
            +
                            color_mode="instance",
         
     | 
| 
      
 78 
     | 
    
         
            +
                        )
         
     | 
| 
       70 
79 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
                    plot_im = annotator.result()
         
     | 
| 
       72 
80 
     | 
    
         
             
                    self.display_output(plot_im)  # Display the annotated output using the base class function
         
     | 
| 
       73 
81 
     | 
    
         | 
| 
       74 
82 
     | 
    
         
             
                    # Return SolutionResults
         
     | 
| 
         @@ -52,7 +52,7 @@ class BaseSolution: 
     | 
|
| 
       52 
52 
     | 
    
         
             
                        is_cli (bool): Enables CLI mode if set to True.
         
     | 
| 
       53 
53 
     | 
    
         
             
                        **kwargs (Any): Additional configuration parameters that override defaults.
         
     | 
| 
       54 
54 
     | 
    
         
             
                    """
         
     | 
| 
       55 
     | 
    
         
            -
                    check_requirements("shapely>=2.0.0")
         
     | 
| 
      
 55 
     | 
    
         
            +
                    check_requirements("shapely>=2.0.0,<2.1.0")
         
     | 
| 
       56 
56 
     | 
    
         
             
                    from shapely.geometry import LineString, Point, Polygon
         
     | 
| 
       57 
57 
     | 
    
         
             
                    from shapely.prepared import prep
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
         @@ -122,7 +122,7 @@ class BaseSolution: 
     | 
|
| 
       122 
122 
     | 
    
         
             
                    self.track_data = self.tracks[0].obb or self.tracks[0].boxes  # Extract tracks for OBB or object detection
         
     | 
| 
       123 
123 
     | 
    
         | 
| 
       124 
124 
     | 
    
         
             
                    self.masks = (
         
     | 
| 
       125 
     | 
    
         
            -
                        self.tracks[0].masks 
     | 
| 
      
 125 
     | 
    
         
            +
                        self.tracks[0].masks if hasattr(self.tracks[0], "masks") and self.tracks[0].masks is not None else None
         
     | 
| 
       126 
126 
     | 
    
         
             
                    )
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
       128 
128 
     | 
    
         
             
                    if self.track_data and self.track_data.id is not None:
         
     | 
| 
         @@ -225,7 +225,6 @@ class SolutionAnnotator(Annotator): 
     | 
|
| 
       225 
225 
     | 
    
         
             
                    plot_angle_and_count_and_stage: Visualizes angle, step count, and stage for workout monitoring.
         
     | 
| 
       226 
226 
     | 
    
         
             
                    plot_distance_and_line: Displays the distance between centroids and connects them with a line.
         
     | 
| 
       227 
227 
     | 
    
         
             
                    display_objects_labels: Annotates bounding boxes with object class labels.
         
     | 
| 
       228 
     | 
    
         
            -
                    segmentation_mask: Draws mask for segmented objects and optionally labels them.
         
     | 
| 
       229 
228 
     | 
    
         
             
                    sweep_annotator: Visualizes a vertical sweep line and optional label.
         
     | 
| 
       230 
229 
     | 
    
         
             
                    visioneye: Maps and connects object centroids to a visual "eye" point.
         
     | 
| 
       231 
230 
     | 
    
         
             
                    circle_label: Draws a circular label within a bounding box.
         
     | 
| 
         @@ -519,50 +518,6 @@ class SolutionAnnotator(Annotator): 
     | 
|
| 
       519 
518 
     | 
    
         
             
                        lineType=cv2.LINE_AA,
         
     | 
| 
       520 
519 
     | 
    
         
             
                    )
         
     | 
| 
       521 
520 
     | 
    
         | 
| 
       522 
     | 
    
         
            -
                def segmentation_mask(self, mask, mask_color=(255, 0, 255), label=None, alpha=0.5):
         
     | 
| 
       523 
     | 
    
         
            -
                    """
         
     | 
| 
       524 
     | 
    
         
            -
                    Draw an optimized segmentation mask with smooth corners, highlighted edge, and dynamic text box size.
         
     | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
                    Args:
         
     | 
| 
       527 
     | 
    
         
            -
                        mask (np.ndarray): A 2D array of shape (N, 2) containing the object mask.
         
     | 
| 
       528 
     | 
    
         
            -
                        mask_color (Tuple[int, int, int]): RGB color for the mask.
         
     | 
| 
       529 
     | 
    
         
            -
                        label (str, optional): Text label for the object.
         
     | 
| 
       530 
     | 
    
         
            -
                        alpha (float): Transparency level (0 = fully transparent, 1 = fully opaque).
         
     | 
| 
       531 
     | 
    
         
            -
                    """
         
     | 
| 
       532 
     | 
    
         
            -
                    if mask.size == 0:
         
     | 
| 
       533 
     | 
    
         
            -
                        return
         
     | 
| 
       534 
     | 
    
         
            -
             
     | 
| 
       535 
     | 
    
         
            -
                    overlay = self.im.copy()
         
     | 
| 
       536 
     | 
    
         
            -
                    mask = np.int32([mask])
         
     | 
| 
       537 
     | 
    
         
            -
             
     | 
| 
       538 
     | 
    
         
            -
                    # Approximate polygon for smooth corners with epsilon
         
     | 
| 
       539 
     | 
    
         
            -
                    refined_mask = cv2.approxPolyDP(mask, 0.002 * cv2.arcLength(mask, True), True)
         
     | 
| 
       540 
     | 
    
         
            -
             
     | 
| 
       541 
     | 
    
         
            -
                    # Apply a highlighter effect by drawing a thick outer shadow
         
     | 
| 
       542 
     | 
    
         
            -
                    cv2.polylines(overlay, [refined_mask], isClosed=True, color=mask_color, thickness=self.lw * 3)
         
     | 
| 
       543 
     | 
    
         
            -
                    cv2.fillPoly(overlay, [refined_mask], mask_color)  # draw mask with primary color
         
     | 
| 
       544 
     | 
    
         
            -
             
     | 
| 
       545 
     | 
    
         
            -
                    # Apply an inner glow effect for extra clarity
         
     | 
| 
       546 
     | 
    
         
            -
                    cv2.polylines(overlay, [refined_mask], isClosed=True, color=mask_color, thickness=self.lw)
         
     | 
| 
       547 
     | 
    
         
            -
             
     | 
| 
       548 
     | 
    
         
            -
                    self.im = cv2.addWeighted(overlay, alpha, self.im, 1 - alpha, 0)  # blend overlay with the original image
         
     | 
| 
       549 
     | 
    
         
            -
             
     | 
| 
       550 
     | 
    
         
            -
                    # Draw label if provided
         
     | 
| 
       551 
     | 
    
         
            -
                    if label:
         
     | 
| 
       552 
     | 
    
         
            -
                        text_size, _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, self.sf, self.tf)
         
     | 
| 
       553 
     | 
    
         
            -
                        text_x, text_y = refined_mask[0][0][0], refined_mask[0][0][1]
         
     | 
| 
       554 
     | 
    
         
            -
                        rect_start, rect_end = (text_x - 5, text_y - text_size[1] - 5), (text_x + text_size[0] + 5, text_y + 5)
         
     | 
| 
       555 
     | 
    
         
            -
                        cv2.rectangle(self.im, rect_start, rect_end, mask_color, -1)
         
     | 
| 
       556 
     | 
    
         
            -
                        cv2.putText(
         
     | 
| 
       557 
     | 
    
         
            -
                            self.im,
         
     | 
| 
       558 
     | 
    
         
            -
                            label,
         
     | 
| 
       559 
     | 
    
         
            -
                            (text_x, text_y),
         
     | 
| 
       560 
     | 
    
         
            -
                            cv2.FONT_HERSHEY_SIMPLEX,
         
     | 
| 
       561 
     | 
    
         
            -
                            self.sf,
         
     | 
| 
       562 
     | 
    
         
            -
                            self.get_txt_color(mask_color),
         
     | 
| 
       563 
     | 
    
         
            -
                            self.tf,
         
     | 
| 
       564 
     | 
    
         
            -
                        )
         
     | 
| 
       565 
     | 
    
         
            -
             
     | 
| 
       566 
521 
     | 
    
         
             
                def sweep_annotator(self, line_x=0, line_y=0, label=None, color=(221, 0, 186), txt_color=(255, 255, 255)):
         
     | 
| 
       567 
522 
     | 
    
         
             
                    """
         
     | 
| 
       568 
523 
     | 
    
         
             
                    Draw a sweep annotation line and an optional label.
         
     | 
    
        ultralytics/utils/metrics.py
    CHANGED
    
    | 
         @@ -523,7 +523,7 @@ def plot_mc_curve(px, py, save_dir=Path("mc_curve.png"), names={}, xlabel="Confi 
     | 
|
| 
       523 
523 
     | 
    
         
             
                else:
         
     | 
| 
       524 
524 
     | 
    
         
             
                    ax.plot(px, py.T, linewidth=1, color="grey")  # plot(confidence, metric)
         
     | 
| 
       525 
525 
     | 
    
         | 
| 
       526 
     | 
    
         
            -
                y = smooth(py.mean(0), 0. 
     | 
| 
      
 526 
     | 
    
         
            +
                y = smooth(py.mean(0), 0.1)
         
     | 
| 
       527 
527 
     | 
    
         
             
                ax.plot(px, y, linewidth=3, color="blue", label=f"all classes {y.max():.2f} at {px[y.argmax()]:.3f}")
         
     | 
| 
       528 
528 
     | 
    
         
             
                ax.set_xlabel(xlabel)
         
     | 
| 
       529 
529 
     | 
    
         
             
                ax.set_ylabel(ylabel)
         
     | 
    
        ultralytics/utils/torch_utils.py
    CHANGED
    
    | 
         @@ -386,14 +386,18 @@ def model_info_for_loggers(trainer): 
     | 
|
| 
       386 
386 
     | 
    
         | 
| 
       387 
387 
     | 
    
         
             
            def get_flops(model, imgsz=640):
         
     | 
| 
       388 
388 
     | 
    
         
             
                """
         
     | 
| 
       389 
     | 
    
         
            -
                 
     | 
| 
      
 389 
     | 
    
         
            +
                Calculate FLOPs (floating point operations) for a model in billions.
         
     | 
| 
      
 390 
     | 
    
         
            +
             
     | 
| 
      
 391 
     | 
    
         
            +
                Attempts two calculation methods: first with a stride-based tensor for efficiency,
         
     | 
| 
      
 392 
     | 
    
         
            +
                then falls back to full image size if needed (e.g., for RTDETR models). Returns 0.0
         
     | 
| 
      
 393 
     | 
    
         
            +
                if thop library is unavailable or calculation fails.
         
     | 
| 
       390 
394 
     | 
    
         | 
| 
       391 
395 
     | 
    
         
             
                Args:
         
     | 
| 
       392 
396 
     | 
    
         
             
                    model (nn.Module): The model to calculate FLOPs for.
         
     | 
| 
       393 
397 
     | 
    
         
             
                    imgsz (int | List[int], optional): Input image size. Defaults to 640.
         
     | 
| 
       394 
398 
     | 
    
         | 
| 
       395 
399 
     | 
    
         
             
                Returns:
         
     | 
| 
       396 
     | 
    
         
            -
                    (float): The model 
     | 
| 
      
 400 
     | 
    
         
            +
                    (float): The model FLOPs in billions.
         
     | 
| 
       397 
401 
     | 
    
         
             
                """
         
     | 
| 
       398 
402 
     | 
    
         
             
                if not thop:
         
     | 
| 
       399 
403 
     | 
    
         
             
                    return 0.0  # if not installed return 0.0 GFLOPs
         
     | 
| 
         @@ -404,13 +408,13 @@ def get_flops(model, imgsz=640): 
     | 
|
| 
       404 
408 
     | 
    
         
             
                    if not isinstance(imgsz, list):
         
     | 
| 
       405 
409 
     | 
    
         
             
                        imgsz = [imgsz, imgsz]  # expand if int/float
         
     | 
| 
       406 
410 
     | 
    
         
             
                    try:
         
     | 
| 
       407 
     | 
    
         
            -
                        # Use stride  
     | 
| 
      
 411 
     | 
    
         
            +
                        # Method 1: Use stride-based input tensor
         
     | 
| 
       408 
412 
     | 
    
         
             
                        stride = max(int(model.stride.max()), 32) if hasattr(model, "stride") else 32  # max stride
         
     | 
| 
       409 
413 
     | 
    
         
             
                        im = torch.empty((1, p.shape[1], stride, stride), device=p.device)  # input image in BCHW format
         
     | 
| 
       410 
414 
     | 
    
         
             
                        flops = thop.profile(deepcopy(model), inputs=[im], verbose=False)[0] / 1e9 * 2  # stride GFLOPs
         
     | 
| 
       411 
415 
     | 
    
         
             
                        return flops * imgsz[0] / stride * imgsz[1] / stride  # imgsz GFLOPs
         
     | 
| 
       412 
416 
     | 
    
         
             
                    except Exception:
         
     | 
| 
       413 
     | 
    
         
            -
                        # Use actual image size  
     | 
| 
      
 417 
     | 
    
         
            +
                        # Method 2: Use actual image size (required for RTDETR models)
         
     | 
| 
       414 
418 
     | 
    
         
             
                        im = torch.empty((1, p.shape[1], *imgsz), device=p.device)  # input image in BCHW format
         
     | 
| 
       415 
419 
     | 
    
         
             
                        return thop.profile(deepcopy(model), inputs=[im], verbose=False)[0] / 1e9 * 2  # imgsz GFLOPs
         
     | 
| 
       416 
420 
     | 
    
         
             
                except Exception:
         
     | 
| 
         @@ -611,10 +615,10 @@ def unset_deterministic(): 
     | 
|
| 
       611 
615 
     | 
    
         | 
| 
       612 
616 
     | 
    
         
             
            class ModelEMA:
         
     | 
| 
       613 
617 
     | 
    
         
             
                """
         
     | 
| 
       614 
     | 
    
         
            -
                Updated Exponential Moving Average (EMA)  
     | 
| 
      
 618 
     | 
    
         
            +
                Updated Exponential Moving Average (EMA) implementation.
         
     | 
| 
       615 
619 
     | 
    
         | 
| 
       616 
620 
     | 
    
         
             
                Keeps a moving average of everything in the model state_dict (parameters and buffers).
         
     | 
| 
       617 
     | 
    
         
            -
                For EMA details see  
     | 
| 
      
 621 
     | 
    
         
            +
                For EMA details see References.
         
     | 
| 
       618 
622 
     | 
    
         | 
| 
       619 
623 
     | 
    
         
             
                To disable EMA set the `enabled` attribute to `False`.
         
     | 
| 
       620 
624 
     | 
    
         | 
| 
         @@ -623,6 +627,10 @@ class ModelEMA: 
     | 
|
| 
       623 
627 
     | 
    
         
             
                    updates (int): Number of EMA updates.
         
     | 
| 
       624 
628 
     | 
    
         
             
                    decay (function): Decay function that determines the EMA weight.
         
     | 
| 
       625 
629 
     | 
    
         
             
                    enabled (bool): Whether EMA is enabled.
         
     | 
| 
      
 630 
     | 
    
         
            +
             
     | 
| 
      
 631 
     | 
    
         
            +
                References:
         
     | 
| 
      
 632 
     | 
    
         
            +
                    - https://github.com/rwightman/pytorch-image-models
         
     | 
| 
      
 633 
     | 
    
         
            +
                    - https://www.tensorflow.org/api_docs/python/tf/train/ExponentialMovingAverage
         
     | 
| 
       626 
634 
     | 
    
         
             
                """
         
     | 
| 
       627 
635 
     | 
    
         | 
| 
       628 
636 
     | 
    
         
             
                def __init__(self, model, decay=0.9999, tau=2000, updates=0):
         
     | 
    
        ultralytics/utils/tuner.py
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            from ultralytics.cfg import TASK2DATA, TASK2METRIC, get_cfg, get_save_dir
         
     | 
| 
       4 
     | 
    
         
            -
            from ultralytics.utils import DEFAULT_CFG, DEFAULT_CFG_DICT, LOGGER, NUM_THREADS, checks
         
     | 
| 
      
 4 
     | 
    
         
            +
            from ultralytics.utils import DEFAULT_CFG, DEFAULT_CFG_DICT, LOGGER, NUM_THREADS, checks, colorstr
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
            def run_ray_tune(
         
     | 
| 
         @@ -95,7 +95,7 @@ def run_ray_tune( 
     | 
|
| 
       95 
95 
     | 
    
         
             
                    return results.results_dict
         
     | 
| 
       96 
96 
     | 
    
         | 
| 
       97 
97 
     | 
    
         
             
                # Get search space
         
     | 
| 
       98 
     | 
    
         
            -
                if not space:
         
     | 
| 
      
 98 
     | 
    
         
            +
                if not space and not train_args.get("resume"):
         
     | 
| 
       99 
99 
     | 
    
         
             
                    space = default_space
         
     | 
| 
       100 
100 
     | 
    
         
             
                    LOGGER.warning("WARNING ⚠️ search space not provided, using default search space.")
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
         @@ -123,15 +123,23 @@ def run_ray_tune( 
     | 
|
| 
       123 
123 
     | 
    
         | 
| 
       124 
124 
     | 
    
         
             
                # Create the Ray Tune hyperparameter search tuner
         
     | 
| 
       125 
125 
     | 
    
         
             
                tune_dir = get_save_dir(
         
     | 
| 
       126 
     | 
    
         
            -
                    get_cfg( 
     | 
| 
      
 126 
     | 
    
         
            +
                    get_cfg(
         
     | 
| 
      
 127 
     | 
    
         
            +
                        DEFAULT_CFG,
         
     | 
| 
      
 128 
     | 
    
         
            +
                        {**train_args, **{"exist_ok": train_args.pop("resume", False)}},  # resume w/ same tune_dir
         
     | 
| 
      
 129 
     | 
    
         
            +
                    ),
         
     | 
| 
      
 130 
     | 
    
         
            +
                    name=train_args.pop("name", "tune"),  # runs/{task}/{tune_dir}
         
     | 
| 
       127 
131 
     | 
    
         
             
                ).resolve()  # must be absolute dir
         
     | 
| 
       128 
132 
     | 
    
         
             
                tune_dir.mkdir(parents=True, exist_ok=True)
         
     | 
| 
       129 
     | 
    
         
            -
                 
     | 
| 
       130 
     | 
    
         
            -
                     
     | 
| 
       131 
     | 
    
         
            -
                     
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
                     
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
      
 133 
     | 
    
         
            +
                if tune.Tuner.can_restore(tune_dir):
         
     | 
| 
      
 134 
     | 
    
         
            +
                    LOGGER.info(f"{colorstr('Tuner: ')} Resuming tuning run {tune_dir}...")
         
     | 
| 
      
 135 
     | 
    
         
            +
                    tuner = tune.Tuner.restore(str(tune_dir), trainable=trainable_with_resources, resume_errored=True)
         
     | 
| 
      
 136 
     | 
    
         
            +
                else:
         
     | 
| 
      
 137 
     | 
    
         
            +
                    tuner = tune.Tuner(
         
     | 
| 
      
 138 
     | 
    
         
            +
                        trainable_with_resources,
         
     | 
| 
      
 139 
     | 
    
         
            +
                        param_space=space,
         
     | 
| 
      
 140 
     | 
    
         
            +
                        tune_config=tune.TuneConfig(scheduler=asha_scheduler, num_samples=max_samples),
         
     | 
| 
      
 141 
     | 
    
         
            +
                        run_config=RunConfig(callbacks=tuner_callbacks, storage_path=tune_dir.parent, name=tune_dir.name),
         
     | 
| 
      
 142 
     | 
    
         
            +
                    )
         
     | 
| 
       135 
143 
     | 
    
         | 
| 
       136 
144 
     | 
    
         
             
                # Run the hyperparameter search
         
     | 
| 
       137 
145 
     | 
    
         
             
                tuner.fit()
         
     | 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Metadata-Version: 2.4
         
     | 
| 
       2 
2 
     | 
    
         
             
            Name: ultralytics
         
     | 
| 
       3 
     | 
    
         
            -
            Version: 8.3. 
     | 
| 
      
 3 
     | 
    
         
            +
            Version: 8.3.103
         
     | 
| 
       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>
         
     | 
| 
         @@ -70,8 +70,8 @@ Requires-Dist: keras; extra == "export" 
     | 
|
| 
       70 
70 
     | 
    
         
             
            Requires-Dist: flatbuffers<100,>=23.5.26; platform_machine == "aarch64" and extra == "export"
         
     | 
| 
       71 
71 
     | 
    
         
             
            Requires-Dist: h5py!=3.11.0; platform_machine == "aarch64" and extra == "export"
         
     | 
| 
       72 
72 
     | 
    
         
             
            Provides-Extra: solutions
         
     | 
| 
       73 
     | 
    
         
            -
            Requires-Dist: shapely 
     | 
| 
       74 
     | 
    
         
            -
            Requires-Dist: streamlit; extra == "solutions"
         
     | 
| 
      
 73 
     | 
    
         
            +
            Requires-Dist: shapely<2.1.0,>=2.0.0; extra == "solutions"
         
     | 
| 
      
 74 
     | 
    
         
            +
            Requires-Dist: streamlit<1.44.0,>=1.29.0; extra == "solutions"
         
     | 
| 
       75 
75 
     | 
    
         
             
            Provides-Extra: logging
         
     | 
| 
       76 
76 
     | 
    
         
             
            Requires-Dist: comet; extra == "logging"
         
     | 
| 
       77 
77 
     | 
    
         
             
            Requires-Dist: tensorboard>=2.13.0; extra == "logging"
         
     | 
| 
         @@ -3,14 +3,14 @@ tests/conftest.py,sha256=rsIAipRKfrVNoTaJ1LdpYue8AbcJ_fr3d3WIlM_6uXY,2982 
     | 
|
| 
       3 
3 
     | 
    
         
             
            tests/test_cli.py,sha256=DPxUjcGAex_cmGMNaRIK7mT7wrILWaPBtlfXuHQpveI,5284
         
     | 
| 
       4 
4 
     | 
    
         
             
            tests/test_cuda.py,sha256=0uvTF4bY_Grsd_Xgtp7TdIEgMpUqKv8_kWA82NYDl_g,6260
         
     | 
| 
       5 
5 
     | 
    
         
             
            tests/test_engine.py,sha256=aGqZ8P7QO5C_nOa1b4FOyk92Ysdk5WiP-ST310Vyxys,4962
         
     | 
| 
       6 
     | 
    
         
            -
            tests/test_exports.py,sha256= 
     | 
| 
      
 6 
     | 
    
         
            +
            tests/test_exports.py,sha256=dhZn86LdbapW15RthQF870LGxDjC1MUZhlGdBgPmgIQ,9716
         
     | 
| 
       7 
7 
     | 
    
         
             
            tests/test_integrations.py,sha256=ZgpddWHEVqiP4bGhVw8fLc2wdz0rCxuxr0FQ2dTgnIE,6067
         
     | 
| 
       8 
8 
     | 
    
         
             
            tests/test_python.py,sha256=Xrxx-Cul4xumA5qDCnduXOA3InfADT3jrtnEh4jpOeY,24638
         
     | 
| 
       9 
9 
     | 
    
         
             
            tests/test_solutions.py,sha256=FrQfIjjFeOf3kLU6-1mC7qOhgEkWFuc5Djc2sf2dQHU,5532
         
     | 
| 
       10 
     | 
    
         
            -
            ultralytics/__init__.py,sha256= 
     | 
| 
      
 10 
     | 
    
         
            +
            ultralytics/__init__.py,sha256=eLvuHAOilZjuxx9JiZennZVVDKbymiy8fSI1S3uu6lE,730
         
     | 
| 
       11 
11 
     | 
    
         
             
            ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
         
     | 
| 
       12 
12 
     | 
    
         
             
            ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
         
     | 
| 
       13 
     | 
    
         
            -
            ultralytics/cfg/__init__.py,sha256= 
     | 
| 
      
 13 
     | 
    
         
            +
            ultralytics/cfg/__init__.py,sha256=fmoJOyFlUaZFR1dso6I0wS6YXUSMFRh_PmC00_9DOiI,39902
         
     | 
| 
       14 
14 
     | 
    
         
             
            ultralytics/cfg/default.yaml,sha256=tHE_VB_tzq5K1BntCCukmFIViwiRv0R-H6ZNucCnYsY,8469
         
     | 
| 
       15 
15 
     | 
    
         
             
            ultralytics/cfg/datasets/Argoverse.yaml,sha256=_xlEDIJ9XkUo0v_iNL7FW079BoSeZtKSuLteKTtGbA8,3275
         
     | 
| 
       16 
16 
     | 
    
         
             
            ultralytics/cfg/datasets/DOTAv1.5.yaml,sha256=SHND_CFkojxw5iQD5Mcgju2kCZIl0gW2ajuzv1cqoL0,1224
         
     | 
| 
         @@ -111,12 +111,12 @@ ultralytics/data/loaders.py,sha256=_Gyp_BfGTZwsFdn4UnolXxdU_sAYZLIrv0L2TRI9R5g,2 
     | 
|
| 
       111 
111 
     | 
    
         
             
            ultralytics/data/split_dota.py,sha256=p8eVGht9tABSVbf9vwvxA_AQYEva3IGHePKlMeNrn64,11872
         
     | 
| 
       112 
112 
     | 
    
         
             
            ultralytics/data/utils.py,sha256=aRPwIoLrCML_Kcd0dI9B6c5Ct4dvhdF36rDHtuf7Ww4,33217
         
     | 
| 
       113 
113 
     | 
    
         
             
            ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
         
     | 
| 
       114 
     | 
    
         
            -
            ultralytics/engine/exporter.py,sha256= 
     | 
| 
      
 114 
     | 
    
         
            +
            ultralytics/engine/exporter.py,sha256=Tt6hfbdyytFVlC5y8lIEdg9UXU3HwIYohsC8vJv8jtw,78052
         
     | 
| 
       115 
115 
     | 
    
         
             
            ultralytics/engine/model.py,sha256=YgQKYZrPENSTvLENspg-bXI9FinzzWARfb0U-C9vH-M,52916
         
     | 
| 
       116 
116 
     | 
    
         
             
            ultralytics/engine/predictor.py,sha256=fRUh82EJlu_6ZlIy8NFovlCcgX53UbRYSXcLljOs7Sc,21669
         
     | 
| 
       117 
117 
     | 
    
         
             
            ultralytics/engine/results.py,sha256=H3pFJhUjYKvVyOUqqZjfIn8vnCpl81aYNOnregMrBoQ,79716
         
     | 
| 
       118 
118 
     | 
    
         
             
            ultralytics/engine/trainer.py,sha256=KAeiNoH5NIRhQPIfr5AhVwDerk9dy0-QJu-FlxtG4xA,38904
         
     | 
| 
       119 
     | 
    
         
            -
            ultralytics/engine/tuner.py,sha256= 
     | 
| 
      
 119 
     | 
    
         
            +
            ultralytics/engine/tuner.py,sha256=CW6Ys4NV6SVScXA5GQO5DeSIJWys9e_mqUg26b6NYu4,12598
         
     | 
| 
       120 
120 
     | 
    
         
             
            ultralytics/engine/validator.py,sha256=Xijg74RHn43ANjQJaBJ4zZkWd0MMPUH2TzfmydAMbzk,16974
         
     | 
| 
       121 
121 
     | 
    
         
             
            ultralytics/hub/__init__.py,sha256=wDtAUKdfqob95tfFHgDJFXcsNSDSdoIQkJTm-CfIUTI,6616
         
     | 
| 
       122 
122 
     | 
    
         
             
            ultralytics/hub/auth.py,sha256=QShM9RGDwaNgZlNLfLg9Ui-awj55fTRRK9yFDGlwwZ8,5556
         
     | 
| 
         @@ -186,8 +186,8 @@ ultralytics/models/yolo/yoloe/train.py,sha256=7JxJkMN9bkUGsO-RojFG2Q3yfdKhb-TXlB 
     | 
|
| 
       186 
186 
     | 
    
         
             
            ultralytics/models/yolo/yoloe/train_seg.py,sha256=JguKB1ez8Rf7XBu_D_mWHMLJto7y7Kr2m0Tq2NwDtwU,5269
         
     | 
| 
       187 
187 
     | 
    
         
             
            ultralytics/models/yolo/yoloe/val.py,sha256=n-wDJprRMqqio6Ndsg_OpjNJQCPy_wIMzPMzecESzjs,8244
         
     | 
| 
       188 
188 
     | 
    
         
             
            ultralytics/nn/__init__.py,sha256=rjociYD9lo_K-d-1s6TbdWklPLjTcEHk7OIlRDJstIE,615
         
     | 
| 
       189 
     | 
    
         
            -
            ultralytics/nn/autobackend.py,sha256= 
     | 
| 
       190 
     | 
    
         
            -
            ultralytics/nn/tasks.py,sha256= 
     | 
| 
      
 189 
     | 
    
         
            +
            ultralytics/nn/autobackend.py,sha256=Y597hrrvhHlRX5SoOiXJZXj_1ND9kHMn94V2m_saRAU,38871
         
     | 
| 
      
 190 
     | 
    
         
            +
            ultralytics/nn/tasks.py,sha256=r9CoXW9owNK5UWH2ufM5cyG3DB5TEEIX-JmhTSECCN8,62991
         
     | 
| 
       191 
191 
     | 
    
         
             
            ultralytics/nn/text_model.py,sha256=H6OiLe0FOyZY4pd7-ixRTxaBgx3lOc2GmGTmrFnoJd0,10136
         
     | 
| 
       192 
192 
     | 
    
         
             
            ultralytics/nn/modules/__init__.py,sha256=dXLtIk9rt944WfsTdpgEdWOg3HQEHdwQztuZ6WNJygs,3144
         
     | 
| 
       193 
193 
     | 
    
         
             
            ultralytics/nn/modules/activation.py,sha256=PvXZkA9AzEntR575JkFORdmtcRwATyy0lje-uHA5_8w,2210
         
     | 
| 
         @@ -201,7 +201,7 @@ ultralytics/solutions/ai_gym.py,sha256=oOexy2cT59u9X6ROCwoaV3Nl2zT2xJ_trShAoSyR8 
     | 
|
| 
       201 
201 
     | 
    
         
             
            ultralytics/solutions/analytics.py,sha256=O8dXdDTpHPRlz2vAGMvef1NfWUXBvoYt2G_TQI_UjoQ,11983
         
     | 
| 
       202 
202 
     | 
    
         
             
            ultralytics/solutions/distance_calculation.py,sha256=n6bPNJ7YbPKAaHWsra6CQQtrDR0SEvSC14BRWTITyBU,5711
         
     | 
| 
       203 
203 
     | 
    
         
             
            ultralytics/solutions/heatmap.py,sha256=dagbZ0Vn4UdywNyiAypYW5v1uzOWf521QrkzmqyeCEc,5626
         
     | 
| 
       204 
     | 
    
         
            -
            ultralytics/solutions/instance_segmentation.py,sha256= 
     | 
| 
      
 204 
     | 
    
         
            +
            ultralytics/solutions/instance_segmentation.py,sha256=q8vXQmnoqbiExq3CVYMybkdJ7X2AZWsExUA0--3d_5w,3505
         
     | 
| 
       205 
205 
     | 
    
         
             
            ultralytics/solutions/object_blurrer.py,sha256=9Qzs8M3YI--FoWvihMytFdtnhin6gQ0l_uy6CsdoF9U,3896
         
     | 
| 
       206 
206 
     | 
    
         
             
            ultralytics/solutions/object_counter.py,sha256=_5XsW6TwIh7_PK1d8Ny-Xd1a-pqTAzIDV02bHysnJmY,9881
         
     | 
| 
       207 
207 
     | 
    
         
             
            ultralytics/solutions/object_cropper.py,sha256=AlIM-RnqFRogAY8JilE0KnbzFMulaIYJGPpn1nFRL5w,3386
         
     | 
| 
         @@ -209,7 +209,7 @@ ultralytics/solutions/parking_management.py,sha256=uojHB17GxzFgzEmCBTEW5XK2h3ONj 
     | 
|
| 
       209 
209 
     | 
    
         
             
            ultralytics/solutions/queue_management.py,sha256=cUzAMMeWijowkdiuaSUZRr0S3I5MTHkCQOLjOqS0JN0,4299
         
     | 
| 
       210 
210 
     | 
    
         
             
            ultralytics/solutions/region_counter.py,sha256=LKZuykgmnevKKzYifyeHQwQroF7tJJIPI6HVXi5mb9M,5299
         
     | 
| 
       211 
211 
     | 
    
         
             
            ultralytics/solutions/security_alarm.py,sha256=KLP1R5qAFcmMliHfsuYNS_k-E1vGbOccLrzbmcpp4xQ,6254
         
     | 
| 
       212 
     | 
    
         
            -
            ultralytics/solutions/solutions.py,sha256= 
     | 
| 
      
 212 
     | 
    
         
            +
            ultralytics/solutions/solutions.py,sha256=LROzwtuNnpktuOmVWw82vItT_5mTaQSS_o7ZSi4zwtI,31771
         
     | 
| 
       213 
213 
     | 
    
         
             
            ultralytics/solutions/speed_estimation.py,sha256=Ewx389Z8sVL7NTEV7Hc9JbRBR0NMthGiIJk7-gyzD2Q,5149
         
     | 
| 
       214 
214 
     | 
    
         
             
            ultralytics/solutions/streamlit_inference.py,sha256=M0ppTFInqSPrdytZBLH8x-XoA7zFc7PaRQ51wHG9ppU,9846
         
     | 
| 
       215 
215 
     | 
    
         
             
            ultralytics/solutions/trackzone.py,sha256=05XVTQVCGHFAuFNPzyv0VXKQSJKiyWkU6zkXVo4_dxw,3792
         
     | 
| 
         @@ -233,14 +233,14 @@ ultralytics/utils/errors.py,sha256=vY9h2evFSrHnZdHJVVrmm8Zzw4qVDLyo9DeYW5g0dFk,1 
     | 
|
| 
       233 
233 
     | 
    
         
             
            ultralytics/utils/files.py,sha256=0K4O1cgqRiXaDw7EQK13TqA5SME_RrvfDVQSPetNr5w,8042
         
     | 
| 
       234 
234 
     | 
    
         
             
            ultralytics/utils/instance.py,sha256=UOEsXR9V-bXNRk6BTonASBEgeMqvzzAk4S7VdXZJUAM,18090
         
     | 
| 
       235 
235 
     | 
    
         
             
            ultralytics/utils/loss.py,sha256=us3lwmSlIwEzoMztNjpet7Kb1r1-sMGyESykqgYPDVo,36945
         
     | 
| 
       236 
     | 
    
         
            -
            ultralytics/utils/metrics.py,sha256= 
     | 
| 
      
 236 
     | 
    
         
            +
            ultralytics/utils/metrics.py,sha256=_b9StWmh0QuE4jAeNxhREdUbateJJieM98k1L1BD0Ek,53668
         
     | 
| 
       237 
237 
     | 
    
         
             
            ultralytics/utils/ops.py,sha256=Ag69Hvy8HxKLvewrtfQRseveboc_RGzlMYmO1B2U1Lk,34215
         
     | 
| 
       238 
238 
     | 
    
         
             
            ultralytics/utils/patches.py,sha256=auTWwYBieowiwH7ww1FgR67JSPkKr_7-PGA1SCYXB4A,4569
         
     | 
| 
       239 
239 
     | 
    
         
             
            ultralytics/utils/plotting.py,sha256=wAg_z9ik6Wi3XZCfKO2K6TWV1G0TcLEkjxxz2H42CX8,46703
         
     | 
| 
       240 
240 
     | 
    
         
             
            ultralytics/utils/tal.py,sha256=B-NV9qC3WIiKDcRWgJB2RN1r6aA0UUp0lL7RFwYhYK4,20814
         
     | 
| 
       241 
     | 
    
         
            -
            ultralytics/utils/torch_utils.py,sha256= 
     | 
| 
      
 241 
     | 
    
         
            +
            ultralytics/utils/torch_utils.py,sha256=7O0sJhISx3RzQI6uRtx2ZhJm-qNEYF359qXwQFL99pw,38894
         
     | 
| 
       242 
242 
     | 
    
         
             
            ultralytics/utils/triton.py,sha256=xK9Db_ZUVDnIK1u76S2G-6ulIBsLfj9HN_YOaSrnMuU,5304
         
     | 
| 
       243 
     | 
    
         
            -
            ultralytics/utils/tuner.py,sha256= 
     | 
| 
      
 243 
     | 
    
         
            +
            ultralytics/utils/tuner.py,sha256=JBarTM7E8AC6ZLfRf8XCE5s_nwzEAp-dU4wM9MKDQ5k,6476
         
     | 
| 
       244 
244 
     | 
    
         
             
            ultralytics/utils/callbacks/__init__.py,sha256=hzL63Rce6VkZhP4Lcim9LKjadixaQG86nKqPhk7IkS0,242
         
     | 
| 
       245 
245 
     | 
    
         
             
            ultralytics/utils/callbacks/base.py,sha256=p8YCeYDp4GLcyHWFZxC2Wxr2IXLw_MfIE5ef1fOQcWk,6848
         
     | 
| 
       246 
246 
     | 
    
         
             
            ultralytics/utils/callbacks/clearml.py,sha256=jxTL2QSt8Cjp_BkK2XUDPg5t2XnykMYXJFRp6B66ulA,6005
         
     | 
| 
         @@ -252,9 +252,9 @@ ultralytics/utils/callbacks/neptune.py,sha256=XXnnKQ-MoLIexl8y2Vb0i-cCLyePE0n5BU 
     | 
|
| 
       252 
252 
     | 
    
         
             
            ultralytics/utils/callbacks/raytune.py,sha256=omVZNNuzYxsZZXrF9xpbFv7R1Wjdx1j-gv0xXuZrQas,1122
         
     | 
| 
       253 
253 
     | 
    
         
             
            ultralytics/utils/callbacks/tensorboard.py,sha256=7eUX21_Ym7i6iN4euZzrqglphyl5xak1yl_-wfFshbg,5502
         
     | 
| 
       254 
254 
     | 
    
         
             
            ultralytics/utils/callbacks/wb.py,sha256=iDRFXI4IIDm8R5OI89DMTmjs8aHLo1HRCLkOFKdaMG4,7507
         
     | 
| 
       255 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
       256 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
       257 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
       258 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
       259 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
       260 
     | 
    
         
            -
            ultralytics-8.3. 
     | 
| 
      
 255 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
         
     | 
| 
      
 256 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/METADATA,sha256=x_z2b3rRWJiP_P8y0fEjNHXQHwrcDp04hEPb-rxCL8M,37355
         
     | 
| 
      
 257 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
         
     | 
| 
      
 258 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
         
     | 
| 
      
 259 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
         
     | 
| 
      
 260 
     | 
    
         
            +
            ultralytics-8.3.103.dist-info/RECORD,,
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     | 
| 
         
            File without changes
         
     |