RED-3813: image recategorization
removed not used changes
This commit is contained in:
parent
fed0caa8d2
commit
80be82e361
@ -1,20 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Classification {
|
|
||||||
|
|
||||||
private Map<String, Float> probabilities = new HashMap<>();
|
|
||||||
private String label;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class FilterGeometry {
|
|
||||||
|
|
||||||
private ImageSize imageSize;
|
|
||||||
private ImageFormat imageFormat;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Filters {
|
|
||||||
|
|
||||||
private FilterGeometry geometry;
|
|
||||||
private Probability probability;
|
|
||||||
private boolean allPassed;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Geometry {
|
|
||||||
|
|
||||||
private float width;
|
|
||||||
private float height;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import org.apache.commons.math3.ml.clustering.Clusterable;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Image implements Clusterable {
|
|
||||||
private String hash;
|
|
||||||
private int fixedLength;
|
|
||||||
private String label;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public double[] getPoint() {
|
|
||||||
double[] featureVector = new double[fixedLength];
|
|
||||||
for (int i = 0; i < hash.length(); i++) {
|
|
||||||
featureVector[i] = (double) hash.charAt(i);
|
|
||||||
}
|
|
||||||
return featureVector;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class ImageFormat {
|
|
||||||
|
|
||||||
private float quotient;
|
|
||||||
private boolean tooTall;
|
|
||||||
private boolean tooWide;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class ImageMetadata {
|
|
||||||
|
|
||||||
private Classification classification;
|
|
||||||
private String representation;
|
|
||||||
private Position position;
|
|
||||||
private Geometry geometry;
|
|
||||||
private Filters filters;
|
|
||||||
private boolean alpha;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonAlias;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class ImageServiceResponse {
|
|
||||||
|
|
||||||
private String dossierId;
|
|
||||||
private String fileId;
|
|
||||||
|
|
||||||
@JsonProperty(value = "imageMetadata")
|
|
||||||
@JsonAlias("data")
|
|
||||||
private List<ImageMetadata> data = new ArrayList<>();
|
|
||||||
|
|
||||||
private List<ImageMetadata> dataCV = new ArrayList<>();
|
|
||||||
|
|
||||||
|
|
||||||
@JsonProperty(value = "imageMetadata")
|
|
||||||
@JsonAlias("data")
|
|
||||||
public void setData(List<ImageMetadata> data) {this.data = data;}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
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.iqser.red.service.persistence.service.v1.api.shared.model.utils.Scope;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.document.ImageDocument;
|
|
||||||
import com.iqser.red.service.persistence.service.v1.api.shared.mongo.service.ImageMongoService;
|
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.DocumentStructure;
|
|
||||||
import com.knecon.fforesight.service.layoutparser.internal.api.data.redaction.NodeType;
|
|
||||||
import com.knecon.fforesight.tenantcommons.TenantContext;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
@Slf4j
|
|
||||||
public class ImageSimilarityService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
ImageMongoService imageMongoService;
|
|
||||||
@Autowired
|
|
||||||
FileManagementStorageService fileManagementStorageService;
|
|
||||||
@Autowired
|
|
||||||
ObjectMapper objectMapper;
|
|
||||||
|
|
||||||
|
|
||||||
//load all recat requests and find similiar images
|
|
||||||
public void saveImages(String templateId, String dossierId, String fileId, String storageId) throws IOException {
|
|
||||||
//load structure files of all files in template
|
|
||||||
List<ImageDocument> imageDocuments = new ArrayList<>();
|
|
||||||
try (InputStream inputStream = fileManagementStorageService.getObject(TenantContext.getTenantId(), storageId)) {
|
|
||||||
//load images from structures
|
|
||||||
DocumentStructure documentStructure = objectMapper.readValue(inputStream, DocumentStructure.class);
|
|
||||||
documentStructure.streamAllEntries()
|
|
||||||
.filter(entry -> entry.getType().equals(NodeType.IMAGE))
|
|
||||||
.forEach(i -> {
|
|
||||||
Map<String, String> properties = i.getProperties();
|
|
||||||
ImageDocument imageDocument = new ImageDocument();
|
|
||||||
imageDocument.setImageId(properties.get("id"));
|
|
||||||
imageDocument.setFeatureVector(parseRepresentationVector(properties.get("representationHash")));
|
|
||||||
imageDocument.setTemplateId(templateId);
|
|
||||||
imageDocument.setDossierId(dossierId);
|
|
||||||
imageDocument.setFileId(fileId);
|
|
||||||
imageDocuments.add(imageDocument);
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (imageDocuments.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
imageMongoService.saveImages(imageDocuments);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public List<ImageDocument> findSimilarImages(String centroId, double distance, Scope scope) throws Exception {
|
|
||||||
|
|
||||||
ImageDocument centroImage = this.imageMongoService.findById(centroId);
|
|
||||||
log.info("image received with id {}: {}",centroId, centroImage);
|
|
||||||
List<ImageDocument> similarImages = this.imageMongoService.findSimilarImages(centroImage, distance, scope);
|
|
||||||
log.info("received similar images: {}",similarImages);
|
|
||||||
return similarImages.stream()
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static double[] parseRepresentationVector(String representationHash) {
|
|
||||||
|
|
||||||
double[] doubleArray = new double[representationHash.length()];
|
|
||||||
|
|
||||||
for (int i = 0; i < representationHash.length(); i++) {
|
|
||||||
char c = representationHash.charAt(i);
|
|
||||||
if (Character.isDigit(c)) {
|
|
||||||
// Convert numeric characters directly to their numeric values
|
|
||||||
doubleArray[i] = Character.getNumericValue(c);
|
|
||||||
} else if (Character.isLetter(c)) {
|
|
||||||
// Convert alphabetic characters to their position in the alphabet
|
|
||||||
// 'A' or 'a' -> 10, 'B' or 'b' -> 11, ..., 'F' or 'f' -> 15
|
|
||||||
doubleArray[i] = 10 + Character.toUpperCase(c) - 'A';
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Invalid character in input string: " + c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return doubleArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class ImageSize {
|
|
||||||
|
|
||||||
private float quotient;
|
|
||||||
private boolean tooLarge;
|
|
||||||
private boolean tooSmall;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Position {
|
|
||||||
|
|
||||||
private float x1;
|
|
||||||
private float x2;
|
|
||||||
private float y1;
|
|
||||||
private float y2;
|
|
||||||
private int pageNumber;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service.image;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Data;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@Builder
|
|
||||||
@NoArgsConstructor
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class Probability {
|
|
||||||
|
|
||||||
private boolean unconfident;
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
package com.iqser.red.service.persistence.management.v1.processor.service;
|
|
||||||
|
|
||||||
public class ImageClusteringTest {
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user