diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 0210da54..f2d440c6 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -48,7 +48,7 @@ jobs:
python-version: "3.x"
- uses: astral-sh/setup-uv@v3
- name: Install Dependencies
- run: uv pip install --system ruff black tqdm minify-html mkdocs-material "mkdocstrings[python]" mkdocs-jupyter mkdocs-redirects mkdocs-ultralytics-plugin mkdocs-macros-plugin
+ run: uv pip install --system ruff black tqdm mkdocs-material "mkdocstrings[python]" mkdocs-jupyter mkdocs-redirects mkdocs-ultralytics-plugin mkdocs-macros-plugin
- name: Ruff fixes
continue-on-error: true
run: ruff check --fix --unsafe-fixes --select D --ignore=D100,D104,D203,D205,D212,D213,D401,D406,D407,D413 .
diff --git a/docs/en/modes/benchmark.md b/docs/en/modes/benchmark.md
index 9d02789a..6680b8ce 100644
--- a/docs/en/modes/benchmark.md
+++ b/docs/en/modes/benchmark.md
@@ -4,14 +4,22 @@ description: Learn how to evaluate your YOLO11 model's performance in real-world
keywords: model benchmarking, YOLO11, Ultralytics, performance evaluation, export formats, ONNX, TensorRT, OpenVINO, CoreML, TensorFlow, optimization, mAP50-95, inference time
---
+
+
# Model Benchmarking with Ultralytics YOLO
## Benchmark Visualization
-
-
!!! tip "Refresh Browser"
You may need to refresh the page to view the graphs correctly due to potential cookie issues.
@@ -19,7 +27,7 @@ keywords: model benchmarking, YOLO11, Ultralytics, performance evaluation, expor
## Introduction
diff --git a/docs/overrides/javascript/benchmark.js b/docs/overrides/javascript/benchmark.js
new file mode 100644
index 00000000..65efb863
--- /dev/null
+++ b/docs/overrides/javascript/benchmark.js
@@ -0,0 +1,199 @@
+// YOLO models chart ---------------------------------------------------------------------------------------------------
+const data = {
+ YOLO11: {
+ n: { speed: 1.55, mAP: 39.5 },
+ s: { speed: 2.63, mAP: 47.0 },
+ m: { speed: 5.27, mAP: 51.4 },
+ l: { speed: 6.84, mAP: 53.2 },
+ x: { speed: 12.49, mAP: 54.7 },
+ },
+ YOLOv10: {
+ n: { speed: 1.56, mAP: 39.5 },
+ s: { speed: 2.66, mAP: 46.7 },
+ m: { speed: 5.48, mAP: 51.3 },
+ b: { speed: 6.54, mAP: 52.7 },
+ l: { speed: 8.33, mAP: 53.3 },
+ x: { speed: 12.2, mAP: 54.4 },
+ },
+ YOLOv9: {
+ t: { speed: 2.3, mAP: 37.8 },
+ s: { speed: 3.54, mAP: 46.5 },
+ m: { speed: 6.43, mAP: 51.5 },
+ c: { speed: 7.16, mAP: 52.8 },
+ e: { speed: 16.77, mAP: 55.1 },
+ },
+ YOLOv8: {
+ n: { speed: 1.47, mAP: 37.3 },
+ s: { speed: 2.66, mAP: 44.9 },
+ m: { speed: 5.86, mAP: 50.2 },
+ l: { speed: 9.06, mAP: 52.9 },
+ x: { speed: 14.37, mAP: 53.9 },
+ },
+ YOLOv7: { l: { speed: 6.84, mAP: 51.4 }, x: { speed: 11.57, mAP: 53.1 } },
+ "YOLOv6-3.0": {
+ n: { speed: 1.17, mAP: 37.5 },
+ s: { speed: 2.66, mAP: 45.0 },
+ m: { speed: 5.28, mAP: 50.0 },
+ l: { speed: 8.95, mAP: 52.8 },
+ },
+ YOLOv5: {
+ s: { speed: 1.92, mAP: 37.4 },
+ m: { speed: 4.03, mAP: 45.4 },
+ l: { speed: 6.61, mAP: 49.0 },
+ x: { speed: 11.89, mAP: 50.7 },
+ },
+ "PP-YOLOE+": {
+ t: { speed: 2.84, mAP: 39.9 },
+ s: { speed: 2.62, mAP: 43.7 },
+ m: { speed: 5.56, mAP: 49.8 },
+ l: { speed: 8.36, mAP: 52.9 },
+ x: { speed: 14.3, mAP: 54.7 },
+ },
+ "DAMO-YOLO": {
+ t: { speed: 2.32, mAP: 42.0 },
+ s: { speed: 3.45, mAP: 46.0 },
+ m: { speed: 5.09, mAP: 49.2 },
+ l: { speed: 7.18, mAP: 50.8 },
+ },
+ YOLOX: {
+ s: { speed: 2.56, mAP: 40.5 },
+ m: { speed: 5.43, mAP: 46.9 },
+ l: { speed: 9.04, mAP: 49.7 },
+ x: { speed: 16.1, mAP: 51.1 },
+ },
+ RTDETRv2: {
+ s: { speed: 5.03, mAP: 48.1 },
+ m: { speed: 7.51, mAP: 51.9 },
+ l: { speed: 9.76, mAP: 53.4 },
+ x: { speed: 15.03, mAP: 54.3 },
+ },
+};
+
+let chart = null; // chart variable will hold the reference to the current chart instance.
+
+// Function to lighten a hex color by a specified amount.
+function lightenHexColor(color, amount = 0.5) {
+ const r = parseInt(color.slice(1, 3), 16);
+ const g = parseInt(color.slice(3, 5), 16);
+ const b = parseInt(color.slice(5, 7), 16);
+ const newR = Math.min(255, Math.round(r + (255 - r) * amount));
+ const newG = Math.min(255, Math.round(g + (255 - g) * amount));
+ const newB = Math.min(255, Math.round(b + (255 - b) * amount));
+ return `#${newR.toString(16).padStart(2, "0")}${newG.toString(16).padStart(2, "0")}${newB.toString(16).padStart(2, "0")}`;
+}
+
+// Function to update the benchmarks chart.
+function updateChart() {
+ if (chart) {
+ chart.destroy();
+ } // If a chart instance already exists, destroy it.
+
+ // Define a specific color map for models.
+ const colorMap = {
+ YOLO11: "#0b23a9",
+ YOLOv10: "#ff7f0e",
+ YOLOv9: "#2ca02c",
+ YOLOv8: "#d62728",
+ YOLOv7: "#9467bd",
+ "YOLOv6-3.0": "#8c564b",
+ YOLOv5: "#e377c2",
+ "PP-YOLOE+": "#7f7f7f",
+ "DAMO-YOLO": "#bcbd22",
+ YOLOX: "#17becf",
+ RTDETRv2: "#eccd22",
+ };
+
+ // Get the selected algorithms from the checkboxes.
+ const selectedAlgorithms = [
+ ...document.querySelectorAll('input[name="algorithm"]:checked'),
+ ].map((e) => e.value);
+
+ // Create the datasets for the selected algorithms.
+ const datasets = selectedAlgorithms.map((algorithm, i) => {
+ const baseColor =
+ colorMap[algorithm] || `hsl(${Math.random() * 360}, 70%, 50%)`;
+ const lineColor = i === 0 ? baseColor : lightenHexColor(baseColor, 0.6); // Lighten non-primary lines.
+
+ return {
+ label: algorithm, // Label for the data points in the legend.
+ data: Object.entries(data[algorithm]).map(([version, point]) => ({
+ x: point.speed, // Speed data points on the x-axis.
+ y: point.mAP, // mAP data points on the y-axis.
+ version: version.toUpperCase(), // Store the version as additional data.
+ })),
+ fill: false, // Don't fill the chart.
+ borderColor: lineColor, // Use the lightened color for the line.
+ tension: 0.3, // Smooth the line.
+ pointRadius: i === 0 ? 7 : 4, // Highlight primary dataset points.
+ pointHoverRadius: i === 0 ? 9 : 6, // Highlight hover for primary dataset.
+ pointBackgroundColor: lineColor, // Fill points with the line color.
+ pointBorderColor: "#ffffff", // Add a border around points for contrast.
+ borderWidth: i === 0 ? 3 : 1.5, // Slightly increase line size for the primary dataset.
+ };
+ });
+
+ if (datasets.length === 0) {
+ return;
+ } // If there are no selected algorithms, return without creating a new chart.
+
+ // Create a new chart instance.
+ chart = new Chart(document.getElementById("chart").getContext("2d"), {
+ type: "line", // Set the chart type to line.
+ data: { datasets },
+ options: {
+ plugins: {
+ legend: {
+ display: true,
+ position: "top",
+ labels: { color: "#808080" },
+ }, // Configure the legend.
+ tooltip: {
+ callbacks: {
+ label: (tooltipItem) => {
+ const { dataset, dataIndex } = tooltipItem;
+ const point = dataset.data[dataIndex];
+ return `${dataset.label}${point.version.toLowerCase()}: Speed = ${point.x}, mAP = ${point.y}`; // Custom tooltip label.
+ },
+ },
+ mode: "nearest",
+ intersect: false,
+ }, // Configure the tooltip.
+ },
+ interaction: { mode: "nearest", axis: "x", intersect: false }, // Configure the interaction mode.
+ scales: {
+ x: {
+ type: "linear",
+ position: "bottom",
+ title: {
+ display: true,
+ text: "Latency T4 TensorRT10 FP16 (ms/img)",
+ color: "#808080",
+ }, // X-axis title.
+ grid: { color: "#e0e0e0" }, // Grid line color.
+ ticks: { color: "#808080" }, // Tick label color.
+ },
+ y: {
+ title: { display: true, text: "mAP", color: "#808080" }, // Y-axis title.
+ grid: { color: "#e0e0e0" }, // Grid line color.
+ ticks: { color: "#808080" }, // Tick label color.
+ },
+ },
+ },
+ });
+}
+
+document$.subscribe(function () {
+ function initializeApp() {
+ if (typeof Chart !== "undefined") {
+ document
+ .querySelectorAll('input[name="algorithm"]')
+ .forEach((checkbox) =>
+ checkbox.addEventListener("change", updateChart),
+ );
+ updateChart();
+ } else {
+ setTimeout(initializeApp, 100); // Retry every 100ms
+ }
+ }
+ initializeApp(); // Initial chart rendering
+});
diff --git a/docs/overrides/javascript/extra.js b/docs/overrides/javascript/extra.js
index 3c3ad2b6..2de7572e 100644
--- a/docs/overrides/javascript/extra.js
+++ b/docs/overrides/javascript/extra.js
@@ -143,200 +143,3 @@ document.addEventListener("DOMContentLoaded", () => {
widgetContainer && addInkeepWidget("SearchBar", "#inkeepSearchBar");
});
});
-
-// YOLO models chart ---------------------------------------------------------------------------------------------------
-const data = {
- YOLO11: {
- n: { speed: 1.55, mAP: 39.5 },
- s: { speed: 2.63, mAP: 47.0 },
- m: { speed: 5.27, mAP: 51.4 },
- l: { speed: 6.84, mAP: 53.2 },
- x: { speed: 12.49, mAP: 54.7 },
- },
- YOLOv10: {
- n: { speed: 1.56, mAP: 39.5 },
- s: { speed: 2.66, mAP: 46.7 },
- m: { speed: 5.48, mAP: 51.3 },
- b: { speed: 6.54, mAP: 52.7 },
- l: { speed: 8.33, mAP: 53.3 },
- x: { speed: 12.2, mAP: 54.4 },
- },
- YOLOv9: {
- t: { speed: 2.3, mAP: 37.8 },
- s: { speed: 3.54, mAP: 46.5 },
- m: { speed: 6.43, mAP: 51.5 },
- c: { speed: 7.16, mAP: 52.8 },
- e: { speed: 16.77, mAP: 55.1 },
- },
- YOLOv8: {
- n: { speed: 1.47, mAP: 37.3 },
- s: { speed: 2.66, mAP: 44.9 },
- m: { speed: 5.86, mAP: 50.2 },
- l: { speed: 9.06, mAP: 52.9 },
- x: { speed: 14.37, mAP: 53.9 },
- },
- YOLOv7: { l: { speed: 6.84, mAP: 51.4 }, x: { speed: 11.57, mAP: 53.1 } },
- "YOLOv6-3.0": {
- n: { speed: 1.17, mAP: 37.5 },
- s: { speed: 2.66, mAP: 45.0 },
- m: { speed: 5.28, mAP: 50.0 },
- l: { speed: 8.95, mAP: 52.8 },
- },
- YOLOv5: {
- s: { speed: 1.92, mAP: 37.4 },
- m: { speed: 4.03, mAP: 45.4 },
- l: { speed: 6.61, mAP: 49.0 },
- x: { speed: 11.89, mAP: 50.7 },
- },
- "PP-YOLOE+": {
- t: { speed: 2.84, mAP: 39.9 },
- s: { speed: 2.62, mAP: 43.7 },
- m: { speed: 5.56, mAP: 49.8 },
- l: { speed: 8.36, mAP: 52.9 },
- x: { speed: 14.3, mAP: 54.7 },
- },
- "DAMO-YOLO": {
- t: { speed: 2.32, mAP: 42.0 },
- s: { speed: 3.45, mAP: 46.0 },
- m: { speed: 5.09, mAP: 49.2 },
- l: { speed: 7.18, mAP: 50.8 },
- },
- YOLOX: {
- s: { speed: 2.56, mAP: 40.5 },
- m: { speed: 5.43, mAP: 46.9 },
- l: { speed: 9.04, mAP: 49.7 },
- x: { speed: 16.1, mAP: 51.1 },
- },
- RTDETRv2: {
- s: { speed: 5.03, mAP: 48.1 },
- m: { speed: 7.51, mAP: 51.9 },
- l: { speed: 9.76, mAP: 53.4 },
- x: { speed: 15.03, mAP: 54.3 },
- },
-};
-
-let chart = null; // chart variable will hold the reference to the current chart instance.
-
-// Function to lighten a hex color by a specified amount.
-function lightenHexColor(color, amount = 0.5) {
- const r = parseInt(color.slice(1, 3), 16);
- const g = parseInt(color.slice(3, 5), 16);
- const b = parseInt(color.slice(5, 7), 16);
- const newR = Math.min(255, Math.round(r + (255 - r) * amount));
- const newG = Math.min(255, Math.round(g + (255 - g) * amount));
- const newB = Math.min(255, Math.round(b + (255 - b) * amount));
- return `#${newR.toString(16).padStart(2, "0")}${newG.toString(16).padStart(2, "0")}${newB.toString(16).padStart(2, "0")}`;
-}
-
-// Function to update the benchmarks chart.
-function updateChart() {
- if (chart) {
- chart.destroy();
- } // If a chart instance already exists, destroy it.
-
- // Define a specific color map for models.
- const colorMap = {
- YOLO11: "#0b23a9",
- YOLOv10: "#ff7f0e",
- YOLOv9: "#2ca02c",
- YOLOv8: "#d62728",
- YOLOv7: "#9467bd",
- "YOLOv6-3.0": "#8c564b",
- YOLOv5: "#e377c2",
- "PP-YOLOE+": "#7f7f7f",
- "DAMO-YOLO": "#bcbd22",
- YOLOX: "#17becf",
- RTDETRv2: "#eccd22",
- };
-
- // Get the selected algorithms from the checkboxes.
- const selectedAlgorithms = [
- ...document.querySelectorAll('input[name="algorithm"]:checked'),
- ].map((e) => e.value);
-
- // Create the datasets for the selected algorithms.
- const datasets = selectedAlgorithms.map((algorithm, i) => {
- const baseColor =
- colorMap[algorithm] || `hsl(${Math.random() * 360}, 70%, 50%)`;
- const lineColor = i === 0 ? baseColor : lightenHexColor(baseColor, 0.6); // Lighten non-primary lines.
-
- return {
- label: algorithm, // Label for the data points in the legend.
- data: Object.entries(data[algorithm]).map(([version, point]) => ({
- x: point.speed, // Speed data points on the x-axis.
- y: point.mAP, // mAP data points on the y-axis.
- version: version.toUpperCase(), // Store the version as additional data.
- })),
- fill: false, // Don't fill the chart.
- borderColor: lineColor, // Use the lightened color for the line.
- tension: 0.3, // Smooth the line.
- pointRadius: i === 0 ? 7 : 4, // Highlight primary dataset points.
- pointHoverRadius: i === 0 ? 9 : 6, // Highlight hover for primary dataset.
- pointBackgroundColor: lineColor, // Fill points with the line color.
- pointBorderColor: "#ffffff", // Add a border around points for contrast.
- borderWidth: i === 0 ? 3 : 1.5, // Slightly increase line size for the primary dataset.
- };
- });
-
- if (datasets.length === 0) {
- return;
- } // If there are no selected algorithms, return without creating a new chart.
-
- // Create a new chart instance.
- chart = new Chart(document.getElementById("chart").getContext("2d"), {
- type: "line", // Set the chart type to line.
- data: { datasets },
- options: {
- plugins: {
- legend: {
- display: true,
- position: "top",
- labels: { color: "#808080" },
- }, // Configure the legend.
- tooltip: {
- callbacks: {
- label: (tooltipItem) => {
- const { dataset, dataIndex } = tooltipItem;
- const point = dataset.data[dataIndex];
- return `${dataset.label}${point.version.toLowerCase()}: Speed = ${point.x}, mAP = ${point.y}`; // Custom tooltip label.
- },
- },
- mode: "nearest",
- intersect: false,
- }, // Configure the tooltip.
- },
- interaction: { mode: "nearest", axis: "x", intersect: false }, // Configure the interaction mode.
- scales: {
- x: {
- type: "linear",
- position: "bottom",
- title: {
- display: true,
- text: "Latency T4 TensorRT10 FP16 (ms/img)",
- color: "#808080",
- }, // X-axis title.
- grid: { color: "#e0e0e0" }, // Grid line color.
- ticks: { color: "#808080" }, // Tick label color.
- },
- y: {
- title: { display: true, text: "mAP", color: "#808080" }, // Y-axis title.
- grid: { color: "#e0e0e0" }, // Grid line color.
- ticks: { color: "#808080" }, // Tick label color.
- },
- },
- },
- });
-}
-
-// Poll for Chart.js to load, then initialize checkboxes and chart
-function initializeApp() {
- if (typeof Chart !== "undefined") {
- document
- .querySelectorAll('input[name="algorithm"]')
- .forEach((checkbox) => checkbox.addEventListener("change", updateChart));
- updateChart();
- } else {
- setTimeout(initializeApp, 100); // Retry every 100ms
- }
-}
-document.addEventListener("DOMContentLoaded", initializeApp); // Initial chart rendering on page load