基于Dragonboard 410c的智能魔镜设计(5)——通过人脸进行用户身份识别
根据前面的设计方案,在设计的基于dragonboard 410c的智能魔镜中,需要根据超声波检测到有人靠近的时候,通过USB摄像头采集人脸数据,然后根据数据库中的人脸数据进行人脸匹配,识别用户的身份,最终根据用户身份显示不同的消息和推送不同的内容,这期blog将重点向大家介绍智能魔镜中的人脸检测和识别处理实现的原理和过程。
需要进行基于人脸的用户身份识别,首先需要检测出人脸,然后根据检测出来的人脸与数据库中的人脸进行匹配,最终得出匹配度,根据匹配度确定该人脸的身份,这里将从这两个方面来向大家介绍如何在智能魔镜中实现人脸身份检测,其实在前面的一系列blog中已经给大家介绍了人脸识别和检测的实现方法,这里就在结合智能魔镜代码设计再向大家如何应用前面已经设计好的人脸检测和识别的代码,将其集中到智能魔镜中的应用中来。
在基于USB摄像头人脸识别的文章中已经告诉了大家如使用Python和OpenCV来何构建人脸检测代码,我们这里构建了一个getFac.py文件,在该文件中通过getFac类来实现人脸的检测,其实也就是对前面blog方法的一次封装即可,具体代码如下:
def getface(self,device): cap = cv2.VideoCapture(device) faces=[] num=self.maxFrames while(True): ret,img=cap.read() ret,img=cap.read() ret,img=cap.read() ret,img=cap.read() if ret==True: gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) faces = self.face_cascade.detectMulTIScale(gray,1.3,5) i=0 for(x,y,w,h) in faces: face=img[y:y+h,x:x+w] print("get face sucessful") cap.release() cv2.imwrite('./temp.jpg',face) return True num=num-1 if num==0: print("get face failed") cap.release() return False else: cap.release() return False
有了上述类,我们就可以检测并且获得人脸图像,接下来我们需要利用检测到的人脸图像,与数据库中的人脸图像进行匹配,实现人脸的识别,其方法和前面 使用USB摄像头进行人脸识别文章--第二篇 中的方法一样,采用opencv提供的人脸识别接口来实现,但是这里为了在魔镜中调用,重写了前面blog的方法,构建了一个peopleIdenTIficaTIon.py类来实现魔镜中的人脸身份检测,这里封装了一个peopleDetected类来实现人脸的身份识别,重新封装后的代码和前面代码稍有差异,具体设计如下:
class peopleDetected: def __init__(self,trainImgPath): self.threshold=6000 self.model = cv2.createFisherFaceRecognizer() self.trainModel('./usrImg') #load all user img create Train table #imgPath is user img path def trainModel(self,trainImgPath): names=[] lables=[] userImgDir=os.listdir(trainImgPath) #print(userImgDir) for imgDir in userImgDir: print("userID dir is:") #print(imgDir) format="%s/%s" values=(trainImgPath,imgDir) dirPath=format % values #find current user img allimgPath=os.listdir(dirPath) #print(allimgPath) for name in allimgPath: names.append(dirPath+'/'+name) lables.append(int(imgDir)) print("save sucessful:") print(names) print(lables) #return names,lables trainImg=[] for imgloadPath in names: obj=cv2.resize(cv2.imread(imgloadPath,0),(400,500)) trainImg.append(obj) self.model.train(trainImg,np.array(lables)) print(lables) def getPeopleID(self,faceImgPath): faceImg=cv2.imread(faceImgPath,0) face=cv2.resize(faceImg,(400,500)) result = self.model.predict(face) predicTID=result[0] predictError=result[1] print(predictID) print(predictError) #print(result) if predictError>self.threshold: return -1 else: print("get people ID") return predictID def getPeopleID2(self,faceImg): face=cv2.resize(faceImg,(400,500)) result = self.model.predict(face) predictID=result[0] predictError=result[1] #print(predictID) #print(predictError) #print(result) if predictError>self.threshold: return -1 else: return predictID
有了这两个类,我们就可以方便的构建魔镜的人脸身份识别子模块了,这里我们只需要通过下面的代码就可以使用人脸检测和进行人脸身份识别了:
GF=getFace()
rs=GF.getface(0)
PD=peopleDetected("./usrImg")
peopleID=PD.getPeopleID('./temp.jpg')
其中PD在构建的过程中,将导入./userImg中的用户信息作为训练数据。
每次检测到的人脸保存在./temp.jpg中。
后续blog将进一步向大家介绍如何利用上述两个类,并且根据超声波检测结果来完成整个魔镜的人脸身份检测和保存。