RED-3813: image recategorization

added saving images after layout parsing finishes

added endpoint for querying similiar images
This commit is contained in:
yhampe 2024-06-26 15:03:13 +02:00
parent 18a8f5215f
commit 7e65396ffe
3 changed files with 9 additions and 62 deletions

View File

@ -1,61 +0,0 @@
package com.iqser.red.service.persistence.management.v1.processor.service.image;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.ml.clustering.Cluster;
import org.apache.commons.math3.ml.clustering.DBSCANClusterer;
import org.apache.commons.math3.ml.distance.DistanceMeasure;
import org.apache.commons.math3.ml.distance.ManhattanDistance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.iqser.red.service.persistence.management.v1.processor.service.FileManagementStorageService;
import com.knecon.fforesight.tenantcommons.TenantContext;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor
public class ImageClusteringService {
private final ObjectMapper objectMapper;
private final double eps = 26;
private final int minPts = 3;
private final int fixedLength = 25;
private final DistanceMeasure distanceMeasure = new ManhattanDistance();
@Autowired
FileManagementStorageService fileManagementStorageService;
public void clusterImages(String storageId) throws Exception {
DBSCANClusterer<Image> dbscanClusterer = new DBSCANClusterer<>(eps, minPts, distanceMeasure);
try (InputStream inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), storageId)) {
ImageServiceResponse imageServiceResponse = objectMapper.readValue(inputStream, ImageServiceResponse.class);
List<ImageMetadata> imageMetadataList = imageServiceResponse.getData();
List<Image> imageList = new ArrayList<>();
for (ImageMetadata metadata : imageMetadataList) {
Image image = new Image(metadata.getRepresentation(), fixedLength);
imageList.add(image);
}
if (imageList.isEmpty()) {
throw new IllegalArgumentException("The image list is empty. Unable to perform clustering.");
}
List<Cluster<Image>> clusters = dbscanClusterer.cluster(imageList);
for (Cluster<Image> cluster : clusters) {
List<Image> clusterImages = cluster.getPoints();
log.info("cluster: {}", clusterImages.get(0));
}
}
}
}

View File

@ -47,6 +47,7 @@ public class ImageMessageReceiver {
fileStatusService.setStatusAnalyse(dossierId, fileId, false);
log.info("Received message from {} for dossierId {} and fileId {}", MessagingConfiguration.IMAGE_SERVICE_RESPONSE_QUEUE, dossierId, fileId);
}

View File

@ -13,6 +13,7 @@ import com.iqser.red.service.persistence.management.v1.processor.migration.SaasM
import com.iqser.red.service.persistence.management.v1.processor.model.websocket.AnalyseStatus;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusProcessingUpdateService;
import com.iqser.red.service.persistence.management.v1.processor.service.FileStatusService;
import com.iqser.red.service.persistence.management.v1.processor.service.image.ImageSimilarityService;
import com.iqser.red.service.persistence.management.v1.processor.service.WebsocketService;
import com.iqser.red.service.persistence.management.v1.processor.service.image.ImageSimilarityService;
import com.iqser.red.service.persistence.management.v1.processor.service.layoutparsing.LayoutParsingRequestIdentifierService;
@ -28,6 +29,13 @@ import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
@Slf4j
@Service
@RequiredArgsConstructor
@ -67,7 +75,6 @@ public class LayoutParsingFinishedMessageReceiver {
imageSimiliarityService.saveImages(templateId, dossierId, fileId, storageId);
log.info("Received message {} in {}", response, LayoutParsingQueueNames.LAYOUT_PARSING_FINISHED_EVENT_QUEUE);
}