从人脸验证到属性分析:用DeepFace和Streamlit快速搭建一个本地人脸分析Demo

从人脸验证到属性分析:用DeepFace和Streamlit快速搭建一个本地人脸分析Demo 从人脸验证到属性分析用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作为核心人脸分析库首次运行时会自动下载预训练模型约500MBStreamlit用于构建Web界面的轻量级框架OpenCV处理图像的基础库PillowPython图像处理标准库Plotly用于创建交互式图表提示如果下载模型速度慢可以设置代理环境变量或手动下载模型文件放到正确路径。2. 构建基础Streamlit应用框架Streamlit的最大优势是可以用纯Python代码快速构建Web界面。我们先创建一个app.py文件搭建基础结构import streamlit as st st.set_page_config(page_title人脸分析Demo, layoutwide) 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_widthTrue) col2.image(img2, use_column_widthTrue) # 临时保存图片 temp_dir temp_images os.makedirs(temp_dir, exist_okTrue) 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_widthTrue) # 临时保存图片 temp_dir temp_images os.makedirs(temp_dir, exist_okTrue) 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( xlist(emotions.keys()), ylist(emotions.values()), labels{x: 情绪, y: 概率}, colorlist(emotions.keys()) ) st.plotly_chart(fig, use_container_widthTrue) # 显示种族分析 st.subheader(种族分析) races result[race] fig px.pie( nameslist(races.keys()), valueslist(races.values()), title种族分布 ) st.plotly_chart(fig, use_container_widthTrue) # 显示详细结果 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代码。