package gr.iti.mklab.visual.examples;
import gr.iti.mklab.visual.aggregation.VladAggregatorMultipleVocabularies;
import gr.iti.mklab.visual.datastructures.IVFPQ;
import gr.iti.mklab.visual.datastructures.Linear;
import gr.iti.mklab.visual.datastructures.PQ;
import gr.iti.mklab.visual.dimreduction.PCA;
import gr.iti.mklab.visual.extraction.AbstractFeatureExtractor;
import gr.iti.mklab.visual.extraction.SURFExtractor;
import gr.iti.mklab.visual.utilities.Answer;
import gr.iti.mklab.visual.utilities.Normalization;
import gr.iti.mklab.visual.utilities.Result;
import gr.iti.mklab.visual.vectorization.ImageVectorization;
import gr.iti.mklab.visual.vectorization.ImageVectorizationResult;
import java.io.File;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Example {
public static void main(String[] args) throws Exception {
// parameters
int maxNumPixels = 768 * 512; // use 1024*768 for better/slower extraction
int[] numCentroids = { 128, 128, 128, 128 };
int initialLength = numCentroids.length * numCentroids[0] * AbstractFeatureExtractor.SURFLength;
int targetLengthMax = 1024;
// int targetLength1 = 256;
int targetLength2 = 1024;
// int targetLength3 = 1024;
int maximumNumVectors = 1000000;
// String indexFolder = "/home/manos/git/multimedia-indexing/indices/";
// String fullVectorIndexFolder = indexFolder + "main";
// int m1 = 16; // num subvectors
// String ivfpqIndex1Folder = indexFolder + "cheap";
int m2 = 64;
// String ivfpqIndex2Folder = indexFolder + "medium";
// int m3 = 128;
// String ivfpqIndex3Folder = "best";
String linearIndexFolder = "/disk2_data/VisualIndex/data/prototype/linear";
String ivfpqIndexFolder = "/disk2_data/VisualIndex/data/prototype/ivfpq";
int k_c = 256;
int numCoarseCentroids = 8192;
String learningFolder = "/home/manosetro/git/multimedia-indexing/learning_files/";
/*
* String[] codebookFiles = { learningFolder + "surf_l2_128c_0.csv", learningFolder +
* "surf_l2_128c_1.csv", learningFolder + "surf_l2_128c_2.csv", learningFolder + "surf_l2_128c_3.csv"
* };
*
* String pcaFile = learningFolder + "pca_surf_4x128_32768to1024.txt";
*/
// String coarseQuantizerFile1 = learningFolder + "qcoarse_256d_8192k.csv";
String coarseQuantizerFile2 = learningFolder + "qcoarse_1024d_8192k.csv";
// String coarseQuantizerFile3 = learningFolder + "qcoarse_1024d_8192k.csv";
// String productQuantizerFile1 = learningFolder + "pq_256_16x8_rp_ivf_k8192.csv";
String productQuantizerFile2 = learningFolder + "pq_1024_64x8_rp_ivf_8192k.csv";
// String productQuantizerFile3 = learningFolder + "pq_1024_128x8_rp_ivf_8192k.csv";
/*
* ImageVectorization.setFeatureExtractor(new SURFExtractor());
* ImageVectorization.setVladAggregator(new VladAggregatorMultipleVocabularies(codebookFiles,
* numCentroids, AbstractFeatureExtractor.SURFLength));
*
* if (targetLengthMax < initialLength) { PCA pca = new PCA(targetLengthMax, 1, initialLength, true);
* pca.loadPCAFromFile(pcaFile); ImageVectorization.setPcaProjector(pca); }
*/
// System.out.println("PCA loaded!");
// creating/loading the indices
// this linear index contains plain 1024d vectors and is not loaded in memory
Linear linear = new Linear(targetLengthMax, targetLengthMax, false, linearIndexFolder, true, true, 0);
// this is the cheaper IVFPQ index and is loaded in memory
IVFPQ ivfpq_1 = new IVFPQ(targetLength2, maximumNumVectors, false, ivfpqIndexFolder, m2, k_c,
PQ.TransformationType.RandomPermutation, numCoarseCentroids, true, 0, true, 512);
ivfpq_1.loadCoarseQuantizer(coarseQuantizerFile2);
ivfpq_1.loadProductQuantizer(productQuantizerFile2);
int w = 64; // larger values will improve results/increase seach time
ivfpq_1.setW(w); // how many (out of 8192) lists should be visited during search.
System.out.println("Indices created!");
for (int i = 0; i < linear.getLoadCounter(); i++) {
String id = linear.getId(i);
System.out.println(i + " => " + id);
double[] vector = linear.getVector(i);
System.out.println(vector.length);
Answer r = ivfpq_1.computeNearestNeighbors(100, vector);
System.out.println(r.getIds().length);
}
// IVFPQ ivfpq_2 = new IVFPQ(targetLength, maximumNumVectors, false, ivfpqIndex1Folder, m2, k_c,
// PQ.TransformationType.RandomPermutation, numCoarseCentroids, true, 0);
// ivfpq_2.loadCoarseQuantizer(coarseQuantizerFile2);
// ivfpq_2.loadProductQuantizer(productQuantizerFile2);
// IVFPQ ivfpq_3 = new IVFPQ(targetLength, maximumNumVectors, false, ivfpqIndex1Folder, m3, k_c,
// PQ.TransformationType.RandomPermutation, numCoarseCentroids, true, 0);
// ivfpq_3.loadCoarseQuantizer(coarseQuantizerFile3);
// ivfpq_3.loadProductQuantizer(productQuantizerFile3);
// File imageFolder = new File("/media/manos/Data/Pictures/Sofia 2013");
// // setting up the vectorizer and extracting the vector of a single image
// for(String imageFilename : imageFolder.list()) {
// if(!imageFilename.endsWith("JPG"))
// continue;
//
// System.out.println(imageFilename);
// ImageVectorization imvec = new ImageVectorization(imageFolder.toString()+"/", imageFilename,
// targetLengthMax,
// maxNumPixels);
//
// ImageVectorizationResult imvr = imvec.call();
// double[] vector = imvr.getImageVector();
// System.out.println(Arrays.toString(vector));
//
//
// // indexing a vector
// String id = imageFilename;
//
// // the full vector is indexed in the disk-based index
// //linear.indexVector(id, vector);
//
// // the vector is truncated to the correct dimension and renormalized before sending to the
// ram-based index
// double[] newVector = Arrays.copyOf(vector, targetLength1);
// if (newVector.length < vector.length) {
// Normalization.normalizeL2(newVector);
// }
// ivfpq_1.indexVector(id, newVector);
//
// }
/*
* int p=0, n=0; for(String imageFilename : imageFolder.list()) { if(!imageFilename.endsWith("JPG"))
* continue;
*
* // indexing a vector String id = imageFilename;
*
* // querying the ram-based index with a vector
*
* // this a vector from an already indexed image int iid = linear.getInternalId(id); double[] qVector
* = linear.getVector(iid);
*
* int k = 5; // nearest neighbors System.out.println("Image : " + id);
*
* long t = System.currentTimeMillis(); Result[] exactResults = linear.computeNearestNeighbors(k,
* qVector).getResults(); t = System.currentTimeMillis() - t; System.out.println("Exact results (" +
* exactResults.length + ") in " + t + " msecs!"); Set<String> set1 = new HashSet<String>(); for
* (Result r : exactResults) { set1.add(r.getId()); }
*
* t = System.currentTimeMillis(); Result[] approximateResults = ivfpq_1.computeNearestNeighbors(k,
* qVector).getResults(); t = System.currentTimeMillis() - t;
* System.out.println("Approximate results (" + approximateResults.length + ") in " + t + " msecs!");
* Set<String> set2 = new HashSet<String>(); for (Result r : approximateResults) {
* set2.add(r.getId()); }
*
* set2.retainAll(set1); p += set2.size(); n += 5; System.out.println("Jaccard: " + set2.size() / 5.);
* System.out.println("==================================================="); }
* System.out.println("Jaccard: " + (double)p / (double)n);
*/
}
}