package anotacja; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class WebCBIR { public static File baseFolder; public static File imageFolder; //ustawienie sposobu odczytu danych: binarny/tekstowy public static boolean binaryStorage = true; //dodatkowy etap weryfikacji przestrzennej //informacja przestrzenna przechowywana //jest tylko w zapisie binarnym //okresla ile obrazow z rankingu jest brane do weryfikacji //zero oznacza braz weryfikacji public static int spatialValidation = 500; //flaga pomocnicza do wydruku czasu wyszukiwania private static boolean DEBUG_PRINT_TIME = false; //ustawlenie liczby klastrow dla wywolania z main public static int MAIN_RUN_CLUSTERS = 100; public class Ordered implements Comparable> { private double value; private T element; public Ordered(T element, double value) { this.element = element; this.value = value; } public T get() { return this.element; } public double value() { return this.value; } @Override public int compareTo(Ordered arg0) { return Double.compare(arg0.value, this.value); } } public WebCBIR(String basePath, String imagePath, int spatialValidation) { baseFolder = new File(basePath); imageFolder = new File(imagePath); WebCBIR.spatialValidation=spatialValidation; //inicjalizacja parametrow indeksu odwrotnego InvertedIndex.GlobalInitialize(baseFolder, binaryStorage); QueryData.GlobalInitialize(baseFolder, binaryStorage, spatialValidation > 0); } public static String nameSimilarity(float value) { if (value >= 0.75f) return "Very high"; if (value >= 0.50f) return "High"; if (value >= 0.25f) return "Medium"; return "Low"; } public static void printSimilarity(List> result, String query, boolean enclose) { if (enclose) System.out.println(""); System.out.println("Processed " + result.size() + " images."); int count = Math.min(20, result.size()); for (int i = 0; i < count; i++) { String out = result.get(i).get(); String queryName = binaryStorage ? query + ".bin" : query; if (out.equals(queryName)) continue; int resIndex = out.lastIndexOf(".png"); out = out.substring(0, resIndex + 4); System.out.print(""); System.out.print("Similarity: " + (float)result.get(i).value() + ""); System.out.println(); } if (enclose) System.out.println(""); } /*public int compareTwoQueries(String firstQuery, String secondQuery) { int[] data1 = readData(firstQuery); int[] data2 = readData(secondQuery); int cl = 100000; int[] h1 = new int[cl]; int[] h2 = new int[cl]; for (int i : data1) h1[i]++; for (int i : data2) h2[i]++; int sim = 0; for (int i = 0; i < cl; i++) sim += h1[i] * h2[i]; return sim; }*/ private InvertedIndex[] cindex = null; public List> compareAllToQuery(String queryData, int clusters) throws Exception { List> result = null; QueryData data = new QueryData(queryData); data.sortData(); long timeStart = System.currentTimeMillis(); InvertedIndex[] index = cindex == null ? cindex = new InvertedIndex[clusters] : cindex; BCBagOfWords sim = new BCBagOfWords(index); float[] similarity = sim.measure(data); if (spatialValidation > 0) { List> top = new ArrayList>(); for (int i = 0; i < similarity.length; i++) { top.add(new Ordered(i, similarity[i])); } Collections.sort(top); boolean[] active = new boolean[InvertedIndex.content.size()]; //wykonaj weryfikacje przestrzenna tylko dla N elementow for (int i = 0; i < Math.min(spatialValidation, top.size()); i++) { active[top.get(i).get()] = true; } //drugi etap wyszukiwania, oparty na weryfikacji przestrzennej BCSpatialValidation spatial = new BCSpatialValidation(index); //podmien informacje o podobienstwie na nowa similarity = spatial.measure(data, active, similarity); } long timeEnd = System.currentTimeMillis(); if (DEBUG_PRINT_TIME) { System.out.println("Debug: search time: " + (timeEnd - timeStart)); } result = new ArrayList>(); for (int i = 0; i < InvertedIndex.content.size(); i++) { result.add(new Ordered(InvertedIndex.content.get(i), similarity[i])); } Collections.sort(result); return result; } public static void main(String[] args) { if (args.length != 3) { System.out.println("No correct query given."); return; } String query = args[0]; WebCBIR CBIR = new WebCBIR(args[1], args[2],500); try { WebCBIR.printSimilarity(CBIR.compareAllToQuery(query, MAIN_RUN_CLUSTERS), query, true); } catch (Exception ex) { ex.printStackTrace(); } } }