100行python实现人脸识别和相似度(一眼丁真鉴定)?

日期:2023-03-02 15:04:03 / 人气:152

团体github profile:PaperCrane-ovo本项目地址:一眼丁真鉴定器由于知乎对markdown的支持烂的跟shit一样,假如有局部缺失还请前往GitHub教程界面没错,时隔3天(指push项目后的3天),我又回来了。关于本人的处女作,总是感到惴惴不安,一方面,由于这就是个玩具,怕被各路大神笑话,另一方面又觉得,处女作要是留下什麼粗糙那就悲了,于是本着readme立下的flag,在此出个教程,或许之前曾经有相似的或相同的,请纯属巧合,也请各路大神嘴下留情,纸鹤不胜感谢!请一定要看到最初,一定一定!本教程无深度学习内容正片开端好的,废话不多说,上面就可以开端教学了!内容是 :100行代码如何做一团体脸类似度的东东?其实十分复杂啊,先看一下效果:一眼丁真,鉴定爲不像请疏忽丑丑的还像是被抓卖淫的图片,毕竟只要0.85左右的类似度(bushi)或许和丁真不那麼像还是件坏事,是吧(doge) 不针对任何丁真粉上面开端!前戏预备首先需求预备一些东西numpy,一个开源的python迷信计算包,弱小到conda的base环境自带numpy用numpy的缘由是这个东东需求触及到一些数学计算成绩opencv,也是一个开源的python库,用于计算机视觉方面dlib,一个开源的机器学习库,由于人脸辨认做得很棒所以比拟著名的说假如你的环境中曾经有这三个库,那麼可以点击右上角加入了,由于你大约率曾经会这些了 (或许也可以朝下看看然后讪笑一下这篇教程的作者,他真菜,出这麼低级的教程)下面的库都装完当前,还需求一个东西,曾经在repo里了,就是那个res文件夹下的shape_predictor_68_face_landmarks.dat,用途待会再说假如想要更方便地装置下面的三个库,可以pip install -r requirements.txt很好换成国际的pypi源,下载速度会高一点pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple我建议你从头开端,跟着这篇教程做一遍,思绪会明晰一些,而不是看着我的 屎码 半天摸不着头脑从摄像头读入你的face!选择一个文件夹,在文件夹下新建一个python脚本文件xxx.py,将方才预备的三大金刚请出来import numpy as npimport dlibimport cv2import sys可选,次要是命令行参数要用,不必这个并不会影响到中心功用首先将人脸经过摄像头读入#用到cv2这个库cap = cv2.VideoCapture(0)#完成继续截取摄像头画面并输入到屏幕上,就是延续的了while True:    ret,self_img = cap.read()    self_img = cv2.flip(self_img,1)#镜像翻转摄像头的画面    cv2.imshow(myself,img)    cv2.waitKey(1)cv2.VideoCapture(0)代表默许摄像头,假如有多个摄像头而显示的不是你的预期,请换成1,2,.....直到报错,总有一款合适你cv2.imshow(text,img)显示以text爲标题,img爲图片的窗口(text参照上图standard和myself)cv2.waitKey()代表等候用户按下键盘的键才持续,这个不必管假如你成功了,你应该会在屏幕上看到一团体脸,如上图右不带红框和数字的样子(当然一定不会有那个黑框,那个黑条是干嘛的呢?)人脸辨认!如何把这张脸辨认出来呢? 答案是dlib!def face_locator(img):    detector = dlib.get_frontal_face_detector()    dets = detector(img,0)    if not dets:        return None    return max(dets,key = lambda d:d.area())dlib.get_frontal_face_detector()这个东东很神奇,可以将一切的人脸弄进一个列表里然后前往这个列表最初前往最大的那张人脸 (还不是爲了避免被抢镜,所以请时辰保证在摄像头的视野中,你是最靓的靓仔) ,用lambda表达式指定以面积爲目标提取特征!下面那个函数前往一个元素,我们虽然不晓得这个元素是什麼,但它有一些办法可以供我们操纵令face = face_locator(img),则有以下face.left(),face.right(),face.top(),face.bottom(),face.area(),face.width(),face.height()等办法用法了如指掌,但如今暂时不必,待会会用到所以face如今就是个有坐标的矩形框,我们要从这个矩形框外面提取出脸的特征def extract_features(img,face):    predictor = dlib.shape_predictor(res/shape_predictor_68_face_landmarks.dat) key_points = []    landmark = predictor(img,face)    for i in range(68): pos = landmark.part(i)        key_points.append(np.array([pos.x,pos.y],dtype = np.float32))    return key_points这一步最关键的就是shape_predictor_68_face_landmarks.dat`,这个东西是dlib训练好的,可以提取人脸68特征点的一个模型landmark就是一个相似于列表的东西,寄存着68个点,拜访每个点需求part(下标)但我们之后要用的是68个点而不是这个列不列表不表的鬼东西,而且这个"点"是dlib本人的一种数据构造,无法被其他库共用所以我们将这68个点一个一个一个提取出来变为numpy数组**(方便后续向量计算)**放入key_points列表,就到达了提取的效果题外话 :想要让python发扬胶水言语的功用,经常要借助比拟底层的东西(本例numpy数组比拟接近底层),可以更方便地黏合不同的包效果如下:先辈(方才我在人脸检测的时分,你有在偷看罢)燕园丁真,鉴定爲68点你是一个一个一个哼哼哼啊啊啊啊啊啊~~比对特征上一步我们取得了一个含有68个点的列表key_points,这一步我们要完成比对,所以我们将丁真先生请出来依照下面的办法,依样画葫芦即可dingzhen_img = cv2.imread(res/std_dingzhen.jpg)dingzhen_locator = face_locator(dingzhen_img)dingzhen_key_points = extract_features(dingzhen_img,dingzhen_locator)如今我们失掉了两个关键点列表key_points dingzhen_key_points但是如今这两个68点,他们的坐标不一样,异样都是鼻头,一个在图像两头,另一个在图像边缘,怎样比对呢?小学二年级的课程会教你立体向量这个东西,所以我们只需求将两个点作差,就可以失掉一个向量点的坐标是相对的,而向量的坐标是绝对的,这样就处理了点的坐标不同的成绩for i in range(68): key_points[i]-=key_points[0]    dingzhen_key_points[i]-=dingzhen_key_points[0]然后我们就可以比对对应向量的差距,可以用欧几里得间隔,即两个同尾向量,头部之间的间隔欧氏间隔越大,两向量差距越大,对应的局部就越不像,假如这个差距被累积起来,就可以权衡整张人脸的差距依照这个思绪,我们来计算对应向量欧氏间隔的总和sum = 0for i in range(68):    sum+=np.linalg.norm(key_points[i]-dingzhen_key_points[i])np.linalg.norm()是用来计算向量范数的,默许状况下就是计算模长,即两向量的欧氏间隔由于两向量作差就是一个向量嘛这样我们失掉了欧氏间隔的和,这个和越大,就阐明两张脸越不像,很棒了解但是我们要的是类似度啊,类似度是一个比率啊!所以我们需求一个能把实数映射到0到1之间的函数这时分能够有深度学习根底的小同伴就懂了,这不就是激活函数嘛再结合0到1的范围,我们便可以确定两个函数契合我们的要求sigmoid函数tanh(双曲正切函数)sigmoid函数,解析式f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}},图象如下图sigmoid函数图象tanh双曲正切函数,解析式f(x)=ex−e−xex+e−xf(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}},图象如下图tanhx函数图象经过沉思熟虑,我选择了tanh,理由如下:tanh可以间接调用numpy中的函数np.tanh(),比拟省心,而假如是sigmoid就

作者:长安娱乐




现在致电 5243865 OR 查看更多联系方式 →

长安娱乐 版权所有