基于yolov11的淡水鱼种类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】

基于YOLOv11的淡水鱼种类检测系统是一种利用深度学习技术,特别是YOLOv11目标检测算法,实现对淡水鱼种类进行自动识别的高效系统,其支持识别的目标种类涵盖:孟加拉鲳鱼(Bangus)、鳙鱼(Big Head Carp)、黑斑鲃(Black Spotted Barb)、鲶鱼(Catfish)、攀鲈(Climbing Perch)、四指马鲅(Fourfinger Threadfish)、淡水鳗鲡(Freshwater Eel)、玻璃鲈鱼(Glass Perchlet)、虾虎鱼(Goby)、金鱼(Gold Fish)、吻口鱼(Gourami)、草鱼(Grass Carp)、绿斑河豚(Green Spotted Puffer)、印度鲤(Indian Carp)、印度鲮(Indo-Pacific Tarpon)、美洲鲈(Jaguar Gapote)、清道夫鱼(Janitor Fish)、刀鱼(Knifefish)、长吻管鳚(Long-Snouted Pipefish)、食蚊鱼(Mosquito Fish)、塘鳢(Mudfish)、鲻鱼(Mullet)、湄公鱼(Pangasius)、鲈鱼(Perch)、油鱼(Scat Fish)、银鲃(Silver Barb)、银鲫(Silver Carp)、银鲈(Silver Perch)、黑鱼(Snakehead)、巨鲶(Tenpounder)及罗非鱼(Tilapia)。

该系统的工作原理是通过训练YOLOv11模型,使其能够准确识别淡水图像或视频中的鱼类种类。YOLOv11作为YOLO系列的最新版本,具有强大的特征提取能力和高效的推理速度,这使得它能够在复杂的水下环境中快速、准确地检测出淡水鱼,并标注出其种类和位置。

在构建该系统时,首先需要准备一个包含各种淡水鱼图像的数据集,并对这些图像进行标注,包括鱼类的位置和类别信息。然后,使用这些数据对YOLOv11模型进行训练,使其学习到淡水鱼的特征。训练完成后,系统就可以对输入的淡水鱼图像或视频进行实时检测,并输出检测结果。

该系统可以广泛应用于淡水渔业资源管理、生态保护、水产养殖等领域。例如,在水产养殖中,通过该系统可以实时监测鱼塘中的鱼类种类和数量,为养殖者提供决策依据。在生态保护方面,该系统可以帮助科研人员更好地了解淡水鱼类的分布和数量,为生态保护提供数据支持。

总之,基于YOLOv11的淡水鱼种类检测系统是一种高效、准确的目标检测系统,具有广泛的应用前景。

【效果展示】

 

【训练数据集介绍】

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

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

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

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

标注类别数:31

标注类别名称(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准):["Bangus","Big Head Carp","Black Spotted Barb","Catfish","Climbing Perch","Fourfinger Threadfish","Freshwater Eel","Glass Perchlet","Goby","Gold Fish","Gourami","Grass Carp","Green Spotted Puffer","Indian Carp","Indo-Pacific Tarpon","Jaguar Gapote","Janitor Fish","Knifefish","Long-Snouted Pipefish","Mosquito Fish","Mudfish","Mullet","Pangasius","Perch","Scat Fish","Silver Barb","Silver Carp","Silver Perch","Snakehead","Tenpounder","Tilapia"]

每个类别标注的框数:

Bangus 框数 = 81

Big Head Carp 框数 = 77

Black Spotted Barb 框数 = 76

Catfish 框数 = 84

Climbing Perch 框数 = 91

Fourfinger Threadfish 框数 = 55

Freshwater Eel 框数 = 77

Glass Perchlet 框数 = 89

Goby 框数 = 118

Gold Fish 框数 = 81

Gourami 框数 = 87

Grass Carp 框数 = 170

Green Spotted Puffer 框数 = 60

Indian Carp 框数 = 75

Indo-Pacific Tarpon 框数 = 86

Jaguar Gapote 框数 = 75

Janitor Fish 框数 = 88

Knifefish 框数 = 83

Long-Snouted Pipefish 框数 = 84

Mosquito Fish 框数 = 91

Mudfish 框数 = 55

Mullet 框数 = 86

Pangasius 框数 = 87

Perch 框数 = 81

Scat Fish 框数 = 67

Silver Barb 框数 = 98

Silver Carp 框数 = 74

Silver Perch 框数 = 80

Snakehead 框数 = 81

Tenpounder 框数 = 104

Tilapia 框数 = 1763

总框数:4304

使用标注工具:labelImg

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

重要说明:暂无

特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注

图片预览:

标注例子:

【训练信息】

参数
训练集图片数2003
验证集图片数760
训练map75.6%
训练精度(Precision)75.6%
训练召回率(Recall)69.8%

 验证集评估精度信息:

Class

Images

Instances

P

R

mAP50

mAP50-95

all

760

966

0.756

0.698

0.756

0.628

Bangus

8

12

0.585

0.417

0.462

0.418

Big Head Carp

15

15

0.725

0.467

0.561

0.511

Black Spotted Barb

12

13

0.606

0.593

0.584

0.513

Catfish

11

11

0.546

0.636

0.531

0.345

Climbing Perch

12

12

0.713

0.917

0.882

0.713

Fourfinger Threadfish

9

9

0.332

0.889

0.685

0.546

Freshwater Eel

14

14

0.786

0.857

0.87

0.726

Glass Perchlet

13

13

0.61

0.723

0.663

0.565

Goby

51

54

0.888

0.439

0.79

0.645

Gold Fish

6

6

0.904

1

0.995

0.94

Gourami

9

9

0.962

1

0.995

0.83

Grass Carp

22

22

0.618

0.864

0.746

0.655

Green Spotted Puffer

15

15

0.955

0.933

0.988

0.829

Indian Carp

11

11

0.393

0.545

0.389

0.311

Indo-Pacific Tarpon

8

9

0.124

0.333

0.156

0.139

Jaguar Gapote

11

11

0.771

0.921

0.968

0.906

Janitor Fish

19

21

0.84

0.619

0.749

0.543

Knifefish

10

10

0.963

1

0.995

0.87

 Long-Snouted Pipefish

18

20

0.929

0.651

0.823

0.561

Mosquito Fish

13

14

1

0.627

0.786

0.595

Mudfish

13

13

0.361

0.462

0.499

0.413

Mullet

13

16

0.691

0.625

0.644

0.589

Pangasius

12

12

0.88

0.917

0.951

0.837

Perch

29

29

1

0.87

0.98

0.917

Scat Fish

46

46

0.987

0.848

0.981

0.811

Silver Barb

52

54

0.87

0.371

0.693

0.585

Silver Carp

16

16

0.778

0.938

0.786

0.71

Silver Perch

39

40

0.801

0.65

0.808

0.652

Snakehead

46

49

0.916

0.447

0.788

0.507

Tenpounder

75

80

0.98

0.275

0.793

0.668

Tilapia

130

310

0.921

0.79

0.906

0.602

【界面代码】

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. 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阈值,因此能够更全面地评估模型的性能。

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

【使用步骤】

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

【提供文件】

python源码
yolo11n.pt模型
训练的map,P,R曲线图(在weights\results.png)
测试图片600张(在test_img文件夹下面)

注意不提供训练的数据集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值