前情提要


家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如厕习惯,我计划搭建一个基于视频监控和AI识别的系统,自动识别猫咪进出厕所的行为,记录如厕时间和停留时长,并区分不同猫咪。这样即使我不在家,也能掌握猫咪的健康状态,更安心地照顾它们。
🎓 各位的关注与点赞是我持续分享的最大动力,衷心感谢大家的支持!
📢 欢迎正在攻读硕博学位的同学,或是对人工智能充满热情的朋友们,关注我的个人公众号。在这里,我将持续更新博士期间阅读的前沿论文解读、项目实战经验分享,以及我对AI技术趋势的思考与探讨。
✨ 无论你是科研工作者、工程开发者,还是AI初学者,都能在这里找到干货与灵感。让我们一起交流、成长、探索人工智能的无限可能!

已完成工作:

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

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

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

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

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

计划工作:

✅ 猫咪管理功能:已完成猫咪照片上传与名称登记模块。
✅ 多图上传与分类特征提取:已支持批量上传猫咪图像并自动更新个体特征库。
✅ 目标检测与事件识别集成(YOLOv11): 基本实现
🔄 检测区域绘制功能:进行中,计划支持用户自定义如厕检测区域。
🔄 事件行为记录模块:进行中,将实现如厕进出时间、停留时长等事件记录功能。
⏳ 检测结果推流展示:进行中,计划支持算法结果实时推流。本章将实现页面MJPEG推理
⏳ 整体运行结果推流整合:待更新,计划集成检测图像与系统状态为统一视频流输出。


本小节将添加实时热加载交互式区域标注功能 ,让你在前端网页上手动框选如厕区域后能够自动更新检测区域。


想要实时热加载(运行时可以变更区域不重启),可以加个接口让它reload 一下 region.json。
任何时候更新了 region.json 后,只需在程序中调用:

detector.reload_region()

即可重新载入新区域,无需重启整个系统!


因此可以通过监视 region.json 文件的变化,实现区域配置“自动更新”。


✅ 实现方式:使用 watchdog 监听文件变化

  1. 后台线程持续监听 config/region.json 文件
  2. 一旦发现文件被修改(你在前端点击“保存区域”后)
  3. 自动调用 detector.reload_region() 重新加载新区域配置 ✅

🔧 安装依赖(如果你没安装过)

pip install watchdog

✅ 添加监视器模块(region_watcher.py)

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import threading
import time
import os

class RegionChangeHandler(FileSystemEventHandler):
    def __init__(self, detector):
        self.detector = detector

    def on_modified(self, event):
        if os.path.basename(event.src_path) == "region.json":
            print("🟡 检测到区域配置更新,自动重新加载")
            self.detector.reload_region()

def start_region_monitor(detector, watch_path="config/region.json"):
    handler = RegionChangeHandler(detector)
    observer = Observer()
    observer.schedule(handler, path=os.path.dirname(watch_path), recursive=False)
    observer.start()

    # 在主线程退出时停止监控
    def watch_loop():
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()

    t = threading.Thread(target=watch_loop, daemon=True)
    t.start()

✅ 使用方式(在主程序中)

from region_watcher import start_region_monitor

detector = CatDetector()
start_region_monitor(detector)

完成之后,只要你在前端保存区域,系统就会在 1 秒内自动检测并加载新的区域配置。
明白了!你希望在 CatDetector 内部明白了!你希望在 CatDetector 内部自动检测 region.json 是否更新 ,而不是依赖外部监听模块。这可以通过定时检查文件修改时间 的方式轻量实现 ✅


✅ 更新策略:定期检查配置文件时间戳

🧠 实现思路:

  1. 在 CatDetector 中添加:
  • self._region_mtime:记录上次 region.json 的修改时间
  1. 每次 process_frame() 时:
  • 检查当前文件 mtime

  • 如果发生变化,自动调用 reload_region()


具体实现:在 CatDetector.__init__() 中加:

self.region_path = "config/region.json"
self.toilet_region = self._load_region()
self._region_mtime = os.path.getmtime(self.region_path)

在 process_frame() 的开头加:

# 检测区域配置是否被修改
try:
    mtime = os.path.getmtime(self.region_path)
    if mtime != self._region_mtime:
        print("🟡 检测到 region.json 变更,已重新加载区域")
        self._region_mtime = mtime
        self.toilet_region = self._load_region()
except Exception as e:
    print(f"⚠️ 检查 region.json 更新时出错: {e}")

优点:

  • 不依赖外部库

  • 实时性好(每帧判断)

  • 与现有 inference.py 逻辑无缝集成

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐