Compare commits

...

2 Commits

View File

@@ -17,7 +17,7 @@ from utils.logger import get_logger
from common.constants import MODEL_ROOT_PATH
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_RELATIVE = np.array([
@@ -52,7 +52,7 @@ PERSON_CAR_INPUT_SIZE = 640
#POSE_INPUT_SIZE = 640
RTSP_TARGET_FPS = 10.0
RTSP_TARGET_FPS = 30.0
# ========================= Kadian TrafficMonitor精简版专为服务设计 =========================
class KadianDetector:
@@ -240,7 +240,7 @@ class KadianDetector:
current_time_sec = timestamp
print('current_time_sec:', current_time_sec)
# ========= 主检测删除pose检测=========
detections = self.detector(frame)
@@ -325,17 +325,17 @@ class KadianDetector:
# 车辆注册表初始化
if tid not in self.roi_car_registry:
self.roi_car_registry[tid] = {
# 'first_seen': self.current_frame_idx,
# 'last_seen': self.current_frame_idx,
'first_seen': current_time_sec,
'last_seen': current_time_sec,
'first_seen': self.current_frame_idx,
'last_seen': self.current_frame_idx,
# 'first_seen': current_time_sec,
# 'last_seen': current_time_sec,
'trunk_frames': 0,
'is_checked': False,
#'frame_buffer': deque(maxlen=self.max_car_frames), # 新增
}
else:
#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'] = self.current_frame_idx
#self.roi_car_registry[tid]['last_seen'] = current_time_sec
label += " IN"
elif role == "opentrunk":
color = (255, 165, 0) # 橙色
@@ -355,13 +355,14 @@ class KadianDetector:
# 警察注册表初始化
if tid not in self.roi_police_registry:
self.roi_police_registry[tid] = {
# 'first_seen': self.current_frame_idx,
# 'last_seen': self.current_frame_idx,
'first_seen': current_time_sec,
'last_seen': current_time_sec,
'first_seen': self.current_frame_idx,
'last_seen': self.current_frame_idx,
#'first_seen': current_time_sec,
#'last_seen': current_time_sec,
}
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"
else:
color = (255, 255, 255) # 白色
@@ -377,7 +378,8 @@ class KadianDetector:
# 'frame': frame.copy(),
# })
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(),
})
@@ -407,8 +409,8 @@ class KadianDetector:
for car_id, info in self.roi_car_registry.items():
last_seen = info['last_seen']
# if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_car:
if (current_time_sec - 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:
active_car_ids.append(car_id)
else:
cars_to_remove.append(car_id)
@@ -419,14 +421,15 @@ class KadianDetector:
# 处理离场车辆,生成违规告警
for car_id in cars_to_remove:
car_info = self.roi_car_registry[car_id]
duration_frames = car_info['last_seen'] - car_info['first_seen']
# 情况1通过时间太短 -> Ignore (Too Fast)
if duration_frames < self.frame_thresh_car_min_duration:
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] = current_time_sec + 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)
target_time_sec = car_info['last_seen'] - self.ignored_rollback_time
ignored_trunk_frame = self.find_target_frame(target_time_sec)
@@ -436,8 +439,8 @@ class KadianDetector:
# 情况2时间够长但没检查后备箱 -> Unchecked Trunk
elif not car_info['is_checked']:
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] = current_time_sec + 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)
target_time_sec = car_info['last_seen'] - self.untrunk_rollback_time
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():
last_seen = info['last_seen']
#if (self.current_frame_idx - last_seen) <= self.frame_buffer_limit_police:
if (current_time_sec - 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:
active_police_ids.append(police_id)
else:
polices_to_remove.append(police_id)
@@ -489,8 +492,8 @@ class KadianDetector:
# break # 只显示一次
# 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 current_time_sec > 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]
for cid in expired_alerts:
@@ -507,8 +510,8 @@ class KadianDetector:
alert_offset += 100
# 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 current_time_sec > 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]
for cid in expired_fast_alerts:
@@ -521,22 +524,22 @@ class KadianDetector:
'action': "Ignore",
'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
# D. 显示警察在场状态 (Nobody/Only One)
# 清理过期的 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 current_time_sec > 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]
for k in expired_nobody:
del self.nobody_alerts[k]
# 清理过期的 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 current_time_sec > 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]
for k in expired_only_one:
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:
alert_text = "Nobody"
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"] = current_time_sec + 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)
current_frame_alerts.append({
'time': current_time_sec,
'action': "Nobody",
@@ -570,8 +573,8 @@ class KadianDetector:
elif effective_police_count == 1 and self.only_one_frames >= self.frame_thresh_only_one:
alert_text = "Only One"
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"] = current_time_sec + 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)
current_frame_alerts.append({
'time': current_time_sec,
'action': "Only One",