ML.NET + PostgreSQL 实现一个人脸搜索功能

人脸模型是用的微软开源 Onnx,感谢微软赏口饭吃。
ONNX 模型的输入输出前往Netron网站查看,飞机直达
有些细节没处理好,时间精力有限,等下还得去搬砖。
ML.NET 处理模型输入输出,老演员了,细节就不贴了。
主角依旧是PG SQL。

结论




欧氏距离

  • 是什么
    空间中两点之间的直线距离;空间中的点称之为向量,因为它有大小,有方向;当两个向量越接近时,它们的欧氏距离越小;当两个向量差异较大时,欧氏距离较大,就好比物以类聚,人以群分,因为它看起来像鸭子,那么它就是鸭子。

  • 数学公式
    d = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}

  • 翻译成函数

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容