戴口罩情境下的人脸识别demo( 三 )


4.进行人脸识别
分述:计算距离的方法都已布置完毕之后,进行最后一步的人脸识别
(1)、计算数据库中的人脸数据,将已存储的图片经过信息编码,存储到已知人脸信息和姓名列表中,即[]、[];
def create_known_faces(self, root):"""# 构建目标库,在程序启动时,或有新员工添加时执行:param root:目标图片存放路径:return: [[id..] [feat..]]"""for fname in os.listdir(root):fpath = os.path.join(root, fname)if os.path.splitext(fpath)[-1] != ".jpg":continueself._known_faces.append(self._get_img_face_encoding(fpath))self._know_name.append(fname.split('.')[0])
(2)、负责人脸识别的核心方法代码如下:
def recognize(self, image, score_threshold=1):"""识别人脸:param image: 图片路径:param score_threshold: 人脸识别得分阈值:return: (know_name[ix], face_locations, cls)(人员id,box坐标(left,top,right,bottom),是否戴了口罩(0,1))"""if isinstance(image, str):image = cv2.imread(image)# image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)item = self.face_detector.detect(image)if item:box, cls = itemface_feat = self._get_face_feat(image, box)scores = 1 - self._face_distance(self._known_faces, face_feat)ix = np.argmax(scores).item()if scores[ix] > score_threshold:# 1 for mask,返回姓名,人脸框,cls如果是0,则返回1,代表戴了口罩return self._know_name[ix], box, 1 - int(cls), scores[ix]else:self._know_name[0] = 'unknow'scores[0] = '0'return self._know_name[0], box, 1 - int(cls), scores[0]
(3)、最后的main()主函数代码如下:
def main():frame_interval = 10# Number of frames after which to run face detectionfps_display_interval = 1# secondsframe_rate = 0frame_count = 0# 捕捉摄像头的时时输入图片video_capture0 = cv2.VideoCapture(0)# 计时开始start_time = time.time()# 调用脸部识别函数recognizer = FaceRecognizer()# 存储录入数据库的人脸信息recognizer.create_known_faces("./data/mask_nomask/")# 循环检测识别人脸while True:# 读取一帧视频ret, frame = video_capture0.read()if (frame_count % frame_interval) == 0:if ret is True:# 图像灰化,降低计算复杂度frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)else:continueitem = recognizer.recognize(frame_gray, 0.55)# 检查最近的fpsend_time = time.time()if (end_time - start_time) > fps_display_interval:frame_rate = int(frame_count / (end_time - start_time))start_time = time.time()frame_count = 0# frame_gray = cv2.resize(frame_gray, dsize=video_size)add_overlays(frame, item, frame_rate)frame_count += 1cv2.imshow("Face Recognition", frame)# 等待10毫秒看是否有按键输入k = cv2.waitKey(10)# 如果输入q则退出循环if k & 0xFF == ord(' '):break# 释放摄像头并销毁所有窗口video_capture0.release()cv2.destroyAllWindows()
总结与结果展示
以上就是今天要讲的内容,本文就戴口罩的人脸识别这一任务驱动展开,大致讲解了一下思路,各个互联网公司都有自己的一套人脸识别系统,我这里所展示的只是一个简单的任务解决,精度可能没有那么严谨 。
结果图:
出现数据文件中不存在的人脸信息时: