more changes to work with single face operation
This commit is contained in:
parent
26ae37e79d
commit
797e5c2d56
2 changed files with 12 additions and 20 deletions
|
|
@ -51,10 +51,10 @@ class FaceDetector():
|
||||||
return []
|
return []
|
||||||
|
|
||||||
r = outputs[1, y, x] * 112.
|
r = outputs[1, y, x] * 112.
|
||||||
results= [(((x * 4) - r, (y * 4) - r, r*2,r*2))]
|
results= (((x * 4) - r, (y * 4) - r, r*2,r*2))
|
||||||
results = np.array(results).astype(np.float32)
|
results = np.array(results).astype(np.float32)
|
||||||
results[:, [0,2]] *= frame.shape[1] / 224.
|
results[ [0,2]] *= frame.shape[1] / 224.
|
||||||
results[:, [1,3]] *= frame.shape[0] / 224.
|
results[ [1,3]] *= frame.shape[0] / 224.
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def resizeImage(self, frame):
|
def resizeImage(self, frame):
|
||||||
|
|
|
||||||
26
tracker.py
26
tracker.py
|
|
@ -41,8 +41,7 @@ class Tracker():
|
||||||
self.height = height
|
self.height = height
|
||||||
|
|
||||||
self.threshold = threshold
|
self.threshold = threshold
|
||||||
|
self.face = None
|
||||||
self.faces = []
|
|
||||||
self.face_info = [face.FaceInfo(0, self, featureType)]
|
self.face_info = [face.FaceInfo(0, self, featureType)]
|
||||||
self.messageQueue = messageQueue
|
self.messageQueue = messageQueue
|
||||||
|
|
||||||
|
|
@ -81,39 +80,32 @@ class Tracker():
|
||||||
|
|
||||||
def early_exit(self, reason, start):
|
def early_exit(self, reason, start):
|
||||||
self.messageQueue.put(reason)
|
self.messageQueue.put(reason)
|
||||||
self.faces = []
|
self.face = None
|
||||||
duration = (time.perf_counter() - start) * 1000
|
duration = (time.perf_counter() - start) * 1000
|
||||||
self.messageQueue.put(f"Took {duration:.2f}ms")
|
self.messageQueue.put(f"Took {duration:.2f}ms")
|
||||||
return None, None, None
|
return None, None, None
|
||||||
|
|
||||||
def predict(self, frame, face = None):
|
def predict(self, frame):
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
duration_fd = 0.0
|
duration_fd = 0.0
|
||||||
duration_pp = 0.0
|
duration_pp = 0.0
|
||||||
duration_model = 0.0
|
duration_model = 0.0
|
||||||
duration_pnp = 0.0
|
duration_pnp = 0.0
|
||||||
|
|
||||||
new_faces = []
|
if self.face is None:
|
||||||
new_faces.extend(self.faces)
|
|
||||||
if face is not None:
|
|
||||||
new_faces.append(face)
|
|
||||||
|
|
||||||
if len(new_faces) < 1:
|
|
||||||
start_fd = time.perf_counter()
|
start_fd = time.perf_counter()
|
||||||
new_faces.extend(self.FaceDetector.detect_faces(frame))
|
self.face = self.FaceDetector.detect_faces(frame)
|
||||||
duration_fd = 1000 * (time.perf_counter() - start_fd)
|
duration_fd = 1000 * (time.perf_counter() - start_fd)
|
||||||
if len(new_faces) < 1:
|
if self.face is None:
|
||||||
return self.early_exit("No faces found", start)
|
return self.early_exit("No faces found", start)
|
||||||
|
|
||||||
crop, crop_info, duration_pp = self.cropFace(new_faces[0], frame)
|
crop, crop_info, duration_pp = self.cropFace(self.face, frame)
|
||||||
|
|
||||||
#Early exit if crop fails, If the crop fails there's nothing to track
|
#Early exit if crop fails, If the crop fails there's nothing to track
|
||||||
if crop is None:
|
if crop is None:
|
||||||
return self.early_exit("No valid crops", start)
|
return self.early_exit("No valid crops", start)
|
||||||
|
|
||||||
start_model = time.perf_counter()
|
start_model = time.perf_counter()
|
||||||
#self.Landmarks
|
|
||||||
|
|
||||||
conf, lms = self.Landmarks.run(crop , crop_info )
|
conf, lms = self.Landmarks.run(crop , crop_info )
|
||||||
#Early exit if below confidence threshold
|
#Early exit if below confidence threshold
|
||||||
if conf < self.threshold:
|
if conf < self.threshold:
|
||||||
|
|
@ -135,7 +127,7 @@ class Tracker():
|
||||||
lms = face_info.lms[:, 0:2]
|
lms = face_info.lms[:, 0:2]
|
||||||
x1, y1 = lms[0:66].min(0)
|
x1, y1 = lms[0:66].min(0)
|
||||||
x2, y2 = lms[0:66].max(0)
|
x2, y2 = lms[0:66].max(0)
|
||||||
self.faces = [[y1, x1, y2 - y1, x2 - x1]]
|
self.face = [y1, x1, y2 - y1, x2 - x1]
|
||||||
duration_pnp += 1000 * (time.perf_counter() - start_pnp)
|
duration_pnp += 1000 * (time.perf_counter() - start_pnp)
|
||||||
duration = (time.perf_counter() - start) * 1000
|
duration = (time.perf_counter() - start) * 1000
|
||||||
self.messageQueue.put(f"Took {duration:.2f}ms (detect: {duration_fd:.2f}ms, crop: {duration_pp:.2f}ms, track: {duration_model:.2f}ms, 3D points: {duration_pnp:.2f}ms)")
|
self.messageQueue.put(f"Took {duration:.2f}ms (detect: {duration_fd:.2f}ms, crop: {duration_pp:.2f}ms, track: {duration_model:.2f}ms, 3D points: {duration_pnp:.2f}ms)")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue