From 0e2563111c9a4f2b6a7bc236d009151c0af687c5 Mon Sep 17 00:00:00 2001 From: Sam Freund Date: Mon, 22 Jun 2026 23:15:57 -0700 Subject: [PATCH] refactor OD model UID to path (#2486) --- .../configuration/NeuralNetworkModelManager.java | 11 ++++++----- .../java/org/photonvision/vision/objects/Model.java | 8 +++++++- .../org/photonvision/vision/objects/NullModel.java | 5 +++-- .../org/photonvision/vision/objects/RknnModel.java | 5 +++-- .../org/photonvision/vision/objects/RubikModel.java | 5 +++-- .../vision/pipeline/ObjectDetectionPipeline.java | 3 +-- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/photon-core/src/main/java/org/photonvision/common/configuration/NeuralNetworkModelManager.java b/photon-core/src/main/java/org/photonvision/common/configuration/NeuralNetworkModelManager.java index 9700b5539..24cebab3e 100644 --- a/photon-core/src/main/java/org/photonvision/common/configuration/NeuralNetworkModelManager.java +++ b/photon-core/src/main/java/org/photonvision/common/configuration/NeuralNetworkModelManager.java @@ -280,10 +280,10 @@ public class NeuralNetworkModelManager { * *

If this method returns `Optional.of(..)` then the model should be safe to load. * - * @param modelUID the unique identifier of the model to retrieve + * @param modelPath the unique identifier of the model to retrieve * @return an Optional containing the model if found, or an empty Optional if not found */ - public Optional getModel(String modelUID) { + public Optional getModel(Path modelPath) { if (models == null) { return Optional.empty(); } @@ -292,7 +292,7 @@ public class NeuralNetworkModelManager { for (Family backend : supportedBackends) { if (models.containsKey(backend)) { Optional model = - models.get(backend).stream().filter(m -> m.getUID().equals(modelUID)).findFirst(); + models.get(backend).stream().filter(m -> m.getPath().equals(modelPath)).findFirst(); if (model.isPresent()) { return model; } @@ -406,7 +406,8 @@ public class NeuralNetworkModelManager { // After loading all of the models, sort them by name to ensure a consistent // ordering models.forEach( - (backend, backendModels) -> backendModels.sort((a, b) -> a.getUID().compareTo(b.getUID()))); + (backend, backendModels) -> + backendModels.sort((a, b) -> a.getPath().compareTo(b.getPath()))); // Log StringBuilder sb = new StringBuilder(); @@ -414,7 +415,7 @@ public class NeuralNetworkModelManager { models.forEach( (backend, backendModels) -> { sb.append(backend).append(" ["); - backendModels.forEach(model -> sb.append(model.getUID()).append(", ")); + backendModels.forEach(model -> sb.append(model.getPath()).append(", ")); sb.append("] "); }); } diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/Model.java b/photon-core/src/main/java/org/photonvision/vision/objects/Model.java index a661395ed..b4e0aea32 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/Model.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/Model.java @@ -17,13 +17,19 @@ package org.photonvision.vision.objects; +import java.nio.file.Path; import org.photonvision.common.configuration.NeuralNetworkModelManager.Family; import org.photonvision.common.configuration.NeuralNetworkModelsSettings.ModelProperties; public interface Model { public ObjectDetector load(); - public String getUID(); + /** + * Gets the path to the model file. This is being used as a UID. + * + * @return the path to the model file (for use as a UID) + */ + public Path getPath(); public String getNickname(); diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/NullModel.java b/photon-core/src/main/java/org/photonvision/vision/objects/NullModel.java index 117d3d110..ec98b753c 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/NullModel.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/NullModel.java @@ -17,6 +17,7 @@ package org.photonvision.vision.objects; +import java.nio.file.Path; import java.util.List; import org.opencv.core.Mat; import org.photonvision.common.configuration.NeuralNetworkModelManager.Family; @@ -43,8 +44,8 @@ public class NullModel implements Model, ObjectDetector { } @Override - public String getUID() { - return "NullModel"; + public Path getPath() { + return Path.of("null"); } @Override diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RknnModel.java b/photon-core/src/main/java/org/photonvision/vision/objects/RknnModel.java index 858330b4a..5951a9208 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RknnModel.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RknnModel.java @@ -18,6 +18,7 @@ package org.photonvision.vision.objects; import java.io.File; +import java.nio.file.Path; import org.opencv.core.Size; import org.photonvision.common.configuration.NeuralNetworkModelManager.Family; import org.photonvision.common.configuration.NeuralNetworkModelManager.Version; @@ -61,8 +62,8 @@ public class RknnModel implements Model { } /** Return the unique identifier for the model. In this case, it's the model's path. */ - public String getUID() { - return properties.modelPath().toString(); + public Path getPath() { + return properties.modelPath(); } public String getNickname() { diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RubikModel.java b/photon-core/src/main/java/org/photonvision/vision/objects/RubikModel.java index 1b4de695f..c020b08fc 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RubikModel.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RubikModel.java @@ -18,6 +18,7 @@ package org.photonvision.vision.objects; import java.io.File; +import java.nio.file.Path; import org.opencv.core.Size; import org.photonvision.common.configuration.NeuralNetworkModelManager.Family; import org.photonvision.common.configuration.NeuralNetworkModelManager.Version; @@ -59,8 +60,8 @@ public class RubikModel implements Model { } /** Return the unique identifier for the model. In this case, it's the model's path. */ - public String getUID() { - return properties.modelPath().toString(); + public Path getPath() { + return properties.modelPath(); } public String getNickname() { diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/ObjectDetectionPipeline.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/ObjectDetectionPipeline.java index a009d2cc9..a1e864f39 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/ObjectDetectionPipeline.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/ObjectDetectionPipeline.java @@ -57,8 +57,7 @@ public class ObjectDetectionPipeline protected void setPipeParamsImpl() { Optional selectedModel = settings.model != null - ? NeuralNetworkModelManager.getInstance() - .getModel(settings.model.modelPath().toString()) + ? NeuralNetworkModelManager.getInstance().getModel(settings.model.modelPath()) : Optional.empty(); // If the desired model couldn't be found, log an error and try to use the default model