diff --git a/sdk/plugins/algorithms.cpp b/sdk/plugins/algorithms.cpp index 5858336..809e094 100644 --- a/sdk/plugins/algorithms.cpp +++ b/sdk/plugins/algorithms.cpp @@ -32,7 +32,6 @@ class AlgorithmsInitializer : public Initializer { // Face Globals->abbreviations.insert("FaceRecognition", "FaceDetection!!++:MatchProbability(ByteL1)"); - Globals->abbreviations.insert("FaceRecognitionNoTraining", "Open+Cascade(FrontalFace)+ASEFEyes+Affine(256,256,0.25,0.35)+(RG+MAdd(0.5))/(Cvt(Gray)+Gradient+Bin(0,360,8,true))+Merge+Integral+IntegralSampler+CvtFloat:L2"); Globals->abbreviations.insert("GenderClassification", "FaceDetection!!++Discard"); Globals->abbreviations.insert("AgeRegression", "FaceDetection!!++Discard"); Globals->abbreviations.insert("FaceQuality", "Open!Cascade(FrontalFace)+ASEFEyes+Affine(64,64,0.25,0.35)+ImageQuality+Cvt(Gray)+DFFS+Discard"); @@ -43,7 +42,7 @@ class AlgorithmsInitializer : public Initializer Globals->abbreviations.insert("OpenBR", "FaceRecognition"); Globals->abbreviations.insert("GenderEstimation", "GenderClassification"); Globals->abbreviations.insert("AgeEstimation", "AgeRegression"); - Globals->abbreviations.insert("ImageRetrieval", "Open+(RG+MAdd(0.5))/(Cvt(Gray)+Gradient+Bin(0,360,8,true))+Merge+Integral+IntegralSampler+CvtFloat+WordWise(RowWisePCA(8)+RowWiseMeanCenter+Binarize,RowWisePCA)+Sentence:SentenceSimilarity"); + Globals->abbreviations.insert("FaceRecognitionHoG", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(64,64,0.25,0.35)+Gradient+Bin(0,360,8,true)+Merge+Integral+IntegralSampler+ProductQuantization:ProductQuantization"); // Generic Image Processing Globals->abbreviations.insert("SIFT", "Open+KeyPointDetector(SIFT)+KeyPointDescriptor(SIFT):KeyPointMatcher(BruteForce)"); @@ -51,6 +50,7 @@ class AlgorithmsInitializer : public Initializer Globals->abbreviations.insert("SmallSIFT", "Open+LimitSize(512)+KeyPointDetector(SIFT)+KeyPointDescriptor(SIFT):KeyPointMatcher(BruteForce)"); Globals->abbreviations.insert("SmallSURF", "Open+LimitSize(512)+KeyPointDetector(SURF)+KeyPointDescriptor(SURF):KeyPointMatcher(BruteForce)"); Globals->abbreviations.insert("ColorHist", "Open+LimitSize(512)!EnsureChannels(3)+SplitChannels+Hist(256,0,8)+Cat+Normalize(L1):L2"); + Globals->abbreviations.insert("ImageRetrieval", "Open+Cvt(Gray)+Cascade(FrontalFace)+ASEFEyes+Affine(88,88,0.25,0.35)+Gradient+Bin(0,360,8,true)+Merge+Integral+IntegralSampler+WordWise(RowWisePCA(8)+RowWiseMeanCenter+Binarize,RowWisePCA)+Sentence:SentenceSimilarity"); // Hash Globals->abbreviations.insert("FileName", "Name+Identity:Identical"); diff --git a/sdk/plugins/integral.cpp b/sdk/plugins/integral.cpp index e32dd89..3bfd356 100644 --- a/sdk/plugins/integral.cpp +++ b/sdk/plugins/integral.cpp @@ -38,9 +38,9 @@ class IntegralSamplerTransform : public UntrainableTransform Q_PROPERTY(float scaleFactor READ get_scaleFactor WRITE set_scaleFactor RESET reset_scaleFactor STORED false) Q_PROPERTY(float stepFactor READ get_stepFactor WRITE set_stepFactor RESET reset_stepFactor STORED false) Q_PROPERTY(int minSize READ get_minSize WRITE set_minSize RESET reset_minSize STORED false) - BR_PROPERTY(int, scales, 4) + BR_PROPERTY(int, scales, 5) BR_PROPERTY(float, scaleFactor, 1.5) - BR_PROPERTY(float, stepFactor, 0.25) + BR_PROPERTY(float, stepFactor, 0.75) BR_PROPERTY(int, minSize, 8) void project(const Template &src, Template &dst) const @@ -53,21 +53,23 @@ class IntegralSamplerTransform : public UntrainableTransform const int rowStep = channels * m.cols; int descriptors = 0; - int currentSize = min(m.rows, m.cols)-1; + float idealSize = min(m.rows, m.cols)-1; for (int scale=0; scale BayesianProductQuantizationLUTs; +QVector ProductQuantizationLUTs; + +/*! + * \ingroup distances + * \brief Distance in a product quantized space \cite jegou11 + * \author Josh Klontz + */ +class ProductQuantizationDistance : public Distance +{ + Q_OBJECT + Q_PROPERTY(bool bayesian READ get_bayesian WRITE set_bayesian RESET reset_bayesian STORED false) + BR_PROPERTY(bool, bayesian, false) + + float compare(const Template &a, const Template &b) const + { + float distance = 0; + for (int i=0; i centers; public: - BayesianProductQuantizationTransform() + ProductQuantizationTransform() { - index = BayesianProductQuantizationLUTs.size(); - BayesianProductQuantizationLUTs.append(Mat()); + index = ProductQuantizationLUTs.size(); + ProductQuantizationLUTs.append(Mat()); } private: void train(const TemplateList &src) { - Mat data = OpenCVUtils::toMatByRow(src.data()); + Mat data = OpenCVUtils::toMat(src.data()); + qDebug() << data.rows << data.cols; if (data.cols % n != 0) qFatal("Expected dimensionality to be divisible by n."); - Mat &lut = BayesianProductQuantizationLUTs[index]; + Mat &lut = ProductQuantizationLUTs[index]; lut = Mat(data.cols/n, 256*256, CV_32FC1); - for (int i=0; i(i,j*256+k) = norm(center.row(k), center.row(k), NORM_L2); + lut.at(i,j*256+k) = norm(center.row(j), center.row(k), NORM_L2); centers.append(center); } } void project(const Template &src, Template &dst) const { + Mat m = src.m().reshape(1, 1); dst = Mat(1, src.m().cols/n, CV_8UC1); - for (int i=0; i::max(); - Mat m = src.m().colRange(i*n, (i+1)*n); + Mat m_i = m.colRange(i*n, (i+1)*n); for (uchar i=0; i<256; i++) { - double distance = norm(m, centers[index].row(i), NORM_L2); + double distance = norm(m_i, centers[index].row(i), NORM_L2); if (distance < bestDistance) { bestDistance = distance; bestIndex = i; @@ -172,16 +204,16 @@ private: void store(QDataStream &stream) const { - stream << centers << BayesianProductQuantizationLUTs[index]; + stream << centers << ProductQuantizationLUTs[index]; } void load(QDataStream &stream) { - stream >> centers >> BayesianProductQuantizationLUTs[index]; + stream >> centers >> ProductQuantizationLUTs[index]; } }; -BR_REGISTER(Transform, BayesianProductQuantizationTransform) +BR_REGISTER(Transform, ProductQuantizationTransform) } // namespace br