reworked image encoding started face_rec
This commit is contained in:
parent
fd951a8222
commit
33a49a25d1
|
|
@ -1,2 +1,4 @@
|
|||
|
||||
__pycache__/
|
||||
|
||||
DP_UareU_WSDK_223/
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
java.exe -classpath ".;C:\Program Files\DigitalPersona\U.are.U SDK\Windows\Lib\Java\dpuareu.jar" -Djava.library.path="C:\Program Files\DigitalPersona\U.are.U SDK\Windows\Lib\win32" UareUSampleJava
|
||||
|
|
@ -28,7 +28,7 @@ class PersonList(Resource):
|
|||
session.add(fp)
|
||||
|
||||
personJSON["fingerprints"] = fingerprintsObj
|
||||
personJSON["face"] = ("data:image/png;base64,"+str(lastImage)).encode('utf-8')
|
||||
personJSON["face"] = lastImage
|
||||
person = Person(**personJSON)
|
||||
session.add(person)
|
||||
session.commit()
|
||||
|
|
@ -118,7 +118,7 @@ class Camera(Resource):
|
|||
# provides th function used for the live streams
|
||||
class VideoCamera(object):
|
||||
"""Video stream object"""
|
||||
url = "https://webcam1.lpl.org/axis-cgi/mjpg/video.cgi"
|
||||
url = "http://192.168.178.56:8080/video"
|
||||
def __init__(self):
|
||||
self.video = cv2.VideoCapture(self.url)
|
||||
|
||||
|
|
@ -145,7 +145,7 @@ class Camera(Resource):
|
|||
return flask.Response(self.gen(self.VideoCamera()), mimetype='multipart/x-mixed-replace; boundary=frame')
|
||||
|
||||
elif type == "still":
|
||||
lastImage1 = base64.b64decode(lastImage.encode())
|
||||
lastImage1 = base64.b64decode(lastImage)
|
||||
return flask.Response(lastImage1, mimetype='image/png')
|
||||
|
||||
return flask.make_response(flask.jsonify({'error': "No idea how you got here"}), 404)
|
||||
|
|
@ -156,7 +156,7 @@ class Camera(Resource):
|
|||
def post(self):
|
||||
global lastImage
|
||||
try:
|
||||
lastImage = base64.b64encode(self.VideoCamera().get_frame('.png')).decode()
|
||||
lastImage = base64.b64encode(self.VideoCamera().get_frame('.png'))
|
||||
except Exception as e:
|
||||
print("error: -", e)
|
||||
return flask.make_response(flask.jsonify({'error': str(e)}), 404)
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
import face_recognition
|
||||
import os
|
||||
import cv2
|
||||
from db import Session, Person
|
||||
import base64
|
||||
import numpy as np
|
||||
from base64 import decodestring
|
||||
import base64
|
||||
|
||||
from io import StringIO
|
||||
from PIL import Image
|
||||
|
||||
KNOWN_FACES_DIR = 'known_faces'
|
||||
UNKNOWN_FACES_DIR = 'unknown_faces'
|
||||
TOLERANCE = 0.6
|
||||
FRAME_THICKNESS = 3
|
||||
FONT_THICKNESS = 2
|
||||
MODEL = 'hog' # default: 'hog', other one can be 'cnn' - CUDA accelerated (if available) deep-learning pretrained model
|
||||
|
||||
|
||||
# Returns (R, G, B) from name
|
||||
def name_to_color(name):
|
||||
# Take 3 first letters, tolower()
|
||||
# lowercased character ord() value rage is 97 to 122, substract 97, multiply by 8
|
||||
color = [(ord(c.lower())-97)*8 for c in name[:3]]
|
||||
return color
|
||||
|
||||
def readb64(base64_string):
|
||||
sbuf = StringIO()
|
||||
sbuf.write(base64.b64decode(base64_string))
|
||||
pimg = Image.open(sbuf)
|
||||
return cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR)
|
||||
|
||||
print('Loading known faces...')
|
||||
known_faces = []
|
||||
known_names = []
|
||||
session = Session()
|
||||
|
||||
# We oranize known faces as subfolders of KNOWN_FACES_DIR
|
||||
# Each subfolder's name becomes our label (name)
|
||||
for face, name in session.query(Person.face, Person.lname).all():
|
||||
# Load an image
|
||||
nparr = np.fromstring(base64.b64decode(face), np.uint8)
|
||||
image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
|
||||
|
||||
# Get 128-dimension face encoding
|
||||
# Always returns a list of found faces, for this purpose we take first face only (assuming one face per image as you can't be twice on one image)
|
||||
encoding = face_recognition.face_encodings(image)[0]
|
||||
|
||||
# Append encodings and name
|
||||
known_faces.append(encoding)
|
||||
known_names.append(name)
|
||||
|
||||
|
||||
print('Processing unknown faces...')
|
||||
# Now let's loop over a folder of faces we want to label
|
||||
|
||||
image = face_recognition.load_image_file('C:/Users/ofjok/Desktop/1.png')
|
||||
|
||||
# This time we first grab face locations - we'll need them to draw boxes
|
||||
locations = face_recognition.face_locations(image, model=MODEL)
|
||||
|
||||
# Now since we know loctions, we can pass them to face_encodings as second argument
|
||||
# Without that it will search for faces once again slowing down whole process
|
||||
encodings = face_recognition.face_encodings(image, locations)
|
||||
|
||||
# We passed our image through face_locations and face_encodings, so we can modify it
|
||||
# First we need to convert it from RGB to BGR as we are going to work with cv2
|
||||
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
||||
|
||||
# But this time we assume that there might be more faces in an image - we can find faces of dirrerent people
|
||||
|
||||
for face_encoding, face_location in zip(encodings, locations):
|
||||
|
||||
# We use compare_faces (but might use face_distance as well)
|
||||
# Returns array of True/False values in order of passed known_faces
|
||||
results = face_recognition.compare_faces(known_faces, face_encoding, TOLERANCE)
|
||||
|
||||
# Since order is being preserved, we check if any face was found then grab index
|
||||
# then label (name) of first matching known face withing a tolerance
|
||||
match = None
|
||||
if True in results: # If at least one is true, get a name of first of found labels
|
||||
match = known_names[results.index(True)]
|
||||
print(f' - {match} from {results}')
|
||||
|
||||
# Each location contains positions in order: top, right, bottom, left
|
||||
top_left = (face_location[3], face_location[0])
|
||||
bottom_right = (face_location[1], face_location[2])
|
||||
|
||||
# Get color by name using our fancy function
|
||||
color = name_to_color(match)
|
||||
|
||||
# Paint frame
|
||||
cv2.rectangle(image, top_left, bottom_right, color, FRAME_THICKNESS)
|
||||
|
||||
# Now we need smaller, filled grame below for a name
|
||||
# This time we use bottom in both corners - to start from bottom and move 50 pixels down
|
||||
top_left = (face_location[3], face_location[2])
|
||||
bottom_right = (face_location[1], face_location[2] + 22)
|
||||
|
||||
# Paint frame
|
||||
cv2.rectangle(image, top_left, bottom_right, color, cv2.FILLED)
|
||||
|
||||
# Wite a name
|
||||
cv2.putText(image, match, (face_location[3] + 10, face_location[2] + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (200, 200, 200), FONT_THICKNESS)
|
||||
|
||||
# Show image
|
||||
cv2.imshow("1", image)
|
||||
cv2.waitKey(0)
|
||||
cv2.destroyWindow("1")
|
||||
|
|
@ -40,7 +40,7 @@ function loadPersonList(data) {
|
|||
<h6 class="card-subtitle mb-2 text-muted">${item["timestamp"]}</h6>
|
||||
|
||||
<p class="card-text">
|
||||
<img class="listImg" src="${item["face"]}"></img>
|
||||
<img class="listImg" src="data:image/png;base64,${item["face"]}"></img>
|
||||
<div class="personalInfo">
|
||||
Gender: ${item["gender"]} <br>
|
||||
YoB: ${item["yob"]} <br>
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ function renderPersonIdentify(data){
|
|||
<div class="card border-light" onclick="focusPerson(${item["person_id"]})" id="person${item["person_id"]}">
|
||||
<div class="card-body">
|
||||
<p class="card-text">
|
||||
<img class="listImg" src="${item["face"]}"></img>
|
||||
<img class="listImg" src="data:image/png;base64,${item["face"]}"></img>
|
||||
<div class="personalInfo">
|
||||
Name: ${item["fname"]} ${item["lname"]} <br>
|
||||
Gender: ${item["gender"]} <br>
|
||||
|
|
@ -84,7 +84,7 @@ function renderPersonIdentify(data){
|
|||
|
||||
function renderPersonRight(data){
|
||||
string = `
|
||||
<img src="${data["face"]}" id="image-right"> </img>
|
||||
<img src="data:image/png;base64,${data["face"]}" id="image-right"> </img>
|
||||
|
||||
<h4 class="heroInfo">
|
||||
Gender: ${data["gender"]} <br>
|
||||
|
|
|
|||
|
|
@ -2,4 +2,6 @@ flask
|
|||
flask_restful
|
||||
sqlalchemy
|
||||
requests
|
||||
flask-restful-swagger-3
|
||||
flask-restful-swagger-3
|
||||
cmake
|
||||
face_recognition
|
||||
1
run.py
1
run.py
|
|
@ -3,3 +3,4 @@ from application import app
|
|||
app.run(host="localhost", port='5001', debug=True)
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
BIN
test.sqlite
BIN
test.sqlite
Binary file not shown.
Loading…
Reference in New Issue