public double GetEngagement(FaceAnchorReading faceAnchorReading) { return(UpdateEngagement(faceAnchorReading)); }
public double UpdateEngagement(FaceAnchorReading f) { blink.Push((f.FacialExpressions["EyeBlinkLeft"].Value + f.FacialExpressions["EyeBlinkRight"].Value) / 2); smile.Push((f.FacialExpressions["MouthSmileLeft"].Value + f.FacialExpressions["MouthSmileRight"].Value) / 2); frown.Push((f.FacialExpressions["MouthFrownLeft"].Value + f.FacialExpressions["MouthFrownRight"].Value) / 2); squint.Push((f.FacialExpressions["EyeSquintLeft"].Value + f.FacialExpressions["EyeSquintRight"].Value) / 2); gazeIn.Push((f.FacialExpressions["EyeLookInLeft"].Value + f.FacialExpressions["EyeLookInRight"].Value) / 2); gazeOut.Push((f.FacialExpressions["EyeLookOutLeft"].Value + f.FacialExpressions["EyeLookOutRight"].Value) / 2); if (previousReading == null) { headSpeed.Push(0); eyeDwell.Push(0); headTilt.Push(0); } else { var deltaTime = f.ReadingTimestamp.Subtract(previousReading.ReadingTimestamp); var deltaHead = VectorMagnitude(VectorDifference(previousReading.LookAtPointTransform, f.LookAtPointTransform)); headSpeed.Push((float)(deltaHead / deltaTime.TotalMilliseconds)); var leftEyeDisplacement = CoordinateDisplacement(f.LeftEyeTransform); var rightEyeDisplacement = CoordinateDisplacement(f.RightEyeTransform); var eyeDisplacement = Math.Abs(leftEyeDisplacement[0] + rightEyeDisplacement[0]) / 2; eyeDwell.Push((float)(eyeDisplacement > 0 ? 1 / eyeDisplacement : 0)); headTilt.Push((float)(Math.Abs(leftEyeDisplacement[1] + rightEyeDisplacement[1]) / 2)); } previousReading = f; var modelInput = new CoreMLPathwayInput { PPI = PPI, Blink = blink.Mean, Smile = smile.Mean, Frown = frown.Mean, Squint = squint.Mean, GazeIn = gazeIn.Mean, GazeOut = gazeOut.Mean, HeadSpeed = headSpeed.Mean, EyeDwell = eyeDwell.Mean, HeadTilt = headTilt.Mean }; IMLFeatureProvider predictionOut = model.GetPrediction(modelInput, out _); var targetFeatureValue = predictionOut.GetFeatureValue("target"); var prediction = targetFeatureValue.Int64Value; var classProbabilityFeatureValue = predictionOut.GetFeatureValue("classProbability"); var probabilityx = classProbabilityFeatureValue.DictionaryValue.Values[0]; var probabilityy = classProbabilityFeatureValue.DictionaryValue.Values[1]; //// this is a bit hacky, but it's all relative //value = (probabilityy.FloatValue - probabilityx.FloatValue - 0.5f) * 2f; //value = (value < 0f) ? 0f : value; value = probabilityy.FloatValue - probabilityx.FloatValue; if (value < 0f) { Console.WriteLine(value + " negative !"); value = 0f; } else { Console.WriteLine(value); } return(value); //return probabilityy.FloatValue; //return prediction; }