diff --git a/build.gradle b/build.gradle index 9e242c1baf..90cdb41a68 100644 --- a/build.gradle +++ b/build.gradle @@ -39,8 +39,8 @@ ext { openCVversion = "4.10.0-3" javalinVersion = "5.6.2" libcameraDriverVersion = "v2025.0.3" - rknnVersion = "dev-v2025.0.0-1-g33b6263" - rubikVersion = "v2025.1.0" + rknnVersion = "dev-v2025.0.0-5-g666c0c6" + rubikVersion = "dev-v2025.1.0-8-g067a316" frcYear = "2025" mrcalVersion = "v2025.0.0"; diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java b/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java index 0fd5926bdf..7f0799108e 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RknnObjectDetector.java @@ -74,6 +74,8 @@ public RknnObjectDetector(RknnModel model, Size inputSize) { if (objPointer <= 0) { throw new RuntimeException( "Failed to create detector from path " + model.modelFile.getPath()); + } else if (!RknnJNI.isQuantized(objPointer)) { + throw new UnsupportedOperationException("Model must be quantized."); } logger.debug("Created detector for model " + model.modelFile.getName()); diff --git a/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java b/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java index 8bfb9a675f..d94b27300c 100644 --- a/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java +++ b/photon-core/src/main/java/org/photonvision/vision/objects/RubikObjectDetector.java @@ -80,6 +80,8 @@ public RubikObjectDetector(RubikModel model, Size inputSize) { + ". Please ensure the model is valid and compatible with the Rubik backend."); throw new RuntimeException( "Failed to create detector from path " + model.modelFile.getPath()); + } else if (!RubikJNI.isQuantized(ptr)) { + throw new UnsupportedOperationException("Model must be quantized."); } logger.debug("Created detector for model " + model.modelFile.getName()); diff --git a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java index e25bb5f433..641bbbe09c 100644 --- a/photon-server/src/main/java/org/photonvision/server/RequestHandler.java +++ b/photon-server/src/main/java/org/photonvision/server/RequestHandler.java @@ -58,6 +58,9 @@ import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.camera.CameraQuirk; import org.photonvision.vision.camera.PVCameraInfo; +import org.photonvision.vision.objects.ObjectDetector; +import org.photonvision.vision.objects.RknnModel; +import org.photonvision.vision.objects.RubikModel; import org.photonvision.vision.processes.VisionSourceManager; import org.zeroturnaround.zip.ZipUtil; @@ -656,18 +659,49 @@ public static void onImportObjectDetectionModelRequest(Context ctx) { modelFile.content().transferTo(out); } + ModelProperties modelProperties = + new ModelProperties( + modelPath, + modelFile.filename().replaceAll("." + family.extension(), ""), + labels, + width, + height, + family, + version); + + ObjectDetector objDetector = null; + + try { + objDetector = + switch (family) { + case RUBIK -> new RubikModel(modelProperties).load(); + case RKNN -> new RknnModel(modelProperties).load(); + }; + } catch (RuntimeException e) { + ctx.status(400); + ctx.result("Failed to load object detection model: " + e.getMessage()); + + try { + Files.deleteIfExists(modelPath); + } catch (IOException ex) { + e.addSuppressed(ex); + } + + logger.error("Failed to load object detection model", e); + return; + } finally { + // this finally block will run regardless of what happens in try/catch + // please see https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html + // for a summary on how finally works + if (objDetector != null) { + objDetector.release(); + } + } + ConfigManager.getInstance() .getConfig() .neuralNetworkPropertyManager() - .addModelProperties( - new ModelProperties( - modelPath, - modelFile.filename().replaceAll("." + family.extension(), ""), - labels, - width, - height, - family, - version)); + .addModelProperties(modelProperties); logger.debug( ConfigManager.getInstance().getConfig().neuralNetworkPropertyManager().toString());