当前位置: 首页 > news >正文

用Python升级贾维斯:添加人脸识别功能,实现“刷脸”控制电脑/设备

每个用过智能设备的人,大概都体验过“人脸识别”的便捷——解锁手机、支付验证、门禁通行。但如果能让你的专属贾维斯也支持人脸识别呢?比如:

  • 看到你的脸,自动解锁电脑;

  • 识别到陌生人,触发警报并关闭敏感文件;

  • 刷脸后,贾维斯才执行“打开智能家居”“查看隐私数据”等指令。

今天,我们就把**人脸识别**整合到本地贾维斯中,基于开源库实现“刷脸交互”,全程离线运行,隐私数据不泄露。从“声纹认声”到“人脸认人”,让贾维斯的安全性和便捷性再上一个台阶。

一、为什么要给贾维斯加人脸识别?

在之前的声纹识别基础上,新增人脸识别有三个核心价值:

  1. 双重验证更安全:重要操作(如解锁电脑、控制家电)需“声纹+人脸”双重确认,防止他人用录音伪造你的声音。

  2. 场景化控制更智能:比如贾维斯检测到你坐在电脑前(识别到人脸),自动打开常用软件;离开后(人脸消失),自动锁屏。

  3. 多用户权限区分:家里多人使用时,贾维斯能识别不同人脸,分配不同权限(比如孩子只能用学习软件,父母可控制所有设备)。

我们的目标很明确:不做复杂的人脸识别系统,而是把成熟的开源人脸识别库“嫁接”到贾维斯框架,实现“采集人脸→识别→执行指令”的闭环。

二、准备工作:软硬件与依赖库

1. 硬件(门槛极低,大部分人已有)

  • 电脑自带摄像头(或外接USB摄像头,720P以上分辨率即可);

  • 一台电脑(Windows/macOS/Linux均可,内存≥4GB,CPU支持基础图像运算)。

2. 核心软件库(全开源免费)

库名称

作用

特点

face_recognition

人脸检测与特征提取

封装了dlib,API简单,识别精度高

dlib

底层计算机视觉库(人脸特征)

工业级精度,支持实时处理

OpenCV-python

摄像头调用与图像预处理

轻量,支持多平台摄像头访问

pyautogui

模拟键盘鼠标操作(如解锁电脑)

跨平台,可实现自动锁屏、打开文件等

3. 环境搭建(避坑指南)

dlib 库安装时可能需要编译依赖,不同系统的安装步骤略有不同,按以下命令操作:

(1)Windows系统
# 1. 先安装编译依赖(用conda更简单,避免VS编译环境问题)
# 若没装conda,先从官网下载安装:https://www.anaconda.com/products/distribution
conda install -c conda-forge dlib# 2. 安装其他库
pip install face_recognition opencv-python pyautogui

(2)macOS系统
# 1. 安装Xcode命令行工具(编译dlib需要)
xcode-select --install# 2. 安装dlib和其他库
pip install dlib face_recognition opencv-python pyautogui

(3)Linux系统(以Ubuntu为例)
# 1. 安装系统依赖
sudo apt-get install build-essential cmake libopenblas-dev liblapack-dev libjpeg-dev# 2. 安装Python库
pip install dlib face_recognition opencv-python pyautogui

常见问题解决

  • pip install dlib 失败,优先用 conda 安装(Windows/macOS);

  • Linux下摄像头无法调用,需授权:sudo chmod 666 /dev/video0(video0为摄像头设备号)。

三、核心实现:四步让贾维斯支持人脸识别

我们基于之前的“声纹版贾维斯”框架,新增**人脸数据采集、实时人脸识别、人脸触发指令**三大功能,分步骤实现。

Step 1:人脸数据采集——给贾维斯“录脸”

先让贾维斯采集你的人脸特征,保存为“人脸模板”(类似身份证照片),后续识别时对比这个模板。

在之前的 jarvis_voiceprint.py 基础上,新增人脸相关函数,创建 jarvis_face.py

import os
import cv2
import pickle
import numpy as np
import face_recognition
from pathlib import Path
from time import sleep# -------------------------- 人脸识别配置 --------------------------
# 人脸特征模板保存路径(采集后生成)
FACE_ENCODINGS_PATH = Path("my_face_encodings.pkl")
# 摄像头设备号(0为默认摄像头,外接摄像头可能为1)
CAMERA_DEVICE = 0
# 人脸采集参数
FACE_COLLECT_CONFIG = {"num_samples": 5,  # 采集5张人脸照片(多角度,提高精度)"save_dir": "face_samples",  # 临时保存人脸照片的目录"delay": 1  # 每张照片间隔1秒
}# -------------------------- 初始化摄像头 --------------------------
def init_camera(device=CAMERA_DEVICE):"""初始化摄像头,返回OpenCV摄像头对象"""cap = cv2.VideoCapture(device)if not cap.isOpened():raise Exception(f"无法打开摄像头(设备号:{device}),请检查摄像头是否连接")# 设置摄像头分辨率(640x480足够,太高会卡顿)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)return cap# -------------------------- Step 1:人脸数据采集 --------------------------
def collect_face_data(tts, cap):"""采集人脸数据,生成特征模板"""# 1. 创建临时目录保存人脸照片os.makedirs(FACE_COLLECT_CONFIG["save_dir"], exist_ok=True)# 2. 提示用户准备tts.say("开始人脸数据采集,请面对摄像头,保持光线充足")tts.runAndWait()print("人脸采集提示:请面对摄像头,将在5秒后开始采集5张照片...")sleep(5)face_samples = []  # 存储人脸特征sample_count = 0   # 已采集数量while sample_count < FACE_COLLECT_CONFIG["num_samples"]:# 读取摄像头画面ret, frame = cap.read()if not ret:tts.say("摄像头读取失败,请重试")tts.runAndWait()continue# 转换颜色空间(OpenCV是BGR,face_recognition需要RGB)rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 检测人脸位置(返回人脸框坐标)face_locations = face_recognition.face_locations(rgb_frame)if len(face_locations) == 0:# 未检测到人脸,提示用户调整姿势cv2.putText(frame, "未检测到人脸,请调整姿势", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)cv2.imshow("人脸采集", frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcontinue# 提取人脸特征(只取第一张检测到的人脸)face_encoding = face_recognition.face_encodings(rgb_frame, face_locations)[0]face_samples.append(face_encoding)# 保存临时照片(可选,用于后续检查)sample_path = os.path.join(FACE_COLLECT_CONFIG["save_dir"], f"sample_{sample_count+1}.jpg")cv2.imwrite(sample_path, frame)# 显示采集进度sample_count += 1cv2.putText(frame, f"采集成功:{sample_count}/{FACE_COLLECT_CONFIG['num_samples']}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)cv2.imshow("人脸采集", frame)cv2.waitKey(1000 * FACE_COLLECT_CONFIG["delay"])  # 间隔指定秒数# 语音提示进度tts.say(f"已采集{sample_count}张人脸")tts.runAndWait()# 释放资源cap.release()cv2.destroyAllWindows()# 3. 生成并保存人脸特征模板(取平均值,提高稳定性)if len(face_samples) == 0:raise Exception("未采集到有效人脸数据,请重新尝试")avg_face_encoding = np.mean(face_samples, axis=0)with open(FACE_ENCODINGS_PATH, "wb") as f:pickle.dump(avg_face_encoding, f)tts.say("人脸数据采集完成,已保存特征模板")tts.runAndWait()print(f"人脸模板已保存至:{FACE_ENCODINGS_PATH}")return avg_face_encoding

测试Step 1:
  1. 在主函数中添加调用(后续整合到贾维斯时会优化):

    # 测试人脸采集(单独运行)
    if __name__ == "__main__":from jarvis_voiceprint import init_tts  # 复用之前的TTS初始化tts = init_tts()cap = init_camera()try:collect_face_data(tts, cap)except Exception as e:print(f"采集失败:{str(e)}")tts.say(f"人脸采集失败:{str(e)[:10]}")tts.runAndWait()
    1. 运行代码,按提示面对摄像头,采集5张人脸照片;

    2. 采集完成后,会生成 my_face_encodings.pkl(人脸特征模板)和 face_samples 目录(临时照片)。

    Step 2:实时人脸识别——让贾维斯“认脸”

    采集完人脸模板后,实现“实时摄像头捕捉→人脸检测→特征对比”的逻辑,判断当前镜头中的人是否为已注册用户。

    jarvis_face.py 中新增人脸识别函数:

    # 测试人脸采集(单独运行)
    if __name__ == "__main__":from jarvis_voiceprint import init_tts  # 复用之前的TTS初始化tts = init_tts()cap = init_camera()try:collect_face_data(tts, cap)except Exception as e:print(f"采集失败:{str(e)}")tts.say(f"人脸采集失败:{str(e)[:10]}")tts.runAndWait()

    测试Step 2:
    1. 添加测试代码:

      # 测试人脸识别(单独运行)
      if __name__ == "__main__":from jarvis_voiceprint import init_ttstts = init_tts()cap = init_camera()# 加载人脸模板if not FACE_ENCODINGS_PATH.exists():print("未找到人脸模板,请先采集人脸数据")tts.say("未找到人脸模板,请先采集")tts.runAndWait()exit()with open(FACE_ENCODINGS_PATH, "rb") as f:face_template = pickle.load(f)# 执行识别result, face_loc = recognize_face(tts, cap, face_template)print(f"识别结果:{'成功' if result else '失败'}")
      1. 运行代码,面对摄像头:

        1. 识别到你时,画面显示绿色框和“已注册用户”,语音提示“人脸识别通过”;

        2. 识别到陌生人(或无人)时,显示红色框和“陌生人”,不通过。

      Step 3:整合到贾维斯——实现“刷脸”控制

      现在把人脸识别和贾维斯的指令系统结合,实现“人脸识别通过后,才能执行敏感指令”的逻辑。

      jarvis_face.py 中新增“人脸+指令”结合的函数,并整合之前的声纹功能:

      # -------------------------- Step 3:整合贾维斯指令 --------------------------
      import pyautogui
      from jarvis_voiceprint import (init_whisper, init_tts, init_voiceprint_model,register_voiceprint, verify_voiceprint, execute_command)def face_voice_double_verify(tts, cap, face_template, voiceprint_model, voiceprint_template):"""声纹+人脸双重验证(敏感指令用)"""tts.say("开始双重身份验证,先进行声纹验证")tts.runAndWait()# 第一步:声纹验证voice_verify_ok = verify_voiceprint(voiceprint_model, voiceprint_template, tts)if not voice_verify_ok:tts.say("声纹验证失败,双重验证不通过")return False# 第二步:人脸验证tts.say("声纹验证通过,接下来进行人脸识别")face_verify_ok, _ = recognize_face(tts, cap, face_template)if not face_verify_ok:tts.say("人脸识别失败,双重验证不通过")return Falsetts.say("双重身份验证通过,可以执行敏感指令")return Truedef jarvis_with_face(whisper_model, tts, cap, face_template, voiceprint_model, voiceprint_template):"""带人脸识别的贾维斯主交互逻辑"""print("\n贾维斯(人脸版)已启动!说“退出”结束程序")tts.say("贾维斯已启动,支持人脸识别控制")tts.runAndWait()while True:# 1. 录音识别指令from jarvis_voiceprint import record_audio  # 复用录音函数audio_path = record_audio(duration=5)result = whisper_model.transcribe(audio_path, language="zh")user_text = result["text"].strip()os.remove(audio_path)if not user_text:tts.say("我没听清,请再说一遍")tts.runAndWait()continueprint(f"\n你说:{user_text}")# 2. 指令处理(区分普通指令和敏感指令)response = ""# 普通指令:无需人脸验证if "你好" in user_text:response = "你好,我是带人脸识别的贾维斯"elif "时间" in user_text:from time import strftime, localtimeresponse = f"现在时间是 {strftime('%H:%M:%S', localtime())}"elif "打开浏览器" in user_text:response = execute_command("open_browser")# 敏感指令:需人脸+声纹双重验证elif "解锁电脑" in user_text:# 模拟解锁(Windows:按Win+L锁屏,解锁需模拟输入密码,这里简化为提示)if face_voice_double_verify(tts, cap, face_template, voiceprint_model, voiceprint_template):response = "双重验证通过,正在解锁电脑(实际场景需对接系统API)"# 若已锁屏,可通过pyautogui输入密码(示例:pyautogui.typewrite("你的密码") + pyautogui.press("enter"))else:response = "双重验证不通过,无法解锁电脑"elif "打开隐私文件" in user_text:if face_voice_double_verify(tts, cap, face_template, voiceprint_model, voiceprint_template):# 打开指定文件(替换为你的文件路径)private_file = r"C:\Users\YourName\Documents\private.docx"if os.path.exists(private_file):os.startfile(private_file)  # Windows打开文件response = f"已打开隐私文件:{private_file}"else:response = "隐私文件不存在"else:response = "双重验证不通过,无法打开隐私文件"elif "陌生人检测" in user_text:# 实时检测是否有陌生人tts.say("开始陌生人检测,请保持摄像头开启")tts.runAndWait()cap_temp = init_camera()while True:ret, frame = cap_temp.read()if not ret:breakrgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)face_locations = face_recognition.face_locations(rgb_frame)if len(face_locations) > 0:face_enc = face_recognition.face_encodings(rgb_frame, face_locations)[0]matches = face_recognition.compare_faces([face_template], face_enc)if not matches[0]:# 检测到陌生人,触发警报(语音+弹窗)tts.say("检测到陌生人,请留意")cv2.putText(frame, "警告:检测到陌生人", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)cv2.imshow("陌生人检测", frame)cv2.waitKey(3000)breakcv2.imshow("陌生人检测", frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap_temp.release()cv2.destroyAllWindows()response = "陌生人检测已结束"elif "退出" in user_text:response = "再见,期待下次为你服务"print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()breakelse:response = "已记录你的指令:" + user_text# 3. 语音回应print(f"贾维斯:{response}")tts.say(response)tts.runAndWait()# -------------------------- 主函数:启动带人脸识别的贾维斯 --------------------------
      if __name__ == "__main__":# 1. 初始化基础模块(复用之前的声纹、语音识别)whisper_model = init_whisper()tts = init_tts()voiceprint_model = init_voiceprint_model()cap = init_camera()# 2. 加载/采集人脸模板if FACE_ENCODINGS_PATH.exists():print("加载已有人脸模板...")with open(FACE_ENCODINGS_PATH, "rb") as f:face_template = pickle.load(f)tts.say("已加载人脸模板")else:print("未检测到人脸模板,开始采集...")face_template = collect_face_data(tts, cap)# 3. 加载/采集声纹模板(复用之前的逻辑)from jarvis_voiceprint import VOICEPRINT_TEMPLATE, register_voiceprintif VOICEPRINT_TEMPLATE.exists():print("加载已有声纹模板...")with open(VOICEPRINT_TEMPLATE, "rb") as f:voiceprint_template = pickle.load(f)else:print("未检测到声纹模板,开始采集...")voiceprint_template = register_voiceprint(voiceprint_model, tts)# 4. 启动带人脸识别的贾维斯try:jarvis_with_face(whisper_model, tts, cap, face_template, voiceprint_model, voiceprint_template)finally:# 释放资源cap.release()cv2.destroyAllWindows()print("贾维斯已关闭,资源已释放")

      Step 4:实战场景案例——让贾维斯“刷脸”干活

      整合完成后,我们来测试几个实用场景,看看贾维斯如何用人脸识别解决实际问题。

      场景1:双重验证解锁电脑
      • 你说:“贾维斯,解锁电脑”;

      • 贾维斯先让你“说话进行声纹验证”,通过后提示“接下来进行人脸识别”;

      • 你面对摄像头,识别通过后,贾维斯自动打开电脑(或输入密码解锁)。

      场景2:刷脸打开隐私文件
      • 你说:“贾维斯,打开我的隐私文件”;

      • 双重验证通过后,贾维斯自动打开你指定的隐私文档(如 C:\Documents\private.docx);

      • 若验证不通过(比如别人尝试),贾维斯拒绝执行并提示“无权限”。

      场景3:陌生人检测报警
      • 你说:“贾维斯,启动陌生人检测”;

      • 贾维斯打开摄像头,实时监控画面;

      • 若检测到未注册的人脸(陌生人),立即语音提示“检测到陌生人,请留意”,并弹出警告窗口。

      四、优化与扩展:让人脸识别更实用

      基础版实现后,还可以从以下几个方向优化,提升体验和安全性:

      1. 提高识别稳定性

      • 多角度采集:采集人脸时,让用户轻微转动头部(左右、上下),采集不同角度的特征,避免单一角度识别失败;

      • 光线适应:在识别函数中添加光线检测,若画面过暗,提示用户“光线不足,请调整环境光”;

      • 模板更新:添加“更新人脸模板”指令,当你的外貌变化(如留胡子、戴眼镜)时,可重新采集部分照片更新模板。

      2. 扩展多用户支持

      • 修改人脸模板保存逻辑,支持多个用户(如 face_encodings_爸爸.pklface_encodings_妈妈.pkl);

      • 识别时可选择“验证用户A”或“验证用户B”,并根据用户分配不同权限(如孩子只能打开学习软件)。

      3. 对接更多硬件/系统

      • 控制智能家居:人脸识别通过后,自动打开你房间的灯、空调(对接小米Home、HomeAssistant);

      • Windows/macOS系统集成:通过 ctypes 调用系统API,实现真正的“刷脸解锁”(无需模拟输入密码);

      • 外接摄像头:使用高清USB摄像头或广角摄像头,扩大识别范围(适合客厅、办公室场景)。

      4. 降低资源占用

      • 减少帧率:实时识别时,降低摄像头帧率(如10fps),减少CPU占用;

      • 休眠机制:无指令时,摄像头休眠,收到“人脸识别”指令后再启动,节省电量(适合笔记本)。

      五、结语:从“认声”到“认脸”,打造更智能的专属助手

      给贾维斯添加人脸识别,不仅是增加一个功能,更是让它从“能听会说”的工具,变成“能认人、懂场景”的专属助手。无论是双重验证保护隐私,还是刷脸控制设备,核心都是让技术更贴合你的使用习惯——数据不联网、操作不繁琐、安全有保障。

      现在,你可以从基础版开始,慢慢打磨:今天实现“刷脸解锁”,明天添加“陌生人报警”,后天让贾维斯根据你的脸自动调整电脑桌面、软件设置……最终,打造一个真正“懂你”的智能助手。

      如果在实现过程中遇到问题(比如摄像头调用失败、识别精度低),欢迎在评论区交流——技术的乐趣,就在于不断解决问题,让工具越来越好用~

      http://www.dtcms.com/a/443280.html

      相关文章:

    2. 为什么java中不使用多叉树
    3. 没人做网站了吗网站模块功能
    4. 10.2 容器云部署准备(二)
    5. 铜陵网站建设企业vi设计合同
    6. 【文献笔记】NeurIPS 2022 | PointNeXt
    7. 安庆建设网站怎么创建网站页面
    8. wordpress 众筹网站众筹网站建设方案模板
    9. 线性表的实现
    10. 传播文化有限公司网站建设查询网138网站域名
    11. YOLO入门教程(番外):卷积神经网络—从全连接层到卷积
    12. 技术支持 东莞网站建设大型门户网站开发案例
    13. Rust程序语言设计(1-4)
    14. 做北京电梯招标的网站合肥seo外包平台
    15. CodeForces 20251003 - ?
    16. node服务端通过socket.io保持长连接通信示例
    17. Super-Resolution Delay-Doppler Estimation for OFDM Passive Radar
    18. 九江开发区建设环保局网站贵州住房建设厅官网查询
    19. 郑州诺耀科技 - 郑州高端网站建设营销推广网站路径怎么做
    20. 招聘网站源码下载岳阳市交通建设投资公司门户网站
    21. 单细胞空间--免疫细胞与肾脏细胞的时空相互作用调控自身免疫性肾病中肾小球新月体形成
    22. 巨野做网站的网站策划与运营考试题
    23. 正品海外购网站有哪些中国十大建筑设计院排名
    24. Docker Compose 多容器编排实战
    25. 初创公司 建网站网站设计和营销
    26. 救援启动!
    27. Android 事件分发机制 图解
    28. 做网站价钱电脑版qq在线登录网页入口
    29. 140、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(六)
    30. 免费网站建设软件大全wordpress禁止中国ip
    31. 有界区域上具有常数右端项的泊松方程解的上界估计