2022-05-30 03:12:18 +02:00
import * as constants from './constants' ;
2022-04-11 17:45:24 +02:00
import type { Tensor } from '../tfjs/types' ;
export async function augment ( rawCoords , results : Tensor [ ] ) {
2022-04-14 17:47:08 +02:00
const t : Record < string , Float32Array > = { // all attention models produce 2d results so it needs to be later augmented with correct z-coords
2022-05-30 03:12:18 +02:00
// mesh: results[0], // already have it in rawCoords // output_mesh_identity
// flag: results[1], // already processed in parent // conv_faceflag
lips : results.filter ( ( r ) = > r . size === 160 ) [ 0 ] . dataSync ( ) as Float32Array , // 80 x 2d = 160 // output_lips
irisL : results.filter ( ( r ) = > r . size === 10 ) [ 0 ] . dataSync ( ) as Float32Array , // 5 x 2d = 10 // output_right_iris
eyeL : results.filter ( ( r ) = > r . size === 142 ) [ 0 ] . dataSync ( ) as Float32Array , // 71 x 2d = 142 // output_right_eye
irisR : results.filter ( ( r ) = > r . size === 10 ) [ 1 ] . dataSync ( ) as Float32Array , // 5 x 2d = 10 // output_left_iris
eyeR : results.filter ( ( r ) = > r . size === 142 ) [ 1 ] . dataSync ( ) as Float32Array , // 71 x 2d = 142// output_left_eye
2022-04-11 17:45:24 +02:00
} ;
2022-04-14 17:47:08 +02:00
// augment iris: adds additional 5 keypoints per eye
2022-05-30 03:12:18 +02:00
const irisLDepth = constants . LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG . reduce ( ( prev , curr ) = > prev += rawCoords [ curr ] [ 2 ] , 0 ) / constants . LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG . length ; // get average z-coord for iris
2022-04-14 17:47:08 +02:00
for ( let i = 0 ; i < t . irisL . length / 2 ; i ++ ) rawCoords . push ( [ t . irisL [ 2 * i + 0 ] , t . irisL [ 2 * i + 1 ] , irisLDepth ] ) ;
2022-05-30 03:12:18 +02:00
const irisRDepth = constants . LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG . reduce ( ( prev , curr ) = > prev += rawCoords [ curr ] [ 2 ] , 0 ) / constants . LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG . length ; // get average z-coord for iris
for ( let i = 0 ; i < t . irisR . length / 2 ; i ++ ) rawCoords . push ( [ t . irisR [ 2 * i + 0 ] , t . irisR [ 2 * i + 1 ] , irisRDepth ] ) ;
2022-04-14 17:47:08 +02:00
// augment eyes: replaces eye keypoints based on heuristic mapping
2022-05-30 03:12:18 +02:00
for ( let i = 0 ; i < t . eyeL . length / 2 ; i ++ ) rawCoords [ constants . LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG [ i ] ] = [ t . eyeL [ 2 * i + 0 ] , t . eyeL [ 2 * i + 1 ] , rawCoords [ constants . LANDMARKS_REFINEMENT_LEFT_EYE_CONFIG [ i ] ] [ 2 ] ] ;
for ( let i = 0 ; i < t . eyeR . length / 2 ; i ++ ) rawCoords [ constants . LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG [ i ] ] = [ t . eyeR [ 2 * i + 0 ] , t . eyeR [ 2 * i + 1 ] , rawCoords [ constants . LANDMARKS_REFINEMENT_RIGHT_EYE_CONFIG [ i ] ] [ 2 ] ] ;
2022-04-14 17:47:08 +02:00
// augment lips: replaces eye keypoints based on heuristic mapping
2022-05-30 03:12:18 +02:00
for ( let i = 0 ; i < t . lips . length / 2 ; i ++ ) rawCoords [ constants . LANDMARKS_REFINEMENT_LIPS_CONFIG [ i ] ] = [ t . lips [ 2 * i + 0 ] , t . lips [ 2 * i + 1 ] , rawCoords [ constants . LANDMARKS_REFINEMENT_LIPS_CONFIG [ i ] ] [ 2 ] ] ;
2022-04-14 17:47:08 +02:00
2022-04-11 17:45:24 +02:00
return rawCoords ;
}