Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. # Universidad de Guanajuato
  2. """
  3. Fuentes:
  4. Jason Brownlee. How to Develop a Face Recognition System Using FaceNet in Keras.
  5. https://machinelearningmastery.com/how-to-develop-a-face-recognition-system-using-facenet-in-keras-and-an-svm-classifier/
  6.  
  7.  
  8. """
  9.  
  10. from mtcnn.mtcnn import MTCNN
  11. from keras.models import load_model
  12. from keras_facenet import FaceNet
  13. from sklearn.preprocessing import Normalizer
  14. from sklearn.preprocessing import LabelEncoder
  15. from sklearn.svm import SVC
  16. from skimage.transform import resize
  17. from skimage import io
  18. from numpy import asarray
  19. import numpy as np
  20. import cv2 as cv2
  21.  
  22. from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QTextEdit, QLabel
  23. from pyqtgraph import ImageView
  24.  
  25. isSaveClicked = False
  26.  
  27. # Regresa la porción de la cara dentro de una imagen
  28. def returnFace(captura):
  29. soloCara = captura.copy()
  30. soloCara = soloCara[bbox[1]: bbox[1] + bbox[3], bbox[0]: bbox[0] + bbox[2]]
  31. return soloCara
  32.  
  33. # Ajusta la imagen de un rostro a 160x160 y la deja lista para ser usada en el modelo
  34. def saveFace(face):
  35. face = resize(face, (160,160))
  36. caraNorm = face.reshape((1,160,160,3))
  37. return caraNorm
  38.  
  39. # Recibe un rostro y retorna el vector de caracteristicas del rostro
  40. def convert(caraNorm):
  41. embeding = model.predict(caraNorm)
  42. return asarray(embeding[0])
  43.  
  44. # Normaliza el vector de caracteristicas de un rostro retorna el vector ya normalizado
  45. def normalizar(nuevaCaraV):
  46. normalizador = Normalizer().fit(nuevaCaraV)
  47. temp = normalizador.transform(nuevaCaraV)
  48. return temp
  49.  
  50. def saveNewFace(textEdit, label):
  51. nombre = textEdit.toPlainText()
  52. n = nombre
  53. label.setText("Cargando...")
  54. return n
  55. # nombres.append(nombre)
  56.  
  57. def getName(textEdit):
  58. nombre = textEdit.toPlainText()
  59. textEdit.clear()
  60. return nombre
  61.  
  62. def getFlag(flag):
  63. print("switch pressed")
  64. if (isSaveClicked == False):
  65. return True
  66. else:
  67. return False
  68.  
  69. if __name__ == '__main__':
  70. cam = cv2.VideoCapture(0)
  71. mirror = True
  72. detector = MTCNN()
  73. model = load_model('./facenet_keras.h5')
  74. # Almacena los rostros
  75. caras = []
  76. # Almacena los nombres de cada rostro
  77. nombres = []
  78. captura = []
  79. isSaveClicked = False
  80. # Codigo interfaz
  81. app = QApplication([])
  82. win = QMainWindow()
  83. x=win.width()*0.8
  84. y=win.height()*1.5
  85. win.setFixedSize(x,y)
  86. central_widget = QWidget()
  87. txt = QTextEdit('nombre', central_widget)
  88. txt.setFixedSize(txt.width(), txt.height())
  89. button2 = QPushButton('Guardar nueva cara', central_widget)
  90. label = QLabel("Introduce un nombre", central_widget)
  91. button2.clicked.connect(lambda: saveNewFace(txt,label))
  92. layout = QVBoxLayout(central_widget)
  93. layout.addWidget(label)
  94. layout.addWidget(button2)
  95. layout.addWidget(txt)
  96. win.setCentralWidget(central_widget)
  97. win.show()
  98.  
  99. image_view = ImageView()
  100. image_view.ui.histogram.hide()
  101. image_view.ui.roiBtn.hide()
  102. image_view.ui.menuBtn.hide()
  103. layout.addWidget(image_view)
  104. #app.exit(app.exec_())
  105.  
  106. while True:
  107. if cv2.waitKey(1) & 0xFF == ord('q'):
  108. break
  109.  
  110. ret_val, img = cam.read()
  111.  
  112. if mirror:
  113. img = cv2.flip(img, 1)
  114. captura = cv2.resize(img, (320, 240))
  115. faces = detector.detect_faces(captura)
  116.  
  117.  
  118.  
  119. if len(faces) > 0:
  120. for k in range(1):
  121. bbox = faces[k]['box']
  122. keypoints = faces[k]['keypoints']
  123.  
  124. # Guarda un rostro nuevo
  125. # if cv2.waitKey(33) == ord('s'):
  126.  
  127. if label.text() == "Cargando...":
  128. # Crea un vector que contendrá el nuevo rostro
  129. print("nueva cara")
  130. nuevaCaraV = []
  131.  
  132. soloCara = returnFace(captura)
  133. caraNorm = saveFace(soloCara)
  134. caraNorm = convert(caraNorm)
  135. nuevaCaraV.append(caraNorm)
  136. nuevaCaraV = normalizar(nuevaCaraV)
  137.  
  138. # Vector que almacenará las caracteristicas del vector del rostro normalizado
  139. temp = []
  140. for valor in nuevaCaraV[0]:
  141. temp.append(valor)
  142.  
  143. caras.append(temp)
  144. # nombre = input("Escribe tu nombre: ")
  145. nombre = saveNewFace(txt, label)
  146. nombres.append(nombre)
  147. isSaveClicked = False
  148. label.setText(nombre)
  149.  
  150. # Cuando tengamos datos almacenados en caras comenzamos a comparar rostros
  151. if len(caras) > 0:
  152. caraPruebaV = []
  153. caraPrueba = returnFace(captura)
  154.  
  155.  
  156. if caraPrueba.shape[0] > 0 and caraPrueba.shape[1] > 0:
  157.  
  158. soloCaraPrueba = saveFace(caraPrueba)
  159. soloCaraPrueba = convert(soloCaraPrueba)
  160. caraPruebaV.append(soloCaraPrueba)
  161. caraPruebaV = normalizar(caraPruebaV)
  162. # Resultado o distancia menor (Mayor correspondencia de vector de rostros)
  163. resultado = 100
  164.  
  165. for cara in caras:
  166. suma = 0.0
  167. #Calcular la distancia entre los vectores de la cara de prueba con los almacenados en caras
  168. for i in range(128):
  169. suma = suma + pow(caraPruebaV[0][i] - cara[i], 2)
  170.  
  171. distancia = pow(suma, 0.5)
  172.  
  173. # Si la distancia calculada es menor al resultado previo se reemplaza porque el rostro en prueba
  174. # es mas "parecido" al almacenado
  175. if distancia < resultado:
  176. # Guardamos el indice del nombre correspondiente a la cara mas parecida
  177. indice = caras.index(cara)
  178. resultado = distancia
  179.  
  180. # Si la distancia entre los vectores es menor a 1 consideramos que la estimación es acertada
  181. if resultado < 1:
  182. cv2.putText(captura, nombres[indice], (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), lineType=cv2.LINE_AA)
  183. # cv2.circle(captura,(keypoints['right_eye']), 15, (0,0,0), 2)
  184. # cv2.circle(captura,(keypoints['left_eye']), 15, (0,0,0), 2)
  185. # cv2.circle(captura,(keypoints['nose']), 10, (0,0,255), -1)
  186. # cv2.putText(captura, 'Feliz Navidad', (keypoints['mouth_left']), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), lineType=cv2.LINE_AA)
  187. cv2.circle(captura, (10,15), 5,(0,255,0), -1 )
  188. label.setText(nombres[indice])
  189. else:
  190. label.setText('Desconocido')
  191. cv2.putText(captura, 'Desconocido', (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), lineType=cv2.LINE_AA)
  192. cv2.circle(captura, (10,15), 5,(0,0,255), -1)
  193.  
  194. captura = cv2.rectangle(captura, (bbox[0], bbox[1]), (bbox[0]+bbox[2], bbox[1]+bbox[3]), (0,255,0))
  195.  
  196. image_view.setImage(captura.T)
  197. # cv2.imshow('Proyecto IA', captura)
  198.  
  199. cam.release()
  200. cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement