暂停使用时间戳进行业务逻辑判断
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user