当前位置: 首页 > news >正文

基于yolov8的果蔬识别检测系统python源码+onnx模型+数据集+精美GUI界面

【算法介绍】

在农业现代化进程加快、对果蔬种植与销售管理智能化需求愈发迫切的背景下,传统果蔬识别与检测方式已难以满足高效精准处理海量果蔬信息的要求。基于YOLOv8的果蔬识别检测系统应运而生,为农业果蔬领域带来了高效、精准的解决方案。
该系统具备强大的多品类果蔬识别能力,可精准识别almond(杏仁)、apple(苹果)、asparagus(芦笋)、avocado(牛油果)、bakingpowder(发酵粉)、bakingsoda(小苏打)、banana(香蕉)、beef(牛肉)、beet(甜菜)、bellpepper(甜椒)、bread(面包)、broccoli(西兰花)、butter(黄油)、cabbage(卷心菜)、carrot(胡萝卜)、cauliflower(花椰菜)、celery(芹菜)、cheese(奶酪)、chicken(鸡肉)、chickenbreast(鸡胸肉)、cilantro(香菜)、cinnamon(肉桂)、corn(玉米)、cream(奶油)、cucumber(黄瓜)、egg(鸡蛋)、eggplant(茄子)、flour(面粉)、garlic(大蒜)、ginger(生姜)、grapes(葡萄)、grated_cheese(碎奶酪)、greenonion(葱)、jam(果酱)、ketchup(番茄酱)、lemon(柠檬)、lettuce(生菜)、lime(酸橙)、mango(芒果)、mayonaise(蛋黄酱)、milk(牛奶)、mustard(芥末)、nuts(坚果)、oil(油)、onion(洋葱)、orange(橙子)、paprika(辣椒粉)、parsley(欧芹)、pasta(意大利面)、peanutbutter(花生酱)、pear(梨)、peas(豌豆)、pineapple(菠萝)、plum(李子)、potato(土豆)、rice(大米)、rosemary(迷迭香)、salmon(三文鱼)、sausage(香肠)、shrimp(虾)、soysauce(酱油)、spaghetti(意大利细面条)、spinach(菠菜)、strawberries(草莓)、sugar(糖)、sweetpotato(红薯)、tomato(番茄)、tomatosauce(番茄酱)、vanilla_extract(香草精)、watermelon(西瓜)、whole_chicken(整鸡)、yogurt(酸奶)等多种常见果蔬及相关食品。YOLOv8作为核心算法,凭借其先进的架构设计,在检测速度和精度上实现了显著提升。它采用优化的特征提取网络,能够快速捕捉果蔬图像中的关键特征,无论是果蔬的形状、颜色还是表面纹理信息,都能被准确识别和分析。
在实际应用中,系统展现出卓越的性能。对于外形相似或颜色相近的果蔬,如greenonion(葱)和cilantro(香菜),其精细分类检测能力可确保准确区分;面对复杂场景,如光线昏暗的仓库或果蔬摆放杂乱的集市,系统通过自适应光照补偿和抗干扰机制,有效减少误检和漏检。
此外,该系统支持实时处理,能够快速分析摄像头采集的图像或视频流,及时输出果蔬类别和位置信息。这不仅为果蔬库存统计、品质分级提供了有力支持,还能助力电商平台的果蔬筛选和销售管理。
基于YOLOv8的果蔬识别检测系统,以其高效、精准、实时的特点,成为农业果蔬领域不可或缺的技术工具,为提升果蔬种植与销售效率、优化农业管理发挥着重要作用。

【效果展示】

【测试环境】

windows10
anaconda3+python3.8
torch==2.3.1
ultralytics==8.3.120

【模型可以检测出4类别】

almond
apple
asparagus
avocado
bakingpowder
bakingsoda
banana
beef
beet
bellpepper
bread
broccoli
butter
cabbage
carrot
cauliflower
celery
cheese
chicken
chickenbreast
cilantro
cinnamon
corn
cream
cucumber
egg
eggplant
flour
garlic
ginger
grapes
grated_cheese
greenonion
jam
ketchup
lemon
lettuce
lime
mango
mayonaise
milk
mustard
nuts
oil
onion
orange
paprika
parsley
pasta
peanutbutter
pear
peas
pineapple
plum
potato
rice
rosemary
salmon
sausage
shrimp
soysauce
spaghetti
spinach
strawberries
sugar
sweetpotato
tomato
tomatosauce
vanilla_extract
watermelon
whole_chicken
yogurt

【训练数据集介绍】

 数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)

图片数量(jpg文件个数):16099

标注数量(xml文件个数):16099

标注数量(txt文件个数):16099

标注类别数:72

所在仓库:firc-dataset

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["almond","apple","asparagus","avocado","bakingpowder","bakingsoda","banana","beef","beet","bellpepper","bread","broccoli","butter","cabbage","carrot","cauliflower","celery","cheese","chicken","chickenbreast","cilantro","cinnamon","corn","cream","cucumber","egg","eggplant","flour","garlic","ginger","grapes","grated_cheese","greenonion","jam","ketchup","lemon","lettuce","lime","mango","mayonaise","milk","mustard","nuts","oil","onion","orange","paprika","parsley","pasta","peanutbutter","pear","peas","pineapple","plum","potato","rice","rosemary","salmon","sausage","shrimp","soysauce","spaghetti","spinach","strawberries","sugar","sweetpotato","tomato","tomatosauce","vanilla_extract","watermelon","whole_chicken","yogurt"]

每个类别标注的框数:

almond (杏仁) 框数 = 423

apple (苹果) 框数 = 1736

asparagus (芦笋) 框数 = 574

avocado (牛油果) 框数 = 241

bakingpowder (泡打粉) 框数 = 398

bakingsoda (小苏打) 框数 = 299

banana (香蕉) 框数 = 1142

beef (牛肉) 框数 = 457

beet (甜菜) 框数 = 493

bellpepper (甜椒) 框数 = 1012

bread (面包) 框数 = 256

broccoli (西兰花) 框数 = 352

butter (黄油) 框数 = 397

cabbage (卷心菜) 框数 = 475

carrot (胡萝卜) 框数 = 1097

cauliflower (花椰菜) 框数 = 450

celery (芹菜) 框数 = 280

cheese (奶酪) 框数 = 527

chicken (鸡肉) 框数 = 820

chickenbreast (鸡胸肉) 框数 = 648

cilantro (香菜) 框数 = 151

cinnamon (肉桂) 框数 = 139

corn (玉米) 框数 = 506

cream (奶油) 框数 = 103

cucumber (黄瓜) 框数 = 1380

egg (鸡蛋) 框数 = 1427

eggplant (茄子) 框数 = 1137

flour (面粉) 框数 = 380

garlic (大蒜) 框数 = 1807

ginger (姜) 框数 = 407

grapes (葡萄) 框数 = 101

grated_cheese (芝士碎) 框数 = 185

greenonion (大葱) 框数 = 637

jam (果酱) 框数 = 495

ketchup (番茄酱) 框数 = 701

lemon (柠檬) 框数 = 963

lettuce (生菜) 框数 = 464

lime (青柠) 框数 = 571

mango (芒果) 框数 = 149

mayonaise (蛋黄酱) 框数 = 316

milk (牛奶) 框数 = 736

mustard (芥末酱) 框数 = 223

nuts (坚果) 框数 = 136

oil (食用油) 框数 = 355

onion (洋葱) 框数 = 888

orange (橙子) 框数 = 1238

paprika (红辣椒粉) 框数 = 331

parsley (欧芹) 框数 = 396

pasta (意大利面) 框数 = 201

peanutbutter (花生酱) 框数 = 173

pear (梨) 框数 = 1430

peas (豌豆) 框数 = 400

pineapple (菠萝) 框数 = 356

plum (李子) 框数 = 1396

potato (土豆) 框数 = 1239

rice (大米) 框数 = 637

rosemary (迷迭香) 框数 = 316

salmon (三文鱼) 框数 = 726

sausage (香肠) 框数 = 138

shrimp (虾) 框数 = 565

soysauce (酱油) 框数 = 207

spaghetti (意大利面条) 框数 = 1652

spinach (菠菜) 框数 = 290

strawberries (草莓) 框数 = 948

sugar (糖) 框数 = 260

sweetpotato (红薯) 框数 = 307

tomato (番茄) 框数 = 2591

tomatosauce (番茄酱) 框数 = 498

vanilla_extract (香草精) 框数 = 287

watermelon (西瓜) 框数 = 733

whole_chicken (整鸡) 框数 = 406

yogurt (酸奶) 框数 = 937

总框数:45092

图片分辨率:640x640

数据集是否有增强:有增强,少于一半

使用标注工具:labelImg

标注规则:对类别进行画矩形框

重要说明:暂无

特别声明:本数据集不对训练的模型或者权重文件精度作任何保证

图片预览:

标注例子:

【训练信息】

参数
训练集图片数29631
验证集图片数2908
训练map83.6%
训练精度(Precision)84.8%
训练召回率(Recall)78.8%

【验证集精度】

类别

Map50(%)

all

84

almond

73

apple

94

asparagus

96

avocado

88

bakingpowder

98

bakingsoda

98

banana

82

beef

59

beet

76

bellpepper

80

bread

85

broccoli

81

butter

93

cabbage

91

carrot

78

cauliflower

84

celery

71

cheese

71

chicken

72

chickenbreast

60

cilantro

100

cinnamon

95

corn

69

cream

96

cucumber

79

egg

91

eggplant

85

flour

99

garlic

78

ginger

46

grapes

64

grated_cheese

90

greenonion

71

jam

89

ketchup

96

lemon

87

lettuce

88

lime

68

mango

71

mayonaise

90

milk

91

mustard

97

nuts

68

oil

92

onion

77

orange

95

paprika

100

parsley

96

pasta

73

peanutbutter

100

pear

58

peas

67

pineapple

72

plum

99

potato

95

rice

94

rosemary

99

salmon

87

sausage

73

shrimp

63

soysauce

95

spaghetti

94

spinach

71

strawberries

79

sugar

100

sweetpotato

88

tomato

84

tomatosauce

89

vanilla_extract

99

watermelon

56

whole_chicken

96

yogurt

91

【界面设计】

class Ui_MainWindow(QtWidgets.QMainWindow):signal = QtCore.pyqtSignal(str, str)def setupUi(self):self.setObjectName("MainWindow")self.resize(1280, 728)self.centralwidget = QtWidgets.QWidget(self)self.centralwidget.setObjectName("centralwidget")self.weights_dir = './weights'self.picture = QtWidgets.QLabel(self.centralwidget)self.picture.setGeometry(QtCore.QRect(260, 10, 1010, 630))self.picture.setStyleSheet("background:black")self.picture.setObjectName("picture")self.picture.setScaledContents(True)self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(10, 10, 81, 21))self.label_2.setObjectName("label_2")self.cb_weights = QtWidgets.QComboBox(self.centralwidget)self.cb_weights.setGeometry(QtCore.QRect(10, 40, 241, 21))self.cb_weights.setObjectName("cb_weights")self.cb_weights.currentIndexChanged.connect(self.cb_weights_changed)self.label_3 = QtWidgets.QLabel(self.centralwidget)self.label_3.setGeometry(QtCore.QRect(10, 70, 72, 21))self.label_3.setObjectName("label_3")self.hs_conf = QtWidgets.QSlider(self.centralwidget)self.hs_conf.setGeometry(QtCore.QRect(10, 100, 181, 22))self.hs_conf.setProperty("value", 25)self.hs_conf.setOrientation(QtCore.Qt.Horizontal)self.hs_conf.setObjectName("hs_conf")self.hs_conf.valueChanged.connect(self.conf_change)self.dsb_conf = QtWidgets.QDoubleSpinBox(self.centralwidget)self.dsb_conf.setGeometry(QtCore.QRect(200, 100, 51, 22))self.dsb_conf.setMaximum(1.0)self.dsb_conf.setSingleStep(0.01)self.dsb_conf.setProperty("value", 0.25)self.dsb_conf.setObjectName("dsb_conf")self.dsb_conf.valueChanged.connect(self.dsb_conf_change)self.dsb_iou = QtWidgets.QDoubleSpinBox(self.centralwidget)self.dsb_iou.setGeometry(QtCore.QRect(200, 160, 51, 22))self.dsb_iou.setMaximum(1.0)self.dsb_iou.setSingleStep(0.01)self.dsb_iou.setProperty("value", 0.45)self.dsb_iou.setObjectName("dsb_iou")self.dsb_iou.valueChanged.connect(self.dsb_iou_change)self.hs_iou = QtWidgets.QSlider(self.centralwidget)self.hs_iou.setGeometry(QtCore.QRect(10, 160, 181, 22))self.hs_iou.setProperty("value", 45)self.hs_iou.setOrientation(QtCore.Qt.Horizontal)self.hs_iou.setObjectName("hs_iou")self.hs_iou.valueChanged.connect(self.iou_change)self.label_4 = QtWidgets.QLabel(self.centralwidget)self.label_4.setGeometry(QtCore.QRect(10, 130, 72, 21))self.label_4.setObjectName("label_4")self.label_5 = QtWidgets.QLabel(self.centralwidget)self.label_5.setGeometry(QtCore.QRect(10, 210, 72, 21))self.label_5.setObjectName("label_5")self.le_res = QtWidgets.QTextEdit(self.centralwidget)self.le_res.setGeometry(QtCore.QRect(10, 240, 241, 400))self.le_res.setObjectName("le_res")self.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(self)self.menubar.setGeometry(QtCore.QRect(0, 0, 1110, 30))self.menubar.setObjectName("menubar")self.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(self)self.statusbar.setObjectName("statusbar")self.setStatusBar(self.statusbar)self.toolBar = QtWidgets.QToolBar(self)self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)self.toolBar.setObjectName("toolBar")self.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)self.actionopenpic = QtWidgets.QAction(self)icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap(":/images/1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.actionopenpic.setIcon(icon)self.actionopenpic.setObjectName("actionopenpic")self.actionopenpic.triggered.connect(self.open_image)self.action = QtWidgets.QAction(self)icon1 = QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/images/2.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.action.setIcon(icon1)self.action.setObjectName("action")self.action.triggered.connect(self.open_video)self.action_2 = QtWidgets.QAction(self)icon2 = QtGui.QIcon()icon2.addPixmap(QtGui.QPixmap(":/images/3.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.action_2.setIcon(icon2)self.action_2.setObjectName("action_2")self.action_2.triggered.connect(self.open_camera)self.actionexit = QtWidgets.QAction(self)icon3 = QtGui.QIcon()icon3.addPixmap(QtGui.QPixmap(":/images/4.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)self.actionexit.setIcon(icon3)self.actionexit.setObjectName("actionexit")self.actionexit.triggered.connect(self.exit)self.toolBar.addAction(self.actionopenpic)self.toolBar.addAction(self.action)self.toolBar.addAction(self.action_2)self.toolBar.addAction(self.actionexit)self.retranslateUi()QtCore.QMetaObject.connectSlotsByName(self)self.init_all()

【使用步骤】

使用步骤:
(1)首先根据官方框架安装好yolov8环境,并安装好pyqt5
(2)切换到自己安装的yolov8环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可

【提供文件】

python源码
yolov8n.onnx模型(不提供pytorch模型)
训练的map,P,R曲线图(在weights\results.png)
测试图片(在test_img文件夹下面)

注意源码提供训练的数据集

【常用评估参数介绍】

在目标检测任务中,评估模型的性能是至关重要的。你提到的几个术语是评估模型性能的常用指标。下面是对这些术语的详细解释:

  1. Class
    • 这通常指的是模型被设计用来检测的目标类别。例如,一个模型可能被训练来检测车辆、行人或动物等不同类别的对象。
  2. Images
    • 表示验证集中的图片数量。验证集是用来评估模型性能的数据集,与训练集分开,以确保评估结果的公正性。
  3. Instances
    • 在所有图片中目标对象的总数。这包括了所有类别对象的总和,例如,如果验证集包含100张图片,每张图片平均有5个目标对象,则Instances为500。
  4. P(精确度Precision)
    • 精确度是模型预测为正样本的实例中,真正为正样本的比例。计算公式为:Precision = TP / (TP + FP),其中TP表示真正例(True Positives),FP表示假正例(False Positives)。
  5. R(召回率Recall)
    • 召回率是所有真正的正样本中被模型正确预测为正样本的比例。计算公式为:Recall = TP / (TP + FN),其中FN表示假负例(False Negatives)。
  6. mAP50
    • 表示在IoU(交并比)阈值为0.5时的平均精度(mean Average Precision)。IoU是衡量预测框和真实框重叠程度的指标。mAP是一个综合指标,考虑了精确度和召回率,用于评估模型在不同召回率水平上的性能。在IoU=0.5时,如果预测框与真实框的重叠程度达到或超过50%,则认为该预测是正确的。
  7. mAP50-95
    • 表示在IoU从0.5到0.95(间隔0.05)的范围内,模型的平均精度。这是一个更严格的评估标准,要求预测框与真实框的重叠程度更高。在目标检测任务中,更高的IoU阈值意味着模型需要更准确地定位目标对象。mAP50-95的计算考虑了从宽松到严格的多个IoU阈值,因此能够更全面地评估模型的性能。

这些指标共同构成了评估目标检测模型性能的重要框架。通过比较不同模型在这些指标上的表现,可以判断哪个模型在实际应用中可能更有效。

 【常见问题】

目标检测训练中,Mean Average Precision(MAP)偏低可能有以下原因:
原因一:欠拟合:如果训练数据量过小,模型可能无法学习到足够的特征,从而影响预测效果,导致欠拟合,进而使MAP偏低。因此可以加大数据集数量
原因二:小目标:如果数据集包含大部分小目标则一般会有可能产生map偏低情况,因为小目标特征不明显,模型很难学到特征。
原因三:模型调参不对:比如学习率调整过大可能会导致学习能力过快,模型参数调节出现紊乱
原因四:过拟合(现在模型基本不存在这种情况):如果模型在训练数据上表现非常好,但在验证或测试数据上表现较差,可能是出现了过拟合。这通常是因为模型参数过多,而训练数据量相对较小,导致模型学习到了训练数据中的噪声或特定模式,而无法泛化到新的数据。如今现在目标检测模型都对这个情况做的很好,很少有这种情况发生。
原因五:场景不一样:验证集验证精度高,测试集不行,则有可能是与训练模型场景图片不一致导致测试map过低
针对以上原因,可以采取以下措施来提高MAP:

(1)优化模型结构:根据任务和数据集的特点选择合适的模型,并尝试使用不同的网络架构和构件来改进模型性能。
(2)增强数据预处理:对数据进行适当的预处理和增强,如数据归一化、缺失值填充、数据扩增等,以提高模型的泛化能力。
(3)调整损失函数:尝试使用不同的损失函数或组合多种损失函数来优化模型性能。
(4)优化训练策略:调整学习率、批次大小、训练轮数等超参数,以及使用学习率衰减、动量等优化算法来改善模型训练效果。
(5)使用预训练模型:利用在大规模数据集上预训练的模型进行迁移学习,可以加速模型收敛并提高性能。
(6)增加数据集数量,尽可能提供多场景图片,提高模型泛化能力,增强模型特征学习能力。
综上所述,提高目标检测训练的MAP需要从多个方面入手,包括优化模型结构、增强数据预处理、调整损失函数、优化训练策略以及使用预训练模型等。

http://www.dtcms.com/a/566073.html

相关文章:

  • 网站建设合同电子版苏州网页制作报价
  • 廊坊网站建设方案策划民治做网站
  • 走路摆臂幅度大给人影响差-----坏习惯
  • TRO重磅消息 野生动物插画师Roger Hall跨境维权风暴来袭
  • ABB焊接机器人节气装置
  • Linux 孤儿进程和僵尸进程详解
  • jsp做网站用什么封装字符串餐饮加盟什么网站建设
  • 做网站挂谷歌广告赚钱吗电子商务网站模板html
  • 基于 OpenVINO 实现 SpeechT5 语音合成模型本地部署加速
  • 北京市建设工程审核在哪个网站打车软件app开发
  • 怎么做站旅游网站上泡到妞主流网站宽度
  • 【底层机制】解析Espresso测试框架的核心原理
  • 网站如何做中英文效果wordpress主题开发培训
  • PostIn零基础学习 - 快速对接口进行调试
  • 网站建设沛宣北京vi设计公司哪
  • 高明网站建设报价品牌网站建设创意新颖
  • HTML DOM outerHTML 属性
  • SpringBoot 登录验证码
  • Spring Al Alibaba
  • 陕西民盛建设有限公司网站pageadmin的最新版本
  • 如何自己做个网站网站xml
  • 易语言怎么制作网站临淄辛店今天招聘信息
  • 相亲网站源码php模版营销网站的概念
  • css文档流
  • C#进阶11:C#局部路径规划算法_DWA
  • 基于Vue人脸识别的智慧课堂学习行为分析系统f36fy939(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Kotlin线程池newFixedThreadPoolContext与约束协程运行的线程数量limitedParallelism
  • 网站年报公示怎么做站外seo是什么
  • 制作网站app黑龙江省城乡和建设厅网站
  • 网站备案密码格式厦门比较有名的设计公司