dgenerate-ultralytics-headless 8.3.235__py3-none-any.whl → 8.3.236__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dgenerate-ultralytics-headless
3
- Version: 8.3.235
3
+ Version: 8.3.236
4
4
  Summary: Automatically built Ultralytics package with python-opencv-headless dependency instead of python-opencv
5
5
  Author-email: Glenn Jocher <glenn.jocher@ultralytics.com>, Jing Qiu <jing.qiu@ultralytics.com>
6
6
  Maintainer-email: Ultralytics <hello@ultralytics.com>
@@ -1,14 +1,14 @@
1
- dgenerate_ultralytics_headless-8.3.235.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
1
+ dgenerate_ultralytics_headless-8.3.236.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
2
2
  tests/__init__.py,sha256=bCox_hLdGRFYGLb2kd722VdNP2zEXNYNuLLYtqZSrbw,804
3
3
  tests/conftest.py,sha256=mOy9lGpNp7lk1hHl6_pVE0f9cU-72gnkoSm4TO-CNZU,2318
4
4
  tests/test_cli.py,sha256=GhIFHi-_WIJpDgoGNRi0DnjbfwP1wHbklBMnkCM-P_4,5464
5
5
  tests/test_cuda.py,sha256=eQew1rNwU3VViQCG6HZj5SWcYmWYop9gJ0jv9U1bGDE,8203
6
6
  tests/test_engine.py,sha256=ER2DsHM0GfUG99AH1Q-Lpm4x36qxkfOzxmH6uYM75ds,5722
7
- tests/test_exports.py,sha256=kqxFhnoLiBo52ELvOaKdtCquNwidPePNnVyzOzBtlPU,13278
7
+ tests/test_exports.py,sha256=9ssZCpseCUrvU0XRpjnJtBalQ-redG0KMVsx8E0_CVE,13987
8
8
  tests/test_integrations.py,sha256=6QgSh9n0J04RdUYz08VeVOnKmf4S5MDEQ0chzS7jo_c,6220
9
9
  tests/test_python.py,sha256=jhnN-Oie3euE3kfHzUqvnadkWOsQyvFmdmEcse9Rsto,29253
10
10
  tests/test_solutions.py,sha256=j_PZZ5tMR1Y5ararY-OTXZr1hYJ7vEVr8H3w4O1tbQs,14153
11
- ultralytics/__init__.py,sha256=UVZ5inCuP_m-FxKHu5U-6dseLjr2QPQ4CglZVbcGSVg,1302
11
+ ultralytics/__init__.py,sha256=YfGAlKifX1af2817bBbTxe8_ZHAk_kGtIH9wjV3-Sgw,1302
12
12
  ultralytics/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
13
13
  ultralytics/assets/bus.jpg,sha256=wCAZxJecGR63Od3ZRERe9Aja1Weayrb9Ug751DS_vGM,137419
14
14
  ultralytics/assets/zidane.jpg,sha256=Ftc4aeMmen1O0A3o6GCDO9FlfBslLpTAw0gnetx7bts,50427
@@ -123,7 +123,7 @@ ultralytics/data/scripts/get_coco.sh,sha256=UuJpJeo3qQpTHVINeOpmP0NYmg8PhEFE3A8J
123
123
  ultralytics/data/scripts/get_coco128.sh,sha256=qmRQl_hOKrsdHrTrnyQuFIH01oDz3lfaz138OgGfLt8,650
124
124
  ultralytics/data/scripts/get_imagenet.sh,sha256=hr42H16bM47iT27rgS7MpEo-GeOZAYUQXgr0B2cwn48,1705
125
125
  ultralytics/engine/__init__.py,sha256=lm6MckFYCPTbqIoX7w0s_daxdjNeBeKW6DXppv1-QUM,70
126
- ultralytics/engine/exporter.py,sha256=9LfvNStHKPfxAgzmth_4prkrBPylNmrCaDrxtT67k4k,68828
126
+ ultralytics/engine/exporter.py,sha256=2etpEPh_yufn9uyNO_tPoZZ4j7Cp1hEt05x7gN37PZo,72710
127
127
  ultralytics/engine/model.py,sha256=RkjMWXkyGmYjmMYIG8mPX8Cf1cJvn0ccOsXt03g7tIk,52999
128
128
  ultralytics/engine/predictor.py,sha256=eu0sVo3PTt4zKH6SntzdO1E8cgFj9PFOJrfQO6VNqCE,22698
129
129
  ultralytics/engine/results.py,sha256=zHPX3j36SnbHHRzAtF5wv_IhugEHf-zEPUqpQwdgZxA,68029
@@ -198,7 +198,7 @@ ultralytics/models/yolo/yoloe/train.py,sha256=giX6zDu5Z3z48PCaBHzu7v9NH3BrpUaGAY
198
198
  ultralytics/models/yolo/yoloe/train_seg.py,sha256=0hRByMXsEJA-J2B1wXDMVhiW9f9MOTj3LlrGTibN6Ww,4919
199
199
  ultralytics/models/yolo/yoloe/val.py,sha256=utUFWeFKRFWZrPr1y3A8ztbTwdoWMYqzlwBN7CQ0tCA,9418
200
200
  ultralytics/nn/__init__.py,sha256=538LZPUKKvc3JCMgiQ4VLGqRN2ZAaVLFcQbeNNHFkEA,545
201
- ultralytics/nn/autobackend.py,sha256=6LgQQyy3bKfVb7fKna6y6XKZfeQ3mFAApWJLhuw7l7Q,43017
201
+ ultralytics/nn/autobackend.py,sha256=v7jKSb84xbBCF9R6A3RBPC23aGqkAGcKmt-HX8JUIYc,44359
202
202
  ultralytics/nn/tasks.py,sha256=LBBrSENKAQ1kpRLavjQ4kbBgpCQPqiSkfOmxCt2xQIw,70467
203
203
  ultralytics/nn/text_model.py,sha256=doU80pYuhc7GYtALVN8ZjetMmdTJTheuIP65riKnT48,15358
204
204
  ultralytics/nn/modules/__init__.py,sha256=5Sg_28MDfKwdu14Ty_WCaiIXZyjBSQ-xCNCwnoz_w-w,3198
@@ -242,7 +242,7 @@ ultralytics/utils/__init__.py,sha256=mumSvouTfDk9SnlGPiZCiuO52rpIUh6dpUbV8MfJXKE
242
242
  ultralytics/utils/autobatch.py,sha256=jiE4m_--H9UkXFDm_FqzcZk_hSTCGpS72XdVEKgZwAo,5114
243
243
  ultralytics/utils/autodevice.py,sha256=rXlPuo-iX-vZ4BabmMGEGh9Uxpau4R7Zlt1KCo9Xfyc,8892
244
244
  ultralytics/utils/benchmarks.py,sha256=B6Q55qtZri2EWOKldXnEhGrFe2BjHsAQEt7juPN4m1s,32279
245
- ultralytics/utils/checks.py,sha256=lsuJfIY4_lZxccpYBCpvlxxcrqRgj5DM9fWnhBLD7N4,36298
245
+ ultralytics/utils/checks.py,sha256=6NVYaXC3owGDrSXyH9P_XiT43QcL1HKNio-C6342S-w,38092
246
246
  ultralytics/utils/cpu.py,sha256=OksKOlX93AsbSsFuoYvLXRXgpkOibrZSwQyW6lipt4Q,3493
247
247
  ultralytics/utils/dist.py,sha256=hOuY1-unhQAY-uWiZw3LWw36d1mqJuYK75NdlwB4oKE,4131
248
248
  ultralytics/utils/downloads.py,sha256=pUzi3N6-L--aLUbyIv2lU3zYtL84eSD-Z-PycwPLwuA,22883
@@ -259,7 +259,7 @@ ultralytics/utils/ops.py,sha256=RAyISErSCXYWpXiAvR41Xnf2sIqXyCwyFDQf3K5bmFc,2566
259
259
  ultralytics/utils/patches.py,sha256=Vf-s7WIGgCF00OG_kHPcEHCoLNnDvBKUSbI3XjzilIQ,7111
260
260
  ultralytics/utils/plotting.py,sha256=GGaUYgF8OoxcmyMwNTr82ER7cJZ3CUOjYeq-7vpHDGQ,48432
261
261
  ultralytics/utils/tal.py,sha256=w7oi6fp0NmL6hHh-yvCCX1cBuuB4JuX7w1wiR4_SMZs,20678
262
- ultralytics/utils/torch_utils.py,sha256=uSy-ZRWsHo_43c-pdaar-GXQu9wwjkp2qZmEiJjChfI,40218
262
+ ultralytics/utils/torch_utils.py,sha256=zOPUQlorTiEPSkqlSEPyaQhpmzmgOIKF7f3xJb0UjdQ,40268
263
263
  ultralytics/utils/tqdm.py,sha256=5PtGvRE9Xq8qugWqBSvZefAoFOnv3S0snETo5Z_ohNE,16185
264
264
  ultralytics/utils/triton.py,sha256=BQu3CD3OlT76d1OtmnX5slQU37VC1kzRvEtfI2saIQA,5211
265
265
  ultralytics/utils/tuner.py,sha256=rN8gFWnQOJFtrGlFcvOo0Eah9dEVFx0nFkpTGrlewZA,6861
@@ -279,8 +279,8 @@ ultralytics/utils/export/__init__.py,sha256=Cfh-PwVfTF_lwPp-Ss4wiX4z8Sm1XRPklsqd
279
279
  ultralytics/utils/export/engine.py,sha256=23-lC6dNsmz5vprSJzaN7UGNXrFlVedNcqhlOH_IXes,9956
280
280
  ultralytics/utils/export/imx.py,sha256=UHIq_PObOphIxctgSi0-5WaHvolHsHd3r5TTSjQSdgo,12860
281
281
  ultralytics/utils/export/tensorflow.py,sha256=PyAp0_rXSUcXiqV2RY0H9b_-oFaZ7hZBiSM42X53t0Q,9374
282
- dgenerate_ultralytics_headless-8.3.235.dist-info/METADATA,sha256=sSeR3Zs_4f1upP55HQC9sEW7RPaWRy9JTXKLoFUcG-w,38747
283
- dgenerate_ultralytics_headless-8.3.235.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
284
- dgenerate_ultralytics_headless-8.3.235.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
285
- dgenerate_ultralytics_headless-8.3.235.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
286
- dgenerate_ultralytics_headless-8.3.235.dist-info/RECORD,,
282
+ dgenerate_ultralytics_headless-8.3.236.dist-info/METADATA,sha256=i7ZK9XL9rN6NRZX1EJl23HuEAJTF7NtqDRwPqnfaUe0,38747
283
+ dgenerate_ultralytics_headless-8.3.236.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
284
+ dgenerate_ultralytics_headless-8.3.236.dist-info/entry_points.txt,sha256=YM_wiKyTe9yRrsEfqvYolNO5ngwfoL4-NwgKzc8_7sI,93
285
+ dgenerate_ultralytics_headless-8.3.236.dist-info/top_level.txt,sha256=XP49TwiMw4QGsvTLSYiJhz1xF_k7ev5mQ8jJXaXi45Q,12
286
+ dgenerate_ultralytics_headless-8.3.236.dist-info/RECORD,,
tests/test_exports.py CHANGED
@@ -13,7 +13,7 @@ from tests import MODEL, SOURCE
13
13
  from ultralytics import YOLO
14
14
  from ultralytics.cfg import TASK2DATA, TASK2MODEL, TASKS
15
15
  from ultralytics.utils import ARM64, IS_RASPBERRYPI, LINUX, MACOS, WINDOWS, checks
16
- from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_9
16
+ from ultralytics.utils.torch_utils import TORCH_1_11, TORCH_1_13, TORCH_2_1, TORCH_2_8, TORCH_2_9
17
17
 
18
18
 
19
19
  def test_export_torchscript():
@@ -259,6 +259,20 @@ def test_export_imx():
259
259
  YOLO(file)(SOURCE, imgsz=32)
260
260
 
261
261
 
262
+ @pytest.mark.slow
263
+ @pytest.mark.skipif(not TORCH_2_8, reason="Axelera export requires torch>=2.8.0")
264
+ @pytest.mark.skipif(not LINUX, reason="Axelera export only supported on Linux")
265
+ @pytest.mark.skipif(not checks.IS_PYTHON_3_10, reason="Axelera export requires Python 3.10")
266
+ def test_export_axelera():
267
+ """Test YOLO export to Axelera format."""
268
+ model = YOLO(MODEL)
269
+ # For faster testing, use a smaller calibration dataset
270
+ # 32 image size crashes axelera export, so use 64
271
+ file = model.export(format="axelera", imgsz=64, data="coco8.yaml")
272
+ assert Path(file).exists(), f"Axelera export failed, directory not found: {file}"
273
+ shutil.rmtree(file, ignore_errors=True) # cleanup
274
+
275
+
262
276
  @pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10 or not TORCH_2_9, reason="Requires Python>=3.10 and Torch>=2.9.0")
263
277
  @pytest.mark.skipif(WINDOWS, reason="Skipping test on Windows")
264
278
  def test_export_executorch():
ultralytics/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
2
2
 
3
- __version__ = "8.3.235"
3
+ __version__ = "8.3.236"
4
4
 
5
5
  import importlib
6
6
  import os
@@ -21,6 +21,7 @@ NCNN | `ncnn` | yolo11n_ncnn_model/
21
21
  IMX | `imx` | yolo11n_imx_model/
22
22
  RKNN | `rknn` | yolo11n_rknn_model/
23
23
  ExecuTorch | `executorch` | yolo11n_executorch_model/
24
+ Axelera | `axelera` | yolo11n_axelera_model/
24
25
 
25
26
  Requirements:
26
27
  $ pip install "ultralytics[export]"
@@ -50,6 +51,7 @@ Inference:
50
51
  yolo11n_imx_model # IMX
51
52
  yolo11n_rknn_model # RKNN
52
53
  yolo11n_executorch_model # ExecuTorch
54
+ yolo11n_axelera_model # Axelera
53
55
 
54
56
  TensorFlow.js:
55
57
  $ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example
@@ -103,7 +105,9 @@ from ultralytics.utils import (
103
105
  get_default_args,
104
106
  )
105
107
  from ultralytics.utils.checks import (
108
+ IS_PYTHON_3_10,
106
109
  IS_PYTHON_MINIMUM_3_9,
110
+ check_apt_requirements,
107
111
  check_imgsz,
108
112
  check_requirements,
109
113
  check_version,
@@ -161,6 +165,7 @@ def export_formats():
161
165
  ["IMX", "imx", "_imx_model", True, True, ["int8", "fraction", "nms"]],
162
166
  ["RKNN", "rknn", "_rknn_model", False, False, ["batch", "name"]],
163
167
  ["ExecuTorch", "executorch", "_executorch_model", True, False, ["batch"]],
168
+ ["Axelera", "axelera", "_axelera_model", False, False, ["batch", "int8"]],
164
169
  ]
165
170
  return dict(zip(["Format", "Argument", "Suffix", "CPU", "GPU", "Arguments"], zip(*x)))
166
171
 
@@ -340,6 +345,7 @@ class Exporter:
340
345
  imx,
341
346
  rknn,
342
347
  executorch,
348
+ axelera,
343
349
  ) = flags # export booleans
344
350
 
345
351
  is_tf_format = any((saved_model, pb, tflite, edgetpu, tfjs))
@@ -361,6 +367,14 @@ class Exporter:
361
367
  # Argument compatibility checks
362
368
  fmt_keys = fmts_dict["Arguments"][flags.index(True) + 1]
363
369
  validate_args(fmt, self.args, fmt_keys)
370
+ if axelera:
371
+ if not IS_PYTHON_3_10:
372
+ SystemError("Axelera export only supported on Python 3.10.")
373
+ if not self.args.int8:
374
+ LOGGER.warning("Setting int8=True for Axelera mixed-precision export.")
375
+ self.args.int8 = True
376
+ if model.task not in {"detect"}:
377
+ raise ValueError("Axelera export only supported for detection models.")
364
378
  if imx:
365
379
  if not self.args.int8:
366
380
  LOGGER.warning("IMX export requires int8=True, setting int8=True.")
@@ -426,7 +440,10 @@ class Exporter:
426
440
  )
427
441
  model.clip_model = None # openvino int8 export error: https://github.com/ultralytics/ultralytics/pull/18445
428
442
  if self.args.int8 and not self.args.data:
429
- self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
443
+ if axelera:
444
+ self.args.data = "coco128.yaml" # Axelera default to coco128.yaml
445
+ else:
446
+ self.args.data = DEFAULT_CFG.data or TASK2DATA[getattr(model, "task", "detect")] # assign default data
430
447
  LOGGER.warning(
431
448
  f"INT8 export requires a missing 'data' arg for calibration. Using default 'data={self.args.data}'."
432
449
  )
@@ -565,6 +582,8 @@ class Exporter:
565
582
  f[14] = self.export_rknn()
566
583
  if executorch:
567
584
  f[15] = self.export_executorch()
585
+ if axelera:
586
+ f[16] = self.export_axelera()
568
587
 
569
588
  # Finish
570
589
  f = [str(x) for x in f if x] # filter out '' and None
@@ -610,7 +629,9 @@ class Exporter:
610
629
  f"The calibration dataset ({n} images) must have at least as many images as the batch size "
611
630
  f"('batch={self.args.batch}')."
612
631
  )
613
- elif n < 300:
632
+ elif self.args.format == "axelera" and n < 100:
633
+ LOGGER.warning(f"{prefix} >100 images required for Axelera calibration, found {n} images.")
634
+ elif self.args.format != "axelera" and n < 300:
614
635
  LOGGER.warning(f"{prefix} >300 images recommended for INT8 calibration, found {n} images.")
615
636
  return build_dataloader(dataset, batch=self.args.batch, workers=0, drop_last=True) # required for batch loading
616
637
 
@@ -1080,6 +1101,79 @@ class Exporter:
1080
1101
  f = saved_model / f"{self.file.stem}_float32.tflite"
1081
1102
  return str(f)
1082
1103
 
1104
+ @try_export
1105
+ def export_axelera(self, prefix=colorstr("Axelera:")):
1106
+ """YOLO Axelera export."""
1107
+ os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python"
1108
+ try:
1109
+ from axelera import compiler
1110
+ except ImportError:
1111
+ check_apt_requirements(
1112
+ ["libllvm14", "libgirepository1.0-dev", "pkg-config", "libcairo2-dev", "build-essential", "cmake"]
1113
+ )
1114
+
1115
+ check_requirements(
1116
+ "axelera-voyager-sdk==1.5.2",
1117
+ cmds="--extra-index-url https://software.axelera.ai/artifactory/axelera-runtime-pypi "
1118
+ "--extra-index-url https://software.axelera.ai/artifactory/axelera-dev-pypi",
1119
+ )
1120
+
1121
+ from axelera import compiler
1122
+ from axelera.compiler import CompilerConfig
1123
+
1124
+ self.args.opset = 17
1125
+ onnx_path = self.export_onnx()
1126
+ model_name = f"{Path(onnx_path).stem}"
1127
+ export_path = Path(f"{model_name}_axelera_model")
1128
+ export_path.mkdir(exist_ok=True)
1129
+
1130
+ def transform_fn(data_item) -> np.ndarray:
1131
+ data_item: torch.Tensor = data_item["img"] if isinstance(data_item, dict) else data_item
1132
+ assert data_item.dtype == torch.uint8, "Input image must be uint8 for the quantization preprocessing"
1133
+ im = data_item.numpy().astype(np.float32) / 255.0 # uint8 to fp16/32 and 0 - 255 to 0.0 - 1.0
1134
+ return np.expand_dims(im, 0) if im.ndim == 3 else im
1135
+
1136
+ if "C2PSA" in self.model.__str__(): # YOLO11
1137
+ config = CompilerConfig(
1138
+ quantization_scheme="per_tensor_min_max",
1139
+ ignore_weight_buffers=False,
1140
+ resources_used=0.25,
1141
+ aipu_cores_used=1,
1142
+ multicore_mode="batch",
1143
+ output_axm_format=True,
1144
+ model_name=model_name,
1145
+ )
1146
+ else: # YOLOv8
1147
+ config = CompilerConfig(
1148
+ tiling_depth=6,
1149
+ split_buffer_promotion=True,
1150
+ resources_used=0.25,
1151
+ aipu_cores_used=1,
1152
+ multicore_mode="batch",
1153
+ output_axm_format=True,
1154
+ model_name=model_name,
1155
+ )
1156
+
1157
+ qmodel = compiler.quantize(
1158
+ model=onnx_path,
1159
+ calibration_dataset=self.get_int8_calibration_dataloader(prefix),
1160
+ config=config,
1161
+ transform_fn=transform_fn,
1162
+ )
1163
+
1164
+ compiler.compile(model=qmodel, config=config, output_dir=export_path)
1165
+
1166
+ axm_name = f"{model_name}.axm"
1167
+ axm_src = Path(axm_name)
1168
+ axm_dst = export_path / axm_name
1169
+
1170
+ if axm_src.exists():
1171
+ axm_src.replace(axm_dst)
1172
+
1173
+ YAML.save(export_path / "metadata.yaml", self.metadata)
1174
+
1175
+ return export_path
1176
+
1083
1177
  @try_export
1084
1178
  def export_executorch(self, prefix=colorstr("ExecuTorch:")):
1085
1179
  """Exports a model to ExecuTorch (.pte) format into a dedicated directory and saves the required metadata,
@@ -95,6 +95,7 @@ class AutoBackend(nn.Module):
95
95
  | RKNN | *_rknn_model/ |
96
96
  | Triton Inference | triton://model |
97
97
  | ExecuTorch | *.pte |
98
+ | Axelera | *_axelera_model/ |
98
99
 
99
100
  Attributes:
100
101
  model (torch.nn.Module): The loaded YOLO model.
@@ -122,6 +123,7 @@ class AutoBackend(nn.Module):
122
123
  rknn (bool): Whether the model is an RKNN model.
123
124
  triton (bool): Whether the model is a Triton Inference Server model.
124
125
  pte (bool): Whether the model is a PyTorch ExecuTorch model.
126
+ axelera (bool): Whether the model is an Axelera model.
125
127
 
126
128
  Methods:
127
129
  forward: Run inference on an input image.
@@ -176,6 +178,7 @@ class AutoBackend(nn.Module):
176
178
  imx,
177
179
  rknn,
178
180
  pte,
181
+ axelera,
179
182
  triton,
180
183
  ) = self._model_type("" if nn_module else model)
181
184
  fp16 &= pt or jit or onnx or xml or engine or nn_module or triton # FP16
@@ -570,6 +573,33 @@ class AutoBackend(nn.Module):
570
573
  rknn_model.init_runtime()
571
574
  metadata = w.parent / "metadata.yaml"
572
575
 
576
+ # Axelera
577
+ elif axelera:
578
+ import os
579
+
580
+ if not os.environ.get("AXELERA_RUNTIME_DIR"):
581
+ LOGGER.warning(
582
+ "Axelera runtime environment is not activated."
583
+ "\nPlease run: source /opt/axelera/sdk/latest/axelera_activate.sh"
584
+ "\n\nIf this fails, verify driver installation: https://docs.ultralytics.com/integrations/axelera/#axelera-driver-installation"
585
+ )
586
+ try:
587
+ from axelera.runtime import op
588
+ except ImportError:
589
+ check_requirements(
590
+ "axelera_runtime2==0.1.2",
591
+ cmds="--extra-index-url https://software.axelera.ai/artifactory/axelera-runtime-pypi",
592
+ )
593
+ from axelera.runtime import op
594
+
595
+ w = Path(w)
596
+ if (found := next(w.rglob("*.axm"), None)) is None:
597
+ raise FileNotFoundError(f"No .axm file found in: {w}")
598
+ w = found
599
+
600
+ ax_model = op.load(str(w))
601
+ metadata = w.parent / "metadata.yaml"
602
+
573
603
  # ExecuTorch
574
604
  elif pte:
575
605
  LOGGER.info(f"Loading {w} for ExecuTorch inference...")
@@ -796,6 +826,11 @@ class AutoBackend(nn.Module):
796
826
  im = im if isinstance(im, (list, tuple)) else [im]
797
827
  y = self.rknn_model.inference(inputs=im)
798
828
 
829
+ # Axelera
830
+ elif self.axelera:
831
+ im = im.cpu()
832
+ y = self.ax_model(im)
833
+
799
834
  # ExecuTorch
800
835
  elif self.pte:
801
836
  y = self.model.execute([im])
@@ -350,6 +350,46 @@ def check_python(minimum: str = "3.8.0", hard: bool = True, verbose: bool = Fals
350
350
  return check_version(PYTHON_VERSION, minimum, name="Python", hard=hard, verbose=verbose)
351
351
 
352
352
 
353
+ @TryExcept()
354
+ def check_apt_requirements(requirements):
355
+ """Check if apt packages are installed and install missing ones.
356
+
357
+ Args:
358
+ requirements: List of apt package names to check and install
359
+ """
360
+ prefix = colorstr("red", "bold", "apt requirements:")
361
+ # Check which packages are missing
362
+ missing_packages = []
363
+ for package in requirements:
364
+ try:
365
+ # Use dpkg -l to check if package is installed
366
+ result = subprocess.run(["dpkg", "-l", package], capture_output=True, text=True, check=False)
367
+ # Check if package is installed (look for "ii" status)
368
+ if result.returncode != 0 or not any(
369
+ line.startswith("ii") and package in line for line in result.stdout.splitlines()
370
+ ):
371
+ missing_packages.append(package)
372
+ except Exception:
373
+ # If check fails, assume package is not installed
374
+ missing_packages.append(package)
375
+
376
+ # Install missing packages if any
377
+ if missing_packages:
378
+ LOGGER.info(
379
+ f"{prefix} Ultralytics requirement{'s' * (len(missing_packages) > 1)} {missing_packages} not found, attempting AutoUpdate..."
380
+ )
381
+ # Optionally update package list first
382
+ if is_sudo_available():
383
+ subprocess.run(["sudo", "apt", "update"], check=False)
384
+
385
+ # Build and run the install command
386
+ cmd = (["sudo"] if is_sudo_available() else []) + ["apt", "install", "-y"] + missing_packages
387
+ result = subprocess.run(cmd, check=True, capture_output=True, text=True)
388
+
389
+ LOGGER.info(f"{prefix} AutoUpdate success ✅")
390
+ LOGGER.warning(f"{prefix} {colorstr('bold', 'Restart runtime or rerun command for updates to take effect')}\n")
391
+
392
+
353
393
  @TryExcept()
354
394
  def check_requirements(requirements=ROOT.parent / "requirements.txt", exclude=(), install=True, cmds=""):
355
395
  """Check if installed dependencies meet Ultralytics YOLO models requirements and attempt to auto-update if needed.
@@ -948,6 +988,7 @@ check_torchvision() # check torch-torchvision compatibility
948
988
  # Define constants
949
989
  IS_PYTHON_3_8 = PYTHON_VERSION.startswith("3.8")
950
990
  IS_PYTHON_3_9 = PYTHON_VERSION.startswith("3.9")
991
+ IS_PYTHON_3_10 = PYTHON_VERSION.startswith("3.10")
951
992
  IS_PYTHON_3_12 = PYTHON_VERSION.startswith("3.12")
952
993
  IS_PYTHON_3_13 = PYTHON_VERSION.startswith("3.13")
953
994
 
@@ -44,6 +44,7 @@ TORCH_1_13 = check_version(TORCH_VERSION, "1.13.0")
44
44
  TORCH_2_0 = check_version(TORCH_VERSION, "2.0.0")
45
45
  TORCH_2_1 = check_version(TORCH_VERSION, "2.1.0")
46
46
  TORCH_2_4 = check_version(TORCH_VERSION, "2.4.0")
47
+ TORCH_2_8 = check_version(TORCH_VERSION, "2.8.0")
47
48
  TORCH_2_9 = check_version(TORCH_VERSION, "2.9.0")
48
49
  TORCHVISION_0_10 = check_version(TORCHVISION_VERSION, "0.10.0")
49
50
  TORCHVISION_0_11 = check_version(TORCHVISION_VERSION, "0.11.0")