212 lines
8.0 KiB
Python
212 lines
8.0 KiB
Python
from flask import Flask
|
|
from flask import render_template
|
|
from flask import request, redirect
|
|
from werkzeug.utils import secure_filename
|
|
import time
|
|
import os
|
|
import cv2
|
|
import face_recognition
|
|
import time
|
|
import numpy as np
|
|
|
|
app = Flask(__name__)
|
|
app.config["IMAGE_UPLOADS"] = './upload-video/'
|
|
@app.route('/index')
|
|
@app.route('/')
|
|
def index():
|
|
return render_template("index.html")
|
|
|
|
|
|
@app.route('/upload', methods=["GET", "POST"])
|
|
def uploadVideo():
|
|
if request.method == 'POST':
|
|
if request.files:
|
|
video = request.files["video"]
|
|
timestr = time.strftime("%Y%m%d-%H%M%S")
|
|
filename = secure_filename(timestr) + ".mp4"
|
|
video.save(os.path.join(app.config["IMAGE_UPLOADS"], filename))
|
|
return redirect('/upload/ml?file=' + timestr)
|
|
else:
|
|
messages = "Missing the file"
|
|
return render_template("index.html", messages = messages)
|
|
else:
|
|
return render_template("index.html")
|
|
|
|
@app.route('/upload/ml', methods=["GET", "POST"])
|
|
def process():
|
|
fileName = request.args.get('file')
|
|
cap = cv2.VideoCapture('./upload-video/' + fileName +'.mp4')
|
|
length = 20
|
|
timestr = time.strftime("%Y%m%d-%H%M%S")
|
|
|
|
face_locations = []
|
|
face_encodings = []
|
|
detected_face = []
|
|
detected_face_img = []
|
|
frame_number = 0
|
|
|
|
save_image_count = 0
|
|
|
|
fourcc = cv2.VideoWriter_fourcc(*'x264')
|
|
output_movie = cv2.VideoWriter('./static/save-data/' + timestr + '.mp4', fourcc, length, (1280, 720))
|
|
while True:
|
|
# Grab a single frame of video
|
|
ret, frame = cap.read()
|
|
appendData = False
|
|
if not ret:
|
|
break
|
|
rgb_frame = frame[:, :, ::-1]
|
|
face_locations = face_recognition.face_locations(rgb_frame)
|
|
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
|
|
|
|
if(len(detected_face) == 0):
|
|
for face_encoding in face_encodings:
|
|
detected_face.append(face_encoding)
|
|
appendData = True
|
|
else:
|
|
print('else')
|
|
for face_encoding in face_encodings:
|
|
matchs = face_recognition.compare_faces(detected_face, face_encoding, tolerance=0.5)
|
|
if any(matchs) == False:
|
|
face_distances = face_recognition.face_distance(detected_face, face_encoding)
|
|
for face_distance in face_distances:
|
|
print(face_distance)
|
|
if face_distance > 0.65:
|
|
appendData = True
|
|
detected_face.append(face_encoding)
|
|
print("append")
|
|
|
|
|
|
for top, right, bottom, left in face_locations:
|
|
# Draw a box around the face
|
|
if appendData:
|
|
crop_img = frame[top:bottom, left:right]
|
|
save_image_count = save_image_count + 1
|
|
cv2.imwrite("./static/save-data/" + timestr + '-' + str(save_image_count)+".png", crop_img)
|
|
detected_face_img.append({"id": save_image_count, "url" : "/static/save-data/" + timestr + '-' + str(save_image_count)+".png"})
|
|
print('Save Image')
|
|
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0,
|
|
255), 2)
|
|
# Display the resulting image
|
|
output_movie.write(frame)
|
|
#cv2.imshow('Video', frame)
|
|
|
|
# Wait for Enter key to stop
|
|
return render_template("process.html", detected_face_img = detected_face_img, fileName = timestr)
|
|
|
|
@app.route('/upload/ml/render', methods=["POST"])
|
|
def render():
|
|
fileName = request.form.get('file')
|
|
print('ifle =' +fileName)
|
|
seletedFormFace = request.form.getlist('face')
|
|
print(seletedFormFace)
|
|
cap = cv2.VideoCapture('./upload-video/' + fileName +'.mp4')
|
|
length = 20
|
|
seletedFaces = []
|
|
detected_face = []
|
|
face_locations = []
|
|
face_encodings = []
|
|
return_seleted_img = []
|
|
detected_face_count = 0
|
|
|
|
|
|
for face in seletedFormFace:
|
|
# image = face_recognition.load_image_file("./static/save-data/" + fileName + '-' + face+".png")
|
|
# seletedFaces.append(face_recognition.face_encodings(image)[0])
|
|
seletedFaces.append(int(face) - 1)
|
|
return_seleted_img.append("/static/save-data/" + fileName + '-' + face+ ".png")
|
|
|
|
print(seletedFaces)
|
|
|
|
fourcc = cv2.VideoWriter_fourcc(*'x264')
|
|
output_movie = cv2.VideoWriter('./static/save-data/' + fileName + '-finish.mp4', fourcc, length, (1280, 720))
|
|
|
|
while True:
|
|
# Grab a single frame of video
|
|
ret, frame = cap.read()
|
|
match_check = False
|
|
if not ret:
|
|
break
|
|
rgb_frame = frame[:, :, ::-1]
|
|
face_locations = face_recognition.face_locations(rgb_frame)
|
|
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
|
|
match_list = []
|
|
if(len(detected_face) == 0):
|
|
for face_encoding in face_encodings:
|
|
detected_face.append(face_encoding)
|
|
detected_face_count = detected_face_count + 1
|
|
|
|
for face_encoding in face_encodings:
|
|
matchs = face_recognition.compare_faces(detected_face, face_encoding, tolerance=0.5)
|
|
if any(matchs) == False:
|
|
face_distances = face_recognition.face_distance(detected_face, face_encoding)
|
|
for face_distance in face_distances:
|
|
print(face_distance)
|
|
if face_distance > 0.65:
|
|
detected_face.append(face_encoding)
|
|
print('append')
|
|
detected_face_count = detected_face_count + 1
|
|
|
|
|
|
for face in detected_face:
|
|
matchs = face_recognition.compare_faces(face_encodings, face, tolerance=0.5)
|
|
match_count = 0
|
|
for match in matchs:
|
|
print(matchs)
|
|
if match == True and match_count in seletedFaces:
|
|
print('match')
|
|
print(match)
|
|
match_check = True
|
|
match_list.append(match_count)
|
|
print(match_count)
|
|
match_count = match_count + 1
|
|
|
|
|
|
#match_count = 0
|
|
#for match in matchs:
|
|
# print(matchs)
|
|
# if match == True:
|
|
# print('match')
|
|
# print(match)
|
|
# match_check = True
|
|
# match_list.append(match_count)
|
|
# print(match_count)
|
|
# match_count = match_count + 1
|
|
|
|
print(match_list)
|
|
if match_check == True:
|
|
location_count = 0
|
|
for top, right, bottom, left in face_locations:
|
|
print(match_list)
|
|
print(location_count)
|
|
|
|
if location_count in match_list:
|
|
print('loca')
|
|
print(location_count)
|
|
roi_color = rgb_frame[top:bottom, left:right]
|
|
# blur the colored image
|
|
blur = cv2.GaussianBlur(roi_color, (99,99), 30)
|
|
# Insert ROI back into image
|
|
rgb_frame[top:bottom, left:right] = blur
|
|
location_count = location_count + 1
|
|
# Draw a box around the face
|
|
|
|
# Display the resulting image
|
|
output_movie.write(frame)
|
|
#cv2.imshow('Video', frame)
|
|
|
|
# Wait for Enter key to stop
|
|
return render_template("render.html", detected_face_img = return_seleted_img, fileName = fileName)
|
|
|
|
|
|
@app.route('/upload/test')
|
|
def test():
|
|
detected_face_img = []
|
|
detected_face_img.append({"id":1, "url": "/static/save-data/20200507-032151-1.png"})
|
|
detected_face_img.append({"id":2, "url": "/static/save-data/20200507-032151-2.png"})
|
|
detected_face_img.append({"id":3, "url": "/static/save-data/20200507-032151-3.png"})
|
|
return render_template("process.html", detected_face_img = detected_face_img, fileName = '20200507-032151')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
app.run() |