如何构建初级水平的余弦相似度人脸识别比对系统?
- 内容介绍
- 文章标签
- 相关推荐
本文共计521个文字,预计阅读时间需要3分钟。
相关专题:
大致思路如下:
- 首先数据集用的是face_224这个数据集,划分好训练集和测试集后生成对应的列表文件
- 然后建立一个卷积神经网络,输入一张图片时,输出的是该图片的编码(一个1x128的向量)
- 通过比较两张图片编码的余弦相似度来判断两张图片是否来自同一个人
简单介绍一下余弦相似度(第一次接触这个,如果有错误欢迎各位大佬指正):
- 先上个公式:
- 再上个代码:
point1 = point1 / paddle.norm(point1, axis=1, keepdim=True)#求范数,说人话就是对应元素的平方和再开方(来自某知乎暴躁老哥)
point2 = point1 / paddle.norm(point2, axis=1, keepdim=True)
CosineSimilarities = paddle.sum(paddle.multiply(img_emb1, img_emb2),axis=-1)
- 大概讲一下原理:
实际上就是把两个点point1(X1,Y1)和point2(X2,Y2)到原点的连线之间的夹角的余弦值算出来,用来衡量point1(X1,Y1)和point2(X2,Y2)之间的距离(也就是相似度),其范围是[-1,1],也就是夹角越小,两个点越近,两个点的余弦相似度也就越接近1,反之就是-1
关于上面的代码,实际上就是把那个公式实现一下,然后那俩point实际上就是换成了多维矩阵,只要动笔写一下就能理解(实际上是我懒得码字了)
还有就是为了配合对比损失函数ContrastiveLoss,需要用1减去余弦相似度获取余弦距离来进行损失函数的计算
下面是部署效果(临时抓的室友,不要在意细节,天太热了。。。。。。)
本文共计521个文字,预计阅读时间需要3分钟。
相关专题:
大致思路如下:
- 首先数据集用的是face_224这个数据集,划分好训练集和测试集后生成对应的列表文件
- 然后建立一个卷积神经网络,输入一张图片时,输出的是该图片的编码(一个1x128的向量)
- 通过比较两张图片编码的余弦相似度来判断两张图片是否来自同一个人
简单介绍一下余弦相似度(第一次接触这个,如果有错误欢迎各位大佬指正):
- 先上个公式:
- 再上个代码:
point1 = point1 / paddle.norm(point1, axis=1, keepdim=True)#求范数,说人话就是对应元素的平方和再开方(来自某知乎暴躁老哥)
point2 = point1 / paddle.norm(point2, axis=1, keepdim=True)
CosineSimilarities = paddle.sum(paddle.multiply(img_emb1, img_emb2),axis=-1)
- 大概讲一下原理:
实际上就是把两个点point1(X1,Y1)和point2(X2,Y2)到原点的连线之间的夹角的余弦值算出来,用来衡量point1(X1,Y1)和point2(X2,Y2)之间的距离(也就是相似度),其范围是[-1,1],也就是夹角越小,两个点越近,两个点的余弦相似度也就越接近1,反之就是-1
关于上面的代码,实际上就是把那个公式实现一下,然后那俩point实际上就是换成了多维矩阵,只要动笔写一下就能理解(实际上是我懒得码字了)
还有就是为了配合对比损失函数ContrastiveLoss,需要用1减去余弦相似度获取余弦距离来进行损失函数的计算
下面是部署效果(临时抓的室友,不要在意细节,天太热了。。。。。。)

