Upload files to 'Attendence'
This commit is contained in:
@@ -0,0 +1,559 @@
|
|||||||
|
from flask import Flask, render_template, request, redirect, Response, send_file
|
||||||
|
import multiprocessing
|
||||||
|
import face_recognition
|
||||||
|
#from numba import jit
|
||||||
|
import numpy as np
|
||||||
|
import os
|
||||||
|
#from flask_cors import CORS
|
||||||
|
app = Flask(__name__)
|
||||||
|
#CORS(app)
|
||||||
|
lst = []
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/', methods=['GET'])
|
||||||
|
def resume():
|
||||||
|
#return render_template('index.html')
|
||||||
|
return 'Attendence app running'
|
||||||
|
|
||||||
|
def createEncodings(image):
|
||||||
|
print("Encoding")
|
||||||
|
"""
|
||||||
|
Create face encodings for a given image and also return face locations in the given image.
|
||||||
|
Parameters
|
||||||
|
-------
|
||||||
|
image : cv2 mat
|
||||||
|
Image you want to detect faces from.
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
known_encodings : list of np array
|
||||||
|
List of face encodings in a given image
|
||||||
|
face_locations : list of tuples
|
||||||
|
list of tuples for face locations in a given image
|
||||||
|
"""
|
||||||
|
# Find face locations for all faces in an image
|
||||||
|
face_locations = face_recognition.face_locations(image)
|
||||||
|
# Create encodings for all faces in an image
|
||||||
|
known_encodings = face_recognition.face_encodings(image, known_face_locations=face_locations)
|
||||||
|
return known_encodings, face_locations
|
||||||
|
#@app.route('/register', methods=["POST","GET"])
|
||||||
|
def registered(url_list):
|
||||||
|
input=url_list
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("ppeople").mkdir(exist_ok=True)
|
||||||
|
Path("ppeople/" + input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
#z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y+ '.'+ z
|
||||||
|
print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
try:
|
||||||
|
img_data = x.encode()
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
with open("ppeople/" + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
|
||||||
|
img = "ppeople/" + y + "/" + name
|
||||||
|
saveLocation = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
# import cv2
|
||||||
|
# import numpy as np
|
||||||
|
# import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# # Connects to your computer's default camera
|
||||||
|
# cap = cv2.imread(img)
|
||||||
|
|
||||||
|
# # Detect the coordinates
|
||||||
|
# detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
# number_of_faces=[]
|
||||||
|
# # Capture frames continuously
|
||||||
|
# # while True:
|
||||||
|
|
||||||
|
# # Capture frame-by-frame
|
||||||
|
# # ret, frame = cap
|
||||||
|
# frame = cap
|
||||||
|
|
||||||
|
# # RGB to grayscale
|
||||||
|
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
# faces = detector(gray)
|
||||||
|
|
||||||
|
# # Iterator to count faces
|
||||||
|
# i = 0
|
||||||
|
# for face in faces:
|
||||||
|
|
||||||
|
# # Get the coordinates of faces
|
||||||
|
# x, y = face.left(), face.top()
|
||||||
|
# x1, y1 = face.right(), face.bottom()
|
||||||
|
# cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# # Increment iterator for each face in faces
|
||||||
|
# i = i+1
|
||||||
|
|
||||||
|
# # Display the box and faces
|
||||||
|
# cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
# cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# # if len(i)>1:
|
||||||
|
# # print(i)
|
||||||
|
# number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
# if (len(number_of_faces))>1:
|
||||||
|
# print("Group Photo")
|
||||||
|
# return "Group Photo"
|
||||||
|
# elif (len(number_of_faces))==1:
|
||||||
|
# print("Single Photo")
|
||||||
|
# pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def saveEncodings(encs, names, fname='encodings.pickle'):
|
||||||
|
"""
|
||||||
|
Save encodings in a pickle file to be used in future.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
encs : List of np arrays
|
||||||
|
List of face encodings.
|
||||||
|
names : List of strings
|
||||||
|
List of names for each face encoding.
|
||||||
|
fname : String, optional
|
||||||
|
Name/Location for pickle file. The default is "encodings.pickle".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = []
|
||||||
|
d = [{"name": nm, "encoding": enc} for (nm, enc) in zip(names, encs)]
|
||||||
|
data.extend(d)
|
||||||
|
|
||||||
|
encodingsFile = fname
|
||||||
|
|
||||||
|
# dump the facial encodings data to disk
|
||||||
|
print("[INFO] serializing encodings...")
|
||||||
|
print("[INFO] Encodings Created sucessfully")
|
||||||
|
f = open(encodingsFile, "wb")
|
||||||
|
f.write(pickle.dumps(data))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# Function to create encodings and get face locations
|
||||||
|
|
||||||
|
|
||||||
|
def processKnownPeopleImages(img=img, saveLocation=saveLocation):
|
||||||
|
"""
|
||||||
|
Process images of known people and create face encodings to compare in future.
|
||||||
|
Eaach image should have just 1 face in it.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "C:/inetpub/vhosts/port82/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
"""
|
||||||
|
known_encodings = []
|
||||||
|
known_names = []
|
||||||
|
# for img in os.listdir(path):
|
||||||
|
|
||||||
|
imgPath = img
|
||||||
|
# Read image
|
||||||
|
image = cv2.imread(imgPath)
|
||||||
|
name = img.rsplit('.')[0]
|
||||||
|
# Resize
|
||||||
|
try:
|
||||||
|
print(image.shape)
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
try:
|
||||||
|
known_encodings.append(encs[0])
|
||||||
|
except IndexError:
|
||||||
|
os.remove(saveLocation)
|
||||||
|
print('------------------------------------- save location --------------------------------')
|
||||||
|
print(saveLocation)
|
||||||
|
return "hello world!"
|
||||||
|
|
||||||
|
|
||||||
|
# known_encodings.append(encs[0])
|
||||||
|
known_names.append(name)
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
# Show Image
|
||||||
|
# cv2.rectangle(image, (left, top), (right, bottom), color=(255, 0, 0), thickness=2)
|
||||||
|
# cv2.imshow("Image", image)
|
||||||
|
# cv2.waitKey(1)
|
||||||
|
# cv2.destroyAllWindows()
|
||||||
|
saveEncodings(known_encodings, known_names, saveLocation)
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
#import face_recognition
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
processKnownPeopleImages(img, saveLocation)
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
# ******************************** COMPARUISION *********************************************************
|
||||||
|
#@app.route('/submit', methods=["POST","GET"])
|
||||||
|
def submit(url_list):
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
import pytz
|
||||||
|
tz_NY = pytz.timezone('Asia/Kolkata')
|
||||||
|
datetime_NY = datetime.now(tz_NY)
|
||||||
|
India_Date = (datetime_NY.strftime("%Y-%m-%d"))
|
||||||
|
India_Date = str(India_Date)
|
||||||
|
# India_Time = (datetime_NY.strftime("%I:%M:%S %p"))
|
||||||
|
# India_Time = str(India_Time)
|
||||||
|
input=url_list
|
||||||
|
import pickle
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("GGallery/"+ India_Date).mkdir(exist_ok=True)
|
||||||
|
Path("GGallery/"+ India_Date +'/'+ input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
# z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y + '.' + z
|
||||||
|
# print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
img_data = x.encode()
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
|
||||||
|
with open("GGallery/"+India_Date+'/' + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
|
||||||
|
path = "GGallery/" +India_Date+'/'+ y + "/" + name
|
||||||
|
pickle_location = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
import pathlib
|
||||||
|
file = pathlib.Path(pickle_location)
|
||||||
|
if file.exists ():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print ("pickle File not exist")
|
||||||
|
print(name)
|
||||||
|
return "Face not found in profile (please change your profile)"
|
||||||
|
|
||||||
|
check_faces="ppeople/" + y + "/" + y + ".jpg"
|
||||||
|
print(check_faces)
|
||||||
|
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# Connects to your computer's default camera
|
||||||
|
cap = cv2.imread(check_faces)
|
||||||
|
|
||||||
|
# Detect the coordinates
|
||||||
|
detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
number_of_faces=[]
|
||||||
|
# Capture frames continuously
|
||||||
|
# while True:
|
||||||
|
|
||||||
|
# Capture frame-by-frame
|
||||||
|
# ret, frame = cap
|
||||||
|
frame = cap
|
||||||
|
|
||||||
|
# RGB to grayscale
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
faces = detector(gray)
|
||||||
|
|
||||||
|
# Iterator to count faces
|
||||||
|
i = 0
|
||||||
|
for face in faces:
|
||||||
|
|
||||||
|
# Get the coordinates of faces
|
||||||
|
x, y = face.left(), face.top()
|
||||||
|
x1, y1 = face.right(), face.bottom()
|
||||||
|
cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# Increment iterator for each face in faces
|
||||||
|
i = i+1
|
||||||
|
|
||||||
|
# Display the box and faces
|
||||||
|
cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# if len(i)>1:
|
||||||
|
# print(i)
|
||||||
|
number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
if (len(number_of_faces))>1:
|
||||||
|
print("Group Photo")
|
||||||
|
return "Group Photo"
|
||||||
|
elif (len(number_of_faces))==1:
|
||||||
|
print("Single Photo")
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def readEncodingsPickle(fname):
|
||||||
|
"""
|
||||||
|
Read Pickle file.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fname : String
|
||||||
|
Name of pickle file.(Full location)
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
encodings : list of np arrays
|
||||||
|
list of all saved encodings
|
||||||
|
names : List of Strings
|
||||||
|
List of all saved names
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
data = pickle.loads(open(fname, "rb").read())
|
||||||
|
|
||||||
|
|
||||||
|
data = np.array(data)
|
||||||
|
encodings = [d["encoding"] for d in data]
|
||||||
|
names = [d["name"] for d in data]
|
||||||
|
return encodings, names
|
||||||
|
|
||||||
|
|
||||||
|
def compareFaceEncodings(unknown_encoding, known_encodings, known_names):
|
||||||
|
"""
|
||||||
|
Compares face encodings to check if 2 faces are same or not.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
unknown_encoding : np array
|
||||||
|
Face encoding of unknown people.
|
||||||
|
known_encodings : np array
|
||||||
|
Face encodings of known people.
|
||||||
|
known_names : list of strings
|
||||||
|
Names of known people
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
acceptBool : Bool
|
||||||
|
face matched or not
|
||||||
|
duplicateName : String
|
||||||
|
Name of matched face
|
||||||
|
distance : Float
|
||||||
|
Distance between 2 faces
|
||||||
|
|
||||||
|
"""
|
||||||
|
duplicateName = ""
|
||||||
|
distance = 0.0
|
||||||
|
matches = face_recognition.compare_faces(known_encodings, unknown_encoding, tolerance=0.54)
|
||||||
|
face_distances = face_recognition.face_distance(known_encodings, unknown_encoding)
|
||||||
|
|
||||||
|
best_match_index = np.argmin(face_distances)
|
||||||
|
|
||||||
|
distance = face_distances[best_match_index]
|
||||||
|
if matches[best_match_index]:
|
||||||
|
acceptBool = True
|
||||||
|
duplicateName = known_names[best_match_index]
|
||||||
|
else:
|
||||||
|
acceptBool = False
|
||||||
|
duplicateName = ""
|
||||||
|
return acceptBool, duplicateName, distance
|
||||||
|
|
||||||
|
#p = []
|
||||||
|
|
||||||
|
|
||||||
|
def processDatasetImages(path=path, pickle_location=pickle_location):
|
||||||
|
"""
|
||||||
|
Process image in dataset from where you want to separate images.
|
||||||
|
It separates the images into directories of known people, groups and any unknown people images.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "D:/port1004/port1004/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Read pickle file for known people to compare faces from
|
||||||
|
|
||||||
|
people_encodings, names = readEncodingsPickle(pickle_location)
|
||||||
|
# print(p)
|
||||||
|
# imgPath = path + img
|
||||||
|
|
||||||
|
# Read image
|
||||||
|
# path=r"C:\Users\katku\Pictures\final\100011460000611.jpg"
|
||||||
|
image = cv2.imread(path)
|
||||||
|
#orig = image.copy()
|
||||||
|
|
||||||
|
# Resize
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
|
||||||
|
# Save image to a group image folder if more than one face is in image
|
||||||
|
# if len(locs) > 1:
|
||||||
|
# saveImageToDirectory(orig, "Group", img)
|
||||||
|
|
||||||
|
# Processing image for each face
|
||||||
|
i = 0
|
||||||
|
knownFlag = 0
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
unknown_encoding = encs[i]
|
||||||
|
i += 1
|
||||||
|
acceptBool, duplicateName, distance = compareFaceEncodings(unknown_encoding, people_encodings, names)
|
||||||
|
if acceptBool:
|
||||||
|
# saveImageToDirectory(orig, duplicateName,name)
|
||||||
|
knownFlag = 1
|
||||||
|
if knownFlag == 1:
|
||||||
|
print("Match Found")
|
||||||
|
|
||||||
|
|
||||||
|
#print(path)
|
||||||
|
with_extension = path.split("/")[-1]
|
||||||
|
without_extension = with_extension.split(".")[0]
|
||||||
|
|
||||||
|
# output_s = {"FileID": without_extension,
|
||||||
|
# "Date": India_Date,
|
||||||
|
# "Time": India_Time}
|
||||||
|
# output_json = json.dumps(output_s)
|
||||||
|
output_json='Matched successfully'
|
||||||
|
print(loc)
|
||||||
|
lst.append(output_json)
|
||||||
|
|
||||||
|
print(output_json)
|
||||||
|
# exit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
print('Not Matched')
|
||||||
|
pass
|
||||||
|
# saveImageToDirectory(orig, "0",name)
|
||||||
|
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import json
|
||||||
|
|
||||||
|
processDatasetImages(path, pickle_location)
|
||||||
|
return lst[0]
|
||||||
|
#return 'matched successfully'
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/detect', methods=["POST"])
|
||||||
|
def detect():
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
# multiprocessing
|
||||||
|
pool_size = multiprocessing.cpu_count() * 2
|
||||||
|
with multiprocessing.Pool(pool_size) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(submit, url_list)
|
||||||
|
except FileNotFoundError:
|
||||||
|
return 'plese get registered with your PhotoID'
|
||||||
|
except IndexError:
|
||||||
|
#return 'unable to recognize face'
|
||||||
|
return 'failed'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
|
||||||
|
return results[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/register', methods=["POST"])
|
||||||
|
def register():
|
||||||
|
print("hello start..........")
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
UserLocation=Dataset["FilePath"]
|
||||||
|
print(UserLocation)
|
||||||
|
|
||||||
|
# if "cO2" in UserLocation or UserLocation is None:
|
||||||
|
# pass
|
||||||
|
# else:
|
||||||
|
# return "Please update the URL in the integration"
|
||||||
|
|
||||||
|
|
||||||
|
# multiprocessing
|
||||||
|
pool_size = multiprocessing.cpu_count() * 2
|
||||||
|
with multiprocessing.Pool(pool_size) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(registered, url_list)
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
print('face not found')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
#os.remove(img)
|
||||||
|
# return 'unable to recognize face'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
#return results[0]
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host='0.0.0.0',port =5006,debug=False)
|
||||||
@@ -59,7 +59,10 @@ def registered(url_list):
|
|||||||
# filename=image[-1]
|
# filename=image[-1]
|
||||||
|
|
||||||
# print(x)
|
# print(x)
|
||||||
img_data = x.encode()
|
try:
|
||||||
|
img_data = x.encode()
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
|
|
||||||
@@ -388,7 +391,7 @@ def submit(url_list):
|
|||||||
"""
|
"""
|
||||||
duplicateName = ""
|
duplicateName = ""
|
||||||
distance = 0.0
|
distance = 0.0
|
||||||
matches = face_recognition.compare_faces(known_encodings, unknown_encoding, tolerance=0.54)
|
matches = face_recognition.compare_faces(known_encodings, unknown_encoding, tolerance=0.51)
|
||||||
face_distances = face_recognition.face_distance(known_encodings, unknown_encoding)
|
face_distances = face_recognition.face_distance(known_encodings, unknown_encoding)
|
||||||
|
|
||||||
best_match_index = np.argmin(face_distances)
|
best_match_index = np.argmin(face_distances)
|
||||||
@@ -521,6 +524,15 @@ def register():
|
|||||||
Dataset= request.get_json()
|
Dataset= request.get_json()
|
||||||
# id = "100013660000125"
|
# id = "100013660000125"
|
||||||
url_list.append(Dataset)
|
url_list.append(Dataset)
|
||||||
|
UserLocation=Dataset["FilePath"]
|
||||||
|
print(UserLocation)
|
||||||
|
|
||||||
|
# if "cO2" in UserLocation or UserLocation is None:
|
||||||
|
# pass
|
||||||
|
# else:
|
||||||
|
# return "Please update the URL in the integration"
|
||||||
|
|
||||||
|
|
||||||
# multiprocessing
|
# multiprocessing
|
||||||
pool_size = multiprocessing.cpu_count() * 2
|
pool_size = multiprocessing.cpu_count() * 2
|
||||||
with multiprocessing.Pool(pool_size) as pool:
|
with multiprocessing.Pool(pool_size) as pool:
|
||||||
|
|||||||
@@ -0,0 +1,402 @@
|
|||||||
|
absl-py==1.3.0
|
||||||
|
aio-pika==8.2.3
|
||||||
|
aiofiles==23.1.0
|
||||||
|
aiogram==2.25.1
|
||||||
|
aiohttp @ file:///tmp/build/80754af9/aiohttp_1646806365504/work
|
||||||
|
aiormq==6.4.2
|
||||||
|
aiosignal @ file:///tmp/build/80754af9/aiosignal_1637843061372/work
|
||||||
|
alabaster @ file:///home/ktietz/src/ci/alabaster_1611921544520/work
|
||||||
|
anaconda-client @ file:///tmp/build/80754af9/anaconda-client_1635342557008/work
|
||||||
|
anaconda-navigator==2.1.4
|
||||||
|
anaconda-project @ file:///tmp/build/80754af9/anaconda-project_1637161053845/work
|
||||||
|
anyio @ file:///tmp/build/80754af9/anyio_1644463572971/work/dist
|
||||||
|
appdirs==1.4.4
|
||||||
|
APScheduler==3.9.1.post1
|
||||||
|
argon2-cffi @ file:///opt/conda/conda-bld/argon2-cffi_1645000214183/work
|
||||||
|
argon2-cffi-bindings @ file:///tmp/build/80754af9/argon2-cffi-bindings_1644569679365/work
|
||||||
|
arrow @ file:///opt/conda/conda-bld/arrow_1649166651673/work
|
||||||
|
astroid @ file:///tmp/build/80754af9/astroid_1628063140030/work
|
||||||
|
astropy @ file:///opt/conda/conda-bld/astropy_1650891077797/work
|
||||||
|
asttokens @ file:///opt/conda/conda-bld/asttokens_1646925590279/work
|
||||||
|
astunparse==1.6.3
|
||||||
|
async-timeout==4.0.2
|
||||||
|
atomicwrites==1.4.0
|
||||||
|
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
|
||||||
|
Automat @ file:///tmp/build/80754af9/automat_1600298431173/work
|
||||||
|
autopep8 @ file:///opt/conda/conda-bld/autopep8_1639166893812/work
|
||||||
|
Babel @ file:///tmp/build/80754af9/babel_1620871417480/work
|
||||||
|
backcall @ file:///home/ktietz/src/ci/backcall_1611930011877/work
|
||||||
|
backports.functools-lru-cache @ file:///tmp/build/80754af9/backports.functools_lru_cache_1618170165463/work
|
||||||
|
backports.tempfile @ file:///home/linux1/recipes/ci/backports.tempfile_1610991236607/work
|
||||||
|
backports.weakref==1.0.post1
|
||||||
|
bcrypt @ file:///tmp/build/80754af9/bcrypt_1607022650461/work
|
||||||
|
beautifulsoup4 @ file:///opt/conda/conda-bld/beautifulsoup4_1650462163268/work
|
||||||
|
bidict==0.22.1
|
||||||
|
binaryornot @ file:///tmp/build/80754af9/binaryornot_1617751525010/work
|
||||||
|
bitarray @ file:///tmp/build/80754af9/bitarray_1648739490228/work
|
||||||
|
bkcharts==0.2
|
||||||
|
black==19.10b0
|
||||||
|
bleach @ file:///opt/conda/conda-bld/bleach_1641577558959/work
|
||||||
|
bokeh @ file:///tmp/build/80754af9/bokeh_1638362822154/work
|
||||||
|
boto3 @ file:///opt/conda/conda-bld/boto3_1649078879353/work
|
||||||
|
botocore @ file:///opt/conda/conda-bld/botocore_1649076662316/work
|
||||||
|
Bottleneck @ file:///tmp/build/80754af9/bottleneck_1648028898966/work
|
||||||
|
brotlipy==0.7.0
|
||||||
|
CacheControl==0.12.11
|
||||||
|
cachetools @ file:///tmp/build/80754af9/cachetools_1619597386817/work
|
||||||
|
certifi==2021.10.8
|
||||||
|
cffi @ file:///opt/conda/conda-bld/cffi_1642701102775/work
|
||||||
|
chardet @ file:///tmp/build/80754af9/chardet_1607706775000/work
|
||||||
|
charset-normalizer @ file:///tmp/build/80754af9/charset-normalizer_1630003229654/work
|
||||||
|
click @ file:///tmp/build/80754af9/click_1646056590078/work
|
||||||
|
cloudpickle @ file:///tmp/build/80754af9/cloudpickle_1632508026186/work
|
||||||
|
clyent==1.2.2
|
||||||
|
colorama @ file:///tmp/build/80754af9/colorama_1607707115595/work
|
||||||
|
colorcet @ file:///tmp/build/80754af9/colorcet_1611168489822/work
|
||||||
|
colorclass==2.2.2
|
||||||
|
coloredlogs==15.0.1
|
||||||
|
colorhash==1.2.1
|
||||||
|
conda==4.12.0
|
||||||
|
conda-build==3.21.8
|
||||||
|
conda-content-trust @ file:///tmp/build/80754af9/conda-content-trust_1617045594566/work
|
||||||
|
conda-pack @ file:///tmp/build/80754af9/conda-pack_1611163042455/work
|
||||||
|
conda-package-handling @ file:///tmp/build/80754af9/conda-package-handling_1649105784853/work
|
||||||
|
conda-repo-cli @ file:///tmp/build/80754af9/conda-repo-cli_1620168426516/work
|
||||||
|
conda-token @ file:///tmp/build/80754af9/conda-token_1620076980546/work
|
||||||
|
conda-verify==3.4.2
|
||||||
|
confluent-kafka==1.9.2
|
||||||
|
constantly==15.1.0
|
||||||
|
cookiecutter @ file:///opt/conda/conda-bld/cookiecutter_1649151442564/work
|
||||||
|
cryptography @ file:///tmp/build/80754af9/cryptography_1633520369886/work
|
||||||
|
cssselect==1.1.0
|
||||||
|
cycler @ file:///tmp/build/80754af9/cycler_1637851556182/work
|
||||||
|
Cython @ file:///tmp/build/80754af9/cython_1647850345254/work
|
||||||
|
cytoolz==0.11.0
|
||||||
|
daal4py==2021.5.0
|
||||||
|
dask==2022.10.2
|
||||||
|
datashader @ file:///tmp/build/80754af9/datashader_1623782308369/work
|
||||||
|
datashape==0.5.4
|
||||||
|
debugpy @ file:///tmp/build/80754af9/debugpy_1637091799509/work
|
||||||
|
decorator @ file:///opt/conda/conda-bld/decorator_1643638310831/work
|
||||||
|
defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
|
||||||
|
diff-match-patch @ file:///Users/ktietz/demo/mc3/conda-bld/diff-match-patch_1630511840874/work
|
||||||
|
distributed @ file:///opt/conda/conda-bld/distributed_1647271944416/work
|
||||||
|
dlib==19.24.0
|
||||||
|
dnspython==1.16.0
|
||||||
|
docopt==0.6.2
|
||||||
|
docutils @ file:///tmp/build/80754af9/docutils_1620827980776/work
|
||||||
|
entrypoints @ file:///tmp/build/80754af9/entrypoints_1649926439650/work
|
||||||
|
et-xmlfile==1.1.0
|
||||||
|
executing @ file:///opt/conda/conda-bld/executing_1646925071911/work
|
||||||
|
face-recognition==1.3.0
|
||||||
|
face-recognition-models==0.3.0
|
||||||
|
fastjsonschema @ file:///tmp/build/80754af9/python-fastjsonschema_1620414857593/work/dist
|
||||||
|
fbmessenger==6.0.0
|
||||||
|
filelock @ file:///opt/conda/conda-bld/filelock_1647002191454/work
|
||||||
|
fire==0.5.0
|
||||||
|
flake8 @ file:///tmp/build/80754af9/flake8_1620776156532/work
|
||||||
|
Flask @ file:///home/ktietz/src/ci/flask_1611932660458/work
|
||||||
|
flatbuffers==23.3.3
|
||||||
|
fonttools==4.25.0
|
||||||
|
frozenlist @ file:///tmp/build/80754af9/frozenlist_1637767113340/work
|
||||||
|
fsspec @ file:///opt/conda/conda-bld/fsspec_1647268051896/work
|
||||||
|
future @ file:///tmp/build/80754af9/future_1607571303524/work
|
||||||
|
gast==0.4.0
|
||||||
|
gensim @ file:///tmp/build/80754af9/gensim_1646806807927/work
|
||||||
|
glob2 @ file:///home/linux1/recipes/ci/glob2_1610991677669/work
|
||||||
|
gmpy2 @ file:///tmp/build/80754af9/gmpy2_1645438755360/work
|
||||||
|
google-api-core @ file:///C:/ci/google-api-core-split_1613980333946/work
|
||||||
|
google-auth @ file:///tmp/build/80754af9/google-auth_1626320605116/work
|
||||||
|
google-auth-oauthlib==0.4.6
|
||||||
|
google-cloud-core @ file:///tmp/build/80754af9/google-cloud-core_1625077425256/work
|
||||||
|
google-cloud-storage @ file:///tmp/build/80754af9/google-cloud-storage_1601307969662/work
|
||||||
|
google-crc32c @ file:///tmp/build/80754af9/google-crc32c_1612242928148/work
|
||||||
|
google-pasta==0.2.0
|
||||||
|
google-resumable-media @ file:///tmp/build/80754af9/google-resumable-media_1624367812531/work
|
||||||
|
googleapis-common-protos @ file:///tmp/build/80754af9/googleapis-common-protos-feedstock_1617957652138/work
|
||||||
|
greenlet @ file:///tmp/build/80754af9/greenlet_1628888132713/work
|
||||||
|
grpcio @ file:///tmp/build/80754af9/grpcio_1637590821884/work
|
||||||
|
h5py @ file:///tmp/build/80754af9/h5py_1637138488546/work
|
||||||
|
HeapDict @ file:///Users/ktietz/demo/mc3/conda-bld/heapdict_1630598515714/work
|
||||||
|
holoviews @ file:///opt/conda/conda-bld/holoviews_1645454331194/work
|
||||||
|
httptools==0.5.0
|
||||||
|
humanfriendly==10.0
|
||||||
|
hvplot @ file:///tmp/build/80754af9/hvplot_1627305124151/work
|
||||||
|
hyperlink @ file:///tmp/build/80754af9/hyperlink_1610130746837/work
|
||||||
|
idna @ file:///tmp/build/80754af9/idna_1637925883363/work
|
||||||
|
imagecodecs @ file:///tmp/build/80754af9/imagecodecs_1635529108216/work
|
||||||
|
imageio @ file:///tmp/build/80754af9/imageio_1617700267927/work
|
||||||
|
imagesize @ file:///tmp/build/80754af9/imagesize_1637939814114/work
|
||||||
|
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648544546694/work
|
||||||
|
incremental @ file:///tmp/build/80754af9/incremental_1636629750599/work
|
||||||
|
inflection==0.5.1
|
||||||
|
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
|
||||||
|
intake @ file:///opt/conda/conda-bld/intake_1647436631684/work
|
||||||
|
intervaltree @ file:///Users/ktietz/demo/mc3/conda-bld/intervaltree_1630511889664/work
|
||||||
|
ipykernel @ file:///tmp/build/80754af9/ipykernel_1647000773790/work/dist/ipykernel-6.9.1-py3-none-any.whl
|
||||||
|
ipython @ file:///tmp/build/80754af9/ipython_1648817057602/work
|
||||||
|
ipython-genutils @ file:///tmp/build/80754af9/ipython_genutils_1606773439826/work
|
||||||
|
ipywidgets @ file:///tmp/build/80754af9/ipywidgets_1634143127070/work
|
||||||
|
isort @ file:///tmp/build/80754af9/isort_1628603791788/work
|
||||||
|
itemadapter @ file:///tmp/build/80754af9/itemadapter_1626442940632/work
|
||||||
|
itemloaders @ file:///opt/conda/conda-bld/itemloaders_1646805235997/work
|
||||||
|
itsdangerous @ file:///tmp/build/80754af9/itsdangerous_1621432558163/work
|
||||||
|
jdcal @ file:///Users/ktietz/demo/mc3/conda-bld/jdcal_1630584345063/work
|
||||||
|
jedi @ file:///tmp/build/80754af9/jedi_1644297102865/work
|
||||||
|
jeepney @ file:///tmp/build/80754af9/jeepney_1627537048313/work
|
||||||
|
Jinja2 @ file:///tmp/build/80754af9/jinja2_1612213139570/work
|
||||||
|
jinja2-time @ file:///opt/conda/conda-bld/jinja2-time_1649251842261/work
|
||||||
|
jmespath @ file:///Users/ktietz/demo/mc3/conda-bld/jmespath_1630583964805/work
|
||||||
|
joblib @ file:///tmp/build/80754af9/joblib_1635411271373/work
|
||||||
|
json5 @ file:///tmp/build/80754af9/json5_1624432770122/work
|
||||||
|
jsonpickle==3.0.1
|
||||||
|
jsonschema @ file:///tmp/build/80754af9/jsonschema_1650025953207/work
|
||||||
|
jupyter @ file:///tmp/build/80754af9/jupyter_1607700846274/work
|
||||||
|
jupyter-client @ file:///tmp/build/80754af9/jupyter_client_1616770841739/work
|
||||||
|
jupyter-console @ file:///tmp/build/80754af9/jupyter_console_1616615302928/work
|
||||||
|
jupyter-core @ file:///tmp/build/80754af9/jupyter_core_1646976314572/work
|
||||||
|
jupyter-server @ file:///opt/conda/conda-bld/jupyter_server_1644494914632/work
|
||||||
|
jupyterlab @ file:///opt/conda/conda-bld/jupyterlab_1647445413472/work
|
||||||
|
jupyterlab-pygments @ file:///tmp/build/80754af9/jupyterlab_pygments_1601490720602/work
|
||||||
|
jupyterlab-server @ file:///opt/conda/conda-bld/jupyterlab_server_1644500396812/work
|
||||||
|
jupyterlab-widgets @ file:///tmp/build/80754af9/jupyterlab_widgets_1609884341231/work
|
||||||
|
keras==2.11.0
|
||||||
|
keyring @ file:///tmp/build/80754af9/keyring_1638531355686/work
|
||||||
|
kiwisolver @ file:///opt/conda/conda-bld/kiwisolver_1638569886207/work
|
||||||
|
lazy-object-proxy @ file:///tmp/build/80754af9/lazy-object-proxy_1616529027849/work
|
||||||
|
libarchive-c @ file:///tmp/build/80754af9/python-libarchive-c_1617780486945/work
|
||||||
|
libclang==16.0.0
|
||||||
|
llvmlite==0.38.0
|
||||||
|
locket @ file:///tmp/build/80754af9/locket_1647006009810/work
|
||||||
|
lxml @ file:///tmp/build/80754af9/lxml_1646624513062/work
|
||||||
|
magic-filter==1.0.9
|
||||||
|
Markdown @ file:///tmp/build/80754af9/markdown_1614363852612/work
|
||||||
|
MarkupSafe @ file:///tmp/build/80754af9/markupsafe_1621523467000/work
|
||||||
|
matplotlib @ file:///tmp/build/80754af9/matplotlib-suite_1647441664166/work
|
||||||
|
matplotlib-inline @ file:///tmp/build/80754af9/matplotlib-inline_1628242447089/work
|
||||||
|
mattermostwrapper==2.2
|
||||||
|
mccabe==0.6.1
|
||||||
|
mistune @ file:///tmp/build/80754af9/mistune_1607364877025/work
|
||||||
|
mkl-fft==1.3.1
|
||||||
|
mkl-random @ file:///tmp/build/80754af9/mkl_random_1626186066731/work
|
||||||
|
mkl-service==2.4.0
|
||||||
|
mock @ file:///tmp/build/80754af9/mock_1607622725907/work
|
||||||
|
mpmath==1.2.1
|
||||||
|
msgpack @ file:///tmp/build/80754af9/msgpack-python_1612287166301/work
|
||||||
|
multidict @ file:///opt/conda/conda-bld/multidict_1640703752579/work
|
||||||
|
multipledispatch @ file:///tmp/build/80754af9/multipledispatch_1607574243360/work
|
||||||
|
munkres==1.1.4
|
||||||
|
mypy-extensions==0.4.3
|
||||||
|
navigator-updater==0.2.1
|
||||||
|
nbclassic @ file:///opt/conda/conda-bld/nbclassic_1644943264176/work
|
||||||
|
nbclient @ file:///tmp/build/80754af9/nbclient_1650290509967/work
|
||||||
|
nbconvert @ file:///opt/conda/conda-bld/nbconvert_1649751911790/work
|
||||||
|
nbformat @ file:///tmp/build/80754af9/nbformat_1649826788557/work
|
||||||
|
nest-asyncio @ file:///tmp/build/80754af9/nest-asyncio_1649847906199/work
|
||||||
|
networkx==2.6.3
|
||||||
|
nltk @ file:///opt/conda/conda-bld/nltk_1645628263994/work
|
||||||
|
nose @ file:///opt/conda/conda-bld/nose_1642704612149/work
|
||||||
|
notebook @ file:///tmp/build/80754af9/notebook_1645002532094/work
|
||||||
|
numba @ file:///opt/conda/conda-bld/numba_1648040517072/work
|
||||||
|
numexpr @ file:///tmp/build/80754af9/numexpr_1640689833592/work
|
||||||
|
numpy @ file:///tmp/build/80754af9/numpy_and_numpy_base_1649764630438/work
|
||||||
|
numpydoc @ file:///opt/conda/conda-bld/numpydoc_1643788541039/work
|
||||||
|
oauthlib==3.2.2
|
||||||
|
olefile @ file:///Users/ktietz/demo/mc3/conda-bld/olefile_1629805411829/work
|
||||||
|
opencv-python==4.7.0.72
|
||||||
|
openpyxl @ file:///tmp/build/80754af9/openpyxl_1632777717936/work
|
||||||
|
opt-einsum==3.3.0
|
||||||
|
packaging==20.9
|
||||||
|
pamqp==3.2.1
|
||||||
|
pandas==1.4.2
|
||||||
|
pandocfilters @ file:///opt/conda/conda-bld/pandocfilters_1643405455980/work
|
||||||
|
panel @ file:///opt/conda/conda-bld/panel_1650637168846/work
|
||||||
|
param @ file:///tmp/build/80754af9/param_1636647414893/work
|
||||||
|
parsel @ file:///tmp/build/80754af9/parsel_1646722533460/work
|
||||||
|
parso @ file:///opt/conda/conda-bld/parso_1641458642106/work
|
||||||
|
partd @ file:///opt/conda/conda-bld/partd_1647245470509/work
|
||||||
|
pathspec==0.7.0
|
||||||
|
patsy==0.5.2
|
||||||
|
pep8==1.7.1
|
||||||
|
pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
|
||||||
|
pickleshare @ file:///tmp/build/80754af9/pickleshare_1606932040724/work
|
||||||
|
Pillow==9.0.1
|
||||||
|
pkginfo @ file:///tmp/build/80754af9/pkginfo_1643162084911/work
|
||||||
|
plotly @ file:///opt/conda/conda-bld/plotly_1646671701182/work
|
||||||
|
pluggy @ file:///tmp/build/80754af9/pluggy_1648024445381/work
|
||||||
|
poyo @ file:///tmp/build/80754af9/poyo_1617751526755/work
|
||||||
|
prometheus-client @ file:///opt/conda/conda-bld/prometheus_client_1643788673601/work
|
||||||
|
prompt-toolkit @ file:///tmp/build/80754af9/prompt-toolkit_1633440160888/work
|
||||||
|
Protego @ file:///tmp/build/80754af9/protego_1598657180827/work
|
||||||
|
protobuf==3.19.1
|
||||||
|
psutil @ file:///tmp/build/80754af9/psutil_1612297992929/work
|
||||||
|
psycopg2-binary==2.9.6
|
||||||
|
ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
|
||||||
|
pure-eval @ file:///opt/conda/conda-bld/pure_eval_1646925070566/work
|
||||||
|
py @ file:///opt/conda/conda-bld/py_1644396412707/work
|
||||||
|
pyasn1 @ file:///Users/ktietz/demo/mc3/conda-bld/pyasn1_1629708007385/work
|
||||||
|
pyasn1-modules==0.2.8
|
||||||
|
pycodestyle @ file:///tmp/build/80754af9/pycodestyle_1615748559966/work
|
||||||
|
pycosat==0.6.3
|
||||||
|
pycparser @ file:///tmp/build/80754af9/pycparser_1636541352034/work
|
||||||
|
pyct @ file:///tmp/build/80754af9/pyct_1613411549454/work
|
||||||
|
pycurl==7.44.1
|
||||||
|
pydantic==1.10.2
|
||||||
|
PyDispatcher==2.0.5
|
||||||
|
pydocstyle @ file:///tmp/build/80754af9/pydocstyle_1621600989141/work
|
||||||
|
pydot==1.4.2
|
||||||
|
pyerfa @ file:///tmp/build/80754af9/pyerfa_1621556109336/work
|
||||||
|
pyflakes @ file:///tmp/build/80754af9/pyflakes_1617200973297/work
|
||||||
|
Pygments @ file:///opt/conda/conda-bld/pygments_1644249106324/work
|
||||||
|
PyHamcrest @ file:///tmp/build/80754af9/pyhamcrest_1615748656804/work
|
||||||
|
PyJWT @ file:///tmp/build/80754af9/pyjwt_1619682484438/work
|
||||||
|
pykwalify==1.8.0
|
||||||
|
pylint @ file:///tmp/build/80754af9/pylint_1627536788603/work
|
||||||
|
pyls-spyder==0.4.0
|
||||||
|
pymongo==3.10.1
|
||||||
|
pyodbc @ file:///tmp/build/80754af9/pyodbc_1647425888968/work
|
||||||
|
pyOpenSSL @ file:///tmp/build/80754af9/pyopenssl_1635333100036/work
|
||||||
|
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
|
||||||
|
pyrsistent @ file:///tmp/build/80754af9/pyrsistent_1636110951836/work
|
||||||
|
PySocks @ file:///tmp/build/80754af9/pysocks_1605305812635/work
|
||||||
|
pytest==7.1.1
|
||||||
|
python-crfsuite==0.9.9
|
||||||
|
python-dateutil @ file:///tmp/build/80754af9/python-dateutil_1626374649649/work
|
||||||
|
python-engineio==4.4.0
|
||||||
|
python-lsp-black @ file:///tmp/build/80754af9/python-lsp-black_1634232156041/work
|
||||||
|
python-lsp-jsonrpc==1.0.0
|
||||||
|
python-lsp-server==1.2.4
|
||||||
|
python-slugify @ file:///tmp/build/80754af9/python-slugify_1620405669636/work
|
||||||
|
python-snappy @ file:///tmp/build/80754af9/python-snappy_1610133040135/work
|
||||||
|
python-socketio==5.8.0
|
||||||
|
pytz==2021.3
|
||||||
|
pytz-deprecation-shim==0.1.0.post0
|
||||||
|
pyviz-comms @ file:///tmp/build/80754af9/pyviz_comms_1623747165329/work
|
||||||
|
PyWavelets @ file:///tmp/build/80754af9/pywavelets_1648710015787/work
|
||||||
|
pyxdg @ file:///tmp/build/80754af9/pyxdg_1603822279816/work
|
||||||
|
PyYAML==6.0
|
||||||
|
pyzmq @ file:///tmp/build/80754af9/pyzmq_1638434985866/work
|
||||||
|
QDarkStyle @ file:///tmp/build/80754af9/qdarkstyle_1617386714626/work
|
||||||
|
qstylizer @ file:///tmp/build/80754af9/qstylizer_1617713584600/work/dist/qstylizer-0.1.10-py2.py3-none-any.whl
|
||||||
|
QtAwesome @ file:///tmp/build/80754af9/qtawesome_1637160816833/work
|
||||||
|
qtconsole @ file:///opt/conda/conda-bld/qtconsole_1649078897110/work
|
||||||
|
QtPy @ file:///opt/conda/conda-bld/qtpy_1649073884068/work
|
||||||
|
questionary==1.10.0
|
||||||
|
queuelib==1.5.0
|
||||||
|
randomname==0.1.5
|
||||||
|
rasa==3.5.4
|
||||||
|
rasa-sdk==3.5.0
|
||||||
|
redis==4.5.4
|
||||||
|
regex @ file:///tmp/build/80754af9/regex_1648447707500/work
|
||||||
|
requests @ file:///opt/conda/conda-bld/requests_1641824580448/work
|
||||||
|
requests-file @ file:///Users/ktietz/demo/mc3/conda-bld/requests-file_1629455781986/work
|
||||||
|
requests-oauthlib==1.3.1
|
||||||
|
requests-toolbelt==0.10.1
|
||||||
|
rocketchat-API==1.28.1
|
||||||
|
rope @ file:///opt/conda/conda-bld/rope_1643788605236/work
|
||||||
|
rsa @ file:///tmp/build/80754af9/rsa_1614366226499/work
|
||||||
|
Rtree @ file:///tmp/build/80754af9/rtree_1618420843093/work
|
||||||
|
ruamel-yaml-conda @ file:///tmp/build/80754af9/ruamel_yaml_1616016711199/work
|
||||||
|
ruamel.yaml==0.17.21
|
||||||
|
ruamel.yaml.clib==0.2.7
|
||||||
|
s3transfer @ file:///tmp/build/80754af9/s3transfer_1626435152308/work
|
||||||
|
sanic==21.12.2
|
||||||
|
Sanic-Cors==2.0.1
|
||||||
|
sanic-jwt==1.8.0
|
||||||
|
sanic-routing==0.7.2
|
||||||
|
scikit-image @ file:///tmp/build/80754af9/scikit-image_1648214171611/work
|
||||||
|
scikit-learn @ file:///tmp/build/80754af9/scikit-learn_1642617106979/work
|
||||||
|
scikit-learn-intelex==2021.20220215.212715
|
||||||
|
scipy @ file:///tmp/build/80754af9/scipy_1641555004408/work
|
||||||
|
Scrapy @ file:///tmp/build/80754af9/scrapy_1646837771788/work
|
||||||
|
seaborn @ file:///tmp/build/80754af9/seaborn_1629307859561/work
|
||||||
|
SecretStorage @ file:///tmp/build/80754af9/secretstorage_1614022780358/work
|
||||||
|
Send2Trash @ file:///tmp/build/80754af9/send2trash_1632406701022/work
|
||||||
|
sentry-sdk==1.14.0
|
||||||
|
service-identity @ file:///Users/ktietz/demo/mc3/conda-bld/service_identity_1629460757137/work
|
||||||
|
sip==4.19.13
|
||||||
|
six @ file:///tmp/build/80754af9/six_1644875935023/work
|
||||||
|
sklearn-crfsuite==0.3.6
|
||||||
|
slack-sdk==3.21.0
|
||||||
|
smart-open @ file:///tmp/build/80754af9/smart_open_1623928409369/work
|
||||||
|
sniffio @ file:///tmp/build/80754af9/sniffio_1614030464178/work
|
||||||
|
snowballstemmer @ file:///tmp/build/80754af9/snowballstemmer_1637937080595/work
|
||||||
|
sortedcollections @ file:///tmp/build/80754af9/sortedcollections_1611172717284/work
|
||||||
|
sortedcontainers @ file:///tmp/build/80754af9/sortedcontainers_1623949099177/work
|
||||||
|
soupsieve @ file:///tmp/build/80754af9/soupsieve_1636706018808/work
|
||||||
|
Sphinx @ file:///opt/conda/conda-bld/sphinx_1643644169832/work
|
||||||
|
sphinxcontrib-applehelp @ file:///home/ktietz/src/ci/sphinxcontrib-applehelp_1611920841464/work
|
||||||
|
sphinxcontrib-devhelp @ file:///home/ktietz/src/ci/sphinxcontrib-devhelp_1611920923094/work
|
||||||
|
sphinxcontrib-htmlhelp @ file:///tmp/build/80754af9/sphinxcontrib-htmlhelp_1623945626792/work
|
||||||
|
sphinxcontrib-jsmath @ file:///home/ktietz/src/ci/sphinxcontrib-jsmath_1611920942228/work
|
||||||
|
sphinxcontrib-qthelp @ file:///home/ktietz/src/ci/sphinxcontrib-qthelp_1611921055322/work
|
||||||
|
sphinxcontrib-serializinghtml @ file:///tmp/build/80754af9/sphinxcontrib-serializinghtml_1624451540180/work
|
||||||
|
spyder @ file:///tmp/build/80754af9/spyder_1636479868270/work
|
||||||
|
spyder-kernels @ file:///tmp/build/80754af9/spyder-kernels_1634236920897/work
|
||||||
|
SQLAlchemy @ file:///tmp/build/80754af9/sqlalchemy_1647581680159/work
|
||||||
|
stack-data @ file:///opt/conda/conda-bld/stack_data_1646927590127/work
|
||||||
|
statsmodels @ file:///tmp/build/80754af9/statsmodels_1648015433305/work
|
||||||
|
sympy @ file:///tmp/build/80754af9/sympy_1647853653589/work
|
||||||
|
tables @ file:///tmp/build/80754af9/pytables_1607975397488/work
|
||||||
|
tabulate==0.8.9
|
||||||
|
tarsafe==0.0.3
|
||||||
|
TBB==0.2
|
||||||
|
tblib @ file:///Users/ktietz/demo/mc3/conda-bld/tblib_1629402031467/work
|
||||||
|
tenacity @ file:///tmp/build/80754af9/tenacity_1626248292117/work
|
||||||
|
tensorboard==2.11.2
|
||||||
|
tensorboard-data-server==0.6.1
|
||||||
|
tensorboard-plugin-wit==1.8.1
|
||||||
|
tensorflow==2.11.0
|
||||||
|
tensorflow-addons==0.19.0
|
||||||
|
tensorflow-estimator==2.11.0
|
||||||
|
tensorflow-hub==0.12.0
|
||||||
|
tensorflow-io-gcs-filesystem==0.32.0
|
||||||
|
tensorflow-text==2.11.0
|
||||||
|
termcolor==2.2.0
|
||||||
|
terminado @ file:///tmp/build/80754af9/terminado_1644322582718/work
|
||||||
|
terminaltables==3.1.10
|
||||||
|
testpath @ file:///tmp/build/80754af9/testpath_1624638946665/work
|
||||||
|
text-unidecode @ file:///Users/ktietz/demo/mc3/conda-bld/text-unidecode_1629401354553/work
|
||||||
|
textdistance @ file:///tmp/build/80754af9/textdistance_1612461398012/work
|
||||||
|
threadpoolctl @ file:///Users/ktietz/demo/mc3/conda-bld/threadpoolctl_1629802263681/work
|
||||||
|
three-merge @ file:///tmp/build/80754af9/three-merge_1607553261110/work
|
||||||
|
tifffile @ file:///tmp/build/80754af9/tifffile_1627275862826/work
|
||||||
|
tinycss @ file:///tmp/build/80754af9/tinycss_1617713798712/work
|
||||||
|
tldextract @ file:///opt/conda/conda-bld/tldextract_1646638314385/work
|
||||||
|
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
|
||||||
|
tomli @ file:///tmp/build/80754af9/tomli_1637314251069/work
|
||||||
|
toolz @ file:///tmp/build/80754af9/toolz_1636545406491/work
|
||||||
|
tornado @ file:///tmp/build/80754af9/tornado_1606942317143/work
|
||||||
|
tqdm @ file:///opt/conda/conda-bld/tqdm_1650891076910/work
|
||||||
|
traitlets @ file:///tmp/build/80754af9/traitlets_1636710298902/work
|
||||||
|
twilio==7.14.2
|
||||||
|
Twisted @ file:///tmp/build/80754af9/twisted_1646835200521/work
|
||||||
|
typed-ast @ file:///tmp/build/80754af9/typed-ast_1624953673314/work
|
||||||
|
typeguard==3.0.2
|
||||||
|
typing-utils==0.1.0
|
||||||
|
typing_extensions==4.5.0
|
||||||
|
tzdata==2023.3
|
||||||
|
tzlocal==4.3
|
||||||
|
ujson @ file:///tmp/build/80754af9/ujson_1648025916270/work
|
||||||
|
Unidecode @ file:///tmp/build/80754af9/unidecode_1614712377438/work
|
||||||
|
urllib3==1.26.15
|
||||||
|
uvloop==0.17.0
|
||||||
|
w3lib @ file:///Users/ktietz/demo/mc3/conda-bld/w3lib_1629359764703/work
|
||||||
|
watchdog @ file:///tmp/build/80754af9/watchdog_1638367282716/work
|
||||||
|
wcwidth @ file:///Users/ktietz/demo/mc3/conda-bld/wcwidth_1629357192024/work
|
||||||
|
webencodings==0.5.1
|
||||||
|
webexteamssdk==1.6.1
|
||||||
|
websocket-client @ file:///tmp/build/80754af9/websocket-client_1614803975924/work
|
||||||
|
websockets==10.4
|
||||||
|
Werkzeug @ file:///opt/conda/conda-bld/werkzeug_1645628268370/work
|
||||||
|
widgetsnbextension @ file:///tmp/build/80754af9/widgetsnbextension_1644992802045/work
|
||||||
|
wrapt @ file:///tmp/build/80754af9/wrapt_1607574498026/work
|
||||||
|
wurlitzer @ file:///tmp/build/80754af9/wurlitzer_1638368168359/work
|
||||||
|
xarray @ file:///opt/conda/conda-bld/xarray_1639166117697/work
|
||||||
|
xlrd @ file:///tmp/build/80754af9/xlrd_1608072521494/work
|
||||||
|
XlsxWriter @ file:///opt/conda/conda-bld/xlsxwriter_1649073856329/work
|
||||||
|
yapf @ file:///tmp/build/80754af9/yapf_1615749224965/work
|
||||||
|
yarl @ file:///tmp/build/80754af9/yarl_1606939947528/work
|
||||||
|
zict==2.0.0
|
||||||
|
zipp @ file:///opt/conda/conda-bld/zipp_1641824620731/work
|
||||||
|
zope.interface @ file:///tmp/build/80754af9/zope.interface_1625036153595/work
|
||||||
@@ -0,0 +1,557 @@
|
|||||||
|
from flask import Flask, render_template, request, redirect, Response, send_file
|
||||||
|
import multiprocessing
|
||||||
|
import face_recognition
|
||||||
|
import os
|
||||||
|
import asyncio
|
||||||
|
#from flask_cors import CORS
|
||||||
|
app = Flask(__name__)
|
||||||
|
#CORS(app)
|
||||||
|
lst = []
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/', methods=['GET'])
|
||||||
|
def resume():
|
||||||
|
#return render_template('index.html')
|
||||||
|
return 'Attendence test app running'
|
||||||
|
|
||||||
|
def createEncodings(image):
|
||||||
|
print("Encoding")
|
||||||
|
"""
|
||||||
|
Create face encodings for a given image and also return face locations in the given image.
|
||||||
|
Parameters
|
||||||
|
-------
|
||||||
|
image : cv2 mat
|
||||||
|
Image you want to detect faces from.
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
known_encodings : list of np array
|
||||||
|
List of face encodings in a given image
|
||||||
|
face_locations : list of tuples
|
||||||
|
list of tuples for face locations in a given image
|
||||||
|
"""
|
||||||
|
# Find face locations for all faces in an image
|
||||||
|
face_locations = face_recognition.face_locations(image)
|
||||||
|
# Create encodings for all faces in an image
|
||||||
|
known_encodings = face_recognition.face_encodings(image, known_face_locations=face_locations)
|
||||||
|
return known_encodings, face_locations
|
||||||
|
#@app.route('/registered', methods=["POST","GET"])
|
||||||
|
def registered(url_list):
|
||||||
|
input=url_list
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("ppeople").mkdir(exist_ok=True)
|
||||||
|
Path("ppeople/" + input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
#z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y+ '.'+ z
|
||||||
|
print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
img_data = x.encode()
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
with open("ppeople/" + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
img = "ppeople/" + y + "/" + name
|
||||||
|
saveLocation = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
# import cv2
|
||||||
|
# import numpy as np
|
||||||
|
# import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# # Connects to your computer's default camera
|
||||||
|
# cap = cv2.imread(img)
|
||||||
|
|
||||||
|
# # Detect the coordinates
|
||||||
|
# detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
# number_of_faces=[]
|
||||||
|
# # Capture frames continuously
|
||||||
|
# # while True:
|
||||||
|
|
||||||
|
# # Capture frame-by-frame
|
||||||
|
# # ret, frame = cap
|
||||||
|
# frame = cap
|
||||||
|
|
||||||
|
# # RGB to grayscale
|
||||||
|
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
# faces = detector(gray)
|
||||||
|
|
||||||
|
# # Iterator to count faces
|
||||||
|
# i = 0
|
||||||
|
# for face in faces:
|
||||||
|
|
||||||
|
# # Get the coordinates of faces
|
||||||
|
# x, y = face.left(), face.top()
|
||||||
|
# x1, y1 = face.right(), face.bottom()
|
||||||
|
# cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# # Increment iterator for each face in faces
|
||||||
|
# i = i+1
|
||||||
|
|
||||||
|
# # Display the box and faces
|
||||||
|
# cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
# cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# # if len(i)>1:
|
||||||
|
# # print(i)
|
||||||
|
# number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
# if (len(number_of_faces))>1:
|
||||||
|
# print("Group Photo")
|
||||||
|
# return "Group Photo"
|
||||||
|
# elif (len(number_of_faces))==1:
|
||||||
|
# print("Single Photo")
|
||||||
|
# pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def saveEncodings(encs, names, fname='encodings.pickle'):
|
||||||
|
"""
|
||||||
|
Save encodings in a pickle file to be used in future.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
encs : List of np arrays
|
||||||
|
List of face encodings.
|
||||||
|
names : List of strings
|
||||||
|
List of names for each face encoding.
|
||||||
|
fname : String, optional
|
||||||
|
Name/Location for pickle file. The default is "encodings.pickle".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = []
|
||||||
|
d = [{"name": nm, "encoding": enc} for (nm, enc) in zip(names, encs)]
|
||||||
|
data.extend(d)
|
||||||
|
|
||||||
|
encodingsFile = fname
|
||||||
|
|
||||||
|
# dump the facial encodings data to disk
|
||||||
|
print("[INFO] serializing encodings...")
|
||||||
|
print("[INFO] Encodings Created sucessfully")
|
||||||
|
f = open(encodingsFile, "wb")
|
||||||
|
f.write(pickle.dumps(data))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# Function to create encodings and get face locations
|
||||||
|
|
||||||
|
|
||||||
|
def processKnownPeopleImages(img=img, saveLocation=saveLocation):
|
||||||
|
"""
|
||||||
|
Process images of known people and create face encodings to compare in future.
|
||||||
|
Eaach image should have just 1 face in it.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "C:/inetpub/vhosts/port82/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
"""
|
||||||
|
known_encodings = []
|
||||||
|
known_names = []
|
||||||
|
# for img in os.listdir(path):
|
||||||
|
|
||||||
|
imgPath = img
|
||||||
|
# Read image
|
||||||
|
image = cv2.imread(imgPath)
|
||||||
|
name = img.rsplit('.')[0]
|
||||||
|
# Resize
|
||||||
|
try:
|
||||||
|
print(image.shape)
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
try:
|
||||||
|
known_encodings.append(encs[0])
|
||||||
|
except IndexError:
|
||||||
|
os.remove(saveLocation)
|
||||||
|
print('------------------------------------- save location --------------------------------')
|
||||||
|
print(saveLocation)
|
||||||
|
return "hello world!"
|
||||||
|
|
||||||
|
|
||||||
|
# known_encodings.append(encs[0])
|
||||||
|
known_names.append(name)
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
# Show Image
|
||||||
|
# cv2.rectangle(image, (left, top), (right, bottom), color=(255, 0, 0), thickness=2)
|
||||||
|
# cv2.imshow("Image", image)
|
||||||
|
# cv2.waitKey(1)
|
||||||
|
# cv2.destroyAllWindows()
|
||||||
|
saveEncodings(known_encodings, known_names, saveLocation)
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
#import face_recognition
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
processKnownPeopleImages(img, saveLocation)
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
# ******************************** COMPARUISION *********************************************************
|
||||||
|
#@app.route('/submit', methods=["POST","GET"])
|
||||||
|
def submit(url_list):
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
import pytz
|
||||||
|
tz_NY = pytz.timezone('Asia/Kolkata')
|
||||||
|
datetime_NY = datetime.now(tz_NY)
|
||||||
|
India_Date = (datetime_NY.strftime("%Y-%m-%d"))
|
||||||
|
India_Date = str(India_Date)
|
||||||
|
India_Time = (datetime_NY.strftime("%I:%M:%S %p"))
|
||||||
|
India_Time = str(India_Time)
|
||||||
|
input=url_list
|
||||||
|
import pickle
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("GGallery").mkdir(exist_ok=True)
|
||||||
|
Path("GGallery/" + input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
# z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y + '.' + z
|
||||||
|
# print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
img_data = x.encode()
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
|
||||||
|
with open("GGallery/" + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
fh.close()
|
||||||
|
|
||||||
|
path = "GGallery/" + y + "/" + name
|
||||||
|
pickle_location = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
import pathlib
|
||||||
|
file = pathlib.Path(pickle_location)
|
||||||
|
if file.exists ():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print ("pickle File not exist")
|
||||||
|
print(name)
|
||||||
|
return "Face not found in profile (please change your profile)"
|
||||||
|
|
||||||
|
check_faces="ppeople/" + y + "/" + y + ".jpg"
|
||||||
|
print(check_faces)
|
||||||
|
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# Connects to your computer's default camera
|
||||||
|
cap = cv2.imread(check_faces)
|
||||||
|
|
||||||
|
# Detect the coordinates
|
||||||
|
detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
number_of_faces=[]
|
||||||
|
# Capture frames continuously
|
||||||
|
# while True:
|
||||||
|
|
||||||
|
# Capture frame-by-frame
|
||||||
|
# ret, frame = cap
|
||||||
|
frame = cap
|
||||||
|
|
||||||
|
# RGB to grayscale
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
faces = detector(gray)
|
||||||
|
|
||||||
|
# Iterator to count faces
|
||||||
|
i = 0
|
||||||
|
for face in faces:
|
||||||
|
|
||||||
|
# Get the coordinates of faces
|
||||||
|
x, y = face.left(), face.top()
|
||||||
|
x1, y1 = face.right(), face.bottom()
|
||||||
|
cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# Increment iterator for each face in faces
|
||||||
|
i = i+1
|
||||||
|
|
||||||
|
# Display the box and faces
|
||||||
|
cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# if len(i)>1:
|
||||||
|
# print(i)
|
||||||
|
number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
if (len(number_of_faces))>1:
|
||||||
|
print("Group Photo")
|
||||||
|
return "Group Photo"
|
||||||
|
elif (len(number_of_faces))==1:
|
||||||
|
print("Single Photo")
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def readEncodingsPickle(fname):
|
||||||
|
"""
|
||||||
|
Read Pickle file.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fname : String
|
||||||
|
Name of pickle file.(Full location)
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
encodings : list of np arrays
|
||||||
|
list of all saved encodings
|
||||||
|
names : List of Strings
|
||||||
|
List of all saved names
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
data = pickle.loads(open(fname, "rb").read())
|
||||||
|
|
||||||
|
|
||||||
|
data = np.array(data)
|
||||||
|
encodings = [d["encoding"] for d in data]
|
||||||
|
names = [d["name"] for d in data]
|
||||||
|
return encodings, names
|
||||||
|
|
||||||
|
|
||||||
|
def compareFaceEncodings(unknown_encoding, known_encodings, known_names):
|
||||||
|
"""
|
||||||
|
Compares face encodings to check if 2 faces are same or not.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
unknown_encoding : np array
|
||||||
|
Face encoding of unknown people.
|
||||||
|
known_encodings : np array
|
||||||
|
Face encodings of known people.
|
||||||
|
known_names : list of strings
|
||||||
|
Names of known people
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
acceptBool : Bool
|
||||||
|
face matched or not
|
||||||
|
duplicateName : String
|
||||||
|
Name of matched face
|
||||||
|
distance : Float
|
||||||
|
Distance between 2 faces
|
||||||
|
|
||||||
|
"""
|
||||||
|
duplicateName = ""
|
||||||
|
distance = 0.0
|
||||||
|
matches = face_recognition.compare_faces(known_encodings, unknown_encoding, tolerance=0.5)
|
||||||
|
|
||||||
|
face_distances = face_recognition.face_distance(known_encodings, unknown_encoding)
|
||||||
|
|
||||||
|
best_match_index = np.argmin(face_distances)
|
||||||
|
|
||||||
|
distance = face_distances[best_match_index]
|
||||||
|
if matches[best_match_index]:
|
||||||
|
acceptBool = True
|
||||||
|
duplicateName = known_names[best_match_index]
|
||||||
|
else:
|
||||||
|
acceptBool = False
|
||||||
|
duplicateName = ""
|
||||||
|
return acceptBool, duplicateName, distance
|
||||||
|
|
||||||
|
#p = []
|
||||||
|
|
||||||
|
|
||||||
|
def processDatasetImages(path=path, pickle_location=pickle_location):
|
||||||
|
"""
|
||||||
|
Process image in dataset from where you want to separate images.
|
||||||
|
It separates the images into directories of known people, groups and any unknown people images.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "D:/port1004/port1004/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Read pickle file for known people to compare faces from
|
||||||
|
|
||||||
|
people_encodings, names = readEncodingsPickle(pickle_location)
|
||||||
|
# print(p)
|
||||||
|
# imgPath = path + img
|
||||||
|
|
||||||
|
# Read image
|
||||||
|
# path=r"C:\Users\katku\Pictures\final\100011460000611.jpg"
|
||||||
|
image = cv2.imread(path)
|
||||||
|
#orig = image.copy()
|
||||||
|
|
||||||
|
# Resize
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
|
||||||
|
# Save image to a group image folder if more than one face is in image
|
||||||
|
# if len(locs) > 1:
|
||||||
|
# saveImageToDirectory(orig, "Group", img)
|
||||||
|
|
||||||
|
# Processing image for each face
|
||||||
|
i = 0
|
||||||
|
knownFlag = 0
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
unknown_encoding = encs[i]
|
||||||
|
i += 1
|
||||||
|
acceptBool, duplicateName, distance = compareFaceEncodings(unknown_encoding, people_encodings, names)
|
||||||
|
if acceptBool:
|
||||||
|
# saveImageToDirectory(orig, duplicateName,name)
|
||||||
|
knownFlag = 1
|
||||||
|
if knownFlag == 1:
|
||||||
|
print("Match Found")
|
||||||
|
|
||||||
|
|
||||||
|
#print(path)
|
||||||
|
with_extension = path.split("/")[-1]
|
||||||
|
without_extension = with_extension.split(".")[0]
|
||||||
|
|
||||||
|
# output_s = {"FileID": without_extension,
|
||||||
|
# "Date": India_Date,
|
||||||
|
# "Time": India_Time}
|
||||||
|
# output_json = json.dumps(output_s)
|
||||||
|
output_json='Matched successfully'
|
||||||
|
print(loc)
|
||||||
|
lst.append(output_json)
|
||||||
|
|
||||||
|
print(output_json)
|
||||||
|
# exit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
print('Not Matched')
|
||||||
|
pass
|
||||||
|
# saveImageToDirectory(orig, "0",name)
|
||||||
|
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import json
|
||||||
|
|
||||||
|
processDatasetImages(path, pickle_location)
|
||||||
|
return lst[0]
|
||||||
|
#return 'matched successfully'
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/test_detect', methods=["POST"])
|
||||||
|
def detect():
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
# multiprocessing
|
||||||
|
with multiprocessing.Pool(processes=2) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(submit, url_list)
|
||||||
|
except FileNotFoundError:
|
||||||
|
return 'plese get registered with your PhotoID'
|
||||||
|
except IndexError:
|
||||||
|
#return 'unable to recognize face'
|
||||||
|
return 'failed'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
|
||||||
|
return results[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/test_register', methods=["POST"])
|
||||||
|
def register():
|
||||||
|
print("hello start..........")
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
# referrer = request.headers
|
||||||
|
# print(referrer)
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
UserLocaton=Dataset["FilePath"]
|
||||||
|
print(UserLocaton)
|
||||||
|
if "c02" in UserLocaton:
|
||||||
|
return "Please update url in integration"
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
# multiprocessing
|
||||||
|
with multiprocessing.Pool(processes=2) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(registered, url_list)
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
print('face not found')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
#os.remove(img)
|
||||||
|
# return 'unable to recognize face'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
#return results[0]
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host='0.0.0.0',port =5004,debug=False)
|
||||||
@@ -0,0 +1,559 @@
|
|||||||
|
from flask import Flask, render_template, request, redirect, Response, send_file
|
||||||
|
import multiprocessing
|
||||||
|
import face_recognition
|
||||||
|
#from numba import jit
|
||||||
|
import numpy as np
|
||||||
|
import os
|
||||||
|
#from flask_cors import CORS
|
||||||
|
app = Flask(__name__)
|
||||||
|
#CORS(app)
|
||||||
|
lst = []
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/', methods=['GET'])
|
||||||
|
def resume():
|
||||||
|
#return render_template('index.html')
|
||||||
|
return 'Attendence app running'
|
||||||
|
|
||||||
|
def createEncodings(image):
|
||||||
|
print("Encoding")
|
||||||
|
"""
|
||||||
|
Create face encodings for a given image and also return face locations in the given image.
|
||||||
|
Parameters
|
||||||
|
-------
|
||||||
|
image : cv2 mat
|
||||||
|
Image you want to detect faces from.
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
known_encodings : list of np array
|
||||||
|
List of face encodings in a given image
|
||||||
|
face_locations : list of tuples
|
||||||
|
list of tuples for face locations in a given image
|
||||||
|
"""
|
||||||
|
# Find face locations for all faces in an image
|
||||||
|
face_locations = face_recognition.face_locations(image)
|
||||||
|
# Create encodings for all faces in an image
|
||||||
|
known_encodings = face_recognition.face_encodings(image, known_face_locations=face_locations)
|
||||||
|
return known_encodings, face_locations
|
||||||
|
#@app.route('/registered', methods=["POST","GET"])
|
||||||
|
def registered(url_list):
|
||||||
|
input=url_list
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("ppeople").mkdir(exist_ok=True)
|
||||||
|
Path("ppeople/" + input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
#z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y+ '.'+ z
|
||||||
|
print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
try:
|
||||||
|
img_data = x.encode()
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
with open("ppeople/" + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
|
||||||
|
img = "ppeople/" + y + "/" + name
|
||||||
|
saveLocation = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
# import cv2
|
||||||
|
# import numpy as np
|
||||||
|
# import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# # Connects to your computer's default camera
|
||||||
|
# cap = cv2.imread(img)
|
||||||
|
|
||||||
|
# # Detect the coordinates
|
||||||
|
# detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
# number_of_faces=[]
|
||||||
|
# # Capture frames continuously
|
||||||
|
# # while True:
|
||||||
|
|
||||||
|
# # Capture frame-by-frame
|
||||||
|
# # ret, frame = cap
|
||||||
|
# frame = cap
|
||||||
|
|
||||||
|
# # RGB to grayscale
|
||||||
|
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
# faces = detector(gray)
|
||||||
|
|
||||||
|
# # Iterator to count faces
|
||||||
|
# i = 0
|
||||||
|
# for face in faces:
|
||||||
|
|
||||||
|
# # Get the coordinates of faces
|
||||||
|
# x, y = face.left(), face.top()
|
||||||
|
# x1, y1 = face.right(), face.bottom()
|
||||||
|
# cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# # Increment iterator for each face in faces
|
||||||
|
# i = i+1
|
||||||
|
|
||||||
|
# # Display the box and faces
|
||||||
|
# cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
# cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# # if len(i)>1:
|
||||||
|
# # print(i)
|
||||||
|
# number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
# if (len(number_of_faces))>1:
|
||||||
|
# print("Group Photo")
|
||||||
|
# return "Group Photo"
|
||||||
|
# elif (len(number_of_faces))==1:
|
||||||
|
# print("Single Photo")
|
||||||
|
# pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def saveEncodings(encs, names, fname='encodings.pickle'):
|
||||||
|
"""
|
||||||
|
Save encodings in a pickle file to be used in future.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
encs : List of np arrays
|
||||||
|
List of face encodings.
|
||||||
|
names : List of strings
|
||||||
|
List of names for each face encoding.
|
||||||
|
fname : String, optional
|
||||||
|
Name/Location for pickle file. The default is "encodings.pickle".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = []
|
||||||
|
d = [{"name": nm, "encoding": enc} for (nm, enc) in zip(names, encs)]
|
||||||
|
data.extend(d)
|
||||||
|
|
||||||
|
encodingsFile = fname
|
||||||
|
|
||||||
|
# dump the facial encodings data to disk
|
||||||
|
print("[INFO] serializing encodings...")
|
||||||
|
print("[INFO] Encodings Created sucessfully")
|
||||||
|
f = open(encodingsFile, "wb")
|
||||||
|
f.write(pickle.dumps(data))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# Function to create encodings and get face locations
|
||||||
|
|
||||||
|
|
||||||
|
def processKnownPeopleImages(img=img, saveLocation=saveLocation):
|
||||||
|
"""
|
||||||
|
Process images of known people and create face encodings to compare in future.
|
||||||
|
Eaach image should have just 1 face in it.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "C:/inetpub/vhosts/port82/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
"""
|
||||||
|
known_encodings = []
|
||||||
|
known_names = []
|
||||||
|
# for img in os.listdir(path):
|
||||||
|
|
||||||
|
imgPath = img
|
||||||
|
# Read image
|
||||||
|
image = cv2.imread(imgPath)
|
||||||
|
name = img.rsplit('.')[0]
|
||||||
|
# Resize
|
||||||
|
try:
|
||||||
|
print(image.shape)
|
||||||
|
except AttributeError:
|
||||||
|
return "Successfully saved encoding........."
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
try:
|
||||||
|
known_encodings.append(encs[0])
|
||||||
|
except IndexError:
|
||||||
|
os.remove(saveLocation)
|
||||||
|
print('------------------------------------- save location --------------------------------')
|
||||||
|
print(saveLocation)
|
||||||
|
return "hello world!"
|
||||||
|
|
||||||
|
|
||||||
|
# known_encodings.append(encs[0])
|
||||||
|
known_names.append(name)
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
# Show Image
|
||||||
|
# cv2.rectangle(image, (left, top), (right, bottom), color=(255, 0, 0), thickness=2)
|
||||||
|
# cv2.imshow("Image", image)
|
||||||
|
# cv2.waitKey(1)
|
||||||
|
# cv2.destroyAllWindows()
|
||||||
|
saveEncodings(known_encodings, known_names, saveLocation)
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
#import face_recognition
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
processKnownPeopleImages(img, saveLocation)
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
# ******************************** COMPARUISION *********************************************************
|
||||||
|
#@app.route('/submit', methods=["POST","GET"])
|
||||||
|
def submit(url_list):
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
import pytz
|
||||||
|
tz_NY = pytz.timezone('Asia/Kolkata')
|
||||||
|
datetime_NY = datetime.now(tz_NY)
|
||||||
|
India_Date = (datetime_NY.strftime("%Y-%m-%d"))
|
||||||
|
India_Date = str(India_Date)
|
||||||
|
# India_Time = (datetime_NY.strftime("%I:%M:%S %p"))
|
||||||
|
# India_Time = str(India_Time)
|
||||||
|
input=url_list
|
||||||
|
import pickle
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
Path("GGallery/"+ India_Date).mkdir(exist_ok=True)
|
||||||
|
Path("GGallery/"+ India_Date +'/'+ input["FileName"]).mkdir(exist_ok=True)
|
||||||
|
|
||||||
|
a = input
|
||||||
|
# print(a)
|
||||||
|
x = a['FileData']
|
||||||
|
# print(x)
|
||||||
|
y = a['FileName']
|
||||||
|
# z = a['FileType']
|
||||||
|
z='jpg'
|
||||||
|
# CreatedBy=a['CreatedBy']
|
||||||
|
|
||||||
|
name = y + '.' + z
|
||||||
|
# print(name)
|
||||||
|
# print(y)
|
||||||
|
# image = y.split("/")
|
||||||
|
# filename=image[-1]
|
||||||
|
|
||||||
|
# print(x)
|
||||||
|
img_data = x.encode()
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
|
||||||
|
with open("GGallery/"+India_Date+'/' + input["FileName"] + "/" + name, "wb") as fh:
|
||||||
|
fh.write(base64.decodebytes(img_data))
|
||||||
|
|
||||||
|
path = "GGallery/" +India_Date+'/'+ y + "/" + name
|
||||||
|
pickle_location = "ppeople/" + y + "/" + y + ".pickle"
|
||||||
|
import pathlib
|
||||||
|
file = pathlib.Path(pickle_location)
|
||||||
|
if file.exists ():
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print ("pickle File not exist")
|
||||||
|
print(name)
|
||||||
|
return "Face not found in profile (please change your profile)"
|
||||||
|
|
||||||
|
check_faces="ppeople/" + y + "/" + y + ".jpg"
|
||||||
|
print(check_faces)
|
||||||
|
|
||||||
|
|
||||||
|
############ detecting no of faceses #######################
|
||||||
|
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import dlib
|
||||||
|
|
||||||
|
|
||||||
|
# Connects to your computer's default camera
|
||||||
|
cap = cv2.imread(check_faces)
|
||||||
|
|
||||||
|
# Detect the coordinates
|
||||||
|
detector = dlib.get_frontal_face_detector()
|
||||||
|
|
||||||
|
number_of_faces=[]
|
||||||
|
# Capture frames continuously
|
||||||
|
# while True:
|
||||||
|
|
||||||
|
# Capture frame-by-frame
|
||||||
|
# ret, frame = cap
|
||||||
|
frame = cap
|
||||||
|
|
||||||
|
# RGB to grayscale
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
faces = detector(gray)
|
||||||
|
|
||||||
|
# Iterator to count faces
|
||||||
|
i = 0
|
||||||
|
for face in faces:
|
||||||
|
|
||||||
|
# Get the coordinates of faces
|
||||||
|
x, y = face.left(), face.top()
|
||||||
|
x1, y1 = face.right(), face.bottom()
|
||||||
|
cv2.rectangle(frame, (x, y), (x1, y1), (0, 255, 0), 2)
|
||||||
|
# Increment iterator for each face in faces
|
||||||
|
i = i+1
|
||||||
|
|
||||||
|
# Display the box and faces
|
||||||
|
cv2.putText(frame, 'face num'+str(i), (x-10, y-10),
|
||||||
|
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||||
|
|
||||||
|
# if len(i)>1:
|
||||||
|
# print(i)
|
||||||
|
number_of_faces.append(i)
|
||||||
|
|
||||||
|
|
||||||
|
if (len(number_of_faces))>1:
|
||||||
|
print("Group Photo")
|
||||||
|
return "Group Photo"
|
||||||
|
elif (len(number_of_faces))==1:
|
||||||
|
print("Single Photo")
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def readEncodingsPickle(fname):
|
||||||
|
"""
|
||||||
|
Read Pickle file.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fname : String
|
||||||
|
Name of pickle file.(Full location)
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
encodings : list of np arrays
|
||||||
|
list of all saved encodings
|
||||||
|
names : List of Strings
|
||||||
|
List of all saved names
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
data = pickle.loads(open(fname, "rb").read())
|
||||||
|
|
||||||
|
|
||||||
|
data = np.array(data)
|
||||||
|
encodings = [d["encoding"] for d in data]
|
||||||
|
names = [d["name"] for d in data]
|
||||||
|
return encodings, names
|
||||||
|
|
||||||
|
|
||||||
|
def compareFaceEncodings(unknown_encoding, known_encodings, known_names):
|
||||||
|
"""
|
||||||
|
Compares face encodings to check if 2 faces are same or not.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
unknown_encoding : np array
|
||||||
|
Face encoding of unknown people.
|
||||||
|
known_encodings : np array
|
||||||
|
Face encodings of known people.
|
||||||
|
known_names : list of strings
|
||||||
|
Names of known people
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
acceptBool : Bool
|
||||||
|
face matched or not
|
||||||
|
duplicateName : String
|
||||||
|
Name of matched face
|
||||||
|
distance : Float
|
||||||
|
Distance between 2 faces
|
||||||
|
|
||||||
|
"""
|
||||||
|
duplicateName = ""
|
||||||
|
distance = 0.0
|
||||||
|
matches = face_recognition.compare_faces(known_encodings, unknown_encoding, tolerance=0.54)
|
||||||
|
face_distances = face_recognition.face_distance(known_encodings, unknown_encoding)
|
||||||
|
|
||||||
|
best_match_index = np.argmin(face_distances)
|
||||||
|
|
||||||
|
distance = face_distances[best_match_index]
|
||||||
|
if matches[best_match_index]:
|
||||||
|
acceptBool = True
|
||||||
|
duplicateName = known_names[best_match_index]
|
||||||
|
else:
|
||||||
|
acceptBool = False
|
||||||
|
duplicateName = ""
|
||||||
|
return acceptBool, duplicateName, distance
|
||||||
|
|
||||||
|
#p = []
|
||||||
|
|
||||||
|
|
||||||
|
def processDatasetImages(path=path, pickle_location=pickle_location):
|
||||||
|
"""
|
||||||
|
Process image in dataset from where you want to separate images.
|
||||||
|
It separates the images into directories of known people, groups and any unknown people images.
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
path : STRING, optional
|
||||||
|
Path for known people dataset. The default is "D:/port1004/port1004/wwwroot/_files/People".
|
||||||
|
It should be noted that each image in this dataset should contain only 1 face.
|
||||||
|
saveLocation : STRING, optional
|
||||||
|
Path for storing encodings for known people dataset. The default is "./known_encodings.pickle in current directory".
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
None.
|
||||||
|
|
||||||
|
"""
|
||||||
|
# Read pickle file for known people to compare faces from
|
||||||
|
|
||||||
|
people_encodings, names = readEncodingsPickle(pickle_location)
|
||||||
|
# print(p)
|
||||||
|
# imgPath = path + img
|
||||||
|
|
||||||
|
# Read image
|
||||||
|
# path=r"C:\Users\katku\Pictures\final\100011460000611.jpg"
|
||||||
|
image = cv2.imread(path)
|
||||||
|
#orig = image.copy()
|
||||||
|
|
||||||
|
# Resize
|
||||||
|
image = cv2.resize(image, (0, 0), fx=0.9, fy=0.9, interpolation=cv2.INTER_LINEAR)
|
||||||
|
|
||||||
|
# Get locations and encodings
|
||||||
|
encs, locs = createEncodings(image)
|
||||||
|
|
||||||
|
# Save image to a group image folder if more than one face is in image
|
||||||
|
# if len(locs) > 1:
|
||||||
|
# saveImageToDirectory(orig, "Group", img)
|
||||||
|
|
||||||
|
# Processing image for each face
|
||||||
|
i = 0
|
||||||
|
knownFlag = 0
|
||||||
|
for loc in locs:
|
||||||
|
top, right, bottom, left = loc
|
||||||
|
unknown_encoding = encs[i]
|
||||||
|
i += 1
|
||||||
|
acceptBool, duplicateName, distance = compareFaceEncodings(unknown_encoding, people_encodings, names)
|
||||||
|
if acceptBool:
|
||||||
|
# saveImageToDirectory(orig, duplicateName,name)
|
||||||
|
knownFlag = 1
|
||||||
|
if knownFlag == 1:
|
||||||
|
print("Match Found")
|
||||||
|
|
||||||
|
|
||||||
|
#print(path)
|
||||||
|
with_extension = path.split("/")[-1]
|
||||||
|
without_extension = with_extension.split(".")[0]
|
||||||
|
|
||||||
|
# output_s = {"FileID": without_extension,
|
||||||
|
# "Date": India_Date,
|
||||||
|
# "Time": India_Time}
|
||||||
|
# output_json = json.dumps(output_s)
|
||||||
|
output_json='Matched successfully'
|
||||||
|
print(loc)
|
||||||
|
lst.append(output_json)
|
||||||
|
|
||||||
|
print(output_json)
|
||||||
|
# exit()
|
||||||
|
|
||||||
|
else:
|
||||||
|
print('Not Matched')
|
||||||
|
pass
|
||||||
|
# saveImageToDirectory(orig, "0",name)
|
||||||
|
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import json
|
||||||
|
|
||||||
|
processDatasetImages(path, pickle_location)
|
||||||
|
return lst[0]
|
||||||
|
#return 'matched successfully'
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/uat01_detect', methods=["POST"])
|
||||||
|
def detect():
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
# multiprocessing
|
||||||
|
pool_size = multiprocessing.cpu_count() * 2
|
||||||
|
with multiprocessing.Pool(pool_size) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(submit, url_list)
|
||||||
|
except FileNotFoundError:
|
||||||
|
return 'plese get registered with your PhotoID'
|
||||||
|
except IndexError:
|
||||||
|
#return 'unable to recognize face'
|
||||||
|
return 'failed'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
|
||||||
|
return results[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/uat01_register', methods=["POST"])
|
||||||
|
def register():
|
||||||
|
print("hello start..........")
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
url_list=[]
|
||||||
|
Dataset= request.get_json()
|
||||||
|
# id = "100013660000125"
|
||||||
|
url_list.append(Dataset)
|
||||||
|
UserLocation=Dataset["FilePath"]
|
||||||
|
print(UserLocation)
|
||||||
|
|
||||||
|
# if "cO2" in UserLocation or UserLocation is None:
|
||||||
|
# pass
|
||||||
|
# else:
|
||||||
|
# return "Please update the URL in the integration"
|
||||||
|
|
||||||
|
|
||||||
|
# multiprocessing
|
||||||
|
pool_size = multiprocessing.cpu_count() * 2
|
||||||
|
with multiprocessing.Pool(pool_size) as pool:
|
||||||
|
try:
|
||||||
|
results = pool.map(registered, url_list)
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
print('face not found')
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
#os.remove(img)
|
||||||
|
# return 'unable to recognize face'
|
||||||
|
|
||||||
|
pool.close()
|
||||||
|
#return results[0]
|
||||||
|
return 'Successfully saved encoding.........'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(host='0.0.0.0',port =5005,debug=False)
|
||||||
Reference in New Issue
Block a user