本项目当前仅保留并维护以下核心流程:
annotate_helmet.py/annotate_vest.py:标注train_helmet.py/train_vest.py:训练detect_helmet.py/detect_vest.py/detect_ppe.py:推理
pip install -r requirements.txt- 使用 YOLO 人体检测(
classes=[0])先定位人。 - 基于人体框做规则裁剪:
- 头盔任务:裁剪头部区域
- 反光衣任务:裁剪上半身区域
- 仅保存有效 crop,按键标注:
1:合规(with)2:违规(without)3:invalidq:退出
数据目录:
dataset/helmet/
with_helmet/
without_helmet/
invalid/
dataset/vest/
with_vest/
without_vest/
invalid/
运行:
python annotate_helmet.py
python annotate_vest.py模型为 HeadHelmetResNet(num_classes=3),类别顺序固定为:
- helmet:
[with_helmet, without_helmet, invalid] - vest:
[with_vest, without_vest, invalid]
训练核心 trick:
- 类别权重(class_weights):提高违规类别学习强度。
- 非对称惩罚(false_violation_penalty):
- 在 GT 为合规时,额外惩罚预测为违规的概率;
- 目标是尽量避免“把合规误报为违规”。
默认训练参数:
epochs=40batch_size=32lr=1e-4weight_decay=5e-4- helmet:
class_weights=[1.0, 2.0, 1.0] - vest:
class_weights=[1.0, 4.0, 1.0] false_violation_penalty=3.0
运行:
python train_helmet.py
python train_vest.py输出权重:
weights/resnet_helmet.pthweights/resnet_vest.pth
单任务推理脚本:
python detect_helmet.py
python detect_vest.py关键机制(减少误报):
- 阈值分层决策
ok_threshold:合规阈值violation_threshold:违规阈值(通常更高)invalid_threshold:invalid 阈值
- 轨迹级证据累积
score_decay:历史衰减score_step:违规帧加分trigger_score:触发告警分数min_violation_streak:最小连续违规帧clear_ok_streak:连续合规后清空证据
这套策略能缓解短时抖动、遮挡和 invalid 带来的误触发。
新增脚本:
python detect_ppe.py功能:
- 同时运行头盔分类与反光衣分类。
- 右侧三列实时展示:
No HelmetNo VestNo Helmet + No Vest
- 自动处理状态迁移:
- 若某 ID 先进入
No Helmet,后续又确认No Vest,会自动从第一列移除并加入第三列。
- 若某 ID 先进入
说明:
- 由于有较长
invalid/unknown阶段,联合脚本采用“每帧重算归属列”的方式,确保最终列归属与当前证据一致。 - 若要修改检测视频,请修改
main函数第一行。
- 现场误报偏多:
- 提高
violation_threshold - 提高
min_violation_streak - 提高
trigger_score
- 提高
- 漏报偏多:
- 适当降低
violation_threshold - 降低
min_violation_streak
- 适当降低
- 训练阶段若“合规被误判违规”:
- 增大
false_violation_penalty - 适当上调违规类/合规类权重比例做平衡
- 增大
annotate_helmet.py
annotate_vest.py
train_helmet.py
train_vest.py
detect_helmet.py
detect_vest.py
detect_ppe.py
ppe/
annotation.py
training.py
inference.py
tasks.py
model/
resnet.py
resnet_data.py
utils.py
README.md
requirements.txt