猫咪如厕检测与分类识别系统系列~进阶【三】网页端算法启动架构及数据库实现

news2025/5/16 20:32:33

前情提要


家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如厕习惯,我计划搭建一个基于视频监控和AI识别的系统,自动识别猫咪进出厕所的行为,记录如厕时间和停留时长,并区分不同猫咪。这样即使我不在家,也能掌握猫咪的健康状态,更安心地照顾它们。

🎓 各位的关注与点赞是我持续分享的最大动力,衷心感谢大家的支持!
📢 欢迎正在攻读硕博学位的同学,或是对人工智能充满热情的朋友们,关注我的个人公众号。在这里,我将持续更新博士期间阅读的前沿论文解读、项目实战经验分享,以及我对AI技术趋势的思考与探讨。
✨ 无论你是科研工作者、工程开发者,还是AI初学者,都能在这里找到干货与灵感。让我们一起交流、成长、探索人工智能的无限可能!


已完成工作:

✅猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
✅猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
✅猫咪如厕检测与分类识别系统系列【三】 融合yolov11目标检测
✅猫咪如厕检测与分类识别系统系列【四】融合检测日志输出及前端展示界面制作
✅猫咪如厕检测与分类识别系统系列【五】信息存储数据库改进+添加猫咪页面制作+猫咪躯体匹配算法架构更新
✅猫咪如厕检测与分类识别系统系列【六】分类模型训练+混合检测分类+未知目标自动更新

✅猫咪如厕检测与分类识别系统系列【七】 当前阶段总结报告

✅猫咪如厕检测与分类识别系统系列【八】 检测推理事件整合+视频推流架构分析

✅猫咪如厕检测与分类识别系统系列【九】 视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【上】

✅猫咪如厕检测与分类识别系统系列【九】 视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【下】

✅猫咪如厕检测与分类识别系统系列【十】 视频检测区域动态监测及实时更新
✅猫咪如厕检测与分类识别系统系列【十一】区域进入事件相应逻辑鲁棒性更新
✅猫咪如厕检测与分类识别系统系列【十二】猫咪进出事件逻辑及日志优化【上】
✅猫咪如厕检测与分类识别系统系列【十三】猫咪进出事件逻辑及日志优化【下】

✅猫咪如厕检测与分类识别系统系列~进阶【一】视频流推流及网页实时展示

✅猫咪如厕检测与分类识别系统系列~进阶【二】推流视频嵌入主界面实时播放控制


本小节目标:构建网页端实时算法启动架构及数据库实现

进阶部分最终目标:把算法启动,摄像头管理都做在系统上。然后使得整个系统从“脚本运行”变为“系统级服务/平台管理”,适合长期运行与远程管理。


目标描述

功能实现方式
自动启动算法开机后自动运行(如 systemd、Windows 服务)
摄像头管理网页界面添加/禁用摄像头、切换源
状态监控是否运行、摄像头是否连接、最近日志等
重启控制Web 远程控制算法进程重启或更新

架构

[摄像头] ─► [算法模块:检测+分类+追踪]
                │
                ├─► 记录系统(SQLite)
                ├─► 推流模块(FFmpeg ➜ ZLMediaKit)
                └─► Web 控制界面(Flask + JS)

【系统控制】
│
├─ 后台启动脚本(Linux: systemd / Windows: 注册服务)
├─ 配置文件读取摄像头/IP/模型路径等
└─ 日志 & 异常提醒模块

把算法启动关闭,摄像头管理,推流等操作都做在网站上进行操作。可以通过 Web 管理界面(基于 Flask + HTML/JS) 实现以下功能的可视化控制:


✅ 功能目标

功能模块可操作内容
📷 摄像头管理添加 / 删除 / 启动 / 停止摄像头
🧠 算法启动 / 停止控制目标检测分类等主流程运行状态
📡 推流管理启用/关闭 HLS 或 FLV 推流
🔄 实时状态显示运行中、异常、摄像头离线等状态
🧰 设置中心修改参数、模型路径、区域配置等

✅ 实现思路

  1. Flask 提供控制接口
@app.route("/control/start", methods=["POST"])
def start_algorithm():
    # 启动算法主线程或子进程
    return jsonify(success=True)

@app.route("/control/stop", methods=["POST"])
def stop_algorithm():
    # 停止线程 / 杀掉子进程
    return jsonify(success=True)
  1. 摄像头状态管理接口
@app.route("/camera/list")
def list_cameras():
    # 从配置或数据库读取摄像头列表
    return jsonify(cameras=[...])

@app.route("/camera/toggle", methods=["POST"])
def toggle_camera():
    # 启用/禁用某个 RTSP 摄像头源
    ...

  1. 前端界面控制示意(HTML)
<h3>🧠 算法状态</h3>
<button onclick="startAlgo()">启动</button>
<button onclick="stopAlgo()">停止</button>

<h3>📷 摄像头</h3>
<div id="cameraList"></div>

<script>
function startAlgo() {
  fetch("/control/start", {method: "POST"});
}
function stopAlgo() {
  fetch("/control/stop", {method: "POST"});
}
function loadCameras() {
  fetch("/camera/list")
    .then(res => res.json())
    .then(data => {
      document.getElementById("cameraList").innerHTML =
        data.cameras.map(c => `<p>${c.name} - ${c.url}</p>`).join('');
    });
}
loadCameras();
</script>

接下来就构建一整套猫咪如厕检测系统的 Web 管理平台 ,具备以下完整功能模块 ✅


✅ 平台功能总览

🧠 算法控制模块

  • ✅ 启动 / 停止算法检测主程序

  • ✅ 查看当前运行状态 / 日志信息

📷 摄像头管理模块

  • ✅ 添加 / 编辑 / 删除摄像头(RTSP/USB)

  • ✅ 开启/关闭单个摄像头检测流程

  • ✅ 实时状态展示(在线 / 离线 / 异常)

📡 推流控制模块

  • ✅ 启用 / 停止推流到 ZLMediaKit(FLV/HLS)

  • ✅ 显示当前推流地址 & 播放状态

🧰 设置中心

  • ✅ 修改模型路径、识别阈值、如厕区域等参数

  • ✅ 动态配置保存至数据库或 JSON

📊 仪表盘整合

  • ✅ 图表数据整合

  • ✅ 可跳转查看每个摄像头的实时预览 / 状态页


🧩 技术结构规划

层级技术
前端Flask + Bootstrap + JS (fetch)
后端Flask + SQLite + 多线程控制
子模块线程管理器(摄像头进程)、推流控制器、算法封装
配置使用 JSON / 数据库存储摄像头列表与参数配置

🛠 项目目录建议

project/
├── main.py                  # 启动入口(Flask + 控制线程)
├── camera_manager.py        # 摄像头管理逻辑
├── algorithm_runner.py      # 单摄像头算法运行线程
├── stream_pusher.py         # 推流器
├── templates/
│   ├── index.html           # 如厕记录页
│   ├── dashboard.html       # 图表仪表盘
│   └── platform.html        # 📍 控制平台页 ✅
├── static/
│   └── js/ platform.js      # 控制中心JS(启动、控制)
├── config/
│   └── cameras.json         # 摄像头配置
└── data/
    └── toilet_logs.db       # 数据库

✅ 接下来我可以做什么:

  • 创建 /platform 页面并美化界面

  • 后端实现算法线程启动/终止

  • 摄像头配置管理

  • 推流启用关闭控制

  • 实时状态可视化


📌 非常棒,咱们接下来就构建一整套猫咪如厕检测系统的 Web 管理平台** ,具备以下完整功能模块 ✅


✅ 平台功能总览(你将拥有的)

🧠 算法控制模块

  • ✅ 启动 / 停止算法检测主程序

  • ✅ 查看当前运行状态 / 日志信息

📷 摄像头管理模块

  • ✅ 添加 / 编辑 / 删除摄像头(RTSP/USB)

  • ✅ 开启/关闭单个摄像头检测流程

  • ✅ 实时状态展示(在线 / 离线 / 异常)

📡 推流控制模块

  • ✅ 启用 / 停止推流到 ZLMediaKit(FLV/HLS)

  • ✅ 显示当前推流地址 & 播放状态

🧰 设置中心

  • ✅ 修改模型路径、识别阈值、如厕区域等参数

  • ✅ 动态配置保存至数据库或 JSON

📊 仪表盘整合

  • ✅ 图表数据整合

  • ✅ 可跳转查看每个摄像头的实时预览 / 状态页


技术结构规划

层级技术
前端Flask + Bootstrap + JS (fetch)
后端Flask + SQLite + 多线程控制
子模块线程管理器(摄像头进程)、推流控制器、算法封装
配置使用 JSON / 数据库存储摄像头列表与参数配置

项目目录

project/
├── main.py                  # 启动入口(Flask + 控制线程)
├── camera_manager.py        # 摄像头管理逻辑
├── algorithm_runner.py      # 单摄像头算法运行线程
├── stream_pusher.py         # 推流器
├── templates/
│   ├── index.html           # 如厕记录页
│   ├── dashboard.html       # 图表仪表盘
│   └── platform.html        # 控制平台页 
├── static/
│   └── js/ platform.js      # 控制中心JS(启动、控制)
├── config/
│   └── cameras.json         # 摄像头配置
└── data/
    └── toilet_logs.db       # 数据库

✅ 检测任务配置功能(你想要实现的)

参数项描述
📷 摄像头选择从已有摄像头中选一个(RTSP/USB)
🧠 模型选择可选择不同 YOLO 模型(检测/分割/分类)
⚙️ 功能配置是否启用检测 / 分类 / 推流 / 识别等
🗺️ 区域配置指定如厕区域坐标(或使用已有区域)
📝 任务名称 / 备注自定义识别任务的命名与说明

✅ 页面

<h3>➕ 添加检测任务</h3>
<form method="POST" action="/task/create">
  📷 摄像头:
  <select name="camera_id">
    <option value="1">厕所1号(RTSP)</option>
    ...
  </select>

  🧠 模型类型:
  <select name="model">
    <option value="yolov11.pt">YOLOv11</option>
    <option value="segment.pt">分割模型</option>
  </select>

  ✅ 功能启用:
  <label><input type="checkbox" name="enable_detection" checked> 检测</label>
  <label><input type="checkbox" name="enable_classify" checked> 分类</label>
  <label><input type="checkbox" name="enable_stream"> 推流</label>

  🗺️ 区域坐标:
  <input name="region_x1" placeholder="x1">
  <input name="region_y1" placeholder="y1">
  <input name="region_x2" placeholder="x2">
  <input name="region_y2" placeholder="y2">

  📝 任务名称:
  <input name="task_name" placeholder="任务说明">

  <button type="submit">添加任务</button>
</form>

后端处理逻辑

  • 提交表单 → /task/create POST 请求

  • 解析参数 → 启动一个新检测线程(摄像头+模型+配置)

  • 保存任务信息到数据库 / 配置文件(支持持久化)


暂时使用一个摄像头,后续设计好摄像头管理后可以选择,我们先围绕单摄像头任务管理 设计“添加检测任务”功能


✅ 当前阶段:任务创建核心功能

功能模块支持内容
✅ 固定摄像头源先用默认 RTSP 或 USB 摄像头
✅ 可选模型路径手动选择使用的模型文件(如 YOLOv11.pt)
✅ 启用功能模块检测 / 分类 / 推流开关
✅ 自定义如厕区域提供坐标 x1 y1 x2 y2
✅ 自定义任务名用于后台标识、日志保存等

🧩 网页界面示意(/task/new

字段示例输入
模型路径models/yolov11.pt
功能✅ 检测 ✅ 分类 ✅ 推流
区域坐标x1=100 y1=200 x2=500 y2=600
任务名厕所检测任务1

接下来:

  1. 创建 /task/new 页面(任务创建表单)
  2. 后端 /task/create 路由:接收并保存配置
  3. 启动任务线程(封装算法推理逻辑+摄像头接入)
  4. (后续)任务管理界面 /platform/tasks

from flask import Flask, render_template, request, redirect, url_for, jsonify
import os
import json

# 创建 Flask 应用
app = Flask(__name__)

# 任务配置文件路径
TASK_CONFIG_PATH = "/mnt/data/detection_tasks.json"

# 初始化任务配置文件(如果不存在)
if not os.path.exists(TASK_CONFIG_PATH):
    with open(TASK_CONFIG_PATH, "w") as f:
        json.dump([], f)

@app.route("/task/new")
def new_task():
    return """
    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>添加检测任务</title>
    </head>
    <body>
        <h2>➕ 添加检测任务</h2>
        <form method="POST" action="/task/create">
            <label>任务名称:<input type="text" name="task_name" required></label><br><br>

            <label>模型路径:<input type="text" name="model_path" value="models/yolov11.pt"></label><br><br>

            <label>启用功能:</label>
            <input type="checkbox" name="enable_detection" checked>检测
            <input type="checkbox" name="enable_classify" checked>分类
            <input type="checkbox" name="enable_stream">推流<br><br>

            <label>如厕区域坐标:</label><br>
            x1: <input name="region_x1" type="number"> 
            y1: <input name="region_y1" type="number"> 
            x2: <input name="region_x2" type="number"> 
            y2: <input name="region_y2" type="number"><br><br>

            <button type="submit">提交任务</button>
        </form>
    </body>
    </html>
    """

@app.route("/task/create", methods=["POST"])
def create_task():
    task = {
        "name": request.form.get("task_name"),
        "model_path": request.form.get("model_path"),
        "enable_detection": "enable_detection" in request.form,
        "enable_classify": "enable_classify" in request.form,
        "enable_stream": "enable_stream" in request.form,
        "region": {
            "x1": int(request.form.get("region_x1", 0)),
            "y1": int(request.form.get("region_y1", 0)),
            "x2": int(request.form.get("region_x2", 0)),
            "y2": int(request.form.get("region_y2", 0)),
        }
    }

    with open(TASK_CONFIG_PATH, "r+") as f:
        data = json.load(f)
        data.append(task)
        f.seek(0)
        json.dump(data, f, indent=2)
        f.truncate()

    return redirect(url_for("new_task"))

app.run(host="0.0.0.0", port=5001)

STDOUT/STDERR

* Serving Flask app '__main__'
 * Debug mode: off
[31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5001
 * Running on http://10.129.66.192:5001
[33mPress CTRL+C to quit[0m

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

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

相关文章

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级

在家具制造行业&#xff0c;从原木切割到成品出厂&#xff0c;质检环节贯穿始终 —— 木材含水率是否达标、板材甲醛释放量是否合规、涂层耐磨性能否通过标准…… 这些看似琐碎的检测项目&#xff0c;实则是企业把控产品品质、规避市场风险的核心关卡。传统人工质检模式在效率、…

idea整合maven环境配置

idea整合maven 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每个知识点&#xff0c;都是写出代码…

无偿帮写毕业论文(看不懂的可以私信博主)

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行&#xff0c;脱产学习这么多年&#xff0c;终于熬出头了&#xff0c;完成毕设后有空就去多看看亲人好友&#xff0c;祝好&#xff01; 一、找一个论文模板 废话不多说&#xff0c;先上干货Ov…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式&#xff0c;在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入&#xff0c;返回命令模…

【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关

一、趣味排序算法&#xff1a;突破常规的思维火花 1. 睡眠排序&#xff08;Sleep Sort&#xff09;—— 时间维度的魔法 核心思想&#xff1a;利用多线程休眠时间模拟数值大小&#xff0c;自然输出有序结果。Python示例&#xff1a;import threading import timedef sleep_so…

Android | IOS — Solox性能测试

文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本&#xff1a; Windows&#xff1a;Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析&#xff1a;

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域&#xff0c;Midjourney 凭借其强大的艺术表现力和灵活的创作模式&#xff0c;已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”&#xff0c;我将结合多年实战经验&#xff0c;系统分享 Midjourney 的创作方法论&#x…

工具篇-扣子空间MCP,一键做游戏,一键成曲

一、登陆扣子空间 地址如下&#xff1a; 扣子空间 打开&#xff0c;然后登陆扣子 登陆之后快速开始&#xff1a; 二、生成游戏 小试牛刀&#xff0c;我们让它做一个打地鼠的游戏&#xff1a; 已经开始设计制作&#xff1a; 制作完成&#xff1a; 三、制作音乐 新…

5.6 - 5.9 MySQL

数据库&#xff1a;存储和管理数据的仓库DB。 数据库管理系统&#xff1a;操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表&#xff0c;在一个表内能存放多个数据。 SQL语句&#xff1a; DDL&#xff1a; 存储字符串用varchar。&#xff08;类似于…

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView

如果你有非常多的csv文件&#xff0c;每个文件包含N多行与M多列&#xff0c;如&#xff1a;18000 行和 27 列。现在&#xff0c;想制作一个 Windows 窗体应用程序&#xff0c;导入它们并在 datagridview 中显示&#xff0c;然后进行一些数学运算。可是&#xff0c;发现数据导入…

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境&#xff1a;SQLPub。它提供了最新版本的 MySQL 服务器测试服务&#xff0c;可以方便开发者和测试人员验证数据库功能&#xff0c;也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址&#xff1a; https://sqlpub.com/ SQLP…

URP相机如何将场景渲染定帧模糊绘制

1&#xff09;URP相机如何将场景渲染定帧模糊绘制 2&#xff09;为什么Virtual Machine会随着游戏时间变大 3&#xff09;出海项目&#xff0c;打包时需要勾选ARMv7吗 4&#xff09;Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送&#xff0c;精选了UWA社…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

&#x1f3ac; 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库&#xff0c;专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现&#xff0c;能够显著提升动画资源的处理效率。 此 AI 视频生成项目&#xff0c;旨在通过低显…

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明&#xff1a;v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果&#xff1a; 1、在状态管理中创建文件&#xff0c;统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此&#xff0c;研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同&#xff0c;传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本&#xff0c;而新方法则…

吴恩达机器学习笔记:特征与多项式回归

1.特征和多项式回归 如房价预测问题&#xff0c; ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage&#xff08;临街宽度&#xff09;&#xff0c;x2 deptℎ&#xff08;纵向深度&#xff09;&#xff0c;x frontage ∗ deptℎ area &#xff08;面积&#xff09;…

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议&#xff1a;Apache License 2.0 实现方法 统一 API&#xff1a;LLM 提供程序&#xff08;如 OpenAI 或 Google Vertex AI&#xff09;和嵌入&#xff08;矢量&#xff09;存储…