如何在不使用数据集的情况下在 Matlab 上比较不同的面部图像?

Posted

技术标签:

【中文标题】如何在不使用数据集的情况下在 Matlab 上比较不同的面部图像?【英文标题】:How to compare different facial images on Matlab without using data set? 【发布时间】:2018-06-26 15:49:50 【问题描述】:

我正在做一个 Matlab 面部识别项目。

我要做的是并排读取同一个人的两张不同图像并提取他们的局部特征(如眼睛、鼻子和嘴巴)。

我的代码读取图像并检测特征,我需要一个函数来比较任意两张人脸图像并判断它们是否属于同一个人?

代码如下。

clear all;
clc

% Read the input image
I = imread('12.jpg');
I2 = imread('1.jpg');
I=rgb2gray(I);
I2=rgb2gray(I2);


%Detect objects using Viola-Jones Algorithm

%To detect Face
FaceDetect = vision.CascadeObjectDetector;
BB=step(FaceDetect,I);
BB1 = insertObjectAnnotation(I,'rectangle',BB,'Face');
hn1 = imhist(BB)./numel(BB);

h1=subplot(1,2,1);

imshow(I);imshow(BB1); hold on




title('Facial Feature Detection');
%To detect Mouth
MouthDetect = vision.CascadeObjectDetector('Mouth','MergeThreshold',180);
BB=step(MouthDetect,I);
 hold on
for i = 1:size(BB,1)
 rectangle('Position',BB(i,:),'LineWidth',2,'LineStyle','-','EdgeColor','r');
end
%To detect Nose
NoseDetect = vision.CascadeObjectDetector('Nose','MergeThreshold',12);
BB=step(NoseDetect,I);

 hold on
for i = 1:size(BB,1)
    rectangle('Position',BB(i,:),'LineWidth',2,'LineStyle','-','EdgeColor','b');
end

%To detect Eyes
EyeDetect = vision.CascadeObjectDetector('EyePairBig');
BB=step(EyeDetect,I);
hold on
rectangle('Position',BB,'LineWidth',2,'LineStyle','-','EdgeColor','g');
%imshow(BB1);
%%%%%%%%%%%%%%%%%%%%%%%%%%---FACIAL FEATURES OF 2ND IMAGE----%%%%%%%%%%%%%%%%%%%%%%%%%%%
%To detect Face
FaceDetect2 = vision.CascadeObjectDetector;
BB2=step(FaceDetect2,I2);
B = insertObjectAnnotation(I2,'rectangle',BB2,'Face');
hn2 = imhist(BB2)./numel(BB2);

h2=subplot(1,2,2);

imshow(I2);imshow(B); hold on


title('Facial Feature Detection');
%To detect Mouth
MouthDetect2 = vision.CascadeObjectDetector('Mouth','MergeThreshold',160);
BB2=step(MouthDetect2,I2);
 hold on
for i = 1:size(BB2,1)
 rectangle('Position',BB2(i,:),'LineWidth',2,'LineStyle','-','EdgeColor','r');
end
%To detect Nose
NoseDetect2 = vision.CascadeObjectDetector('Nose','MergeThreshold',12);
BB2=step(NoseDetect2,I2);

 hold on
for i = 1:size(BB2,1)
    rectangle('Position',BB2(i,:),'LineWidth',2,'LineStyle','-','EdgeColor','b');
end

%To detect Eyes
EyeDetect2 = vision.CascadeObjectDetector('EyePairBig');
BB2=step(EyeDetect2,I2);
hold on
rectangle('Position',BB2,'LineWidth',2,'LineStyle','-','EdgeColor','g');
linkaxes([h2,h1])

score_euclidean = norm(hn1-hn2);
 %score_euclidean = pdist2(feature1, feature2);

%Set a threshold for euclidean similarity where smaller is more similar
euclidean_threshold = 0.1;
disp('Euclidean Compare')
disp(score_euclidean)
if score_euclidean < euclidean_threshold 
    disp('similar images');
else
    disp('dissimilar images');
end

【问题讨论】:

这是一个很难用 CascadeObjectDetector 解决的问题:它只会返回您请求的特征的边界框。它只做检测,不做识别。你看过mathworks.com/videos/face-recognition-with-matlab-100902.html 吗?使用用于识别人脸的特征,您可能会构建一个分类器。 我需要一个函数来比较两个人脸而不使用数据库! 这是一个没有数据库的非常困难的问题。执行人脸检测相对简单,但是在没有图像数据库的情况下检测两张人脸是否相同几乎是不可能的。基于特征的方法旨在在旋转、平移、透视和其他变化中保持稳健。如果没有数据库,您可以依赖的只是您是否看到了一张脸。 检查 FaceNet,它在预训练时将人脸映射到欧几里得空间。在那里,您可以执行最近邻搜索或距离计算等常用操作。有一些非常流行的实现(例如openface)虽然这些主要是 python/lua-torch。您需要检查是否有 matlab-alternative。 在我看来,欧几里得距离应该可以解决问题。我想知道是什么阻止了它。您可以上传一些结果图片吗? 【参考方案1】:

也许能给出正确答案: 您可以测量每张照片的眼睛之间的距离或嘴唇的长度等并进行比较...

【讨论】:

以上是关于如何在不使用数据集的情况下在 Matlab 上比较不同的面部图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不刷新html页面的情况下在表格上显示数据(使用nodejs和mysql ajax)

如何在不刷新页面的情况下在屏幕上显示新记录?

如何在不使用扩展的情况下在 Autodesk forge 查看器上显示图标

如何在不使用 artisan 的情况下在远程 ubuntu 服务器上连接 Laravel 7.12 项目的数据库

如何在不重新加载 visibleCell 的情况下在 collectionView 上重新加载数据

如何在不使用模拟位置的情况下在 android 上欺骗位置?