package eu.europeana.creative.dataset.evaluation; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import eu.europeana.creative.dataset.evaluation.om.CategorizedCollection; import eu.europeana.creative.dataset.evaluation.om.EuropeanaImage; import eu.europeana.service.ir.image.api.ImageSearchingService; import eu.europeana.service.ir.image.api.ImageSearchingServiceImpl; import eu.europeana.service.ir.image.exceptions.ImageIndexingException; import eu.europeana.service.ir.image.exceptions.ImageSearchingException; import eu.europeana.service.ir.image.web.model.json.SearchResultItem; //@RunWith(SpringJUnit4ClassRunner.class) //@ContextConfiguration(locations = { "/image-similarity-context.xml" }) public class ComputeSearchResults extends BaseResultComputation { // @Autowired ImageSearchingService imageSearchingService; // image id, image object Map<String, EuropeanaImage> europeanaImages = new HashMap<String, EuropeanaImage>( 8000); // queryId, resultsList Map<String, List<SearchResultItem>> allSearchResults = new HashMap<String, List<SearchResultItem>>( 8000); List<String> skippedItems = new ArrayList<String>(); public ImageSearchingService getImageSearchingService() { if (imageSearchingService == null){ imageSearchingService = new ImageSearchingServiceImpl(DEMO_DATASET, getConfig()); imageSearchingService.init(); } return imageSearchingService; } public List<SearchResultItem> searchById(String id) throws ImageIndexingException, IOException, ImageSearchingException { // EuropeanaId euId = new EuropeanaId(); // // euId.setNewId("/07501/332954D43E8FF3E38D0AED668488886CC91CEDFB"); // euId.setNewId(id); getImageSearchingService().searchSimilar(id); return getImageSearchingService().getResults(0, 26); } public void loadEuropeanaImages(String dataset) throws IOException { // loadEuropeanaImagesFromFile("/Rijksmuseum-miniatur_90402_M_NL_Rijksmuseum.csv", // "objects - decor miniaturs"); // loadEuropeanaImagesFromFile("/Rijksmuseum-portrets_90402_M_NL_Rijksmuseum.csv", // "paintings - portraits" ); // loadEuropeanaImagesFromFile("/NHM-LISABON-butterfly_2023901_Ag_EU_NaturalEurope_all.csv", // "insects - butterflies & mots"); // loadEuropeanaImagesFromFile("/MIMO-trompe_09102_Ag_EU_MIMO_ESE.csv", // "objects - music tromps"); // loadEuropeanaImagesFromFile("/Galileo-optic_02301_Ag_IT_MG_catalogue.csv", // "objects - optics"); // loadEuropeanaImagesFromFile("/Galileo-electric_02301_Ag_IT_MG_catalogue.csv", // "objects - electrical engineering"); // loadEuropeanaImagesFromFile("/Teylers-eagle_10106_Ag_EU_STERNA_48.csv", // "birds - eagles"); // loadEuropeanaImagesFromFile("/Teylers-woodpecker_10106_Ag_EU_STERNA_48.csv", // "birds - woodpeckers"); // loadEuropeanaImagesFromFile("/Teylers-duck_10106_Ag_EU_STERNA_48.csv", // "birds - ducks"); // loadEuropeanaImagesFromFile("/Teylers-parrots_10106_Ag_EU_STERNA_48.csv", // "birds - parrots"); // loadEuropeanaImagesFromFile("/Rijksmuseum-porcelain_90402_M_NL_Rijksmuseum.csv", // "objects - porcelain"); // loadEuropeanaImagesFromFile("/Rijksmuseum-drawing-lanscape_90402_M_NL_Rijksmuseum.csv", // "drawings - landscapes"); // loadEuropeanaImagesFromFile("/Rijksmuseum-bottles_90402_M_NL_Rijksmuseum.csv", // "objects - bottles"); // loadEuropeanaImagesFromFile("/Rijksmuseum-landscape_90402_M_NL_Rijksmuseum.csv", // "paintings - landscapes"); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); // test.insertImageObjectsFromFile(); loadEuropeanaImagesForDataset(dataset); } public void loadEuropeanaImagesFromFile(String fileName, String category) throws IOException { // load ids from file Map<String, String> thumbnailMap = helper.getThumbnailsMap(fileName); // cache europeana images EuropeanaImage image = null; String[] contentClasses = category.split("-"); for (Map.Entry<String, String> thumbnail : thumbnailMap.entrySet()) { image = new EuropeanaImage(); image.setId(thumbnail.getKey()); image.setImageUrl(thumbnail.getValue()); image.setContentClass(contentClasses[0].trim()); image.setContentSubClass(contentClasses[1].trim()); europeanaImages.put(image.getId(), image); } System.out.println("total loaded images: " + europeanaImages.size()); } public void loadEuropeanaImagesForDataset(String dataset) throws FileNotFoundException, IOException { File collectionsFolder = new File( getCollectionsCvsFolder(dataset) ); File[] collections = collectionsFolder.listFiles(); Map<String, String> thumbnailMap = null; CategorizedCollection collection = null; EuropeanaImage euImage = null; for (int i = 0; i < collections.length; i++) { // load ids from file collection = readCategorizedCollection(collections[i]); thumbnailMap = helper.getThumbnailsMap(collections[i]); for (Map.Entry<String, String> thumbnail : thumbnailMap.entrySet()) { euImage = new EuropeanaImage(); euImage.setId(thumbnail.getKey()); euImage.setImageUrl(thumbnail.getValue()); euImage.setContentClass(collection.getContentClass()); euImage.setContentSubClass(collection.getContentSubClass()); europeanaImages.put(euImage.getId(), euImage); } } } @Test public void collectSearchResults() throws IOException, ImageIndexingException, ImageSearchingException { // load id from files String dataset = DEMO_DATASET; loadEuropeanaImages(dataset); // search results for each List<SearchResultItem> results = null; for (String id : europeanaImages.keySet()) { try{ results = searchById(id); allSearchResults.put(id, results); }catch(Exception e){ skippedItems.add(id); } } // write results to cvs file String outFile = getExperimentExecutionResultsFile(dataset); BufferedWriter writer = new BufferedWriter(new FileWriter(outFile)); String currentLine; int cnt = 0; for (String id : allSearchResults.keySet()) { currentLine = buildResultsRow(id); writer.append(currentLine); cnt++; if (cnt % 1000 == 0) { writer.flush(); System.out.println("Results stored :" + cnt); } } writer.close(); } protected String buildResultsRow(String id) { EuropeanaImage currentImage; StringBuilder builder = new StringBuilder(); builder.append(id).append(";"); EuropeanaImage queryImage = europeanaImages.get(id); // set counters (-1 because first result is same as query) int hit5 = -1, hit10 = -1, hit15 = -1, hit20 = -1, hit25 = -1; int hit5s = -1, hit10s = -1, hit15s = -1, hit20s = -1, hit25s = -1; int cnt = 0; // get object category for (SearchResultItem searchResult : allSearchResults.get(id)) { builder.append(searchResult.getResourceId()).append(";"); // get categories currentImage = europeanaImages.get(searchResult.getResourceId()); if (currentImage == null) continue; builder.append(currentImage.getContentClass()).append(";"); builder.append(currentImage.getContentSubClass()).append(";"); // check if same main class if (queryImage.getContentClass().equals( currentImage.getContentClass())) { builder.append("1;"); if (cnt < 6) hit5++; if (cnt < 11) hit10++; if (cnt < 16) hit15++; if (cnt < 21) hit20++; if (cnt < 26) hit25++; } else builder.append("0;"); // check if same subclass if (queryImage.getContentSubClass().equals( currentImage.getContentSubClass())) { builder.append("1;"); if (cnt < 6) hit5s++; if (cnt < 11) hit10s++; if (cnt < 16) hit15s++; if (cnt < 21) hit20s++; if (cnt < 26) hit25s++; } else builder.append("0;"); cnt++; } builder.append(hit5).append(";"); builder.append(hit10).append(";"); builder.append(hit15).append(";"); builder.append(hit20).append(";"); builder.append(hit25).append(";"); builder.append(hit5s).append(";"); builder.append(hit10s).append(";"); builder.append(hit15s).append(";"); builder.append(hit20s).append(";"); builder.append(hit25s).append(";"); builder.append("\n"); return builder.toString(); } }