1. ホーム
  2. matlab

MATLABによる顔認証の実装

2022-02-10 23:35:02
<パス

1. 顔認証技術の詳細

一般に、顔認識システムは、画像抽出、顔位置特定、グラフィックス前処理、顔認識(本人確認または身元確認)を含む。システムへの入力は、通常、未同定の顔を含む1枚の画像または一連の画像、および顔データベース内の既知の身元または対応するコードを持つ顔の多数の画像であり、その出力は認識すべき顔の身元を示す一連の類似度スコアである。

2. 顔認証技術の幅広い応用範囲

ある技術の導入や発展は、人類の緊急なニーズと密接に関係しており、社会経済や科学技術の急速な発展により、人類はセキュリティ(個人の安全、プライバシー保護などを含む)にますます関心を寄せるようになっています。顔認証の重要なアプリケーションの1つは、人間のID認識です。一般に、人物の識別方法には3つのタイプがあります。

<ブロッククオート

1. IDカード、運転免許証、家の鍵、印鑑などの文書や資格証明書などのIDアイテム。
2. 各種パスワード、パスフレーズ、暗号などの特別な知識;

3. ヒューマンバイオメトリクス

顔、指紋、手の形、掌紋、虹彩、DNA、署名、音声など、人間の生理的・行動的なさまざまな特徴を含んでいる。は従来の本人確認技術で、利便性とスピードが特徴ですが、セキュリティが低く、偽造しやすい、盗まれやすいという致命的な欠点があります。特殊な物品は紛失、盗難、コピーされる可能性があり、特殊な知識は忘れられ、混乱し、漏えいする可能性がある。これに対し、生体特徴は、自己安定性が強く、個人差のある人間の本質的な性質を利用しているため、最も理想的な本人確認の根拠となるものです。上記のような比較的ユニークな生体的特徴に基づき、コンピュータ技術と組み合わせることで、DNA認識技術、指紋認識技術、虹彩認識技術、音声認識技術、顔認識技術など、人間の生体的特徴を利用した数多くの識別技術が開発されている。生体認証技術は前世紀に開発され、その中でも指紋認証技術は成熟しているが、顔認証技術の研究はまだ初期段階にある。指紋や虹彩、掌紋などの識別技術は、被識別者の協力が必要であり、また、識別技術によっては複雑で高価な機器の入手が必要である。顔認証は、特別な取得機器を必要とせず、既存の写真やカメラで遠距離から撮影することができ、システムコストも低く抑えることができます。そして、自動顔認証は、本人が意識することなく本人確認識別作業を完了することができ、対テロ活動において非常に重要な意義を持っています。このように顔認証技術は多くの利点があることから、最も応用範囲の広い有望なバイオメトリクス認証技術の一つとなっています。

4. 顔解析のためのmatlabメソッドの紹介

顔認識手法の一つ:画像から顔を探し、枠に丸を付ける
一般的な手順としては、RGB画像の取得 ->画像処理 ->顔認識となります。

function Rer=Re()

%Rer=0;%%%0 is the initial value, which will change to 1, 2, 3, 4 if the recognition is successful

I=imread('face.jpg');%%The path where the recognized image is stored, use the absolute path!

%%%%%%%%%%%%%%%%% algorithm encapsulation, can be seen as a black box %%%%%%%%%%%%%%%%
O=rgb2ntsc(I);
G=O(:,:, 2);
[m n]=size(G);
U=zeros(m,n);
for i=1:m
   for j=1:n
     if G(i,j)>0.03&&G(i,j)<0.16
        U(i,j)=1;
     end
   end
end
Rer=1;
sr=strel('disk',6);%% create disk radius (create structure element)
C=imclose(U,sr);
L=bwlabel(C);
B=regionprops(L,'area');
Se=[B.Area];
Sm=max(Se);
if Sm>m*n/27 %%%%% Every program goes through this and ends at line 96, failing to recognize the face
  B1=bwareaopen(C,Sm);
  k_y1=m;k2=m;l2=n;
  for i=1:m
    if any(B1(i,:))==1
       k_y1=i;
       break
    end
  end
  for i=k_y1:m
    if B1(i,:)==0
      k2=i;
      break
    end
  end
  for j=1:n
    if any(B1(:,j))==1
      l_y1=j;
      break
    end
  end
  for j=l_y1:n
    if B1(:,j)==0
      l2=j;
      break
    end
  end
  k_y=k2-k_y1;
  l=l2-l_y1;
  if k_y>.5*l&&k_y<3*l %%%%% second layer if, failed to recognize the face
    I1=imcrop(B1,[l_y1 k_y1 l .4*k_y]);
    [n1 m1]=size(I1);
     L1=bwlabel(I1);
     E=regionprops(L1,'area');
     Si=[E.Area];
     Sm=max(Si);
    if Sm/(n1*m1)>.3
       B2=bwareaopen(I1,floor(.5*Sm));
       g_y1=m1;
       g2=m1;
       for j=1:m1
          if any(B2(:,j))==1
             g_y1=j;
             break
          end
       end
       for j=g_y1:m1
           if B2(:,j)==0
              g2=j;
              break
           end
       end
       g=g2-g_y1;
       figure;
       imshow(I,'border','height','InitialMagnification','fit');
       hold on
       h1=line([l_y1+g_y1,l_y1+g_y1+g],[k_y1,k_y1]);
       h2=line([l_y1+g_y1+g,l_y1+g_y1+g],[k_y1,k_y1+1.1*g]);
       h3=line([l_y1+g_y1+g,l_y1+g_y1],[k_y1+1.1*g,k_y1+1.1*g]);
       h4=line([l_y1+g_y1,l_y1+g_y1],[k_y1+1.1*g,k_y1]);
       h=[h1 h2 h3 h4];
       set(h,'Color',[1 0 0],'LineWidth',3);
       gfframe=getframe(gcf);
       gffim=frame2im(gfframe);
       imwrite(gffim,'recg_result.jpg','jpg'); %%%% store the picture named, in order to save the picture painted red frame
       Rer=1;
       %fid=fopen('re.txt','w');
       %fprintf(fid,'%d',Rer);
       %fclose(fid);
    else%%%failed to meet the last if judgment, cannot recognize the face
      figure;
      imshow(I);
      imwrite(I,'face_result.jpg','jpg'); %%%% store image naming
      Rer=2;
      %fid=fopen('re.txt','w');
      %fprintf(fid,'%d',Rer);
      %fclose(fid);
    end
  else
      figure;
      imshow(I);
      imwrite(I,'face_result.jpg','jpg'); %%%% store image naming
      Rer=3;
      %fid=fopen('re.txt','w');
      %fprintf(fid,'%d',Rer);
      %fclose(fid);
  end
else
  figure;
  imshow(I);
  imwrite(I,'face_result.jpg','jpg'); %%%% store image naming
  Rer=4;
  %fid=fopen('re.txt','w');
  %fprintf(fid,'%d',Rer);
  %fclose(fid);
end
end


顔認識方法1効果

顔認識その2:入力された顔写真から写っている人物を特定する
おおよその手順は、RGB画像の取得 -> グレースケール画像への変換 -> 画像処理 -> 顔認識です。

clear all
clc
%Get the original image
i=imread('face.jpg');
I=rgb2gray(i);        
BW=im2bw(I); %convert grayscale image to binary image using threshold value transformation method
figure(1);
imshow(BW);
%Minimize background
[n1 n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;

for i=1:10
    y1=1;y2=c;
    for j=1:10
        if(y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
            loc=find(BW(x1:x2,y1:y2)==0);
            [o p]=size(loc);
            pr=o*100/s;
            if pr<=100
                BW(x1:x2,y1:y2)=0;
                r1=x1;r2=x2;s1=y1;s2=y2;
                pr1=0;
            end
            imshow(BW);
        end
        y1=y1+c;
        y2=y2+c;
    end
    x1=x1+r;
    x2=x2+c;
end
figure(2)
subplot(1,2,1);
imshow(BW)
title('Image processing');
% face recognition
L=bwlabel(BW,8);
BB=regionprops(L,'BoundingBox');
BB1=struct2cell(BB);
BB2=cell2mat(BB1);
[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1
    p=BB2(1,k)*BB2(1,k+1);
    if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
        mx=p;
        j=k;
    end
end
subplot(1,2,2);
title('Face Recognition');
imshow(I);
hold on;
rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','r')



顔認証方法2つの効果