丢垃圾视频时间检测 -- 基于状态机的实现

文章目录

Overview

需要考虑的方面

  • 状态定义和转换条件
  • 时序约束
  • 空间约束
  • 异常处理

状态机的设计需要考虑的场景:

  • 没有人
  • 人进入
  • 人携带垃圾
  • 人离开但垃圾留下
  • 垃圾消失
  • 异常情况(检测失败、多人多垃圾等)

Key Points

状态设计

  • NO_PERSON: 初始状态,场景为空
  • PERSON_ONLY: 检测到人
  • PERSON_WITH_LITTER: 人和垃圾共同出现
  • LITTER_ONLY: 人离开,垃圾留下

状态转移路径

NO_PERSON => PERSON_ONLY => PERSON_WITH_LITTER => LITTER_ONLY

状态转移条件

  • NO_PERSON -> PERSON_ONLY: 检测到人
  • PERSON_ONLY -> NO_PERSON: 人消失
  • PERSON_ONLY -> PERSON_WITH_LITTER: 人靠近垃圾
  • PERSON_WITH_LITTER -> LITTER_ONLY: 人离开但垃圾留下
  • PERSON_WITH_LITTER -> PERSON_ONLY: 垃圾消失
  • LITTER_ONLY -> NO_PERSON: 垃圾消失

约束条件

  • 空间约束:人和垃圾的距离阈值
  • 时间约束:状态持续时间的上下限
  • 检测约束:目标检测的置信度阈值
  • 异常处理
    • 状态超时重置
      • PERSON_WITH_LITTER 的持续时间过长,截断当前帧为结束帧
    • 多目标情况处理
      • 遍历每个 (Person - Litter) Pair, 找到距离最近的 Pair.

Pseudo-code

复制代码
定义 状态枚举:
    NO_PERSON = 0        # 场景中没有人和垃圾
    PERSON_ONLY = 1      # 只有人
    PERSON_WITH_LITTER = 2  # 人和垃圾共同出现
    LITTER_ONLY = 3      # 只有垃圾

定义 类 LitteringDetector:
    属性:
        current_state: 当前状态
        frame_start: 事件开始帧
        frame_end: 事件结束帧
        state_duration: 当前状态持续时间
        
        # 配置参数
        MAX_DISTANCE: 人和垃圾的最大距离阈值
        MIN_DURATION: 状态持续最小帧数
        MAX_DURATION: 状态持续最大帧数
        
    方法 初始化():
        current_state = NO_PERSON
        frame_start = None
        frame_end = None
        state_duration = 0
        
    方法 检测单帧(frame, frame_id):
        # 1. 目标检测
        persons = 检测人物()
        litters = 检测垃圾()
        
        # 2. 状态转移逻辑
        如果 current_state == NO_PERSON:
            如果 检测到人:
                转换到 PERSON_ONLY
                重置状态持续时间
                
        否则如果 current_state == PERSON_ONLY:
            如果 没有检测到人:
                转换到 NO_PERSON
            否则如果 检测到人和垃圾且距离小于阈值:
                转换到 PERSON_WITH_LITTER
                记录开始帧 frame_start
                
        否则如果 current_state == PERSON_WITH_LITTER:
            如果 没有检测到人但检测到垃圾:
                转换到 LITTER_ONLY
                记录结束帧 frame_end
                返回检测到丢垃圾事件
            否则如果 没有检测到垃圾:
                转换到 PERSON_ONLY
                
        否则如果 current_state == LITTER_ONLY:
            如果 没有检测到垃圾:
                转换到 NO_PERSON
                
        # 3. 更新状态持续时间
        state_duration += 1
        
        # 4. 状态超时检查
        如果 state_duration > MAX_DURATION:
            重置到初始状态 NO_PERSON
            
        返回 未检测到事件

    方法 检查空间关系(person, litter):
        计算人和垃圾的距离
        返回 距离 < MAX_DISTANCE
相关推荐
东风破_14 分钟前
从 RAG 到 Agentic RAG:第一步,让模型决定「要不要检索」
人工智能
火山引擎开发者社区17 分钟前
一图看懂 ADrive 跨产品协作实践:文件通了,Agent 就通了
人工智能
蒲公英内测分发23 分钟前
App 更新一次就换一个二维码?智能硬件配套 App 的版本和下载入口怎么管理
人工智能·测试工具·智能家居·智能硬件
Tp_jh29 分钟前
AMD 395本地部署Qwen3.8-Flash-Next实测,端侧AGI时代也要来了
图像处理·人工智能·opencv·语言模型·自然语言处理·千问
xcLeigh31 分钟前
让大模型长出手脚,自己写SQL查数据库(Function Calling初探)
数据库·人工智能·sql·时序数据库·timechoai
锋行天下41 分钟前
LangGraph 模拟大模型调用工具失败后重试直到成功
人工智能
FL16238631291 小时前
胸片诊断肺炎结核积液识别分割数据集labelme格式3751张4类别
人工智能
天远数科1 小时前
零信任架构实战:基于天远全能消金报告构建自动化信贷评估网关
运维·人工智能·架构·自动化
云上先途1 小时前
属性标注是什么?主要解决什么问题?
大数据·人工智能
罗西的思考2 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习