La Red de Conocimientos Pedagógicos - Conocimientos históricos - ¿Qué significa el algoritmo de reconocimiento facial?

¿Qué significa el algoritmo de reconocimiento facial?

El entorno operativo de este tutorial: sistema Windows 7 y computadora Dell G3.

El reconocimiento facial consiste en obtener la imagen facial del usuario a través de un dispositivo de recopilación de videos y luego utilizar el algoritmo central para calcular y analizar la posición facial, la forma de la cara y el ángulo de la cara, y luego compararlos con las plantillas existentes en su propia base de datos Sí, y luego determinar la verdadera identidad del usuario.

El algoritmo de reconocimiento facial se refiere a un algoritmo de reconocimiento que detecta un rostro y localiza los puntos característicos clave del mismo. Después del preprocesamiento, el área principal del rostro se puede recortar y enviar al back-end. El algoritmo de reconocimiento debe completar la extracción de rasgos faciales y compararlos con rostros conocidos en el inventario para completar la clasificación final.

Existen cuatro tipos de algoritmos de reconocimiento facial: algoritmos de reconocimiento basados ​​en puntos de rasgos faciales, algoritmos de reconocimiento basados ​​en la imagen completa del rostro, algoritmos de reconocimiento basados ​​en plantillas y algoritmos de reconocimiento basados ​​en redes neuronales.

Principio del algoritmo de reconocimiento facial;

La entrada al sistema es generalmente una o una serie de imágenes faciales con identidades indeterminadas y varias imágenes con identidades conocidas o códigos correspondientes en la cara. imagen de la cara de la base de datos, y el resultado es una serie de puntuaciones de similitud, que indican la identidad de la cara a reconocer.

Tres algoritmos clásicos para el reconocimiento facial

1. Algoritmo Eigenfaces

Eigenfaces se utiliza en problemas de visión por computadora de reconocimiento facial. . Eigenface se basa en PCA (Análisis de componentes principales), por lo que aprender eigenface requiere que comprendamos el principio de PCA.

Idea básica

El análisis de componentes principales (PCA) es un algoritmo de compresión matricial que puede reducir la dimensión de la matriz y retener la información de la matriz original tanto como sea posible. En pocas palabras, convierte una matriz n×m en una matriz n×k, conservando solo las características principales de la matriz, ahorrando así mucho espacio y datos. La implementación de PCA requiere reducir la dimensionalidad, es decir, convertir la matriz de alta dimensionalidad a baja dimensionalidad. Sin embargo, la reducción de dimensionalidad de PCA es inseparable de la matriz de covarianza. La varianza describe la desviación de una muestra de datos unidimensional de la media y es una estadística utilizada para medir la relación entre dos variables aleatorias. Desde el punto de vista del ángulo, cuanto menor es el ángulo, mayor es el valor y más cercana es la dirección, es decir, más correlación positiva hay. La matriz de covarianza mide no sólo la relación entre dos variables aleatorias, sino también la relación entre dimensiones, no la relación entre muestras.

Aprender algo nuevo, especialmente conocimiento, requiere comprender las ideas contenidas en el conocimiento. Cuando entiendo y aprendo el algoritmo de cara propia, su idea es que el reconocimiento de imágenes primero debe seleccionar un subespacio adecuado, concentrar todas las imágenes en este subespacio y luego medir o realizar mediciones de similitud en este subespacio y luego hablar sobre la transformación. subespacio a otro espacio. Esto tiene los siguientes efectos: primero, las imágenes de la misma clase están más cerca y, segundo, las imágenes de diferentes clases están más alejadas, de esta manera, las imágenes separadas por clasificación lineal se pueden separar fácilmente en el nuevo espacio; Al mismo tiempo, la tecnología de cara propia encontrará los elementos básicos de la distribución de la imagen de la cara, es decir, los vectores propios de la matriz de covarianza del conjunto de muestras de imágenes de la cara, para caracterizar la imagen de la cara. Hay muchos elementos básicos en las imágenes del rostro humano, como ojos, mejillas, labios y otros elementos básicos. El subespacio generado por estos vectores propios en el espacio de imagen de la cara propia se denomina espacio de subcara.

Una vez generado el subespacio, se debe construir el espacio. Entonces, ¿cómo construir el espacio? Primero, necesitamos encontrar el * * * del rostro humano. En segundo lugar, necesitamos encontrar la diferencia entre el individuo y * * *. Finalmente, debemos entender que * * * es en realidad un espacio y el individuo es un. vector. La matriz de covarianza se utiliza para descomponer los valores propios de todas las imágenes faciales en el conjunto de destino para obtener los vectores propios correspondientes. Estos vectores de características son "superficies de características". Encuentre las características de vectores propios y combinaciones lineales. En el espacio basado en cada subcara de característica, cada cara es un punto y las coordenadas de este punto son las coordenadas proyectadas de cada cara debajo de cada base de característica.

Proceso de algoritmo de cara propia

Adquiere datos de imagen de cara, encadena cada matriz de imagen de cara en una dimensión por filas, y cada cara es un vector;

Agrega M caras de las dimensiones correspondientes y promedielas para obtener la "cara promedio";

Reste el vector de cara promedio de cada imagen;

Calcule la matriz de covarianza

Cara; reconocimiento basado en memoria de caras propias:

Proceso de práctica de algoritmos;

Imágenes de entrenamiento

Encontrar la cara promedio

Obtener subsuperficies de características

Realizar reconstrucción de imágenes.

Encuentra imágenes de rostros con alta similitud.

2.Algoritmo FisherFace

FisherFace es la aplicación del discriminante lineal de Fisher en el reconocimiento facial. La idea del algoritmo de análisis discriminante lineal (LDA) fue propuesta por primera vez por Ronald, un estadístico y genetista británico y uno de los fundadores de la ciencia estadística moderna. El algoritmo LDA utiliza métodos estadísticos para intentar encontrar combinaciones lineales de características entre objetos, teniendo en cuenta la información de categoría y reduciendo la dimensionalidad. La combinación lineal obtenida por este algoritmo se puede utilizar como clasificador lineal o reducción de dimensionalidad.

Idea básica

La idea básica del análisis discriminante lineal es proyectar muestras de patrones de alta dimensión en un espacio vectorial óptimo de baja dimensión, extrayendo así información de clasificación importante y comprimiendo la dimensionalidad. del espacio de características. Se garantiza que la muestra de patrón proyectada tendrá la distancia máxima entre clases y la distancia mínima dentro de clase en el nuevo subespacio, es decir, el patrón tiene la mejor separabilidad en este espacio. La teoría utilizada en las caras propias es similar a las caras propias. Ambos son métodos para reducir la dimensionalidad completa de los datos originales a un espacio de baja dimensión. Fisherfaces y Eigenfaces se diferencian de LBP en la extracción de características de textura locales de todos los datos.

Utilice el método discriminante lineal de Fisher para determinar una dirección de proyección óptima, construya un espacio de símbolo unidimensional, proyecte la imagen de la cara multidimensional en el espacio de características de Fisherfaces y utilice datos de muestra intraclase para formar un conjunto de vectores de características para representar las características de la cara.

Sabemos que este algoritmo minimiza la distancia dentro de la clase y maximiza la distancia entre clases después de que los datos de muestra se asignan a otro espacio de características. El algoritmo LDA se puede utilizar para la reducción de dimensionalidad y su principio es muy similar al algoritmo PCA, por lo que el algoritmo LDA también se puede utilizar en el campo del reconocimiento facial. El algoritmo que utiliza el algoritmo PCA para el reconocimiento facial se denomina método de cara propia, mientras que el algoritmo que utiliza el algoritmo LDA para el reconocimiento de rostro se denomina método de cara de Fisher.

Comparado con PCA, LDA:

Igual que: 1. Ambos adoptan la idea de descomposición propia de la matriz al reducir la dimensionalidad 2. Ambos suponen que los datos se ajustan a la distribución gaussiana. Diferencia: 1 y LDA son métodos de reducción de dimensionalidad supervisados, mientras que PCA no está supervisado. 2. Si los datos son de dimensión K, entonces LDA solo puede reducir la dimensión a (k-1) dimensiones, pero PCA no está sujeto a esta restricción. 3. Desde una perspectiva matemática, LDA selecciona la dirección de proyección con el mejor rendimiento de clasificación y PCA selecciona la dirección con la mayor variación de puntos de proyección de muestra. En comparación con el algoritmo de cara propia, el algoritmo de Fisherfaces:

Lo mismo: ambos pueden reducir la dimensionalidad de los datos; ambos utilizan la idea de descomposición propia de la matriz en la reducción de dimensionalidad.

Diferencia: Fisherfaces es un método de reducción de dimensionalidad supervisado, mientras que Eigenfaces es un método de reducción de dimensionalidad no supervisado; Fisherfaces no solo se puede utilizar para la reducción de dimensionalidad, sino también para la clasificación.

Vale la pena mencionar que la tasa de error del algoritmo FisherFace es menor que los resultados de reconocimiento de rostros propios probados por las bases de datos de rostros de Harvard y Yale.

Proceso del algoritmo de Fisherface

Obtenga datos de la imagen del rostro y luego calcule el valor promedio del rostro.

Observa los valores característicos de cada rostro.

Realiza reconocimiento facial, observa rasgos faciales y determina si se trata de un individuo.

Finalmente realiza el reconocimiento facial.

3.Algoritmo LBPH (histograma de patrón binario local)

El histograma de patrón binario local es un histograma estadístico de las características de LBPH que combina las características de LBP y la información espacial de la imagen. Si la imagen codificada LBP se usa directamente para el reconocimiento facial. De hecho, no hay mucha diferencia entre extraer características de LBP y no extraer características de LBP. Por lo tanto, en aplicaciones LBP reales, el histograma estadístico de la imagen codificada LBP se utiliza generalmente como vector de características para la clasificación y el reconocimiento.

El operador LBP original se define como la comparación de los valores de gris de ocho píxeles adyacentes dentro de una ventana de 33° con el píxel central de la ventana como umbral. Si el valor del píxel periférico es mayor o igual que el valor del píxel central, la posición del píxel se marca como 1; de lo contrario, es 0. De esta manera, puede comparar 8 puntos en la vecindad 33 y generar un número binario de 8 bits (generalmente convertido a un número decimal, es decir, código LBP, hasta 256 tipos), es decir, puede obtener el valor LBP. del píxel en el centro de la ventana. Este valor se puede utilizar para reflejar las características de textura de esta área.

Dimensiones del LBPH: Hay 8 puntos de muestreo. Si se utiliza la característica LBP original o extendida, la dimensión del vector de característica LBP de una imagen es: 64256 = 16384 dimensiones, y si se usa la característica UniformPatternLBP, el valor LBP tiene 59 patrones. La dimensión de su vector de características es: 6459=3776. Se puede ver que el uso de características de patrón equivalentes reduce en gran medida la dimensionalidad de su vector de características, lo que significa que el tiempo de aprendizaje utilizando métodos de aprendizaje automático se reducirá considerablemente, pero el rendimiento no se verá muy afectado.

Idea básica

La idea básica del método de reconocimiento facial basado en LBPH es: primero, tomar cada píxel como centro y determinar la relación con el valor de gris del entorno. píxeles y realizar codificación binaria, obteniendo así la imagen codificada LBP de toda la imagen, luego la imagen LBP se divide en cuatro áreas, y se obtiene el histograma codificado LBP de cada área, y luego se obtiene el histograma codificado LBP de toda la imagen; obtenido. Al comparar los histogramas de codificación LBP de diferentes imágenes faciales, se logra el propósito del reconocimiento facial. Su ventaja es que no se ve afectado por la iluminación, el escalado, la rotación y la traslación.

Como sugiere el nombre, el algoritmo LBPH utiliza extracción de características locales, que es la mayor diferencia con los dos primeros métodos.

Flujo del algoritmo

Extracción de características LBP: procesa la imagen original de acuerdo con el operador LBP unificado;

Coincidencia de características LBP (cálculo de histograma): convierte la imagen Dividir Dividalo en varias subregiones, calcule su histograma de acuerdo con el valor LBP en la subregión y utilice el histograma como su característica distintiva.

4. Copiar código del algoritmo

1), algoritmo de cara propia.

#Encoding=utf-8

Importar numpy como np

Importar cv2

Importar al sistema operativo

Categoría superficie de característica (objeto):

def __init__(self, umbral, dimNum, dsize):

self umbral = umbral # umbral aún no se ha utilizado.

self.dimNum = dimNum

self.dsize = dsize

def loadImg(self, nombre de archivo, tamaño):

' ''

Carga la imagen, escala de grises, tamaño uniforme y ecualización de histograma.

: param fileName: nombre del archivo de imagen

: paramsize: tamaño uniforme. Forma de tupla

: Retorno: matriz de imagen

'''

img = cv2.imread(nombre de archivo)

retImg = cv2 .resize(img, dsize)

retImg = cv2.cvtColor(retImg, cv2.

color_RGB 2 gris)

retImg = cv2.equalizeHist(retImg)

# cv2.imshow('img ', retImg)

# cv2.waitKey ()

Devolver reubicación

def createImgMat(self, dirName):

'''

Generar la matriz de muestra de imagen, que La matriz se organiza en atributos de comportamiento y se enumera como muestras.

: param dirName: ruta a la carpeta de imágenes que contiene el conjunto de datos de entrenamiento.

: Retorno: matriz de muestra, matriz de etiquetas

'''

dataMat = np.zeros((10, 1))

label = []

Para el directorio principal, nombre del directorio, nombre de archivo (nombre del directorio) en os.walk:

#Imprimir padre

# Imprimir nombre del directorio

#Imprimir nombre del archivo

Índice = 0

Para el nombre del directorio en el nombre del directorio:

Para os.walk Padre hijo , nombre del archivo secundario, nombre del archivo secundario (nombre del directorio principal '/') en:

Para el nombre del archivo en el nombre del archivo secundario:

img = self load img(sub pent '. /' nombre de archivo, self.dsize)

tempImg = NP forma(img, (-1, 1))

Si índice == 0:

dataMat = tempImg

De lo contrario:

dataMat = NP . column _ stack((dataMat, tempImg))

label.append(subparte '/' nombre de archivo )

Índice = 1

Devolver tabla de datos, etiqueta

def PCA(self, dataMat, dimNum):

'''

Función PCA, utilizada para la reducción de la dimensionalidad de los datos.

: param dataMat: matriz de muestra

: param dimNum: dimensión objetivo después de la reducción de dimensionalidad.

: Retorno: la matriz de muestra y la matriz de transformación después de la reducción de dimensionalidad.

'''

#Matriz media

meanMat = np.mat(np.mean(dataMat, 1)). T

Imprimir 'tamaño promedio de la matriz', indicando la forma de la matriz

diffMat = dataMat-meanMat

# Encuentre la matriz de covarianza, porque la dimensión de la muestra es mucho mayor que el número de muestra, por lo que no busque directamente la matriz de covarianza, utilice el siguiente método.

cov mat =(diff mat . t * diff mat)/float(diff mat . forma[1])#Normalización

#covMat2 = np.cov(dataMat, sesgo= True)

# print 'La matriz de covarianza calculada por el método básico es', covMat2.

Imprimir "dimensión de la matriz de covarianza", covMat.shape

eigVals, EIG vects = NP linalg . Imprima "dimensión del vector propio", vector propio.

Forma

Imprimir "valores propios", valores propios

eigVects = diffMat*eigVects

eigValInd = np.argsort(eigVals)

EIG valind = EIG valind[::-1]

EigValInd = eigValInd[:dimNum] #Obtiene los primeros n valores propios del número especificado.

Imprimir "valores propios seleccionados", eigValInd

Vectores EIG = vectores EIG/NP . linalg (vectores EIG, eje = 0) #Vector propio normalizado

p>

redeigwects = EIG vects[:,eigValInd]

Imprimir "vectores propios seleccionados", rediseñar vectores. Forma

Imprimir 'dimensiones de matriz promedio', forma de matriz de diferencia

lowMat = redEigVects. t *Formato diferencial

Imprimir 'dimensión de matriz de baja dimensión', lowMat.shape

Devolver lowMat, rediseñar

Definir comparación (auto, datos, prueba, Etiqueta):

'''

Función de comparación, aquí solo se usa la comparación de distancia euclidiana más simple, también se pueden usar KNN y otros métodos, si es necesario modificarlo aquí.

: param dataMat: matriz de muestra

: Prueba de parámetros: matriz de imagen de prueba en forma original.

: Etiqueta de parámetro: matriz de etiquetas

: retorno: El nombre del archivo de imagen más cercano a la imagen de prueba.

'''

testImg = cv2.resize(testImg, self.dsize)

testImg = cv2.cvtColor(testImg, cv2.Color_RGB 2 gris)

testImg = NP forma(testImg, (-1, 1))

lowMat, redVects = self. PCA(dataMat, self.dimNum)

testImg = redVects. t *Test

Imprimir "tamaño de conversión de muestra de prueba", testimg.shape.

disList = []

testVec = NP shape(testImg, (1, -1))

Se aplica a muestras en lowMat. t:

dislist . append(NP . linalg . norm(test vec-sample))

Imprimir lista

sortIndex = np.argsort(disList)

Etiqueta de retorno [sortIndex[0]]

Definir predicción (propio, nombre de directorio, nombre de archivo de prueba):

'''

Función de predicción

: param dirName: Ruta a la carpeta que contiene el conjunto de datos de entrenamiento.

: parámetro testFileName: nombre del archivo de imagen de prueba.

: Devolución: resultado de la predicción

'''

testImg = cv2 . self.createImgMat(nombre del directorio)

Imprimir "Cargando etiqueta de imagen", etiqueta

ans = self.compare(datos, prueba, etiqueta)

Devolver respuesta

if __name__ == '__main__ ':

eigenface = EigenFace(20, 50, (50, 50))

Imprime la eigenface. Predecir ('d:/face ', 'd:/face_test/1.BMP') 2), algoritmo FisherFaces.

#Encoding=utf-8

Importar numpy como np

Importar cv2

Importar al sistema operativo

Clase FisherFace(Objeto):

def __init__(self, umbral, k, dsize):

self umbral = umbral # umbral, aún no utilizado.

Self.k = k #Especifique el número de proyecciones w.

Self.dsize = dsize #Tamaño uniforme

def loadImg(self, nombre de archivo, tamaño):

'''

Carga la imagen, escala de grises, unifica el tamaño y ecualiza el histograma.

: param fileName: nombre del archivo de imagen

: paramsize: tamaño uniforme. Forma de tupla

: Retorno: matriz de imagen

'''

img = cv2.imread(nombre de archivo)

retImg = cv2 .resize(img, dsize)

retImg = cv2.cvtColor(retImg, cv2. Color_RGB 2 Gris)

retImg = cv2.equalizeHist(retImg)

# cv2.imshow('img ', retImg)

# cv2.waitKey()

Devolver reubicación

def createImgMat(self, dirName):

'''

Genera una matriz de muestras de imágenes organizadas en atributos de comportamiento y enumeradas como muestras.

: param dirName: ruta a la carpeta de imágenes que contiene el conjunto de datos de entrenamiento.

: Retorno: lista que contiene matriz de muestra, lista de etiquetas

'''

dataMat = np.zeros((10, 1))

label = []

Lista de datos = []

Para directorio principal, nombre de directorio, nombre de archivo (nombre de directorio) en os.walk:

#Imprimir elemento principal

#Imprimir nombre de directorio

#Imprimir nombre de archivo

#index = 0

Para nombre de directorio Nombre de directorio en:

Para padre hijo, nombre de archivo hijo, nombre de archivo hijo (nombre del directorio padre '/') en os.walk:

Para índice, enumeración Nombre de archivo (nombre de subarchivo ) en:

img = self . cargar img(sub pent '/' nombre de archivo, self.dsize)

tempImg = NP forma(img, (-1, 1))

Si índice == 0:

dataMat = tempImg

En caso contrario:

dataMat = NP column _ stack((dataMat, tempImg))

dataList.append(material de datos)

label.append(subpart)

Devolver lista de datos, etiqueta

def LDA(self, dataList, k):

'''

Algoritmo de análisis discriminante lineal para problemas de clasificación múltiple

: Lista de datos de parámetros: lista de matrices de muestra

: parámetro k: número de vectores de proyección k

: retorno: lista de matrices convertidas y matriz convertida.

'''

n = lista de datos[0]. Forma[0]

W = np.zeros((n, self.k))

Sw = np.zeros((n,n))

Sb = np.zeros((n, n))

u = np.zeros((n, 1))

N = 0

listamedia = []

sampleNum = []

Para dataMat en dataList:

meanMat = np.mat(np.mean(dataMat, 1)). T

meanList.append(meanMat)

número de muestra append(datamat . shape[1])

dataMat = dataMat-meanMat

sw = matriz de datos * matriz de datos. T

Software = software

Imprimir "tamaño del software", forma del software

Para índice, significa mat (lista de medias) en la enumeración:

m = número de muestra[índice]

u = m*meanMat

N = m

u = u/N

Imprima "tamaño de la forma de U"

Para el índice, significa mat(lista de medias) en la enumeración:

m = número de muestra[índice]

sb = m *(mediaMat-u)*(mediaMat-u).

T

Sb = sb

Imprime "el tamaño de alguien", la forma de alguien

eigVals, EIG vects = NP . . Lina LG . inv(Sw)* Sb))

eigValInd = np.argsort(eigVals)

EIG valind = EIG valind[::-1]

EigValInd = eigValInd[:k] #Obtiene los primeros k valores propios del número especificado.

Imprimir "Valores propios seleccionados", los valores propios son válidos. Forma

Vectores EIG = vectores EIG/NP . linalg . norma(vectores EIG, eje = 0) #Vector de características normalizado

redeigwects = vects EIG[:, eigValInd]

Imprimir "Dimensiones de la Matriz de Transformación", redirigir. Forma

transMatList = []

Para dataMat en dataList:

trans matlist .append(redeig vects.T*dataMat)

Devuelve transMatList, redEigVects

Definir comparación (auto, lista de datos, prueba, etiqueta):

'''

Función de comparación, solo se usa la más simple aquí Para comparar distancias euclidianas, también puede utilizar KNN y otros métodos, si necesita modificarlo aquí.

: Lista de datos de parámetros: Lista de matrices de muestra

: Prueba de parámetros: Matriz de imagen de prueba en forma original.

: Etiqueta de parámetro: matriz de etiquetas

: retorno: La carpeta de imágenes más cercana a la imagen de prueba, es decir, la categoría.

'''

testImg = cv2.resize(testImg, self.dsize)

testImg = cv2.cvtColor(testImg, cv2.Color_RGB 2 gris)

testImg = NP . forma(testImg, (-1, 1))

transMatList, redVects = fisherface. LDA(datatable, self.k)

testImg = redVects. t *Test

Imprimir "Tamaño de conversión de la muestra de prueba", testimg.shape.

disList = []

testVec = NP forma(testImg, (1, -1))

suma vec = NP mat(NP . ceros. ((self . dsize[0] * self . dsize[1], 1)))

Para transMat en transMatList:

Para muestras en transMat.

t:

dislist . append(NP . linalg . norm(test vec-sample))

Imprimir lista

sortIndex = np.argsort(disList)

Etiqueta de retorno [sortIndex[0]/9]

Definir predicción (propio, nombre de directorio, nombre de archivo de prueba):

'''

Función de predicción

: param dirName: ruta a la carpeta que contiene el conjunto de datos de entrenamiento.

: parámetro testFileName: nombre del archivo de imagen de prueba.

: Devolución: resultado de la predicción

'''

testImg = cv2 . self.createImgMat(nombre del directorio)

Imprimir "Cargando etiqueta de imagen", etiqueta

ans = self.compare(datos, prueba, etiqueta)

Devolver respuesta

if __name__=="__main__ ":

fisherface = FisherFace(10, 20, (20, 20))

ans = fisher face predict(. 'd:/face', 'd:/face_test/8.bmp')

Imprimir ans3), algoritmo LBPH

#encoding=utf-8

Importar numpy como np

Importar sistema operativo

Importar cv2

Clase LBP (objeto):

def __init__(self, umbral , dsize, blockNum):

Self.dsize = dsize #Tamaño uniforme

Self.blockNum = blockNum #Número de bloques divididos

self umbral = umbral. # umbral, aún no utilizado.

def loadImg(self, nombre de archivo, tamaño):

'''

Carga la imagen, escala de grises, tamaño uniforme y ecualización de histograma.

: param fileName: nombre del archivo de imagen

: paramsize: tamaño uniforme. Forma de tupla

: Retorno: matriz de imagen

'''

img = cv2.imread(nombre de archivo)

retImg = cv2 .resize(img, dsize)

retImg = cv2.cvtColor(retImg, cv2. Color_RGB 2 Gris)

retImg = cv2.equalizeHist(retImg)

# cv2.imshow('img ', retImg)

# cv2.waitKey()

Devolver reubicación

def loadImagesList(self, dirName):

'''

Cargar lista de matriz de imágenes

: nombre del directorio de parámetros: ruta de la carpeta

: retorno: contiene la mayor lista de imágenes originales matrices y matriz de etiquetas.

'''

imgList = []

label = []

Para el directorio principal, nombre del directorio, en sistema operativo. caminar El nombre del archivo (nombre del directorio):

#Imprimir elemento principal

#Imprimir nombre del directorio

#Imprimir nombre del archivo

Para el directorio Nombre del directorio en el nombre:

Para padre hijo, nombre de archivo hijo, nombre de archivo hijo (nombre de directorio padre '/') en os.walk:

Para nombre de archivo hijo Nombre del archivo en:

img = self . load img(sub pent '/' filename, self.dsize)

ImgList.append(img) #La matriz de imagen original es agregado a la lista, no se realiza ningún procesamiento.

label.append(subparte '/' nombre de archivo)

Devuelve imgList, etiqueta

def getHopCounter(self, num):

'''

Calcula si una secuencia binaria cambia sólo dos veces.

: Número de parámetro: número

: retorno: 01 número de cambios

'''

binNum = bin(cantidad)

p>

binStr = str(binNum)[2:]

n = len(binStr)

Si n = centro)*(1 Extendido conocimiento: Dificultades de la investigación del algoritmo de reconocimiento facial

Los algoritmos de reconocimiento facial se han estudiado durante mucho tiempo. La mayoría de los algoritmos pueden manejarlo bien cuando el fondo es simple. Sin embargo, el rango de aplicación del reconocimiento facial es muy amplio. es simplemente simple. Las pruebas de imágenes están lejos de satisfacer las necesidades reales. Por lo tanto, todavía existen muchas dificultades en los algoritmos de reconocimiento facial.

Iluminación

La iluminación es un viejo problema en la visión artificial. especialmente en el reconocimiento facial, el algoritmo aún no está listo para su uso.

Actitud

Al igual que el problema de la iluminación, el problema de la postura también es una dificultad técnica que debe resolverse en el rostro. investigación de reconocimiento.Hay relativamente poca investigación sobre la postura. La mayoría de los algoritmos de reconocimiento facial están dirigidos principalmente a imágenes de rostros frontales o casi frontales. Cuando el tono o la izquierda y la derecha son severos, la tasa de reconocimiento del algoritmo de reconocimiento facial también disminuirá drásticamente.

Refugio

La oclusión es un problema muy grave para la recopilación de imágenes faciales en condiciones no cooperativas, especialmente en un entorno de vigilancia donde los sujetos monitoreados suelen usar gafas, sombreros y otros accesorios. , lo que puede hacer que las caras recopiladas La imagen esté incompleta, lo que afecta la extracción y el reconocimiento de características posteriores, e incluso provoca la falla del algoritmo de reconocimiento facial

Cambios de edad

A medida que envejece. cambios, la apariencia facial también cambia, especialmente para los adolescentes, este cambio es más obvio para diferentes grupos de edad, la tasa de reconocimiento de los algoritmos de reconocimiento facial es diferente. La fuente de la imagen de la cara puede ser diversa. Debido a los diferentes equipos de recolección, la calidad de las imágenes de la cara obtenidas también es diferente. Especialmente para aquellas imágenes de cara con baja resolución, alto ruido y mala calidad, la forma de reconocer caras de manera efectiva es una cuestión de calidad. Es necesario prestar atención al problema. De manera similar, para imágenes de alta resolución, el impacto en los algoritmos de reconocimiento facial requiere más estudio.

Falta de muestras

Los algoritmos de reconocimiento facial se basan en el aprendizaje estadístico. El reconocimiento facial es el algoritmo principal en el campo, pero el método de aprendizaje estadístico requiere mucho entrenamiento. Dado que la distribución de imágenes faciales en el espacio de alta dimensión es una distribución popular irregular, las muestras que se pueden obtener son solo una pequeña parte. El espacio de imágenes faciales para resolver el problema del aprendizaje estadístico en muestras pequeñas requiere más investigación.

Datos masivos

Los algoritmos tradicionales de reconocimiento facial, como PCA y LDA, se pueden entrenar y entrenar fácilmente en muestras pequeñas. escalar datos sin embargo, para grandes cantidades de datos, el proceso de entrenamiento de estos métodos es difícil e incluso puede colapsar.

Reconocimiento facial a gran escala

A medida que crece la base de datos facial, el rendimiento del algoritmo facial disminuirá.