资讯动态

PyTorch实战:交警手势识别8类动作全流程与数据集落地

发布时间:2026/10/2 9:07:15 来源:尧图企业网站定制
简介本资源是一套基于PyTorch实现中国交通警察8种指挥手势识别的完整项目包面向深度学习入门者、计算机视觉方向学生及智能交通应用开发者帮助解决手势自动分类与关键点检测的工程落地问题。压缩包共34个文件以31个Python脚本为核心覆盖模型定义、训练循环、评估预测与数据预处理流程另含2个Markdown说明文档和1个演示GIF整体约4.42MB目录按训练、模型、数据集处理与测试模块清晰划分。项目围绕卷积神经网络构建手势识别模型并引入姿态估计与关键点检测思路配套数据增强、骨架提取、亲和场与高斯热图等预处理脚本便于理解从原始图像到手势类别的完整链路。已有1345人学习下载适合希望掌握PyTorch视觉项目结构、复现训练评估流程并借鉴关键点方案的中级开发者参考。1. 从零复现交警手势识别8 类动作、PyTorch 全流程与数据集怎么落地路上遇到交警打手势老司机都可能愣两秒更别说让摄像头去认。这个标题要干的事就是把「中国交通警察指挥手势识别」拆成一套能跑起来的 PyTorch 工程8 种标准手势、一份可训练的数据集、一个能推理的模型外加从环境搭建到训练调参的完整步骤。它解决的不是学术 benchmark 刷点而是「我手头有路口视频或图片怎么让模型稳定分出停止、直行、左转弯、右转弯、变道、减速、靠边停车、车辆掉头这 8 类动作」。适合两类人一是想拿它做课程设计或毕设的学生二是想把交警手势接入边缘设备做辅助提醒的工程师。核心难点不在网络结构而在数据——手势是时序动作单帧容易和普通指挥动作混淆数据集的质量直接决定模型上限。2. 8 种手势怎么定义、数据集从哪来、PyTorch 环境怎么搭2.1 先把 8 类手势的边界划清楚中国交通警察指挥手势有国家标准常见的是 8 种停止信号、直行信号、左转弯信号、左转弯待转信号、右转弯信号、变道信号、减速慢行信号、车辆靠边停车信号不同资料里「车辆掉头」也会被算作一类具体以你拿到的数据集标签为准。做识别之前必须做一件事把每类手势的起止帧定义清楚。比如「左转弯待转」和「左转弯」在单帧上几乎一样区别在手臂摆动幅度和持续时间。如果数据集只给静态图模型学到的就是「手臂角度」而不是「动作语义」上线后遇到不同交警的幅度差异就会翻车。我一般会先做标签映射表把数据集里的原始文件夹名或标注文件统一成 0~7 的整数并写进一个classes.txt。这一步看着简单但后面训练、推理、可视化全靠它对齐一旦错位模型输出全是乱的。类别编号手势名称关键判别特征0停止信号左臂向前上方直伸掌心向前1直行信号左臂侧平伸右臂向前摆动2左转弯信号右臂向前平伸左臂摆动3左转弯待转信号左臂侧平伸上下摆动4右转弯信号左臂向前平伸右臂摆动5变道信号右臂向前平伸向左摆动6减速慢行信号右臂向右前方平伸上下摆动7靠边停车信号右臂向前下方平伸向左摆动注意如果你拿到的数据集标签数量和上表不一致以数据集自带的说明为准不要硬套。2.2 数据集来源与预处理别急着上模型这类项目的数据集通常有三种来源一是公开的交警手势图片集二是从路口监控视频抽帧后人工标注三是用公开人体姿态数据集做迁移。标题里带了「数据集」说明作者已经整理好了一份但你要做的是先验证它能不能用。常见做法是统计每类样本数如果最多和最少相差超过 5 倍就要做重采样或数据增强。预处理分两步。第一步是统一尺寸我一般把短边缩到 256再中心裁剪到 224×224和主流骨干网络对齐。第二步是做归一化用 ImageNet 的均值和方差就行因为后面大概率会用预训练权重。import os from PIL import Image from torch.utils.data import Dataset, DataLoader from torchvision import transforms class TrafficPoliceGestureDataset(Dataset): def __init__(self, root_dir, transformNone): self.samples [] self.transform transform # 假设目录结构为 root_dir/类别名/图片.jpg self.classes sorted(os.listdir(root_dir)) self.class_to_idx {c: i for i, c in enumerate(self.classes)} for cls in self.classes: cls_dir os.path.join(root_dir, cls) if not os.path.isdir(cls_dir): continue for fname in os.listdir(cls_dir): if fname.lower().endswith((.jpg, .png, .jpeg)): self.samples.append((os.path.join(cls_dir, fname), self.class_to_idx[cls])) def __len__(self): return len(self.samples) def __getitem__(self, idx): path, label self.samples[idx] img Image.open(path).convert(RGB) if self.transform: img self.transform(img) return img, label train_tf transforms.Compose([ transforms.Resize(256), transforms.RandomCrop(224), transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) dataset TrafficPoliceGestureDataset(data/train, transformtrain_tf) loader DataLoader(dataset, batch_size32, shuffleTrue, num_workers4)这段代码的关键点有三个class_to_idx保证标签顺序固定RandomHorizontalFlip对左右手手势要慎用因为左右转弯翻转后语义会变建议只对不区分左右的手势开启num_workers在 Windows 上如果报错就改成 0。参数上batch_size32是 8GB 显存下的稳妥值显存小就降到 16 并配合梯度累积。2.3 PyTorch 环境搭建版本对应别踩坑环境这块热搜里「pytorch安装教程超详细」「anaconda配置pytorch环境」都是高频需求。我的习惯是用 conda 建独立环境Python 选 3.9 或 3.10PyTorch 选 2.x 稳定版。CUDA 版本要和驱动匹配不确定就先装 CPU 版跑通流程再换 GPU 版。conda create -n gesture python3.10 -y conda activate gesture # 以 CUDA 11.8 为例具体命令以官方安装页为准 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install numpy opencv-python pillow matplotlib tqdm scikit-learn装完必须验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only)如果cuda.is_available()返回 False先查驱动版本再查 PyTorch 和 CUDA 是否对应。这一步没有后悔药版本错了后面训练报的错会非常玄学。3. 模型选型与训练从 ResNet 到时序建模的取舍3.1 骨干网络怎么选别一上来就 Transformer8 类手势识别如果只做单帧分类ResNet18 或 MobileNetV3 就够用参数量小、推理快适合边缘部署。热搜里「transformer模型详解」很火但在这个任务上纯 Transformer 需要更多数据才能压住过拟合除非你有几万张以上的标注图。我的建议是先用 ResNet18 跑一个 baseline看验证集准确率和混淆矩阵再决定要不要换 backbone。import torch.nn as nn from torchvision import models def build_model(num_classes8, pretrainedTrue): model models.resnet18(weightsmodels.ResNet18_Weights.DEFAULT if pretrained else None) # 替换最后的全连接层适配 8 类 in_features model.fc.in_features model.fc nn.Sequential( nn.Dropout(0.3), nn.Linear(in_features, num_classes) ) return model model build_model(8) device cuda if torch.cuda.is_available() else cpu model model.to(device)Dropout(0.3)是为了缓解小数据集过拟合如果数据量超过 5 万张可以降到 0.1。pretrainedTrue用 ImageNet 权重收敛快很多这是血泪经验从零训练在小数据上几乎必翻车。3.2 训练循环与关键参数训练部分我习惯把学习率、优化器、调度器都显式写出来方便复现。优化器用 AdamW学习率 1e-3权重衰减 1e-4配合 CosineAnnealingLR。损失函数用交叉熵如果类别不平衡就加 class weight。import torch from torch.optim import AdamW from torch.optim.lr_scheduler import CosineAnnealingLR from tqdm import tqdm def train_one_epoch(model, loader, criterion, optimizer, device): model.train() total_loss, correct, total 0, 0, 0 for imgs, labels in tqdm(loader): imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() * imgs.size(0) preds outputs.argmax(dim1) correct (preds labels).sum().item() total imgs.size(0) return total_loss / total, correct / total criterion nn.CrossEntropyLoss() optimizer AdamW(model.parameters(), lr1e-3, weight_decay1e-4) scheduler CosineAnnealingLR(optimizer, T_max30) for epoch in range(30): loss, acc train_one_epoch(model, loader, criterion, optimizer, device) scheduler.step() print(fEpoch {epoch1}, loss{loss:.4f}, acc{acc:.4f})参数说明T_max30表示 30 个 epoch 内学习率从 1e-3 余弦降到接近 0如果验证集准确率在第 10 个 epoch 就不涨了把 T_max 调小到 15。batch_size和lr要联动batch 翻倍时 lr 可以乘 1.5 左右但别超过 3e-3否则 loss 会震荡。3.3 验证与混淆矩阵看出模型到底错在哪训练完不能只看准确率必须看混淆矩阵。8 类手势里「左转弯」和「左转弯待转」最容易混「减速慢行」和「变道」也常错。用 sklearn 画一张混淆矩阵一眼就能定位问题。from sklearn.metrics import confusion_matrix, classification_report import numpy as np def evaluate(model, loader, device): model.eval() all_preds, all_labels [], [] with torch.no_grad(): for imgs, labels in loader: imgs imgs.to(device) outputs model(imgs) preds outputs.argmax(dim1).cpu().numpy() all_preds.extend(preds) all_labels.extend(labels.numpy()) print(classification_report(all_labels, all_preds, digits4)) print(confusion_matrix(all_labels, all_preds)) return np.array(all_preds), np.array(all_labels)如果某两类互相错得厉害优先补这两类的数据而不是调网络。数据层面的问题模型结构救不回来。4. 避坑与排查训练不收敛、显存爆、部署慢的常见原因4.1 现象loss 一直不降准确率卡在 12.5%原因8 类随机猜就是 12.5%说明模型没学到东西。最常见的是标签没对齐或者图片路径读进来全是同一类。解决先打印一个 batch 的标签分布确认每类都有再检查class_to_idx是否和数据集文件夹顺序一致。如果标签没问题把学习率降到 1e-4 再试。4.2 现象训练几个 epoch 后 loss 变成 nan原因学习率太大或者数据里有损坏图片导致梯度爆炸。解决加梯度裁剪torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm5.0)并在 Dataset 里用 try/except 跳过打不开的图片。另外检查归一化参数如果用了自定义均值方差但算错了也会 nan。4.3 现象CUDA out of memory原因batch_size 太大或者验证时没加torch.no_grad()。解决把 batch_size 降到 8 或 16验证和推理阶段务必包在with torch.no_grad():里。如果还爆用torch.cuda.empty_cache()清理缓存或者改用混合精度训练。from torch.cuda.amp import autocast, GradScaler scaler GradScaler() with autocast(): outputs model(imgs) loss criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()混合精度能把显存占用降三成左右速度也快但要注意 loss scaling 没配好会出现梯度下溢。4.4 现象验证集准确率高实际视频推理一塌糊涂原因数据集背景太单一模型学到了背景而不是手势。解决做背景增强比如随机替换背景、加运动模糊、随机遮挡。另外如果实际场景是视频单帧模型会丢时序信息建议加一个 LSTM 或 3D 卷积做时序融合或者用滑动窗口取多帧投票。4.5 现象模型文件很大边缘设备跑不动原因ResNet18 虽然不大但如果你换了 ResNet50 或 ViT参数量翻几倍。解决用 MobileNetV3 或 ShuffleNetV2 替换 backbone再配合 ONNX 导出和量化。量化后模型能缩小到原来的四分之一精度掉 1~2 个点多数场景可以接受。5. 把模型推到能用的程度时序融合、量化与一个验证技巧单帧模型做到 90% 验证准确率不算难但真正上线你会发现视频里连续帧的预测会跳变。我一般会加一个轻量时序模块取连续 8 帧的特征过一个单向 LSTM再输出分类。这样「左转弯待转」这种靠持续时间的动作就能被区分开。实现上不用改 backbone只把model.fc换成LSTM Linear即可训练时把 Dataset 的__getitem__改成返回一个 clip 而不是单张图。class TemporalModel(nn.Module): def __init__(self, backbone, hidden128, num_classes8): super().__init__() self.backbone nn.Sequential(*list(backbone.children())[:-1]) # 去掉 fc self.lstm nn.LSTM(512, hidden, batch_firstTrue) self.fc nn.Linear(hidden, num_classes) def forward(self, x): # x: (B, T, C, H, W) B, T x.size(0), x.size(1) x x.view(B * T, *x.shape[2:]) feats self.backbone(x).view(B, T, -1) out, _ self.lstm(feats) return self.fc(out[:, -1, :])验证技巧上我习惯留一段完整视频不参与训练用滑动窗口逐帧推理统计连续 30 帧的投票结果。如果投票后准确率比单帧高 5 个点以上说明时序模块有效如果反而降了多半是 LSTM 过拟合把 hidden 降到 64 或加 dropout。量化部署用 ONNX Runtime 或 TensorRT先导出 ONNX再用onnxruntime.quantization做动态量化。注意量化后要重新跑一遍验证集确认精度掉幅在可接受范围。最后一句掏心窝的话这个方向值不值得做取决于你的数据能不能覆盖真实路口的多样性模型结构反而是最容易换的部分。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑