如何基于MTCNN、FaceNet在掩码图像中定位并还原目标人脸?
人脸掩码后目标人脸还原实现方案
现有流程概述
当前实现流程:使用MTCNN检测图像中的人脸,通过FaceNet提取并保存每个人脸的特征,再用OpenCV高斯模糊滤镜对检测到的人脸进行掩码处理。相关示例图如下:
- 原始图像:

- 掩码后图像:

- 目标人脸:

现有实现代码
def face_and_features(img): boxes, _ = mtcnn.detect(img) print(boxes) for i, box in enumerate(boxes): a,b,c,d = box x1,y1,x2,y2 = int(a), int(b), int(c), int(d) face = img[y1:y2, x1:x2] cv2.imwrite(f"face{i}.jpg",face) face = cv2.resize(face, (160, 160)) face = face.transpose((2, 0, 1)) face = torch.from_numpy(face).float() face = face.unsqueeze(0) features = facenet(face) filename = "face_{}.npy".format(i) np.save(filename, features.detach().numpy()) with open("bounding_boxes.txt", "a") as f: f.write("{}, {}, {}, {}, {}, {}, {} \n".format(x1, y1, x2, y2, filename, datetime.datetime.now(), frame_number)) return features def masking(img): filename = "bounding_boxes.txt" masked_img = img.copy() with open(filename,'r') as file: for line in file: x,y,w,h,f_name,time, f_no = line.split(",") x,y,w,h = int(x), int(y), int(w), int(h) roi_color = masked_img[y:h, x:w] masked_img[y:h, x:w] = cv2.GaussianBlur(roi_color, (51,51), 0) return masked_img, f_name, time, f_no
需求与实现思路
最终目标:通过对比已保存的人脸特征或其他方法,在掩码图像中找到目标人脸并仅还原该人脸。以下是具体实现思路和建议:
1. 提取目标人脸的特征向量
对目标人脸图像执行与现有流程一致的特征提取操作:
- 用MTCNN检测目标人脸的边界框,裁剪出人脸区域
- 按照FaceNet要求预处理图像(resize到160x160、转置维度、转为Tensor等)
- 输入FaceNet得到目标人脸的特征向量,保存为
target_face_feature.npy
2. 匹配掩码图像中的目标人脸
利用已保存的人脸特征与目标特征做相似度对比:
- 加载
bounding_boxes.txt中记录的所有人脸特征文件(face_{}.npy) - 计算目标特征与每个人脸特征的余弦相似度(FaceNet特征向量已做L2归一化,余弦相似度可直接反映人脸相似度)
- 设置相似度阈值(推荐0.6-0.8,可根据实际场景调整),筛选出相似度最高且超过阈值的人脸对应的边界框信息
3. 还原目标人脸区域
找到目标人脸的边界框后,从原始图像提取清晰人脸替换掩码区域:
- 从
bounding_boxes.txt中获取目标人脸的x1,y1,x2,y2坐标 - 从原始图像中裁剪出该区域的清晰人脸
- 将清晰人脸粘贴到掩码图像的对应坐标位置,完成还原
4. 优化建议
- 结构化存储:把特征路径、边界框、时间戳等信息存储到JSON文件中,避免文本文件拆分出错
- 阈值调优:针对不同场景测试合适的相似度阈值,平衡误匹配和漏匹配概率
- 复用边界框:掩码后的人脸检测难度提升,可直接复用原始图像的边界框,无需重新检测掩码图像
- 多帧关联:如果处理视频帧,确保
frame_number准确关联,避免跨帧匹配错误
内容的提问来源于stack exchange,提问作者rohit thakur
相关产品推荐
相关产品推荐

