From 6a8173f184bf43858cd0e52e6b849776151942bd Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Thu, 13 Nov 2025 14:33:24 +0100 Subject: [PATCH] Modernize Image Recognition lab --- .../img/ProductRecognitionNewModel.java | 87 ++++++++----------- .../ProductRecognitionPreTrainedModel.java | 16 ++-- 2 files changed, 42 insertions(+), 61 deletions(-) diff --git a/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionNewModel.java b/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionNewModel.java index 019871c..9aaf7a4 100644 --- a/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionNewModel.java +++ b/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionNewModel.java @@ -10,6 +10,10 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.List; +import java.util.function.BiConsumer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; /** @@ -24,10 +28,11 @@ public class ProductRecognitionNewModel { // private static final int SAMPLE_SIZE = 10; private static final int RESIZE_WIDTH = 100; private static final int RESIZE_HEIGHT = 100; + private static final Logger log = LoggerFactory.getLogger(ProductRecognitionNewModel.class); public static void main(String[] args) { try { - System.out.println("Starting Product Recognition Lab"); + log.info("Starting Product Recognition Lab"); // Step 1: Create necessary directories File projectDir = new File("ImageRecognitionLab"); @@ -49,15 +54,14 @@ public class ProductRecognitionNewModel { } } } else { - System.out.printf("No images found in directory: %s%n", imagesDir); - System.out.println("Please add some product images to the 'images' folder."); + log.info("No images found in directory: {}", (Object) imageFiles); + log.info("Please add some product images to the 'images' folder."); } - System.out.println("Product recognition completed successfully!"); + log.info("Product recognition completed successfully!"); } catch (Exception e) { - System.err.println("Error occurred: " + e.getMessage()); - e.printStackTrace(); + log.error("Error occurred: {}", e.getMessage(), e); } } @@ -65,12 +69,12 @@ public class ProductRecognitionNewModel { * Process a single image file */ private static void processImage(File imageFile, Path outputDir) throws IOException { - System.out.println("Analyzing image: " + imageFile.getName()); + log.info("Analyzing image: {}", imageFile.getName()); // Step 1: Load the image BufferedImage originalImage = ImageIO.read(imageFile); if (originalImage == null) { - System.err.println("Failed to load image: " + imageFile.getName()); + log.error("Failed to load image: {}", imageFile.getName()); return; } @@ -81,11 +85,11 @@ public class ProductRecognitionNewModel { List predictions = classifyImage(features, imageFile.getName()); // Step 4: Print the results - System.out.println("Top 5 predictions for " + imageFile.getName() + ":"); + log.info("Top 5 predictions for {}:", imageFile.getName()); for (Prediction p : predictions) { - System.out.printf("%-30s: %.2f%%\n", p.getLabel(), p.getProbability() * 100); + System.out.printf("%-30s: %.2f%%\n", p.label(), p.probability() * 100); } - System.out.println("-----------------------------------------\n"); + log.info("-----------------------------------------\n"); // Step 5: Save the results to a file saveResultsToFile(imageFile.getName(), predictions, outputDir); @@ -218,6 +222,8 @@ public class ProductRecognitionNewModel { */ private static List classifyImage(Map features, String filename) { List predictions = new ArrayList<>(); + BiConsumer adjustProbability = (index, probability) -> + predictions.set(index, predictions.get(index).probability(probability)); // Using filename for simulation, since this is just a demonstration filename = filename.toLowerCase(); @@ -241,42 +247,42 @@ public class ProductRecognitionNewModel { // Dark colors with high edge density might be electronic devices if (avgRed < 0.5 && avgGreen < 0.5 && avgBlue < 0.5 && edgeDensity > 0.1) { - predictions.get(0).setProbability(0.6); // laptop - predictions.get(4).setProbability(0.3); // smartphone + adjustProbability.accept(0, 0.6); + adjustProbability.accept(4, 0.3); } // Blue tones might suggest water bottles if (avgBlue > avgRed && avgBlue > avgGreen) { - predictions.get(1).setProbability(0.7); // water bottle + adjustProbability.accept(1, 0.7); // water bottle } // High uniformity might suggest solid objects like mugs if (textureUniformity > 0.1 && avgRed > 0.3) { - predictions.get(2).setProbability(0.65); // coffee mug + adjustProbability.accept(2, 0.65); // coffee mug } // Medium brightness with texture might be books if (avgRed > 0.3 && avgRed < 0.7 && textureUniformity < 0.1) { - predictions.get(3).setProbability(0.55); // book + adjustProbability.accept(3, 0.55); // book } // Override with filename-based simulated results for this demo if (filename.contains("laptop")) { - predictions.get(0).setProbability(0.92); // laptop - predictions.get(4).setProbability(0.05); // smartphone + adjustProbability.accept(0,0.92); // laptop + adjustProbability.accept(4,0.05); // smartphone } else if (filename.contains("bottle") || filename.contains("water")) { - predictions.get(1).setProbability(0.89); // water bottle + adjustProbability.accept(1,0.89); // water bottle } else if (filename.contains("mug") || filename.contains("coffee")) { - predictions.get(2).setProbability(0.94); // coffee mug + adjustProbability.accept(2,0.94); // coffee mug } else if (filename.contains("book")) { - predictions.get(3).setProbability(0.91); // book + adjustProbability.accept(3,0.91); // book } else if (filename.contains("phone") || filename.contains("smartphone")) { - predictions.get(4).setProbability(0.95); // smartphone - predictions.get(0).setProbability(0.03); // laptop + adjustProbability.accept(4,0.95); // smartphone + adjustProbability.accept(0,0.03); // laptop } // Sort by probability - predictions.sort((a, b) -> Double.compare(b.getProbability(), a.getProbability())); + predictions.sort((a, b) -> Double.compare(b.probability(), a.probability())); return predictions; } @@ -296,9 +302,7 @@ public class ProductRecognitionNewModel { writer.write("-----------------------------------------\n"); for (Prediction p : results) { - writer.write(String.format("%-30s: %.2f%%\n", - p.getLabel(), - p.getProbability() * 100)); + writer.write(String.format("%-30s: %.2f%%\n", p.label(), p.probability() * 100)); } writer.write("\n\nImage Analysis:\n"); @@ -309,7 +313,7 @@ public class ProductRecognitionNewModel { writer.write("thousands of product images.\n"); } - System.out.println("Results saved to file: " + outputFile); + log.info("Results saved to file: {}", outputFile); } /** @@ -345,32 +349,13 @@ public class ProductRecognitionNewModel { ImageIO.write(processed, "jpg", outputFile.toFile()); } catch (IOException e) { - System.err.println("Error saving processed image: " + e.getMessage()); + log.error("Error saving processed image: {}", e.getMessage(),e); } } - /** - * A simple class to hold a prediction label and its probability - */ - private static class Prediction { - private final String label; - private double probability; - - public Prediction(String label, double probability) { - this.label = label; - this.probability = probability; - } - - public String getLabel() { - return label; - } - - public double getProbability() { - return probability; - } - - public void setProbability(double probability) { - this.probability = probability; + private record Prediction(String label, double probability) { + Prediction probability(double probability) { + return new Prediction(label, probability); } } } \ No newline at end of file diff --git a/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionPreTrainedModel.java b/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionPreTrainedModel.java index 70e1eef..2ccbe66 100644 --- a/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionPreTrainedModel.java +++ b/ImageRecognitionLab/src/main/java/com/example/img/ProductRecognitionPreTrainedModel.java @@ -1,8 +1,5 @@ package com.example.img; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; - import ai.djl.ModelException; import ai.djl.inference.Predictor; import ai.djl.modality.Classifications; @@ -15,17 +12,19 @@ import ai.djl.repository.zoo.Criteria; import ai.djl.repository.zoo.ZooModel; import ai.djl.translate.TranslateException; import ai.djl.translate.Translator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.SpringBootApplication; -import java.io.File; import java.io.FileInputStream; import java.io.IOException; - -import org.springframework.core.io.Resource; import java.io.InputStream; @SpringBootApplication public class ProductRecognitionPreTrainedModel { + private static final Logger log = LoggerFactory.getLogger(ProductRecognitionPreTrainedModel.class); + public static void main(String[] args) throws IOException, ModelException, TranslateException { // Path to your image file String imagePath = "ImageRecognitionLab/images/pill_bottle.png"; @@ -37,14 +36,11 @@ public class ProductRecognitionPreTrainedModel { try (InputStream is = new FileInputStream(imagePath)) { - // Load image Image img = ImageFactory.getInstance().fromInputStream(is); - // Run prediction Classifications predictions = predict(img); - // Print results - System.out.println("Top 5 Predictions:"); + log.info("Top 5 Predictions:"); predictions.topK(5).forEach(System.out::println); } }