人脸识别,face id测试
原文博客:Doi技术团队
链接地址:https://博客。doiduoyi。com/authors/1584446358138
初心:记录优秀的工业部技术团队学习经历
本文链接:基于洞察面孔实现的人脸识别和人脸注册
本教程的人脸识别是使用的是洞察面孔库进行开发的,该库使用的框架为mxnet。
安装环境安装mxnet,支持1.3~1.6版本,安装命令如下点安装mxnet-cu101==1.5.1安装insightface,命令如下点安装-升级洞察面孔安装其他依赖库点安装烧瓶烧瓶-CORS py YAML scikit学习opencv-python人脸识别和人脸注册为了方便参数的修改,使用格式格式进行配置参数,yaml格式文件加载如下。
导入OSI导入yamlimport numpy作为NP导入insight面临从随机导入选择从sk导入cv2学习导入预处理#部署配置文件解析器类部署配置:def _ _ init _ _(self,conf_file):如果不是os.path.exists(conf_file):引发异常(配置文件路径[%s]无效!% conf_file)与以FP:configs=YAML的身份打开(conf _ file)。load(FP,Loader=yaml .full loader)deploy _ conf=configs[ FACE ]#正数为国家政治保卫局。参见国家政治保卫局的ID,负数为使用CPU自我。GPU _ ID=deploy _ conf[ GPU _ ID ]self。FACE _ DB=deploy _ conf[ FACE _ DB ]self。THRESHOLD=deploy _ conf[ THRESHOLD ]self。NMS=部署配置[ NMS ]配置。YAML内容如下:
FACE: GPU_ID: 0 FACE_DB: face_db 阈值NMS: 0.50然后开始编写人脸识别和人脸注册工具类,使用insightface.app.FaceAnalysis()可以获取模型对象,这里包含了三个模型,首先是人脸检测模型,然后是人脸特征提取模型,和最后的性别年龄识别模型。使用model.prepare()可以配置ctx_id指定使用哪一块GPU,如果是负数则是使用中央处理器执行预测,网络管理系统配置的是人脸检测的阈值负载面()函数是加载人脸库中的人脸,用于之后的人脸识别对比。
类人脸识别:def _ _ init _ _(self,conf _ file):self。config=部署配置(配置文件)#加载人脸识别模型自我。模特=洞见脸。app。脸分析()自我。模型。准备(CTX _ id=self。配置。GPU _ id,nms=self.config.nms) #人脸库的人脸特征self.faces_embedding=list() #加载人脸库中的人脸自我。load _ faces(自身。配置。face _ db)#加载人脸库中的人脸def load_faces(self,face _ db _ path):如果不是OS。路径。exists(face _ db _ path):OS。makedirs(face _ db _ path)用于OS中的根、目录、文件。walk(face _ db _ path):for file in files:input _ image=cv2。im解码(NP。从文件(操作系统。路径。join(root,file),dtype=np.uint8),1) user_id=file.split( . )[0]脸=自我。模型。get(input _ image)[0]嵌入=NP。数组(面。嵌入).形状((1,-1))嵌入=预处理。正常化(嵌入)自我。faces _嵌入。追加({ 用户标识:用户标识,功能:嵌入})接下来编写认可()函数实现人脸识别,通过调用model.get()函数可以获取图像中每张人脸的位置bbox,人脸关键点地标,人脸特征嵌入,性别性别,年龄年龄。其中使用人脸识别的就是通过dtdbq距离来对比人脸库中的人脸特征,默认如何它们的dtdbq距离小于1.24,我们就可以认为他们是同一个人。
def识别(自我,图像):面孔=自我。模型。get(image)results=list()for face in faces:result=dict()#获取人脸属性结果[ bbox ]=NP。数组(面。bbox).astype(np.int32).to list()result[ landmark ]=NP。数组(面。里程碑式的).astype(np.int32).to list()result[ age ]=face。年龄性别=男if face.gender==0: gender=女结果[性别]=性别#开始人脸识别嵌入=NP。数组(面。嵌入).形状((1,-1))嵌入=预处理。在self中规范化(嵌入)com _ face的结果[ user _ id ]= unknown 。faces _ embedding:r=self。feature _ compare(嵌入,com_face[feature],self。配置。threshold)if r:result[ user _ id ]=com _ face[ user _ id ]results。追加(结果)返回结果上面使用到的dtdbq距离计算方式如下。
@静态方法def feature _ compare(feature 1,feature2,threshold):diff=NP。减去(特征1,特征2)dist=NP。sum(NP。平方(差分),1)如果距离阈值:返回True else:返回错误的人脸注册方式如下,通过传入一张照片,首先要判断照片中的人脸只有一张,然后开始提取该人脸的特征值,再次比较要注册的人脸是否已经存在人脸库中了,否之就包人脸特征添加到人脸库中并保存图片到本地。通过命名包只包含一个人脸的图片放在face_db文件夹中也可以实现。
def寄存器(self,image):faces=self。模型。get(image)if len(faces)!=1:不返回#判断人脸是否存在embedding=np.array(faces[0]).嵌入)。整形((1,-1))嵌入=预处理。normalize(嵌入)is _ exits=False for com _ face in self。faces _ embedding:r=self。feature _ compare(嵌入,com_face[feature],self。配置。threshold)if r:is _ exits=True if is _ exits:return None old _ user _ id=[d[ user _ id ]for d in self。faces _ embedding]user _ id=self。获取用户标识(旧用户标识)#符合注册条件保存图片,同时把特征添加到人脸特征库中cv2.imencode(.png ,image)[1].到文件(操作系统。路径。加入(自我。配置。face _ db, % s . png % user _ id )self。faces _嵌入。append({ user _ id :user _ id, feature :embedding })返回user _ id def get _ user _ id(self,old _ user _ id):print(old _ user _ id)而True:user _ id= .如果用户标识不在旧用户标识中,则join([choice( 0123456789 abcdef )for I in range(8)]:break返回用户标识使用全部功能都实现了,使用如下,首先是进行人脸注册,注册成功之后会获得一个用户注册ID,之后的人脸识别可以用过这个用户身份判断是不是这个人。
if _ _ name _ _= _ _ main _ _ :img=cv2。我在阅读(测试。png )face _ recognition=face recognition( config。yml )user _ id=face _ recognition。注册(img)打印(用户标识)人脸识别,通过传入一张图片,可以输出每张人脸对应的用户身份证,人脸位置bbox,人脸关键点地标,性别性别,年龄年龄。
if _ _ name _ _= _ _ main _ _ :img=cv2。我在读(“测试2。png )face _ recognition=face recognition( config。yml’)结果=face _ recognition。识别(img)打印(结果)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。