Commit fa3e558618a7c3eae0771294ce9a243c8819d1a0

Authored by Josh Klontz
1 parent 0239196a

removed ebif

openbr/plugins/classification/ebif.cpp deleted
1   -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2   - * Copyright 2012 The MITRE Corporation *
3   - * *
4   - * Licensed under the Apache License, Version 2.0 (the "License"); *
5   - * you may not use this file except in compliance with the License. *
6   - * You may obtain a copy of the License at *
7   - * *
8   - * http://www.apache.org/licenses/LICENSE-2.0 *
9   - * *
10   - * Unless required by applicable law or agreed to in writing, software *
11   - * distributed under the License is distributed on an "AS IS" BASIS, *
12   - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13   - * See the License for the specific language governing permissions and *
14   - * limitations under the License. *
15   - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
16   -
17   -#include <opencv2/imgproc/imgproc.hpp>
18   -
19   -#include <openbr/plugins/openbr_internal.h>
20   -#include <openbr/core/common.h>
21   -#include <openbr/core/opencvutils.h>
22   -
23   -using namespace cv;
24   -
25   -namespace br
26   -{
27   -
28   -/*!
29   - * \ingroup transforms
30   - * \brief Face Recognition Using Early Biologically Inspired Features
31   - * \br_paper Li, Min, et al.
32   - * "Face recognition using early biologically inspired features."
33   - * Biometrics: Theory, Applications and Systems (BTAS), 2013 IEEE Sixth International Conference on. IEEE, 2013.
34   - * \author Josh Klontz \cite jklontz
35   - * \br_property int N The number of scales. Default is 6.
36   - * \br_property int M The number of orientations between 0 and pi. Default is 9.
37   - */
38   -class EBIFTransform : public UntrainableTransform
39   -{
40   - Q_OBJECT
41   - Q_PROPERTY(int N READ get_N WRITE set_N RESET reset_N STORED false) // scales
42   - Q_PROPERTY(int M READ get_M WRITE set_M RESET reset_M STORED false) // orientations
43   - BR_PROPERTY(int, N, 6)
44   - BR_PROPERTY(int, M, 9)
45   -
46   - QList<Transform*> orientations;
47   -
48   - void init()
49   - {
50   - for (int m=0; m<M; m++)
51   - orientations.append(make(QString("Gabor(%1,%2,%3,%4,%5,Phase)+Abs").arg(
52   - QString::number(5), // lambda = 5 (just one wavelength)
53   - QString::number(CV_PI*m/M), // M orientations between 0 and pi
54   - QString::number(0), // psi = 0 (no offset)
55   - QString::number(3), // sigma = 3 (just one width)
56   - QString::number(1) // gamma = 1 (no skew)
57   - )));
58   - }
59   -
60   - void project(const Template &src, Template &dst) const
61   - {
62   - // Compute the image pyramid
63   - Template scales;
64   - float scaleFactor = 1;
65   - for (int n=0; n<N; n++) {
66   - Mat scale;
67   - const int width = src.m().cols * scaleFactor;
68   - const int height = src.m().rows * scaleFactor;
69   - resize(src, scale, Size(width, height));
70   - scale.convertTo(scale, CV_32F);
71   - scales.append(scale);
72   - scaleFactor /= sqrt(2.f);
73   - }
74   -
75   - // Mean and standard deviation pooling
76   - QList< QList<float> > features;
77   - foreach (Transform *orientation, orientations) {
78   - // Compute the reponse wavelet response
79   - Template response;
80   - orientation->project(scales, response);
81   -
82   - // Pool for each two adjacent features
83   - QList<float> orientedFeatures;
84   - for (int i=0; i<N-1; i++)
85   - orientedFeatures.append(pool(response[i], response[i+1]));
86   - features.append(orientedFeatures);
87   - }
88   -
89   - // L2 normalization across orientations
90   - for (int i=0; i<features.first().size(); i++) {
91   - float squaredSum = 0;
92   - for (int m=0; m<M; m++) {
93   - const float val = features[m][i];
94   - squaredSum += val * val;
95   - }
96   - const float norm = 1/sqrt(squaredSum + 0.001 /* Avoid division by zero */);
97   - for (int m=0; m<M; m++)
98   - features[m][i] *= norm;
99   - }
100   -
101   - // Group features by location (not done in paper)
102   - for (int i=0; i<features.first().size(); i+=2) {
103   - QList<float> localFeatures; localFeatures.reserve(2*M);
104   - for (int m=0; m<M; m++) {
105   - localFeatures.append(features[m][i]); // mean
106   - localFeatures.append(features[m][i+1]); // standard deviation
107   - }
108   - dst += OpenCVUtils::toMat(localFeatures);
109   - }
110   - }
111   -
112   - QList<float> pool(const Mat &bottom, const Mat &top) const
113   - {
114   - QList<float> features;
115   - for (int i=0; i<=top.rows-3; i+=3) {
116   - for (int j=0; j<=top.cols-3; j+=3) {
117   - QList<float> vals; vals.reserve(3*3 + 4*4);
118   -
119   - // Top values
120   - for (int k=0; k<3; k++) {
121   - const float *data = top.ptr<float>(i+k, j);
122   - for (int l=0; l<3; l++)
123   - vals.append(data[l]);
124   - }
125   -
126   - // Bottom values
127   - for (int k=0; k<4; k++) {
128   - const float *data = bottom.ptr<float>(4*i/3+k, 4*j/3);
129   - for (int l=0; l<4; l++)
130   - vals.append(data[l]);
131   - }
132   -
133   - double mean, stddev;
134   - Common::MeanStdDev(vals, &mean, &stddev);
135   - features.append(mean);
136   - features.append(stddev);
137   - }
138   - }
139   -
140   - return features;
141   - }
142   -};
143   -
144   -BR_REGISTER(Transform, EBIFTransform)
145   -
146   -} // namespace br
147   -
148   -#include "classification/ebif.moc"