从人脸验证到属性分析:用DeepFace和Streamlit快速搭建本地人脸分析Demo
人脸识别技术早已从实验室走向日常生活,但大多数人只接触过成品应用,对背后的技术实现知之甚少。本文将带你用Python生态中的两个利器——DeepFace和Streamlit,快速构建一个功能全面的人脸分析Web应用。无需复杂的前端知识,只需基础Python技能,就能在本地运行一个具备以下能力的交互式工具:
- 人脸验证:判断两张照片是否为同一人
- 属性分析:检测年龄、性别、情绪和种族
- 可视化展示:用进度条和图表直观呈现分析结果
这个项目特别适合想快速验证AI模型能力的开发者,或是需要演示原型的产品经理。我们将从环境配置开始,逐步实现图片上传、模型调用和结果展示的全流程。
1. 环境准备与依赖安装
在开始编码前,需要确保开发环境配置正确。推荐使用Python 3.8或更高版本,避免因版本兼容性问题导致库安装失败。
首先创建并激活虚拟环境:
python -m venv face_analysis_env source face_analysis_env/bin/activate # Linux/Mac face_analysis_env\Scripts\activate # Windows安装核心依赖库:
pip install deepface streamlit opencv-python pillow plotly这里有几个关键点需要注意:
- DeepFace:作为核心人脸分析库,首次运行时会自动下载预训练模型(约500MB)
- Streamlit:用于构建Web界面的轻量级框架
- OpenCV:处理图像的基础库
- Pillow:Python图像处理标准库
- Plotly:用于创建交互式图表
提示:如果下载模型速度慢,可以设置代理环境变量或手动下载模型文件放到正确路径。
2. 构建基础Streamlit应用框架
Streamlit的最大优势是可以用纯Python代码快速构建Web界面。我们先创建一个app.py文件,搭建基础结构:
import streamlit as st st.set_page_config(page_title="人脸分析Demo", layout="wide") st.title("本地人脸分析演示系统") # 侧边栏导航 analysis_type = st.sidebar.selectbox( "选择分析类型", ["人脸验证", "属性分析"] ) # 主内容区 if analysis_type == "人脸验证": st.header("人脸验证") # 后续内容将在这里添加 else: st.header("人脸属性分析") # 后续内容将在这里添加这个基础框架已经实现了:
- 页面标题和布局配置
- 侧边栏导航菜单
- 根据选择显示不同内容区域
运行应用测试:
streamlit run app.py你应该能在浏览器中看到一个基本的界面框架,虽然还没有实际功能,但导航切换已经可以工作。
3. 实现人脸验证功能
人脸验证是比较两张人脸是否为同一个人的过程。我们将在应用中添加图片上传和比较功能。
首先在app.py中添加以下代码到人脸验证部分:
from deepface import DeepFace from PIL import Image import os # 图片上传组件 col1, col2 = st.columns(2) with col1: img1 = st.file_uploader("上传第一张图片", type=["jpg", "png"]) with col2: img2 = st.file_uploader("上传第二张图片", type=["jpg", "png"]) if img1 and img2: # 显示上传的图片 col1.image(img1, use_column_width=True) col2.image(img2, use_column_width=True) # 临时保存图片 temp_dir = "temp_images" os.makedirs(temp_dir, exist_ok=True) img1_path = os.path.join(temp_dir, "img1.jpg") img2_path = os.path.join(temp_dir, "img2.jpg") with open(img1_path, "wb") as f: f.write(img1.getbuffer()) with open(img2_path, "wb") as f: f.write(img2.getbuffer()) # 验证按钮 if st.button("开始验证"): try: result = DeepFace.verify(img1_path, img2_path) if result["verified"]: st.success(" 两张图片是同一个人!") else: st.error(" 两张图片不是同一个人") # 显示详细结果 with st.expander("查看详细结果"): st.json(result) except Exception as e: st.error(f"分析出错: {str(e)}")这段代码实现了:
- 并排显示两个图片上传组件
- 预览上传的图片
- 临时保存图片到本地
- 调用DeepFace进行验证
- 显示验证结果和详细信息
注意:首次运行时会下载VGG-Face模型,可能需要几分钟时间。
4. 实现人脸属性分析
人脸属性分析可以提取年龄、性别、情绪和种族等信息。我们在属性分析部分添加以下代码:
import cv2 import numpy as np import plotly.express as px img_file = st.file_uploader("上传人脸图片", type=["jpg", "png"]) if img_file: # 显示上传的图片 st.image(img_file, caption="上传的图片", use_column_width=True) # 临时保存图片 temp_dir = "temp_images" os.makedirs(temp_dir, exist_ok=True) img_path = os.path.join(temp_dir, "analysis_img.jpg") with open(img_path, "wb") as f: f.write(img_file.getbuffer()) if st.button("开始分析"): try: # 分析属性 analysis = DeepFace.analyze(img_path, actions=["age", "gender", "emotion", "race"]) result = analysis[0] # 因为DeepFace返回的是列表 # 显示年龄和性别 col1, col2 = st.columns(2) col1.metric("年龄", f"{result['age']}岁") gender = "男性" if result["gender"] == "Man" else "女性" col2.metric("性别", gender) # 显示情绪分析 st.subheader("情绪分析") emotions = result["emotion"] fig = px.bar( x=list(emotions.keys()), y=list(emotions.values()), labels={"x": "情绪", "y": "概率"}, color=list(emotions.keys()) ) st.plotly_chart(fig, use_container_width=True) # 显示种族分析 st.subheader("种族分析") races = result["race"] fig = px.pie( names=list(races.keys()), values=list(races.values()), title="种族分布" ) st.plotly_chart(fig, use_container_width=True) # 显示详细结果 with st.expander("查看原始分析数据"): st.json(result) except Exception as e: st.error(f"分析出错: {str(e)}")这段代码实现了:
- 图片上传和预览
- 调用DeepFace分析多种属性
- 用Metric组件显示年龄和性别
- 用Plotly图表展示情绪和种族分析结果
- 提供原始数据的查看选项
5. 优化与部署建议
现在基本功能已经完成,但还有一些可以优化的地方:
性能优化:
# 在文件开头添加 @st.cache_resource def load_models(): # 预加载模型 DeepFace.build_model("VGG-Face") DeepFace.build_model("Age") DeepFace.build_model("Gender") DeepFace.build_model("Emotion") DeepFace.build_model("Race") # 在应用启动时调用 load_models()这个缓存装饰器可以避免每次分析都重新加载模型,显著提升响应速度。
界面改进:
- 添加加载状态指示器
- 增加示例图片按钮
- 美化布局和颜色主题
部署注意事项:
- 模型文件较大,确保部署环境有足够磁盘空间
- 考虑使用
.streamlit/config.toml配置页面样式 - 对于生产环境,建议添加用户认证和访问控制
完整应用现在应该具备以下功能:
- 流畅的图片上传和预览
- 准确的人脸验证
- 详细的属性分析
- 直观的可视化展示
- 良好的错误处理
运行应用时,你会看到一个专业的界面,能够处理各种人脸分析任务,而这一切只需要不到200行Python代码。