YOLOv12与数据库集成:使用MySQL存储检测结果与元数据

news2026/3/29 0:09:03
YOLOv12与数据库集成使用MySQL存储检测结果与元数据1. 引言想象一下这个场景你部署了一个YOLOv12模型用来实时监控仓库的货物进出。摄像头24小时不间断工作模型每秒都能识别出几十个包裹、叉车和人员。识别结果很准屏幕上实时显示着一个个框。但问题来了这些一闪而过的检测结果怎么变成有用的数据老板问“今天下午三点到五点有多少个A类包裹入库”或者“昨天识别出的所有叉车平均置信度是多少”你总不能盯着录像带一帧一帧数吧。这就是我们今天要解决的问题。YOLOv12这类目标检测模型本身是个“识别专家”但它只管“看”不管“记”。要让识别结果产生真正的业务价值比如生成报表、分析趋势、触发告警就必须把这些零散的结果结构化地存起来。而数据库特别是像MySQL这样成熟稳定的关系型数据库就是存放这些数据的“数字仓库”。本文将带你一步步搭建这个“识别-存储-分析”的桥梁。我们会从最基础的MySQL环境准备开始设计一个既能存下检测结果又能方便后续查询的表结构然后用Python代码把YOLOv12的输出“喂”进数据库。最后我们还会看看怎么把这些存起来的数据“挖”出来回答一些实际的业务问题。整个过程就像给聪明的YOLOv12配上一个靠谱的“记事本”让它不仅会看还会记、会算。2. 环境准备与MySQL基础在开始写代码之前我们得先把“仓库”建好。这里说的仓库就是MySQL数据库。如果你已经熟悉MySQL可以快速浏览这一节如果你是第一次接触跟着步骤走十分钟就能搭好。2.1 快速安装MySQL安装MySQL有很多方法为了让大家都能快速上手我们推荐使用Docker它能避免很多环境配置的麻烦。如果你还没安装Docker可以去官网下载一个安装过程很简单。打开你的终端命令行工具执行下面这条命令docker run --name some-mysql -e MYSQL_ROOT_PASSWORDmy-secret-pw -p 3306:3306 -d mysql:8.0这条命令做了几件事从网络拉取MySQL 8.0的镜像创建一个叫some-mysql的容器设置了root用户的密码为my-secret-pw并把容器里的3306端口映射到你电脑的3306端口。执行成功后一个MySQL服务就在后台运行起来了。2.2 连接数据库与基本操作数据库服务跑起来了我们得进去看看并创建我们自己的数据库和用户。推荐使用一个图形化工具比如MySQL Workbench或者DBeaver它们比命令行更直观。这里我们用命令行演示原理是一样的。首先进入MySQL容器内部的命令行docker exec -it some-mysql mysql -uroot -p输入之前设置的密码my-secret-pw你就进入了MySQL的命令行界面。接下来我们创建一个专门用于YOLO检测项目的数据库CREATE DATABASE yolo_detection_db; USE yolo_detection_db;然后创建一个有权限操作这个数据库的用户这比直接用root用户更安全CREATE USER yolo_user% IDENTIFIED BY user_password; GRANT ALL PRIVILEGES ON yolo_detection_db.* TO yolo_user%; FLUSH PRIVILEGES;这样我们就有了一个干净的数据库yolo_detection_db和一个用户yolo_user。环境准备完毕可以开始设计我们的“货物架”——也就是数据表了。3. 设计检测结果的数据表数据库好比一个仓库数据表就是里面一个个货架。货架设计得好货物数据放得整齐以后找起来就快。我们的“货物”是YOLOv12的检测结果主要包括检测到了什么、位置在哪、有多确信、以及什么时候检测到的。3.1 核心表结构设计经过思考我们设计一张核心表detection_results来存储所有信息。下面是创建这张表的SQL语句CREATE TABLE detection_results ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp DATETIME NOT NULL, image_source VARCHAR(255), model_version VARCHAR(50) DEFAULT yolov12, class_id INT NOT NULL, class_name VARCHAR(100) NOT NULL, confidence DECIMAL(5, 4) NOT NULL, x_min INT NOT NULL, y_min INT NOT NULL, x_max INT NOT NULL, y_max INT NOT NULL, image_width INT, image_height INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );我来解释一下每个字段是干什么用的id: 每条记录的唯一编号数据库会自动帮我们增加不用管。timestamp:检测时间。这是非常重要的字段记录了是哪一秒识别出的这个目标。方便我们按时间查询比如“查昨天下午的”。image_source: 图片或视频流的来源。比如是“仓库东门摄像头”、“视频文件test.mp4”。model_version: 用的哪个模型比如‘yolov12s’‘yolov12m’。方便以后模型升级了做对比。class_idclass_name: 目标的类别ID和名称。比如0和person。存两个是为了查询方便有时按ID快有时按名字读起来直观。confidence: 置信度范围0~1。表示模型有多确信这个框里是它说的那个东西。这个值可以用来过滤掉那些模棱两可的结果。x_min, y_min, x_max, y_max: 目标框的坐标。分别是左上角x、y坐标和右下角x、y坐标。有了它们我们不仅能知道有什么还能知道在哪。image_widthimage_height: 原图的宽高。存下来有个好处以后如果想在别的分辨率的屏幕上重新画这个框可以通过比例换算。created_at: 记录插入数据库的时间自动生成。它和timestamp的区别在于一个是“发生时间”一个是“入库时间”。3.2 为什么这样设计你可能会问为什么不把所有的框信息塞进一个字段那样设计以后查询会非常痛苦。比如老板问“把所有置信度高于0.9的人找出来”我们的设计只需要一句简单的SELECT * FROM detection_results WHERE class_nameperson AND confidence 0.9。如果混在一个字段里就需要先拆解字符串效率极低。这样的结构设计让每一条数据都独立、清晰无论是按时间查、按类别查、还是按位置查数据库都能利用索引飞快地找到结果为后续的数据分析打下了坚实的基础。4. 使用Python连接与操作数据库表设计好了接下来就是用Python把YOLOv12产生的结果一条条地存进去。直接写原始的SQL语句有点繁琐我们用一个叫做SQLAlchemy的工具它能把数据库表当成Python的类和对象来操作非常方便。4.1 安装依赖与建立连接首先安装必要的Python库pip install sqlalchemy pymysql然后我们在Python代码里建立和数据库的连接。创建一个叫database.py的文件from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float, DECIMAL from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker from datetime import datetime # 定义数据库连接地址 # 格式mysqlpymysql://用户名:密码服务器地址/数据库名 DATABASE_URL mysqlpymysql://yolo_user:user_passwordlocalhost:3306/yolo_detection_db # 创建引擎echoTrue可以在控制台看到执行的SQL语句调试时有用 engine create_engine(DATABASE_URL, echoFalse) # 创建基类 Base declarative_base() # 创建会话工厂 SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) # 依赖项用于在接口中获取数据库会话 def get_db(): db SessionLocal() try: yield db finally: db.close()4.2 定义数据模型并创建表接下来我们用Python类来定义我们之前设计的那张表。这就像为表结构做了一个Python版的模具。# 在 database.py 中继续定义DetectionResult类 class DetectionResult(Base): __tablename__ detection_results id Column(Integer, primary_keyTrue, indexTrue) timestamp Column(DateTime, nullableFalse) image_source Column(String(255)) model_version Column(String(50), defaultyolov12) class_id Column(Integer, nullableFalse) class_name Column(String(100), nullableFalse) confidence Column(DECIMAL(5, 4), nullableFalse) # 共5位小数点后4位 x_min Column(Integer, nullableFalse) y_min Column(Integer, nullableFalse) x_max Column(Integer, nullableFalse) y_max Column(Integer, nullableFalse) image_width Column(Integer) image_height Column(Integer) created_at Column(DateTime, defaultdatetime.utcnow) # 创建所有表如果不存在 Base.metadata.create_all(bindengine)运行这段代码SQLAlchemy会自动检查数据库如果detection_results表不存在就会按照这个结构创建它。非常省心。5. 将YOLOv12检测结果存入MySQL现在到了最关键的一步把YOLOv12的检测结果和我们的数据库连接起来。假设你已经有一段YOLOv12的检测代码它会输出包含框、类别、置信度的结果。我们需要做的就是写一个“搬运工”函数把这些结果打包成DetectionResult对象然后存入数据库。5.1 编写数据插入函数我们创建一个新的文件save_to_db.pyfrom datetime import datetime from sqlalchemy.orm import Session # 导入之前定义的模型和获取会话的函数 from database import DetectionResult, get_db def save_detection_to_db(db: Session, detections: list, image_source: str unknown, model_version: str yolov12, img_width: int None, img_height: int None): 将一批检测结果保存到数据库。 参数: db: 数据库会话 detections: 检测结果列表每个元素是一个字典包含 - bbox: [x_min, y_min, x_max, y_max] - class_id: int - class_name: str - confidence: float image_source: 图片来源描述 model_version: 模型版本 img_width: 原图宽度 img_height: 原图高度 detection_objects [] current_time datetime.now() for det in detections: # 构建一个DetectionResult对象 db_detection DetectionResult( timestampcurrent_time, # 使用统一的检测时间 image_sourceimage_source, model_versionmodel_version, class_iddet[class_id], class_namedet[class_name], confidencedet[confidence], x_minint(det[bbox][0]), y_minint(det[bbox][1]), x_maxint(det[bbox][2]), y_maxint(det[bbox][3]), image_widthimg_width, image_heightimg_height ) detection_objects.append(db_detection) # 批量添加到数据库会话 db.add_all(detection_objects) # 提交事务将数据真正写入数据库 db.commit() print(f成功保存 {len(detection_objects)} 条检测记录到数据库。)5.2 集成到YOLO检测流程中现在在你的主检测循环里调用这个函数就行了。下面是一个模拟的示例# 假设这是你的YOLOv12检测主循环中的一部分 def main_detection_loop(): # ... 初始化模型加载图片等代码 ... # 获取一个数据库会话 db next(get_db()) while True: # ... 读取一帧图像 frame ... # ... 使用YOLOv12模型进行检测得到结果 results ... # 模拟YOLO输出结果格式 # 实际中你需要根据你用的YOLO接口调整这部分代码 mock_detections [ { bbox: [100, 150, 200, 300], # x_min, y_min, x_max, y_max class_id: 0, class_name: person, confidence: 0.95 }, { bbox: [300, 80, 450, 200], class_id: 2, class_name: car, confidence: 0.88 } ] # 调用函数保存结果 save_detection_to_db( dbdb, detectionsmock_detections, image_sourcestream_camera_01, model_versionyolov12n, img_widthframe.shape[1], # 图像宽度 img_heightframe.shape[0] # 图像高度 ) # ... 其他处理如显示图像 ... # 循环结束后关闭会话 (在get_db()的finally中已处理)这样每次YOLO完成一帧的检测结果就会被实时地、结构化地保存到MySQL数据库中。数据不再是一闪而过的像素而是变成了可以永久查询和分析的记录。6. 查询与分析存储的数据数据存进去不是目的用起来才是。当你的数据库里积累了成千上万条检测记录后它就变成了一个宝库。我们可以用SQL轻松地挖掘出有价值的信息。6.1 基础统计查询连接到你的数据库用命令行或图形化工具就可以开始“提问”了。1. 查询今天所有的检测记录SELECT * FROM detection_results WHERE DATE(timestamp) CURDATE();2. 统计不同类别的检测数量比如生成一个报表SELECT class_name, COUNT(*) as count FROM detection_results WHERE timestamp NOW() - INTERVAL 1 DAY -- 过去24小时 GROUP BY class_name ORDER BY count DESC;3. 查找置信度低于阈值的结果可能是误检需要复查SELECT * FROM detection_results WHERE confidence 0.5 ORDER BY timestamp DESC LIMIT 100;6.2 业务场景分析示例基于这些基础查询我们可以组合出回答具体业务问题的语句。场景A仓库安全管理。“过去一小时内在仓库的A区假设对应图像坐标x500有没有检测到人”SELECT COUNT(*) as person_count FROM detection_results WHERE class_name person AND timestamp NOW() - INTERVAL 1 HOUR AND x_min 500; -- A区x坐标大于500如果person_count大于0就可以触发告警。场景B生产效率分析。“分析今天上午9点到11点叉车class_id7的平均移动速度假设通过框的中心点位置变化估算” 这需要更复杂的查询可能需要结合连续帧的数据进行计算但所有原始数据时间、位置、类别都已具备。场景C模型性能评估。“对比‘yolov12s’和‘yolov12m’两个模型版本在检测‘car’时平均置信度有什么差异”SELECT model_version, AVG(confidence) as avg_confidence FROM detection_results WHERE class_name car GROUP BY model_version;6.3 在Python中进行数据分析除了直接写SQL我们也可以在Python里用Pandas这样的工具做更灵活的分析import pandas as pd from sqlalchemy import text # 从数据库读取最近10000条记录到DataFrame with engine.connect() as conn: df pd.read_sql(text(SELECT * FROM detection_results ORDER BY timestamp DESC LIMIT 10000), conn) # 现在可以用Pandas进行各种分析了 # 1. 查看数据概览 print(df.info()) print(df.head()) # 2. 计算每个类别的平均置信度 avg_conf_by_class df.groupby(class_name)[confidence].mean().sort_values(ascendingFalse) print(avg_conf_by_class) # 3. 按小时统计检测数量用于画趋势图 df[hour] df[timestamp].dt.hour detections_per_hour df.groupby(hour).size() print(detections_per_hour)将数据存入MySQL后你可以轻松地将其与BI工具如Metabase, Tableau连接制作实时数据看板或者集成到你的Web应用后台提供数据API。数据的价值被彻底释放了出来。7. 总结走完这一整套流程你会发现给YOLOv12配上MySQL就像给一位顶尖的观察员配了一位永不疲倦的档案管理员。模型负责“发现”数据库负责“记录”和“整理”。从安装MySQL、设计表结构到用Python桥接两者最后进行查询分析每一步都是在构建一个可扩展、可回溯、可分析的数据管道。这种做法带来的好处是实实在在的。首先数据持久化了不会因为程序关闭而消失。其次查询变得极其高效无论是按时间、类别还是位置筛选都能秒级响应。最重要的是它为上层业务应用提供了坚实的数据支撑无论是生成统计报表、触发实时告警还是进行长期的行为模式分析都成为了可能。在实际操作中你可能会遇到一些需要优化的地方比如数据量极大时的插入速度、是否需要分表分库、如何建立索引来加速特定查询等。但本文搭建的这个基础框架已经能够应对大多数中小规模应用场景的需求了。你可以先基于这个框架跑起来让数据流动起来再根据实际遇到的情况去迭代优化。不妨现在就试试把你下一个YOLO项目的检测结果存到数据库里体验一下从“看见”到“洞见”的飞跃。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2459628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…