基于yolov8的30种农作物检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

作品简介

 【算法介绍】

基于YOLOv8的30种农作物检测系统是一个集成了先进深度学习技术的智能农业解决方案。该系统利用YOLOv8算法的高效性和准确性,实现了对30种不同农作物的高精度实时检测。

该系统通过训练大量标注好的农作物图像数据集,使模型能够学习到各种农作物的特征,进而在实际应用中准确识别和分类农作物。无论是通过图片、视频还是摄像头输入,系统都能快速响应,给出农作物的种类、位置以及置信度等信息。

除了基本的检测功能外,该系统还具备用户友好的界面设计,使得农民和技术人员可以轻松上手,快速理解并利用检测结果。同时,系统支持结果的保存和导出,方便用户进行后续的数据分析和处理。

此外,基于YOLOv8的农作物检测系统还具备强大的泛化能力。通过数据增强技术和迁移学习的应用,系统能够很好地适应不同环境和条件下的农作物检测任务,提高了检测的准确性和稳定性。

该系统的应用将极大地提升农业生产的智能化水平,帮助农民更好地掌握农田情况,优化田间管理,提高农作物产量和质量。同时,它还能为农业科研机构提供准确的数据支持,推动农业科技的进步和发展。

总之,基于YOLOv8的30种农作物检测系统是现代农业生产中不可或缺的智能工具,它将为农业的可持续发展做出重要贡献。

【效果展示】

​编辑

​编辑 

【测试环境】

windows10

anaconda3+python3.8

torch==1.9.0+cu111

ultralytics==8.3.21

【模型可以检测出类别】

{0: 'almond', 1: 'banana', 2: 'cardamom', 3: 'cherry', 4: 'chilli', 5: 'clove', 6: 'coconut', 7: 'coffee-plant', 8: 'cotton', 9: 'cucumber', 10: 'fox_nut', 11: 'gram', 12: 'jowar', 13: 'jute', 14: 'lemon', 15: 'maize', 16: 'mustard-oil', 17: 'olive-tree', 18: 'papaya', 19: 'pearl_millet', 20: 'pineapple', 21: 'rice', 22: 'soyabean', 23: 'sugarcane', 24: 'sunflower', 25: 'tea', 26: 'tobacco-plant', 27: 'tomato', 28: 'vigna-radiati', 29: 'wheat'}

中文名:

杏仁,香蕉,豆蔻,樱桃,辣椒,丁香,椰子,咖啡厂,棉,黄瓜,鸡头果,鹰嘴豆,高粱,黄麻,柠檬,玉米,芥末,橄榄树,番木瓜,珍珠米,菠萝,大米,大豆,甘蔗,向日葵,茶,烟草,番茄,小葡萄,小麦

 【训练数据集】 

智慧农业农作物识别分类数据集829张30类别-CSDN博客 

【训练信息】

参数 值 训练集图片数 8958 验证集图片数 1025 accuracy_top1 80.0% accuracy_top5 93.0% 训练轮数 100 batch_size 512 模型输入 (256,256) 【部分实现源码】
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-cls.pt

训练的日志csv文件(在weights\results.csv)

测试图片(在test_img文件夹下面)

数据集(在test_img文件夹下面)


创作时间: