news 2026/3/22 9:45:32

ResNet18实战教程:零售货架识别系统开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ResNet18实战教程:零售货架识别系统开发

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/cpu

2.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(pretrained=True) # 自动下载权重 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]), ])

优势说明pretrained=True会自动从 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_k=3): """对输入图像进行预测,返回 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, dim=1)[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_ok=True) 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_k=3) return render_template('index.html', uploaded_image=file.filename, results=results) return render_template('index.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)

4.2 前端页面设计(HTML + CSS)

<!-- templates/index.html --> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>ResNet-18 货架识别系统</title> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" /> </head> <body> <div class="container"> <h1>👁️ AI 万物识别 - ResNet-18 官方稳定版</h1> <p>上传一张图片,系统将自动识别其中的主要物体(Top-3)</p> <form method="post" enctype="multipart/form-data"> <input type="file" name="file" accept="image/*" required /> <button type="submit">🔍 开始识别</button> </form> {% if uploaded_image %} <div class="result-section"> <h2>📷 上传图片</h2> <img src="{{ url_for('static', filename='uploads/' + uploaded_image) }}" alt="Uploaded" /> <h2>📊 识别结果</h2> <ul> {% for r in results %} <li><strong>{{ 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[type="file"] { 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(pretrained=True) num_classes = 5 # 如:饮料、零食、生鲜、日用品、酒水 model.fc = torch.nn.Linear(512, num_classes) # 使用少量标注数据进行微调 criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-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 交互界面。关键成果包括:

  1. 高稳定性:使用 TorchVision 原生模型,杜绝“模型不存在”等问题
  2. 低资源消耗:40MB 模型 + CPU 推理,适合边缘部署
  3. 可视化交互:集成 Flask WebUI,支持上传与实时分析
  4. 可扩展性强:支持从通用识别向零售场景迁移

8.2 最佳实践建议

  • 优先使用预训练模型进行快速验证
  • 前端展示 Top-3 结果,增强用户体验透明度
  • 定期缓存常用类别,减少重复计算
  • 结合业务语义映射,提升通用模型实用性

💡获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 18:39:34

HBuilderX安装教程通俗解释:助你玩转uni-app开发

从零开始玩转 uni-app&#xff1a;HBuilderX 安装与开发实战指南 你是不是也遇到过这种情况&#xff1a;想快速做一个 App&#xff0c;还要同步上线微信小程序、H5 页面&#xff0c;结果发现每个平台都得写一套代码&#xff1f;原生 Android 要 Java/Kotlin&#xff0c;iOS 得用…

作者头像 李华
网站建设 2026/3/20 23:55:11

AUTOSAR配置文件(ARXML)版本不一致时如何管理?

AUTOSAR为复杂的车载系统提供了统一架构&#xff0c;而ARXML文件作为AUTOSAR的核心配置文件&#xff0c;承载着系统设计、组件定义和通信配置等关键信息&#xff0c;堪称整个开发流程的“蓝图”。但问题来了&#xff0c;当团队里不同人、不同工具&#xff0c;甚至不同供应商用着…

作者头像 李华
网站建设 2026/3/21 22:43:55

如何快速掌握DownKyi视频下载:面向新手的完整操作指南

如何快速掌握DownKyi视频下载&#xff1a;面向新手的完整操作指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#…

作者头像 李华
网站建设 2026/3/21 8:06:58

纪念币自动预约神器:告别手忙脚乱,轻松抢到心仪纪念币

纪念币自动预约神器&#xff1a;告别手忙脚乱&#xff0c;轻松抢到心仪纪念币 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 还在为每次纪念币发行时手忙脚乱而懊恼吗&#xff1f;看…

作者头像 李华
网站建设 2026/3/21 8:58:34

空洞骑士模组管理的革命:Scarab一键安装全攻略

空洞骑士模组管理的革命&#xff1a;Scarab一键安装全攻略 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的繁琐流程而头疼吗&#xff1f;Scarab模组管…

作者头像 李华
网站建设 2026/3/13 23:20:59

iOS微信红包助手:智能抢红包的终极解决方案

iOS微信红包助手&#xff1a;智能抢红包的终极解决方案 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 在快节奏的现代社交中&#xff0c;微信红包已成为日常互…

作者头像 李华