net.semanticmetadata.lire.benchmarking.TestSimple.java Source code

Java tutorial

Introduction

Here is the source code for net.semanticmetadata.lire.benchmarking.TestSimple.java

Source

/*
 * This file is part of the LIRE project: http://www.semanticmetadata.net/lire
 * LIRE is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * LIRE is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LIRE; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * We kindly ask you to refer the any or one of the following publications in
 * any publication mentioning or employing Lire:
 *
 * Lux Mathias, Savvas A. Chatzichristofis. Lire: Lucene Image Retrieval 
 * An Extensible Java CBIR Library. In proceedings of the 16th ACM International
 * Conference on Multimedia, pp. 1085-1088, Vancouver, Canada, 2008
 * URL: http://doi.acm.org/10.1145/1459359.1459577
 *
 * Lux Mathias. Content Based Image Retrieval with LIRE. In proceedings of the
 * 19th ACM International Conference on Multimedia, pp. 735-738, Scottsdale,
 * Arizona, USA, 2011
 * URL: http://dl.acm.org/citation.cfm?id=2072432
 *
 * Mathias Lux, Oge Marques. Visual Information Retrieval using Java and LIRE
 * Morgan & Claypool, 2013
 * URL: http://www.morganclaypool.com/doi/abs/10.2200/S00468ED1V01Y201301ICR025
 *
 * Copyright statement:
 * ====================
 * (c) 2002-2013 by Mathias Lux (mathias@juggle.at)
 *  http://www.semanticmetadata.net/lire, http://www.lire-project.net
 *
 * Updated: 03.08.13 09:07
 */

package net.semanticmetadata.lire.benchmarking;

import junit.framework.TestCase;
import net.semanticmetadata.lire.DocumentBuilder;
import net.semanticmetadata.lire.ImageSearchHits;
import net.semanticmetadata.lire.ImageSearcher;
import net.semanticmetadata.lire.imageanalysis.bovw.SimpleFeatureBOVWBuilder;
import net.semanticmetadata.lire.impl.*;
import net.semanticmetadata.lire.indexing.parallel.ParallelIndexer;
import net.semanticmetadata.lire.utils.FileUtils;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultiFields;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.IOContext;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Bits;

import javax.imageio.ImageIO;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: nek.anag
 * Date: 25.02.15
 * Time: 15:30
 */
public class TestSimple extends TestCase {
    //myDatabase
    private String indexPath = "myDatabase-index";
    //    private final String indexPath = "myDatabase-index-000000000";
    private final String collectionPath = "C:\\myDatabase";
    private final String queriesOutsideCollectionPath = "C:\\qimages";
    private final String queriesFile = "queriesFile.txt";

    private int sample = 2000; //Sample to create codebook
    private int clusters = 512; //Number of clusters for codebook

    private HashSet<String> allQueries;
    private LinkedList<Document> outsideQueries;

    ParallelIndexer parallelIndexer;

    protected void setUp() throws Exception {
        super.setUp();
        indexPath += "-" + System.currentTimeMillis() % (1000 * 60 * 60 * 24 * 7);
        // Setting up DocumentBuilder:
        parallelIndexer = new ParallelIndexer(16, indexPath, collectionPath, true) {
            @Override
            public void addBuilders(ChainedDocumentBuilder builder) {
                //Tests for SIMPLE
                builder.addBuilder(new SimpleBuilder(new CEDD(), SimpleBuilder.KeypointDetector.Random));
                //                builder.addBuilder(new SimpleBuilder(new FCTH(), SimpleBuilder.KeypointDetector.Random));
                //                builder.addBuilder(new SimpleBuilder(new JCD(), SimpleBuilder.KeypointDetector.Random));
            }
        };

        // Getting the queries:
        BufferedReader br = new BufferedReader(new FileReader(queriesFile));
        String line;
        allQueries = new HashSet<String>(100);
        while ((line = br.readLine()) != null) {
            line = line.trim();
            if (line.startsWith("#") || line.length() < 4)
                continue;
            else {
                allQueries.add(line.trim());
            }
        }
    }

    public void testMAP() throws IOException {
        ///*

        // INDEXING ...
        parallelIndexer.run();

        System.out.println("** SIMPLE BoVW using CEDD and Rand");
        SimpleFeatureBOVWBuilder simpleBovwBuilderCEDD = new SimpleFeatureBOVWBuilder(
                DirectoryReader.open(FSDirectory.open(new File(indexPath))), new CEDD(),
                SimpleBuilder.KeypointDetector.Random, sample, clusters);
        //        simpleBovwBuilderCEDD.setDeleteLocalFeatures(false);
        simpleBovwBuilderCEDD.index();

        //        System.out.println("** SIMPLE BoVW using FCTH and Rand");
        //        SimpleFeatureBOVWBuilder simpleBovwBuilderFCTH = new SimpleFeatureBOVWBuilder(DirectoryReader.open(FSDirectory.open(new File(indexPath))), new FCTH(), SimpleBuilder.KeypointDetector.Random, sample, clusters);
        ////        simpleBovwBuilderFCTH.setDeleteLocalFeatures(false);
        //        simpleBovwBuilderFCTH.index();
        //
        //        System.out.println("** SIMPLE BoVW using JCD and Rand");
        //        SimpleFeatureBOVWBuilder simpleBovwBuilderJCD = new SimpleFeatureBOVWBuilder(DirectoryReader.open(FSDirectory.open(new File(indexPath))), new JCD(), SimpleBuilder.KeypointDetector.Random, sample, clusters);
        //        simpleBovwBuilderJCD.index();

        //*/

        // Read queries tha are not included in the collection
        outsideQueries = new LinkedList<Document>();
        outsideQueries.clear();
        if (queriesOutsideCollectionPath != null) {
            SimpleFeatureBOVWBuilder sCEDDBuilderforQueries = new SimpleFeatureBOVWBuilder(
                    DirectoryReader.open(FSDirectory.open(new File(indexPath))), new CEDD(),
                    SimpleBuilder.KeypointDetector.Random);
            //            SimpleFeatureBOVWBuilder sFCTHBuilderforQueries = new SimpleFeatureBOVWBuilder(DirectoryReader.open(FSDirectory.open(new File(indexPath))), new FCTH(), SimpleBuilder.KeypointDetector.Random);
            //            SimpleFeatureBOVWBuilder sJCDBuilderforQueries = new SimpleFeatureBOVWBuilder(DirectoryReader.open(FSDirectory.open(new File(indexPath))), new JCD(), SimpleBuilder.KeypointDetector.Random);
            ChainedDocumentBuilder documentBuilder = new ChainedDocumentBuilder();
            parallelIndexer.addBuilders(documentBuilder);
            System.out.println("Getting all queries in " + queriesOutsideCollectionPath + ".");
            List<String> files = files = FileUtils.getAllImages(new File(queriesOutsideCollectionPath), true);
            Document query;
            String path;
            for (Iterator<String> iterator = files.iterator(); iterator.hasNext();) {
                path = iterator.next();
                query = documentBuilder.createDocument(ImageIO.read(new File(path)), path);
                query = sCEDDBuilderforQueries.getVisualWords(query);
                //                query = sFCTHBuilderforQueries.getVisualWords(query);
                //                query = sJCDBuilderforQueries.getVisualWords(query);
                outsideQueries.add(query);
            }
        }

        // SEARCHING
        IndexReader reader = DirectoryReader
                .open(new RAMDirectory(FSDirectory.open(new File(indexPath)), IOContext.READONCE));

        System.out.println("Searching...");

        doSearch(new GenericFastImageSearcher(30, GenericDoubleLireFeature.class,
                (new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new CEDD())
                        + DocumentBuilder.FIELD_NAME_BOVW_VECTOR,
                true, reader), "SimpleCEDDRand", reader);
        //        doSearch(new GenericFastImageSearcher(30, GenericDoubleLireFeature.class, (new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new FCTH()) + DocumentBuilder.FIELD_NAME_BOVW_VECTOR, true, reader), "SimpleFCTHRand", reader);
        //        doSearch(new GenericFastImageSearcher(30, GenericDoubleLireFeature.class, (new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new JCD()) + DocumentBuilder.FIELD_NAME_BOVW_VECTOR, true, reader), "SimpleJCDRand", reader);
        //
        //perform weighting schemes
        //        performWSs((new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new CEDD()) + DocumentBuilder.FIELD_NAME_BOVW_VECTOR, "SimpleCEDDRand", reader);
        //        performWSs((new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new FCTH()) + DocumentBuilder.FIELD_NAME_BOVW_VECTOR, "SimpleFCTHRand", reader);
        //        performWSs((new SimpleBuilder()).getFieldName(SimpleBuilder.KeypointDetector.Random, new JCD()) + DocumentBuilder.FIELD_NAME_BOVW_VECTOR, "SimpleJCDRand", reader);

    }

    public void performWSs(String fieldName, String prefix, IndexReader reader) throws IOException {
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, false, false, false), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, false, false, true), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, false, true, false), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, false, true, true), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, true, false, false), prefix, reader);
        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, true, false,
                true), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, true, true, false), prefix, reader);
        //        doSearch(new ImageSearcherUsingWSs(30, GenericDoubleLireFeature.class, fieldName, true, reader, true, true, true), prefix, reader);
    }

    private void doSearch(ImageSearcher searcher, String prefix, IndexReader reader) throws IOException {
        // Needed for check whether the document is deleted.
        Bits liveDocs = MultiFields.getLiveDocs(reader);
        String fileName, fullFileName;
        Document queryDoc;
        ImageSearchHits hits;
        for (int i = 0; i < reader.maxDoc(); i++) {
            if (reader.hasDeletions() && !liveDocs.get(i))
                continue; // if it is deleted, just ignore it.
            fullFileName = reader.document(i).getValues(DocumentBuilder.FIELD_NAME_IDENTIFIER)[0];
            fileName = getIDfromFileName(fullFileName);
            if (allQueries.contains(fileName)) {
                // ok, we've got a query here for a document ...
                queryDoc = reader.document(i);
                hits = searcher.search(queryDoc, reader);
                FileUtils.browseUri(FileUtils.saveImageResultsToHtml(prefix + "-" + fileName, hits, fullFileName));
            }
        }
        for (int i = 0; i < outsideQueries.size(); i++) {
            fullFileName = outsideQueries.get(i).getValues(DocumentBuilder.FIELD_NAME_IDENTIFIER)[0];
            fileName = getIDfromFileName(fullFileName);
            if (allQueries.contains(fileName)) {
                // ok, we've got a query here for a document ...
                queryDoc = outsideQueries.get(i);
                hits = searcher.search(queryDoc, reader);
                FileUtils.browseUri(FileUtils.saveImageResultsToHtml(prefix + "-" + fileName, hits, fullFileName));
            }
        }
    }

    private String getIDfromFileName(String path) {
        // That's the one for Windows. Change for Linux ...
        return path.substring(path.lastIndexOf('\\') + 1);
    }
}