尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于深度学习的驾驶员分心驾驶行为识别:从LeNet-5到ResNet152的完整源码与实验对比
简介这份资源是面向高校计算机、人工智能相关专业学生的毕业设计完整项目包主题为基于深度学习实现驾驶员分心驾驶行为识别。项目已通过导师指导与认可并经过严格调试可直接运行适合作为毕设参考、课程设计或深度学习入门实战案例。压缩包共18个文件约22.65MB包含13个Python源码文件、3个CSV数据文件、1个Markdown说明文档及1个gitignore配置源码覆盖AlexNet、VGG16、ResNet、Inceptionv4、LeNet5等多种经典网络结构并附带迁移学习与多模型融合测试脚本CSV文件则用于记录训练与测试结果。目前已有535人学习下载读者可从中获得完整的模型搭建、训练、评估与对比实验思路理解不同骨干网络在分心驾驶识别任务上的表现差异并借助README快速理清项目结构与运行流程为毕业设计撰写和后续改进提供扎实参考。1. 从一份能跑通的分心驾驶识别源码说起分心驾驶识别这个题目在计算机视觉毕业设计里属于看着简单、做起来全是坑的典型。数据集里十类行为——安全驾驶、右手打字、左手打电话、喝水、拿手机、调收音机、后座回头、整理头发化妆、和乘客说话——每一类之间的视觉差异其实很小尤其是右手打字和拿手机这两类手部区域高度重叠模型很容易学混。这份基于深度学习实现驾驶员分心驾驶行为识别源码全部数据python毕业设计的资源包把从 LeNet-5 到 ResNet152、InceptionV4、DenseNet161 的完整对比实验链路都放进来了还带了训练日志 CSV 和迁移学习脚本对正在做计算机毕业设计、需要一套能复现、能改、能写进论文的实验框架的人来说省掉了大量搭骨架的时间。它适合两类人一类是刚入门深度学习、想拿一个真实多分类任务练手的同学另一类是已经跑过 MNIST、CIFAR但没做过迁移学习和模型对比实验的从业者。2. 模型选型与迁移学习为什么包里塞了这么多网络2.1 从 LeNet-5 到 ResNet152 的梯度设计打开压缩包第一眼会看到一堆以网络名命名的 py 文件lenet5.py、AlexNet.py、VGG16.py、resnet.py、Inceptionv4.py还有对应的-transfer版本。这不是随便堆的而是一条从浅到深、从自建到迁移的对比实验线。分心驾驶数据集规模通常在两万张量级类别十类如果直接用 LeNet-5 这种上世纪的结构参数量不到 6 万特征提取能力严重不足验证集准确率往往卡在 60% 上下而 ResNet152 参数量 6000 万级别直接从头训练会过拟合到怀疑人生。所以包里的正确用法是浅层网络用来跑 baseline 证明深度不够不行深层网络全部走迁移学习加载 ImageNet 预训练权重后只微调分类头。常见做法是冻结主干的前若干层只训练后面的 stage 和全连接层。以 ResNet 为例resnet18-transfer.py和resnet.py的区别就在于前者在构造模型后做了权重加载和参数冻结。下面这段是迁移学习脚本里最核心的骨架我按包里resnet18-transfer.py的写法还原出来import torch import torch.nn as nn from torchvision import models # 加载 ImageNet 预训练权重num_classes 先保持 1000 model models.resnet18(pretrainedTrue) # 冻结主干所有参数只让分类头参与训练 for param in model.parameters(): param.requires_grad False # 替换最后的全连接层输出改成 10 类分心行为 num_features model.fc.in_features model.fc nn.Linear(num_features, 10) # 只把新分类头的参数交给优化器 optimizer torch.optim.Adam(model.fc.parameters(), lr1e-3) criterion nn.CrossEntropyLoss()逻辑说明pretrainedTrue会去拉 ImageNet 权重这一步需要本机已经缓存过模型文件否则会走网络下载。冻结主干是为了在小数据集上防止灾难性遗忘——如果解冻全部参数用大学习率预训练学到的边缘、纹理特征会被迅速冲掉。model.fc.in_features对 ResNet18 是 512换成 ResNet152 就是 2048这个值不能写死必须动态取。优化器只传model.fc.parameters()如果误传model.parameters()虽然冻结层梯度为 None 不会更新但优化器状态里会多出一堆无用参数显存和速度都吃亏。参数怎么改学习率 1e-3 适合只训分类头如果你想解冻最后一个 stage 做微调学习率要降到 1e-4 甚至 1e-5否则预训练权重会被破坏。batch size 在 8G 显存上 ResNet18 可以给到 32ResNet152 只能给 8 到 12再大就 OOM。2.2 数据组织与 CSV 日志的用法包里那几个 CSV——test_dense161resnet152L2.csv、test_dense161.csv、test152152l2.csv——是训练过程记录不是数据集标签。命名规则透露了实验配置dense161指 DenseNet161resnet152指 ResNet152L2指用了 L2 正则化。这些文件里一般有 epoch、train_loss、train_acc、val_loss、val_acc 几列用来画论文里的收敛曲线。真正喂给模型的数据要靠utils.py里的 Dataset 类来组织目录结构通常是train/类别名/图片和val/类别名/图片两级。from torchvision import datasets, transforms from torch.utils.data import DataLoader # 训练集增强随机裁剪、翻转、颜色抖动缓解小数据集过拟合 train_tf transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(10), transforms.ColorJitter(brightness0.2, contrast0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 验证集只做 resize 和归一化不做增强 val_tf transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) train_set datasets.ImageFolder(data/train, transformtrain_tf) val_set datasets.ImageFolder(data/val, transformval_tf) train_loader DataLoader(train_set, batch_size32, shuffleTrue, num_workers4) val_loader DataLoader(val_set, batch_size32, shuffleFalse, num_workers4)逻辑说明ImageFolder要求目录名就是类别名它会自动按文件夹排序生成类别索引所以训练集和验证集的文件夹命名必须完全一致否则标签会对不上。归一化的 mean 和 std 是 ImageNet 的统计值用预训练权重就必须用这套值自己算一套反而会掉点。num_workers在 Windows 上建议设 0设大了容易在 DataLoader 处卡死这是血泪经验。参数说明Resize((224,224))是给 ResNet、VGG、DenseNet 用的InceptionV4 输入是 299用Inceptionv4.py时要把这里改成 299否则尺寸不匹配会报错。RandomRotation(10)对分心驾驶场景要慎用因为方向盘角度、手部位置是有语义的旋转太大会制造出物理上不存在的姿态我一般控制在 10 度以内。3. 训练主流程与多模型对比实验怎么落地3.1 main.py 的调用链与训练循环main.py是整个工程的入口它负责解析参数、选模型、跑训练循环、存最优权重。包里同时存在test.py和temp.py前者是推理脚本后者通常是调试用的临时文件正式跑实验别用temp.py。训练循环里最关键的是验证集评估和最优模型保存逻辑很多同学写论文时曲线画不出来就是因为没在每个 epoch 后记录指标。import torch, time from utils import get_model, get_dataloader device torch.device(cuda if torch.cuda.is_available() else cpu) model get_model(resnet18, num_classes10).to(device) train_loader, val_loader get_dataloader(batch_size32) criterion torch.nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.fc.parameters(), lr1e-3) best_acc 0.0 for epoch in range(30): model.train() running_loss 0.0 for imgs, labels in train_loader: imgs, labels imgs.to(device), labels.to(device) optimizer.zero_grad() outputs model(imgs) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() # 每个 epoch 结束后在验证集上评估 model.eval() correct, total 0, 0 with torch.no_grad(): for imgs, labels in val_loader: imgs, labels imgs.to(device), labels.to(device) preds model(imgs).argmax(dim1) correct (preds labels).sum().item() total labels.size(0) acc correct / total print(fepoch {epoch} loss {running_loss/len(train_loader):.4f} val_acc {acc:.4f}) # 只保存验证集最优权重避免存一堆无用 checkpoint if acc best_acc: best_acc acc torch.save(model.state_dict(), fbest_{epoch}_{acc:.4f}.pth)逻辑说明model.train()和model.eval()必须成对出现前者开启 BatchNorm 和 Dropout 的训练行为后者固定它们。验证阶段套torch.no_grad()能省显存、提速。保存文件名里带上 epoch 和 acc方便回溯是哪一轮的最优比只存一个best.pth实用得多。参数说明epoch 数在迁移学习下 20 到 30 就够收敛从头训练浅层网络要 50 以上。学习率如果发现 loss 震荡不降先降到 1e-4 试。get_model和get_dataloader是utils.py里的封装函数如果你要加新网络在这里注册一个分支即可不用改main.py。3.2 多模型对比实验的表格化记录毕业设计论文里通常要有一张不同模型在自建数据集上的性能对比表这份源码的多网络结构正好支撑这件事。跑完每个模型后把验证集准确率、参数量、单 epoch 耗时记下来整理成下面这种表比堆一堆截图有说服力。模型参数量输入尺寸验证集准确率单 epoch 耗时LeNet-5约 6 万32×3260% 左右极快AlexNet约 6000 万224×22485% 上下中等VGG16约 1.38 亿224×22490% 上下较慢ResNet18约 1100 万224×22492% 上下快ResNet152约 6000 万224×22494% 上下慢DenseNet161约 2800 万224×22494% 上下较慢InceptionV4约 4300 万299×29993% 上下较慢表里的准确率是这类数据集上的常见区间具体数值取决于你的数据划分和增强策略不要照抄要自己跑出来。参数量一列可以直接用sum(p.numel() for p in model.parameters())打印。耗时用time.time()在 epoch 前后夹一下即可。这张表的价值在于它解释了为什么最终选 ResNet 系列——准确率和速度的平衡最好而 VGG16 参数量大、InceptionV4 输入尺寸特殊都不如 ResNet 好部署。4. 环境配置与数据准备里的常见坑4.1 依赖版本与 CUDA 匹配这份源码基于 PyTorch但包里没有requirements.txt这是最容易被忽略的坑。torchvision 的版本必须和 torch 主版本对应比如 torch 1.13 配 torchvision 0.14错配会直接报ImportError。另外Inceptionv4.py如果是手写的实现可能依赖torchvision.models.inception的某些层版本不对也会挂。# 先确认显卡驱动和 CUDA 版本 nvidia-smi # 按官方对应关系装 torch 和 torchvision以 CUDA 11.8 为例 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 其余常用依赖 pip install numpy pandas matplotlib pillow tqdm逻辑说明nvidia-smi右上角显示的 CUDA Version 是驱动支持的最高版本不是你实际装的版本装 torch 时选的 cu118 只要不超过它就行。用官方 index-url 装能避免 pip 从源码编译省掉一堆编译错误。如果机器没有独显把 index-url 换成 cpu 版本代码里torch.cuda.is_available()会自动回退到 CPU只是训练会慢到不适合跑 ResNet152。4.2 数据集划分与类别不平衡分心驾驶数据集天然不平衡安全驾驶这一类往往占一半以上其余九类分剩下的。如果直接按 8:2 随机划分验证集里某些类可能只有几十张准确率波动极大。常见做法是按类别分层抽样保证每个类在训练集和验证集里的比例一致。from sklearn.model_selection import train_test_split import os # 收集所有图片路径和标签 paths, labels [], [] for idx, cls in enumerate(sorted(os.listdir(data/all))): cls_dir os.path.join(data/all, cls) for img in os.listdir(cls_dir): paths.append(os.path.join(cls_dir, img)) labels.append(idx) # stratifylabels 保证按类别比例分层 X_train, X_val, y_train, y_val train_test_split( paths, labels, test_size0.2, stratifylabels, random_state42)逻辑说明stratifylabels是分层抽样的关键参数不加它划分就是纯随机小类别可能全被分到一边。random_state42固定随机种子保证你每次划分结果一致论文里的实验才可复现。划分完再按ImageFolder要求的目录结构把文件拷过去或者自己写一个接收路径列表的 Dataset 类。参数说明test_size0.2是常规比例数据量小于一万时建议 0.3让验证集更稳。如果某个类样本少于 200 张考虑用WeightedRandomSampler在采样阶段做重加权而不是简单复制图片后者容易过拟合。5. 避坑与排查那些让实验白跑的细节现象一训练 loss 一直不降准确率停在 10%。原因通常是标签没对上ImageFolder按文件夹名排序生成索引如果训练集和验证集文件夹命名大小写不一致或者中间多了个无关文件夹索引就错位了。解决打印train_set.classes和val_set.classes确认两个列表完全一致。现象二验证准确率比训练准确率还高。这在迁移学习初期很常见原因是训练时开了 Dropout 和强增强验证时全关掉了模型在验证集上发挥更正常。但如果差距一直很大要检查验证集是不是混进了训练集图片。解决用图片的 md5 去重确认两个集合没有交集。现象三跑到一半报 CUDA out of memory。多半是 batch size 给大了或者忘了在验证阶段加torch.no_grad()导致计算图一直累积。解决先把 batch size 减半再检查验证循环有没有with torch.no_grad():。ResNet152 在 8G 卡上 batch size 超过 12 基本必炸。现象四InceptionV4 报尺寸不匹配。这个网络的输入是 299×299而其他网络是 224×224如果你共用了一个 transform跑到 InceptionV4 就会在第一个卷积层报错。解决给 InceptionV4 单独配一套Resize((299,299))的 transform在get_dataloader里按模型名分支。现象五CSV 日志里的准确率和自己复现的对不上。那些 CSV 是原作者在特定数据划分和超参下跑出来的你的划分不同、随机种子不同数值必然有差异。解决把 CSV 当参考曲线看趋势别当标准答案对数值论文里写自己的实测结果。6. 把最优模型接进推理脚本一个能演示的收尾技巧训练完拿到best_xx.pth之后答辩现场最需要的是一个能实时出结果的推理脚本而不是再跑一遍训练。包里test.py就是干这个的但默认写法往往只输出类别索引看不出置信度演示效果差。我一般会改成输出 top-3 概率和对应类别名再叠一个简单的耗时统计让评委直观看到单张推理在几十毫秒级别。import torch, time from PIL import Image from torchvision import transforms # 类别名顺序必须和训练时 ImageFolder 的 classes 一致 class_names [安全驾驶, 右手打字, 左手打电话, 喝水, 拿手机, 调收音机, 后座回头, 整理头发, 化妆, 和乘客说话] model get_model(resnet18, num_classes10) model.load_state_dict(torch.load(best_18_0.9421.pth, map_locationcpu)) model.eval() tf transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) img Image.open(demo.jpg).convert(RGB) x tf(img).unsqueeze(0) # 加 batch 维度 start time.time() with torch.no_grad(): probs torch.softmax(model(x), dim1)[0] elapsed (time.time() - start) * 1000 top3 torch.topk(probs, 3) for score, idx in zip(top3.values, top3.indices): print(f{class_names[idx]}: {score.item()*100:.2f}%) print(f单张推理耗时 {elapsed:.1f} ms)逻辑说明load_state_dict的map_locationcpu让权重能在没有 GPU 的机器上加载答辩用的笔记本不一定有独显。unsqueeze(0)是补上 batch 维度模型永远按 batch 输入。softmax把 logits 转成概率top-3 输出能体现模型在易混类别上的犹豫程度——比如右手打字和拿手机经常同时出现在前三这本身就是可以写进论文讨论的点。参数说明class_names的顺序必须和训练时ImageFolder生成的classes完全一致最稳妥的做法是训练完把train_set.classes存成 json推理时读进来别手敲。耗时统计只算前向不含图片读取和预处理如果要报端到端延迟把Image.open和tf(img)也包进计时区间。从那以后我每次交付这类视觉项目都会强制走一遍训练脚本→最优权重→独立推理脚本的闭环确认换一台机器、不装 CUDA 也能跑出结果再交给别人。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Python爬取链家广州二手房数据:从采集清洗到可视化分析实战

Python爬取链家广州二手房数据:从采集清洗到可视化分析实战

简介:本资源面向Python爬虫与数据分析初学者及进阶学习者,提供一套完整的链家广州二手房数据采集与可视化分析项目源码,帮助读者掌握从网页请求、数据解析到清洗、统计与图表呈现的全流程实践。压缩包共13个文件,包含9个py脚本、2…

📅 2026/10/31 14:08:27
随机变量:从抽象定义到工程实践,避开建模中的常见陷阱

随机变量:从抽象定义到工程实践,避开建模中的常见陷阱

随机变量这个概念,很多人第一次接触时都会觉得抽象——明明叫“变量”,怎么又跟“随机”扯上关系了?我在带新人和做项目复盘时反复遇到同一个现象:大家能背出定义,却说不清它到底解决什么问题,更别提在实际…

📅 2026/10/31 14:08:27
搭建个人技能管理体系:把能力变成可管理的资产

搭建个人技能管理体系:把能力变成可管理的资产

做了这么多年技术和管理,我越来越发现一个残酷的事实:决定一个人能走多远的,往往不是他某一项技能有多强,而是他能不能把自己的技能“管理”起来。很多人明明学了一堆东西,真到用的时候却想不起来;有些人工…

📅 2026/10/31 14:08:27
MORE NEWS

更多资讯

📰

中小企业出海必备:5款国产AI工具深度评测与选型指南

1. 中小企业出海面临的AI工具选择困境作为一家专注外贸领域十年的技术顾问,我见证了数百家中小企业在出海过程中面临的共同挑战:既需要AI技术提升效率,又受限于预算和团队规模。国产AI工具的崛起正在改变这一局面——它们不仅价格亲民&#x…

📰

《小狗钱钱2》软技能手册:品格、关系与自我认知的财富底层逻辑

1. 一本被低估的“软技能”手册:为什么我把它翻了三遍 第一次翻开《小狗钱钱2》的时候,我其实是带着点“续集必拉胯”的偏见去的。毕竟第一部的光环太强了,满脑子都是梦想储蓄罐、成功日记、72小时法则这些硬邦邦的理财操作。结果读进去才发现…

📰

Redis哨兵模式与Bitnami容器化部署实践

1. Redis哨兵模式的核心价值与Bitnami方案优势Redis哨兵模式是Redis官方推荐的高可用解决方案,它通过监控主从节点状态、自动故障转移和配置更新三大核心机制,确保Redis服务在节点故障时仍能持续提供服务。我在实际生产环境中部署过多次Redis集群&#x…

📰

Python连接PostgreSQL实战指南与最佳实践

1. Python连接PostgreSQL的完整指南PostgreSQL作为一款功能强大的开源关系型数据库,与Python的结合在数据分析和Web开发中极为常见。作为一名长期使用Python操作PostgreSQL的开发者,我经常看到新手在连接配置和基础操作上踩坑。本文将分享从环境准备到实…

📰

YOLOv8手势识别系统实现与优化全解析

1. 项目概述:基于YOLOv8的手势识别系统全流程实现手势识别作为人机交互领域的重要研究方向,近年来随着深度学习技术的突破取得了显著进展。本项目完整实现了从数据集准备、模型训练到系统部署的YOLOv8手势识别解决方案,特别针对毕业论文场景提…

📰

第五次作业设计:从知识积累到能力应用的关键转折

1. 项目概述 "第五次作业"这个标题看似简单,却蕴含着丰富的教学实践内涵。作为一名教育工作者,我深知第五次作业在课程体系中的特殊地位——它往往标志着学生从知识积累阶段向能力应用阶段的过渡。这个阶段的作业设计直接关系到学生能否将前期…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬