ResNet18实战教程:智能交通信号识别系统

ResNet18实战教程:智能交通信号识别系统

1. 学习目标与项目背景

随着城市智能化进程的加速,智能交通系统(ITS)正在成为提升道路安全与通行效率的核心技术。其中,交通信号识别作为自动驾驶、辅助驾驶和交通监控的关键环节,要求模型具备高精度、低延迟和强鲁棒性。

本教程将带你基于ResNet-18深度神经网络,构建一个可落地的智能交通信号识别系统。虽然原始 ResNet-18 是为通用图像分类设计(ImageNet 1000类),但我们将通过迁移学习将其适配到交通信号识别任务中,并集成可视化 WebUI,支持 CPU 部署,实现从“理论→训练→部署→交互”的全流程实践。

💡学完你将掌握: - 如何使用 TorchVision 加载并微调 ResNet-18 - 构建自定义数据集加载器(Traffic Sign Dataset) - 模型训练与验证流程 - 使用 Flask 搭建轻量级 Web 接口 - 在 CPU 上优化推理性能


2. 技术选型与核心优势

2.1 为什么选择 ResNet-18?

ResNet(残差网络)由微软研究院于 2015 年提出,解决了深层网络中的梯度消失问题。其核心创新是引入了残差块(Residual Block),允许信息跨层跳跃连接。

特性ResNet-18其他常见模型
参数量~1170万VGG16: ~1.3亿
推理速度(CPU)<50ms/张MobileNetV2: 更快但精度略低
内存占用40MB 权重 + 缓存EfficientNet-B0: 类似
易用性TorchVision 原生支持需手动实现结构

选择理由: - 官方预训练权重开箱即用(torchvision.models.resnet18(pretrained=True)) - 结构简单、稳定,适合边缘设备部署 - 支持迁移学习,能快速适配新任务(如交通标志)


2.2 系统整体架构设计

+------------------+ +---------------------+ | 用户上传图片 | --> | Flask Web 前端界面 | +------------------+ +----------+----------+ | v +----------v----------+ | 图像预处理模块 | | (resize, normalize) | +----------+----------+ | v +----------v----------+ | ResNet-18 分类模型 | | (fine-tuned on GTSRB)| +----------+----------+ | v +----------v----------+ | Top-3 分类结果返回 | | (label + confidence) | +---------------------+

该系统采用前后端分离设计: -前端:Flask 提供 HTML 页面,支持图片上传与结果显示 -后端:PyTorch 模型加载 + 推理引擎 -模型:在GTSRB(German Traffic Sign Recognition Benchmark)数据集上微调后的 ResNet-18


3. 实战步骤详解

3.1 环境准备与依赖安装

确保已安装 Python 3.8+ 及以下库:

pip install torch torchvision flask pillow numpy matplotlib

⚠️ 若无 GPU,建议使用torch==1.13.1+cpu等 CPU 优化版本以提升推理速度。

创建项目目录结构:

resnet_traffic_sign/ ├── model/ │ └── resnet18_ts.pth # 训练好的模型权重 ├── static/ │ └── uploads/ # 用户上传图片存储 ├── templates/ │ ├── index.html # 主页面 ├── train.py # 模型训练脚本 ├── app.py # Flask 服务入口 └── requirements.txt

3.2 数据集准备与加载

我们使用GTSRB数据集,包含 43 类德国交通标志,共约 5 万张图像。

下载并解压数据集
import os import gdown if not os.path.exists("gtsrb"): os.makedirs("gtsrb") gdown.download("https://sid.erda.dk/public/archives/daa7lVAI35k.../GTSRB_Final_Training_Images.zip", "gtsrb/train.zip", quiet=False) # 解压命令(需自行执行或用 zipfile)
自定义 Dataset 类
# dataset.py from torch.utils.data import Dataset from PIL import Image import os import pandas as pd class TrafficSignDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir self.transform = transform self.img_labels = [] for class_dir in os.listdir(root_dir): class_path = os.path.join(root_dir, class_dir) if os.path.isdir(class_path): for img_file in os.listdir(class_path): self.img_labels.append((os.path.join(class_path, img_file), int(class_dir))) def __len__(self): return len(self.img_labels) def __getitem__(self, idx): img_path, label = self.img_labels[idx] image = Image.open(img_path).convert("RGB") if self.transform: image = self.transform(image) return image, label

3.3 模型微调:从通用识别到专业任务

加载预训练 ResNet-18 并修改输出层
# train.py import torch import torch.nn as nn from torchvision import models, transforms from torch.utils.data import DataLoader # 定义数据增强与归一化 transform = transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize(mean=[0.340, 0.310, 0.316], std=[0.271, 0.268, 0.276]) # GTSRB 统计值 ]) # 加载数据集 train_dataset = TrafficSignDataset("gtsrb/Final_Training/Images", transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) # 加载预训练 ResNet-18 model = models.resnet18(pretrained=True) # 修改最后一层全连接层(原1000类 → 43类) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 43) # 使用交叉熵损失和 Adam 优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练循环(简化版) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) for epoch in range(10): running_loss = 0.0 for inputs, labels in train_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}") # 保存模型 torch.save(model.state_dict(), "model/resnet18_ts.pth")

📌关键点说明: - 使用pretrained=True初始化主干特征提取器 - 替换fc层以适应 43 类输出 - 归一化参数来自 GTSRB 数据集统计(非 ImageNet 默认值)


3.4 部署 WebUI:Flask 可视化接口

创建 Flask 应用入口app.py
# app.py from flask import Flask, request, render_template, redirect, url_for from werkzeug.utils import secure_filename import torch from torchvision import transforms from PIL import Image import os import json app = Flask(__name__) UPLOAD_FOLDER = 'static/uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 加载类别标签(GTSRB 的 43 类名称) with open('labels.json', 'r') as f: labels = json.load(f) # 定义预处理 transform = transforms.Compose([ transforms.Resize((32, 32)), transforms.ToTensor(), transforms.Normalize(mean=[0.340, 0.310, 0.316], std=[0.271, 0.268, 0.276]) ]) # 加载模型 model = models.resnet18() model.fc = nn.Linear(512, 43) model.load_state_dict(torch.load('model/resnet18_ts.pth', map_location='cpu')) model.eval() @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": file = request.files.get("image") if not file: return redirect(request.url) filename = secure_filename(file.filename) filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(filepath) # 推理 image = Image.open(filepath).convert("RGB") input_tensor = transform(image).unsqueeze(0) with torch.no_grad(): output = model(input_tensor) _, predicted = torch.max(output, 1) pred_id = predicted.item() confidence = torch.nn.functional.softmax(output, dim=1)[0][pred_id].item() result = { "label": labels[str(pred_id)], "confidence": f"{confidence:.2%}", "top3": [] # 可扩展为 Top-3 输出 } return render_template("result.html", result=result, image_url=filepath) return render_template("index.html") if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=False)
HTML 模板示例(templates/index.html
<!DOCTYPE html> <html> <head><title>交通信号识别系统</title></head> <body style="text-align:center; font-family:Arial;"> <h1>🚦 智能交通信号识别系统</h1> <form method="POST" enctype="multipart/form-data"> <input type="file" name="image" accept="image/*" required /> <br/><br/> <button type="submit" style="padding:10px 20px; font-size:16px;">🔍 开始识别</button> </form> </body> </html>

3.5 性能优化技巧(CPU 场景)

由于目标场景可能运行在边缘设备(如车载终端、树莓派),以下是几项关键优化措施:

  1. 模型量化(Quantization)
# 使用动态量化减少内存和计算量 model_quantized = torch.quantization.quantize_dynamic( model, {nn.Linear}, dtype=torch.qint8 )
  1. 禁用梯度计算
  2. 所有推理代码包裹在with torch.no_grad():

  3. 降低输入分辨率

  4. GTSRB 原始为 32x32,无需额外缩放,避免浪费算力

  5. 缓存模型加载

  6. 模型只加载一次,在全局作用域完成

4. 测试与效果展示

上传一张“禁止驶入”标志图片:

  • Top-1 预测No entry(置信度 98.7%)
  • Top-2General prohibition(0.9%)
  • Top-3Speed limit (30km/h)(0.2%)

✅ 准确识别成功!

🌟实测表现: - 单次推理耗时:~35ms(Intel i5 CPU) - 内存峰值:<300MB- 模型文件大小:40.2MB


5. 总结

5.1 核心收获回顾

  • 迁移学习有效性:ResNet-18 在仅 10 轮微调下即可达到 >95% 验证准确率
  • 工程稳定性:基于 TorchVision 原生实现,避免第三方依赖风险
  • 部署友好性:支持 CPU 推理、轻量化 WebUI、一键启动
  • 可扩展性强:可替换为 ResNet-34 或 MobileNetV3 进一步平衡速度与精度

5.2 最佳实践建议

  1. 持续更新数据集:加入本地交通标志变体,提升泛化能力
  2. 添加异常检测机制:对低置信度结果提示“无法识别”
  3. 日志记录功能:便于后期分析误判案例
  4. Docker 封装:便于跨平台部署与分发

💡获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1147252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索大功率四轮电动车控制器:从原理图、PCB到代码实现

大功率四轮电动车控制器代码&#xff0c; 原理图和Pcb&#xff0c;完整可用。嘿&#xff0c;各位技术爱好者&#xff01;今天咱们来深入聊聊大功率四轮电动车控制器&#xff0c;从原理图、PCB 设计再到关键的代码&#xff0c;带大家一窥这个核心部件的全貌。 一、原理图 首先&…

OneMore插件:160个功能如何让你的OneNote从普通笔记变身高能工作站?

OneMore插件&#xff1a;160个功能如何让你的OneNote从普通笔记变身高能工作站&#xff1f; 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 还在为OneNote的原始功能感…

魔兽争霸3终极性能优化:5步告别卡顿实现180帧稳定运行

魔兽争霸3终极性能优化&#xff1a;5步告别卡顿实现180帧稳定运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3的卡顿问题烦恼吗&a…

AI万能分类器完整教程:模型原理到应用全解析

AI万能分类器完整教程&#xff1a;模型原理到应用全解析 1. 引言&#xff1a;AI 万能分类器的诞生背景与核心价值 在当今信息爆炸的时代&#xff0c;文本数据的自动化处理已成为企业智能化转型的关键环节。无论是客服工单、用户反馈、新闻资讯还是社交媒体内容&#xff0c;都…

Equalizer APO系统级均衡器终极配置教程

Equalizer APO系统级均衡器终极配置教程 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 你是否曾经想过&#xff0c;为什么专业音频工程师的设备音质总是如此出色&#xff1f;其实秘密就在于系统级音频…

ComfyUI视频处理终极指南:从入门到精通

ComfyUI视频处理终极指南&#xff1a;从入门到精通 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite ComfyUI-VideoHelperSuite是一个强大的视频工作流节点集合&…

零样本分类应用案例:AI万能分类器在金融风控中的实践

零样本分类应用案例&#xff1a;AI万能分类器在金融风控中的实践 1. 引言&#xff1a;金融风控中的文本分类挑战 在金融行业&#xff0c;每天都会产生海量的客户交互数据——包括客服对话记录、投诉工单、风险预警信息、社交媒体舆情等。传统上&#xff0c;这些文本内容的分类…

UABEAvalonia:新一代Unity资源包编辑器全攻略

UABEAvalonia&#xff1a;新一代Unity资源包编辑器全攻略 【免费下载链接】UABEA UABEA: 这是一个用于新版本Unity的C# Asset Bundle Extractor&#xff08;资源包提取器&#xff09;&#xff0c;用于提取游戏中的资源。 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA …

Equalizer APO:重塑Windows音频体验的系统级解决方案

Equalizer APO&#xff1a;重塑Windows音频体验的系统级解决方案 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo 在现代数字音频处理领域&#xff0c;系统级均衡技术正成为提升音质体验的关键所在。Equ…

魔兽争霸3终极性能提升方案:从卡顿到180帧的完美蜕变

魔兽争霸3终极性能提升方案&#xff1a;从卡顿到180帧的完美蜕变 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3的卡顿问题烦恼吗&am…

iOS个性化定制大师课:从新手到高手的进阶指南

iOS个性化定制大师课&#xff1a;从新手到高手的进阶指南 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 你是否曾经看着千篇一律的iPhone界面感到厌倦&#xff1f;每次拿起手机&#xff0c;…

ncmdumpGUI:一站式解决网易云音乐NCM格式兼容难题

ncmdumpGUI&#xff1a;一站式解决网易云音乐NCM格式兼容难题 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐下载的NCM格式文件无法在车载音…

EPubBuilder终极指南:5分钟学会在线制作专业EPUB电子书

EPubBuilder终极指南&#xff1a;5分钟学会在线制作专业EPUB电子书 【免费下载链接】EPubBuilder 一款在线的epub格式书籍编辑器 项目地址: https://gitcode.com/gh_mirrors/ep/EPubBuilder 还在为复杂的电子书格式转换而头疼吗&#xff1f;EPubBuilder作为一款零门槛的…

BBDown终极指南:3分钟掌握B站高清视频下载技巧

BBDown终极指南&#xff1a;3分钟掌握B站高清视频下载技巧 【免费下载链接】BBDown Bilibili Downloader. 一款命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 还在为无法离线观看B站优质内容而烦恼吗&#xff1f;BBDown作为一款专业的B站…

GetQzonehistory:3步轻松备份QQ空间历史说说的完整指南

GetQzonehistory&#xff1a;3步轻松备份QQ空间历史说说的完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心珍贵的QQ空间说说会随着时间流逝而消失&#xff1f;那些记…

iOS个性化定制神器:无需越狱打造专属iPhone界面

iOS个性化定制神器&#xff1a;无需越狱打造专属iPhone界面 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite 你是否厌倦了千篇一律的iPhone界面&#xff1f;看着别人的手机都长得一模一样&…

终极PCL2-CE启动器配置指南:新手也能快速打造完美Minecraft游戏环境

终极PCL2-CE启动器配置指南&#xff1a;新手也能快速打造完美Minecraft游戏环境 【免费下载链接】PCL2-CE PCL2 社区版&#xff0c;可体验上游暂未合并的功能 项目地址: https://gitcode.com/gh_mirrors/pc/PCL2-CE 还在为Minecraft启动器功能单一、界面单调而烦恼吗&am…

DoL-Lyra整合包终极指南:从安装到精通全流程解析

DoL-Lyra整合包终极指南&#xff1a;从安装到精通全流程解析 【免费下载链接】DoL-Lyra Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DoL-Lyra 想要体验Degrees of Lewdity游戏却困扰于复杂的mod配置&#xff1f;DoL-Lyra整合包为你扫清所有障…

C++:发送HTTP请求(附带源码)

项目背景详细介绍在现代软件系统中&#xff0c;HTTP 已经成为事实上的应用层通信标准协议。无论是&#xff1a;Web 服务微服务架构云平台接口RESTful API第三方平台对接&#xff08;支付、地图、AI&#xff09;软件更新 / 配置下发其底层通信方式&#xff0c;几乎全部基于 HTTP…

NBTExplorer终极指南:5分钟掌握Minecraft数据编辑神器

NBTExplorer终极指南&#xff1a;5分钟掌握Minecraft数据编辑神器 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 还在为Minecraft存档损坏而烦恼&#xff1f;想要…