Reduced unnecessary iteration.

This commit is contained in:
Emiliana 2020-08-10 15:42:18 +02:00
parent 76c04f3be5
commit 878c6b8833

View file

@ -699,44 +699,44 @@ class Tracker():
pts_3d[0:66] = (pts_3d[0:66].dot(self.inverse_camera.transpose()) - face_info.translation).dot(inverse_rotation.transpose()) pts_3d[0:66] = (pts_3d[0:66].dot(self.inverse_camera.transpose()) - face_info.translation).dot(inverse_rotation.transpose())
pnp_error = np.power(lms[0:17,0:2] - t_reference[0:17,0:2], 2).sum() pnp_error = np.power(lms[0:17,0:2] - t_reference[0:17,0:2], 2).sum()
pnp_error += np.power(lms[30,0:2] - t_reference[30,0:2], 2).sum() pnp_error += np.power(lms[30,0:2] - t_reference[30,0:2], 2).sum()
for i, pt in enumerate(face_info.face_3d): for i, pt in enumerate(face_info.face_3d[66:70]):
if i == 68: if i == 2:
# Right eyeball # Right eyeball
# Eyeballs have an average diameter of 12.5mm and and the distance between eye corners is 30-35mm, so a conversion factor of 0.385 can be applied # Eyeballs have an average diameter of 12.5mm and and the distance between eye corners is 30-35mm, so a conversion factor of 0.385 can be applied
eye_center = (pts_3d[36] + pts_3d[39]) / 2.0 eye_center = (pts_3d[36] + pts_3d[39]) / 2.0
d_corner = np.linalg.norm(pts_3d[36] - pts_3d[39]) d_corner = np.linalg.norm(pts_3d[36] - pts_3d[39])
depth = 0.385 * d_corner depth = 0.385 * d_corner
pt_3d = np.array([eye_center[0], eye_center[1], eye_center[2] - depth]) pt_3d = np.array([eye_center[0], eye_center[1], eye_center[2] - depth])
pts_3d[i] = pt_3d pts_3d[68] = pt_3d
continue continue
if i == 69: if i == 3:
# Left eyeball # Left eyeball
eye_center = (pts_3d[42] + pts_3d[45]) / 2.0 eye_center = (pts_3d[42] + pts_3d[45]) / 2.0
d_corner = np.linalg.norm(pts_3d[42] - pts_3d[45]) d_corner = np.linalg.norm(pts_3d[42] - pts_3d[45])
depth = 0.385 * d_corner depth = 0.385 * d_corner
pt_3d = np.array([eye_center[0], eye_center[1], eye_center[2] - depth]) pt_3d = np.array([eye_center[0], eye_center[1], eye_center[2] - depth])
pts_3d[i] = pt_3d pts_3d[69] = pt_3d
continue continue
if i == 66: if i == 0:
d1 = np.linalg.norm(lms[i,0:2] - lms[36,0:2]) d1 = np.linalg.norm(lms[66,0:2] - lms[36,0:2])
d2 = np.linalg.norm(lms[i,0:2] - lms[39,0:2]) d2 = np.linalg.norm(lms[66,0:2] - lms[39,0:2])
d = d1 + d2 d = d1 + d2
pt = (pts_3d[36] * d1 + pts_3d[39] * d2) / d pt = (pts_3d[36] * d1 + pts_3d[39] * d2) / d
if i == 67: if i == 1:
d1 = np.linalg.norm(lms[i,0:2] - lms[42,0:2]) d1 = np.linalg.norm(lms[67,0:2] - lms[42,0:2])
d2 = np.linalg.norm(lms[i,0:2] - lms[45,0:2]) d2 = np.linalg.norm(lms[67,0:2] - lms[45,0:2])
d = d1 + d2 d = d1 + d2
pt = (pts_3d[42] * d1 + pts_3d[45] * d2) / d pt = (pts_3d[42] * d1 + pts_3d[45] * d2) / d
if i == 66 or i == 67: if i < 2:
reference = rmat.dot(pt) reference = rmat.dot(pt)
reference = reference + face_info.translation reference = reference + face_info.translation
reference = self.camera.dot(reference) reference = self.camera.dot(reference)
depth = reference[2] depth = reference[2]
pt_3d = np.array([lms[i][0] * depth, lms[i][1] * depth, depth], np.float32) pt_3d = np.array([lms[66+i][0] * depth, lms[66+i][1] * depth, depth], np.float32)
pt_3d = self.inverse_camera.dot(pt_3d) pt_3d = self.inverse_camera.dot(pt_3d)
pt_3d = pt_3d - face_info.translation pt_3d = pt_3d - face_info.translation
pt_3d = inverse_rotation.dot(pt_3d) pt_3d = inverse_rotation.dot(pt_3d)
pts_3d[i,:] = pt_3d[:] pts_3d[66+i,:] = pt_3d[:]
pnp_error = np.sqrt(pnp_error / (2.0 * image_pts.shape[0])) pnp_error = np.sqrt(pnp_error / (2.0 * image_pts.shape[0]))
if pnp_error > 300: if pnp_error > 300: