"Shenzhen" ist eine der am stärksten von der IT entwickelten Städte in China. Nach dem, was ich höre, können Sie Zahlungen tätigen, indem Sie einfach Ihr Gesicht von Zahlungen im Supermarkt bis zu Verkaufsautomaten halten. Ob es gut oder schlecht ist, es ist erstaunlich. Es ist futuristisch und cool. Dann mach mich auch! Ich habe es letztes Jahr mit einem Kleber wie w gemacht, aber ich konnte es nicht zu einem Artikel machen, also habe ich beschlossen, es dieses Mal zu machen. Das diesmal eingeführte System und Programm sind die ersten Werke, die Python richtig berührt haben, und die ersten denkwürdigen Werke, die das maschinelle Lernen berührt haben.
Nehmen Sie ein Bild Ihres Gesichts mit der Kamera Ihres PCs auf, verarbeiten und blasen Sie das Bild mit der Bibliothek OpenCV auf und erstellen Sie dann ein Programm zur Identifizierung der Person, indem Sie das Gesicht mit traincascade lernen. Die verwendete Sprache war Python3.
Dieses Mal haben wir zwei Arten der Gesichtsbildverarbeitung erstellt: das Lernprogramm und das Gesichtserkennungsprogramm.
① Starten Sie die PC-Kamera mit der Videoaufnahme (2) Speichern Sie 40 im Gesicht erkannte Bilder als Bilder ③ Fügen Sie 40 Bilder in verschiedenen Formen hinzu, um die Trainingsdaten zu erhöhen ④ Generieren Sie einen Lernbefehl ⑤ Geben Sie den generierten Befehl in die Konsole ein, um mit dem Lernen zu beginnen. ⑥ Generieren Sie nach Abschluss des Lernens eine Kaskadendatei
① Lesen Sie die Kaskadendatei des Registranten (2) Führen Sie jeden Frame durch eine Kaskadendatei, um Personen zu identifizieren.
face_learner/
├─face_learner.py
├─haarcascade_frontalface_default.xml
├─neg.txt
├─pos.txt
├─cascade/
├─neg/
├─neg1.jpg
├─neg2.jpg
├─neg3.jpg
…
└─neg265.jpg
├─pic/
├─pic1.jpg
├─pic2.jpg
├─pic3.jpg
…
└─pic1639.jpg
└─pos.vec
Diese Ordnerstruktur besteht nur aus den Dateien rund um das Lernprogramm. Das Personalidentifikationsprogramm ist nicht enthalten.
Bitte lesen Sie den Kommentar für den Teil des Quellcodes, den Sie leicht machen können. .. Zum Lernen sind zwei Arten von korrektem Bild (positives Bild) und falschem Bild (negatives Bild) erforderlich. Das richtige Bild ist das Gesichtsbild, das Sie lernen möchten, und Sie benötigen außerdem Koordinateninformationen darüber, wo sich das Gesicht im Bild befindet. Das falsche Antwortbild kann alles andere als das richtige Antwortbild sein. Dieses Mal werden 265 niedliche Tierbilder vorbereitet und im Voraus im Negativverzeichnis gespeichert.
Wir beginnen mit dem Sammeln dieser korrekten Bilder. Um das richtige Antwortbild zu erhalten, nehmen Sie zuerst 40 Gesichtsbilder auf und erhöhen Sie dann die Zahl auf etwa 1640, um die Lerngenauigkeit zu verbessern. Je größer die Anzahl der korrekten Bilder ist, desto höher ist die Lerngenauigkeit. Daher ist es ratsam, die Anzahl entsprechend zu erhöhen. Ich habe das Gefühl, dass es eine Konsultation mit den PC-Spezifikationen gibt. Da Sie ein neues Gesicht lernen, müssen Sie alle unnötigen Daten löschen, die Sie zuvor verwendet haben. Sie sollten hier klug damit umgehen können (lacht). Das Sammeln von Gesichtsbildern ist der Hauptzweck dieses Programms. Unter Verwendung der vorinstallierten Kaskadendatei zur Gesichtserkennung wird das Gesicht erkannt und zuerst werden 40 Gesichtsbilder aufgenommen. Beginnen Sie von hier aus mit dem Hinzufügen von Wasser. Die Zugabe von Wasser erfolgt durch Hinzufügen verschiedener Zusätze zum Bild. Es scheint, dass es in diesem Teil bereits ein Tool gibt, daher ist es absolut schnell, es zu verwenden. Dieses Mal habe ich auch meine eigene Programmierpraxis gemacht.
[Art der Bildänderung] • Horizontal spiegeln • Ändern Sie die Sättigung • Ändern Sie den Kontrast • Ändern Sie die Helligkeit • Schärfeänderung • ± 15 Grad Drehung
Hier gibt es viel Raum für Verbesserungen bei der Verarbeitung. Zuallererst ist es absolut gut, jedes Verarbeitungsteil funktionsfähig zu machen. In diesem Programm wird die Anzahl der Fotos jedes Mal gezählt und hinzugefügt, daher ist es besser, sie etwas intelligenter anzuwenden. Nach dem Sammeln der Bilder muss eine Textdatei erstellt werden, in der die Informationen des richtigen Bildes zusammengefasst sind. Dies ist der Pfad der Bilddatei, welcher Teil des Bildes das Gesicht hat, und die Koordinateninformationen des vierseitigen Vierecks, das den Teil mit dem Gesicht umgibt. Das Format ist [Anzahl der Pfadflächen Koordinaten (x) Koordinaten (y) Koordinaten (w) Koordinaten (h)]. w ist die Breite und h ist die Höhe. Ein Beispiel ist unten gezeigt.
pos.txt
pic/pic1389.jpg 1 454 328 547 547
pic/pic302.jpg 1 565 85 380 380
pic/pic464.jpg 1 947 389 31 31
pic/pic470.jpg 1 663 238 341 341
pic/pic1438.jpg 1 658 341 540 540
pic/pic316.jpg 1 620 88 376 376
pic/pic1376.jpg 1 795 414 376 376
pic/pic1410.jpg 1 476 408 379 379
pic/pic1404.jpg 1 497 394 383 383
pic/pic1362.jpg 1 754 400 372 372
pic/pic869.jpg 1 625 235 420 420
pic/pic855.jpg 1 380 185 381 381
pic/pic666.jpg 1 361 241 424 424
pic/pic100.jpg 1 312 91 360 360
pic/pic64.jpg 1 622 101 371 371
pic/pic114.jpg 1 279 84 375 375
pic/pic70.jpg 1 618 89 382 382
pic/pic672.jpg 1 1213 216 43 43
pic/pic672.jpg 1 369 274 385 385
pic/pic882.jpg 1 721 313 353 353
.
.
.
Nachdem Sie den Text generiert haben, müssen Sie nur noch den Befehl generieren. Zunächst ein Befehl zum Konvertieren in eine Vektordatei unter Verwendung der Informationen des richtigen Bildes. Der nächste Befehl zum Lernen. Python kann Linux-Befehle aus Python-Programmen wie den Funktionen os.system () und subprocess.call () ausführen, aber ich habe sie nicht erhalten, damit ich sie manuell ausführen kann. Ich versuche einen Befehl zu generieren. Wenn mir jemand etwas über diesen Teil erzählen kann, werde ich studieren! Wenn das Lernen abgeschlossen ist, wird die Datei cascade.xml im Kaskadenverzeichnis erstellt. Lesen Sie sie, um die Person zu identifizieren. Es ist einfacher zu verstehen, ob der Dateiname ein individueller Name ist.
Hierbei wird die zuvor erstellte Kaskadendatei verwendet, um Personen zu identifizieren. Die einzige von diesem Programm geladene Bibliothek ist OpenCV (cv2). Führen Sie den von der Kamera aufgenommenen Rahmen jedes Mal durch die Kaskadendatei. Wenn das Gesicht angehoben wird, schließen Sie den geschlossenen Teil mit einem Rahmen ein. Erstens, wenn das Gesicht einer Person erkannt wird, ist es von einem weißen Rahmen umgeben, und wenn eine Person erkannt wird, ist es von einem blauen Rahmen umgeben, und der Name wird darauf gezeichnet.
Mit diesem Gefühl können Sie Personen in Echtzeit mit einer Kamera identifizieren!
Ich bin wirklich zurückhaltend, schmutzigen Code freizulegen, aber ich bin sicher, dass es helfen wird, und ich werde den gesamten Code veröffentlichen. Bitte beachten Sie, dass es lang genug ist, um zu sterben.
face_leaner.py
import os
import re
import numpy as np
import time
import glob
import shutil
import PIL.Image
from PIL import ImageEnhance
import subprocess
import cv2
#uer_name = input("Who are you")
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#----------------------------------------------
#mov, pic,Klar pos
os.chdir('cascade')
for x in glob.glob('*.xml'):
os.remove(x)
os.chdir('../')
os.chdir('pic')
for x in glob.glob('*.jpg'):
os.remove(x)
os.chdir('../')
os.chdir('pos')
for x in glob.glob('*.jpg'):
os.remove(x)
os.chdir('../')
os.remove('pos.txt')
#----------------------------------------------
#pos.Erstellen Sie txt
f = open('pos.txt', 'a')
#----------------------------------------------
#Sammeln Sie Gesichtsbilder
cap = cv2.VideoCapture(0)
cascade_path1 = "haarcascade_frontalface_default.xml"
cascade_path2 = 'lbpcascade_profileface.xml'
cascade1 = cv2.CascadeClassifier(cascade_path1)
cascade2 = cv2.CascadeClassifier(cascade_path2)
color = (255,255,255)
picture_num = 1
while True:
ret, frame = cap.read()
facerect1 = cascade1.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100))
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame, str(picture_num), (10,500), font, 4,(0,0,0),2,cv2.LINE_AA)
if len(facerect1) > 0:
for (x,y,w,h) in facerect1:
#cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
picture_name = 'pic/pic' + str(picture_num) + '.jpg'
cv2.imwrite(picture_name, frame)
#text = picture_name + ' 1 ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + '\n'
#f.write(text)
picture_num = picture_num + 1
cv2.imshow("frame", frame)
if picture_num == 41:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#----------------------------------------------
#Starten Sie das Auffüllen
#Zählen Sie die Anzahl der Bilder in Bildern
dir = os.getcwd()
dirPic = dir + "/pic"
files = os.listdir(dirPic)
count = 0
for file in files:
count = count + 1
os.chdir('pic')
#Anzahl der Fotos
imageNum = count
#Horizontal spiegeln
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
img = cv2.imread(name)
yAxis = cv2.flip(img, 1)
newName = 'pic' + str(imageNum) + '.jpg'
cv2.imwrite(newName,yAxis)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
#Fix imageNum
picNum = imageNum
SATURATION = 0.5
CONTRAST = 0.5
BRIGHTNESS = 0.5
SHARPNESS = 2.0
#Sättigung ändern
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
img = PIL.Image.open(name)
saturation_converter = ImageEnhance.Color(img)
saturation_img = saturation_converter.enhance(SATURATION)
newName = 'pic' + str(imageNum) + '.jpg'
saturation_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
count = picNum
#Ändern Sie den Kontrast
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
img = PIL.Image.open(name)
contrast_converter = ImageEnhance.Contrast(img)
contrast_img = contrast_converter.enhance(CONTRAST)
newName = 'pic' + str(imageNum) + '.jpg'
contrast_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
count = picNum
#Ändern Sie die Helligkeit
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
img = PIL.Image.open(name)
brightness_converter = ImageEnhance.Brightness(img)
brightness_img = brightness_converter.enhance(BRIGHTNESS)
newName = 'pic' + str(imageNum) + '.jpg'
brightness_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
count = picNum
#Schärfe ändern
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
img = PIL.Image.open(name)
sharpness_converter = ImageEnhance.Sharpness(img)
sharpness_img = sharpness_converter.enhance(SHARPNESS)
newName = 'pic' + str(imageNum) + '.jpg'
sharpness_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
#Fix imageNum
picNum = imageNum
#15 Grad Drehung
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
#Bild wird geladen
img = cv2.imread(name)
h, w = img.shape[:2]
size = (w, h)
#Drehwinkel festlegen
angle = 15
angle_rad = angle/180.0*np.pi
#Berechnen Sie die Bildgröße nach der Drehung
w_rot = int(np.round(h*np.absolute(np.sin(angle_rad))+w*np.absolute(np.cos(angle_rad))))
h_rot = int(np.round(h*np.absolute(np.cos(angle_rad))+w*np.absolute(np.sin(angle_rad))))
size_rot = (w_rot, h_rot)
#Drehen Sie um die Mitte des Originalbilds
center = (w/2, h/2)
scale = 1.0
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
#Parallele Bewegung hinzufügen(rotation + translation)
affine_matrix = rotation_matrix.copy()
affine_matrix[0][2] = affine_matrix[0][2] -w/2 + w_rot/2
affine_matrix[1][2] = affine_matrix[1][2] -h/2 + h_rot/2
img_rot = cv2.warpAffine(img, affine_matrix, size_rot, flags=cv2.INTER_CUBIC)
cv2.imwrite(newName, img_rot)
newName = 'pic' + str(imageNum) + '.jpg'
saturation_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
#Anzahl der Fotos
imageNum = count
#-15 Grad Drehung
for num in range(1, count+1):
name = 'pic' + str(num) + '.jpg'
if os.path.exists(name) :
pass
else :
print('NO')
continue
if os.path.getsize(name) == 0:
os.remove(name)
continue
#Bild wird geladen
img = cv2.imread(name)
h, w = img.shape[:2]
size = (w, h)
#Drehwinkel festlegen
angle = -15
angle_rad = angle/180.0*np.pi
#Berechnen Sie die Bildgröße nach der Drehung
w_rot = int(np.round(h*np.absolute(np.sin(angle_rad))+w*np.absolute(np.cos(angle_rad))))
h_rot = int(np.round(h*np.absolute(np.cos(angle_rad))+w*np.absolute(np.sin(angle_rad))))
size_rot = (w_rot, h_rot)
#Drehen Sie um die Mitte des Originalbilds
center = (w/2, h/2)
scale = 1.0
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
#Parallele Bewegung hinzufügen(rotation + translation)
affine_matrix = rotation_matrix.copy()
affine_matrix[0][2] = affine_matrix[0][2] -w/2 + w_rot/2
affine_matrix[1][2] = affine_matrix[1][2] -h/2 + h_rot/2
img_rot = cv2.warpAffine(img, affine_matrix, size_rot, flags=cv2.INTER_CUBIC)
cv2.imwrite(newName, img_rot)
newName = 'pic' + str(imageNum) + '.jpg'
saturation_img.save(newName)
imageNum = imageNum + 1
print('OK')
print('NEXT STAGE')
#Zählen Sie die Anzahl der Fotos
dir = os.getcwd()
files = os.listdir(dir)
count = 0
for file in files:
count = count + 1
print(count)
print('OK')
print('COMPLETE')
#------------------------------------------------------
#Erstellung von Textdateien
#cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#os.chdir('pic')
for num in glob.glob('*.jpg'):
img = cv2.imread(num)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray)
for (x,y,w,h) in faces:
text = 'pic/' + num + ' 1 ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + '\n'
f.write(text)
cmd = 'opencv_createsamples -info pos.txt -vec pos.vec -num ' + str(count)
print(cmd)
cmd = 'opencv_traincascade -data ./cascade -vec pos.vec -bg neg.txt -numPos 1500 numNeg 255'
print(cmd)
print('COMPLETE.')
face_id.py
# coding: utf-8
import cv2
font = cv2.FONT_HERSHEY_SIMPLEX
if __name__ == "__main__":
cap = cv2.VideoCapture(0)
cascade_path_human = 'haarcascade_frontalface_default.xml'
cascade_path_hirosugu = "cascade_hirosugu.xml"
cascade_path_kenta = 'cascade_kenta.xml'
cascade_hirosugu = cv2.CascadeClassifier(cascade_path_hirosugu)
cascade_human = cv2.CascadeClassifier(cascade_path_human)
cascade_kenta = cv2.CascadeClassifier(cascade_path_kenta)
color = (255,0,0)
while True:
ret, frame = cap.read()
facerect_human = cascade_human.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100))
facerect_hirosugu = cascade_hirosugu.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100))
facerect_kenta = cascade_kenta.detectMultiScale(frame, scaleFactor=1.7, minNeighbors=4, minSize=(100,100))
if len(facerect_human) > 0:
for rect in facerect_human:
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (255,255,255), thickness=2)
if len(facerect_hirosugu) > 0:
for rect in facerect_hirosugu:
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), color, thickness=2)
cv2.putText(frame, 'Hirosugu Takeshita', tuple(rect[0:2]), font, 2,(0,0,0),2,cv2.LINE_AA)
if len(facerect_kenta) > 0:
for rect in facerect_kenta:
cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), color, thickness=2)
cv2.putText(frame, 'Kenta Suzuki', tuple(rect[0:2]), font, 2,(0,0,0),2,cv2.LINE_AA)
cv2.imshow("frame", frame)
#Drücken Sie die Taste q, um die Schleife zu beenden
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Übrigens wird empfohlen, die generierte Kaskadendatei (.xml-Lerndatei) in dieselbe Hierarchie wie das Gesichtserkennungsprogramm zu stellen!
Richtig? Ist es nicht einfach Dies ist ein Müllprogramm für Profis! Sie mögen das denken, aber Sie können sich selbst als Ese ML-Ingenieur bezeichnen. Wenn dies zutrifft, wird die Genauigkeit weiter verbessert, wenn Sie die Feature-Extraktion durchführen und die NN selbst schreiben (ich weiß es nicht, weil ich damit nicht so vertraut bin).
Es gibt auch viele Artikel über OpenCV. Bitte lesen Sie auch diesen Artikel. Da dieser Artikel nur eine ziemlich dünne Spur ist, wird empfohlen, dass Sie den detaillierten Mechanismus und andere Befehle während des Lernens gründlich untersuchen.
Nun, diesmal ist es eine individuelle Diskriminierung durch maschinelles Lernen, deshalb habe ich sie gebeten, nur das Wissen zurückzubringen, dass es einfacher wäre, Gesichtsbilder auf diese Weise zu sammeln, und ich werde eine genauere Gesichtserkennung erstellen und sie einführen. Ich wäre dankbar, wenn Sie ... könnten!
Vielen Dank für das Lesen für eine lange Zeit!
Recommended Posts