diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 41e66f37..9b354d1a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -206,11 +206,16 @@ jobs: run: | # CoreML must be installed before export due to protobuf error from AutoInstall python -m pip install --upgrade pip wheel + slow="" torch="" if [ "${{ matrix.torch }}" == "1.8.0" ]; then torch="torch==1.8.0 torchvision==0.9.0" fi - pip install -e . $torch pytest-cov "coremltools>=7.0; platform_system != 'Windows' and python_version <= '3.11'" --extra-index-url https://download.pytorch.org/whl/cpu + if [[ "${{ github.event_name }}" =~ ^(schedule|workflow_dispatch)$ ]]; then + slow="pycocotools mlflow ray[tune]" + fi + slow="pycocotools mlflow ray[tune]" + pip install -e ".[export]" $torch $slow pytest-cov --extra-index-url https://download.pytorch.org/whl/cpu - name: Check environment run: | yolo checks @@ -220,7 +225,6 @@ jobs: run: | slow="" if [[ "${{ github.event_name }}" =~ ^(schedule|workflow_dispatch)$ ]]; then - pip install pycocotools mlflow "ray[tune]" slow="--slow" fi pytest $slow --cov=ultralytics/ --cov-report xml tests/ @@ -272,7 +276,7 @@ jobs: - name: Install requirements run: | python -m pip install --upgrade pip wheel - pip install --no-cache-dir -e ".[export]" pytest mlflow pycocotools "ray[tune]" + pip install -e ".[export]" pytest mlflow pycocotools "ray[tune]" - name: Check environment run: | yolo checks diff --git a/docs/en/guides/analytics.md b/docs/en/guides/analytics.md index 5b26e016..69a04671 100644 --- a/docs/en/guides/analytics.md +++ b/docs/en/guides/analytics.md @@ -16,14 +16,14 @@ This guide provides a comprehensive overview of three fundamental types of data |:------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------------------------:| |  |  |  | -### Why Graphs are Important +### Why Graphs are Important -- Line graphs are ideal for tracking changes over short and long periods and for comparing changes for multiple groups over the same period. -- Bar plots, on the other hand, are suitable for comparing quantities across different categories and showing relationships between a category and its numerical value. +- Line graphs are ideal for tracking changes over short and long periods and for comparing changes for multiple groups over the same period. +- Bar plots, on the other hand, are suitable for comparing quantities across different categories and showing relationships between a category and its numerical value. - Lastly, pie charts are effective for illustrating proportions among categories and showing parts of a whole. !!! Analytics "Analytics Examples" - + === "Line Graph" ```python @@ -174,21 +174,21 @@ This guide provides a comprehensive overview of three fundamental types of data Here's a table with the `Analytics` arguments: -| Name | Type | Default | Description | -|--------------|-------------------|---------------|---------------------------------------------| -| `type` | `str` | `None` | Type of data or object. | -| `im0_shape` | `tuple` | `None` | Shape of the initial image. | -| `writer` | `cv2.VideoWriter` | `None` | Object for writing video files. | -| `title` | `str` | `ultralytics` | Title for the visualization. | -| `x_label` | `str` | `x` | Label for the x-axis. | -| `y_label` | `str` | `y` | Label for the y-axis. | -| `bg_color` | `str` | `white` | Background color. | -| `fg_color` | `str` | `black` | Foreground color. | -| `line_color` | `str` | `yellow` | Color of the lines. | -| `line_width` | `int` | `2` | Width of the lines. | -| `fontsize` | `int` | `13` | Font size for text. | -| `view_img` | `bool` | `False` | Flag to display the image or video. | -| `save_img` | `bool` | `True` | Flag to save the image or video. | +| Name | Type | Default | Description | +|--------------|-------------------|---------------|-------------------------------------| +| `type` | `str` | `None` | Type of data or object. | +| `im0_shape` | `tuple` | `None` | Shape of the initial image. | +| `writer` | `cv2.VideoWriter` | `None` | Object for writing video files. | +| `title` | `str` | `ultralytics` | Title for the visualization. | +| `x_label` | `str` | `x` | Label for the x-axis. | +| `y_label` | `str` | `y` | Label for the y-axis. | +| `bg_color` | `str` | `white` | Background color. | +| `fg_color` | `str` | `black` | Foreground color. | +| `line_color` | `str` | `yellow` | Color of the lines. | +| `line_width` | `int` | `2` | Width of the lines. | +| `fontsize` | `int` | `13` | Font size for text. | +| `view_img` | `bool` | `False` | Flag to display the image or video. | +| `save_img` | `bool` | `True` | Flag to save the image or video. | ### Arguments `model.track` diff --git a/docs/en/guides/defining-project-goals.md b/docs/en/guides/defining-project-goals.md index 0827ca17..16ef6dc6 100644 --- a/docs/en/guides/defining-project-goals.md +++ b/docs/en/guides/defining-project-goals.md @@ -37,12 +37,12 @@ Primary users include traffic management authorities and law enforcement, while ### Setting Measurable Objectives -Setting measurable objectives is key to the success of a computer vision project. These goals should be clear, achievable, and time-bound. +Setting measurable objectives is key to the success of a computer vision project. These goals should be clear, achievable, and time-bound. For example, if you are developing a system to estimate vehicle speeds on a highway. You could consider the following measurable objectives: -- To achieve at least 95% accuracy in speed detection within six months, using a dataset of 10,000 vehicle images. -- The system should be able to process real-time video feeds at 30 frames per second with minimal delay. +- To achieve at least 95% accuracy in speed detection within six months, using a dataset of 10,000 vehicle images. +- The system should be able to process real-time video feeds at 30 frames per second with minimal delay. By setting specific and quantifiable goals, you can effectively track progress, identify areas for improvement, and ensure the project stays on course. @@ -50,7 +50,7 @@ By setting specific and quantifiable goals, you can effectively track progress, Your problem statement helps you conceptualize which computer vision task can solve your issue. -For example, if your problem is monitoring vehicle speeds on a highway, the relevant computer vision task is object tracking. [Object tracking](../modes/track.md) is suitable because it allows the system to continuously follow each vehicle in the video feed, which is crucial for accurately calculating their speeds. +For example, if your problem is monitoring vehicle speeds on a highway, the relevant computer vision task is object tracking. [Object tracking](../modes/track.md) is suitable because it allows the system to continuously follow each vehicle in the video feed, which is crucial for accurately calculating their speeds.
@@ -134,7 +134,7 @@ Connecting with other computer vision enthusiasts can be incredibly helpful for
### Comprehensive Guides and Documentation
-- **Ultralytics YOLOv8 Documentation:** Explore the [official YOLOv8 documentation](./index.md) for in-depth guides and valuable tips on various computer vision tasks and projects.
+- **Ultralytics YOLOv8 Documentation:** Explore the [official YOLOv8 documentation](./index.md) for in-depth guides and valuable tips on various computer vision tasks and projects.
## Conclusion
diff --git a/docs/en/guides/steps-of-a-cv-project.md b/docs/en/guides/steps-of-a-cv-project.md
index 69db88ec..a8bcffa9 100644
--- a/docs/en/guides/steps-of-a-cv-project.md
+++ b/docs/en/guides/steps-of-a-cv-project.md
@@ -8,7 +8,7 @@ keywords: Computer Vision Steps, How Does Computer Vision Work, Computer Vision
## Introduction
-Computer vision is a subfield of artificial intelligence (AI) that helps computers see and understand the world like humans do. It processes and analyzes images or videos to extract information, recognize patterns, and make decisions based on that data.
+Computer vision is a subfield of artificial intelligence (AI) that helps computers see and understand the world like humans do. It processes and analyzes images or videos to extract information, recognize patterns, and make decisions based on that data.
Computer vision techniques like [object detection](../tasks/detect.md), [image classification](../tasks/classify.md), and [instance segmentation](../tasks/segment.md) can be applied across various industries, from [autonomous driving](https://www.ultralytics.com/solutions/ai-in-self-driving) to [medical imaging](https://www.ultralytics.com/solutions/ai-in-healthcare), to gain valuable insights.
@@ -16,7 +16,7 @@ Computer vision techniques like [object detection](../tasks/detect.md), [image c
@@ -117,7 +117,7 @@ By properly understanding, splitting, and augmenting your data, you can develop
## Step 4: Model Training
-Once your dataset is ready for training, you can focus on setting up the necessary environment, managing your datasets, and training your model.
+Once your dataset is ready for training, you can focus on setting up the necessary environment, managing your datasets, and training your model.
First, you’ll need to make sure your environment is configured correctly. Typically, this includes the following:
@@ -141,7 +141,7 @@ It’s important to assess your model's performance using various metrics and re
## Step 6: Model Testing
-In this step, you can make sure that your model performs well on completely unseen data, confirming its readiness for deployment. The difference between model testing and model evaluation is that it focuses on verifying the final model's performance rather than iteratively improving it.
+In this step, you can make sure that your model performs well on completely unseen data, confirming its readiness for deployment. The difference between model testing and model evaluation is that it focuses on verifying the final model's performance rather than iteratively improving it.
It's important to thoroughly test and debug any common issues that may arise. Test your model on a separate test dataset that was not used during training or validation. This dataset should represent real-world scenarios to ensure the model's performance is consistent and reliable.
diff --git a/pyproject.toml b/pyproject.toml
index a18fe9ac..9bbc9caf 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -100,8 +100,9 @@ export = [
"onnx>=1.12.0", # ONNX export
"coremltools>=7.0; platform_system != 'Windows' and python_version <= '3.11'", # CoreML supported on macOS and Linux
"openvino>=2024.0.0", # OpenVINO export
- "tensorflow<=2.13.1; python_version <= '3.11'", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
- "tensorflowjs>=3.9.0; python_version <= '3.11'", # TF.js export, automatically installs tensorflow
+ "tensorflow>=2.0.0", # TF bug https://github.com/ultralytics/ultralytics/issues/5161
+ "tensorflowjs>=3.9.0", # TF.js export, automatically installs tensorflow
+ "keras", # not installed auotomatically by tensorflow>=2.16
"flatbuffers>=23.5.26,<100; platform_machine == 'aarch64'", # update old 'flatbuffers' included inside tensorflow package
"numpy==1.23.5; platform_machine == 'aarch64'", # fix error: `np.bool` was a deprecated alias for the builtin `bool` when using TensorRT models on NVIDIA Jetson
"h5py!=3.11.0; platform_machine == 'aarch64'", # fix h5py build issues due to missing aarch64 wheels in 3.11 release
@@ -111,7 +112,6 @@ explorer = [
"duckdb<=0.9.2", # SQL queries, duckdb==0.10.0 bug https://github.com/ultralytics/ultralytics/pull/8181
"streamlit", # visualizing with GUI
]
-# tensorflow>=2.4.1,<=2.13.1 # TF exports (-cpu, -aarch64, -macos)
# tflite-support # for TFLite model metadata
# nvidia-pyindex # TensorRT export
# nvidia-tensorrt # TensorRT export
diff --git a/tests/test_exports.py b/tests/test_exports.py
index 8ea0b7c8..58c6bdba 100644
--- a/tests/test_exports.py
+++ b/tests/test_exports.py
@@ -129,6 +129,31 @@ def test_export_coreml_matrix(task, dynamic, int8, half, batch):
shutil.rmtree(file) # cleanup
+@pytest.mark.slow
+@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10, reason="TFLite export requires Python>=3.10")
+@pytest.mark.skipif(not LINUX, reason="Test disabled as TF suffers from install conflicts on Windows and macOS")
+@pytest.mark.parametrize(
+ "task, dynamic, int8, half, batch",
+ [ # generate all combinations but exclude those where both int8 and half are True
+ (task, dynamic, int8, half, batch)
+ for task, dynamic, int8, half, batch in product(TASKS, [False], [True, False], [True, False], [1])
+ if not (int8 and half) # exclude cases where both int8 and half are True
+ ],
+)
+def test_export_tflite_matrix(task, dynamic, int8, half, batch):
+ """Test YOLO exports to TFLite format."""
+ file = YOLO(TASK2MODEL[task]).export(
+ format="tflite",
+ imgsz=32,
+ dynamic=dynamic,
+ int8=int8,
+ half=half,
+ batch=batch,
+ )
+ YOLO(file)([SOURCE] * batch, imgsz=32) # exported model inference at batch=3
+ Path(file).unlink() # cleanup
+
+
@pytest.mark.skipif(not TORCH_1_9, reason="CoreML>=7.2 not supported with PyTorch<=1.8")
@pytest.mark.skipif(WINDOWS, reason="CoreML not supported on Windows") # RuntimeError: BlobWriter not loaded
@pytest.mark.skipif(IS_RASPBERRYPI, reason="CoreML not supported on Raspberry Pi")
@@ -142,6 +167,7 @@ def test_export_coreml():
YOLO(MODEL).export(format="coreml", nms=True, imgsz=32)
+@pytest.mark.skipif(not checks.IS_PYTHON_MINIMUM_3_10, reason="TFLite export requires Python>=3.10")
@pytest.mark.skipif(not LINUX, reason="Test disabled as TF suffers from install conflicts on Windows and macOS")
def test_export_tflite():
"""
diff --git a/ultralytics/__init__.py b/ultralytics/__init__.py
index e4464bec..3b687dd7 100644
--- a/ultralytics/__init__.py
+++ b/ultralytics/__init__.py
@@ -1,6 +1,6 @@
# Ultralytics YOLO 🚀, AGPL-3.0 license
-__version__ = "8.2.24"
+__version__ = "8.2.25"
import os
diff --git a/ultralytics/engine/exporter.py b/ultralytics/engine/exporter.py
index 822a012d..0421075c 100644
--- a/ultralytics/engine/exporter.py
+++ b/ultralytics/engine/exporter.py
@@ -83,7 +83,6 @@ from ultralytics.utils import (
WINDOWS,
__version__,
callbacks,
- checks,
colorstr,
get_default_args,
yaml_save,
@@ -813,15 +812,16 @@ class Exporter:
import tensorflow as tf # noqa
except ImportError:
suffix = "-macos" if MACOS else "-aarch64" if ARM64 else "" if cuda else "-cpu"
- version = "" if ARM64 else "<=2.13.1"
- check_requirements((f"tensorflow{suffix}{version}", "keras"))
+ version = ">=2.0.0"
+ check_requirements(f"tensorflow{suffix}{version}")
import tensorflow as tf # noqa
if ARM64:
check_requirements("cmake") # 'cmake' is needed to build onnxsim on aarch64
check_requirements(
(
+ "keras",
"onnx>=1.12.0",
- "onnx2tf>=1.15.4,<=1.17.5",
+ "onnx2tf>1.17.5,<=1.22.3",
"sng4onnx>=1.0.1",
"onnxsim>=0.4.33",
"onnx_graphsurgeon>=0.3.26",
@@ -835,7 +835,7 @@ class Exporter:
LOGGER.info(f"\n{prefix} starting export with tensorflow {tf.__version__}...")
check_version(
tf.__version__,
- "<=2.13.1",
+ ">=2.0.0",
name="tensorflow",
verbose=True,
msg="https://github.com/ultralytics/ultralytics/issues/5161",
diff --git a/ultralytics/utils/benchmarks.py b/ultralytics/utils/benchmarks.py
index 6bd8207f..53d9d9b8 100644
--- a/ultralytics/utils/benchmarks.py
+++ b/ultralytics/utils/benchmarks.py
@@ -88,14 +88,14 @@ def benchmark(
emoji, filename = "❌", None # export defaults
try:
# Checks
- if i == 5: # CoreML
- assert not (IS_RASPBERRYPI or IS_JETSON), "CoreML export not supported on Raspberry Pi or NVIDIA Jetson"
- if i == 9: # Edge TPU
- assert LINUX and not ARM64, "Edge TPU export only supported on non-aarch64 Linux"
- elif i == 7: # TF GraphDef
+ if i == 7: # TF GraphDef
assert model.task != "obb", "TensorFlow GraphDef not supported for OBB task"
+ elif i == 9: # Edge TPU
+ assert LINUX and not ARM64, "Edge TPU export only supported on non-aarch64 Linux"
elif i in {5, 10}: # CoreML and TF.js
- assert MACOS or LINUX, "export only supported on macOS and Linux"
+ assert MACOS or LINUX, "CoreML and TF.js export only supported on macOS and Linux"
+ assert not IS_RASPBERRYPI, "CoreML and TF.js export not supported on Raspberry Pi"
+ assert not IS_JETSON, "CoreML and TF.js export not supported on NVIDIA Jetson"
if i in {3, 5}: # CoreML and OpenVINO
assert not IS_PYTHON_3_12, "CoreML and OpenVINO not supported on Python 3.12"
if i in {6, 7, 8, 9, 10}: # All TF formats