十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 YOLOv11n 的松材线虫病死树航拍检测系统 无人机松材线虫病害病树检测数据集

基于 YOLOv11n 的松材线虫病死树航拍检测系统 无人机松材线虫病害病树检测数据集 智慧航拍-航拍松材线虫病树检测数据集4426张存在增强yolovoccoco三种标注方式图像尺寸:640*640类别数量:1类训练集图像数量:3867; 验证集图像数量:372 测试集图像数量:187类别名称: 每一类图像数 每一类标注数sick_dead: 2505,3823image num: 4426模型代码采用 YOLOv11n 网络训练训练轮次80 个 epoch提供全部训练 测试源代码训练精度 mAP 效果如图所示PyQt5 界面功能界面使用 PyQt5 开发提供全部源码.ui、.qrc、.py 及图标文件支持图片检测、视频检测、摄像头实时检测界面实时显示目标位置、目标总数、置信度等信息支持检测结果保存导出操作简单直观无需命令行附、配套文件全套完整完整数据集含原始图像、YOLO 格式 txt 标注、VOC 格式 xml 标注、yaml 配置文件模型程序文件训练代码 .py、训练好的模型权重 .ptQt 界面源码.ui、.qrc、.py 源码及配套图标资源程序运行说明文档程序运行步骤说明指导文档基于YOLOv11n的松材线虫病死树航拍检测全套项目文档一、数据集完整参数表参数项详细内容项目名称智慧航拍-无人机航拍松材线虫病死树检测数据集总图像数量4426张含数据增强扩充样本单张分辨率640 × 640标注格式YOLO TXT、VOC XML、COCO JSON 三格式齐全目标类别仅1类sick_dead病死松树/染病枯死林木样本划分训练集3867张验证集372张测试集187张类别图像/标注总量sick_dead图像2505张标注框总数3823个采集场景山林航拍俯瞰场景植被茂密林区、成片染病枯死林木区域适用场景林业病虫害巡检、松材线虫病大范围航拍排查、枯死树木统计盘点二、项目整体架构数据集模块三格式标注划分好的训练/验证/测试集yaml配置文件模型训练模块YOLOv11n轻量化模型80轮迭代训练精度评估模块PR曲线、mAP0.5指标计算最终mAP0.50.488PyQt5可视化客户端图片/视频/摄像头实时检测、结果展示、坐标导出保存三、数据集目录结构pine_sick_tree_dataset/ ├── images/ │ ├── train/ # 3867张训练图 │ ├── val/ # 372张验证图 │ ├── test/ # 187张测试图 ├── labels/ │ ├── train/ # YOLO txt标注 │ ├── val/ │ ├── test/ ├── voc_annotations/ # VOC xml标注全集 ├── coco_annotations/ │ ├── train.json │ ├── val.json │ ├── test.json ├── dataset.yaml # YOLO训练配置文件dataset.yaml 内容path:./pine_sick_tree_datasettrain:images/trainval:images/valtest:images/testnc:1names:0:sick_dead四、YOLOv11n 训练测试完整源代码1. 训练代码 train.pyfromultralyticsimportYOLO# 加载轻量化YOLOv11n预训练权重modelYOLO(yolo11n.pt)# 训练参数配置train_resultmodel.train(datadataset.yaml,epochs80,# 训练总轮次imgsz640,# 匹配数据集尺寸640*640batch16,device0,# GPU训练CPU运行改为 devicecpupatience10,pretrainedTrue,mosaic0.8,mixup0.1,saveTrue,projectpine_sick_tree_run,nameyolo11n_train)# 训练结束验证模型指标metricsmodel.val()print(fmAP0.5 {metrics.box.map50:.3f})print(fPrecision {metrics.box.p:.3f}, Recall {metrics.box.r:.3f})2. 测试推理代码 test_infer.pyfromultralyticsimportYOLO# 载入训练完成最优权重modelYOLO(pine_sick_tree_run/yolo11n_train/weights/best.pt)# 测试集整体评估test_metricsmodel.val(splittest)print(测试集精度结果)print(fmAP0.5:{test_metrics.box.map50:.3f})print(f精确率Precision:{test_metrics.box.p:.3f})print(f召回率Recall:{test_metrics.box.r:.3f})# 单张图片推理示例resmodel.predict(sourcepine_sick_tree_dataset/images/test/1.jpg,saveTrue,conf0.25)# 解析检测框坐标、类别、置信度forresultinres:boxesresult.boxesforboxinboxes:clsint(box.cls)conffloat(box.conf)xyxybox.xyxy[0].tolist()print(f类别:{model.names[cls]}| 置信度:{conf:.2f}| 像素坐标{xmin,ymin,xmax,ymax}:{xyxy})五、PyQt5可视化检测界面全套源码目录结构qt_ui/ ├── main.ui # Qt设计师界面文件 ├── ui_main.py # ui转Python代码 ├── resource.qrc # 图标资源文件 ├── resource_rc.py # qrc编译后文件 ├── detect_main.py # 主运行逻辑 ├── best.pt # 训练完毕权重1. resource.qrc图标资源RCCqresourceprefix/fileicons/save.png/filefileicons/exit.png/filefileicons/img.png/filefileicons/video.png/filefileicons/camera.png/file/qresource/RCC2. ui_main.pyui界面编译文件简略核心结构fromPyQt5importQtCore,QtGui,QtWidgetsclassUi_MainWindow(object):defsetupUi(self,MainWindow):MainWindow.setObjectName(MainWindow)MainWindow.resize(1326,867)# 标题self.centralwidgetQtWidgets.QWidget(MainWindow)self.label_titleQtWidgets.QLabel(self.centralwidget)self.label_title.setText(基于YOLOv11的病死树检测)self.label_title.setAlignment(QtCore.Qt.AlignCenter)fontQtGui.QFont()font.setPointSize(22)self.label_title.setFont(font)# 左侧图像显示区域self.label_imgQtWidgets.QLabel(self.centralwidget)self.label_img.setStyleSheet(background-color:#eeeeee;)# 右侧控制面板self.groupBox_fileQtWidgets.QGroupBox(self.centralwidget)self.groupBox_file.setTitle(文件导入)self.btn_imgQtWidgets.QPushButton(图片导入)self.btn_videoQtWidgets.QPushButton(视频文件)self.btn_cameraQtWidgets.QPushButton(开启摄像头)self.groupBox_resultQtWidgets.QGroupBox(self.centralwidget)self.groupBox_result.setTitle(检测结果)self.label_timeQtWidgets.QLabel(用时0.000s)self.label_numQtWidgets.QLabel(目标数目0)self.label_confQtWidgets.QLabel(置信度阈值)self.combo_confQtWidgets.QComboBox()self.combo_conf.addItems([全部,0.2,0.3,0.4,0.5])self.groupBox_posQtWidgets.QGroupBox(self.centralwidget)self.groupBox_pos.setTitle(目标位置)self.label_xminQtWidgets.QLabel(xmin:)self.label_yminQtWidgets.QLabel(ymin:)self.label_xmaxQtWidgets.QLabel(xmax:)self.label_ymaxQtWidgets.QLabel(ymax:)# 下方结果表格self.tableWidgetQtWidgets.QTableWidget()self.tableWidget.setColumnCount(6)self.tableWidget.setHorizontalHeaderLabels([序号,文件路径,类别,置信度,坐标,操作])# 底部按钮self.btn_saveQtWidgets.QPushButton(保存结果)self.btn_exitQtWidgets.QPushButton(退出程序)QtCore.QMetaObject.connectSlotsByName(MainWindow)3. detect_main.py 主运行逻辑完整可运行importsysimportcv2importtimefromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialog,QTableWidgetItemfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QTimerfromultralyticsimportYOLOfromui_mainimportUi_MainWindowclassSickTreeDetectWindow(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)# 加载训练权重self.modelYOLO(best.pt)self.timerQTimer()self.capNoneself.img_path# 按钮绑定槽函数self.btn_img.clicked.connect(self.open_image)self.btn_video.clicked.connect(self.open_video)self.btn_camera.clicked.connect(self.open_camera)self.btn_save.clicked.connect(self.save_result)self.btn_exit.clicked.connect(self.close)self.timer.timeout.connect(self.camera_frame)# 图片检测defopen_image(self):file,_QFileDialog.getOpenFileName(self,选择航拍图片,,图片文件(*.jpg *.png *.jpeg))ifnotfile:returnself.img_pathfilet_starttime.time()resself.model.predict(sourcefile,conf0.25)[0]t_costtime.time()-t_start# 绘制检测框imgres.plot()h,w,cimg.shape bytes_per_linec*w qimgQImage(img.data,w,h,bytes_per_line,QImage.Format_RGB888).rgbSwapped()self.label_img.setPixmap(QPixmap.fromImage(qimg).scaled(self.label_img.size(),Qt.KeepAspectRatio))# 信息回显self.label_time.setText(f用时{t_cost:.3f}s)box_numlen(res.boxes)self.label_num.setText(f目标数目{box_num})# 表格填充self.tableWidget.setRowCount(box_num)foridx,boxinenumerate(res.boxes):cls_nameself.model.names[int(box.cls)]conffloat(box.conf)*100xyxy[int(i)foriinbox.xyxy[0].tolist()]self.tableWidget.setItem(idx,0,QTableWidgetItem(str(idx1)))self.tableWidget.setItem(idx,1,QTableWidgetItem(self.img_path))self.tableWidget.setItem(idx,2,QTableWidgetItem(cls_name))self.tableWidget.setItem(idx,3,QTableWidgetItem(f{conf:.2f}%))self.tableWidget.setItem(idx,4,QTableWidgetItem(str(xyxy)))# 选中框同步坐标self.label_xmin.setText(fxmin:{xyxy[0]})self.label_ymin.setText(fymin:{xyxy[1]})self.label_xmax.setText(fxmax:{xyxy[2]})self.label_ymax.setText(fymax:{xyxy[3]})# 视频检测defopen_video(self):file,_QFileDialog.getOpenFileName(self,选择视频,,视频(*.mp4 *.avi))ifnotfile:returnself.capcv2.VideoCapture(file)self.timer.start(30)# 摄像头实时流defopen_camera(self):self.capcv2.VideoCapture(0)self.timer.start(30)defcamera_frame(self):ret,frameself.cap.read()ifnotret:self.timer.stop()returnresself.model.predict(frame,conf0.25)[0]frame_drawres.plot()h,w,cframe_draw.shape bytes_per_linec*w qimgQImage(frame_draw.data,w,h,bytes_per_line,QImage.Format_RGB888).rgbSwapped()self.label_img.setPixmap(QPixmap.fromImage(qimg).scaled(self.label_img.size(),Qt.KeepAspectRatio))self.label_num.setText(f目标数目{len(res.boxes)})# 结果保存defsave_result(self):save_path,_QFileDialog.getSaveFileName(self,保存检测结果,,图片(*.jpg))ifsave_path:pixself.label_img.pixmap()pix.save(save_path)defcloseEvent(self,event):ifself.cap:self.cap.release()self.timer.stop()event.accept()if__name____main__:appQApplication(sys.argv)winSickTreeDetectWindow()win.show()sys.exit(app.exec_())六、精度结果说明训练配置YOLOv11n、80epoch、640分辨率最终指标mAP0.5 0.488PR曲线特征随着召回率提升精确率平稳下降符合林区复杂背景下弱小枯死树木检测的特点植被遮挡、颜色混杂带来识别难度七、全套配套文件清单数据集包原始航拍图像4426张YOLO txt归一化标注、VOC xml标注、COCO json标注三套dataset.yaml配置文件模型文件train.py训练脚本、test_infer.py测试脚本best.pt最优训练权重Qt界面全套main.ui界面文件、resource.qrc资源文件ui_main.py、resource_rc.py编译文件detect_main.py运行主程序、icons图标文件夹运行文档环境依赖、部署步骤、使用教程八、环境部署依赖ultralytics8.3.0 torch2.0.0 torchvision opencv-python PyQt5 numpy matplotlib九、运行步骤安装上述依赖库解压数据集放置路径与yaml文件匹配运行train.py完成80轮训练生成best.pt权重将best.pt放入qt_ui文件夹编译qrc资源文件pyrcc5 resource.qrc -o resource_rc.py执行python detect_main.py启动可视化界面选择图片/视频/摄像头三种模式进行病死树检测可查看坐标、置信度并保存结果
返回列表