얼굴 인식 알고리즘은 무엇을 의미합니까?

青灯夜游
풀어 주다: 2022-08-12 11:27:03
원래의
9241명이 탐색했습니다.

얼굴 인식 알고리즘은 얼굴을 감지하고 주요 얼굴 특징점을 찾은 후 주요 얼굴 영역을 잘라낼 수 있고 전처리 후 백엔드 인식 알고리즘에 입력된다는 의미입니다. 인식 알고리즘은 얼굴 특징 추출을 완료하고 이를 인벤토리에 있는 알려진 얼굴과 비교하여 최종 분류를 완료해야 합니다. 얼굴 인식 알고리즘의 원리: 시스템은 신원이 확인되지 않은 하나 또는 일련의 얼굴 이미지와 신원이 알려진 여러 얼굴 이미지 또는 얼굴 데이터베이스에 해당 코드를 입력하고 출력은 일련의 유사성 점수를 나타냅니다. 인식할 얼굴의 신원.

얼굴 인식 알고리즘은 무엇을 의미합니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, Dell G3 컴퓨터.

얼굴 인식은 영상 수집 장치를 통해 사용자의 얼굴 이미지를 획득한 후 핵심 알고리즘을 사용하여 얼굴 특징의 위치, 모양, 각도를 계산 및 분석한 후 자체 데이터베이스에 있는 기존 템플릿과 비교하는 것입니다. 사용자의 실제 신원을 비교하고 결정합니다.

얼굴 인식 알고리즘은 얼굴을 감지하고 주요 얼굴 특징점을 찾은 후 주요 얼굴 영역을 잘라낼 수 있고 전처리 후 백엔드 인식 알고리즘에 입력된다는 의미입니다. 인식 알고리즘은 얼굴 특징 추출을 완료하고 이를 인벤토리에 있는 알려진 얼굴과 비교하여 최종 분류를 완료해야 합니다.

얼굴 인식 알고리즘에는 얼굴 특징점 기반 인식 알고리즘, 얼굴 이미지 전체 기반 인식 알고리즘, 템플릿 기반 인식 알고리즘, 신경망을 이용한 인식 알고리즘 등 4가지 유형이 있습니다.

얼굴 인식 알고리즘의 원리:

시스템 입력은 일반적으로 신원이 확인되지 않은 하나 또는 일련의 얼굴 이미지뿐만 아니라 얼굴 데이터베이스 또는 해당 인코딩에 알려진 신원이 있는 여러 얼굴 이미지이며 출력은 다음과 같습니다. 인식할 얼굴의 신원을 나타내는 일련의 유사성 점수.的 얼굴 인식의 세 가지 고전 알고리즘

1, EigenFaces 알고리즘

eigenFaces
은 얼굴 인식의 컴퓨터 시각적 문제에 사용되는 특징 벡터 집합입니다. 이름인 Eigenfaces는 PCA(Principal Component)를 기반으로 합니다. 분석), 따라서 Eigenfaces를 학습하려면 PCA의 원리를 이해해야 합니다.

기본 아이디어

                                                                                                                                                         볼륨. PCA를 구현하려면 차원 축소, 즉 행렬을 상위 차원에서 하위 차원으로 변환해야 합니다. 그러나 PCA의 차원 축소는 공분산 행렬과 분리될 수 없습니다. 분산은 1차원 데이터 표본이 평균에서 벗어난 정도를 의미하며, 관점에서 볼 때 각도가 작을수록 값이 크고 방향이 유사한 것을 측정하는 데 사용되는 통계입니다. 즉, 상관관계가 더 긍정적인 것입니다. 두 확률 변수 간의 관계 외에도 공분산 행렬 측정값은 표본 간의 관계가 아니라 차원 간의 관계이기도 합니다.

새로운 것, 특히 지식을 배우려면

지식의 아이디어를 이해해야 합니다. Eigenface 알고리즘을 이해하고 학습할 때, 그 아이디어는 이미지 인식이 먼저 적합한 부분 공간을 선택하고 모든 이미지를 이 부분 공간에 집중시킨 다음 유사성을 측정하거나 이 부분 공간에서 분류 학습을 수행한 다음 이에 대해 이야기해야 한다는 것입니다. 이로 인해 동일한 카테고리의 이미지는 더 가까워지고, 다른 카테고리의 이미지는 더 멀어지게 됩니다. 이렇게 선형 분류로 분리된 이미지는 새로운 분리된 공간으로 쉽게 변형될 수 있습니다. 동시에 고유얼굴 기술은 얼굴 이미지 분포의 기본 요소, 즉 얼굴 이미지 샘플 세트의 공분산 행렬의 고유벡터를 찾아 얼굴 이미지를 특성화합니다. 눈, 뺨, 입술 및 기타 기본 요소와 같은 인간 얼굴 이미지의 기본 요소가 많이 있습니다. 고유 얼굴의 이미지 공간에서 이러한 특징 벡터에 따라 생성된 부분 공간을 하위 얼굴 공간

이라고 합니다. ㅋㅋㅋ 생성한 하위공간, 공간이 구성되는데 어떻게 공간을 구성할 것인가? 첫째, 인간의 얼굴에서 공통점을 찾아야 하고, 둘째, 개인과 공통점의 차이점을 찾아야 하고, 셋째, 공통점은 실제로는 공간이고, 개인은 벡터라는 것을 이해해야 한다. 공분산 행렬을 사용하여 대상 세트의 모든 얼굴 이미지의 고유값을 분해하여 해당 고유벡터를 얻습니다. 고유벡터의 특성을 찾아 선형으로 결합합니다. 각 특징적인 하위 면을 기반으로 한 공간에서 각 면은 점이며, 이 점의 좌표는 각 특징적인 베이스 아래의 각 면의 투영 좌표입니다.

Eigenfaces 알고리즘 프로세스
얼굴 이미지 데이터를 얻고 각 얼굴 이미지 행렬을 행별로 1차원으로 연결하며 각 얼굴은 벡터입니다.

  • 해당 차원에 M개의 얼굴을 추가한 다음 평균을 구하여 "평균 얼굴"을 구합니다.

  • 각 이미지에서 평균 얼굴 벡터를 뺍니다.

  • 공분산 행렬을 계산합니다. 기억 얼굴 인식

  • 알고리즘 연습 과정

  • 훈련 이미지

    • 평균 얼굴 찾기

    • 이미지 재구성을 위한 특징적인 하위 얼굴 획득

    • 얼굴 이미지 찾기 높은 유사성. Er2, Fisherface 알고리즘
    • Fisherface는 인간의 얼굴 인식에서 Fisher 선형 판단을 위한 애플리케이션입니다.
    • 선형판별분석(
    • LDA) 알고리즘 아이디어는 영국의 통계학자이자 유전학자이자 현대 통계과학의 창시자 중 한 명인 로널드 피셔(Ronald)가 처음 제안했습니다. LDA 알고리즘은 통계적 방법을 사용하여 개체 간의 특징의 선형 조합을 찾고 차원을 줄이면서 범주 정보를 고려합니다. 이 알고리즘으로 얻은 선형 결합은 선형 분류기로 사용되거나 차원 축소를 달성할 수 있습니다.

    • 기본 아이디어

    선형 판별 분석의 기본 아이디어

    는 고차원 패턴 샘플을 저차원 최적 벡터 공간에 투영하여 중요한 분류 정보를 추출하고 특징 공간의 차원을 압축하는 효과를 얻는 것입니다. Projection 마지막으로, 패턴 샘플이 새로운 부분 공간에서 최대 클래스 간 거리와 최소 클래스 내 거리를 갖도록 보장됩니다. 즉, 패턴은 이 공간에서 최고의 분리성을 갖습니다. 이론은 고유면에 사용되는 고유면과 유사합니다. 둘 다 전체 차원 축소 및 원본 데이터를 저차원 공간으로 매핑하는 방법입니다. 피셔페이스와 고유면은 모두 전체 데이터에서 시작하며 로컬 텍스처를 추출하는 데 있어서 LBP와 다릅니다. 특징. +                                                                       Fisher의 선형 판별 방법을 사용하여 최적의 투영 방향을 결정하고, 1차원 기호 공간을 구성하고, 다차원 얼굴 이미지를 fisherfaces 특징 공간에 투영하고, 내부를 사용합니다. -그룹 특징 벡터를 형성하기 위한 클래스 샘플 데이터 특징 벡터 세트는 얼굴의 특징을 나타냅니다.

    우리는 이 알고리즘이 샘플 데이터가 다른 특징 공간에 매핑된 후 클래스 내 거리를 최소화하고 클래스 간 거리를 최대화한다는 것을 알고 있습니다. LDA 알고리즘은 차원 축소에 사용될 수 있습니다. 이 알고리즘의 원리는 PCA 알고리즘과 매우 유사하므로 LDA 알고리즘은 얼굴 인식 분야에도 사용될 수 있습니다. PCA 알고리즘을 이용한 얼굴 인식 알고리즘을 Eigenface 방식, LDA 알고리즘을 이용한 얼굴 인식 알고리즘을 Fisher 얼굴 방식이라고 합니다.

    LDAPCA

    와 비교:

    는 동일합니다. 1. 차원을 줄일 때 둘 다 행렬의 특징적인 분해 아이디어를 사용합니다. 2. 둘 다 데이터가 가우스 분포를 따른다고 가정합니다. . 차이점: 1. LDA는 지도 차원 축소 방법인 반면 PCA는 비지도 방식입니다. 2. 데이터가 k차원인 경우 LDA는 (k-1) 차원으로만 축소할 수 있지만 PCA에는 이러한 제한이 적용되지 않습니다. 3. 수학적 관점에서 LDA는 분류 성능이 가장 좋은 투영 방향을 선택하고, PCA는 샘플 투영 점의 분산이 최대인 방향을 선택합니다.

    Fisherfaces 알고리즘

    Eigenfaces 알고리즘과 비교:

    은 동일합니다. 둘 다 차원을 줄일 때 행렬 고유 분해 아이디어를 사용합니다.
    • 차이점: Fisherfaces는 감독된 차원 축소 방법이지만 Eigenfaces는 비지도 차원 축소 방법입니다. Fisherfaces는 차원 축소뿐만 아니라 분류에도 사용할 수 있습니다.

    FisherFace 알고리즘 인식의 오류율은 Harvard 및 Yale 얼굴 데이터베이스에서 테스트한 Eigenfaces 인식 결과보다 낮다는 점을 언급할 가치가 있습니다. Fisherface 알고리즘 프로세스

    • 얼굴 이미지 데이터를 얻은 후 얼굴의 평균값을 구합니다.
    • 각 얼굴의 특징적인 값을 관찰하세요.

    얼굴 식별을 수행하고, 얼굴 특징을 관찰하고, 개인인지 여부를 판단합니다.

    드디어 얼굴인식을 수행합니다.
    • 3. LBPH(로컬 바이너리 패턴 히스토그램) 알고리즘

    • 로컬 바이너리 패턴 히스토그램은

      LBPH

      기능을
    • LBP
    • (로컬 바이너리 코딩) 기능과 결합합니다. 이미지 정보가 결합되어 있습니다. 얼굴 인식을 위해 LBP 인코딩 이미지를 직접 사용하는 경우. 실제로 LBP 특징을 추출하지 않는 것과 큰 차이가 없기 때문에 실제 LBP 응용에서는 일반적으로 LBP 인코딩된 이미지의 통계적 히스토그램을 분류 및 인식을 위한 특징 벡터로 사용한다.

      算 원래 LBP 연산자는 33의 윈도우로 정의됩니다. 중앙 픽셀을 임계값으로 삼아 인접한 8 픽셀의 애쉬 값을 비교하여 점의 위치를 ​​1로 표시하고 그렇지 않으면 0으로 표시합니다. 이런 식으로 33개 근방의 8개 점을 비교하여 8비트 이진수(보통 십진수로 변환되는데, 즉 LBP 코드, 총 256가지 유형), 즉 픽셀의 LBP 값을 생성할 수 있습니다. 창 중앙의 값을 구하며, 이 값은 영역 텍스처 특성을 반영하는 데 사용됩니다.

         LBPH의 차원: 원래 LBP 또는 확장 LBP 기능을 사용하는 경우 LBP 기능 값 모드는 256이고 이미지의 LBP 기능 벡터 차원은 64256=16384 차원입니다. feature를 사용하면 LBP 값 패턴은 59, 특징 벡터 차원은 6459 = 3776 차원이다. 등가 패턴 특징을 사용하면 특징 벡터 차원이 크게 줄어드는 것을 볼 수 있는데, 이는 머신의 학습 시간이 줄어드는 것을 의미한다. 성능에 큰 영향을 주지 않으면서 학습 방법의 양이 크게 줄어들 것입니다.

      기본 아이디어

             LBPH 기반 얼굴 인식 방법의 기본 아이디어

      는 다음과 같습니다. 먼저 각 픽셀을 중심으로 주변 픽셀의 회색 값과의 관계를 파악하고 이진 인코딩을 수행합니다. 전체 이미지의 LBP 인코딩된 이미지를 얻은 다음 LBP 이미지를 영역으로 나누고 각 영역의 LBP 인코딩된 히스토그램을 얻은 다음 서로 다른 얼굴 이미지의 LBP 인코딩된 히스토그램을 비교하여 얻습니다. , 사람의 얼굴을 얻을 수 있습니다. 얼굴 인식의 목적은 조명, 크기 조정, 회전 및 이동의 영향을 받지 않는다는 장점이 있습니다. LBPH 알고리즘의 "사람"은 이름에서 알 수 있듯이 로컬 특징 추출 방법이 사용됩니다. 이것이 처음 두 방법과 가장 큰 차이점입니다.

      LBPH 알고리즘 흐름

        LBP 특징 추출: 위의 균일 LBP 연산자에 따라 원본 이미지를 처리합니다.
      • LBP 특징 일치(히스토그램 계산): 이미지를 여러 하위 영역으로 나누고 히스토그램은 하위 영역의 LBP 값을 기반으로 계산되며 히스토그램은 판별 기능으로 사용됩니다.

      4. 알고리즘 복제 코드1), EigenFaces 알고리즘

      #encoding=utf-8
      import numpy as np
      import cv2
      import os
       
      class EigenFace(object):
          def __init__(self,threshold,dimNum,dsize):
              self.threshold = threshold # 阈值暂未使用
              self.dimNum = dimNum
              self.dsize = dsize
       
          def loadImg(self,fileName,dsize):
              '''
              载入图像,灰度化处理,统一尺寸,直方图均衡化
              :param fileName: 图像文件名
              :param dsize: 统一尺寸大小。元组形式
              :return: 图像矩阵
              '''
              img = cv2.imread(fileName)
              retImg = cv2.resize(img,dsize)
              retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
              retImg = cv2.equalizeHist(retImg)
              # cv2.imshow('img',retImg)
              # cv2.waitKey()
              return retImg
       
       
          def createImgMat(self,dirName):
              '''
              生成图像样本矩阵,组织形式为行为属性,列为样本
              :param dirName: 包含训练数据集的图像文件夹路径
              :return: 样本矩阵,标签矩阵
              '''
              dataMat = np.zeros((10,1))
              label = []
              for parent,dirnames,filenames in os.walk(dirName):
                  # print parent
                  # print dirnames
                  # print filenames
                  index = 0
                  for dirname in dirnames:
                      for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname):
                          for filename in subFilenames:
                              img = self.loadImg(subParent+'/'+filename,self.dsize)
                              tempImg = np.reshape(img,(-1,1))
                              if index == 0 :
                                  dataMat = tempImg
                              else:
                                  dataMat = np.column_stack((dataMat,tempImg))
                              label.append(subParent+'/'+filename)
                              index += 1
              return dataMat,label
       
       
          def PCA(self,dataMat,dimNum):
              '''
              PCA函数,用于数据降维
              :param dataMat: 样本矩阵
              :param dimNum: 降维后的目标维度
              :return: 降维后的样本矩阵和变换矩阵
              '''
              # 均值化矩阵
              meanMat = np.mat(np.mean(dataMat,1)).T
              print '平均值矩阵维度',meanMat.shape
              diffMat = dataMat-meanMat
              # 求协方差矩阵,由于样本维度远远大于样本数目,所以不直接求协方差矩阵,采用下面的方法
              covMat = (diffMat.T*diffMat)/float(diffMat.shape[1]) # 归一化
              #covMat2 = np.cov(dataMat,bias=True)
              #print '基本方法计算协方差矩阵为',covMat2
              print '协方差矩阵维度',covMat.shape
              eigVals, eigVects = np.linalg.eig(np.mat(covMat))
              print '特征向量维度',eigVects.shape
              print '特征值',eigVals
              eigVects = diffMat*eigVects
              eigValInd = np.argsort(eigVals)
              eigValInd = eigValInd[::-1]
              eigValInd = eigValInd[:dimNum] # 取出指定个数的前n大的特征值
              print '选取的特征值',eigValInd
              eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量
              redEigVects = eigVects[:,eigValInd]
              print '选取的特征向量',redEigVects.shape
              print '均值矩阵维度',diffMat.shape
              lowMat = redEigVects.T*diffMat
              print '低维矩阵维度',lowMat.shape
              return lowMat,redEigVects
       
          def compare(self,dataMat,testImg,label):
              '''
              比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
              :param dataMat: 样本矩阵
              :param testImg: 测试图像矩阵,最原始形式
              :param label: 标签矩阵
              :return: 与测试图片最相近的图像文件名
              '''
              testImg = cv2.resize(testImg,self.dsize)
              testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
              testImg = np.reshape(testImg,(-1,1))
              lowMat,redVects = self.PCA(dataMat,self.dimNum)
              testImg = redVects.T*testImg
              print '检测样本变换后的维度',testImg.shape
              disList = []
              testVec = np.reshape(testImg,(1,-1))
              for sample in lowMat.T:
                  disList.append(np.linalg.norm(testVec-sample))
              print disList
              sortIndex = np.argsort(disList)
              return label[sortIndex[0]]
       
       
          def predict(self,dirName,testFileName):
              '''
              预测函数
              :param dirName: 包含训练数据集的文件夹路径
              :param testFileName: 测试图像文件名
              :return: 预测结果
              '''
              testImg = cv2.imread(testFileName)
              dataMat,label = self.createImgMat(dirName)
              print '加载图片标签',label
              ans = self.compare(dataMat,testImg,label)
              return ans
       
       
      if __name__ == '__main__':
          eigenface = EigenFace(20,50,(50,50))
          print eigenface.predict('d:/face','D:/face_test/1.bmp')
      로그인 후 복사

      2), FisherFaces 알고리즘

      #encoding=utf-8
      import numpy as np
      import cv2
      import os
       
      class FisherFace(object):
          def __init__(self,threshold,k,dsize):
              self.threshold = threshold # 阈值,暂未使用
              self.k = k         # 指定投影w的个数
              self.dsize = dsize # 统一尺寸大小
       
          def loadImg(self,fileName,dsize):
              '''
              载入图像,灰度化处理,统一尺寸,直方图均衡化
              :param fileName: 图像文件名
              :param dsize: 统一尺寸大小。元组形式
              :return: 图像矩阵
              '''
              img = cv2.imread(fileName)
              retImg = cv2.resize(img,dsize)
              retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
              retImg = cv2.equalizeHist(retImg)
              # cv2.imshow('img',retImg)
              # cv2.waitKey()
              return retImg
       
          def createImgMat(self,dirName):
              '''
              生成图像样本矩阵,组织形式为行为属性,列为样本
              :param dirName: 包含训练数据集的图像文件夹路径
              :return: 包含样本矩阵的列表,标签列表
              '''
              dataMat = np.zeros((10,1))
              label = []
              dataList = []
              for parent,dirnames,filenames in os.walk(dirName):
                  # print parent
                  # print dirnames
                  # print filenames
                  #index = 0
                  for dirname in dirnames:
                      for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname):
                          for index,filename in enumerate(subFilenames):
                              img = self.loadImg(subParent+'/'+filename,self.dsize)
                              tempImg = np.reshape(img,(-1,1))
                              if index == 0 :
                                  dataMat = tempImg
                              else:
                                  dataMat = np.column_stack((dataMat,tempImg))
                      dataList.append(dataMat)
                      label.append(subParent)
              return dataList,label
       
          def LDA(self,dataList,k):
              '''
              多分类问题的线性判别分析算法
              :param dataList: 样本矩阵列表
              :param k: 投影向量k的个数
              :return: 变换后的矩阵列表和变换矩阵
              '''
              n = dataList[0].shape[0]
              W = np.zeros((n,self.k))
              Sw = np.zeros((n,n))
              Sb = np.zeros((n,n))
              u = np.zeros((n,1))
              N = 0
              meanList = []
              sampleNum = []
       
              for dataMat in dataList:
                  meanMat = np.mat(np.mean(dataMat,1)).T
                  meanList.append(meanMat)
                  sampleNum.append(dataMat.shape[1])
       
                  dataMat = dataMat-meanMat
                  sw = dataMat*dataMat.T
                  Sw += sw
              print 'Sw的维度',Sw.shape
       
              for index,meanMat in enumerate(meanList):
                  m = sampleNum[index]
                  u += m*meanMat
                  N += m
              u = u/N
              print 'u的维度',u.shape
       
              for index,meanMat in enumerate(meanList):
                  m = sampleNum[index]
                  sb = m*(meanMat-u)*(meanMat-u).T
                  Sb += sb
              print 'Sb的维度',Sb.shape
       
              eigVals, eigVects = np.linalg.eig(np.mat(np.linalg.inv(Sw)*Sb))
              eigValInd = np.argsort(eigVals)
              eigValInd = eigValInd[::-1]
              eigValInd = eigValInd[:k] # 取出指定个数的前k大的特征值
              print '选取的特征值',eigValInd.shape
              eigVects = eigVects/np.linalg.norm(eigVects,axis=0) #归一化特征向量
              redEigVects = eigVects[:,eigValInd]
              print '变换矩阵维度',redEigVects.shape
       
              transMatList = []
              for dataMat in dataList:
                  transMatList.append(redEigVects.T*dataMat)
              return transMatList,redEigVects
       
          def compare(self,dataList,testImg,label):
              '''
              比较函数,这里只是用了最简单的欧氏距离比较,还可以使用KNN等方法,如需修改修改此处即可
              :param dataList: 样本矩阵列表
              :param testImg: 测试图像矩阵,最原始形式
              :param label: 标签矩阵
              :return: 与测试图片最相近的图像文件夹,也就是类别
              '''
              testImg = cv2.resize(testImg,self.dsize)
              testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
              testImg = np.reshape(testImg,(-1,1))
              transMatList,redVects = fisherface.LDA(dataList,self.k)
              testImg = redVects.T*testImg
              print '检测样本变换后的维度',testImg.shape
              disList = []
              testVec = np.reshape(testImg,(1,-1))
              sumVec = np.mat(np.zeros((self.dsize[0]*self.dsize[1],1)))
              for transMat in transMatList:
                  for sample in transMat.T:
                      disList.append( np.linalg.norm(testVec-sample))
              print disList
              sortIndex = np.argsort(disList)
              return label[sortIndex[0]/9]
       
          def predict(self,dirName,testFileName):
              '''
              预测函数
              :param dirName: 包含训练数据集的文件夹路径
              :param testFileName: 测试图像文件名
              :return: 预测结果
              '''
              testImg = cv2.imread(testFileName)
              dataMat,label = self.createImgMat(dirName)
              print '加载图片标签',label
              ans = self.compare(dataMat,testImg,label)
              return ans
       
      if __name__=="__main__":
         
          fisherface = FisherFace(10,20,(20,20))
          ans = fisherface.predict('d:/face','d:/face_test/8.bmp')
          print ans
      로그인 후 복사

      3), LBPH 알고리즘

      #encoding=utf-8
      import numpy as np
      import os
      import cv2
       
      class LBP(object):
          def __init__(self,threshold,dsize,blockNum):
              self.dsize = dsize # 统一尺寸大小
              self.blockNum = blockNum # 分割块数目
              self.threshold = threshold # 阈值,暂未使用
       
          def loadImg(self,fileName,dsize):
              '''
              载入图像,灰度化处理,统一尺寸,直方图均衡化
              :param fileName: 图像文件名
              :param dsize: 统一尺寸大小。元组形式
              :return: 图像矩阵
              '''
              img = cv2.imread(fileName)
              retImg = cv2.resize(img,dsize)
              retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)
              retImg = cv2.equalizeHist(retImg)
              # cv2.imshow('img',retImg)
              # cv2.waitKey()
              return retImg
       
          def loadImagesList(self,dirName):
              '''
              加载图像矩阵列表
              :param dirName:文件夹路径
              :return: 包含最原始的图像矩阵的列表和标签矩阵
              '''
              imgList = []
              label = []
              for parent,dirnames,filenames in os.walk(dirName):
                  # print parent
                  # print dirnames
                  # print filenames
                  for dirname in dirnames:
                      for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname):
                          for filename in subFilenames:
                              img = self.loadImg(subParent+'/'+filename,self.dsize)
                              imgList.append(img) # 原始图像矩阵不做任何处理,直接加入列表
                              label.append(subParent+'/'+filename)
              return imgList,label
       
       
          def getHopCounter(self,num):
              '''
              计算二进制序列是否只变化两次
              :param num: 数字
              :return: 01变化次数
              '''
              binNum = bin(num)
              binStr = str(binNum)[2:]
              n = len(binStr)
              if n < 8:
                  binStr = "0"*(8-n)+binStr
              n = len(binStr)
              counter = 0
              for i in range(n):
                  if i != n-1:
                      if binStr[i+1] != binStr[i]:
                          counter += 1
                  else:
                      if binStr[0] != binStr[i]:
                          counter += 1
              return counter
       
          def createTable(self):
              &#39;&#39;&#39;
              生成均匀对应字典
              :return: 均匀LBP特征对应字典
              &#39;&#39;&#39;
              self.table = {}
              temp = 1
              print type(temp)
              for i in range(256):
                  if self.getHopCounter(i) <= 2:
                      self.table[i] = temp
                      temp += 1
                  else:
                      self.table[i] = 0
              return self.table
       
          def getLBPfeature(self,img):
              &#39;&#39;&#39;
              计算LBP特征
              :param img:图像矩阵
              :return: LBP特征图
              &#39;&#39;&#39;
              m = img.shape[0];n = img.shape[1]
              neighbor = [0]*8
              featureMap = np.mat(np.zeros((m,n)))
              for y in xrange(1,m-1):
                  for x in xrange(1,n-1):
                      neighbor[0] = img[y-1,x-1]
                      neighbor[1] = img[y-1,x]
                      neighbor[2] = img[y-1,x+1]
                      neighbor[3] = img[y,x+1]
                      neighbor[4] = img[y+1,x+1]
                      neighbor[5] = img[y+1,x]
                      neighbor[6] = img[y+1,x-1]
                      neighbor[7] = img[y,x-1]
                      center = img[y,x]
                      temp = 0
                      for k in range(8):
                          temp += (neighbor[k] >= center)*(1<<k)
                      featureMap[y,x] = self.table[temp]
              featureMap = featureMap.astype('uint8') # 数据类型转换为无符号8位型,如不转换则默认为float64位,影响最终效果
              return featureMap
       
          def calcHist(self,roi):
              '''
              计算直方图
              :param roi:图像区域
              :return: 直方图矩阵
              '''
              hist = cv2.calcHist([roi],[0],None,[59],[0,256]) # 第四个参数是直方图的横坐标数目,经过均匀化降维后这里一共有59种像素
              return hist
       
          def compare(self,sampleImg,testImg):
              '''
              比较函数,这里使用的是欧氏距离排序,也可以使用KNN,在此处更改
              :param sampleImg: 样本图像矩阵
              :param testImg: 测试图像矩阵
              :return: k2值
              '''
              testImg = cv2.resize(testImg,self.dsize)
              testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)
              testFeatureMap = self.getLBPfeature(testImg)
              sampleFeatureMap = self.getLBPfeature(sampleImg)
              # 计算步长,分割整个图像为小块
              ystep = self.dsize[0]/self.blockNum
              xstep = self.dsize[1]/self.blockNum
              k2 = 0
              for y in xrange(0,self.dsize[0],ystep):
                  for x in xrange(0,self.dsize[1],xstep):
                      testroi = testFeatureMap[y:y+ystep,x:x+xstep]
                      sampleroi =sampleFeatureMap[y:y+ystep,x:x+xstep]
                      testHist = self.calcHist(testroi)
                      sampleHist = self.calcHist(sampleroi)
                      k2 += np.sum((sampleHist-testHist)**2)/np.sum((sampleHist+testHist))
              print 'k2的值为',k2
              return k2
       
          def predict(self,dirName,testImgName):
              '''
              预测函数
              :param dirName:样本图像文件夹路径
              :param testImgName: 测试图像文件名
              :return: 最相近图像名称
              '''
              table = self.createTable()
              testImg = cv2.imread(testImgName)
              imgList,label = self.loadImagesList(dirName)
              k2List = []
              for img in imgList:
                  k2 = self.compare(img,testImg)
                  k2List.append(k2)
              order = np.argsort(k2List)
              return label[order[0]]
       
      if __name__ == "__main__":
       
          lbp = LBP(20,(50,50),5)
          ans = lbp.predict('d:/face','d:/face_test/9.bmp')
          print ans
      로그인 후 복사

      확장된 지식: 얼굴 인식 알고리즘의 어려움 연구 얼굴 인식 알고리즘은 오랫동안 연구되어 왔습니다. 대부분의 알고리즘은 배경이 단순할 때 잘 처리할 수 있습니다. 그러나 얼굴 인식은 광범위한 응용 분야를 갖고 있으며 단순한 이미지 테스트는 실제 요구 사항을 충족시키기에는 거리가 멀습니다. 따라서 얼굴인식 알고리즘에는 여전히 많은 어려움이 존재한다.

      조명

      조명 문제는 머신 비전의 오래된 문제이며, 특히 얼굴 인식에서는 알고리즘이 사용 가능한 수준에 도달하지 못했습니다.

      자세

      조명 문제와 마찬가지로 자세 문제도 얼굴 인식 연구에서 해결해야 할 기술적 난제입니다. 자세에 관한 연구는 상대적으로 적으며, 대부분의 얼굴 인식 알고리즘은 주로 정면 또는 정면에 가까운 얼굴 이미지를 대상으로 하며, 기울기나 왼쪽 또는 오른쪽이 심한 경우 얼굴 인식 알고리즘의 인식률도 급격히 떨어지게 됩니다. .

      Occlusion

      협조 없이 얼굴 이미지를 수집하는 경우, Occlusion 문제는 매우 심각한 문제입니다. 특히 모니터링 대상이 안경, 모자, 기타 액세서리를 자주 착용하는 감시 환경에서는 이미지 수집이 어렵습니다. 결과로 생성된 얼굴 이미지는 불완전할 수 있으며 이는 이후의 특징 추출 및 인식에 영향을 미치고 심지어 얼굴 인식 알고리즘이 실패할 수도 있습니다.

      나이 변화

      나이가 변함에 따라 얼굴 생김새도 달라지는데, 특히 10대의 경우 이러한 변화는 더욱 극명하게 나타납니다. 연령대에 따라 얼굴 인식 알고리즘의 인식률도 다릅니다.

      이미지 품질

      얼굴 이미지는 다양한 수집 장비로 인해 획득된 얼굴 이미지의 품질도 다를 수 있습니다. 특히 해상도가 낮고 노이즈가 많으며 품질이 낮은 얼굴 이미지의 경우 더욱 그렇습니다. 효과적인 얼굴 인식을 수행하는 것은 주의가 필요한 문제입니다. 마찬가지로 고해상도 이미지의 경우 얼굴 인식 알고리즘에 미치는 영향에 대해서도 추가 연구가 필요합니다.

      샘플 부족

      얼굴 인식 분야에서는 통계적 학습을 기반으로 한 얼굴 인식 알고리즘이 주류를 이루고 있지만 통계적 학습 방법에는 많은 훈련이 필요합니다. 고차원 공간에서의 얼굴 이미지 분포는 불규칙한 대중 분포이므로 얻을 수 있는 샘플은 얼굴 이미지 공간의 매우 작은 부분만 샘플링합니다. 작은 샘플에서 통계적 학습 문제를 해결하는 방법에 대한 추가 연구가 필요합니다. .

      대량의 데이터

      PCA, LDA 등 기존의 얼굴 인식 알고리즘을 소규모 데이터로 쉽게 훈련하고 학습할 수 있습니다. 그러나 대용량 데이터의 경우 이러한 방법의 학습 프로세스가 어렵고 심지어 붕괴될 수도 있습니다.

      대규모 얼굴 인식

      얼굴 데이터베이스의 크기가 커질수록 얼굴 알고리즘의 성능은 저하됩니다.

      더 많은 관련 지식을 알고 싶다면 FAQ 칼럼을 방문해주세요!

    위 내용은 얼굴 인식 알고리즘은 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:php.cn
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿