深度学习目标检测_如何使用Yolov8训练自动贩卖机商品零售数据集,并用训练出来的权重识别商品
文字及代码仅供参考。
智能零售柜商品识别数据集 113分类,可做物联网等比赛使用。 图片共5589张,赠送3个常用小脚本。数据集按7:2:1分配。其中 训练集3912张图片,测试集1118张图片,验证集559张图片。
识别的商品假如是这一
YOLOv8训练智能零售柜商品识别数据集,并基于训练出的权重进行商品识别,我们将经历几个关键步骤:数据准备、配置文件设置、模型训练、评估以及推理系统构建。同学呢)代码示例。
1. 数据集准备
假设你的数据集已经按照7:2:1的比例分为训练集、测试集和验证集,并且标注格式为VOC或已转换为YOLO格式。
创建data.yaml
文件
创建一个data.yaml
文件来描述你的数据集结构:
# data.yaml
train: ./datasets/train/images # 训练图像路径
val: ./datasets/val/images # 验证图像路径
test: ./datasets/test/images # 测试图像路径(可选)
nc: 113 # 类别数量
names: ['class_1', 'class_2', ..., 'class_113'] # 类别名称列表
请根据实际情况调整上述路径和类别名称。
2. 模型训练
下面是一个完整的Python脚本,用于加载数据、配置模型并进行训练。
from ultralytics import YOLO
import os
# 设置数据集和模型路径
data_yaml_path = './data.yaml' # 修改为你的data.yaml路径
model_save_dir = './runs/detect' # 模型保存目录
model_name = 'yolov8n.pt' # 预训练模型名称,可选'n', 's', 'm', 'l', 'x'
# 加载预训练模型
model = YOLO(model_name)
# 开始训练
results = model.train(
data=data_yaml_path,
epochs=100, # 根据需要调整epoch数
imgsz=640, # 输入图像尺寸
batch=16, # 批量大小,根据GPU内存调整
name='smart_retail_detection', # 实验名称,结果将保存在runs/detect/smart_retail_detection下
save=True, # 是否保存最佳模型
exist_ok=True # 如果实验目录存在,是否覆盖
)
# 打印训练结果
print("Training completed. Results saved to:", os.path.join(model_save_dir, 'smart_retail_detection'))
3. 模型评估
训练完成后,可以对模型进行评估,以查看其在验证集上的表现:
# 加载最佳模型
best_model_path = './runs/detect/smart_retail_detection/weights/best.pt'
model = YOLO(best_model_path)
# 在验证集上评估模型
metrics = model.val()
# 输出评估指标
print("Model evaluation metrics:", metrics)
4. 使用训练出的权重进行商品识别
基于训练好的模型,我们可以对新图像进行预测,并构建一个简单的识别系统。
商品识别代码
# 进行预测
image_path = 'path/to/test/image.jpg' # 替换为你要测试的图像路径
results = model.predict(image_path, conf=0.5) # 置信度阈值设为0.5
# 处理预测结果
for result in results:
for box in result.boxes:
cls, conf, bbox = box.cls.item(), box.conf.item(), box.xyxy.tolist()
label = model.model.names[int(cls)]
print(f"Detected {label} with confidence {conf:.2f} at {bbox}")
# 可视化结果(可选)
from PIL import Image, ImageDraw
img = Image.open(image_path)
draw = ImageDraw.Draw(img)
draw.rectangle(bbox, outline="red", width=3)
img.show() # 显示图像
5. 构建简单的用户界面(可选)
如果你希望构建一个简单的用户界面来选择和显示图像,可以使用如PyQt5这样的库。
安装必要的库
确保安装了必要的Python库:
pip install PyQt5
创建一个简单的GUI
以下是一个简单的PyQt5应用程序示例,允许用户通过点击按钮加载图像,并自动检测并展示商品。
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qt
import sys
import cv2
import numpy as np
from ultralytics import YOLO
class RetailDetectionApp(QMainWindow):
def __init__(self, model):
super().__init__()
self.setWindowTitle("Smart Retail Detection")
self.setGeometry(100, 100, 640, 480)
self.image_label = QLabel(self)
self.button = QPushButton('Load Image', self)
self.button.clicked.connect(self.load_image)
layout = QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.image_label)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.model = model
def load_image(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
"Images (*.png *.xpm *.jpg);;All Files (*)", options=options)
if file_name:
detected_image = self.detect_defects(file_name)
self.display_image(detected_image)
def detect_defects(self, image_path):
img = cv2.imread(image_path)
results = self.model.predict(img, conf=0.5)
for result in results:
for box in result.boxes:
x1, y1, x2, y2, conf, cls = box.xyxy.numpy(), box.conf.numpy(), box.cls.numpy()
label = self.model.names[int(cls)]
if conf >= 0.5:
cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(img, f'{label} {conf:.2f}', (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
return img
def display_image(self, img):
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_img.shape
bytes_per_line = ch * w
convert_to_Qt_format = QImage(rgb_img.data, w, h, bytes_per_line, QImage.Format_RGB888)
p = convert_to_Qt_format.scaled(640, 480, Qt.KeepAspectRatio)
self.image_label.setPixmap(QPixmap.fromImage(p))
if __name__ == "__main__":
app = QApplication(sys.argv)
best_model_path = './runs/detect/smart_retail_detection/weights/best.pt'
model = YOLO(best_model_path)
window = RetailDetectionApp(model)
window.show()
sys.exit(app.exec_())
根据具体需求,你可能需要进一步调整和优化这个过程,例如调优超参数或改进数据增强策略等。