人脸识别face_recognition尝试(win7下安装和测试)
一、安装
步骤一:pip install face_recognition
100M,不是吧,这么大,果然中断多次。
这个结果。dlib安装不成功,辛苦安装(中断)这么多次,提示要安装cmake。
步骤二:pip install cmake
32M,也不小。果然,又中断,什么网?还是服务器的问题?无语。
多试几次,终于安装完成。
步骤三:安装vs2019(网上查,说,需要安装,不一定)
dlib还是安装失败,看样子没找到问题。一阵度娘。
步骤四:安装低版本dlib
先试:pip install dlib==19.6.1,安装成功。
但是face_recognition好象最低要求19.7,安装过程中,程序自动安装的下载的缓存包19.18,又导致失败。
再试:pip install dlib==19.7.0,安装成功。
步骤五:安装face_recognition
pip3.6 install face_recognition,成功,但有个错误提示,说click版本过高,不管。
至此,到底第三步安装的vs2019有没有用呢,先不管。
导入成功,安装OK。
步骤六:安装cv2
pip3.6 install opencv-python,不是直接用pip install cv2,但是导入是可以的:import cv2.
二、测试人脸识别
代码:
import face_recognition
import cv2
def demoFunc():#在一张包含人脸的图片中圈出来人脸,并保存图片
image = face_recognition.load_image_file("test3.jpg")
face_locations = face_recognition.face_locations(image)
for one in face_locations:
y0, x1, y1, x0=one
cv2.rectangle(image, pt1=(x0, y0), pt2=(x1, y1), color=(0, 0, 255), thickness=3)
cv2.imshow('aaa', image)#图片太大,看不到全貌,不知道怎么设置,加下句
cv2.imwrite("reco3.jpg", image)# 保存为文件,再打开文件查看。
if cv2.waitKey(0) & 0xFF == ord('q'):
cv2.destroyAllWindows()
demoFunc()
效果:
看样子,不是正面的人脸,很难把它识别出来。
三、取出头像保存为文件
代码:
img = cv2.imread("test3.jpg")
image = face_recognition.load_image_file("test3.jpg")
face_locations = face_recognition.face_locations(image)
k=0
for one in face_locations:
print(one)
k+=1
y0, x1, y1, x0=one
cv2.imwrite(str(k)+'.jpg',img[y0:y1,x0:x1])
这个CV2好象没有crop功能,如果直接用上面的image的话,图像色彩改变了,所以加了img。
四、人脸比较
通过和已知人脸批量比较,确定是谁。方法是将一张合影上的人脸(已知的)取出来,分存为姓名+.jpg,然后用另外一张合影上的人脸来比对。
代码:
def compare(one_pic,two_pic):
'''给定两张图片,判断是否是同一个人'''
read_1 = face_recognition.load_image_file(one_pic)
read_2 = face_recognition.load_image_file(two_pic)
encoding_1 = face_recognition.face_encodings(read_1,num_jitters=1)[0]
#这个jitter好象看不出来么效果
#print(type([encoding_1]))
encoding_2 = face_recognition.face_encodings(read_2,num_jitters=1)[0]
results = face_recognition.compare_faces([encoding_1], encoding_2,0.41)#这个公差系数要调整
#print('results: ',results)
return results[0]
def recog_name(pic_n):#给定一张图片,比对已知人名的所有图片
dir_name='pic/names/'#已知人脸图片目录名,文件名为人名
name_list=os.listdir(dir_name)
for name_pic in name_list:
print(u'正在比较:'+name_pic)
result=compare(dir_name+name_pic,pic_n)
if result:
print(u'*****\/*****这个人是:'+name_pic.split('.')[0])
else:
print(u'不是哦')
#recog_face_out()
#compare('3.jpg','4.jpg')
recog_name('8.jpg')
比较结果如下:
只有不停调整tolerance系数,才会达到满意的效果,换个人又需要调整,晕。
五、数据类型
>>>a= face_recognition.load_image_file('test.jpg')
>>> type(a)
<class 'numpy.ndarray'>
>>> len(a)
310 #图片的行数,高
>>> len(a[0])
488 #图片每行的点数,宽
>>> ds=face_recognition.face_encodings(a)
>>> type(ds)
<class 'list'> #列表,共识别了几个人脸
>>> len(ds)
5 #五个
>>> len(ds[0])
128 #特征码长度为128
>>> type(ds[0])
<class 'numpy.ndarray'> #类型:数组
>>> face_recognition.compare_faces(ds,ds[1],0.4)
[False, True, False, False, False]
人脸比较的第一个参数必须是个列表list类型,代表已知,第二个为数组类型。
>>> ds[1].ndim
1 #一维数组
第三个参数为容错系数,经测试在0.38-0.44之间比较适当,不同的人或照片的清晰程度不同,这个系数不是很好确定。
*********其它***********
pip自身升级
问题:通过“pip install --upgrade pip”升级,出现了错误,pip命令也丢失了,提示:no module named pip。
解决:python -m ensurepip。另外:easy_install pip
升级方法:python -m pip install --upgrade pip