文章目录
- Overview
- Key Points
- Pseudo-code
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