简介:本资源是一套面向计算机、人工智能及相关专业在校学生与初学者的实战型毕业设计项目,聚焦商场货架商品陈列识别这一典型计算机视觉应用场景,基于YOLOv8目标检测框架构建端到端解决方案。资源共8个文件,包含3个核心Python脚本(训练、推理与可视化界面)、3个模型权重文件(含预训练与最佳训练结果)、2个说明文档(README与系统说明),总大小15.91MB,结构精炼、模块职责明确,开箱即用。已有48人下载学习,适用于课程设计、大作业、毕设立项及AI入门实践。用户可直接运行获得完整评估体系输出,包括验证集预测结果、标签分布统计、混淆矩阵、F1分数与PR曲线等关键指标可视化图表,并配套详细部署教程与测试验证说明,确保从环境配置到结果呈现全流程可复现。
1. 项目概述与核心价值
最近在整理过往项目时,翻出了一个挺有意思的“存货”——一个基于YOLOv8的商场货架商品陈列识别系统。这玩意儿当初是为了解决一个很实际的痛点:大型商超或连锁便利店,如何高效、自动化地巡检成千上万个货架,检查商品是否缺货、陈列是否符合标准、价格标签是否正确。传统靠人工拿着表格去一个个对,效率低不说,还容易出错。这个项目就是把计算机视觉里的目标检测技术,打包成一个从数据到部署的完整解决方案。
简单来说,它就是一个“智能货架巡检员”。你给它一张货架的照片或者一段实时视频流,它就能自动框出照片里所有的商品,并告诉你每个框里是什么东西(比如“可口可乐330ml罐装”、“奥利奥原味夹心饼干”)。更进一步,结合一些业务逻辑,就能判断“这个货位是不是空了?”、“这个品牌的商品是不是摆在了竞品的旁边?”等等。对于计算机视觉的初学者、需要做毕设或课程设计的同学,以及想快速验证某个零售场景AI应用的小团队,这个项目提供了一个非常不错的起点。它把模型训练、界面开发、数据集处理、部署上线这些环节都串了起来,形成了一个闭环,你拿到手简单配置一下环境就能跑起来,看到效果,然后再根据自己的需求去修改和深化。
2. 系统整体设计与技术选型考量
2.1 为什么选择YOLOv8作为核心检测模型?
在目标检测领域,框架选择很多,从老牌的Faster R-CNN、SSD,到YOLO系列的各代版本。最终选定YOLOv8,是经过多方面权衡的。
首先,速度与精度的平衡是零售场景的核心诉求。货架识别往往需要在边缘设备(如巡检机器人、店内工控机)甚至移动端上运行,对实时性要求高。YOLOv8在保持YOLO系列一贯高速推理优势的同时,通过新的骨干网络和检测头设计,进一步提升了精度。对于商品检测这种目标尺寸相对固定(瓶装、盒装)、但类别可能非常多的任务,YOLOv8的精度完全够用,同时能保证流畅的视频流处理。
其次,易用性和生态成熟度是关键。YOLOv8由Ultralytics公司维护,提供了极其友好的Python API和命令行工具。从安装、数据准备、模型训练到模型导出(支持ONNX、TensorRT等格式),都有清晰的文档和示例。这对于课程设计或毕设项目来说,大大降低了入门门槛,学生可以把更多精力放在业务逻辑和系统集成上,而不是在模型调试上耗费大量时间。
再者,社区支持与预训练模型。YOLOv8有在COCO等大型通用数据集上预训练的模型权重,我们可以直接拿来在自己的商品数据集上进行微调(Fine-tuning),这比从头训练要快得多,效果也更有保障。项目里提供的完整数据集,正是为了这个微调步骤准备的。
2.2 系统架构与模块拆解
整个系统不是只有一个模型文件,而是一个包含前后端的完整应用。其核心架构可以划分为四个层次:
- 数据层:这是系统的基石。包含了项目提供的“完整数据集”。这个数据集通常已经做好了标注,格式是YOLO格式(每个图片对应一个
.txt文件,里面是归一化的目标框和类别ID)。数据集的质量(图片清晰度、标注准确性、类别覆盖度)直接决定了最终模型的上限。 - 模型层:这是系统的“大脑”。基于YOLOv8框架,使用提供的数据集进行训练,得到一个能够识别特定商品集合的
.pt模型文件。训练过程需要在有GPU的机器上进行,但训练好的模型可以在CPU或GPU上推理。 - 服务层:这是系统的“躯干”。通常是一个用Python(例如Flask或FastAPI框架)搭建的后端服务。它负责加载训练好的YOLOv8模型,接收前端传来的图片,调用模型进行推理,并将检测结果(包括边界框坐标、类别名称、置信度)以结构化的数据(如JSON)返回给前端。这一步是连接模型和界面的桥梁。
- 应用层:这是系统的“脸面”。即“可视化界面”。通常是一个Web页面(用HTML/CSS/JavaScript开发),可能基于Streamlit、Gradio等快速开发工具,也可能是一个独立的桌面应用(如PyQt)。用户通过这个界面上传图片或开启摄像头,界面将图片发送给后端服务,并接收返回的检测结果,最后将带有检测框和标签的图片渲染展示给用户。
此外,部署教程会详细指导如何将这套系统从开发环境搬到真正的运行环境,可能包括Python环境依赖打包、服务进程管理(用systemd或Supervisor)、以及如何配置Web服务器(如Nginx)进行反向代理等。
注意:一个常见的误区是认为有了模型就万事大吉。实际上,数据准备、服务封装和界面交互的工程量,往往不亚于甚至超过模型训练本身。这个项目的价值就在于它提供了一个全栈的范例。
3. 核心细节解析与实操要点
3.1 数据集的理解与预处理
项目附带的“完整数据集”是宝藏,也是第一个需要仔细检查的环节。一个标准的YOLO格式数据集目录结构通常如下:
dataset/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 训练集标签(与images/train一一对应) └── val/ # 验证集标签(与images/val一一对应)每个标签文件(如00010752.txt)内容示例:
0 0.5 0.5 0.2 0.3 1 0.7 0.3 0.15 0.25每一行代表一个检测目标,格式为:class_id center_x center_y width height。所有坐标都是相对于图片宽度和高度的归一化值(0-1之间)。
实操要点与常见坑点:
- 数据均衡检查:打开
dataset.yaml配置文件(通常项目会提供),查看每个类别的图片数量和实例数量。如果某个类别(比如“小众进口饮料”)的样本只有几十个,而“矿泉水”有几千个,模型就会严重偏向于多数类。你需要通过数据增强(如旋转、裁剪、色彩抖动)来人工增加少数类样本的“多样性”,或者在损失函数中引入类别权重。 - 标注质量抽查:随机打开一些图片和对应的标签文件,用可视化脚本(YOLOv8自带
yolo val命令可以生成预测图)检查标注框是否准确、完整。常见问题包括:框太大包含背景、框太小没包住整个商品、重叠商品标成了一个框、相似商品标错了类别(如“无糖可乐”标成了“经典可乐”)。 - 图片格式与损坏处理:就像热词里提到的
E:\yolov8\images\val\00010752.png: ignoring corrupt image/label这种错误,在开始训练前,一定要用脚本批量检查图片是否能正常打开。可以用Python的PIL或OpenCV库遍历所有图片进行读取测试,将损坏的图片和对应的标签文件移出数据集。
3.2 YOLOv8模型训练的关键参数调优
拿到干净的数据集后,就可以开始训练了。YOLOv8的训练命令很简单,但里面的参数决定了模型的性能。
一个基础的训练命令如下:
yolo task=detect mode=train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=640 batch=16这里有几个关键参数需要理解:
model=yolov8n.pt:这里指定了模型尺度。yolov8n是“nano”版,最小最快,精度也最低;还有s(small),m(medium),l(large),x(extra large)版本。对于商品检测,如果类别不多(<50),yolov8s通常是个不错的起点,平衡了速度和精度。如果你的商品非常细小密集,或者类别上百,可能需要考虑l或x版,但也要考虑部署设备的算力。epochs=100:训练轮数。不是越大越好,要观察验证集损失val/loss和指标mAP50-95的变化。通常当这些指标在连续10-20个epoch内不再显著提升时,就可以提前停止训练,防止过拟合。YOLOv8支持patience参数来实现早停。imgsz=640:输入图片的尺寸。YOLOv8会将所有图片缩放到这个尺寸进行训练。更大的尺寸(如1280)能保留更多细节,可能提升对小目标的检测能力,但会显著增加显存消耗和训练时间。对于货架商品,640或768通常足够。batch=16:批大小。这个值受你的GPU显存限制。在显存允许的情况下,较大的batch size能使训练更稳定。如果出现CUDA out of memory错误,就需要减小batch或imgsz。
训练过程监控:训练开始后,YOLOv8会在终端输出日志,并在runs/detect/train目录下生成一系列可视化结果,包括损失曲线、精度曲线、混淆矩阵、验证集上的预测样例图。务必定期查看这些图,它们是诊断模型问题的关键。例如,如果训练损失持续下降但验证损失上升,就是过拟合的典型信号,需要增加数据增强强度或减少模型复杂度。
3.3 可视化界面的实现方式选择
“可视化界面”是这个项目用户体验的关键。根据技术栈和需求,主要有几种实现路径:
基于Web的轻量级界面(推荐):使用Gradio或Streamlit。这两个都是Python库,可以用极少的代码构建交互式Web应用。例如,用Gradio,核心代码可能就十几行:
import gradio as gr from ultralytics import YOLO model = YOLO('best.pt') def predict(image): results = model(image) return results[0].plot() # 返回带标注框的图片 iface = gr.Interface(fn=predict, inputs=gr.Image(type="pil"), outputs="image") iface.launch()这种方式开发速度极快,非常适合演示、原型验证和课程设计。缺点是定制化程度相对较低,界面风格比较固定。
自定义Web前端:使用Flask/FastAPI(后端) + HTML/JS(前端)。这提供了最大的灵活性。后端用Flask提供图片上传和模型推理的API接口,前端用JavaScript(可以配合Vue/React框架)构建美观的页面,使用
fetch或axios调用后端API,并用canvas绘制检测结果。这种方式更贴近企业级应用,但开发工作量较大。桌面图形界面:使用PyQt5或Tkinter。适合需要离线、单机运行的场景。你可以拖拽控件设计窗口,实现本地图片选择、摄像头调用、结果展示等功能。PyQt5功能强大但学习曲线稍陡;Tkinter是Python标准库,简单但界面比较老旧。
选择建议:对于毕设或快速验证,强烈推荐Gradio。它几乎零前端基础要求,能快速做出一个效果不错、可分享链接的演示系统,把精力集中在模型和核心逻辑上。
4. 从零开始的完整部署实操流程
假设我们在一台全新的Ubuntu 20.04服务器(或本地电脑)上部署这个系统。这里我们选择“Flask后端 + 简单HTML前端”的方案,因为它兼具灵活性和学习价值。
4.1 环境准备与依赖安装
首先,确保系统有Python 3.8或以上版本。然后创建一个独立的虚拟环境,避免包冲突。
# 1. 更新系统包 sudo apt-get update # 2. 安装Python3和pip(如果未安装) sudo apt-get install python3 python3-pip -y # 3. 安装虚拟环境工具 pip3 install virtualenv # 4. 创建项目目录并进入 mkdir shelf_detection && cd shelf_detection # 5. 创建虚拟环境 virtualenv venv # 6. 激活虚拟环境 source venv/bin/activate接下来,安装核心依赖。创建一个requirements.txt文件,内容如下:
# 核心AI框架 torch>=1.7.0 # 根据CUDA版本选择,CPU版用 torch torchvision torchaudio torchvision>=0.8.0 ultralytics>=8.0.0 # 这是YOLOv8官方库 # Web后端 Flask>=2.0.0 Flask-CORS # 处理跨域请求,如果前后端分离需要 # 图像处理 opencv-python>=4.5.0 Pillow>=9.0.0 # 其他工具 numpy>=1.20.0然后安装:
pip install -r requirements.txt注意:
torch的安装需要特别注意。如果你的机器有NVIDIA GPU并已安装CUDA,可以去 PyTorch官网 获取对应的安装命令(如pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118)。如果没有GPU,就安装CPU版本。这将极大影响模型推理速度。
4.2 后端服务(Flask API)开发
在项目根目录创建app.py文件,作为后端主程序。
from flask import Flask, request, jsonify, send_from_directory from werkzeug.utils import secure_filename import os from ultralytics import YOLO import cv2 app = Flask(__name__) app.config['UPLOAD_FOLDER'] = './uploads' app.config['RESULT_FOLDER'] = './results' os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) os.makedirs(app.config['RESULT_FOLDER'], exist_ok=True) # 加载训练好的模型(确保 best.pt 模型文件在项目根目录或指定路径) model = YOLO('./model/best.pt') @app.route('/') def index(): # 返回前端页面 return send_from_directory('.', 'index.html') @app.route('/api/detect', methods=['POST']) def detect(): if 'file' not in request.files: return jsonify({'error': 'No file part'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': 'No selected file'}), 400 # 保存上传的图片 filename = secure_filename(file.filename) upload_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(upload_path) # 使用YOLOv8进行推理 results = model(upload_path) # 处理结果 detection_list = [] for result in results: boxes = result.boxes for box in boxes: # 获取坐标、置信度、类别ID x1, y1, x2, y2 = box.xyxy[0].tolist() conf = box.conf[0].item() cls_id = int(box.cls[0].item()) cls_name = result.names[cls_id] detection_list.append({ 'class': cls_name, 'confidence': round(conf, 3), 'bbox': [round(x1,1), round(y1,1), round(x2,1), round(y2,1)] }) # 保存带标注的结果图片(可选) result_img_path = os.path.join(app.config['RESULT_FOLDER'], f'result_{filename}') annotated_img = results[0].plot() # 获取带框的图片 cv2.imwrite(result_img_path, annotated_img) return jsonify({ 'filename': filename, 'detections': detection_list, 'result_image_url': f'/results/result_{filename}' }) @app.route('/results/<filename>') def get_result_image(filename): return send_from_directory(app.config['RESULT_FOLDER'], filename) if __name__ == '__main__': # debug=True仅用于开发,生产环境需关闭 app.run(host='0.0.0.0', port=5000, debug=True)这个后端做了几件事:1) 提供了一个简单的根路由返回前端页面;2) 提供了一个/api/detect接口接收图片文件;3) 调用加载好的YOLOv8模型进行预测;4) 将检测结果(类别、置信度、坐标)以JSON格式返回,并保存一张带标注框的结果图供前端显示。
4.3 前端界面(HTML+JavaScript)开发
在项目根目录创建index.html文件。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>商场货架商品识别系统</title> <style> body { font-family: sans-serif; max-width: 1200px; margin: 20px auto; padding: 20px; } .container { display: flex; gap: 30px; } .upload-area, .result-area { flex: 1; border: 2px dashed #ccc; padding: 20px; border-radius: 10px; min-height: 400px; } .upload-area { text-align: center; } #preview, #resultImg { max-width: 100%; max-height: 350px; display: block; margin: 10px auto; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .btn { background-color: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; } .btn:hover { background-color: #45a049; } .btn:disabled { background-color: #cccccc; cursor: not-allowed; } </style> </head> <body> <h1>基于YOLOv8的商场货架商品识别系统</h1> <p>上传一张货架图片,系统将自动识别其中的商品。</p> <div class="container"> <div class="upload-area"> <h3>上传图片</h3> <input type="file" id="fileInput" accept="image/*"> <br><br> <img id="preview" src="" alt="图片预览"> <br> <button class="btn" onclick="uploadImage()" id="detectBtn">开始检测</button> <p id="status"></p> </div> <div class="result-area"> <h3>检测结果</h3> <img id="resultImg" src="" alt="检测结果"> <div id="detectionTable"></div> </div> </div> <script> const fileInput = document.getElementById('fileInput'); const preview = document.getElementById('preview'); const resultImg = document.getElementById('resultImg'); const detectBtn = document.getElementById('detectBtn'); const statusText = document.getElementById('status'); const detectionTable = document.getElementById('detectionTable'); // 图片预览 fileInput.addEventListener('change', function(e) { const file = e.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(e) { preview.src = e.target.result; preview.style.display = 'block'; resultImg.src = ''; detectionTable.innerHTML = ''; } reader.readAsDataURL(file); } }); // 上传并检测 async function uploadImage() { const file = fileInput.files[0]; if (!file) { alert('请先选择一张图片!'); return; } detectBtn.disabled = true; statusText.textContent = '检测中,请稍候...'; statusText.style.color = 'blue'; const formData = new FormData(); formData.append('file', file); try { const response = await fetch('/api/detect', { method: 'POST', body: formData }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); statusText.textContent = `检测完成!共发现 ${data.detections.length} 个商品。`; statusText.style.color = 'green'; // 显示结果图片 resultImg.src = data.result_image_url; resultImg.style.display = 'block'; // 生成结果表格 if (data.detections.length > 0) { let tableHtml = `<table> <tr><th>序号</th><th>商品类别</th><th>置信度</th><th>边界框坐标</th></tr>`; data.detections.forEach((item, index) => { tableHtml += `<tr> <td>${index + 1}</td> <td>${item.class}</td> <td>${(item.confidence * 100).toFixed(1)}%</td> <td>[${item.bbox.join(', ')}]</td> </tr>`; }); tableHtml += `</table>`; detectionTable.innerHTML = tableHtml; } else { detectionTable.innerHTML = '<p>未检测到任何商品。</p>'; } } catch (error) { console.error('Error:', error); statusText.textContent = '检测失败:' + error.message; statusText.style.color = 'red'; } finally { detectBtn.disabled = false; } } </script> </body> </html>这个前端页面提供了一个简洁的上传区域和结果展示区域。用户选择图片后可以预览,点击按钮调用后端的API,然后将返回的JSON数据解析,用表格展示检测到的商品列表,并显示带标注框的结果图片。
4.4 生产环境部署与优化
在开发环境(python app.py)运行没问题后,我们需要考虑更稳定的生产环境部署。
使用WSGI服务器:Flask自带的开发服务器性能弱,不稳定。我们使用Gunicorn(一个Python WSGI HTTP服务器)。
pip install gunicorn # 在项目根目录启动,指定4个工作进程 gunicorn -w 4 -b 0.0.0.0:5000 app:app使用Nginx作为反向代理:Gunicorn擅长处理动态请求,但不擅长处理静态文件(如图片、CSS、JS)。Nginx可以高效地处理静态文件,并将动态请求转发给Gunicorn,还能提供负载均衡、SSL加密等功能。 安装Nginx后,配置一个站点文件(如
/etc/nginx/sites-available/shelf_detection):server { listen 80; server_name your_domain_or_ip; # 你的域名或IP location / { proxy_pass http://127.0.0.1:5000; # 转发给Gunicorn proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 让Nginx直接处理静态文件,减轻Flask负担 location /static { alias /path/to/your/shelf_detection/static; # 如果你的静态文件放在static文件夹 } location /uploads { alias /path/to/your/shelf_detection/uploads; } location /results { alias /path/to/your/shelf_detection/results; } }然后启用配置并重启Nginx。
使用进程管理:为了让Gunicorn在后台稳定运行,并在崩溃后自动重启,可以使用Supervisor。 创建一个Supervisor配置文件(如
/etc/supervisor/conf.d/shelf_detection.conf):[program:shelf_detection] command=/path/to/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app directory=/path/to/shelf_detection user=your_username autostart=true autorestart=true stderr_logfile=/var/log/shelf_detection.err.log stdout_logfile=/var/log/shelf_detection.out.log然后更新Supervisor并启动程序:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start shelf_detection
至此,一个相对完整的、可在生产环境运行的货架商品识别系统就部署完成了。用户可以通过服务器的IP地址或域名直接访问Web界面使用。
5. 常见问题与排查技巧实录
在实际部署和运行过程中,你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方法。
5.1 模型推理相关的问题
问题1:CUDA out of memory (GPU显存不足)
- 现象:在推理或训练时,程序崩溃,报错显示显存耗尽。
- 排查与解决:
- 降低输入尺寸:在推理时,可以通过
model.predict(source=image, imgsz=480)来指定更小的推理尺寸,而不是默认的640。 - 减少Batch Size:在训练时,这是首要调整项。将
batch=16改为batch=8或batch=4。 - 使用更小的模型:将
yolov8l.pt换成yolov8s.pt或yolov8n.pt。 - 清理显存:在Python代码中,可以使用
torch.cuda.empty_cache()手动清理缓存。确保没有其他程序占用GPU。 - 使用CPU模式:如果实在无法解决,在加载模型时指定设备:
model = YOLO('best.pt').to('cpu'),但速度会慢很多。
- 降低输入尺寸:在推理时,可以通过
问题2:检测结果置信度普遍很低,或者漏检严重
- 现象:上传图片后,要么检测框很少,要么检测出来的框置信度都在0.3以下。
- 排查与解决:
- 检查训练数据:确认你的训练数据中,是否包含了与当前测试图片光照、角度、背景差异过大的情况?模型可能没有学习到这种场景。需要补充更多样化的训练数据。
- 调整置信度阈值:YOLOv8推理时有一个
conf参数,默认是0.25。你可以调低它来召回更多目标,但也会增加误检。在推理时设置:results = model(source=image, conf=0.15)。 - 验证模型性能:在训练集和验证集上跑一下评估命令
yolo val model=best.pt data=dataset.yaml,查看mAP指标。如果验证集mAP本身就很低(比如小于0.5),说明模型没学好,需要回头检查数据标注质量、类别是否均衡、训练轮数是否足够。 - 域不匹配:你的训练数据全是白底精拍图,但测试的是杂乱货架图,这属于域差异。需要在训练数据中加入大量类似真实场景的图片。
5.2 前后端与服务部署问题
问题3:前端上传图片后,后端收到None或报错
- 现象:前端点击检测,浏览器F12控制台显示网络错误,或者后端日志显示没有收到文件。
- 排查与解决:
- 检查FormData:确保前端JavaScript代码正确构建了
FormData对象,并且键名'file'与后端request.files['file']中的'file'完全一致。 - 检查文件大小限制:Flask默认限制文件上传大小。可以在后端代码中增加配置:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB。 - 检查CORS(跨域):如果前端页面和后端API不在同一个域名/端口下,浏览器会因为同源策略阻止请求。需要在Flask后端安装
flask-cors并初始化:from flask_cors import CORS; CORS(app)。或者在Nginx配置中添加CORS头。
- 检查FormData:确保前端JavaScript代码正确构建了
问题4:Gunicorn或Nginx报错,服务无法访问
- 现象:浏览器访问IP地址显示“502 Bad Gateway”或“Connection refused”。
- 排查与解决:
- 检查端口占用:使用
sudo netstat -tlnp | grep :5000查看5000端口是否被Gunicorn正确监听。 - 检查Gunicorn进程:使用
sudo supervisorctl status shelf_detection查看进程状态。如果是FATAL或BACKOFF,去查看/var/log/shelf_detection.err.log错误日志,里面通常有详细的Python报错信息,比如某个模块没找到。 - 检查Nginx配置语法:使用
sudo nginx -t测试Nginx配置是否正确。 - 检查防火墙:确保服务器防火墙(如ufw)开放了80端口(HTTP)或443端口(HTTPS):
sudo ufw allow 80/tcp。
- 检查端口占用:使用
5.3 性能优化与扩展思路
当系统能跑起来后,你可能会考虑如何让它更快、更强。
模型导出与加速:YOLOv8的
.pt模型在Python中运行效率并非最优。可以将其导出为ONNX格式或TensorRT引擎,能获得显著的推理速度提升,尤其是在GPU上。# 导出ONNX yolo export model=best.pt format=onnx然后可以使用
onnxruntime库来加载和推理ONNX模型。TensorRT的导出和部署稍复杂,但加速比极高。实现批量处理和异步任务:如果一次需要处理成百上千张图片,同步的Web请求会超时。可以引入消息队列(如Celery + Redis)。前端上传任务后立即返回一个“任务ID”,后端将图片路径放入队列,由Celery工作进程在后台调用模型处理,处理完成后将结果存入数据库或文件,前端再通过任务ID轮询查询结果。
增加更多业务功能:基础的检测完成后,可以在此基础上增加:
- 货架排面分析:通过检测框的位置和大小,估算每个商品在货架上的陈列排面数(即横向陈列了几个)。
- 缺货识别:与标准的货架图(Planogram)对比,识别出哪个固定货位应该是A商品但现在空了或者被B商品占据了。
- 价格标签识别(OCR):在检测到商品后,截取商品下方的价格标签区域,使用OCR技术(如PaddleOCR)识别价格,与系统中的价格进行比对。
这个项目就像一个功能齐全的“毛坯房”,水电管线(数据、模型、服务、界面)都已铺好,能直接入住(运行)。但它的价值更在于为你提供了一个清晰的蓝图和坚固的地基,你可以根据自己的想法和需求,在这个基础上进行任意的装修和扩建,把它变成解决特定零售场景痛点的强大工具。无论是用于学习、毕业设计,还是作为商业项目的原型,它都是一个非常扎实的起点。
本文还有配套的精品资源,点击获取