use of org.vitrivr.cineast.core.config.ReadableQueryConfig in project cineast by vitrivr.
the class VisualTextCoEmbedding method getSimilar.
@Override
public List<ScoreElement> getSimilar(String segmentId, ReadableQueryConfig qc) {
// Ensure the correct distance function is used
QueryConfig queryConfig = QueryConfig.clone(qc);
queryConfig.setDistance(DISTANCE);
return super.getSimilar(segmentId, queryConfig);
}
use of org.vitrivr.cineast.core.config.ReadableQueryConfig in project cineast by vitrivr.
the class CLIPImage method getSimilar.
@Override
public List<ScoreElement> getSimilar(SegmentContainer sc, ReadableQueryConfig qc) {
if (sc.getMostRepresentativeFrame() == VideoFrame.EMPTY_VIDEO_FRAME) {
return Collections.emptyList();
}
QueryConfig queryConfig = QueryConfig.clone(qc);
queryConfig.setDistance(DISTANCE);
float[] embeddingArray = embedImage(sc.getMostRepresentativeFrame().getImage().getBufferedImage());
return getSimilar(embeddingArray, queryConfig);
}
use of org.vitrivr.cineast.core.config.ReadableQueryConfig in project cineast by vitrivr.
the class ConceptMasks method getSimilar.
@Override
public List<ScoreElement> getSimilar(SegmentContainer sc, ReadableQueryConfig qc) {
Optional<SemanticMap> optional = sc.getSemanticMap();
if (!optional.isPresent()) {
return Collections.emptyList();
}
DeepLabLabel[][] labels = optional.get().getLabels();
List<DeepLabLabel> list = linearize(labels);
ArrayList<LinkedList<DeepLabLabel>> partitions = GridPartitioner.partition(list, labels.length, labels[0].length, GRID_PARTITIONS, GRID_PARTITIONS);
float[] vector = new float[2 * GRID_PARTITIONS * GRID_PARTITIONS];
float[] weights = new float[2 * GRID_PARTITIONS * GRID_PARTITIONS];
for (int i = 0; i < GRID_PARTITIONS * GRID_PARTITIONS; ++i) {
DeepLabLabel dominantLabel = DeepLabLabel.getDominantLabel(partitions.get(i));
// TODO expose this to the API
float weight = dominantLabel == DeepLabLabel.NOTHING ? 0f : 1f;
weights[2 * i] = weight;
weights[2 * i + 1] = weight;
vector[2 * i] = dominantLabel.getEmbeddX();
vector[2 * i + 1] = dominantLabel.getEmbeddY();
}
return this.getSimilar(vector, new QueryConfig(qc).setDistanceWeights(weights));
}
use of org.vitrivr.cineast.core.config.ReadableQueryConfig in project cineast by vitrivr.
the class AverageColorRaster method getSimilar.
private List<ScoreElement> getSimilar(float[] raster, float[] hist, ReadableQueryConfig rqc) {
final int limit = rqc.getResultsPerModule();
final QueryConfig qc = new QueryConfig(rqc).setDistanceIfEmpty(Distance.chisquared);
List<Map<String, PrimitiveTypeProvider>> rows = this.selector.getNearestNeighbourRows(limit * 5, hist, "hist", qc);
ArrayList<ScoreElement> scores = new ArrayList<>(rows.size());
for (Map<String, PrimitiveTypeProvider> map : rows) {
String id = map.get(GENERIC_ID_COLUMN_QUALIFIER).getString();
double score = register(raster, map.get("raster").getFloatArray());
scores.add(new SegmentScoreElement(id, score));
}
scores.sort(ScoreElement.SCORE_COMPARATOR.reversed());
if (scores.size() > limit) {
return scores.subList(0, limit);
} else {
return scores;
}
}
use of org.vitrivr.cineast.core.config.ReadableQueryConfig in project cineast by vitrivr.
the class HPCPShingle method postprocessQuery.
/**
* This method represents the last step that's executed when processing a query. A list of partial-results (DistanceElements) returned by the lookup stage is processed based on some internal method and finally converted to a list of ScoreElements. The filtered list of ScoreElements is returned by the feature module during retrieval.
*
* @param partialResults List of partial results returned by the lookup stage.
* @param qc A ReadableQueryConfig object that contains query-related configuration parameters.
* @return List of final results. Is supposed to be de-duplicated and the number of items should not exceed the number of items per module.
*/
@Override
protected List<ScoreElement> postprocessQuery(List<SegmentDistanceElement> partialResults, ReadableQueryConfig qc) {
/* Prepare helper data-structures. */
final HashMap<String, DistanceElement> map = new HashMap<>();
for (DistanceElement hit : partialResults) {
if (hit.getDistance() <= this.distanceThreshold) {
map.merge(hit.getId(), hit, (o, n) -> new SegmentDistanceElement(o.getId(), (o.getDistance() + n.getDistance()) / 2));
}
}
/* Prepare final result-set. */
final CorrespondenceFunction fkt = qc.getCorrespondenceFunction().orElse(this.correspondence);
return ScoreElement.filterMaximumScores(map.entrySet().stream().map(e -> e.getValue().toScore(fkt)));
}
Aggregations