一个可落地的档案管理系统人脸识别模块,其核心是后端算法服务与前端的无缝集成。整个技术栈由以下部分构成:人脸检测与特征提取模型、人脸特征比对服务、前端图像采集组件以及数据库。我们将采用成熟的Python生态与Web技术栈实现,确保稳定性和可维护性。
你需要准备以下环境与工具:
安装基础依赖,执行以下命令:
更新系统包
sudo apt-get update
sudo apt-get install -y python3-pip libgl1-mesa-glx libglib2.0-0
安装PaddlePaddle CPU版本(如需GPU请参考官网命令)
python3 -m pip install paddlepaddle==2.4.2 -i https://mirror.baidu.com/pypi/simple
安装PaddleDetection与PaddleClas
python3 -m pip install paddleclas==2.5.0 paddledetection==2.5.0
安装Web框架与数据库驱动
python3 -m pip install fastapi uvicorn python-multipart mysql-connector-python
此服务负责接收人脸图片,并输出一个512维的特征向量。
我们使用PaddleClas提供的轻量级人脸识别模型`PP-ShiTuV2`。在项目根目录创建`face_service`目录,并下载模型。
mkdir -p face_service/models
cd face_service/models
下载并解压人脸检测与识别模型
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/rec/models/inference/PP-ShiTuV2_rec_infer.tar
tar -xf PP-ShiTuV2_rec_infer.tar
创建模型加载与推理脚本`inference.py`:
import paddle
from paddle.inference import Config, create_predictor
import numpy as np
import cv2
class FaceFeatureExtractor:
def __init__(self, model_dir):
创建预测配置
config = Config()
config.set_prog_file(f"{model_dir}/inference.pdmodel")
config.set_params_file(f"{model_dir}/inference.pdiparams")
config.enable_use_gpu(500, 0) 使用GPU,如无GPU则注释此行
config.disable_gpu() 若使用CPU则启用此行
config.enable_memory_optim()
self.predictor = create_predictor(config)
self.input_names = self.predictor.get_input_names()
self.output_names = self.predictor.get_output_names()
def preprocess(self, image_path):
读取并预处理图像
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
调整尺寸为模型输入要求
img = cv2.resize(img, (224, 224))
img = img.astype('float32')
归一化
img = img / 255.0
img = (img - [0.485, 0.456, 0.406]) / [0.229, 0.224, 0.225]
img = np.transpose(img, (2, 0, 1)) 转换为CHW格式
img = np.expand_dims(img, axis=0) 增加批次维度
return img
def infer(self, image_path):
input_data = self.preprocess(image_path)
input_handle = self.predictor.get_input_handle(self.input_names[0])
input_handle.copy_from_cpu(input_data)
self.predictor.run()
output_handle = self.predictor.get_output_handle(self.output_names[0])
features = output_handle.copy_to_cpu()
特征向量归一化
features = features / np.linalg.norm(features, axis=1, keepdims=True)
return features.flatten().tolist()
实例化
extractor = FaceFeatureExtractor("./models/PP-ShiTuV2_rec_infer")
创建主服务文件`main.py`,提供特征提取接口。

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import uvicorn
import numpy as np
import cv2
import tempfile
import os
from inference import FaceFeatureExtractor
app = FastAPI()
extractor = FaceFeatureExtractor("./models/PP-ShiTuV2_rec_infer")
@app.post("/extract_feature")
async def extract_feature(file: UploadFile = File(...)):
保存上传的临时文件
suffix = os.path.splitext(file.filename)[1]
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp:
content = await file.read()
tmp.write(content)
tmp_path = tmp.name
try:
提取特征
feature_vector = extractor.infer(tmp_path)
return JSONResponse(content={"status": "success", "feature": feature_vector})
except Exception as e:
return JSONResponse(content={"status": "error", "message": str(e)}, status_code=500)
finally:
清理临时文件
os.unlink(tmp_path)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
启动服务:
cd face_service
python main.py
服务将在`http://localhost:8000`运行。你可以使用`curl`测试:
curl -X POST "http://localhost:8000/extract_feature" -F "file=@/path/to/your/face.jpg"
在MySQL中创建数据库和表,用于存储档案用户信息及其人脸特征。
CREATE DATABASE archive_db;
USE archive_db;
CREATE TABLE archive_user (
id INT AUTO_INCREMENT PRIMARY KEY,
employee_id VARCHAR(50) NOT NULL UNIQUE COMMENT '工号',
name VARCHAR(100) NOT NULL COMMENT '姓名',
department VARCHAR(100) COMMENT '部门',
face_feature JSON COMMENT '存储512维人脸特征向量',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='档案用户表';
创建数据访问层`database.py`,用于连接数据库并操作特征数据。
import mysql.connector
import json
from mysql.connector import Error
class FaceDatabase:
def __init__(self, host='localhost', user='root', password='your_password', database='archive_db'):
self.connection = mysql.connector.connect(
host=host,
user=user,
password=password,
database=database
)
def add_user_with_face(self, employee_id, name, department, feature_vector):
cursor = self.connection.cursor()
query = """INSERT INTO archive_user (employee_id, name, department, face_feature)
VALUES (%s, %s, %s, %s)"""
cursor.execute(query, (employee_id, name, department, json.dumps(feature_vector)))
self.connection.commit()
cursor.close()
def search_by_face(self, query_feature, threshold=0.6):
cursor = self.connection.cursor(dictionary=True)
cursor.execute("SELECT id, employee_id, name, department, face_feature FROM archive_user")
rows = cursor.fetchall()
cursor.close()
results = []
for row in rows:
stored_feature = json.loads(row['face_feature'])
计算余弦相似度
similarity = np.dot(query_feature, stored_feature)
if similarity >= threshold:
row['similarity'] = float(similarity)
results.append(row)
按相似度降序排列
results.sort(key=lambda x: x['similarity'], reverse=True)
return results
def close(self):
self.connection.close()
在档案管理系统的前端页面中,添加人脸注册和识别的HTML组件。
将上述组件串联,形成两个核心业务流程:人脸注册和人脸识别。
为确保系统稳定运行,需关注以下配置点:
至此,一个具备人脸识别功能的档案管理系统核心模块已全部构建完成。从模型服务、数据存储到前端交互的每一步均有可直接运行的代码。请根据你的具体业务需求,将上述模块集成到现有系统中,并完成最终的联调测试。