人脸识别分类器
Posted
技术标签:
【中文标题】人脸识别分类器【英文标题】:Face Recognition Classifier 【发布时间】:2014-05-23 15:53:39 【问题描述】:参考前面的post,分类的方法是Euclidean Distance with Nearest Neighbor。然而,得到的结果并不准确,因为已知数据集和未知数据集的相似度都为 99%。即使使用马氏距离也给出了类似的结果。
人脸识别分类还有其他方法吗?你能给我一些例子/公式吗?
float d_i = projectedTestFace[i] - projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i; // Euclidean distance
【问题讨论】:
【参考方案1】:恕我直言,如果你得到不好的结果,那就怪你的输入,而不是距离公式
无需任何进一步的预处理(对齐、裁剪、均衡),即使是像素上的普通 L2 范数也能提供比特征脸更好的结果。 (这里是可悲的事实)
从 2.4.2 开始,opencv 拥有face-recognition out of-the-box。 (还具有替代的 Fisher 和 lbph 功能)
您可能应该使用它,而不是自己滚动(并且请使用 c++ api,而不是神秘的 c api)。
如果您确实想坚持使用特征脸,您仍然可以尝试将“重建”(来自特征向量)图像和测试图像之间的 L2 距离作为置信度度量,如 done here(再次由舍文)
【讨论】:
我做了对齐、调整大小和 histogramEqualization 但结果还是一样。我正在尝试 L2 距离,但得到的结果是“-nan”@berak【参考方案2】:// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity(const Mat A, const Mat B)
if (A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols)
// Calculate the L2 relative error between the 2 images.
double errorL2 = norm(A, B, CV_L2);
// Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
double similarity = errorL2 / (double)(A.rows * A.cols);
return similarity;
else
//cout << "WARNING: Images have a different size in 'getSimilarity()'." << endl;
return 100000000.0; // Return a bad value
我想知道为什么我总是返回 100000000。这是否意味着预处理和重建的人脸大小不同?这就是它跳过L2距离比较的原因?
以下是我的部分代码:
Mat j =projectedTestFace[i];
Mat k =projectedTrainFaceMat>data.fl[iTrain*nEigens + i];
similarity=getSimilarity(j,k);
没有 else 语句,我得到相似度=-nan 结果,想知道 -nan 和 -inf 代表什么。
【讨论】:
"这是否意味着预处理和重建的人脸大小不同?" - 是的。但请不要跳过它,而是调整图像大小 Mat k 是阈值吗? (我不明白:data.fl[iTrain*nEigens + i]
,因为 iTrain*nEigens + i
在我看来不是一个有效的索引)
我目前正在使用剑桥人脸数据库,该数据库具有所有标准尺寸 112x92,我也使用其中一个 112x92 样本进行测试。不知道为什么它仍然显示差异大小。 Mat k 是要与测试人脸进行比较的数据库人脸,Mat k 是指第一个 Eigenface 位置(存储在 2D 数组中)。这是我的理解。我还在问上一篇文章 [link] (***.com/questions/22791971/…) @berak
hmm,像Mat a,b; a = b>17;
这样的表达式有一个阈值。我不在那里使用'>'。同样,data.fl
必须引用 CvMat,而不是 cv::Mat。将不推荐使用的 c-api 函数/结构与 c++ 混合是灾难的收据
哦,看看你的上一个。帖子使它更清晰一些。我想,你是从这里得到的:float d_i = projectedTestFace[i]-projectedTrainFaceMat>data.fl[iTrain*nEigens + i];
(“>”应该是一个“->”(指针访问),不是吗?以上是关于人脸识别分类器的主要内容,如果未能解决你的问题,请参考以下文章
图像识别基于 Haar分类器实现五官定位matlab源码含 GUI
图像识别基于 Haar分类器实现五官定位matlab源码含 GUI