minor refactoring added more tests minor fixed warnings minor minor minor fixed commentpull/731/head
parent
f162a935d0
commit
43cb60f9d1
5 changed files with 468 additions and 0 deletions
@ -0,0 +1,83 @@ |
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this license. |
||||
If you do not agree to this license, do not download, install, |
||||
copy or use the software. |
||||
|
||||
|
||||
License Agreement |
||||
For Open Source Computer Vision Library |
||||
(3-clause BSD License) |
||||
|
||||
Copyright (C) 2000-2015, Intel Corporation, all rights reserved. |
||||
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. |
||||
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved. |
||||
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. |
||||
Copyright (C) 2015, OpenCV Foundation, all rights reserved. |
||||
Copyright (C) 2015, Itseez Inc., all rights reserved. |
||||
Third party copyrights are property of their respective owners. |
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, |
||||
are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors |
||||
may be used to endorse or promote products derived from this software |
||||
without specific prior written permission. |
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and |
||||
any express or implied warranties, including, but not limited to, the implied |
||||
warranties of merchantability and fitness for a particular purpose are disclaimed. |
||||
In no event shall copyright holders or contributors be liable for any direct, |
||||
indirect, incidental, special, exemplary, or consequential damages |
||||
(including, but not limited to, procurement of substitute goods or services; |
||||
loss of use, data, or profits; or business interruption) however caused |
||||
and on any theory of liability, whether in contract, strict liability, |
||||
or tort (including negligence or otherwise) arising in any way out of |
||||
the use of this software, even if advised of the possibility of such damage. |
||||
*/ |
||||
|
||||
#ifndef __OPENCV_BIF_HPP__ |
||||
#define __OPENCV_BIF_HPP__ |
||||
|
||||
#include "opencv2/core.hpp" |
||||
|
||||
namespace cv { |
||||
namespace face { |
||||
|
||||
/** Implementation of bio-inspired features (BIF) from the paper:
|
||||
* Guo, Guodong, et al. "Human age estimation using bio-inspired features." |
||||
* Computer Vision and Pattern Recognition, 2009. CVPR 2009. |
||||
*/ |
||||
class CV_EXPORTS_W BIF : public Algorithm { |
||||
public: |
||||
/** @returns The number of filter bands used for computing BIF. */ |
||||
CV_WRAP virtual int getNumBands() const = 0; |
||||
|
||||
/** @returns The number of image rotations. */ |
||||
CV_WRAP virtual int getNumRotations() const = 0; |
||||
|
||||
/** Computes features sby input image.
|
||||
* @param image Input image (CV_32FC1). |
||||
* @param features Feature vector (CV_32FC1). |
||||
*/ |
||||
CV_WRAP virtual void compute(InputArray image, |
||||
OutputArray features) const = 0; |
||||
}; |
||||
|
||||
/**
|
||||
* @param num_bands The number of filter bands (<=8) used for computing BIF. |
||||
* @param num_rotations The number of image rotations for computing BIF. |
||||
* @returns Object for computing BIF. |
||||
*/ |
||||
CV_EXPORTS_W cv::Ptr<BIF> createBIF(int num_bands = 8, int num_rotations = 12); |
||||
|
||||
} // namespace cv
|
||||
} // namespace face
|
||||
|
||||
#endif // #ifndef __OPENCV_FACEREC_HPP__
|
@ -0,0 +1,221 @@ |
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this license. |
||||
If you do not agree to this license, do not download, install, |
||||
copy or use the software. |
||||
|
||||
|
||||
License Agreement |
||||
For Open Source Computer Vision Library |
||||
(3-clause BSD License) |
||||
|
||||
Copyright (C) 2000-2015, Intel Corporation, all rights reserved. |
||||
Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved. |
||||
Copyright (C) 2009-2015, NVIDIA Corporation, all rights reserved. |
||||
Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved. |
||||
Copyright (C) 2015, OpenCV Foundation, all rights reserved. |
||||
Copyright (C) 2015, Itseez Inc., all rights reserved. |
||||
Third party copyrights are property of their respective owners. |
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, |
||||
are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors |
||||
may be used to endorse or promote products derived from this software |
||||
without specific prior written permission. |
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and |
||||
any express or implied warranties, including, but not limited to, the implied |
||||
warranties of merchantability and fitness for a particular purpose are disclaimed. |
||||
In no event shall copyright holders or contributors be liable for any direct, |
||||
indirect, incidental, special, exemplary, or consequential damages |
||||
(including, but not limited to, procurement of substitute goods or services; |
||||
loss of use, data, or profits; or business interruption) however caused |
||||
and on any theory of liability, whether in contract, strict liability, |
||||
or tort (including negligence or otherwise) arising in any way out of |
||||
the use of this software, even if advised of the possibility of such damage. |
||||
*/ |
||||
|
||||
|
||||
/*
|
||||
This file contains implementation of the bio-inspired features (BIF) approach |
||||
for computing image descriptors, applicable for human age estimation. For more |
||||
details we refer to [1,2]. |
||||
|
||||
REFERENCES |
||||
[1] Guo, Guodong, et al. "Human age estimation using bio-inspired features." |
||||
Computer Vision and Pattern Recognition, 2009. CVPR 2009. |
||||
[2] Spizhevoi, A. S., and A. V. Bovyrin. "Estimating human age using |
||||
bio-inspired features and the ranking method." Pattern Recognition and |
||||
Image Analysis 25.3 (2015): 547-552. |
||||
*/ |
||||
|
||||
#include "precomp.hpp" |
||||
#include "opencv2/face/bif.hpp" |
||||
#include <iostream> |
||||
#include <vector> |
||||
|
||||
namespace { |
||||
|
||||
// The constants below are taken from paper [1].
|
||||
|
||||
const int kNumBandsMax = 8; |
||||
|
||||
const cv::Size kCellSizes[kNumBandsMax] = { |
||||
cv::Size(6,6), cv::Size(8,8), cv::Size(10,10), cv::Size(12,12), |
||||
cv::Size(14,14), cv::Size(16,16), cv::Size(18,18), cv::Size(20,20) |
||||
}; |
||||
|
||||
const cv::Size kGaborSize[kNumBandsMax][2] = { |
||||
{cv::Size(5,5), cv::Size(7,7)}, {cv::Size(9,9), cv::Size(11,11)}, |
||||
{cv::Size(13,13), cv::Size(15,15)}, {cv::Size(17,17), cv::Size(19,19)}, |
||||
{cv::Size(21,21), cv::Size(23,23)}, {cv::Size(25,25), cv::Size(27,27)}, |
||||
{cv::Size(29,29), cv::Size(31,31)}, {cv::Size(33,33), cv::Size(35,35)} |
||||
}; |
||||
|
||||
const double kGaborGamma = 0.3; |
||||
|
||||
const double kGaborSigmas[kNumBandsMax][2] = { |
||||
{2.0, 2.8}, {3.6, 4.5}, {5.4, 6.3}, {7.3, 8.2}, |
||||
{9.2, 10.2}, {11.3, 12.3}, {13.4, 14.6}, {15.8, 17.0} |
||||
}; |
||||
|
||||
const double kGaborWavelens[kNumBandsMax][2] = { |
||||
{2.5, 3.5}, {4.6, 5.6}, {6.8, 7.9}, {9.1, 10.3}, |
||||
{11.5, 12.7}, {14.1, 15.4}, {16.8, 18.2}, {19.7, 21.2} |
||||
}; |
||||
|
||||
class BIFImpl : public cv::face::BIF { |
||||
public: |
||||
BIFImpl(int num_bands, int num_rotations) { |
||||
initUnits(num_bands, num_rotations); |
||||
} |
||||
|
||||
virtual int getNumBands() const { return num_bands_; } |
||||
|
||||
virtual int getNumRotations() const { return num_rotations_; } |
||||
|
||||
virtual void compute(cv::InputArray image, |
||||
cv::OutputArray features) const; |
||||
|
||||
private: |
||||
struct UnitParams { |
||||
cv::Size cell_size; |
||||
cv::Mat filter1, filter2; |
||||
}; |
||||
|
||||
void initUnits(int num_bands, int num_rotations); |
||||
void computeUnit(int unit_idx, const cv::Mat &img, cv::Mat &dst) const; |
||||
|
||||
int num_bands_; |
||||
int num_rotations_; |
||||
std::vector<UnitParams> units_; |
||||
}; |
||||
|
||||
void BIFImpl::compute(cv::InputArray _image, |
||||
cv::OutputArray _features) const { |
||||
cv::Mat image = _image.getMat(); |
||||
CV_Assert(image.type() == CV_32F); |
||||
|
||||
std::vector<cv::Mat> fea_units(units_.size()); |
||||
int fea_dim = 0; |
||||
|
||||
for (size_t i = 0; i < units_.size(); ++i) { |
||||
computeUnit(static_cast<int>(i), image, fea_units[i]); |
||||
fea_dim += fea_units[i].rows; |
||||
} |
||||
|
||||
_features.create(fea_dim, 1, CV_32F); |
||||
cv::Mat fea = _features.getMat(); |
||||
|
||||
int offset = 0; |
||||
for (size_t i = 0; i < fea_units.size(); ++i) { |
||||
cv::Mat roi = fea.rowRange(offset, offset + fea_units[i].rows); |
||||
fea_units[i].copyTo(roi); |
||||
offset += fea_units[i].rows; |
||||
} |
||||
CV_Assert(offset == fea_dim); |
||||
} |
||||
|
||||
void BIFImpl::initUnits(int num_bands, int num_rotations) { |
||||
CV_Assert(num_bands > 0 && num_bands <= kNumBandsMax); |
||||
CV_Assert(num_rotations > 0); |
||||
|
||||
num_bands_ = num_bands; |
||||
num_rotations_ = num_rotations; |
||||
|
||||
for (int ri = 0; ri < num_rotations; ++ri) { |
||||
double angle = CV_PI / num_rotations * ri; |
||||
|
||||
for (int bi = 0; bi < num_bands; ++bi) { |
||||
cv::Mat kernel[2]; |
||||
for (int i = 0; i < 2; ++i) { |
||||
kernel[i] = cv::getGaborKernel( |
||||
kGaborSize[bi][i], kGaborSigmas[bi][i], angle, |
||||
kGaborWavelens[bi][i], kGaborGamma, 0, CV_32F); |
||||
|
||||
// Make variance for the Gaussian part of the Gabor filter
|
||||
// the same across all filters.
|
||||
kernel[i] /= 2 * kGaborSigmas[bi][i] * kGaborSigmas[bi][i] |
||||
/ kGaborGamma; |
||||
} |
||||
|
||||
UnitParams unit; |
||||
unit.cell_size = kCellSizes[bi]; |
||||
unit.filter1 = kernel[0]; |
||||
unit.filter2 = kernel[1]; |
||||
units_.push_back(unit); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void BIFImpl::computeUnit(int unit_idx, const cv::Mat &img, |
||||
cv::Mat &dst) const { |
||||
cv::Mat resp1, resp2; |
||||
cv::filter2D(img, resp1, CV_32F, units_[unit_idx].filter1); |
||||
cv::filter2D(img, resp2, CV_32F, units_[unit_idx].filter2); |
||||
|
||||
cv::Mat resp, sum, sumsq; |
||||
cv::max(resp1, resp2, resp); |
||||
cv::integral(resp, sum, sumsq); |
||||
|
||||
int Hhalf = units_[unit_idx].cell_size.height / 2; |
||||
int Whalf = units_[unit_idx].cell_size.width / 2; |
||||
|
||||
int nrows = (resp.rows + Hhalf - 1) / Hhalf; |
||||
int ncols = (resp.cols + Whalf - 1) / Whalf; |
||||
dst.create(nrows*ncols, 1, CV_32F); |
||||
|
||||
for (int pos = 0, yc = 0; yc < resp.rows; yc += Hhalf) { |
||||
int y0 = std::max(0, yc - Hhalf); |
||||
int y1 = std::min(resp.rows, yc + Hhalf); |
||||
|
||||
for (int xc = 0; xc < resp.cols; xc += Whalf, ++pos) { |
||||
int x0 = std::max(0, xc - Whalf); |
||||
int x1 = std::min(resp.cols, xc + Whalf); |
||||
int area = (y1-y0) * (x1-x0); |
||||
|
||||
float mean = sum.at<float>(y1,x1) - sum.at<float>(y1,x0) |
||||
- sum.at<float>(y0,x1) + sum.at<float>(y0,x0); |
||||
mean /= area; |
||||
|
||||
double sd = sumsq.at<double>(y1,x1) - sumsq.at<double>(y1,x0) |
||||
- sumsq.at<double>(y0,x1) + sumsq.at<double>(y0,x0); |
||||
sd = sqrt(sd / area - mean * mean); |
||||
|
||||
dst.at<float>(pos) = static_cast<float>(sd); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} // namespace
|
||||
|
||||
cv::Ptr<cv::face::BIF> cv::face::createBIF(int num_bands, int num_rotations) { |
||||
return cv::Ptr<cv::face::BIF>(new BIFImpl(num_bands, num_rotations)); |
||||
} |
@ -0,0 +1,67 @@ |
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this |
||||
license. If you do not agree to this license, do not download, install, |
||||
copy or use the software. |
||||
|
||||
License Agreement |
||||
For Open Source Computer Vision Library |
||||
(3-clause BSD License) |
||||
|
||||
Copyright (C) 2013, OpenCV Foundation, all rights reserved. |
||||
Third party copyrights are property of their respective owners. |
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, |
||||
are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors |
||||
may be used to endorse or promote products derived from this software |
||||
without specific prior written permission. |
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and |
||||
any express or implied warranties, including, but not limited to, the implied |
||||
warranties of merchantability and fitness for a particular purpose are |
||||
disclaimed. In no event shall copyright holders or contributors be liable for |
||||
any direct, indirect, incidental, special, exemplary, or consequential damages |
||||
(including, but not limited to, procurement of substitute goods or services; |
||||
loss of use, data, or profits; or business interruption) however caused |
||||
and on any theory of liability, whether in contract, strict liability, |
||||
or tort (including negligence or otherwise) arising in any way out of |
||||
the use of this software, even if advised of the possibility of such damage. |
||||
*/ |
||||
|
||||
#include "test_precomp.hpp" |
||||
|
||||
TEST(CV_Face_BIF, can_create_default) { |
||||
cv::Ptr<cv::face::BIF> bif; |
||||
EXPECT_NO_THROW(bif = cv::face::createBIF()); |
||||
EXPECT_FALSE(bif.empty()); |
||||
} |
||||
|
||||
TEST(CV_Face_BIF, fails_when_zero_bands) { |
||||
EXPECT_ANY_THROW(cv::face::createBIF(0)); |
||||
} |
||||
|
||||
TEST(CV_Face_BIF, fails_when_too_many_bands) { |
||||
EXPECT_ANY_THROW(cv::face::createBIF(9)); |
||||
} |
||||
|
||||
TEST(CV_Face_BIF, fails_when_zero_rotations) { |
||||
EXPECT_ANY_THROW(cv::face::createBIF(8, 0)); |
||||
} |
||||
|
||||
TEST(CV_Face_BIF, can_compute) { |
||||
cv::Mat image(60, 60, CV_32F); |
||||
cv::theRNG().fill(image, cv::RNG::UNIFORM, -1, 1); |
||||
|
||||
cv::Ptr<cv::face::BIF> bif = cv::face::createBIF(); |
||||
cv::Mat fea; |
||||
EXPECT_NO_THROW(bif->compute(image, fea)); |
||||
EXPECT_EQ(cv::Size(1, 13188), fea.size()); |
||||
} |
@ -0,0 +1,41 @@ |
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this |
||||
license. If you do not agree to this license, do not download, install, |
||||
copy or use the software. |
||||
|
||||
License Agreement |
||||
For Open Source Computer Vision Library |
||||
(3-clause BSD License) |
||||
|
||||
Copyright (C) 2013, OpenCV Foundation, all rights reserved. |
||||
Third party copyrights are property of their respective owners. |
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, |
||||
are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors |
||||
may be used to endorse or promote products derived from this software |
||||
without specific prior written permission. |
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and |
||||
any express or implied warranties, including, but not limited to, the implied |
||||
warranties of merchantability and fitness for a particular purpose are |
||||
disclaimed. In no event shall copyright holders or contributors be liable for |
||||
any direct, indirect, incidental, special, exemplary, or consequential damages |
||||
(including, but not limited to, procurement of substitute goods or services; |
||||
loss of use, data, or profits; or business interruption) however caused |
||||
and on any theory of liability, whether in contract, strict liability, |
||||
or tort (including negligence or otherwise) arising in any way out of |
||||
the use of this software, even if advised of the possibility of such damage. |
||||
*/ |
||||
|
||||
#include "test_precomp.hpp" |
||||
|
||||
CV_TEST_MAIN("cv") |
@ -0,0 +1,56 @@ |
||||
/*
|
||||
By downloading, copying, installing or using the software you agree to this |
||||
license. If you do not agree to this license, do not download, install, |
||||
copy or use the software. |
||||
|
||||
License Agreement |
||||
For Open Source Computer Vision Library |
||||
(3-clause BSD License) |
||||
|
||||
Copyright (C) 2013, OpenCV Foundation, all rights reserved. |
||||
Third party copyrights are property of their respective owners. |
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, |
||||
are permitted provided that the following conditions are met: |
||||
|
||||
* Redistributions of source code must retain the above copyright notice, |
||||
this list of conditions and the following disclaimer. |
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice, |
||||
this list of conditions and the following disclaimer in the documentation |
||||
and/or other materials provided with the distribution. |
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors |
||||
may be used to endorse or promote products derived from this software |
||||
without specific prior written permission. |
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and |
||||
any express or implied warranties, including, but not limited to, the implied |
||||
warranties of merchantability and fitness for a particular purpose are |
||||
disclaimed. In no event shall copyright holders or contributors be liable for |
||||
any direct, indirect, incidental, special, exemplary, or consequential damages |
||||
(including, but not limited to, procurement of substitute goods or services; |
||||
loss of use, data, or profits; or business interruption) however caused |
||||
and on any theory of liability, whether in contract, strict liability, |
||||
or tort (including negligence or otherwise) arising in any way out of |
||||
the use of this software, even if advised of the possibility of such damage. |
||||
*/ |
||||
|
||||
#ifdef __GNUC__ |
||||
# pragma GCC diagnostic ignored "-Wmissing-declarations" |
||||
# if defined __clang__ || defined __APPLE__ |
||||
# pragma GCC diagnostic ignored "-Wmissing-prototypes" |
||||
# pragma GCC diagnostic ignored "-Wextra" |
||||
# endif |
||||
#endif |
||||
|
||||
#ifndef __OPENCV_TEST_PRECOMP_HPP__ |
||||
#define __OPENCV_TEST_PRECOMP_HPP__ |
||||
|
||||
#include <iostream> |
||||
#include "opencv2/ts.hpp" |
||||
#include "opencv2/imgproc.hpp" |
||||
#include "opencv2/face.hpp" |
||||
#include "opencv2/face/bif.hpp" |
||||
|
||||
#endif |
Loading…
Reference in new issue