Owleye / codes /base /face_geometry.py
owleyetracker's picture
Upload 45 files
b4c5d36 verified
# Many parts taken from the cpp implementation from github.com/google/mediapipe
#
# Copyright 2020 The MediaPipe Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import numpy as np
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]
class Debugger(metaclass=Singleton):
def set_debug(self, debug):
self.debug = debug
def toggle(self):
self.debug = not self.debug
def get_debug(self):
return self.debug
DEBUG = Debugger()
DEBUG.set_debug(False)
class PCF:
def __init__(
self,
near=1,
far=10000,
frame_height=1920,
frame_width=1080,
fy=1074.520446598223,
):
self.near = near
self.far = far
self.frame_height = frame_height
self.frame_width = frame_width
self.fy = fy
fov_y = 2 * np.arctan(frame_height / (2 * fy))
# kDegreesToRadians = np.pi / 180.0 # never used
height_at_near = 2 * near * np.tan(0.5 * fov_y)
width_at_near = frame_width * height_at_near / frame_height
# print(height_at_near)
self.fov_y = fov_y
self.left = -0.5 * width_at_near
self.right = 0.5 * width_at_near
self.bottom = -0.5 * height_at_near
self.top = 0.5 * height_at_near
canonical_metric_landmarks = np.array(
[
0.000000,
-3.406404,
5.979507,
0.499977,
0.652534,
0.000000,
-1.126865,
7.475604,
0.500026,
0.547487,
0.000000,
-2.089024,
6.058267,
0.499974,
0.602372,
-0.463928,
0.955357,
6.633583,
0.482113,
0.471979,
0.000000,
-0.463170,
7.586580,
0.500151,
0.527156,
0.000000,
0.365669,
7.242870,
0.499910,
0.498253,
0.000000,
2.473255,
5.788627,
0.499523,
0.401062,
-4.253081,
2.577646,
3.279702,
0.289712,
0.380764,
0.000000,
4.019042,
5.284764,
0.499955,
0.312398,
0.000000,
4.885979,
5.385258,
0.499987,
0.269919,
0.000000,
8.261778,
4.481535,
0.500023,
0.107050,
0.000000,
-3.706811,
5.864924,
0.500023,
0.666234,
0.000000,
-3.918301,
5.569430,
0.500016,
0.679224,
0.000000,
-3.994436,
5.219482,
0.500023,
0.692348,
0.000000,
-4.542400,
5.404754,
0.499977,
0.695278,
0.000000,
-4.745577,
5.529457,
0.499977,
0.705934,
0.000000,
-5.019567,
5.601448,
0.499977,
0.719385,
0.000000,
-5.365123,
5.535441,
0.499977,
0.737019,
0.000000,
-6.149624,
5.071372,
0.499968,
0.781371,
0.000000,
-1.501095,
7.112196,
0.499816,
0.562981,
-0.416106,
-1.466449,
6.447657,
0.473773,
0.573910,
-7.087960,
5.434801,
0.099620,
0.104907,
0.254141,
-2.628639,
2.035898,
3.848121,
0.365930,
0.409576,
-3.198363,
1.985815,
3.796952,
0.338758,
0.413025,
-3.775151,
2.039402,
3.646194,
0.311120,
0.409460,
-4.465819,
2.422950,
3.155168,
0.274658,
0.389131,
-2.164289,
2.189867,
3.851822,
0.393362,
0.403706,
-3.208229,
3.223926,
4.115822,
0.345234,
0.344011,
-2.673803,
3.205337,
4.092203,
0.370094,
0.346076,
-3.745193,
3.165286,
3.972409,
0.319322,
0.347265,
-4.161018,
3.059069,
3.719554,
0.297903,
0.353591,
-5.062006,
1.934418,
2.776093,
0.247792,
0.410810,
-2.266659,
-7.425768,
4.389812,
0.396889,
0.842755,
-4.445859,
2.663991,
3.173422,
0.280098,
0.375600,
-7.214530,
2.263009,
0.073150,
0.106310,
0.399956,
-5.799793,
2.349546,
2.204059,
0.209925,
0.391353,
-2.844939,
-0.720868,
4.433130,
0.355808,
0.534406,
-0.711452,
-3.329355,
5.877044,
0.471751,
0.650404,
-0.606033,
-3.924562,
5.444923,
0.474155,
0.680192,
-1.431615,
-3.500953,
5.496189,
0.439785,
0.657229,
-1.914910,
-3.803146,
5.028930,
0.414617,
0.666541,
-1.131043,
-3.973937,
5.189648,
0.450374,
0.680861,
-1.563548,
-4.082763,
4.842263,
0.428771,
0.682691,
-2.650112,
-5.003649,
4.188483,
0.374971,
0.727805,
-0.427049,
-1.094134,
7.360529,
0.486717,
0.547629,
-0.496396,
-0.475659,
7.440358,
0.485301,
0.527395,
-5.253307,
3.881582,
3.363159,
0.257765,
0.314490,
-1.718698,
0.974609,
4.558359,
0.401223,
0.455172,
-1.608635,
-0.942516,
5.814193,
0.429819,
0.548615,
-1.651267,
-0.610868,
5.581319,
0.421352,
0.533741,
-4.765501,
-0.701554,
3.534632,
0.276896,
0.532057,
-0.478306,
0.295766,
7.101013,
0.483370,
0.499587,
-3.734964,
4.508230,
4.550454,
0.337212,
0.282883,
-4.588603,
4.302037,
4.048484,
0.296392,
0.293243,
-6.279331,
6.615427,
1.425850,
0.169295,
0.193814,
-1.220941,
4.142165,
5.106035,
0.447580,
0.302610,
-2.193489,
3.100317,
4.000575,
0.392390,
0.353888,
-3.102642,
-4.352984,
4.095905,
0.354490,
0.696784,
-6.719682,
-4.788645,
-1.745401,
0.067305,
0.730105,
-1.193824,
-1.306795,
5.737747,
0.442739,
0.572826,
-0.729766,
-1.593712,
5.833208,
0.457098,
0.584792,
-2.456206,
-4.342621,
4.283884,
0.381974,
0.694711,
-2.204823,
-4.304508,
4.162499,
0.392389,
0.694203,
-4.985894,
4.802461,
3.751977,
0.277076,
0.271932,
-1.592294,
-1.257709,
5.456949,
0.422552,
0.563233,
-2.644548,
4.524654,
4.921559,
0.385919,
0.281364,
-2.760292,
5.100971,
5.015990,
0.383103,
0.255840,
-3.523964,
8.005976,
3.729163,
0.331431,
0.119714,
-5.599763,
5.715470,
2.724259,
0.229924,
0.232003,
-3.063932,
6.566144,
4.529981,
0.364501,
0.189114,
-5.720968,
4.254584,
2.830852,
0.229622,
0.299541,
-6.374393,
4.785590,
1.591691,
0.173287,
0.278748,
-0.672728,
-3.688016,
5.737804,
0.472879,
0.666198,
-1.262560,
-3.787691,
5.417779,
0.446828,
0.668527,
-1.732553,
-3.952767,
5.000579,
0.422762,
0.673890,
-1.043625,
-1.464973,
5.662455,
0.445308,
0.580066,
-2.321234,
-4.329069,
4.258156,
0.388103,
0.693961,
-2.056846,
-4.477671,
4.520883,
0.403039,
0.706540,
-2.153084,
-4.276322,
4.038093,
0.403629,
0.693953,
-0.946874,
-1.035249,
6.512274,
0.460042,
0.557139,
-1.469132,
-4.036351,
4.604908,
0.431158,
0.692366,
-1.024340,
-3.989851,
4.926693,
0.452182,
0.692366,
-0.533422,
-3.993222,
5.138202,
0.475387,
0.692366,
-0.769720,
-6.095394,
4.985883,
0.465828,
0.779190,
-0.699606,
-5.291850,
5.448304,
0.472329,
0.736226,
-0.669687,
-4.949770,
5.509612,
0.473087,
0.717857,
-0.630947,
-4.695101,
5.449371,
0.473122,
0.704626,
-0.583218,
-4.517982,
5.339869,
0.473033,
0.695278,
-1.537170,
-4.423206,
4.745470,
0.427942,
0.695278,
-1.615600,
-4.475942,
4.813632,
0.426479,
0.703540,
-1.729053,
-4.618680,
4.854463,
0.423162,
0.711846,
-1.838624,
-4.828746,
4.823737,
0.418309,
0.720063,
-2.368250,
-3.106237,
4.868096,
0.390095,
0.639573,
-7.542244,
-1.049282,
-2.431321,
0.013954,
0.560034,
0.000000,
-1.724003,
6.601390,
0.499914,
0.580147,
-1.826614,
-4.399531,
4.399021,
0.413200,
0.695400,
-1.929558,
-4.411831,
4.497052,
0.409626,
0.701823,
-0.597442,
-2.013686,
5.866456,
0.468080,
0.601535,
-1.405627,
-1.714196,
5.241087,
0.422729,
0.585985,
-0.662449,
-1.819321,
5.863759,
0.463080,
0.593784,
-2.342340,
0.572222,
4.294303,
0.372120,
0.473414,
-3.327324,
0.104863,
4.113860,
0.334562,
0.496073,
-1.726175,
-0.919165,
5.273355,
0.411671,
0.546965,
-5.133204,
7.485602,
2.660442,
0.242176,
0.147676,
-4.538641,
6.319907,
3.683424,
0.290777,
0.201446,
-3.986562,
5.109487,
4.466315,
0.327338,
0.256527,
-2.169681,
-5.440433,
4.455874,
0.399510,
0.748921,
-1.395634,
5.011963,
5.316032,
0.441728,
0.261676,
-1.619500,
6.599217,
4.921106,
0.429765,
0.187834,
-1.891399,
8.236377,
4.274997,
0.412198,
0.108901,
-4.195832,
2.235205,
3.375099,
0.288955,
0.398952,
-5.733342,
1.411738,
2.431726,
0.218937,
0.435411,
-1.859887,
2.355757,
3.843181,
0.412782,
0.398970,
-4.988612,
3.074654,
3.083858,
0.257135,
0.355440,
-1.303263,
1.416453,
4.831091,
0.427685,
0.437961,
-1.305757,
-0.672779,
6.415959,
0.448340,
0.536936,
-6.465170,
0.937119,
1.689873,
0.178560,
0.457554,
-5.258659,
0.945811,
2.974312,
0.247308,
0.457194,
-4.432338,
0.722096,
3.522615,
0.286267,
0.467675,
-3.300681,
0.861641,
3.872784,
0.332828,
0.460712,
-2.430178,
1.131492,
4.039035,
0.368756,
0.447207,
-1.820731,
1.467954,
4.224124,
0.398964,
0.432655,
-0.563221,
2.307693,
5.566789,
0.476410,
0.405806,
-6.338145,
-0.529279,
1.881175,
0.189241,
0.523924,
-5.587698,
3.208071,
2.687839,
0.228962,
0.348951,
-0.242624,
-1.462857,
7.071491,
0.490726,
0.562401,
-1.611251,
0.339326,
4.895421,
0.404670,
0.485133,
-7.743095,
2.364999,
-2.005167,
0.019469,
0.401564,
-1.391142,
1.851048,
4.448999,
0.426243,
0.420431,
-1.785794,
-0.978284,
4.850470,
0.396993,
0.548797,
-4.670959,
2.664461,
3.084075,
0.266470,
0.376977,
-1.333970,
-0.283761,
6.097047,
0.439121,
0.518958,
-7.270895,
-2.890917,
-2.252455,
0.032314,
0.644357,
-1.856432,
2.585245,
3.757904,
0.419054,
0.387155,
-0.923388,
0.073076,
6.671944,
0.462783,
0.505747,
-5.000589,
-6.135128,
1.892523,
0.238979,
0.779745,
-5.085276,
-7.178590,
0.714711,
0.198221,
0.831938,
-7.159291,
-0.811820,
-0.072044,
0.107550,
0.540755,
-5.843051,
-5.248023,
0.924091,
0.183610,
0.740257,
-6.847258,
3.662916,
0.724695,
0.134410,
0.333683,
-2.412942,
-8.258853,
4.119213,
0.385764,
0.883154,
-0.179909,
-1.689864,
6.573301,
0.490967,
0.579378,
-2.103655,
-0.163946,
4.566119,
0.382385,
0.508573,
-6.407571,
2.236021,
1.560843,
0.174399,
0.397671,
-3.670075,
2.360153,
3.635230,
0.318785,
0.396235,
-3.177186,
2.294265,
3.775704,
0.343364,
0.400597,
-2.196121,
-4.598322,
4.479786,
0.396100,
0.710217,
-6.234883,
-1.944430,
1.663542,
0.187885,
0.588538,
-1.292924,
-9.295920,
4.094063,
0.430987,
0.944065,
-3.210651,
-8.533278,
2.802001,
0.318993,
0.898285,
-4.068926,
-7.993109,
1.925119,
0.266248,
0.869701,
0.000000,
6.545390,
5.027311,
0.500023,
0.190576,
0.000000,
-9.403378,
4.264492,
0.499977,
0.954453,
-2.724032,
2.315802,
3.777151,
0.366170,
0.398822,
-2.288460,
2.398891,
3.697603,
0.393207,
0.395537,
-1.998311,
2.496547,
3.689148,
0.410373,
0.391080,
-6.130040,
3.399261,
2.038516,
0.194993,
0.342102,
-2.288460,
2.886504,
3.775031,
0.388665,
0.362284,
-2.724032,
2.961810,
3.871767,
0.365962,
0.355971,
-3.177186,
2.964136,
3.876973,
0.343364,
0.355357,
-3.670075,
2.927714,
3.724325,
0.318785,
0.358340,
-4.018389,
2.857357,
3.482983,
0.301415,
0.363156,
-7.555811,
4.106811,
-0.991917,
0.058133,
0.319076,
-4.018389,
2.483695,
3.440898,
0.301415,
0.387449,
0.000000,
-2.521945,
5.932265,
0.499988,
0.618434,
-1.776217,
-2.683946,
5.213116,
0.415838,
0.624196,
-1.222237,
-1.182444,
5.952465,
0.445682,
0.566077,
-0.731493,
-2.536683,
5.815343,
0.465844,
0.620641,
0.000000,
3.271027,
5.236015,
0.499923,
0.351524,
-4.135272,
-6.996638,
2.671970,
0.288719,
0.819946,
-3.311811,
-7.660815,
3.382963,
0.335279,
0.852820,
-1.313701,
-8.639995,
4.702456,
0.440512,
0.902419,
-5.940524,
-6.223629,
-0.631468,
0.128294,
0.791941,
-1.998311,
2.743838,
3.744030,
0.408772,
0.373894,
-0.901447,
1.236992,
5.754256,
0.455607,
0.451801,
0.000000,
-8.765243,
4.891441,
0.499877,
0.908990,
-2.308977,
-8.974196,
3.609070,
0.375437,
0.924192,
-6.954154,
-2.439843,
-0.131163,
0.114210,
0.615022,
-1.098819,
-4.458788,
5.120727,
0.448662,
0.695278,
-1.181124,
-4.579996,
5.189564,
0.448020,
0.704632,
-1.255818,
-4.787901,
5.237051,
0.447112,
0.715808,
-1.325085,
-5.106507,
5.205010,
0.444832,
0.730794,
-1.546388,
-5.819392,
4.757893,
0.430012,
0.766809,
-1.953754,
-4.183892,
4.431713,
0.406787,
0.685673,
-2.117802,
-4.137093,
4.555096,
0.400738,
0.681069,
-2.285339,
-4.051196,
4.582438,
0.392400,
0.677703,
-2.850160,
-3.665720,
4.484994,
0.367856,
0.663919,
-5.278538,
-2.238942,
2.861224,
0.247923,
0.601333,
-0.946709,
1.907628,
5.196779,
0.452770,
0.420850,
-1.314173,
3.104912,
4.231404,
0.436392,
0.359887,
-1.780000,
2.860000,
3.881555,
0.416164,
0.368714,
-1.845110,
-4.098880,
4.247264,
0.413386,
0.692366,
-5.436187,
-4.030482,
2.109852,
0.228018,
0.683572,
-0.766444,
3.182131,
4.861453,
0.468268,
0.352671,
-1.938616,
-6.614410,
4.521085,
0.411362,
0.804327,
0.000000,
1.059413,
6.774605,
0.499989,
0.469825,
-0.516573,
1.583572,
6.148363,
0.479154,
0.442654,
0.000000,
1.728369,
6.316750,
0.499974,
0.439637,
-1.246815,
0.230297,
5.681036,
0.432112,
0.493589,
0.000000,
-7.942194,
5.181173,
0.499886,
0.866917,
0.000000,
-6.991499,
5.153478,
0.499913,
0.821729,
-0.997827,
-6.930921,
4.979576,
0.456549,
0.819201,
-3.288807,
-5.382514,
3.795752,
0.344549,
0.745439,
-2.311631,
-1.566237,
4.590085,
0.378909,
0.574010,
-2.680250,
-6.111567,
4.096152,
0.374293,
0.780185,
-3.832928,
-1.537326,
4.137731,
0.319688,
0.570738,
-2.961860,
-2.274215,
4.440943,
0.357155,
0.604270,
-4.386901,
-2.683286,
3.643886,
0.295284,
0.621581,
-1.217295,
-7.834465,
4.969286,
0.447750,
0.862477,
-1.542374,
-0.136843,
5.201008,
0.410986,
0.508723,
-3.878377,
-6.041764,
3.311079,
0.313951,
0.775308,
-3.084037,
-6.809842,
3.814195,
0.354128,
0.812553,
-3.747321,
-4.503545,
3.726453,
0.324548,
0.703993,
-6.094129,
-3.205991,
1.473482,
0.189096,
0.646300,
-4.588995,
-4.728726,
2.983221,
0.279777,
0.714658,
-6.583231,
-3.941269,
0.070268,
0.133823,
0.682701,
-3.492580,
-3.195820,
4.130198,
0.336768,
0.644733,
-1.255543,
0.802341,
5.307551,
0.429884,
0.466522,
-1.126122,
-0.933602,
6.538785,
0.455528,
0.548623,
-1.443109,
-1.142774,
5.905127,
0.437114,
0.558896,
-0.923043,
-0.529042,
7.003423,
0.467288,
0.529925,
-1.755386,
3.529117,
4.327696,
0.414712,
0.335220,
-2.632589,
3.713828,
4.364629,
0.377046,
0.322778,
-3.388062,
3.721976,
4.309028,
0.344108,
0.320151,
-4.075766,
3.675413,
4.076063,
0.312876,
0.322332,
-4.622910,
3.474691,
3.646321,
0.283526,
0.333190,
-5.171755,
2.535753,
2.670867,
0.241246,
0.382786,
-7.297331,
0.763172,
-0.048769,
0.102986,
0.468763,
-4.706828,
1.651000,
3.109532,
0.267612,
0.424560,
-4.071712,
1.476821,
3.476944,
0.297879,
0.433176,
-3.269817,
1.470659,
3.731945,
0.333434,
0.433878,
-2.527572,
1.617311,
3.865444,
0.366427,
0.426116,
-1.970894,
1.858505,
3.961782,
0.396012,
0.416696,
-1.579543,
2.097941,
4.084996,
0.420121,
0.410228,
-7.664182,
0.673132,
-2.435867,
0.007561,
0.480777,
-1.397041,
-1.340139,
5.630378,
0.432949,
0.569518,
-0.884838,
0.658740,
6.233232,
0.458639,
0.479089,
-0.767097,
-0.968035,
7.077932,
0.473466,
0.545744,
-0.460213,
-1.334106,
6.787447,
0.476088,
0.563830,
-0.748618,
-1.067994,
6.798303,
0.468472,
0.555057,
-1.236408,
-1.585568,
5.480490,
0.433991,
0.582362,
-0.387306,
-1.409990,
6.957705,
0.483518,
0.562984,
-0.319925,
-1.607931,
6.508676,
0.482483,
0.577849,
-1.639633,
2.556298,
3.863736,
0.426450,
0.389799,
-1.255645,
2.467144,
4.203800,
0.438999,
0.396495,
-1.031362,
2.382663,
4.615849,
0.450067,
0.400434,
-4.253081,
2.772296,
3.315305,
0.289712,
0.368253,
-4.530000,
2.910000,
3.339685,
0.276670,
0.363373,
0.463928,
0.955357,
6.633583,
0.517862,
0.471948,
4.253081,
2.577646,
3.279702,
0.710288,
0.380764,
0.416106,
-1.466449,
6.447657,
0.526227,
0.573910,
7.087960,
5.434801,
0.099620,
0.895093,
0.254141,
2.628639,
2.035898,
3.848121,
0.634070,
0.409576,
3.198363,
1.985815,
3.796952,
0.661242,
0.413025,
3.775151,
2.039402,
3.646194,
0.688880,
0.409460,
4.465819,
2.422950,
3.155168,
0.725342,
0.389131,
2.164289,
2.189867,
3.851822,
0.606630,
0.403705,
3.208229,
3.223926,
4.115822,
0.654766,
0.344011,
2.673803,
3.205337,
4.092203,
0.629906,
0.346076,
3.745193,
3.165286,
3.972409,
0.680678,
0.347265,
4.161018,
3.059069,
3.719554,
0.702097,
0.353591,
5.062006,
1.934418,
2.776093,
0.752212,
0.410805,
2.266659,
-7.425768,
4.389812,
0.602918,
0.842863,
4.445859,
2.663991,
3.173422,
0.719902,
0.375600,
7.214530,
2.263009,
0.073150,
0.893693,
0.399960,
5.799793,
2.349546,
2.204059,
0.790082,
0.391354,
2.844939,
-0.720868,
4.433130,
0.643998,
0.534488,
0.711452,
-3.329355,
5.877044,
0.528249,
0.650404,
0.606033,
-3.924562,
5.444923,
0.525850,
0.680191,
1.431615,
-3.500953,
5.496189,
0.560215,
0.657229,
1.914910,
-3.803146,
5.028930,
0.585384,
0.666541,
1.131043,
-3.973937,
5.189648,
0.549626,
0.680861,
1.563548,
-4.082763,
4.842263,
0.571228,
0.682692,
2.650112,
-5.003649,
4.188483,
0.624852,
0.728099,
0.427049,
-1.094134,
7.360529,
0.513050,
0.547282,
0.496396,
-0.475659,
7.440358,
0.515097,
0.527252,
5.253307,
3.881582,
3.363159,
0.742247,
0.314507,
1.718698,
0.974609,
4.558359,
0.598631,
0.454979,
1.608635,
-0.942516,
5.814193,
0.570338,
0.548575,
1.651267,
-0.610868,
5.581319,
0.578632,
0.533623,
4.765501,
-0.701554,
3.534632,
0.723087,
0.532054,
0.478306,
0.295766,
7.101013,
0.516446,
0.499639,
3.734964,
4.508230,
4.550454,
0.662801,
0.282918,
4.588603,
4.302037,
4.048484,
0.703624,
0.293271,
6.279331,
6.615427,
1.425850,
0.830705,
0.193814,
1.220941,
4.142165,
5.106035,
0.552386,
0.302568,
2.193489,
3.100317,
4.000575,
0.607610,
0.353888,
3.102642,
-4.352984,
4.095905,
0.645429,
0.696707,
6.719682,
-4.788645,
-1.745401,
0.932695,
0.730105,
1.193824,
-1.306795,
5.737747,
0.557261,
0.572826,
0.729766,
-1.593712,
5.833208,
0.542902,
0.584792,
2.456206,
-4.342621,
4.283884,
0.618026,
0.694711,
2.204823,
-4.304508,
4.162499,
0.607591,
0.694203,
4.985894,
4.802461,
3.751977,
0.722943,
0.271963,
1.592294,
-1.257709,
5.456949,
0.577414,
0.563167,
2.644548,
4.524654,
4.921559,
0.614083,
0.281387,
2.760292,
5.100971,
5.015990,
0.616907,
0.255886,
3.523964,
8.005976,
3.729163,
0.668509,
0.119914,
5.599763,
5.715470,
2.724259,
0.770092,
0.232021,
3.063932,
6.566144,
4.529981,
0.635536,
0.189249,
5.720968,
4.254584,
2.830852,
0.770391,
0.299556,
6.374393,
4.785590,
1.591691,
0.826722,
0.278755,
0.672728,
-3.688016,
5.737804,
0.527121,
0.666198,
1.262560,
-3.787691,
5.417779,
0.553172,
0.668527,
1.732553,
-3.952767,
5.000579,
0.577238,
0.673890,
1.043625,
-1.464973,
5.662455,
0.554692,
0.580066,
2.321234,
-4.329069,
4.258156,
0.611897,
0.693961,
2.056846,
-4.477671,
4.520883,
0.596961,
0.706540,
2.153084,
-4.276322,
4.038093,
0.596371,
0.693953,
0.946874,
-1.035249,
6.512274,
0.539958,
0.557139,
1.469132,
-4.036351,
4.604908,
0.568842,
0.692366,
1.024340,
-3.989851,
4.926693,
0.547818,
0.692366,
0.533422,
-3.993222,
5.138202,
0.524613,
0.692366,
0.769720,
-6.095394,
4.985883,
0.534090,
0.779141,
0.699606,
-5.291850,
5.448304,
0.527671,
0.736226,
0.669687,
-4.949770,
5.509612,
0.526913,
0.717857,
0.630947,
-4.695101,
5.449371,
0.526878,
0.704626,
0.583218,
-4.517982,
5.339869,
0.526967,
0.695278,
1.537170,
-4.423206,
4.745470,
0.572058,
0.695278,
1.615600,
-4.475942,
4.813632,
0.573521,
0.703540,
1.729053,
-4.618680,
4.854463,
0.576838,
0.711846,
1.838624,
-4.828746,
4.823737,
0.581691,
0.720063,
2.368250,
-3.106237,
4.868096,
0.609945,
0.639910,
7.542244,
-1.049282,
-2.431321,
0.986046,
0.560034,
1.826614,
-4.399531,
4.399021,
0.586800,
0.695400,
1.929558,
-4.411831,
4.497052,
0.590372,
0.701823,
0.597442,
-2.013686,
5.866456,
0.531915,
0.601537,
1.405627,
-1.714196,
5.241087,
0.577268,
0.585935,
0.662449,
-1.819321,
5.863759,
0.536915,
0.593786,
2.342340,
0.572222,
4.294303,
0.627543,
0.473352,
3.327324,
0.104863,
4.113860,
0.665586,
0.495951,
1.726175,
-0.919165,
5.273355,
0.588354,
0.546862,
5.133204,
7.485602,
2.660442,
0.757824,
0.147676,
4.538641,
6.319907,
3.683424,
0.709250,
0.201508,
3.986562,
5.109487,
4.466315,
0.672684,
0.256581,
2.169681,
-5.440433,
4.455874,
0.600409,
0.749005,
1.395634,
5.011963,
5.316032,
0.558266,
0.261672,
1.619500,
6.599217,
4.921106,
0.570304,
0.187871,
1.891399,
8.236377,
4.274997,
0.588166,
0.109044,
4.195832,
2.235205,
3.375099,
0.711045,
0.398952,
5.733342,
1.411738,
2.431726,
0.781070,
0.435405,
1.859887,
2.355757,
3.843181,
0.587247,
0.398932,
4.988612,
3.074654,
3.083858,
0.742870,
0.355446,
1.303263,
1.416453,
4.831091,
0.572156,
0.437652,
1.305757,
-0.672779,
6.415959,
0.551868,
0.536570,
6.465170,
0.937119,
1.689873,
0.821442,
0.457556,
5.258659,
0.945811,
2.974312,
0.752702,
0.457182,
4.432338,
0.722096,
3.522615,
0.713757,
0.467627,
3.300681,
0.861641,
3.872784,
0.667113,
0.460673,
2.430178,
1.131492,
4.039035,
0.631101,
0.447154,
1.820731,
1.467954,
4.224124,
0.600862,
0.432473,
0.563221,
2.307693,
5.566789,
0.523481,
0.405627,
6.338145,
-0.529279,
1.881175,
0.810748,
0.523926,
5.587698,
3.208071,
2.687839,
0.771046,
0.348959,
0.242624,
-1.462857,
7.071491,
0.509127,
0.562718,
1.611251,
0.339326,
4.895421,
0.595293,
0.485024,
7.743095,
2.364999,
-2.005167,
0.980531,
0.401564,
1.391142,
1.851048,
4.448999,
0.573500,
0.420000,
1.785794,
-0.978284,
4.850470,
0.602995,
0.548688,
4.670959,
2.664461,
3.084075,
0.733530,
0.376977,
1.333970,
-0.283761,
6.097047,
0.560611,
0.519017,
7.270895,
-2.890917,
-2.252455,
0.967686,
0.644357,
1.856432,
2.585245,
3.757904,
0.580985,
0.387160,
0.923388,
0.073076,
6.671944,
0.537728,
0.505385,
5.000589,
-6.135128,
1.892523,
0.760966,
0.779753,
5.085276,
-7.178590,
0.714711,
0.801779,
0.831938,
7.159291,
-0.811820,
-0.072044,
0.892441,
0.540761,
5.843051,
-5.248023,
0.924091,
0.816351,
0.740260,
6.847258,
3.662916,
0.724695,
0.865595,
0.333687,
2.412942,
-8.258853,
4.119213,
0.614074,
0.883246,
0.179909,
-1.689864,
6.573301,
0.508953,
0.579438,
2.103655,
-0.163946,
4.566119,
0.617942,
0.508316,
6.407571,
2.236021,
1.560843,
0.825608,
0.397675,
3.670075,
2.360153,
3.635230,
0.681215,
0.396235,
3.177186,
2.294265,
3.775704,
0.656636,
0.400597,
2.196121,
-4.598322,
4.479786,
0.603900,
0.710217,
6.234883,
-1.944430,
1.663542,
0.812086,
0.588539,
1.292924,
-9.295920,
4.094063,
0.568013,
0.944565,
3.210651,
-8.533278,
2.802001,
0.681008,
0.898285,
4.068926,
-7.993109,
1.925119,
0.733752,
0.869701,
2.724032,
2.315802,
3.777151,
0.633830,
0.398822,
2.288460,
2.398891,
3.697603,
0.606793,
0.395537,
1.998311,
2.496547,
3.689148,
0.589660,
0.391062,
6.130040,
3.399261,
2.038516,
0.805016,
0.342108,
2.288460,
2.886504,
3.775031,
0.611335,
0.362284,
2.724032,
2.961810,
3.871767,
0.634038,
0.355971,
3.177186,
2.964136,
3.876973,
0.656636,
0.355357,
3.670075,
2.927714,
3.724325,
0.681215,
0.358340,
4.018389,
2.857357,
3.482983,
0.698585,
0.363156,
7.555811,
4.106811,
-0.991917,
0.941867,
0.319076,
4.018389,
2.483695,
3.440898,
0.698585,
0.387449,
1.776217,
-2.683946,
5.213116,
0.584177,
0.624107,
1.222237,
-1.182444,
5.952465,
0.554318,
0.566077,
0.731493,
-2.536683,
5.815343,
0.534154,
0.620640,
4.135272,
-6.996638,
2.671970,
0.711218,
0.819975,
3.311811,
-7.660815,
3.382963,
0.664630,
0.852871,
1.313701,
-8.639995,
4.702456,
0.559100,
0.902632,
5.940524,
-6.223629,
-0.631468,
0.871706,
0.791941,
1.998311,
2.743838,
3.744030,
0.591234,
0.373894,
0.901447,
1.236992,
5.754256,
0.544341,
0.451584,
2.308977,
-8.974196,
3.609070,
0.624563,
0.924192,
6.954154,
-2.439843,
-0.131163,
0.885770,
0.615029,
1.098819,
-4.458788,
5.120727,
0.551338,
0.695278,
1.181124,
-4.579996,
5.189564,
0.551980,
0.704632,
1.255818,
-4.787901,
5.237051,
0.552888,
0.715808,
1.325085,
-5.106507,
5.205010,
0.555168,
0.730794,
1.546388,
-5.819392,
4.757893,
0.569944,
0.767035,
1.953754,
-4.183892,
4.431713,
0.593203,
0.685676,
2.117802,
-4.137093,
4.555096,
0.599262,
0.681069,
2.285339,
-4.051196,
4.582438,
0.607600,
0.677703,
2.850160,
-3.665720,
4.484994,
0.631938,
0.663500,
5.278538,
-2.238942,
2.861224,
0.752033,
0.601315,
0.946709,
1.907628,
5.196779,
0.547226,
0.420395,
1.314173,
3.104912,
4.231404,
0.563544,
0.359828,
1.780000,
2.860000,
3.881555,
0.583841,
0.368714,
1.845110,
-4.098880,
4.247264,
0.586614,
0.692366,
5.436187,
-4.030482,
2.109852,
0.771915,
0.683578,
0.766444,
3.182131,
4.861453,
0.531597,
0.352483,
1.938616,
-6.614410,
4.521085,
0.588371,
0.804441,
0.516573,
1.583572,
6.148363,
0.520797,
0.442565,
1.246815,
0.230297,
5.681036,
0.567985,
0.493479,
0.997827,
-6.930921,
4.979576,
0.543283,
0.819255,
3.288807,
-5.382514,
3.795752,
0.655317,
0.745515,
2.311631,
-1.566237,
4.590085,
0.621009,
0.574018,
2.680250,
-6.111567,
4.096152,
0.625560,
0.780312,
3.832928,
-1.537326,
4.137731,
0.680198,
0.570719,
2.961860,
-2.274215,
4.440943,
0.642764,
0.604338,
4.386901,
-2.683286,
3.643886,
0.704663,
0.621530,
1.217295,
-7.834465,
4.969286,
0.552012,
0.862592,
1.542374,
-0.136843,
5.201008,
0.589072,
0.508637,
3.878377,
-6.041764,
3.311079,
0.685945,
0.775357,
3.084037,
-6.809842,
3.814195,
0.645735,
0.812640,
3.747321,
-4.503545,
3.726453,
0.675343,
0.703978,
6.094129,
-3.205991,
1.473482,
0.810858,
0.646305,
4.588995,
-4.728726,
2.983221,
0.720122,
0.714667,
6.583231,
-3.941269,
0.070268,
0.866152,
0.682705,
3.492580,
-3.195820,
4.130198,
0.663187,
0.644597,
1.255543,
0.802341,
5.307551,
0.570082,
0.466326,
1.126122,
-0.933602,
6.538785,
0.544562,
0.548376,
1.443109,
-1.142774,
5.905127,
0.562759,
0.558785,
0.923043,
-0.529042,
7.003423,
0.531987,
0.530140,
1.755386,
3.529117,
4.327696,
0.585271,
0.335177,
2.632589,
3.713828,
4.364629,
0.622953,
0.322779,
3.388062,
3.721976,
4.309028,
0.655896,
0.320163,
4.075766,
3.675413,
4.076063,
0.687132,
0.322346,
4.622910,
3.474691,
3.646321,
0.716482,
0.333201,
5.171755,
2.535753,
2.670867,
0.758757,
0.382787,
7.297331,
0.763172,
-0.048769,
0.897013,
0.468769,
4.706828,
1.651000,
3.109532,
0.732392,
0.424547,
4.071712,
1.476821,
3.476944,
0.702114,
0.433163,
3.269817,
1.470659,
3.731945,
0.666525,
0.433866,
2.527572,
1.617311,
3.865444,
0.633505,
0.426088,
1.970894,
1.858505,
3.961782,
0.603876,
0.416587,
1.579543,
2.097941,
4.084996,
0.579658,
0.409945,
7.664182,
0.673132,
-2.435867,
0.992440,
0.480777,
1.397041,
-1.340139,
5.630378,
0.567192,
0.569420,
0.884838,
0.658740,
6.233232,
0.541366,
0.478899,
0.767097,
-0.968035,
7.077932,
0.526564,
0.546118,
0.460213,
-1.334106,
6.787447,
0.523913,
0.563830,
0.748618,
-1.067994,
6.798303,
0.531529,
0.555057,
1.236408,
-1.585568,
5.480490,
0.566036,
0.582329,
0.387306,
-1.409990,
6.957705,
0.516311,
0.563054,
0.319925,
-1.607931,
6.508676,
0.517472,
0.577877,
1.639633,
2.556298,
3.863736,
0.573595,
0.389807,
1.255645,
2.467144,
4.203800,
0.560698,
0.395332,
1.031362,
2.382663,
4.615849,
0.549756,
0.399751,
4.253081,
2.772296,
3.315305,
0.710288,
0.368253,
4.530000,
2.910000,
3.339685,
0.723330,
0.363373,
]
)
canonical_metric_landmarks = np.reshape(
canonical_metric_landmarks, (canonical_metric_landmarks.shape[0] // 5, 5)
).T
canonical_metric_landmarks = canonical_metric_landmarks[:3, :]
procrustes_landmark_basis = [
(4, 0.070909939706326),
(6, 0.032100144773722),
(10, 0.008446550928056),
(33, 0.058724168688059),
(54, 0.007667080033571),
(67, 0.009078059345484),
(117, 0.009791937656701),
(119, 0.014565368182957),
(121, 0.018591361120343),
(127, 0.005197994410992),
(129, 0.120625205338001),
(132, 0.005560018587857),
(133, 0.05328618362546),
(136, 0.066890455782413),
(143, 0.014816547743976),
(147, 0.014262833632529),
(198, 0.025462191551924),
(205, 0.047252278774977),
(263, 0.058724168688059),
(284, 0.007667080033571),
(297, 0.009078059345484),
(346, 0.009791937656701),
(348, 0.014565368182957),
(350, 0.018591361120343),
(356, 0.005197994410992),
(358, 0.120625205338001),
(361, 0.005560018587857),
(362, 0.05328618362546),
(365, 0.066890455782413),
(372, 0.014816547743976),
(376, 0.014262833632529),
(420, 0.025462191551924),
(425, 0.047252278774977),
]
landmark_weights = np.zeros((canonical_metric_landmarks.shape[1],))
for idx, weight in procrustes_landmark_basis:
landmark_weights[idx] = weight
def log(name, f):
if DEBUG.get_debug():
print(f"{name} logged:", f)
print()
def cpp_compare(name, np_matrix):
if DEBUG.get_debug():
# reorder cpp matrix as memory alignment is not correct
cpp_matrix = np.load(f"{name}_cpp.npy")
rows, cols = cpp_matrix.shape
cpp_matrix = np.split(np.reshape(cpp_matrix, -1), cols)
cpp_matrix = np.stack(cpp_matrix, 1)
print(f"{name}:", np.sum(np.abs(cpp_matrix - np_matrix[:rows, :cols]) ** 2))
print()
def get_metric_landmarks(screen_landmarks, pcf):
screen_landmarks = project_xy(screen_landmarks, pcf)
depth_offset = np.mean(screen_landmarks[2, :])
intermediate_landmarks = screen_landmarks.copy()
intermediate_landmarks = change_handedness(intermediate_landmarks)
first_iteration_scale = estimate_scale(intermediate_landmarks)
intermediate_landmarks = screen_landmarks.copy()
intermediate_landmarks = move_and_rescale_z(
pcf, depth_offset, first_iteration_scale, intermediate_landmarks
)
intermediate_landmarks = unproject_xy(pcf, intermediate_landmarks)
intermediate_landmarks = change_handedness(intermediate_landmarks)
second_iteration_scale = estimate_scale(intermediate_landmarks)
metric_landmarks = screen_landmarks.copy()
total_scale = first_iteration_scale * second_iteration_scale
metric_landmarks = move_and_rescale_z(
pcf, depth_offset, total_scale, metric_landmarks
)
metric_landmarks = unproject_xy(pcf, metric_landmarks)
metric_landmarks = change_handedness(metric_landmarks)
pose_transform_mat = solve_weighted_orthogonal_problem(
canonical_metric_landmarks, metric_landmarks, landmark_weights
)
cpp_compare("pose_transform_mat", pose_transform_mat)
inv_pose_transform_mat = np.linalg.inv(pose_transform_mat)
inv_pose_rotation = inv_pose_transform_mat[:3, :3]
inv_pose_translation = inv_pose_transform_mat[:3, 3]
metric_landmarks = (
inv_pose_rotation @ metric_landmarks + inv_pose_translation[:, None]
)
return metric_landmarks, pose_transform_mat
def project_xy(landmarks, pcf):
x_scale = pcf.right - pcf.left
y_scale = pcf.top - pcf.bottom
x_translation = pcf.left
y_translation = pcf.bottom
landmarks[1, :] = 1.0 - landmarks[1, :]
landmarks = landmarks * np.array([[x_scale, y_scale, x_scale]]).T
landmarks = landmarks + np.array([[x_translation, y_translation, 0]]).T
return landmarks
def change_handedness(landmarks):
landmarks[2, :] *= -1.0
return landmarks
def move_and_rescale_z(pcf, depth_offset, scale, landmarks):
landmarks[2, :] = (landmarks[2, :] - depth_offset + pcf.near) / scale
return landmarks
def unproject_xy(pcf, landmarks):
landmarks[0, :] = landmarks[0, :] * landmarks[2, :] / pcf.near
landmarks[1, :] = landmarks[1, :] * landmarks[2, :] / pcf.near
return landmarks
def estimate_scale(landmarks):
transform_mat = solve_weighted_orthogonal_problem(
canonical_metric_landmarks, landmarks, landmark_weights
)
return np.linalg.norm(transform_mat[:, 0])
def extract_square_root(point_weights):
return np.sqrt(point_weights)
def solve_weighted_orthogonal_problem(source_points, target_points, point_weights):
sqrt_weights = extract_square_root(point_weights)
transform_mat = internal_solve_weighted_orthogonal_problem(
source_points, target_points, sqrt_weights
)
return transform_mat
def internal_solve_weighted_orthogonal_problem(sources, targets, sqrt_weights):
cpp_compare("sources", sources)
cpp_compare("targets", targets)
# tranposed(A_w).
weighted_sources = sources * sqrt_weights[None, :]
# tranposed(B_w).
weighted_targets = targets * sqrt_weights[None, :]
cpp_compare("weighted_sources", weighted_sources)
cpp_compare("weighted_targets", weighted_targets)
# w = tranposed(j_w) j_w.
total_weight = np.sum(sqrt_weights * sqrt_weights)
log("total_weight", total_weight)
# Let C = (j_w tranposed(j_w)) / (tranposed(j_w) j_w).
# Note that C = tranposed(C), hence (I - C) = tranposed(I - C).
#
# tranposed(A_w) C = tranposed(A_w) j_w tranposed(j_w) / w =
# (tranposed(A_w) j_w) tranposed(j_w) / w = c_w tranposed(j_w),
#
# where c_w = tranposed(A_w) j_w / w is a k x 1 vector calculated here:
twice_weighted_sources = weighted_sources * sqrt_weights[None, :]
source_center_of_mass = np.sum(twice_weighted_sources, axis=1) / total_weight
log("source_center_of_mass", source_center_of_mass)
# tranposed((I - C) A_w) = tranposed(A_w) (I - C) =
# tranposed(A_w) - tranposed(A_w) C = tranposed(A_w) - c_w tranposed(j_w).
centered_weighted_sources = weighted_sources - np.matmul(
source_center_of_mass[:, None], sqrt_weights[None, :]
)
cpp_compare("centered_weighted_sources", centered_weighted_sources)
design_matrix = np.matmul(weighted_targets, centered_weighted_sources.T)
cpp_compare("design_matrix", design_matrix)
log("design_matrix_norm", np.linalg.norm(design_matrix))
rotation = compute_optimal_rotation(design_matrix)
scale = compute_optimal_scale(
centered_weighted_sources, weighted_sources, weighted_targets, rotation
)
log("scale", scale)
rotation_and_scale = scale * rotation
pointwise_diffs = weighted_targets - np.matmul(rotation_and_scale, weighted_sources)
cpp_compare("pointwise_diffs", pointwise_diffs)
weighted_pointwise_diffs = pointwise_diffs * sqrt_weights[None, :]
cpp_compare("weighted_pointwise_diffs", weighted_pointwise_diffs)
translation = np.sum(weighted_pointwise_diffs, axis=1) / total_weight
log("translation", translation)
transform_mat = combine_transform_matrix(rotation_and_scale, translation)
cpp_compare("transform_mat", transform_mat)
return transform_mat
def compute_optimal_rotation(design_matrix):
if np.linalg.norm(design_matrix) < 1e-9:
print("Design matrix norm is too small!")
u, _, vh = np.linalg.svd(design_matrix, full_matrices=True)
postrotation = u
prerotation = vh
if np.linalg.det(postrotation) * np.linalg.det(prerotation) < 0:
postrotation[:, 2] = -1 * postrotation[:, 2]
cpp_compare("postrotation", postrotation)
cpp_compare("prerotation", prerotation)
rotation = np.matmul(postrotation, prerotation)
cpp_compare("rotation", rotation)
return rotation
def compute_optimal_scale(
centered_weighted_sources, weighted_sources, weighted_targets, rotation
):
rotated_centered_weighted_sources = np.matmul(rotation, centered_weighted_sources)
numerator = np.sum(rotated_centered_weighted_sources * weighted_targets)
denominator = np.sum(centered_weighted_sources * weighted_sources)
if denominator < 1e-9:
print("Scale expression denominator is too small!")
if numerator / denominator < 1e-9:
print("Scale is too small!")
return numerator / denominator
def combine_transform_matrix(r_and_s, t):
result = np.eye(4)
result[:3, :3] = r_and_s
result[:3, 3] = t
return result