Redes neurais para prever idade e sexo





As informações sobre a idade e sexo de uma pessoa são obtidas exclusivamente a partir de uma fotografia de seu rosto. Com base nisso, nossa tarefa pode ser dividida em duas etapas principais:



  1. Detectando faces na imagem de entrada.
  2. Extração da região de interesse (ROI - Região de Interesse) e aplicação do algoritmo do detector de idade e sexo da pessoa.


Para o estágio 1, existem muitas soluções prontas, por exemplo: cascatas Haar , HOG ((Histograma de gradientes orientados), modelos de aprendizagem profunda, etc. Vamos considerar as principais características distintivas de cada um deles:



  1. As cascatas Haar serão muito rápidas e capazes de funcionar em tempo real em dispositivos incorporados - o problema é que são menos precisas e muito suscetíveis a falsos positivos
  2. Os modelos HOG são mais precisos do que as cascatas Haar, mas mais lentos. Eles também não são tão tolerantes à oclusão (ou seja, quando parte da face está escondida)
  3. Deep Learning Face Detectors são os mais confiáveis ​​e darão a você a melhor precisão, mas requerem ainda mais recursos computacionais do que as cascatas Haar e HOG


Para selecionar um método adequado para nossa tarefa, foi realizada uma análise comparativa de dois algoritmos: cascatas de Haar e a rede neural convolucional MTCNN (Multi-Task Cascaded Convolutional Neural Network). No primeiro caso, a biblioteca OpenCV já contém muitos classificadores pré-preparados para rosto, olhos, sorriso, etc. (os arquivos XML são armazenados na pasta opencv / data / haarcascades /), no segundo caso, você precisa instalar a biblioteca usando o comando pip install mtcnn ...



Importando as bibliotecas necessárias



import cv2
from mtcnn import MTCNN
import matplotlib.pyplot as plt
image = cv2.cvtColor(cv2.imread('f.jpg'), cv2.COLOR_BGR2RGB) #  


Abaixo está o código para testar o funcionamento dos algoritmos



MTCNN:



detector = MTCNN() #  
result = detector.detect_faces(image)  #    
for i in range(len(result)): 
bounding_box = result[i]['box']  #   
cv2.rectangle(image, (bounding_box[0], bounding_box[1]),
(bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
           (0,155,255), 2) #     
plt.imshow(image) #   


cascata haar:



face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') #   XML-
faces = face_cascade.detectMultiScale(image, 1.3, 5)  #    
for (x,y,w,h) in faces: #      
    cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) #     
plt.imshow(image) #   


Vamos fazer uma série de experimentos para verificar a qualidade dos algoritmos.



- foto única de uma pessoa





- Várias pessoas na foto





- Várias pessoas na foto, no caso em que o olhar não está direcionado para a moldura





- Várias pessoas na foto quando parte de seu rosto está escondido, por exemplo, com máscaras





Podemos concluir que em condições ideais (alta definição da foto, o rosto é direcionado estritamente para o quadro), os dois algoritmos funcionam perfeitamente, mas ao menor desvio dessas condições, as cascatas de Haar começam a falhar. Portanto, a escolha centrou-se na utilização do modelo MTCNN.



Agora que descobrimos a escolha de um método para detectar rostos em uma foto, vamos prosseguir para a tarefa em si. Para determinar a idade e o sexo, dois modelos diferentes foram usados, treinados em uma grande quantidade de dados. Ambos os modelos foram treinados por Levy e Hassner, seu primeiro trabalho foi publicado em 2015 sob o título Classificação de idade e gênero usando redes neurais convolucionais" Em seu trabalho, eles demonstraram que o treinamento usando redes neurais convolucionais profundas (CNNs) pode alcançar ganhos de desempenho significativos em tarefas de predição de idade e gênero.



Um modelo treinado no conjunto de dados Adience para previsão de idade pode ser baixado do link 1 (* .caffemodel) e do link 2 (* .prototxt). Este modelo resolve o problema de classificação, não de regressão. A faixa etária é dividida em determinados intervalos ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)", "(38 -43) "," (48-53) "," (60-100) "], cada um dos quais é uma classe separada que o modelo pode prever.



Para determinar o gênero, um modelo foi retirado do repositóriopara o artigo " Compreendendo e comparando redes neurais profundas para classificação de idade e gênero " . Os modelos podem ser baixados do link 1 (* .caffemodel) e do link 2 (* .prototxt). O modelo usa a arquitetura GoogleNet e foi pré- treinado no conjunto de dados ImageNet .



Como você pode ver, cada modelo é representado por dois arquivos, o que significa que foi treinado no Caffe (um framework de aprendizado de máquina profundo voltado para facilidade de uso, alta velocidade e modularidade). O arquivo com a extensão prototxt é responsável pela arquitetura da rede, e o arquivo com a extensão caffemodel para o peso do modelo.



O código principal é brevemente apresentado a seguir, como um argumento para o modelo que passamos a pessoa definida acima.



AGE_BUCKETS = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)","(38-43)", "(48-53)", "(60-100)"]
gender_list=['Male','Female']
faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), (78.4, 87.7, 114.8), swapRB=False)
  ageNet.setInput(faceBlob)
  age_preds = ageNet.forward()
  age_i = age_preds[0].argmax()
  age = AGE_BUCKETS[age_i]
  ageConfidence = age_preds[0][age_i]
             age_text = "{}: {:.2f}%".format(age, ageConfidence * 100) #   
  genderNet.setInput(faceBlob)
  gender_preds = genderNet.forward()
  gender_i = gender_preds[0].argmax()
  gender=gender_list[gender_i]
  genderConfidence = gender_preds[0][gender_i]
  gender_text = "{}: {:.2f}%".format(gender, genderConfidence * 100) #   
   y = y1 - 10 if y1 - 10 > 10 else y1 + 10
   cv2.rectangle(image, (x1, y1), (x1+width, y1 + height), (0,155,255),2) 
   v2.putText(image, display_text, (x1, y),
   cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)


Os resultados obtidos durante o desenvolvimento do algoritmo







Como você pode ver, a modelo nem sempre mostra o resultado corretamente, às vezes atribui um gênero masculino às fotos onde as mulheres são retratadas. Talvez isso se deva à data não balanceada definida em que o modelo foi treinado. Contanto que você tenha os recursos de computação necessários, você pode tentar treinar o modelo sozinho, isso levará algum tempo, mas com um conjunto de dados balanceado e uma arquitetura de rede e parâmetros de treinamento devidamente selecionados, a precisão pode melhorar.



All Articles