Face/recognition_video.py

284 lines
12 KiB
Python
Raw Permalink Normal View History

2024-07-29 11:24:25 +08:00
import time
from centerface import CenterFace
from skimage import transform as trans
import numpy as np
import torch
import cv2
from backbones import iresnet100, iresnet18
from create_database import findOne, load_npy,findAll
from PIL import Image, ImageDraw,ImageFont
def show():
cap = cv2.VideoCapture("test.mp4")
ret, frame = cap.read()
h, w = frame.shape[:2]
centerface = CenterFace()
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter('ccvt6.mp4', cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), 30, size)
while ret:
start_time = time.time()
dets, lms = centerface(frame, h, w, threshold=0.35)
end_time = time.time()
print("findOne time: " + str(end_time - start_time))
for det in dets:
boxes, score = det[:4], det[4]
cv2.rectangle(frame, (int(boxes[0]), int(boxes[1])), (int(boxes[2]), int(boxes[3])), (2, 255, 0), 1)
for lm in lms:
for i in range(0, 5):
cv2.circle(frame, (int(lm[i * 2]), int(lm[i * 2 + 1])), 2, (0, 0, 255), -1)
cv2.imshow('out', frame)
out.write(frame)
# Press Q on keyboard to stop recording
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ret, frame = cap.read()
cap.release()
out.release()
cv2.destroyAllWindows()
def video():
model = iresnet100()
model.load_state_dict(torch.load("./model/backbone100.pth", map_location="cpu"))
model.eval()
k_v = load_npy("student.npy")
count = 0
#cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8")
cap = cv2.VideoCapture("software.mp4")
ret, frame = cap.read()
h, w = frame.shape[:2]
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter('ttt.mp4', cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, size)
centerface = CenterFace()
while ret:
start_time = time.time()
dets, lms = centerface(frame, h, w, threshold=0.35)
end_time = time.time()
print("detectOneframe time: " + str(end_time - start_time))
face_list = []
name_list = []
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
img_w = int(boxes[2] - boxes[0])
img_h = int(boxes[3] - boxes[1])
distace = int(abs(img_w - img_h) / 2)
img_w1 = int(boxes[0]) - distace
img_w2 = int(boxes[2]) + distace
# print(img_w,img_h,distace,max_hw)
if img_w <= img_h and img_w1 >= 0 and img_w2 <= frame.shape[1]:
img112 = frame[int(boxes[1]):int(boxes[3]), img_w1:img_w2, :]
img112 = cv2.resize(img112, (112, 112))
# cv2.imwrite("./img/man"+str(count)+".jpg", img112)
# count += 1
face_list.append(img112)
else:
img112 = frame[int(boxes[1]):int(boxes[3]), int(boxes[0]):int(boxes[2]), :]
img112 = cv2.resize(img112, (112, 112))
face_list.append(img112)
if len(face_list) != 0:
face_list = np.array(face_list)
face_list = face_list.transpose((0,3,1,2))
face_list = np.array(face_list, dtype=np.float32)
face_list -= 127.5
face_list /= 127.5
print(face_list.shape)
face_list = torch.from_numpy(face_list)
start_time = time.time()
for face in face_list:
face = face[np.newaxis, :, :, :]
name_list.append(findOne(face,model,k_v))
end_time = time.time()
print("findOneframe time: "+str(end_time-start_time))
img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_PIL)
font = ImageFont.truetype("font.ttf",12)
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
# cv2.rectangle(frame, (int(boxes[0]), int(boxes[1])), (int(boxes[2]), int(boxes[3])), (2, 255, 0), 1)
# cv2.putText(frame, name_list[i], (int(boxes[0]), int(boxes[1])), cv2.FONT_HERSHEY_COMPLEX, 0.4,
# (0, 225, 255), 1)
name = name_list[i][:3]
if not isinstance(name, np.unicode):
name = name.decode('utf8')
draw.text((int(boxes[0]), int(boxes[1])),name,fill=(0, 225, 255),font=font)
draw.rectangle((int(boxes[0]), int(boxes[1]),int(boxes[2]), int(boxes[3])),outline="green",width=1)
frame = cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR)
cv2.imshow('out', frame)
out.write(frame)
# Press Q on keyboard to stop recording
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ret, frame = cap.read()
cap.release()
out.release()
cv2.destroyAllWindows()
def video_GPU():
model = iresnet100()
model.load_state_dict(torch.load("./model/backbone100.pth", map_location="cpu"))
model.eval()
k_v = load_npy("student.npy")
count = 0
#cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8")
cap = cv2.VideoCapture("software.mp4")
ret, frame = cap.read()
h, w = frame.shape[:2]
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter('ttt.mp4', cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, size)
centerface = CenterFace()
while ret:
start_time = time.time()
dets, lms = centerface(frame, h, w, threshold=0.35)
end_time = time.time()
print("detectOneframe time: " + str(end_time - start_time))
face_list = []
name_list = []
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
img_w = int(boxes[2] - boxes[0])
img_h = int(boxes[3] - boxes[1])
distace = int(abs(img_w - img_h) / 2)
img_w1 = int(boxes[0]) - distace
img_w2 = int(boxes[2]) + distace
# print(img_w,img_h,distace,max_hw)
if img_w <= img_h and img_w1 >= 0 and img_w2 <= frame.shape[1]:
img112 = frame[int(boxes[1]):int(boxes[3]), img_w1:img_w2, :]
img112 = cv2.resize(img112, (112, 112))
# cv2.imwrite("./img/man"+str(count)+".jpg", img112)
# count += 1
face_list.append(img112)
else:
img112 = frame[int(boxes[1]):int(boxes[3]), int(boxes[0]):int(boxes[2]), :]
img112 = cv2.resize(img112, (112, 112))
face_list.append(img112)
if len(face_list) != 0:
face_list = np.array(face_list)
face_list = face_list.transpose((0,3,1,2))
face_list = np.array(face_list, dtype=np.float32)
face_list -= 127.5
face_list /= 127.5
print(face_list.shape)
face_list = torch.from_numpy(face_list)
start_time = time.time()
name_list = findAll(face_list, model, k_v)
# for face in face_list:
# face = face[np.newaxis, :, :, :]
#
# name_list.append(findOne(face,model,k_v))
end_time = time.time()
print("findOneframe time: "+str(end_time-start_time))
img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_PIL)
font = ImageFont.truetype("font.ttf",18)
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
# cv2.rectangle(frame, (int(boxes[0]), int(boxes[1])), (int(boxes[2]), int(boxes[3])), (2, 255, 0), 1)
# cv2.putText(frame, name_list[i], (int(boxes[0]), int(boxes[1])), cv2.FONT_HERSHEY_COMPLEX, 0.4,
# (0, 225, 255), 1)
name = name_list[i][:3]
if not isinstance(name, np.unicode):
name = name.decode('utf8')
draw.text((int(boxes[0]), int(boxes[1])),name,fill=(255, 0, 0),font=font)
draw.rectangle((int(boxes[0]), int(boxes[1]),int(boxes[2]), int(boxes[3])),outline="green",width=2)
frame = cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR)
cv2.imshow('out', frame)
out.write(frame)
# Press Q on keyboard to stop recording
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ret, frame = cap.read()
cap.release()
out.release()
cv2.destroyAllWindows()
def video_GPU_retinaface():
model = iresnet100()
model.load_state_dict(torch.load("./model/backbone100.pth", map_location="cpu"))
model.eval()
k_v = load_npy("student.npy")
count = 0
#cap = cv2.VideoCapture("http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8")
cap = cv2.VideoCapture("software.mp4")
ret, frame = cap.read()
h, w = frame.shape[:2]
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = cap.get(cv2.CAP_PROP_FPS)
out = cv2.VideoWriter('ttt.mp4', cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, size)
centerface = CenterFace()
while ret:
start_time = time.time()
dets, lms = centerface(frame, h, w, threshold=0.35)
end_time = time.time()
print("detectOneframe time: " + str(end_time - start_time))
face_list = []
name_list = []
print(dets.shape)
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
img_w = int(boxes[2] - boxes[0])
img_h = int(boxes[3] - boxes[1])
distace = int(abs(img_w - img_h) / 2)
img_w1 = int(boxes[0]) - distace
img_w2 = int(boxes[2]) + distace
# print(img_w,img_h,distace,max_hw)
if img_w <= img_h and img_w1 >= 0 and img_w2 <= frame.shape[1]:
img112 = frame[int(boxes[1]):int(boxes[3]), img_w1:img_w2, :]
img112 = cv2.resize(img112, (112, 112))
# cv2.imwrite("./img/man"+str(count)+".jpg", img112)
# count += 1
face_list.append(img112)
else:
img112 = frame[int(boxes[1]):int(boxes[3]), int(boxes[0]):int(boxes[2]), :]
img112 = cv2.resize(img112, (112, 112))
face_list.append(img112)
if len(face_list) != 0:
face_list = np.array(face_list)
face_list = face_list.transpose((0,3,1,2))
face_list = np.array(face_list, dtype=np.float32)
face_list -= 127.5
face_list /= 127.5
print(face_list.shape)
face_list = torch.from_numpy(face_list)
start_time = time.time()
name_list = findAll(face_list, model, k_v)
# for face in face_list:
# face = face[np.newaxis, :, :, :]
#
# name_list.append(findOne(face,model,k_v))
end_time = time.time()
print("findOneframe time: "+str(end_time-start_time))
img_PIL = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_PIL)
font = ImageFont.truetype("font.ttf",18)
for i,det in enumerate(dets):
boxes, score = det[:4], det[4]
# cv2.rectangle(frame, (int(boxes[0]), int(boxes[1])), (int(boxes[2]), int(boxes[3])), (2, 255, 0), 1)
# cv2.putText(frame, name_list[i], (int(boxes[0]), int(boxes[1])), cv2.FONT_HERSHEY_COMPLEX, 0.4,
# (0, 225, 255), 1)
name = name_list[i][:3]
if not isinstance(name, np.unicode):
name = name.decode('utf8')
draw.text((int(boxes[0]), int(boxes[1])),name,fill=(255, 0, 0),font=font)
draw.rectangle((int(boxes[0]), int(boxes[1]),int(boxes[2]), int(boxes[3])),outline="green",width=2)
frame = cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR)
cv2.imshow('out', frame)
out.write(frame)
# Press Q on keyboard to stop recording
if cv2.waitKey(1) & 0xFF == ord('q'):
break
ret, frame = cap.read()
cap.release()
out.release()
cv2.destroyAllWindows()
video_GPU_retinaface()
#video_GPU()
#show()