You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
4.5 KiB
110 lines
4.5 KiB
import os |
|
import pickle |
|
import time |
|
|
|
import cv2 |
|
import face_recognition |
|
|
|
|
|
def build_data(): |
|
""" Build the face_enc file with data to recognize from """ |
|
|
|
knownEncodings = [] |
|
knownNames = [] |
|
|
|
members = os.listdir('../profile_pictures') |
|
|
|
#get paths of each file in folder named Images |
|
#Images here contains my data(folders of various persons) |
|
for member in members: |
|
if '.DS_Store' in member: |
|
continue |
|
imagePaths = [] |
|
for path in os.listdir(f'../profile_pictures/{member}'): |
|
if '.jpg' in path: |
|
imagePaths.append(f'../profile_pictures/{member}/{path}') |
|
|
|
# loop over the image paths |
|
for imagePath in imagePaths: |
|
print(imagePath) |
|
# load the input image and convert it from BGR (OpenCV ordering) |
|
# to dlib ordering (RGB) |
|
image = cv2.imread(imagePath) |
|
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
#Use Face_recognition to locate faces |
|
boxes = face_recognition.face_locations(rgb, number_of_times_to_upsample = 2) #,model='hog' |
|
# compute the facial embedding for the face |
|
encodings = face_recognition.face_encodings(image, boxes) |
|
# loop over the encodings |
|
for encoding in encodings: |
|
knownEncodings.append(encoding) |
|
knownNames.append(member) |
|
#save emcodings along with their names in dictionary data |
|
data = {"encodings": knownEncodings, "names": knownNames} |
|
#use pickle to save data into a file for later use |
|
with open("face_enc", "wb") as f: |
|
f.write(pickle.dumps(data)) |
|
f.close() |
|
|
|
def identify_face(imagePath): |
|
#find path of xml file containing haarcascade file |
|
cascPathface = os.path.dirname( |
|
cv2.__file__) + "/data/haarcascade_frontalface_alt2.xml" |
|
# load the harcaascade in the cascade classifier |
|
faceCascade = cv2.CascadeClassifier(cascPathface) |
|
# load the known faces and embeddings saved in last file |
|
data = pickle.loads(open('face_enc', "rb").read()) |
|
#Find path to the image you want to detect face and pass it here |
|
image = cv2.imread(imagePath) |
|
rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
#convert image to Greyscale for haarcascade |
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
|
faces = faceCascade.detectMultiScale(gray, |
|
scaleFactor=1.1, |
|
minNeighbors=5, |
|
minSize=(60, 60), |
|
flags=cv2.CASCADE_SCALE_IMAGE) |
|
|
|
# the facial embeddings for face in input |
|
encodings = face_recognition.face_encodings(rgb) |
|
names = [] |
|
# loop over the facial embeddings incase |
|
# we have multiple embeddings for multiple fcaes |
|
for encoding in encodings: |
|
#Compare encodings with encodings in data["encodings"] |
|
#Matches contain array with boolean values and True for the embeddings it matches closely |
|
#and False for rest |
|
matches = face_recognition.compare_faces(data["encodings"], |
|
encoding) |
|
#set name =unknown if no encoding matches |
|
name = "Unknown" |
|
# check to see if we have found a match |
|
if True in matches: |
|
#Find positions at which we get True and store them |
|
matchedIdxs = [i for (i, b) in enumerate(matches) if b] |
|
counts = {} |
|
# loop over the matched indexes and maintain a count for |
|
# each recognized face face |
|
for i in matchedIdxs: |
|
#Check the names at respective indexes we stored in matchedIdxs |
|
name = data["names"][i] |
|
#increase count for the name we got |
|
counts[name] = counts.get(name, 0) + 1 |
|
#set name which has highest count |
|
name = max(counts, key=counts.get) |
|
print(counts) |
|
|
|
# update the list of names |
|
names.append(name) |
|
# loop over the recognized faces |
|
for ((x, y, w, h), name) in zip(faces, names): |
|
# rescale the face coordinates |
|
# draw the predicted face name on the image |
|
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) |
|
cv2.putText(image, name, (x, y), cv2.FONT_HERSHEY_SIMPLEX, |
|
0.75, (0, 255, 0), 2) |
|
cv2.imshow("Frame", image) |
|
cv2.waitKey(0) |
|
|
|
|
|
identify_face('/Users/Lasse/Datorgemensamt/Programmeringsprojekt/Facebook/fb-scraper/profile_pictures/millington.jiang/4138068259557849.jpg') |