Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. # Einführung
  2. ---
  3.  
  4. ## Beschreibung des Projektes
  5.  
  6. Dieses Projekt beschäftigt sich mit Verfahren der Objektverfolgung bzw. Mustererkennung (oder Merkmalsextraktion) in Videodaten. Unter Verwendung der OpenCV Bibliothek eine Gesichtserkennung im Videostream umzusetzen und die Person mittels Mustererkennung (Training auf ausgewählte Profilbilder) zu identifizieren. Dokumentierte Beispiel-Code für die Teilbereiche ist vorhanden. Schließlich soll erhoben werden, inwiefern das umgesetzte Verfahren auf einem Roboter (NAO) eingespielt werden kann.
  7.  
  8. [[_TOC_]]
  9.  
  10. # Projektumfeld (Technologien)
  11. ---
  12. Programmiersprache: Python (Anaconda Environment)
  13. Libraries: OpenCV, sklearn, dlib
  14.  
  15.  
  16. # Projektsetup
  17.  
  18. Um das Projekt auf einer lokalen Maschine laufen zu lassen, braucht man cmake und einen c-compiler da eine der verwendeten Libraries aus nativem C Code besteht.
  19.  
  20. Anaconda und Python 3.7 werden ebenfalls benötigt.
  21.  
  22. Um die Requierements zu installieren:
  23.  
  24. pip install -r requirements.txt (Im Projektverzeichnis)
  25.  
  26. # Genereler Aufbau des Programms
  27.  
  28. Das Projekt besteht aus folgenden Files:
  29.  
  30. - FaceTools.py
  31. - FaceLearner.py
  32. - SmoothFaceClassifier.py
  33.  
  34. # Benutzung des Programms:
  35.  
  36. ## Im Projektverzeichnis einen Ordner "pictures" anlegen, und darin in Unterordnern, die die Namen einer jeweiligen Person haben,
  37. Trainingsbilder der Person hinzufügen. Der Name der Bilder selbst ist egal, es ist nur wichtig, dass jeweils nur ein Gesicht auf den
  38. Bildern zu erkennen ist (Da Sonst verschiedene Gesichter dem selben Namen zugeordnet werden)
  39.  
  40. ## Danach FaceLearner.py ausführen, welcher alle Bilder scannt und das Modell trainiert. Das fertige Modell wird danach unter dem
  41. Namen "model.txt" im Projektverzeichnis gespeichert.
  42.  
  43. ## Zum klassifizieren muss nun einfach SmoothFaceClassifier.py gestartet werden, welches auf die Webcam zugreift und Gesichter
  44. in Echtzeit klassifiziert. Das Skript ladet beim Start automatisch das vorher erstellte Modell.
  45.  
  46. # Funktionsweise der Klassifizierung
  47.  
  48. ## Step 1 - Gesichter in Bildern finden
  49.  
  50. Im ersten Schritt werden Gesichter in Bildern gefunden und einem Namen zugeordnet.
  51. Dazu wird das Bild/Video zuerst in Grautöne abgestuft. Diese Methode analysiert einzelne Pixel. Zuerst wird verglichen wie dunkel der momentane Pixel im Vergleich zu seinen Nachbarn ist, woraus ein Vektor generiert wird der die Richtung abbildet in welche das Bild dunkler wird. Aus diesen Informationen wird ein sogenanntes "HOG Face" erstellt. Dieses wird mit anderen HOG Pattern verglichen, woraus die Position und eine grobe Boundry Box resultieren.
  52. Dafür wurde eine bereits fertige Methode der Klasse "dlib" verwendet.
  53.  
  54. ## Step 2 - Markante Punkte filtern und Perspektive Berücksichtigen
  55.  
  56. Im zweiten Schritt werden markante Punkte im gefundenen Gesicht gesucht. Diese Punkte werden auch "Landmarks" genannt und sind zum Beispiel: Die Augen, die Nase, der Munde und die Outlines des Gesichts.
  57. Sind diese markanten punkte gefunden, wird das Bild so transformiert, dass sich die Augen immer in der Mitte von einem Ausschnitt (auch "FaceChip" genannt) befinden. Dies erleichtert es dem Netzwerk im nächsten Schritt, die Features korrekt zuzuordnen (Normalisierung).
  58.  
  59.  
  60. [Code Step 1 und 2]
  61.  
  62. def getFaceChips(image, showShape):
  63.  
  64. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  65. rects = detector(gray, 2) #detects face locations
  66. chips = []
  67. boxes = []
  68. shapes = []
  69. for rect in rects:
  70. boxes.append(rect_to_bb(rect))
  71. shape = facepred(image, rect) #generates face landmarks
  72.  
  73. shapenp = face_utils.shape_to_np(shape)
  74. shapes.append(shapenp)
  75. chips.append(dlib.get_face_chip(image, shape)) #rotates and scales image based on eye position
  76. if(showShape):
  77. for (x, y) in shapenp:
  78. cv2.circle(image, (x, y), 1, (0, 255, 0), -1)
  79.  
  80. if(showShape):
  81. cv2.imshow("annotated",image)
  82. cv2.waitKey(1)
  83.  
  84. return chips,boxes
  85.  
  86.  
  87. ## Step 3 - Erstellung des Feature-Vektors
  88. Hierbei wird aus einem FaceChip ein 128 - dimensionaler Vektor generiert, welcher Merkmale des Gesichtes widerspiegelt.
  89. Dieser Vektor wird mittels eines vortrainierten Netzes, welches durch eine unsupervised Learning Methode erstellt wurde, generiert.
  90. Diese Methode wurde zum ersten Mal im Jahr 2015 in einem Paper namens "FaceNet" vorgestellt. Unser Programm bietet mit Hilfe der Library "Hypertools" die Möglichkeit, diese 128 dimensionalen Vektoren auf 3 Dimensionen "herunter zu rechnen" und zu visualisieren, wodurch eventuelle Ähnlichkeiten zwischen Personen erkannt werden können.
  91.  
  92. [Code Step 3]
  93.  
  94. def getFaceDescriptor(facechip):
  95. face_descriptor = facerec.compute_face_descriptor(facechip)
  96. return [np.array(face_descriptor)]
  97.  
  98. descriptions,tags = getImagesDescriptions("pictures")
  99. hyp.plot(descriptions, '.', hue=tags, legend=list(set(tags)))
  100.  
  101.  
  102. ## Step 4 - kNN trainieren (in unserem Fall)
  103.  
  104. Mit den genereierten 128d Vektoren wird ein k-Nearest-Neighbour Algorithmus trainiert. Dies ist der einzige Schritt bei dem sich die Klassifizierung und das Training unterscheiden.
  105. Wir haben als Machine Learning verfahren kNN gewählt, da neue Einträge in O(1) gelernt werden können und so die Zeit zum Trainieren drastisch reduziert wird, was die flexibilität des Programmes erhöht.
  106. Um beim klassifizieren durch die Berechnungen das Kamerabild nicht zu verzögern, wurde eine Multiprocessing - Lösung implementiert, bei welcher in zwei Prozessen unabhängig voneinander das Kamerabild angezeigt und die Gesichter erkannt und klassifiziert werden.
  107.  
  108. [Code Step 4]
  109.  
  110. def camStreamer(imageQueue,boxesQueue):
  111. try:
  112. camera = Camera()
  113. camera.start_capture()
  114. boxes = None
  115. chips = None
  116. tags = None
  117. while True:
  118. frame = camera.current_frame.read()
  119. frame = imutils.resize(frame, width=300)
  120.  
  121. writeNormQueue(frame.copy(),imageQueue)
  122.  
  123. if(boxesQueue.full()):
  124. boxes,chips,tags = boxesQueue.get()
  125.  
  126. if(boxes is not None):
  127. for box,tag,chip in zip(boxes, tags,chips):
  128. (x, y, w, h) = box
  129. cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255))
  130. cv2.putText(frame, str(tag), (x , y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255))
  131.  
  132. cv2.imshow("frame",frame)
  133. cv2.waitKey(10)
  134. except:
  135. print ("FATAL: camStreamer exited while multiprocessing")
  136. traceback.print_exc()
  137.  
  138. def faceLabeler(imageQueue,boxesQueue):
  139. try:
  140. print("faceLabeler started!")
  141. model = load("model.txt")
  142. while True:
  143. #if (imageQueue.full()):
  144. image = imageQueue.get()
  145. chips, boxes = ft.getFaceChips(image, False)
  146. tags = []
  147. for chip, box in zip(chips, boxes):
  148. tag = ft.classifyChip(model, chip)
  149. tags.append(tag)
  150. #cv2.imshow("chip",image)
  151. writeNormQueue([boxes,chips,tags],boxesQueue)
  152. cv2.waitKey(1)
  153.  
  154.  
  155. except:
  156. print ("FATAL: faceLabeler exited while multiprocessing")
  157. traceback.print_exc()
  158.  
  159.  
  160. def writeNormQueue(var,queue):
  161. if (queue.full()):
  162. try:
  163. queue.get_nowait()
  164. except:
  165. print("anormaly with emptying queue!")
  166.  
  167. queue.put(var)
  168.  
  169. if __name__ == '__main__':
  170. imageQueue = mp.Queue(1)
  171. boxesQueue = mp.Queue(1)
  172.  
  173. streamP = mp.Process(target=camStreamer, args=(imageQueue,boxesQueue,))
  174. labelP = mp.Process(target=faceLabeler,args=(imageQueue,boxesQueue,))
  175.  
  176. streamP.start()
  177. labelP.start()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement