人脸模型是用的微软开源 Onnx,感谢微软赏口饭吃。
ONNX 模型的输入输出前往Netron网站查看,飞机直达 。
有些细节没处理好,时间精力有限,等下还得去搬砖。
ML.NET 处理模型输入输出,老演员了,细节就不贴了。
主角依旧是PG SQL。
结论
欧氏距离
是什么
空间中两点之间的直线距离;空间中的点称之为向量,因为它有大小,有方向;当两个向量越接近时,它们的欧氏距离越小;当两个向量差异较大时,欧氏距离较大,就好比物以类聚,人以群分,因为它看起来像鸭子,那么它就是鸭子。数学公式
翻译成函数
public static double EuclideanDistance(double[] vector1, double[] vector2)
{
double distanceSquared = 0d;
for (int i = 0; i < vector1.Length; i++)
{
double diff = vector1[i] - vector2[i];
distanceSquared += diff * diff;
}
double distance = Math.Sqrt(distanceSquared);
return distance;
}
- 相似度为
public static double Similarity(double[] vector1, double[] vector2)
{
double distance = EuclideanDistance(vector1, vector2);
return 1d / (1d + distance);
}
- 翻译成pg函数
CREATE OR REPLACE FUNCTION euclidean_distance_similarity(vector0 float8[], vector1 float8[])
RETURNS float8
AS $$
DECLARE
i integer;
sum_of_squared_differences float8 := 0.0;
BEGIN
FOR i IN 1..array_length(vector0, 1) LOOP
sum_of_squared_differences := sum_of_squared_differences + (vector0[i] - vector1[i])^2;
END LOOP;
RETURN 1.0 / (1.0 + sqrt(sum_of_squared_differences));
END;
$$ LANGUAGE plpgsql