银行监控系统需要同时追踪人员和特定物品(如现金、贵重物品箱等),传统单检测模型方案难以满足复杂场景需求。本文将深入解析如何通过双YOLOv8检测模型(人+物)与DeepSORT的深度整合,构建高精度银行监控多目标跟踪系统。
银行监控场景的特殊性决定了技术方案的独特性。柜台区域通常存在以下特征:人员动线相对固定、物品传递频繁、存在大量遮挡场景(如柜员与客户交接物品时的肢体遮挡)。这些特点对多目标跟踪系统提出了三项核心要求:
我们的解决方案采用双检测器架构:
python复制# 双检测器初始化示例
overrides_1 = {
"task": "detect",
"mode": "predict",
"model": 'weights/yolov8m.pt', # 人员检测模型
"classes": [0] # 只检测person类
}
overrides_2 = {
"task": "detect",
"mode": "predict",
"model": 'weights/bank_items.pt', # 物品检测模型
}
双检测器输出的坐标空间一致,但类别ID需要特殊处理以避免冲突。我们采用偏移映射法解决这个问题:
python复制# 类别映射实现代码片段
def merge_detections(det_person, det_items):
person_boxes = det_person.boxes.xywh.cpu()
person_cls = det_person.boxes.cls + 4 # 人员类别偏移
items_boxes = det_items.boxes.xywh.cpu()
items_cls = det_items.boxes.cls # 物品类别保持
merged_boxes = torch.cat([person_boxes, items_boxes])
merged_cls = torch.cat([person_cls, items_cls])
merged_conf = torch.cat([det_person.boxes.conf, det_items.boxes.conf]).cpu()
return merged_boxes, merged_cls, merged_conf
原始DeepSORT缺少类别信息输出能力,我们对其进行了三项关键改造:
Detection类增强:
Tracker类扩展:
输出格式重构:
python复制# 修改后的Detection类
class Detection:
def __init__(self, tlwh, confidence, feature, label):
self.tlwh = np.asarray(tlwh, dtype=np.float32)
self.confidence = float(confidence)
self.feature = np.asarray(feature, dtype=np.float32)
self.label = label # 新增类别标签
银行监控场景需要特殊的跟踪参数配置,经过实测验证的推荐参数如下:
| 参数名 | 推荐值 | 业务考量 |
|---|---|---|
| MAX_IOU_DISTANCE | 0.9 | 柜台场景目标移动缓慢,允许较高IOU阈值 |
| MAX_AGE | 30 | 银行场景目标不会突然消失,适当延长跟踪寿命 |
| N_INIT | 3 | 确保新目标真实性,避免误检干扰 |
| MIN_CONFIDENCE | 0.4 | 平衡检测灵敏度与误报率 |
| NN_BUDGET | 50 | 银行场景目标数量有限,节省计算资源 |
注意:实际部署时应根据具体摄像头角度和业务流密度进行微调,特别是现金交接区域的参数需要单独优化。
我们设计了面向银行监控的VideoTracker类,其主要功能模块包括:
python复制class VideoTracker:
def __init__(self, track_cfg, predictors):
self.predictors = predictors # 双检测器实例
self.deepsort = build_tracker(deepsort_cfg) # 定制化DeepSORT
def track_frame(self, img):
# 并行执行双检测
det_person = self.predictors[0](source=img)[0]
det_items = self.predictors[1](source=img)[0]
# 融合检测结果
boxes, cls, confs = merge_detections(det_person, det_items)
# DeepSORT跟踪
if len(boxes) > 0:
outputs = self.deepsort.update(boxes, confs, img, cls)
else:
outputs = np.zeros((0, 7)) # 空结果处理
return outputs
银行监控系统通常需要7×24小时运行,我们采用以下优化策略保证系统实时性:
检测器级联执行:
跟踪结果缓存:
硬件加速方案:
bash复制# TensorRT模型转换命令(示例)
trtexec --onnx=yolov8m.onnx --saveEngine=yolov8m.engine \
--fp16 --workspace=2048
银行监控中几个关键场景需要特殊处理:
现金交接场景:
多人排队场景:
物品遗留检测:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 物品ID频繁跳变 | 特征相似度过高 | 调整MAX_DIST到0.15 |
| 人员消失后不恢复 | MAX_AGE设置过小 | 增大到50-70帧 |
| 误检目标持续跟踪 | MIN_CONFIDENCE过低 | 提升到0.5-0.6 |
| 系统延迟明显 | 检测器负载过高 | 启用级联检测策略 |
实际部署中我们发现,柜台摄像头的最佳安装角度为俯角30-45度,这个角度既能清晰捕捉人脸,又能完整记录柜台上的物品流转。对于现金等重点物品,建议在训练数据中增加各种摆放姿态的样本,特别是边缘裁剪情况下的识别能力。