Modernize Image Recognition lab

This commit is contained in:
2025-11-13 14:33:24 +01:00
parent 40f91bdacc
commit 6a8173f184
2 changed files with 42 additions and 61 deletions

View File

@@ -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<Prediction> 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<Prediction> classifyImage(Map<String, Double> features, String filename) {
List<Prediction> predictions = new ArrayList<>();
BiConsumer<Integer,Double> 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);
}
}
}

View File

@@ -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);
}
}