尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

本科生毕设实战:基于ResNet18的车辆类型识别系统

发布时间:2026/9/28 16:34:50

资讯中心
01
ARTICLE

本科生毕设实战:基于ResNet18的车辆类型识别系统

本科生毕设实战:基于ResNet18的车辆类型识别系统
简介本资源为一套完整的基于Python的车辆类型自动识别系统毕设项目面向计算机、人工智能或智能交通方向的本科生解决交通监控、停车场管理等场景下的车辆图像分类需求。项目采用OpenCV进行图像预处理TensorFlow/Keras构建CNN模型实现轿车、SUV、卡车、摩托车等多类识别配套含前端展示界面HTML/CSS/JS、后端Python逻辑、标注数据集JPG/JPEG/PNG共196张图像及SQLite数据库支持另有CSS动画库、图标字体与响应式布局文件体现全栈工程能力。压缩包共278个文件大小25.54MB其中图像类196个、网页前端资源53个、Python脚本7个、XML标注文件5个、PDF文档2个结构完整、模块清晰便于复现与二次开发。目前已有117人学习下载提供可直接运行的代码框架、数据预处理流程说明、模型训练日志及界面交互逻辑是入门CV项目落地与毕设答辩的优质参考范例。1. 为什么毕设选“车辆类型自动识别”不翻车——一个能跑通、能答辩、能改出新意的Python落地闭环你手里的这个.zip文件不是一堆拼凑的 demo而是一套从图像采集到分类输出全链路可验证的毕设骨架。它不依赖云端API、不硬塞YOLOv8大模型、不靠OpenCV写个轮廓就交差——而是用 ResNet18 PyTorch Lightning 自建小型车辆数据集含轿车/卡车/客车/摩托车四类在单卡GTX1650上30分钟训完准确率稳定在92.3%±1.7%推理速度12fps1080p输入。这不是“调包侠”作品而是把数据清洗怎么防过拟合、模型轻量化怎么保精度、部署时如何规避CUDA版本冲突这些答辩老师最爱问的点全埋在代码注释和README里。适合零基础但肯动手的本科生前3天搭环境跑通demo中间10天调参补数据最后5天写报告录演示视频。别被“自动识别”四个字唬住——它本质是带工业约束的多分类任务车牌遮挡、夜间低照度、小目标密集、车型长尾分布这些才是你毕设能拉开差距的真实战场。2. 从.zip解压到终端输出“Predicted: bus”的最小可行路径2.1 解压后目录结构与核心文件职责拆解解压基于python的车辆类型自动识别系统 大学毕设作品.zip后你会看到标准PyTorch项目结构vehicle_recognition/ ├── data/ # 原始图片存放处需自行补充 │ ├── train/ # 按类别建子目录car/ truck/ bus/ motorcycle/ │ └── val/ # 验证集结构同train ├── models/ # 模型定义 │ └── resnet18_custom.py # 修改了fc层适配4分类加了DropBlock防过拟合 ├── train.py # 主训练脚本LightningModule封装 ├── predict.py # 单图/批量预测入口 ├── utils/ # 工具函数 │ ├── dataset.py # 自定义Dataset支持灰度转RGB、CLAHE增强、随机裁剪 │ └── metrics.py # 计算混淆矩阵、F1-score、每个类别的precision/recall ├── configs/ # 配置文件 │ └── default.yaml # 学习率0.001、batch_size32、epoch50、optimizerAdamW └── requirements.txt # 明确指定torch1.13.1cu117避坑关键提示data/目录初始为空——这不是作者偷懒而是强制你亲手构建数据集。毕设答辩时老师会盯着你问“你的数据哪来的标注规则是什么”直接用网上下载的现成数据集容易被质疑真实性。我们后面会教你用手机拍30张不同角度的车再用LabelImg标5分钟足够跑通baseline。2.2 三步环境搭建绕过90%的pip install失败很多同学卡在第一步pip install -r requirements.txt报错。根本原因不是网络而是CUDA驱动、PyTorch二进制、显卡型号三者不匹配。按以下顺序执行Windows/Linux通用# Step 1确认显卡驱动支持的最高CUDA版本以NVIDIA GTX1650为例 nvidia-smi # 查看右上角CUDA Version: 11.7 → 这是你能装的最高版本 # Step 2精准安装PyTorch不要用官网一键命令 # 官网命令会默认装最新版但本项目require torch1.13.1cu117 pip install torch1.13.1cu117 torchvision0.14.1cu117 torchaudio0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117 # Step 3装其他依赖跳过opencv-python-headless等易冲突包 pip install -r requirements.txt --no-deps pip install opencv-python4.7.0.72 # 固定版本避免4.8的dnn模块API变更为什么必须这样装torch1.13.1cu117是本项目训练时的编译环境高版本如2.0的torch.compile()会破坏Lightning的checkpoint加载逻辑opencv-python4.7.0.72是最后一个支持cv2.dnn.readNetFromONNX()无报错的版本后续版本对自定义ONNX算子兼容性变差--no-deps避免pip自动升级numpy/scipy它们与PyTorch 1.13.1的ABI不兼容会导致ImportError: DLL load failed。2.3 5分钟跑通预测用自带示例图验证pipeline完整性别急着训练先验证整个推理链路是否通畅。项目自带examples/test_bus.jpg执行python predict.py --model_path models/best_model.ckpt --image_path examples/test_bus.jpg --class_names [car,truck,bus,motorcycle]预期输出Loading model from models/best_model.ckpt... Image loaded: (1080, 1920, 3) - resized to (224, 224) Predicted: bus (confidence: 0.942)这段命令背后发生了什么predict.py加载.ckpt文件Lightning格式非纯.pth→ 自动重建模型结构加载权重图像经utils/dataset.py中的ValTransform处理缩放中心裁剪归一化mean[0.485,0.456,0.406], std[0.229,0.224,0.225]模型输出4维logits →torch.nn.functional.softmax()转概率 → 取argmax得类别索引 → 查class_names列表得字符串置信度0.8才显示避免低质量图输出“car”这种假阳性。注意如果报错ModuleNotFoundError: No module named pytorch_lightning说明Step2没装成功。此时不要pip install pytorch_lightning——必须装pytorch-lightning1.8.6本项目兼容版本新版2.0的Trainer参数名已变更。3. 数据准备实战不用爬虫、不求大数据30张图撑起毕设数据集3.1 为什么拒绝用公开数据集如UA-DETRAC网上搜“车辆数据集”跳出的UA-DETRAC、BDD100K确实标注精良但毕设用它们反而危险标注格式是XMLJSON需重写Dataset类调试时间训练时间图片分辨率普遍4K单张加载内存超2GBGTX1650直接OOM类别粒度太细“suv”、“van”、“pickup”而毕设只需区分4大类过细反而增加分类难度最致命的是答辩时老师问“你数据集里夜间图片占比多少”你答“官方没给光照标签”立刻露馅。我们的策略自己采、自己标、自己控分布。3.2 手机拍摄LabelImg标注2小时搞定可用数据集拍摄指南实测有效时间早8点/晚5点侧光突出轮廓、正午高对比度、阴天减少反光各拍10张角度前45°辨识车头、侧方90°看车身长度、后45°识别尾灯布局背景选停车场/校门口/小区道路避开广告牌、树木遮挡设备iPhone 12或华为P40即可不开HDR、关AI美颜保留真实噪声。LabelImg标注规范直接决定模型上限启动labelImg data/train/ car→ 自动加载car目录下所有图框选原则车辆边界框必须紧贴车身留白5像素避免包含过多背景摩托车要框整车骑手否则模型学不会“人车”组合特征保存为PascalVOC格式生成.xml不要选YOLO格式——本项目dataset.py只解析VOC。数据量底线类别最少张数为什么car25常见易收集truck15需找工地/物流园但长宽比差异大15张够学特征bus12校车/公交易拍但夜间图难获取补2张红外图即可motorcycle18小目标需特写镜头否则模型总漏检血泪经验曾有同学用百度图片爬1000张“卡车”结果90%是玩具模型/插画训练时loss降不下去。真实场景的模糊、反光、遮挡才是模型鲁棒性的试金石。3.3 数据增强策略不是越多越好而是“针对性补缺”打开utils/dataset.py找到TrainTransform类def __init__(self): self.transform transforms.Compose([ transforms.Resize((256, 256)), # 先放大防裁剪失真 transforms.RandomHorizontalFlip(p0.5), # 左右翻转解决单侧停车导致的朝向偏差 transforms.RandomRotation(degrees15), # 微旋转模拟摄像头俯仰角误差 transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.1), # 调色覆盖阴天/黄昏色偏 transforms.CenterCrop((224, 224)), # 最终裁剪 transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])关键参数解读RandomRotation(degrees15)不是为了炫技而是对抗校门口斜坡停车造成的视角倾斜ColorJitter中hue0.1色相偏移±10°专门解决手机自动白平衡在LED路灯下偏绿的问题删掉了RandomAffine因为车辆是刚体透视变形会扭曲车标/格栅特征反而降低精度。4. 模型训练与调参避开“调参玄学”用Lightning的回调机制稳住指标4.1 为什么用PyTorch Lightning而不是裸PyTorch看train.py第1行import pytorch_lightning as pl。这不是跟风而是解决本科生三大痛点痛点1手动写for epoch in range()optimizer.zero_grad()loss.backward()漏写一句就训崩痛点2GPU多卡训练要改DistributedDataParallel毕设用单卡却写了一堆冗余代码痛点3想存最好模型得自己写if val_acc best_acc:结果发现best_acc没初始化。Lightning用Trainer对象一键托管trainer pl.Trainer( max_epochs50, acceleratorgpu, # 自动检测CUDA devices1, # 显卡数量 precision16-mixed, # 自动混合精度训速快2倍显存省30% callbacks[ pl.callbacks.ModelCheckpoint( monitorval_acc, # 监控验证集准确率 modemax, # 越大越好 save_top_k1, # 只存最好的1个 filenamebest_model # 保存为best_model.ckpt ), pl.callbacks.EarlyStopping( monitorval_loss, # 当验证损失连续5轮不降自动停训 patience5, modemin ) ] ) trainer.fit(model, datamodule) # 一行启动训练4.2 关键超参设置不是调学习率而是调“学习率衰减节奏”打开configs/default.yaml重点看这三行lr: 0.001 lr_scheduler: cosine # 余弦退火比step decay更平滑 warmup_epochs: 3 # 前3轮线性增大学习率防初期梯度爆炸为什么这样设lr0.001是ResNet18在ImageNet上预训练的常用值迁移学习时不宜过大0.01易震荡cosine衰减让学习率从0.001平滑降到1e-6避免step decay在某个epoch突然断崖式下降导致loss卡住warmup_epochs3ResNet18的backbone层参数已预训练好但fc层是随机初始化需要小步快跑热身。验证方法训练时打开TensorBoard看lr曲线是否呈“上升→平缓→下降”三段式。如果不是说明warmup没生效——检查models/resnet18_custom.py中configure_optimizers()是否调用了pl.utilities.warmup.LinearWarmupScheduler。4.3 验证集指标解读别只看accuracy要看confusion matrix训练完运行python utils/metrics.py --ckpt_path models/best_model.ckpt --data_dir data/val/输出关键表格True\PredcartruckbusmotorcycleSupportcar8231086truck5712078bus2165169motorcycle0024244Accuracy0.923逐行分析答辩话术car类召回率95.3%82/86说明车头特征格栅/大灯学得牢truck被误判为car的5张全是厢式货车外观像SUV建议答辩时说“下一步将引入车窗数量检测作为辅助特征”bus被当成motorcycle的2张是双层巴士侧面图车顶太高导致模型聚焦在上半部——这恰好证明模型没过拟合它真在看“局部特征”motorcycle支持度最低44但精度95.5%说明小目标检测能力达标可强调“在测试集未出现的本田CBR600上也达到91%准确率”需提前测。5. 避坑指南那些让毕设延期3天的“看似简单”问题5.1 现象predict.py运行时报错RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same原因模型在GPU上训练但预测时没指定设备。predict.py中model.load_state_dict()后没加model.cuda()。解决在predict.py第42行model VehicleClassifier.load_from_checkpoint(...)后插入model model.cuda() if torch.cuda.is_available() else model.cpu()5.2 现象训练时loss从1000骤降到0.1然后卡住不动原因data/train/下混入了非图像文件如.DS_Store、Thumbs.dbImageFolder加载时报错但被忽略实际batch_size0。解决进入data/train/执行find . -name *.DS_Store -deleteMac或del /s /q *.dbWin在utils/dataset.py的__init__函数开头加校验for cls in os.listdir(root): cls_path os.path.join(root, cls) if not os.path.isdir(cls_path): continue img_count len([f for f in os.listdir(cls_path) if f.lower().endswith((.jpg,.jpeg,.png))]) assert img_count 0, fClass {cls} has no valid images!5.3 现象tensorboard --logdirlogs/打不开浏览器显示404原因Lightning默认日志路径是lightning_logs/但configs/default.yaml里写了log_dir: logs/路径不一致。解决方案A推荐删掉configs/default.yaml中的log_dir项用默认路径方案B启动TensorBoard时指定路径tensorboard --logdirlightning_logs/。5.4 现象导出ONNX模型后用OpenCVcv2.dnn.readNetFromONNX()报错Unsupported layer type: _Convolution原因PyTorch 1.13.1导出的ONNX opset14但OpenCV 4.7只支持到opset11。解决修改predict.py中导出代码torch.onnx.export( model, dummy_input, vehicle.onnx, opset_version11, # 强制降级 input_names[input], output_names[output] )5.5 现象答辩现场演示时程序闪退终端只显示Segmentation fault (core dumped)原因Ubuntu系统默认ulimit -s栈大小为8192KB而Lightning的DataLoader多进程在读取大图时爆栈。解决演示前执行ulimit -s 65536 # 将栈大小提升至64MB python predict.py --image_path examples/test_car.jpg6. 进阶技巧让毕设从“能跑”升级为“值得发表”的3个实操动作6.1 给模型加“可信度开关”用Monte Carlo Dropout量化预测不确定性毕设常被问“模型把救护车错认成卡车你怎么知道它不确定”——这时展示MC Dropout就是王炸。在models/resnet18_custom.py的forward函数末尾添加def forward(self, x): x self.backbone(x) x self.avgpool(x) x torch.flatten(x, 1) x self.fc(x) # 启用dropout即使eval模式做10次前向传播 if self.training or hasattr(self, mc_dropout): x F.dropout(x, p0.5, trainingTrue) # 强制开启dropout return x然后写uncertainty_eval.pyimport torch from models.resnet18_custom import VehicleClassifier model VehicleClassifier.load_from_checkpoint(models/best_model.ckpt) model.mc_dropout True # 开启MC Dropout model.eval() # 对同一张图预测10次 preds [] for _ in range(10): with torch.no_grad(): out model(image_tensor) # image_tensor shape: [1,3,224,224] preds.append(torch.nn.functional.softmax(out, dim1)) preds torch.stack(preds) # shape: [10,4] mean_pred preds.mean(dim0) # 平均概率 std_pred preds.std(dim0) # 每个类别的标准差 print(fMean: {mean_pred.tolist()}) # e.g. [0.12, 0.05, 0.81, 0.02] print(fStd: {std_pred.tolist()}) # e.g. [0.03, 0.01, 0.04, 0.005]答辩话术“当模型对‘bus’的预测概率均值是0.81标准差仅0.04说明10次预测高度一致而如果‘truck’均值0.12但标准差0.03说明模型在卡车特征上犹豫——这时系统可主动弹窗提示‘请人工复核’而不是盲目输出。”6.2 用Grad-CAM可视化“模型到底在看哪里”别再用文字描述“模型关注车头”直接生成热力图。在utils/gradcam.py中实现from pytorch_grad_cam import GradCAM from pytorch_grad_cam.utils.image import show_cam_on_image # 加载模型和图像 model VehicleClassifier.load_from_checkpoint(models/best_model.ckpt) model.eval() target_layer model.backbone.layer4[-1] # ResNet18最后一层 cam GradCAM(modelmodel, target_layers[target_layer]) grayscale_cam cam(input_tensorimage_tensor, targetsNone)[0] # 叠加热力图 rgb_img image_tensor.squeeze().permute(1,2,0).cpu().numpy() visualization show_cam_on_image(rgb_img, grayscale_cam, use_rgbTrue) plt.imsave(gradcam_bus.jpg, visualization)效果生成gradcam_bus.jpg红色区域即模型判定为“bus”的依据——通常是车窗阵列和车身涂装。这比任何文字解释都更有说服力。6.3 生成可执行文件让答辩老师双击就能看效果用PyInstaller打包避开常见坑# Step 1先用conda创建纯净环境防依赖污染 conda create -n vehicle_env python3.8 conda activate vehicle_env pip install -r requirements.txt # Step 2安装PyInstaller并打包关键参数 pip install pyinstaller5.13.0 # 必须用5.13.0新版不兼容Lightning的ckpt加载 pyinstaller --onefile \ --add-data models;models \ --add-data examples;examples \ --hidden-importpytorch_lightning \ --hidden-importtorchvision.ops \ predict.py生成的dist/predict.exeWin或dist/predictLinux可直接运行./predict --image_path examples/test_truck.jpg答辩优势老师不用装Python、不用配环境双击exe→拖图进去→秒出结果体验感拉满。我带过的12届毕设生里凡是在答辩时演示了Grad-CAM热力图MC Dropout不确定性可执行文件三件套的90%拿了优秀。不是因为技术多深而是把“模型黑匣子”变成了可触摸、可解释、可交付的实体。毕设不是秀代码行数而是证明你有能力把一个模糊需求拆解成可验证、可演示、可答辩的工程闭环。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。