add results verification to facedetect and hog samples
This commit is contained in:
@@ -45,7 +45,6 @@ public:
|
||||
bool gamma_corr;
|
||||
};
|
||||
|
||||
|
||||
class App
|
||||
{
|
||||
public:
|
||||
@@ -64,6 +63,13 @@ public:
|
||||
|
||||
string message() const;
|
||||
|
||||
// This function test if gpu_rst matches cpu_rst.
|
||||
// If the two vectors are not equal, it will return the difference in vector size
|
||||
// Else if will return
|
||||
// (total diff of each cpu and gpu rects covered pixels)/(total cpu rects covered pixels)
|
||||
double checkRectSimilarity(Size sz,
|
||||
std::vector<Rect>& cpu_rst,
|
||||
std::vector<Rect>& gpu_rst);
|
||||
private:
|
||||
App operator=(App&);
|
||||
|
||||
@@ -290,6 +296,7 @@ void App::run()
|
||||
ocl::oclMat gpu_img;
|
||||
|
||||
// Iterate over all frames
|
||||
bool verify = false;
|
||||
while (running && !frame.empty())
|
||||
{
|
||||
workBegin();
|
||||
@@ -316,7 +323,18 @@ void App::run()
|
||||
gpu_img.upload(img);
|
||||
gpu_hog.detectMultiScale(gpu_img, found, hit_threshold, win_stride,
|
||||
Size(0, 0), scale, gr_threshold);
|
||||
}
|
||||
if (!verify)
|
||||
{
|
||||
// verify if GPU output same objects with CPU at 1st run
|
||||
verify = true;
|
||||
vector<Rect> ref_rst;
|
||||
cvtColor(img, img, CV_BGRA2BGR);
|
||||
cpu_hog.detectMultiScale(img, ref_rst, hit_threshold, win_stride,
|
||||
Size(0, 0), scale, gr_threshold-2);
|
||||
double accuracy = checkRectSimilarity(img.size(), ref_rst, found);
|
||||
cout << "\naccuracy value: " << accuracy << endl;
|
||||
}
|
||||
}
|
||||
else cpu_hog.detectMultiScale(img, found, hit_threshold, win_stride,
|
||||
Size(0, 0), scale, gr_threshold);
|
||||
hogWorkEnd();
|
||||
@@ -457,3 +475,45 @@ inline string App::workFps() const
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
double App::checkRectSimilarity(Size sz,
|
||||
std::vector<Rect>& ob1,
|
||||
std::vector<Rect>& ob2)
|
||||
{
|
||||
double final_test_result = 0.0;
|
||||
size_t sz1 = ob1.size();
|
||||
size_t sz2 = ob2.size();
|
||||
|
||||
if(sz1 != sz2)
|
||||
return sz1 > sz2 ? (double)(sz1 - sz2) : (double)(sz2 - sz1);
|
||||
else
|
||||
{
|
||||
cv::Mat cpu_result(sz, CV_8UC1);
|
||||
cpu_result.setTo(0);
|
||||
|
||||
for(vector<Rect>::const_iterator r = ob1.begin(); r != ob1.end(); r++)
|
||||
{
|
||||
cv::Mat cpu_result_roi(cpu_result, *r);
|
||||
cpu_result_roi.setTo(1);
|
||||
cpu_result.copyTo(cpu_result);
|
||||
}
|
||||
int cpu_area = cv::countNonZero(cpu_result > 0);
|
||||
|
||||
cv::Mat gpu_result(sz, CV_8UC1);
|
||||
gpu_result.setTo(0);
|
||||
for(vector<Rect>::const_iterator r2 = ob2.begin(); r2 != ob2.end(); r2++)
|
||||
{
|
||||
cv::Mat gpu_result_roi(gpu_result, *r2);
|
||||
gpu_result_roi.setTo(1);
|
||||
gpu_result.copyTo(gpu_result);
|
||||
}
|
||||
|
||||
cv::Mat result_;
|
||||
multiply(cpu_result, gpu_result, result_);
|
||||
int result = cv::countNonZero(result_ > 0);
|
||||
|
||||
final_test_result = 1.0 - (double)result/(double)cpu_area;
|
||||
}
|
||||
return final_test_result;
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user