From 4922016901c9dad258acf57b233f318c7d3305f7 Mon Sep 17 00:00:00 2001 From: Glenn Jocher Date: Mon, 13 Jan 2025 21:13:27 +0100 Subject: [PATCH] `ultralytics 8.3.61` Restore Python 3.8 compatibility (#18666) Signed-off-by: Glenn Jocher Co-authored-by: UltralyticsAssistant --- .github/workflows/ci.yaml | 5 ++--- ultralytics/__init__.py | 2 +- ultralytics/models/sam/model.py | 2 +- ultralytics/models/sam/modules/utils.py | 2 +- ultralytics/models/utils/loss.py | 7 ++++--- ultralytics/solutions/streamlit_inference.py | 2 +- ultralytics/utils/__init__.py | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b457baf3..fd969409 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -39,8 +39,7 @@ on: jobs: HUB: - # if: github.repository == 'ultralytics/ultralytics' && (github.event_name == 'schedule' || github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.hub == 'true')) - if: github.repository == 'ultralytics/ultralytics' && 'workflow_dispatch' && github.event.inputs.hub == 'true' + if: github.repository == 'ultralytics/ultralytics' && (github.event_name == 'schedule' || github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.hub == 'true')) runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -165,7 +164,7 @@ jobs: torch: [latest] include: - os: ubuntu-latest - python-version: "3.9" # torch 1.8.0 requires python >=3.6, <=3.9 + python-version: "3.8" # torch 1.8.0 requires python >=3.6, <=3.9 torch: "1.8.0" # min torch version CI https://pypi.org/project/torchvision/ steps: - uses: actions/checkout@v4 diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py index d96c5e83..67d53341 100644 --- a/ultralytics/__init__.py +++ b/ultralytics/__init__.py @@ -1,6 +1,6 @@ # Ultralytics YOLO 🚀, AGPL-3.0 license -__version__ = "8.3.60" +__version__ = "8.3.61" import os diff --git a/ultralytics/models/sam/model.py b/ultralytics/models/sam/model.py index 48816d6b..97349a66 100644 --- a/ultralytics/models/sam/model.py +++ b/ultralytics/models/sam/model.py @@ -106,7 +106,7 @@ class SAM(Model): ... print(f"Detected {len(r.masks)} masks") """ overrides = dict(conf=0.25, task="segment", mode="predict", imgsz=1024) - kwargs = overrides | kwargs + kwargs = {**overrides, **kwargs} prompts = dict(bboxes=bboxes, points=points, labels=labels) return super().predict(source, stream, prompts=prompts, **kwargs) diff --git a/ultralytics/models/sam/modules/utils.py b/ultralytics/models/sam/modules/utils.py index 36eb9de7..8bfb1376 100644 --- a/ultralytics/models/sam/modules/utils.py +++ b/ultralytics/models/sam/modules/utils.py @@ -54,7 +54,7 @@ def select_closest_cond_frames(frame_idx, cond_frame_outputs, max_cond_frame_num (t for t in cond_frame_outputs if t not in selected_outputs), key=lambda x: abs(x - frame_idx), )[:num_remain] - selected_outputs |= ((t, cond_frame_outputs[t]) for t in inds_remain) + selected_outputs.update((t, cond_frame_outputs[t]) for t in inds_remain) unselected_outputs = {t: v for t, v in cond_frame_outputs.items() if t not in selected_outputs} return selected_outputs, unselected_outputs diff --git a/ultralytics/models/utils/loss.py b/ultralytics/models/utils/loss.py index a816ac93..54aed909 100644 --- a/ultralytics/models/utils/loss.py +++ b/ultralytics/models/utils/loss.py @@ -243,9 +243,10 @@ class DETRLoss(nn.Module): if len(gt_bboxes): gt_scores[idx] = bbox_iou(pred_bboxes.detach(), gt_bboxes, xywh=True).squeeze(-1) - loss = {} - loss |= self._get_loss_class(pred_scores, targets, gt_scores, len(gt_bboxes), postfix) - loss.update(self._get_loss_bbox(pred_bboxes, gt_bboxes, postfix)) + loss = { + **self._get_loss_class(pred_scores, targets, gt_scores, len(gt_bboxes), postfix), + **self._get_loss_bbox(pred_bboxes, gt_bboxes, postfix), + } # if masks is not None and gt_mask is not None: # loss.update(self._get_loss_mask(masks, gt_mask, match_indices, postfix)) return loss diff --git a/ultralytics/solutions/streamlit_inference.py b/ultralytics/solutions/streamlit_inference.py index c398acfd..fe56a3a4 100644 --- a/ultralytics/solutions/streamlit_inference.py +++ b/ultralytics/solutions/streamlit_inference.py @@ -62,7 +62,7 @@ class Inference: self.selected_ind = [] # List of selected classes for detection or tracking self.model = None # Container for the loaded model instance - self.temp_dict = {"model": None} | kwargs + self.temp_dict = {"model": None, **kwargs} self.model_path = None # Store model file name with path if self.temp_dict["model"] is not None: self.model_path = self.temp_dict["model"] diff --git a/ultralytics/utils/__init__.py b/ultralytics/utils/__init__.py index 0008f808..f5ff78c1 100644 --- a/ultralytics/utils/__init__.py +++ b/ultralytics/utils/__init__.py @@ -1243,7 +1243,7 @@ class SettingsManager(JSONDict): """Updates settings, validating keys and types.""" for arg in args: if isinstance(arg, dict): - kwargs |= arg + kwargs.update(arg) for k, v in kwargs.items(): if k not in self.defaults: raise KeyError(f"No Ultralytics setting '{k}'. {self.help_msg}")