fix: 只有人数变化才触发大模型分析(节省 API)
This commit is contained in:
@@ -22,6 +22,7 @@ class LocalAnalyzer:
|
|||||||
self.prev_frame = None
|
self.prev_frame = None
|
||||||
self.background_model = None
|
self.background_model = None
|
||||||
self.human_cascade = None
|
self.human_cascade = None
|
||||||
|
self.prev_human_count = 0 # 记录前一帧人数
|
||||||
|
|
||||||
# 初始化人体检测器
|
# 初始化人体检测器
|
||||||
self._init_human_detector()
|
self._init_human_detector()
|
||||||
@@ -33,6 +34,7 @@ class LocalAnalyzer:
|
|||||||
'human_min_neighbors': 3, # 人体检测最小邻居数
|
'human_min_neighbors': 3, # 人体检测最小邻居数
|
||||||
'brightness_change_threshold': 30, # 亮度变化阈值
|
'brightness_change_threshold': 30, # 亮度变化阈值
|
||||||
'trigger_model_threshold': 0.08, # 触发大模型的阈值
|
'trigger_model_threshold': 0.08, # 触发大模型的阈值
|
||||||
|
'human_count_change_threshold': 1, # 人数变化阈值
|
||||||
}
|
}
|
||||||
|
|
||||||
# 统计
|
# 统计
|
||||||
@@ -105,14 +107,37 @@ class LocalAnalyzer:
|
|||||||
# 2. 人体检测
|
# 2. 人体检测
|
||||||
human_result = self._detect_human(current_frame)
|
human_result = self._detect_human(current_frame)
|
||||||
metrics['human_count'] = human_result['count']
|
metrics['human_count'] = human_result['count']
|
||||||
if human_result['count'] > 0:
|
|
||||||
|
# 记录人数变化
|
||||||
|
human_count_change = human_result['count'] - self.prev_human_count
|
||||||
|
metrics['human_count_change'] = human_count_change
|
||||||
|
|
||||||
|
if human_count_change > 0:
|
||||||
events.append({
|
events.append({
|
||||||
'event_type': '人物活动',
|
'event_type': '人物活动',
|
||||||
'description': f'检测到 {human_result["count"]} 个人',
|
'description': f'检测到 {human_count_change} 人进入,当前共 {human_result["count"]} 人',
|
||||||
'confidence': '中',
|
'confidence': '高',
|
||||||
'source': 'local'
|
'source': 'local'
|
||||||
})
|
})
|
||||||
self.human_count += 1
|
self.human_count += human_count_change
|
||||||
|
elif human_count_change < 0:
|
||||||
|
events.append({
|
||||||
|
'event_type': '人物活动',
|
||||||
|
'description': f'检测到 {abs(human_count_change)} 人离开,当前剩 {human_result["count"]} 人',
|
||||||
|
'confidence': '高',
|
||||||
|
'source': 'local'
|
||||||
|
})
|
||||||
|
elif human_result['count'] > 0:
|
||||||
|
# 人数没变但有人
|
||||||
|
events.append({
|
||||||
|
'event_type': '人物活动',
|
||||||
|
'description': f'检测到 {human_result["count"]} 个人(无变化)',
|
||||||
|
'confidence': '低',
|
||||||
|
'source': 'local'
|
||||||
|
})
|
||||||
|
|
||||||
|
# 更新前一帧人数(在 should_call_model 中更新)
|
||||||
|
# self.prev_human_count = human_result['count']
|
||||||
|
|
||||||
# 3. 亮度检测
|
# 3. 亮度检测
|
||||||
brightness_result = self._detect_brightness_change(current_gray, prev_image_path)
|
brightness_result = self._detect_brightness_change(current_gray, prev_image_path)
|
||||||
@@ -280,21 +305,26 @@ class LocalAnalyzer:
|
|||||||
def _should_call_model(self, metrics, events):
|
def _should_call_model(self, metrics, events):
|
||||||
"""判断是否需要调用大模型"""
|
"""判断是否需要调用大模型"""
|
||||||
|
|
||||||
# 条件1:运动面积超过阈值
|
# 条件1:人数变化(最重要)
|
||||||
if metrics.get('motion_ratio', 0) > self.config['trigger_model_threshold']:
|
current_human_count = metrics.get('human_count', 0)
|
||||||
|
human_count_change = abs(current_human_count - self.prev_human_count)
|
||||||
|
|
||||||
|
# 更新前一帧人数
|
||||||
|
self.prev_human_count = current_human_count
|
||||||
|
|
||||||
|
if human_count_change >= self.config['human_count_change_threshold']:
|
||||||
|
print(f"[LocalAnalyzer] Human count changed: {self.prev_human_count} -> {current_human_count}, triggering model")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# 条件2:检测到人
|
# 条件2:运动面积超过阈值(排除有人但不动的情况)
|
||||||
if metrics.get('human_count', 0) > 0:
|
# 只有在没有人变化时才用这个条件
|
||||||
|
if metrics.get('motion_ratio', 0) > self.config['trigger_model_threshold'] * 2:
|
||||||
|
print(f"[LocalAnalyzer] Large motion detected: {metrics.get('motion_ratio', 0):.2%}")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# 条件3:亮度大幅变化
|
# 条件3:亮度大幅变化(灯开关等)
|
||||||
if abs(metrics.get('brightness_change', 0)) > self.config['brightness_change_threshold'] * 2:
|
if abs(metrics.get('brightness_change', 0)) > self.config['brightness_change_threshold'] * 2:
|
||||||
return True
|
print(f"[LocalAnalyzer] Brightness changed: {metrics.get('brightness_change', 0)}")
|
||||||
|
|
||||||
# 条件4:有多个事件类型
|
|
||||||
event_types = set(e['event_type'] for e in events)
|
|
||||||
if len(event_types) >= 2:
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
@@ -313,6 +343,7 @@ class LocalAnalyzer:
|
|||||||
"""重置状态"""
|
"""重置状态"""
|
||||||
self.prev_frame = None
|
self.prev_frame = None
|
||||||
self.background_model = None
|
self.background_model = None
|
||||||
|
self.prev_human_count = 0
|
||||||
self.frame_count = 0
|
self.frame_count = 0
|
||||||
self.motion_count = 0
|
self.motion_count = 0
|
||||||
self.human_count = 0
|
self.human_count = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user