猫咪如厕检测与分类识别系统系列【十】 视频检测区域动态监测及实时更新
前情提要
家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的如厕习惯,我计划搭建一个基于视频监控和AI识别的系统,自动识别猫咪进出厕所的行为,记录如厕时间和停留时长,并区分不同猫咪。这样即使我不在家,也能掌握猫咪的健康状态,更安心地照顾它们。
🎓 各位的关注与点赞是我持续分享的最大动力,衷心感谢大家的支持!
📢 欢迎正在攻读硕博学位的同学,或是对人工智能充满热情的朋友们,关注我的个人公众号。在这里,我将持续更新博士期间阅读的前沿论文解读、项目实战经验分享,以及我对AI技术趋势的思考与探讨。
✨ 无论你是科研工作者、工程开发者,还是AI初学者,都能在这里找到干货与灵感。让我们一起交流、成长、探索人工智能的无限可能!
已完成工作:
✅猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
✅猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
✅猫咪如厕检测与分类识别系统系列【三】 融合yolov11目标检测
✅猫咪如厕检测与分类识别系统系列【四】融合检测日志输出及前端展示界面制作
✅猫咪如厕检测与分类识别系统系列【五】信息存储数据库改进+添加猫咪页面制作+猫咪躯体匹配算法架构更新
✅猫咪如厕检测与分类识别系统系列【六】分类模型训练+混合检测分类+未知目标自动更新
✅猫咪如厕检测与分类识别系统系列【七】 当前阶段总结报告
✅猫咪如厕检测与分类识别系统系列【八】 检测推理事件整合+视频推流架构分析
✅猫咪如厕检测与分类识别系统系列【九】 视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【上】
✅猫咪如厕检测与分类识别系统系列【九】 视频检测区域在线绘制+支持摄像头+网络摄像头+整体构建【下】
计划工作:
✅ 猫咪管理功能:已完成猫咪照片上传与名称登记模块。
✅ 多图上传与分类特征提取:已支持批量上传猫咪图像并自动更新个体特征库。
✅ 目标检测与事件识别集成(YOLOv11): 基本实现
🔄 检测区域绘制功能:进行中,计划支持用户自定义如厕检测区域。
🔄 事件行为记录模块:进行中,将实现如厕进出时间、停留时长等事件记录功能。
⏳ 检测结果推流展示:进行中,计划支持算法结果实时推流。本章将实现页面MJPEG推理
⏳ 整体运行结果推流整合:待更新,计划集成检测图像与系统状态为统一视频流输出。
本小节将添加实时热加载交互式区域标注功能 ,让你在前端网页上手动框选如厕区域后能够自动更新检测区域。
想要实时热加载(运行时可以变更区域不重启),可以加个接口让它reload 一下 region.json。
任何时候更新了 region.json 后,只需在程序中调用:
detector.reload_region()
即可重新载入新区域,无需重启整个系统!
因此可以通过监视 region.json 文件的变化,实现区域配置“自动更新”。
✅ 实现方式:使用 watchdog 监听文件变化
- 后台线程持续监听
config/region.json文件 - 一旦发现文件被修改(你在前端点击“保存区域”后)
- 自动调用
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 是否更新 ,而不是依赖外部监听模块。这可以通过定时检查文件修改时间 的方式轻量实现 ✅
✅ 更新策略:定期检查配置文件时间戳
🧠 实现思路:
- 在
CatDetector中添加:
self._region_mtime:记录上次region.json的修改时间
- 每次
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逻辑无缝集成
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)