View Javadoc

1   /**
2    * Copyright (c) 2011, The University of Southampton and the individual contributors.
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without modification,
6    * are permitted provided that the following conditions are met:
7    *
8    *   * 	Redistributions of source code must retain the above copyright notice,
9    * 	this list of conditions and the following disclaimer.
10   *
11   *   *	Redistributions in binary form must reproduce the above copyright notice,
12   * 	this list of conditions and the following disclaimer in the documentation
13   * 	and/or other materials provided with the distribution.
14   *
15   *   *	Neither the name of the University of Southampton nor the names of its
16   * 	contributors may be used to endorse or promote products derived from this
17   * 	software without specific prior written permission.
18   *
19   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
23   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26   * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package org.openimaj.demos;
31  
32  import java.io.File;
33  import java.io.IOException;
34  import java.util.ArrayList;
35  import java.util.Collections;
36  import java.util.List;
37  
38  import org.openimaj.feature.local.list.MemoryLocalFeatureList;
39  import org.openimaj.image.feature.local.aggregate.FisherVector;
40  import org.openimaj.image.feature.local.keypoints.FloatKeypoint;
41  import org.openimaj.image.feature.local.keypoints.Keypoint;
42  import org.openimaj.math.matrix.algorithm.pca.ThinSvdPrincipalComponentAnalysis;
43  import org.openimaj.math.statistics.distribution.MixtureOfGaussians;
44  import org.openimaj.ml.gmm.GaussianMixtureModelEM;
45  import org.openimaj.ml.gmm.GaussianMixtureModelEM.CovarianceType;
46  import org.openimaj.util.array.ArrayUtils;
47  
48  import Jama.Matrix;
49  
50  public class FisherTesting {
51  	public static void main(String[] args) throws IOException {
52  		final List<MemoryLocalFeatureList<FloatKeypoint>> data = new ArrayList<MemoryLocalFeatureList<FloatKeypoint>>();
53  		final List<FloatKeypoint> allKeys = new ArrayList<FloatKeypoint>();
54  
55  		for (int i = 0; i < 100; i++) {
56  			final MemoryLocalFeatureList<FloatKeypoint> tmp = FloatKeypoint.convert(MemoryLocalFeatureList.read(
57  					new File(String.format("/Users/jsh2/Data/ukbench/sift/ukbench%05d.jpg", i)), Keypoint.class));
58  			data.add(tmp);
59  			allKeys.addAll(tmp);
60  		}
61  
62  		Collections.shuffle(allKeys);
63  
64  		final double[][] sample128 = new double[1000][];
65  		for (int i = 0; i < sample128.length; i++) {
66  			sample128[i] = ArrayUtils.convertToDouble(allKeys.get(i).vector);
67  		}
68  
69  		System.out.println("Performing PCA " + sample128.length);
70  		final ThinSvdPrincipalComponentAnalysis pca = new ThinSvdPrincipalComponentAnalysis(64);
71  		pca.learnBasis(sample128);
72  		final double[][] sample64 = pca.project(new Matrix(sample128)).getArray();
73  
74  		System.out.println("Projecting features");
75  		for (final MemoryLocalFeatureList<FloatKeypoint> kpl : data) {
76  			for (final FloatKeypoint kp : kpl) {
77  				kp.vector = ArrayUtils.convertToFloat(pca.project(ArrayUtils.convertToDouble(kp.vector)));
78  			}
79  		}
80  
81  		System.out.println("Learning GMM " + sample64.length);
82  		final GaussianMixtureModelEM gmmem = new GaussianMixtureModelEM(512, CovarianceType.Diagonal);
83  		final MixtureOfGaussians gmm = gmmem.estimate(sample64);
84  
85  		final double[][] v1 = gmm.logProbability(new double[][] { sample64[0] });
86  		final double[][] v2 = MixtureOfGaussians.logProbability(new double[][] { sample64[0] }, gmm.gaussians);
87  
88  		System.out.println("Done");
89  
90  		// for (int i = 0; i < 512; i++) {
91  		// System.out.println(gmm.gaussians[i].getMean().get(0, 0) + "," +
92  		// gmm.gaussians[i].getMean().get(0, 1));
93  		// }
94  
95  		final FisherVector<float[]> fisher = new FisherVector<float[]>(gmm, true, true);
96  
97  		final List<FloatKeypoint> kpl = allKeys.subList(0, 26000);
98  		final long t1 = System.currentTimeMillis();
99  		fisher.aggregate(kpl).asDoubleVector();
100 		final long t2 = System.currentTimeMillis();
101 		System.out.println(t2 - t1);
102 
103 		// int i = 0;
104 		// final double[][] fvs = new double[5][];
105 		// for (final MemoryLocalFeatureList<FloatKeypoint> kpl : data) {
106 		// final long t1 = System.currentTimeMillis();
107 		// fvs[i++] = fisher.aggregate(kpl).asDoubleVector();
108 		// final long t2 = System.currentTimeMillis();
109 		// System.out.println(t2 - t1);
110 		//
111 		// if (i == 5)
112 		// break;
113 		// }
114 		//
115 		// final ThinSvdPrincipalComponentAnalysis pca2 = new
116 		// ThinSvdPrincipalComponentAnalysis(128);
117 		// pca2.learnBasis(fvs);
118 	}
119 }