MogFace WebUI数据库集成教程:使用MySQL存储检测记录与日志

张开发
2026/4/19 19:12:39 15 分钟阅读

分享文章

MogFace WebUI数据库集成教程:使用MySQL存储检测记录与日志
MogFace WebUI数据库集成教程使用MySQL存储检测记录与日志你是不是在用MogFace WebUI做人脸检测每次运行完结果看一眼就没了想查三天前处理过哪些图片或者统计一下最近一个月检测到的人脸总数是不是感觉无从下手如果只是临时用用不保存数据倒也没什么。但如果你需要长期使用或者想把检测结果用于后续分析没有数据持久化功能就太不方便了。今天这个教程就是帮你解决这个问题的。我会手把手带你给MogFace WebUI装上一个“记忆系统”——用MySQL数据库来存储每一次的检测记录和运行日志。完成后你不仅能随时翻看历史记录还能生成简单的统计报表让这个工具真正变得实用起来。整个过程不难跟着步骤走就行。你需要准备的就是一个能运行MogFace WebUI的环境以及一颗不排斥敲几行命令的心。我们开始吧。1. 环境准备与MySQL安装在动手修改WebUI之前我们得先把数据库这个“仓库”搭好。这里我们选择MySQL因为它足够流行资料多出了问题也好查。1.1 安装MySQL数据库如果你已经安装过MySQL可以跳过这一步。如果没有下面是在常见Linux系统如Ubuntu上的安装方法。打开你的终端依次执行以下命令# 更新软件包列表 sudo apt update # 安装MySQL服务器 sudo apt install mysql-server -y安装完成后MySQL服务会自动启动。你可以检查一下它的运行状态sudo systemctl status mysql如果看到active (running)的字样说明服务已经跑起来了。1.2 进行安全配置并创建数据库刚安装好的MySQL默认配置不太安全我们需要运行一个安全脚本同时也会设置root用户的密码。sudo mysql_secure_installation运行这个命令后它会问你几个问题验证密码插件一般输入n不使用。设置root密码输入y然后设置一个你记得住的强密码。之后关于移除匿名用户、禁止root远程登录、删除测试数据库等选项一路输入y确认就好这样更安全。配置完成后我们登录MySQL为MogFace创建一个专用的数据库和用户。这样做比直接用root用户更安全。# 以root身份登录MySQL会提示你输入刚才设置的密码 sudo mysql -u root -p登录成功后你会看到mysql提示符。在这个环境下执行以下SQL命令-- 创建一个名为mogface_db的数据库 CREATE DATABASE mogface_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建一个新用户比如叫mogface_user并设置密码请把‘your_strong_password_here’换成你自己的密码 CREATE USER mogface_userlocalhost IDENTIFIED BY your_strong_password_here; -- 授予这个用户对mogface_db数据库的所有权限 GRANT ALL PRIVILEGES ON mogface_db.* TO mogface_userlocalhost; -- 让权限设置立即生效 FLUSH PRIVILEGES; -- 退出MySQL命令行 EXIT;好了数据库的“仓库”和“管理员”都准备好了。接下来我们要设计一下仓库里放货物的“货架”也就是数据表。2. 设计数据表结构我们的目标是记录每次人脸检测的关键信息。思考一下哪些信息值得保存我觉得至少要有下面这些检测时间什么时候做的检测。图片信息检测的是哪张图。检测结果找到了几张脸每张脸的置信度是多少。额外信息比如处理这张图花了多久或者当时WebUI的版本。基于这些我们来设计两张表。2.1 创建检测记录表这张表detection_records是核心存放每一次检测任务的结果摘要。重新用我们新建的专用用户登录MySQL来创建表mysql -u mogface_user -p mogface_db输入密码后执行下面的SQL语句来建表CREATE TABLE detection_records ( id INT AUTO_INCREMENT PRIMARY KEY, image_path VARCHAR(500) NOT NULL COMMENT ‘被检测图片的路径或文件名’, detection_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT ‘检测完成的时间’, face_count INT NOT NULL COMMENT ‘检测到的人脸数量’, avg_confidence FLOAT COMMENT ‘所有人脸框的平均置信度’, processing_time FLOAT COMMENT ‘处理该图片所花费的时间秒’, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT ‘记录创建时间’ ) COMMENT ‘人脸检测记录表’;我来解释一下这几个字段id每条记录的唯一编号会自动增长。image_path图片的路径。VARCHAR(500)应该足够长了。detection_time检测完成的时间默认就是当前时间。face_count最重要的结果之一检测到几张脸。avg_confidence平均置信度帮你判断这次检测的整体把握有多大。processing_time处理耗时可以用来评估性能。created_at记录写入数据库的时间和detection_time略有不同主要用于内部追踪。2.2 创建运行日志表除了结果系统的运行状态也值得记录。比如什么时候有人访问了页面有没有出现错误等。这有助于后期排查问题。CREATE TABLE operation_logs ( id INT AUTO_INCREMENT PRIMARY KEY, log_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT ‘日志时间’, log_level VARCHAR(20) COMMENT ‘日志级别如INFO, ERROR, WARNING’, module VARCHAR(100) COMMENT ‘产生日志的功能模块’, message TEXT COMMENT ‘日志详情’, user_ip VARCHAR(45) COMMENT ‘触发操作的用户IP地址’ ) COMMENT ‘系统运行日志表’;这张表结构更通用一些可以记录各种信息。有了这两张“货架”我们的数据库就准备好了。现在我们需要让Python程序学会怎么往这个仓库里存取货物。3. 编写Python数据库操作接口MogFace WebUI通常是用Python的Gradio或Streamlit等库写的。我们需要在它的代码里加入操作数据库的部分。这里我假设你用的是PyMySQL这个库来连接MySQL它非常轻量简单。3.1 安装依赖库首先在你的Python环境中安装必要的库。打开终端在MogFace WebUI的项目目录下执行pip install pymysql3.2 创建数据库连接与操作类一个好的做法是把所有数据库操作封装在一个类里这样代码整洁也方便维护。在你的项目里新建一个Python文件比如叫database_handler.py。# database_handler.py import pymysql from pymysql import Error import logging from datetime import datetime class MogFaceDB: def __init__(self, host‘localhost’, user‘mogface_user’, password‘your_strong_password_here’, database‘mogface_db’): 初始化数据库连接。 注意请将password参数替换成你创建用户时设置的真实密码 self.host host self.user user self.password password self.database database self.connection None self.logger logging.getLogger(__name__) def connect(self): 建立数据库连接 try: self.connection pymysql.connect( hostself.host, userself.user, passwordself.password, databaseself.database, charset‘utf8mb4’, cursorclasspymysql.cursors.DictCursor # 让结果以字典形式返回更方便 ) self.logger.info(“成功连接到数据库”) return True except Error as e: self.logger.error(f“连接数据库失败: {e}”) return False def insert_detection_record(self, image_path, face_count, avg_confidenceNone, processing_timeNone): 向detection_records表插入一条检测记录 if not self.connection: if not self.connect(): return False try: with self.connection.cursor() as cursor: sql “”“ INSERT INTO detection_records (image_path, face_count, avg_confidence, processing_time) VALUES (%s, %s, %s, %s) ”“” cursor.execute(sql, (image_path, face_count, avg_confidence, processing_time)) self.connection.commit() self.logger.info(f“检测记录已保存: {image_path}”) return True except Error as e: self.logger.error(f“插入检测记录失败: {e}”) return False def insert_log(self, log_level, module, message, user_ipNone): 向operation_logs表插入一条运行日志 if not self.connection: if not self.connect(): return False try: with self.connection.cursor() as cursor: sql “”“ INSERT INTO operation_logs (log_level, module, message, user_ip) VALUES (%s, %s, %s, %s) ”“” cursor.execute(sql, (log_level, module, message, user_ip)) self.connection.commit() # 日志通常不需要再记录日志这里可以省略info log return True except Error as e: # 如果连日志都写不进去只能打印到控制台了 print(f“插入运行日志失败: {e}”) return False def get_recent_detections(self, limit50): 获取最近的检测记录用于历史查询 if not self.connection: if not self.connect(): return [] try: with self.connection.cursor() as cursor: sql “SELECT * FROM detection_records ORDER BY detection_time DESC LIMIT %s” cursor.execute(sql, (limit,)) results cursor.fetchall() return results except Error as e: self.logger.error(f“查询检测记录失败: {e}”) return [] def get_detection_stats(self, days7): 获取最近N天的检测统计信息图片数、人脸总数等 if not self.connection: if not self.connect(): return {} try: with self.connection.cursor() as cursor: sql “”“ SELECT COUNT(*) as total_images, SUM(face_count) as total_faces, AVG(processing_time) as avg_processing_time FROM detection_records WHERE detection_time DATE_SUB(NOW(), INTERVAL %s DAY) ”“” cursor.execute(sql, (days,)) stats cursor.fetchone() # 处理可能为NULL的情况 if stats[‘total_faces’] is None: stats[‘total_faces’] 0 if stats[‘avg_processing_time’] is None: stats[‘avg_processing_time’] 0 return stats except Error as e: self.logger.error(f“获取统计信息失败: {e}”) return {} def close(self): 关闭数据库连接 if self.connection: self.connection.close() self.logger.info(“数据库连接已关闭”)这个类把常用的增、查操作都包好了。接下来就是把它“织”进WebUI的原有流程里。4. 在WebUI中集成数据库功能集成是关键一步我们需要在用户点击“检测”按钮后不仅显示结果还要默默地把记录存到数据库。同时我们还要新增两个功能查看历史记录和显示统计报表。4.1 修改主检测函数找到你WebUI中执行人脸检测的那个核心函数。假设它原来叫run_detection(image)。我们需要修改它在检测完成后调用我们刚写的数据库类。# 假设这是你原来的主程序文件比如 app.py import time from database_handler import MogFaceDB # 导入我们刚写的类 # 初始化全局数据库处理器 db_handler MogFaceDB() def run_detection(input_image): 修改后的检测函数增加数据保存逻辑 start_time time.time() # 1. 这里是原有的人脸检测代码假设调用MogFace模型 # 例如faces, confidences mogface_model.detect(input_image) # 我们模拟一个结果 face_count 5 # 假设检测到5张脸 avg_confidence 0.92 # 假设平均置信度92% image_path “uploaded_image.jpg” # 这里应该是你处理图片后保存的路径或者用时间戳生成唯一文件名 processing_time time.time() - start_time # 2. 将检测结果保存到数据库 db_handler.insert_detection_record( image_pathimage_path, face_countface_count, avg_confidenceavg_confidence, processing_timeprocessing_time ) # 3. 记录一条操作日志 db_handler.insert_log( log_level“INFO”, module“detection”, messagef“完成图片检测发现{face_count}张人脸耗时{processing_time:.2f}秒” ) # 4. 返回原有结果给前端显示这里只是示例 result_text f“检测完成共发现 {face_count} 张人脸平均置信度 {avg_confidence:.2%} 处理耗时 {processing_time:.2f} 秒。” # 可能还需要返回标注好的图片 return result_text, annotated_image这样每次检测数据就自动存下来了。4.2 添加历史查询与统计功能现在我们需要在WebUI的界面上增加新的交互元素。如果你用的是Gradio可以添加新的gr.Interface或者用gr.TabbedInterface来组织。下面是一个简单的示例在原有界面上增加两个按钮和一个显示区域import gradio as gr # 历史查询函数 def query_history(limit): records db_handler.get_recent_detections(limitint(limit)) if not records: return “暂无历史记录” # 把记录格式化成易读的字符串 history_text “最近检测记录\n\n” for r in records: history_text f“时间{r[‘detection_time’]} | 图片{r[‘image_path’]} | 人脸数{r[‘face_count’]} | 平均置信度{r[‘avg_confidence’]:.3f}\n” return history_text # 统计报表函数 def show_stats(days): stats db_handler.get_detection_stats(daysint(days)) if not stats: return “无法获取统计信息” stats_text f“最近 {days} 天统计报告\n\n” stats_text f“• 处理图片总数{stats[‘total_images’]} 张\n” stats_text f“• 检测人脸总数{stats[‘total_faces’]} 个\n” stats_text f“• 平均处理耗时{stats[‘avg_processing_time’]:.2f} 秒/张\n” return stats_text # 构建Gradio界面在原有界面基础上添加 with gr.Blocks() as demo: gr.Markdown(“# MogFace人脸检测系统数据库增强版”) with gr.Tab(“人脸检测”): # 这里是原有的图片上传、检测按钮、结果显示组件 # ... (your original detection UI components) ... with gr.Tab(“历史记录”): with gr.Row(): limit_slider gr.Slider(minimum10, maximum200, value50, step10, label“显示最近多少条记录”) query_btn gr.Button(“查询”) history_output gr.Textbox(label“检测历史”, lines15) query_btn.click(query_history, inputslimit_slider, outputshistory_output) with gr.Tab(“数据统计”): with gr.Row(): days_dropdown gr.Dropdown(choices[“1”, “7”, “30”, “90”], value“7”, label“统计时间范围天”) stats_btn gr.Button(“生成报告”) stats_output gr.Textbox(label“统计报告”, lines10) stats_btn.click(show_stats, inputsdays_dropdown, outputsstats_output) # 启动应用 demo.launch()这样一来你的WebUI就从一个单纯的检测工具升级成了一个带有数据管理能力的轻量级系统。5. 总结跟着走完这一趟你的MogFace WebUI应该已经成功接上了MySQL数据库。现在每次检测的结果都不会再丢失你可以随时回溯历史也能看到一些简单的统计数据实用性大大增强。整个过程的核心其实就是三步搭好数据库、写好连接代码、把代码嵌入到原有流程中。虽然我以Gradio为例但思路是通用的如果你用的是Streamlit或Flask调整一下前端部分的代码即可。遇到问题别慌最常见的无非是数据库连不上检查密码、用户权限、SQL语句报错检查表名、字段名是否拼写正确。多看看终端或WebUI上打印的错误信息大部分都能解决。有了数据持久化这个基础以后想加什么功能都更方便了比如按日期筛选记录、导出CSV报表、甚至做更复杂的可视化图表。希望这个教程能帮你把工具用得更加得心应手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章