如何构建一个基于YOLOv8的中餐菜品检测系统 食品检测菜品中餐检测数据集 3000张 智慧食堂 带标注 voc yolo
如何构建一个基于YOLOv8的中餐菜品检测系统食品检测菜品中餐检测数据集 3000张 智慧食堂 带标注 voc yolo分类名: (图片张数 标注个数)fried_ dumplings: (302 320)water_ spinach: (738 747)rice:(12081296)triangle_ hash.brown: (563, 623)chickennuggets: (356 372)carrot_ eggs: (400 400)chinese sausage:(479599)chinese_ cabbage:(553582) .fried_ eggs: (743, 755)curry: (401 407)fried_ chicken:(877883)mung_ bean. sprouts: (848 874)The Original Orange Chicken: (144 144)White Steamed Rice: (374 377)Super Greens: (53. 53)String Bean Chicken Breast: (189 189)Chow Mein:(59 59)Kung Pao Chicken:(329332)Honey Walnut Shr imp: (129 129)Beijing Beef: (282 282)Fried Rice: (184. 184)fried chicken: (9 25)french fries: (4 4)cheese burger:(4. 4)mango chi cken pocket:(4 4)mozza burger: (4. 4)black pepper rice bowl: (1. 1)perkedel: (4, 8)chicken waffle: (4 4)crispy corn: (4 4)AW cola: (4, 4)burger: (2. 2)总数: (3181 9671)总类(nc): 32类声明文章所有代码仅供参考构建一个基于YOLOv8的中餐菜品检测系统。以下是详细的步骤和代码示例并附带数据集中的菜品及数量表格。数据集中的菜品及数量表格分类名图片张数标注个数fried_dumplings302320water_spinach738747rice12081296triangle_hash_brown563623chicken_nuggets356372carrot_eggs400400chinese_sausage479599chinese_cabbage553582fried_eggs743755curry401407fried_chicken877883mung_bean_sprouts848874The_Original_Orange_Chicken144144White_Steamed_Rice374377Super_Greens5353String_Bean_Chicken_Breast189189Chow_Mein5959Kung_Pao_Chicken329332Honey_Walnut_Shrimp129129Beijing_Beef282282Fried_Rice184184fried_chicken925french_fries44cheese_burger44mango_chicken_pocket44mozza_burger44black_pepper_rice_bowl11perkadel48chicken_waffle44crispy_corn44AW_cola44burger22环境部署说明首先确保你已经安装了必要的库。以下是详细的环境部署步骤安装依赖# 创建虚拟环境可选python-mvenv yolov8_envsourceyolov8_env/bin/activate# 在Windows上使用 yolov8_env\Scripts\activate# 安装PyTorchpipinstalltorch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117# 安装YOLOv8pipinstallultralytics# 安装其他依赖pipinstallpyqt5 matplotlib scikit-learn pandas opencv-python数据集准备假设你的数据集已经准备好并且是以VOC和YOLO格式存储的。我们将主要使用YOLO格式进行训练。数据集结构dataset/ ├── images/ │ ├── train/ │ │ ├── img1.jpg │ │ ├── img2.jpg │ │ └── ... │ └── val/ │ ├── img3.jpg │ ├── img4.jpg │ └── ... ├── labels/ │ ├── train/ │ ├── img1.txt │ ├── img2.txt │ └── ... │ └── val/ │ ├── img3.txt │ ├── img4.txt │ └── ... └── classes.txtclasses.txt内容如下fried_dumplings water_spinach rice triangle_hash_brown chicken_nuggets carrot_eggs chinese_sausage chinese_cabbage fried_eggs curry fried_chicken mung_bean_sprouts The_Original_Orange_Chicken White_Steamed_Rice Super_Greens String_Bean_Chicken_Breast Chow_Mein Kung_Pao_Chicken Honey_Walnut_Shrimp Beijing_Beef Fried_Rice fried_chicken french_fries cheese_burger mango_chicken_pocket mozza_burger black_pepper_rice_bowl perkadel chicken_waffle crispy_corn AW_cola burger每个图像对应的标签文件是一个文本文件每行表示一个边界框格式为class_id x_center y_center width height模型训练权重和指标可视化展示我们将使用YOLOv8进行训练并在训练过程中记录各种指标如F1曲线、准确率、召回率、损失曲线和混淆矩阵。训练脚本train_yolov8.py[titleTraining YOLOv8 on Chinese Dish Detection Dataset]fromultralyticsimportYOLOimportos# Define pathsdataset_pathpath/to/datasetweights_pathbest.pt# Create dataset.yamlyaml_contentf train:{os.path.join(dataset_path,images/train)}val:{os.path.join(dataset_path,images/val)}nc: 32 names: [fried_dumplings, water_spinach, rice, triangle_hash_brown, chicken_nuggets, carrot_eggs, chinese_sausage, chinese_cabbage, fried_eggs, curry, fried_chicken, mung_bean_sprouts, The_Original_Orange_Chicken, White_Steamed_Rice, Super_Greens, String_Bean_Chicken_Breast, Chow_Mein, Kung_Pao_Chicken, Honey_Walnut_Shrimp, Beijing_Beef, Fried_Rice, fried_chicken, french_fries, cheese_burger, mango_chicken_pocket, mozza_burger, black_pepper_rice_bowl, perkadel, chicken_waffle, crispy_corn, AW_cola, burger] withopen(os.path.join(dataset_path,dataset.yaml),w)asf:f.write(yaml_content)# Train YOLOv8modelYOLO(yolov8n.pt)# Load a pretrained model (recommended for training)resultsmodel.train(dataos.path.join(dataset_path,dataset.yaml),epochs100,imgsz640,saveTrue)# Save the best weightsmodel.export(formatpt)os.rename(runs/detect/train/weights/best.pt,weights_path)请将path/to/dataset替换为实际的数据集路径。指标可视化展示我们将编写代码来可视化训练过程中的各项指标包括F1曲线、准确率、召回率、损失曲线和混淆矩阵。可视化脚本visualize_metrics.py[titleVisualizing Training Metrics for YOLOv8]importosimportjsonimportmatplotlib.pyplotaspltimportseabornassnsimportnumpyasnpfromsklearn.metricsimportconfusion_matrix,ConfusionMatrixDisplay# Load metricsmetrics_pathruns/detect/train/metrics.jsonwithopen(metrics_path,r)asf:metricsjson.load(f)# Extract metricsloss[entry[loss]forentryinmetricsiflossinentry]precision[entry[metrics/precision(m)]forentryinmetricsifmetrics/precision(m)inentry]recall[entry[metrics/recall(m)]forentryinmetricsifmetrics/recall(m)inentry]f1[entry[metrics/mAP50(m)]forentryinmetricsifmetrics/mAP50(m)inentry]# Plot loss curveplt.figure(figsize(15,5))plt.subplot(1,3,1)plt.plot(loss,labelLoss)plt.xlabel(Epochs)plt.ylabel(Loss)plt.title(Training Loss Curve)plt.legend()# Plot precision and recall curvesplt.subplot(1,3,2)plt.plot(precision,labelPrecision)plt.plot(recall,labelRecall)plt.xlabel(Epochs)plt.ylabel(Score)plt.title(Precision and Recall Curves)plt.legend()# Plot F1 curveplt.subplot(1,3,3)plt.plot(f1,labelF1 Score)plt.xlabel(Epochs)plt.ylabel(F1 Score)plt.title(F1 Score Curve)plt.legend()plt.tight_layout()plt.show()# Confusion matrix# Assuming you have predictions and true labels# For demonstration, lets create some dummy datatrue_labelsnp.random.randint(0,33,size100)# 0 to 32 (background or one of the dish types)predictionsnp.random.randint(0,33,size100)# 0 to 32 (background or one of the dish types)cmconfusion_matrix(true_labels,predictions,labelslist(range(33)))labels[Background,fried_dumplings,water_spinach,rice,triangle_hash_brown,chicken_nuggets,carrot_eggs,chinese_sausage,chinese_cabbage,fried_eggs,curry,fried_chicken,mung_bean_sprouts,The_Original_Orange_Chicken,White_Steamed_Rice,Super_Greens,String_Bean_Chicken_Breast,Chow_Mein,Kung_Pao_Chicken,Honey_Walnut_Shrimp,Beijing_Beef,Fried_Rice,fried_chicken,french_fries,cheese_burger,mango_chicken_pocket,mozza_burger,black_pepper_rice_bowl,perkadel,chicken_waffle,crispy_corn,AW_cola,burger]dispConfusionMatrixDisplay(confusion_matrixcm,display_labelslabels)disp.plot(cmapplt.cm.Blues)plt.title(Confusion Matrix)plt.show()PyQt5设计的界面我们将使用PyQt5设计一个简单的GUI界面来进行模型预测。GUI代码gui_app.py[titlePyQt5 GUI for YOLOv8 Chinese Dish Detection]importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QWidget,QFileDialog,QMessageBoxfromPyQt5.QtGuiimportQImage,QPixmapfromultralyticsimportYOLOclassMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(Chinese Dish Detection)self.setGeometry(100,100,800,600)self.image_labelQLabel(self)self.image_label.setAlignment(Qt.AlignCenter)self.predict_buttonQPushButton(Predict,self)self.predict_button.clicked.connect(self.predict)self.open_buttonQPushButton(Open Image,self)self.open_button.clicked.connect(self.open_image)layoutQVBoxLayout()layout.addWidget(self.image_label)layout.addWidget(self.open_button)layout.addWidget(self.predict_button)containerQWidget()container.setLayout(layout)self.setCentralWidget(container)self.modelYOLO(best.pt)defopen_image(self):optionsQFileDialog.Options()file_name,_QFileDialog.getOpenFileName(self,QFileDialog.getOpenFileName(),,Images (*.png *.xpm *.jpg);;All Files (*),optionsoptions)iffile_name:self.image_pathfile_name pixmapQPixmap(file_name)self.image_label.setPixmap(pixmap.scaled(800,600))defpredict(self):ifnothasattr(self,image_path):QMessageBox.warning(self,Warning,Please open an image first.)returnimg0cv2.imread(self.image_path)# BGRassertimg0isnotNone,fImage Not Found{self.image_path}resultsself.model(img0,streamTrue)forresultinresults:boxesresult.boxes.cpu().numpy()forboxinboxes:rbox.xyxy[0].astype(int)clsint(box.cls[0])confbox.conf[0]labelf{self.model.names[cls]}{conf:.2f}color(0,255,0)# Greencv2.rectangle(img0,r[:2],r[2:],color,2)cv2.putText(img0,label,(r[0],r[1]-10),cv2.FONT_HERSHEY_SIMPLEX,0.9,color,2)rgb_imagecv2.cvtColor(img0,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w qt_imageQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pixmapQPixmap.fromImage(qt_image)self.image_label.setPixmap(pixmap.scaled(800,600))if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())算法原理介绍YOLOv8算法原理YOLOv8You Only Look Once version 8是一种实时目标检测算法其核心思想是在单个神经网络中同时预测边界框的位置和类别概率。YOLOv8相较于之前的版本在速度和准确性方面都有显著提升。主要特点统一架构YOLOv8采用统一的架构简化了模型的设计。高效的特征提取通过使用先进的卷积层和注意力机制提高特征提取的效率。改进的损失函数引入新的损失函数来优化边界框回归和分类任务。多尺度训练通过多尺度训练增强模型的泛化能力。自动数据增强集成自动数据增强技术减少对人工标注数据的依赖。工作流程输入图像将输入图像传递给YOLOv8模型。特征提取通过一系列卷积层提取图像特征。预测模型输出每个网格单元的边界框位置、置信度分数和类别概率。非极大值抑制NMS去除冗余的预测结果保留最佳的边界框。输出结果返回最终的目标检测结果。总结构建一个完整的基于YOLOv8的中餐菜品检测系统包括数据集准备、环境部署、模型训练、指标可视化展示和PyQt5界面设计。以下是所有相关的代码文件训练脚本(train_yolov8.py)指标可视化脚本(visualize_metrics.py)GUI应用代码(gui_app.py)