零基础搭建轻量档案管理软件附完整人脸识别实操步骤

一、前期准备工作

本次搭建使用纯开源免费组件,不需要购买任何硬件设备(电脑内置摄像头即可),全流程本地运行,不泄露隐私。

1.1 环境准备

1.2 依赖库安装

打开电脑终端(Windows按Win+R输入cmd回车,Mac按Command+空格输入Terminal回车),依次执行以下命令:

```bash 升级pip到最新版(避免安装报错) python -m pip install --upgrade pip 安装依赖组件,复制后直接回车等待安装完成 pip install opencv-python==4.8.0.76 dlib==19.24.2 face-recognition==1.3.0 flask==2.3.3 flask-sqlalchemy==3.0.5 ```

注意:Windows安装dlib可能因缺少C++编译环境报错,此时需先下载并安装Visual Studio Build Tools 2022(勾选「使用C++的桌面开发」即可),下载地址https://visualstudio.microsoft.com/zh-hans/downloads/build-tools-for-visual-studio-2022,安装完成重启终端再执行依赖安装命令。

二、项目文件结构创建

在电脑任意位置新建文件夹命名为「LocalFaceArchive」,内部创建以下文件/文件夹,保持严格层级:

  • LocalFaceArchive/
    • app.py(核心程序文件)
    • config.py(基础配置文件)
    • static/
      • faces/(用于存放录入的人脸照片,自动创建)
      • uploads/(用于存放上传的档案文件,自动创建)
    • templates/
      • index.html(主界面)

三、代码与配置文件编写

3.1 基础配置文件config.py

完整可复制内容:

```python import os 项目根目录 BASE_DIR = os.path.abspath(os.path.dirname(__file__)) 人脸照片存储路径 FACE_FOLDER = os.path.join(BASE_DIR, 'static', 'faces') 档案文件存储路径 UPLOAD_FOLDER = os.path.join(BASE_DIR, 'static', 'uploads') 允许上传的档案格式 ALLOWED_EXTENSIONS = {'pdf', 'doc', 'docx', 'xls', 'xlsx', 'jpg', 'jpeg', 'png'} Flask数据库配置(SQLite本地数据库,无需额外安装) SQLALCHEMY_DATABASE_URI = f'sqlite:///{os.path.join(BASE_DIR, "archive.db")}' SQLALCHEMY_TRACK_MODIFICATIONS = False Flask密钥(用于session加密) SECRET_KEY = 'your_random_secret_key_123456789' ```

3.2 核心程序文件app.py

完整可复制内容:

```python import os import cv2 import face_recognition from flask import Flask, render_template, request, redirect, url_for, session, flash from flask_sqlalchemy import SQLAlchemy from werkzeug.utils import secure_filename from datetime import datetime import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) 自动创建必要文件夹 for folder in [config.FACE_FOLDER, config.UPLOAD_FOLDER]: if not os.path.exists(folder): os.makedirs(folder) 数据库模型定义(用户表、档案表) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), unique=True, nullable=False) face_encoding = db.Column(db.LargeBinary, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) class Archive(db.Model): id = db.Column(db.Integer, primary_key=True) filename = db.Column(db.String(200), nullable=False) file_path = db.Column(db.String(300), nullable=False) uploader_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) uploader = db.relationship('User', backref=db.backref('archives', lazy=True)) uploaded_at = db.Column(db.DateTime, default=datetime.utcnow) description = db.Column(db.Text) 辅助函数1:检查档案格式是否合法 def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in config.ALLOWED_EXTENSIONS 辅助函数2:获取当前摄像头的人脸编码 def get_face_encoding_from_camera(): video_capture = cv2.VideoCapture(0) face_encoding = None while True: ret, frame = video_capture.read() if not ret: break 缩小画面提高检测速度 small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) rgb_small_frame = small_frame[:, :, ::-1] face_locations = face_recognition.face_locations(rgb_small_frame) if len(face_locations) == 1: face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) if face_encodings: face_encoding = face_encodings[0].tobytes() break 显示提示画面 cv2.putText(frame, 'Press Q to exit | Wait for 1 clear face', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow('Face Capture', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows() return face_encoding 辅助函数3:人脸比对 def compare_face_with_db(unknown_encoding_bytes): unknown_encoding = face_recognition.face_encodings_from_bytes(unknown_encoding_bytes)[0] users = User.query.all() for user in users: known_encoding = face_recognition.face_encodings_from_bytes(user.face_encoding)[0] matches = face_recognition.compare_faces([known_encoding], unknown_encoding, tolerance=0.5) if matches[0]: return user return None 路由1:首页(登录/注册入口) @app.route('/') def index(): if 'user_id' in session: user = User.query.get(session['user_id']) archives = Archive.query.filter_by(uploader_id=user.id).all() return render_template('index.html', user=user, archives=archives) return render_template('index.html') 路由2:用户注册 @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': name = request.form.get('name').strip() if not name: flash('姓名不能为空!', 'error') return redirect(url_for('register')) if User.query.filter_by(name=name).first(): flash('该姓名已被注册!', 'error') return redirect(url_for('register')) 弹出摄像头拍照并编码 flash('请等待摄像头启动,确保画面只有1张清晰人脸!', 'info') face_encoding = get_face_encoding_from_camera() if not face_encoding: flash('人脸采集失败,请重新尝试!', 'error') return redirect(url_for('register')) 保存用户到数据库 new_user = User(name=name, face_encoding=face_encoding) db.session.add(new_user) db.session.commit() flash('注册成功!请进行人脸识别登录!', 'success') return redirect(url_for('login')) return render_template('index.html', show_register=True) 路由3:人脸识别登录 @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': flash('请等待摄像头启动,确保画面只有1张清晰人脸!', 'info') unknown_encoding = get_face_encoding_from_camera() if not unknown_encoding: flash('人脸采集失败,请重新尝试!', 'error') return redirect(url_for('login')) user = compare_face_with_db(unknown_encoding) if user: session['user_id'] = user.id flash(f'欢迎回来,{user.name}!', 'success') return redirect(url_for('index')) else: flash('未识别到注册用户,请重新尝试!', 'error') return redirect(url_for('login')) return render_template('index.html', show_login=True) 路由4:退出登录 @app.route('/logout') def logout(): session.pop('user_id', None) flash('已退出登录!', 'info') return redirect(url_for('index')) 路由5:上传档案 @app.route('/upload', methods=['POST']) def upload(): if 'user_id' not in session: return redirect(url_for('login')) if 'file' not in request.files: flash('未选择文件!', 'error') return redirect(url_for('index')) file = request.files['file'] description = request.form.get('description', '').strip() if file.filename == '': flash('未选择文件!', 'error') return redirect(url_for('index')) if file and allowed_file(file.filename): 防止文件名冲突 original_filename = secure_filename(file.filename) timestamp = datetime.utcnow().strftime('%Y%m%d%H%M%S') filename = f'{timestamp}_{original_filename}' file_path = os.path.join(config.UPLOAD_FOLDER, filename) file.save(file_path) 保存档案到数据库 new_archive = Archive( filename=original_filename, file_path=file_path, uploader_id=session['user_id'], description=description ) db.session.add(new_archive) db.session.commit() flash('档案上传成功!', 'success') else: flash('不支持的档案格式!', 'error') return redirect(url_for('index')) 初始化数据库(首次运行执行一次) with app.app_context(): db.create_all() if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000) ```

3.3 主界面templates/index.html

完整可复制内容:

```html 本地人脸识别档案管理 本地人脸识别档案管理系统 {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %}
{{ message }}
{% endfor %} {% endif %} {% endwith %} {% if user %}

零基础搭建轻量档案管理软件附完整人脸识别实操步骤

当前用户:{{ user.name }} 退出登录

上传档案

我的档案

{% if archives %} {% for archive in archives %}

文件名:{{ archive.filename }}

上传时间:{{ archive.uploaded_at.strftime('%Y-%m-%d %H:%M:%S') }}

{% if archive.description %}

描述:{{ archive.description }}

{% endif %}
{% endfor %} {% else %}

暂无档案

{% endif %} {% else %}

请先登录或注册

注册 人脸识别登录 {% endif %} ```

四、运行与使用

4.1 启动系统

在终端中进入「LocalFaceArchive」文件夹(Windows输入`cd C:\Users\你的用户名\Desktop\LocalFaceArchive`,Mac输入`cd ~/Desktop/LocalFaceArchive`,需根据实际文件夹位置修改),执行以下命令:

```bash python app.py ```

看到终端输出「Running on all addresses (0.0.0.0)」「Debug mode: on」后,打开任意浏览器访问http://127.0.0.1:5000即可使用。

4.2 核心功能操作

  • 注册新用户:点击「注册」按钮,输入唯一姓名后按提示等待摄像头启动,保持画面光线充足、人脸无遮挡,系统自动采集人脸后注册成功。
  • 人脸识别登录:点击「人脸识别登录」按钮,等待摄像头启动,系统自动比对成功后进入主界面。
  • 上传档案:登录后选择文件、填写可选描述,点击「上传」即可保存到本地uploads文件夹并记录到数据库。

4.3 注意事项

  • 摄像头仅在注册/登录时临时调用,采集的人脸数据以加密二进制形式保存在本地SQLite数据库中,无网络传输。
  • 人脸识别tolerance参数设为0.5,可在app.py的compare_face_with_db函数中修改(数值越小比对越严格,数值越大越宽松)。
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统