暂停使用时间戳进行业务逻辑判断

This commit is contained in:
2026-03-09 17:53:02 +08:00
parent b5797911ef
commit 180aac9e95

View File

@@ -17,7 +17,7 @@ from utils.logger import get_logger
from common.constants import MODEL_ROOT_PATH from common.constants import MODEL_ROOT_PATH
logger = get_logger(__name__) logger = get_logger(__name__)
DETECT_MODEL_PATH = 'YOLO_Weight/Kadian.onnx' DETECT_MODEL_PATH = 'D:\Python_Save\PoliceProject\Yolo_Weight\Kadian\Kadian_sanshijiazi.onnx'
# 默认相对ROI与原文件一致 # 默认相对ROI与原文件一致
#ROI_RELATIVE = np.array([ #ROI_RELATIVE = np.array([
@@ -52,7 +52,7 @@ PERSON_CAR_INPUT_SIZE = 640
#POSE_INPUT_SIZE = 640 #POSE_INPUT_SIZE = 640
RTSP_TARGET_FPS = 10.0 RTSP_TARGET_FPS = 30.0
# ========================= Kadian TrafficMonitor精简版专为服务设计 ========================= # ========================= Kadian TrafficMonitor精简版专为服务设计 =========================
class KadianDetector: class KadianDetector:
@@ -240,7 +240,7 @@ class KadianDetector:
current_time_sec = timestamp current_time_sec = timestamp
print('current_time_sec:', current_time_sec)
# ========= 主检测删除pose检测========= # ========= 主检测删除pose检测=========
detections = self.detector(frame) detections = self.detector(frame)
@@ -325,17 +325,17 @@ class KadianDetector:
# 车辆注册表初始化 # 车辆注册表初始化
if tid not in self.roi_car_registry: if tid not in self.roi_car_registry:
self.roi_car_registry[tid] = { self.roi_car_registry[tid] = {
# 'first_seen': self.current_frame_idx, 'first_seen': self.current_frame_idx,
# 'last_seen': self.current_frame_idx, 'last_seen': self.current_frame_idx,
'first_seen': current_time_sec, # 'first_seen': current_time_sec,
'last_seen': current_time_sec, # 'last_seen': current_time_sec,
'trunk_frames': 0, 'trunk_frames': 0,
'is_checked': False, 'is_checked': False,
#'frame_buffer': deque(maxlen=self.max_car_frames), # 新增 #'frame_buffer': deque(maxlen=self.max_car_frames), # 新增
} }
else: else:
#self.roi_car_registry[tid]['last_seen'] = self.current_frame_idx self.roi_car_registry[tid]['last_seen'] = self.current_frame_idx
self.roi_car_registry[tid]['last_seen'] = current_time_sec #self.roi_car_registry[tid]['last_seen'] = current_time_sec
label += " IN" label += " IN"
elif role == "opentrunk": elif role == "opentrunk":
color = (255, 165, 0) # 橙色 color = (255, 165, 0) # 橙色
@@ -355,13 +355,14 @@ class KadianDetector:
# 警察注册表初始化 # 警察注册表初始化
if tid not in self.roi_police_registry: if tid not in self.roi_police_registry:
self.roi_police_registry[tid] = { self.roi_police_registry[tid] = {
# 'first_seen': self.current_frame_idx, 'first_seen': self.current_frame_idx,
# 'last_seen': self.current_frame_idx, 'last_seen': self.current_frame_idx,
'first_seen': current_time_sec, #'first_seen': current_time_sec,
'last_seen': current_time_sec, #'last_seen': current_time_sec,
} }
else: else:
self.roi_police_registry[tid]['last_seen'] = current_time_sec #self.roi_police_registry[tid]['last_seen'] = current_time_sec
self.roi_police_registry[tid]['last_seen'] = self.current_frame_idx
label += " IN" label += " IN"
else: else:
color = (255, 255, 255) # 白色 color = (255, 255, 255) # 白色
@@ -377,7 +378,8 @@ class KadianDetector:
# 'frame': frame.copy(), # 'frame': frame.copy(),
# }) # })
self.frame_buffer_ignore_untrunk.append({ self.frame_buffer_ignore_untrunk.append({
'frame_idx': current_time_sec, #'frame_idx': current_time_sec,
'frame_idx': self.current_frame_idx,
'frame': frame.copy(), 'frame': frame.copy(),
}) })
@@ -407,8 +409,8 @@ class KadianDetector:
for car_id, info in self.roi_car_registry.items(): for car_id, info in self.roi_car_registry.items():
last_seen = info['last_seen'] last_seen = info['last_seen']
# if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_car: if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_car:
if (current_time_sec - last_seen) <= self.frame_buffer_limit_car: #if (current_time_sec - last_seen) <= self.frame_buffer_limit_car:
active_car_ids.append(car_id) active_car_ids.append(car_id)
else: else:
cars_to_remove.append(car_id) cars_to_remove.append(car_id)
@@ -419,14 +421,15 @@ class KadianDetector:
# 处理离场车辆,生成违规告警 # 处理离场车辆,生成违规告警
for car_id in cars_to_remove: for car_id in cars_to_remove:
car_info = self.roi_car_registry[car_id] car_info = self.roi_car_registry[car_id]
duration_frames = car_info['last_seen'] - car_info['first_seen'] duration_frames = car_info['last_seen'] - car_info['first_seen']
# 情况1通过时间太短 -> Ignore (Too Fast) # 情况1通过时间太短 -> Ignore (Too Fast)
if duration_frames < self.frame_thresh_car_min_duration: if duration_frames < self.frame_thresh_car_min_duration:
logger.info(f"ALARM: Car {car_id} passed too fast -> Regarded as Ignore Checked!") logger.info(f"ALARM: Car {car_id} passed too fast -> Regarded as Ignore Checked!")
#self.fast_pass_alerts[car_id] = self.current_frame_idx + int(self.ignore_show_seconds * self.fps) self.fast_pass_alerts[car_id] = self.current_frame_idx + int(self.ignore_show_seconds * self.fps)
self.fast_pass_alerts[car_id] = current_time_sec + int(self.ignore_show_seconds * self.fps) #self.fast_pass_alerts[car_id] = current_time_sec + int(self.ignore_show_seconds * self.fps)
target_time_sec = car_info['last_seen'] - self.ignored_rollback_time target_time_sec = car_info['last_seen'] - self.ignored_rollback_time
ignored_trunk_frame = self.find_target_frame(target_time_sec) ignored_trunk_frame = self.find_target_frame(target_time_sec)
@@ -436,8 +439,8 @@ class KadianDetector:
# 情况2时间够长但没检查后备箱 -> Unchecked Trunk # 情况2时间够长但没检查后备箱 -> Unchecked Trunk
elif not car_info['is_checked']: elif not car_info['is_checked']:
logger.info(f"ALARM: Car {car_id} left without checking trunk!") logger.info(f"ALARM: Car {car_id} left without checking trunk!")
#self.unchecked_trunk_alerts[car_id] = self.current_frame_idx + int(self.openTrunk_show_seconds * self.fps) self.unchecked_trunk_alerts[car_id] = self.current_frame_idx + int(self.openTrunk_show_seconds * self.fps)
self.unchecked_trunk_alerts[car_id] = current_time_sec + int(self.openTrunk_show_seconds * self.fps) #self.unchecked_trunk_alerts[car_id] = current_time_sec + int(self.openTrunk_show_seconds * self.fps)
target_time_sec = car_info['last_seen'] - self.untrunk_rollback_time target_time_sec = car_info['last_seen'] - self.untrunk_rollback_time
unchecked_trunk_frame = self.find_target_frame(target_time_sec) unchecked_trunk_frame = self.find_target_frame(target_time_sec)
@@ -456,8 +459,8 @@ class KadianDetector:
for police_id, info in self.roi_police_registry.items(): for police_id, info in self.roi_police_registry.items():
last_seen = info['last_seen'] last_seen = info['last_seen']
#if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_police: if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_police:
if (current_time_sec - last_seen) <= self.frame_buffer_limit_police: #if (current_time_sec - last_seen) <= self.frame_buffer_limit_police:
active_police_ids.append(police_id) active_police_ids.append(police_id)
else: else:
polices_to_remove.append(police_id) polices_to_remove.append(police_id)
@@ -489,8 +492,8 @@ class KadianDetector:
# break # 只显示一次 # break # 只显示一次
# B. 显示 Unchecked Trunk (离场未检查后备箱) # B. 显示 Unchecked Trunk (离场未检查后备箱)
#expired_alerts = [cid for cid, end_frame in self.unchecked_trunk_alerts.items() if self.current_frame_idx > end_frame] expired_alerts = [cid for cid, end_frame in self.unchecked_trunk_alerts.items() if self.current_frame_idx > end_frame]
expired_alerts = [cid for cid, end_frame in self.unchecked_trunk_alerts.items() if current_time_sec > end_frame] #expired_alerts = [cid for cid, end_frame in self.unchecked_trunk_alerts.items() if current_time_sec > end_frame]
for cid in expired_alerts: for cid in expired_alerts:
@@ -507,8 +510,8 @@ class KadianDetector:
alert_offset += 100 alert_offset += 100
# C. 显示 Ignore (通过过快) # C. 显示 Ignore (通过过快)
#expired_fast_alerts = [cid for cid, end_frame in self.fast_pass_alerts.items() if self.current_frame_idx > end_frame] expired_fast_alerts = [cid for cid, end_frame in self.fast_pass_alerts.items() if self.current_frame_idx > end_frame]
expired_fast_alerts = [cid for cid, end_frame in self.fast_pass_alerts.items() if current_time_sec > end_frame] #expired_fast_alerts = [cid for cid, end_frame in self.fast_pass_alerts.items() if current_time_sec > end_frame]
for cid in expired_fast_alerts: for cid in expired_fast_alerts:
@@ -521,22 +524,22 @@ class KadianDetector:
'action': "Ignore", 'action': "Ignore",
'image': ignored_trunk_frame 'image': ignored_trunk_frame
}) })
#self.draw_alert(frame, alert_text, (0, 0, 255), offset_y=alert_offset) self.draw_alert(frame, alert_text, (0, 0, 255), offset_y=alert_offset)
alert_offset += 100 alert_offset += 100
# D. 显示警察在场状态 (Nobody/Only One) # D. 显示警察在场状态 (Nobody/Only One)
# 清理过期的 Nobody 告警 # 清理过期的 Nobody 告警
#expired_nobody = [k for k, v in self.nobody_alerts.items() if self.current_frame_idx > v] expired_nobody = [k for k, v in self.nobody_alerts.items() if self.current_frame_idx > v]
expired_nobody = [k for k, v in self.nobody_alerts.items() if current_time_sec > v] #expired_nobody = [k for k, v in self.nobody_alerts.items() if current_time_sec > v]
for k in expired_nobody: for k in expired_nobody:
del self.nobody_alerts[k] del self.nobody_alerts[k]
# 清理过期的 Only One 告警 # 清理过期的 Only One 告警
# expired_only_one = [k for k, v in self.only_one_alerts.items() if self.current_frame_idx > v] expired_only_one = [k for k, v in self.only_one_alerts.items() if self.current_frame_idx > v]
expired_only_one = [k for k, v in self.only_one_alerts.items() if current_time_sec > v] # expired_only_one = [k for k, v in self.only_one_alerts.items() if current_time_sec > v]
for k in expired_only_one: for k in expired_only_one:
del self.only_one_alerts[k] del self.only_one_alerts[k]
@@ -559,8 +562,8 @@ class KadianDetector:
if effective_police_count == 0 and self.nobody_frames >= self.frame_thresh_nobody: if effective_police_count == 0 and self.nobody_frames >= self.frame_thresh_nobody:
alert_text = "Nobody" alert_text = "Nobody"
if "Nobody" not in self.nobody_alerts: if "Nobody" not in self.nobody_alerts:
# self.nobody_alerts["Nobody"] = self.current_frame_idx + int(self.police_show_seconds * self.fps) self.nobody_alerts["Nobody"] = self.current_frame_idx + int(self.police_show_seconds * self.fps)
self.nobody_alerts["Nobody"] = current_time_sec + int(self.police_show_seconds * self.fps) # self.nobody_alerts["Nobody"] = current_time_sec + int(self.police_show_seconds * self.fps)
current_frame_alerts.append({ current_frame_alerts.append({
'time': current_time_sec, 'time': current_time_sec,
'action': "Nobody", 'action': "Nobody",
@@ -570,8 +573,8 @@ class KadianDetector:
elif effective_police_count == 1 and self.only_one_frames >= self.frame_thresh_only_one: elif effective_police_count == 1 and self.only_one_frames >= self.frame_thresh_only_one:
alert_text = "Only One" alert_text = "Only One"
if "Only One" not in self.only_one_alerts: if "Only One" not in self.only_one_alerts:
# self.only_one_alerts["Only One"] = self.current_frame_idx + int(self.police_show_seconds * self.fps) self.only_one_alerts["Only One"] = self.current_frame_idx + int(self.police_show_seconds * self.fps)
self.only_one_alerts["Only One"] = current_time_sec + int(self.police_show_seconds * self.fps) # self.only_one_alerts["Only One"] = current_time_sec + int(self.police_show_seconds * self.fps)
current_frame_alerts.append({ current_frame_alerts.append({
'time': current_time_sec, 'time': current_time_sec,
'action': "Only One", 'action': "Only One",