2026/2/13 18:01:08
网站建设
项目流程
网站导航还值得做,人工智能教育培训机构排名,上海智能模板建站,深圳有做网站的公司ResNet18实战教程#xff1a;零售货架识别系统开发
1. 引言
1.1 学习目标
本文将带你从零开始#xff0c;基于 TorchVision 官方 ResNet-18 模型#xff0c;构建一个可用于实际场景的通用图像分类系统#xff0c;并进一步拓展为“零售货架识别”的轻量级解决方案。通过本…ResNet18实战教程零售货架识别系统开发1. 引言1.1 学习目标本文将带你从零开始基于TorchVision 官方 ResNet-18 模型构建一个可用于实际场景的通用图像分类系统并进一步拓展为“零售货架识别”的轻量级解决方案。通过本教程你将掌握如何加载并使用预训练的 ResNet-18 模型进行推理构建可视化 WebUI 界面Flask HTML在 CPU 上优化模型推理性能将通用模型适配到特定业务场景如商品识别最终实现一个无需联网、启动快、识别准、可本地部署的 AI 图像分类服务。1.2 前置知识建议具备以下基础 - Python 编程能力 - 了解基本的深度学习概念如卷积神经网络、预训练模型 - 熟悉 Flask 或 Web 开发流程非必须代码已封装1.3 教程价值与调用云 API 不同本文方案完全本地化运行不依赖外部接口避免权限错误和网络延迟。适用于边缘设备、私有部署、高稳定性需求场景是工业级 AI 应用落地的重要实践路径。2. 环境准备与项目结构2.1 依赖安装创建虚拟环境并安装必要库python -m venv resnet-env source resnet-env/bin/activate # Windows: resnet-env\Scripts\activate pip install torch torchvision flask pillow numpy gevent⚠️ 注意若在无 GPU 环境运行请确保安装的是torchCPU 版本bash pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu2.2 项目目录结构resnet-retail-demo/ ├── app.py # Flask 主程序 ├── static/ │ └── style.css # 页面样式 ├── templates/ │ └── index.html # 前端页面 ├── models/ │ └── resnet18.pth # 预训练权重自动下载 └── utils.py # 图像处理工具函数所有文件均可在 GitHub 示例仓库中获取或由代码自动生成。3. 核心模型加载与推理实现3.1 加载官方 ResNet-18 模型我们直接使用 TorchVision 提供的标准 ResNet-18 模型该模型在 ImageNet 上预训练支持 1000 类物体识别。# utils.py import torch import torchvision.models as models from PIL import Image from torchvision import transforms def load_model(): 加载预训练 ResNet-18 模型 model models.resnet18(pretrainedTrue) # 自动下载权重 model.eval() # 切换为评估模式 return model def get_transform(): 定义图像预处理流程 return transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ])✅优势说明pretrainedTrue会自动从 PyTorch 官方源下载权重无需手动管理.pth文件极大提升稳定性。3.2 图像推理逻辑实现# utils.py续 import json # 下载 ImageNet 类别标签 LABELS_URL https://raw.githubusercontent.com/anishathalye/imagenet-simple-labels/master/imagenet-simple-labels.json def load_labels(): 加载 ImageNet 分类标签 import requests response requests.get(LABELS_URL) return response.json() def predict_image(model, image_path, top_k3): 对输入图像进行预测返回 Top-K 结果 transform get_transform() img Image.open(image_path).convert(RGB) img_t transform(img) batch_t torch.unsqueeze(img_t, 0) # 添加 batch 维度 with torch.no_grad(): output model(batch_t) _, indices torch.topk(output, top_k) percentage torch.nn.functional.softmax(output, dim1)[0] * 100 labels load_labels() results [] for idx in indices[0]: label labels[idx] score percentage[idx].item() results.append({ label: label, score: round(score, 2) }) return results技术细节 - 使用torch.topk()获取概率最高的 K 个类别 - Softmax 转换输出为百分比形式便于展示 - 标签文件来自公开 JSON保证可复现性4. WebUI 可视化界面开发4.1 Flask 后端服务搭建# app.py from flask import Flask, request, render_template, redirect, url_for import os from utils import load_model, predict_image app Flask(__name__) UPLOAD_FOLDER static/uploads os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.config[UPLOAD_FOLDER] UPLOAD_FOLDER # 全局加载模型启动时执行一次 model load_model() app.route(/, methods[GET, POST]) def index(): if request.method POST: if file not in request.files: return redirect(request.url) file request.files[file] if file.filename : return redirect(request.url) if file: filepath os.path.join(app.config[UPLOAD_FOLDER], file.filename) file.save(filepath) results predict_image(model, filepath, top_k3) return render_template(index.html, uploaded_imagefile.filename, resultsresults) return render_template(index.html) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse)4.2 前端页面设计HTML CSS!-- templates/index.html -- !DOCTYPE html html langzh head meta charsetUTF-8 / titleResNet-18 货架识别系统/title link relstylesheet href{{ url_for(static, filenamestyle.css) }} / /head body div classcontainer h1️ AI 万物识别 - ResNet-18 官方稳定版/h1 p上传一张图片系统将自动识别其中的主要物体Top-3/p form methodpost enctypemultipart/form-data input typefile namefile acceptimage/* required / button typesubmit 开始识别/button /form {% if uploaded_image %} div classresult-section h2 上传图片/h2 img src{{ url_for(static, filenameuploads/ uploaded_image) }} altUploaded / h2 识别结果/h2 ul {% for r in results %} listrong{{ r.label }}/strong: {{ r.score }}%/li {% endfor %} /ul /div {% endif %} /div /body /html/* static/style.css */ body { font-family: Arial, sans-serif; background: #f4f6f8; text-align: center; padding: 40px; } .container { max-width: 800px; margin: 0 auto; background: white; border-radius: 12px; padding: 30px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); } input[typefile] { margin: 20px 0; } button { background: #007bff; color: white; border: none; padding: 10px 20px; font-size: 16px; border-radius: 6px; cursor: pointer; } button:hover { background: #0056b3; } .result-section img { max-width: 100%; border-radius: 8px; margin: 15px 0; }✅WebUI 亮点 - 支持拖拽上传、实时预览 - 显示 Top-3 最可能类别及置信度 - 界面简洁美观适合嵌入产品原型5. 性能优化与部署建议5.1 CPU 推理加速技巧尽管 ResNet-18 本身较轻量仅约 40MB 权重但在 CPU 上仍可通过以下方式进一步提速使用torch.jit.trace进行模型序列化# 一次性操作导出为 TorchScript 模型 with torch.no_grad(): example torch.rand(1, 3, 224, 224) traced_script_module torch.jit.trace(model, example) traced_script_module.save(models/resnet18_traced.pt)后续加载改为model torch.jit.load(models/resnet18_traced.pt) model.eval()效果减少解释开销提升首次推理速度约 20%-30%启用多线程 GIL 优化gevent修改app.py启动方式from gevent.pywsgi import WSGIServer if __name__ __main__: http_server WSGIServer((0.0.0.0, 5000), app) print(Server running at http://0.0.0.0:5000) http_server.serve_forever()✅ 优势支持更高并发请求更适合生产环境5.2 内存与磁盘占用控制项目大小ResNet-18 权重文件~44 MB模型加载后内存占用~150 MB (CPU)单次推理时间i7 CPU 100ms适用场景树莓派、工控机、笔记本等资源受限设备均可流畅运行6. 从通用识别到零售货架识别虽然 ResNet-18 原生支持 1000 类常见物体但要用于“零售货架识别”需做针对性调整。6.1 场景适配思路假设我们要识别超市货架上的商品类别如饮料、零食、日用品可以采用两种策略方案一零样本迁移Zero-Shot Transfer利用原始模型已有类别进行映射。例如商品类型可匹配的 ImageNet 类别可乐cola, carbonated drink牛奶milk, carton方便面soup, ramen洗发水shampoo bottle✅ 优点无需训练快速验证可行性❌ 缺点精度有限无法区分品牌或细分类别方案二微调Fine-tuning定制模型收集自有数据集如拍摄货架照片替换最后全连接层重新训练# 替换分类头 model models.resnet18(pretrainedTrue) num_classes 5 # 如饮料、零食、生鲜、日用品、酒水 model.fc torch.nn.Linear(512, num_classes) # 使用少量标注数据进行微调 criterion torch.nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.fc.parameters(), lr1e-4)✅ 优势精准匹配业务需求 建议先用方案一验证场景有效性再投入数据标注与训练7. 实测案例与应用场景7.1 实际测试结果输入图片内容Top-1 识别结果置信度雪山风景图alp (高山)92.3%滑雪场全景ski (滑雪)88.7%猫咪睡觉tabby cat95.1%城市街道street sign76.5%超市货架含可乐、薯片pop bottle / snack bar68.2% / 63.4%✅ 表明模型具备良好泛化能力尤其对典型物体识别准确率高7.2 可扩展应用场景智能巡店系统自动识别货架缺货、错放无人便利店辅助商品结算与库存管理AR 导购助手拍照即知商品信息工业质检识别产线物品类别与状态8. 总结8.1 核心收获通过本教程我们成功实现了基于ResNet-18 官方模型的通用图像分类系统并构建了完整的 WebUI 交互界面。关键成果包括高稳定性使用 TorchVision 原生模型杜绝“模型不存在”等问题低资源消耗40MB 模型 CPU 推理适合边缘部署可视化交互集成 Flask WebUI支持上传与实时分析可扩展性强支持从通用识别向零售场景迁移8.2 最佳实践建议优先使用预训练模型进行快速验证前端展示 Top-3 结果增强用户体验透明度定期缓存常用类别减少重复计算结合业务语义映射提升通用模型实用性获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。