Upload files to 'Events/src'
This commit is contained in:
@@ -0,0 +1,517 @@
|
||||
import pickle
|
||||
import numpy as np
|
||||
import face_recognition
|
||||
import os
|
||||
from flask import Flask, render_template, request, redirect, send_file
|
||||
#import shutil
|
||||
import cv2
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config["IMAGE_UPLOADS"] = "C:/Users/Bizgaze/PycharmProjects/face_recogniction/People"
|
||||
datasetPath = "/opt/bizgaze/events.bizgaze.app/wwwroot/_files/1/Gallery/"
|
||||
peoplePath = "/opt/bizgaze/events.bizgaze.app/wwwroot/_files/People/"
|
||||
@app.route('/', methods=['GET'])
|
||||
def home():
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
@app.route('/Display', methods=['GET', "POST"])
|
||||
def Display():
|
||||
return render_template('Display.html')
|
||||
|
||||
|
||||
@app.route("/upload", methods=["GET", "POST"])
|
||||
def upload():
|
||||
if request.method == "POST":
|
||||
|
||||
if request.files:
|
||||
|
||||
image = request.files["image"]
|
||||
try:
|
||||
image.save(os.path.join(
|
||||
app.config["IMAGE_UPLOADS"], image.filename))
|
||||
except IsADirectoryError:
|
||||
return render_template('index.html')
|
||||
# image.save(os.path.join(
|
||||
# app.config["IMAGE_UPLOADS"], image.filename))
|
||||
|
||||
print("Image saved")
|
||||
|
||||
return redirect(request.url)
|
||||
|
||||
return 'ok'
|
||||
|
||||
|
||||
@app.route('/predict', methods=["GET", "POST"])
|
||||
def predict():
|
||||
Dataset = request.get_json()
|
||||
a = Dataset
|
||||
peoplePath = a['People']
|
||||
print(peoplePath)
|
||||
datasetPath = a['Gallery']
|
||||
print(datasetPath)
|
||||
|
||||
print('starting')
|
||||
def saveEncodings(encs, names, fname="encodings.pickle"):
|
||||
print('encoding')
|
||||
"""
|
||||
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...")
|
||||
f = open(encodingsFile, "wb")
|
||||
f.write(pickle.dumps(data))
|
||||
f.close()
|
||||
|
||||
# Function to read encodings
|
||||
|
||||
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
|
||||
|
||||
# Function to create encodings and get face locations
|
||||
def createEncodings(image):
|
||||
"""
|
||||
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
|
||||
|
||||
# Function to compare encodings
|
||||
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.47)
|
||||
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 = []
|
||||
|
||||
# Save Image to new directory
|
||||
def saveImageToDirectory(image, name, imageName):
|
||||
"""
|
||||
Saves images to directory.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
image : cv2 mat
|
||||
Image you want to save.
|
||||
name : String
|
||||
Directory where you want the image to be saved.
|
||||
imageName : String
|
||||
Name of image.
|
||||
|
||||
Returns
|
||||
-------
|
||||
None.
|
||||
|
||||
"""
|
||||
path = "./output/" + name
|
||||
path1 = "./output/" + name
|
||||
if os.path.exists(path):
|
||||
pass
|
||||
else:
|
||||
os.mkdir(path)
|
||||
cv2.imwrite(path + "/" + imageName, image)
|
||||
x = []
|
||||
c = (path1 + "/" + imageName)
|
||||
x.append(c)
|
||||
p.append(x)
|
||||
|
||||
# Function for creating encodings for known people
|
||||
def processKnownPeopleImages(path=peoplePath, saveLocation="./known_encodings.pickle"):
|
||||
"""
|
||||
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 = path + img
|
||||
|
||||
# Read image
|
||||
image = cv2.imread(imgPath)
|
||||
name = img.rsplit('.')[0]
|
||||
# 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)
|
||||
try:
|
||||
known_encodings.append(encs[0])
|
||||
except IndexError:
|
||||
pass
|
||||
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)
|
||||
|
||||
# Function for processing dataset images
|
||||
def processDatasetImages(saveLocation="./Gallery_encodings.pickle"):
|
||||
"""
|
||||
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("./known_encodings.pickle")
|
||||
|
||||
for root, dirs, files in os.walk(datasetPath, topdown=False):
|
||||
|
||||
for name in files:
|
||||
s = os.path.join(root, name)
|
||||
#print(p)
|
||||
# imgPath = path + img
|
||||
|
||||
# Read image
|
||||
image = cv2.imread(s)
|
||||
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")
|
||||
else:
|
||||
saveImageToDirectory(orig, "0",name)
|
||||
|
||||
# Show Image
|
||||
# cv2.rectangle(image, (left, top), (right, bottom), color=(255, 0, 0), thickness=2)
|
||||
# # cv2.imshow("Image", image)
|
||||
# cv2.waitKey(1)
|
||||
# cv2.destroyAllWindows()
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main Function.
|
||||
|
||||
Returns
|
||||
-------
|
||||
None.
|
||||
|
||||
"""
|
||||
|
||||
processKnownPeopleImages()
|
||||
processDatasetImages()
|
||||
# shutil.make_archive('./Images', 'zip','./output')
|
||||
# p='./Images.zip'
|
||||
# return send_file(p,as_attachment=True)
|
||||
|
||||
|
||||
# import pandas as pd
|
||||
# q = pd.DataFrame(p)
|
||||
# x = q
|
||||
# # x.drop(x.columns[0], axis=1, inplace=True)
|
||||
# df = x.groupby([0], as_index=False).count()
|
||||
# z = df[0].str.split('/', expand=True)
|
||||
|
||||
|
||||
# for i, group in z.groupby([2]):
|
||||
# group.drop(group.columns[2], axis=1, inplace=True)
|
||||
#group.to_csv(f'./output1/{i}.csv', index=False, sep='/', header=False)
|
||||
|
||||
|
||||
##############################csv creation code ##############################
|
||||
import pandas as pd
|
||||
q = pd.DataFrame(p)
|
||||
m = q
|
||||
#print(m)
|
||||
# x.drop(x.columns[Unnam], axis=1, inplace=True)
|
||||
df = m.groupby([0], as_index=False).count()
|
||||
first_column_name = df.columns[0]
|
||||
|
||||
# Rename the first column
|
||||
df.rename(columns={first_column_name: 'col'}, inplace=True)
|
||||
#print(df)
|
||||
z = df['col'].str.split('/', expand=True)
|
||||
|
||||
z['ImagePath'] = z[3]
|
||||
|
||||
result = z.drop([0,1,3], axis=1)
|
||||
result.rename({result.columns[-1]: 'test'}, axis=1, inplace=True)
|
||||
# print(result)
|
||||
result.to_csv('results1.csv')
|
||||
import pandas as pd
|
||||
import os
|
||||
c = []
|
||||
for root, dirs, files in os.walk(datasetPath, topdown=False):
|
||||
for name in files:
|
||||
# print(name)
|
||||
L = os.path.join(root, name)
|
||||
c.append(L)
|
||||
df = pd.DataFrame(c)
|
||||
#print('seconfdf')
|
||||
|
||||
first_column_name = df.columns[0]
|
||||
|
||||
# Rename the first column
|
||||
df.rename(columns={first_column_name: 'col'}, inplace=True)
|
||||
print(df)
|
||||
df1 = df['col'].str.split("/", expand=True)
|
||||
df1.rename({df1.columns[-2]: 'abc'}, axis=1, inplace=True)
|
||||
#print('this is df1')
|
||||
#print(df1)
|
||||
df1.rename({df1.columns[-1]: 'test'}, axis=1, inplace=True)
|
||||
merge = pd.merge(df1, result, on='test', how='left')
|
||||
merge.to_csv('merge.csv')
|
||||
mergesplit = merge.loc[:,'test'].str.split(".", expand=True)
|
||||
mergesplit.rename({mergesplit.columns[-2]: 'ImageName'}, axis=1, inplace=True)
|
||||
mergesplit = mergesplit.loc[:,'ImageName' ]
|
||||
|
||||
merge.rename({merge.columns[-1]: 'Matched'}, axis=1, inplace=True)
|
||||
merge['EventName'] = merge['abc']
|
||||
merge['Imagepath']="/_files/1/Gallery/"+merge['EventName']+'/'+ + merge['test']
|
||||
|
||||
frames = [merge, mergesplit]
|
||||
|
||||
r = pd.concat(frames, axis=1, join='inner')
|
||||
r=r.iloc[:,3:]
|
||||
#print(r)
|
||||
r.to_csv('path.csv', index=False)
|
||||
#r.to_json(r'./matched.json', orient="records")
|
||||
column_list = ['Matched','Imagepath', 'ImageName', 'EventName']
|
||||
r[column_list].to_json('matched.json', orient="records")
|
||||
|
||||
#############################################################################################
|
||||
|
||||
|
||||
|
||||
# merge.rename({merge.columns[-3]: 'ImagePath'}, axis=1, inplace=True)
|
||||
#
|
||||
# # print(merge)
|
||||
# merge1 = merge.iloc[:, -2]
|
||||
# merge12= merge.iloc[:, -3]
|
||||
#
|
||||
# # merge1.rename({merge1.columns[-1]: 'abc'}, axis=1, inplace=True)
|
||||
# merge2 = merge.iloc[:, -1].str.split(".", expand=True)
|
||||
# merge2.rename({merge2.columns[-1]: 'drop'}, axis=1, inplace=True)
|
||||
# #merge2.rename({merge2.columns[-2]: 'ImageName'}, axis=1, inplace=True)
|
||||
# print('this is merge1')
|
||||
# print(merge1)
|
||||
# print('this is merge2')
|
||||
# print(merge2)
|
||||
# mergefinal = pd.concat([merge1, merge2], axis=1, join='inner')
|
||||
# # print(mergefinal)
|
||||
# # print('-----------------')
|
||||
#
|
||||
# mergefinal.drop(columns=mergefinal.columns[-1], axis=1, inplace=True)
|
||||
# # print(mergefinal)
|
||||
# # print('--------------------------------------------------------------------------------')
|
||||
# # mergefinal.rename({mergefinal.columns[-1]: 'ImageName'}, axis=1, inplace=True)
|
||||
# # print('this is filename')
|
||||
# # print(mergefinal)
|
||||
# #mergefinal.rename({mergefinal.columns[-2]: 'EventName'}, axis=1, inplace=True)
|
||||
# # print('this is foldername')
|
||||
# # print(mergefinal)
|
||||
#
|
||||
# frames = [mergefinal, merge12]
|
||||
#
|
||||
# r = pd.concat(frames, axis=1, join='inner')
|
||||
#
|
||||
#
|
||||
# r.to_csv('Imagepath1.csv', index=False)
|
||||
# r.to_json('Imagepath1.json', orient="records")
|
||||
# import shutil
|
||||
# import os
|
||||
# # import shutil module
|
||||
# import shutil
|
||||
#
|
||||
# # import os module
|
||||
# import os
|
||||
# #################### move code#############
|
||||
# # base path
|
||||
# base_path = 'C:\\Users\\Bizgaze\\PycharmProjects\\face_recogniction\\move'
|
||||
# import os
|
||||
# dir_list = []
|
||||
# rootdir = 'C:\\Users\\Bizgaze\\PycharmProjects\\face_recogniction\\Dataset'
|
||||
# for file in os.listdir(rootdir):
|
||||
# d = os.path.join(rootdir, file)
|
||||
# if os.path.isdir(d):
|
||||
# dir_list.append(d)
|
||||
#
|
||||
# # list of directories we want to move.
|
||||
# # dir_list = ['test2', 'test4', 'test5', 'does_not_exist']
|
||||
#
|
||||
# # path to destination directory
|
||||
# # dest = os.path.join(base_path, 'dest')
|
||||
#
|
||||
# print("Before moving directories:")
|
||||
# print(os.listdir(base_path))
|
||||
#
|
||||
# # traverse each directory in dir_list
|
||||
# for dir_ in dir_list:
|
||||
#
|
||||
# # create path to the directory in the
|
||||
# # dir_list.
|
||||
# source = os.path.join(base_path, dir_)
|
||||
#
|
||||
# # check if it is an existing directory
|
||||
# if os.path.isdir(source):
|
||||
# # move to destination path
|
||||
# shutil.move(source, base_path)
|
||||
#
|
||||
# print("After moving directories:")
|
||||
# print(os.listdir(base_path))
|
||||
|
||||
print("Completed")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
# return render_template('index.html')
|
||||
p = './matched.json'
|
||||
return send_file(p,as_attachment=True)
|
||||
|
||||
# return 'ALL IMAGES MATCHED'
|
||||
|
||||
|
||||
@app.route('/json')
|
||||
def json():
|
||||
p = './matched.json'
|
||||
return send_file(p,as_attachment=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0",port=8081)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user