ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

无人机树木检测数据集 航拍图像5类树种树木检测数据集,基于 YOLOv11n 航拍 5 类树种检测系统 无人机白云杉检测数据集 无人机杨树检测数据集 无人机松树落叶松检测数据集

2026/8/11 10:05:15 拓冰建站 浏览量
无人机树木检测数据集 航拍图像5类树种树木检测数据集,基于 YOLOv11n 航拍 5 类树种检测系统 无人机白云杉检测数据集 无人机杨树检测数据集 无人机松树落叶松检测数据集

基于 YOLOv11n 航拍 5 类树种检测系统 无人机树木检测数据集 航拍图像5类树种树木检测数据集,3029张,yolo,voc,coco三种标注方式

图像尺寸:640*640
类别数量:5类
训练集图像数量:2424; 验证集图像数量:471; 测试集图像数量:134
类别名称: 每一类图像数 ,每一类标注数
white_spruce - 白云杉:1898, 52359
aspen - 杨树:967, 11599
pine - 松树:1348, 45804
larch - 落叶松:889, 3503
black_spruce - 黑云杉:172, 915
image num: 3029

.模型代码:提供全部训练及测试源代码,模型训练使用yolov11n训练,50个epoch训练结果,map如描述图所示。

.qt界面:运行界面采用pyqt5编写, 提供全部源代码,支持图片、视频及摄像头进行检测: 界面可实时显示目标位置、目标总数、置信度等信息: 支持检测结果保存;

系统环境:python=3.8 opencv-python PyQt5 torch
文件:
1.完整的数据集文件(包括图像,yolo格式的txt文件、yaml文件,voc格式的xml文件等)
2.模型代码完整程序文件(.py .pt等)
3.qt界面源文件、图标(.ui、.qrc、.py等)

基于YOLOv11n 航拍5类树种检测系统

一、数据集整体详情

1. 基础参数

  • 总航拍影像:3029张
  • 统一分辨率:640×640
  • 划分比例:训练集2424张 / 验证集471张 / 测试集134张
  • 识别类别:5类林木
  • 标注格式:YOLO txt、VOC xml、COCO json 三格式齐全

2. 各类样本与标注统计

英文类别中文名称包含该类图片数标注目标总个数
white_spruce白云杉189852359
pine松树134845804
aspen杨树96711599
larch落叶松8893503
black_spruce黑云杉172915

3. 数据集目录结构

tree_aerial_dataset/ ├── images/ │ ├── train/ # 2424张航拍原图 │ ├── val/ # 471张 │ └── test/ # 134张 ├── labels/ # YOLO格式标注txt │ ├── train/ │ ├── val/ │ └── test/ ├── voc_annotations/ # VOC xml标注 ├── coco_annotations/ # COCO json标注 └── tree.yaml # YOLO训练配置文件

4. tree.yaml 配置文件(可直接复制)

path:./tree_aerial_datasettrain:images/trainval:images/valtest:images/testnc:5names:0:white_spruce1:aspen2:pine3:larch4:black_spruce

二、运行环境配置

Python = 3.8 torch >= 2.0 torchvision ultralytics==8.3.0 # YOLOv11依赖 opencv-python PyQt5 numpy matplotlib pillow

一键安装命令:

pipinstalltorch torchvision ultralytics opencv-python PyQt5 numpy matplotlib pillow

三、YOLOv11n 训练+测试完整源码

1. train.py 训练脚本(50epoch)

fromultralyticsimportYOLO# 加载YOLOv11n轻量化模型model=YOLO("yolo11n.yaml")# 加载预训练权重加速收敛model=YOLO("yolo11n.pt")# 训练参数results=model.train(data="tree_aerial_dataset/tree.yaml",epochs=50,imgsz=640,batch=8,device=0,# 有GPU填0,CPU填cpupatience=10,save=True,plots=True,conf=0.25,iou=0.7)# 训练结束后验证集评估metrics=model.val()print(f"mAP@0.5:{metrics.box.map50:.3f}")

2. test.py 测试推理脚本

fromultralyticsimportYOLO# 载入训练完成最优权重model=YOLO("runs/detect/train/weights/best.pt")# 图片批量测试results=model.predict(source="tree_aerial_dataset/images/test",save=True,save_txt=True,save_conf=True,imgsz=640)# 单张图片推理示例# res = model("1.jpg")# 绘制PR曲线、精度指标model.val(plots=True)

训练结果指标(和你PR曲线图完全对应)

  • 整体 mAP@0.5 = 0.618
  • pine(松树):0.877
  • white_spruce(白云杉):0.844
  • aspen(杨树):0.570
  • black_spruce(黑云杉):0.568
  • larch(落叶松):0.232
    落叶松样本量最少,精度偏低符合数据集分布规律

四、PyQt5 可视化检测系统完整源码

功能:图片上传、视频检测、摄像头实时读取;显示树种框、类别、置信度、目标总数、坐标;检测结果保存;结果表格展示

1. main_ui.py 主界面程序

importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QFileDialog,QTableWidgetItem,QHeaderView,QComboBox)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QTimerfromultralyticsimportYOLOfromui_mainimportUi_MainWindowclassTreeDetectWindow(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)# 加载训练好的YOLOv11n模型self.model=YOLO("runs/detect/train/weights/best.pt")self.timer=QTimer()self.cap=Noneself.is_camera=Falseself.init_table()# 绑定按钮信号self.btn_img.clicked.connect(self.open_image)self.btn_video.clicked.connect(self.open_video)self.btn_cam.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.video_loop)definit_table(self):self.table_result.setColumnCount(5)self.table_result.setHorizontalHeaderLabels(["序号","类别","置信度","坐标(xmin,ymin,xmax,ymax)"])self.table_result.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)defcv2qt(self,img):rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,c=rgb.shape qimg=QImage(rgb.data,w,h,w*c,QImage.Format_RGB888)returnQPixmap.fromImage(qimg)defopen_image(self):path,_=QFileDialog.getOpenFileName(self,"选择航拍图片","","图片(*.jpg *.png *.jpeg)")ifnotpath:returnimg=cv2.imread(path)res=self.model(img,conf=0.25)[0]self.draw_result(img,res)defopen_video(self):path,_=QFileDialog.getOpenFileName(self,"选择视频文件","","视频(*.mp4 *.avi)")ifnotpath:returnself.cap=cv2.VideoCapture(path)self.is_camera=Falseself.timer.start(30)defopen_camera(self):self.cap=cv2.VideoCapture(0)self.is_camera=Trueself.timer.start(30)defvideo_loop(self):ret,frame=self.cap.read()ifnotret:self.timer.stop()self.cap.release()returnres=self.model(frame,conf=0.25)[0]self.draw_result(frame,res)defdraw_result(self,img,pred):img_show=pred.plot()self.label_img.setPixmap(self.cv2qt(img_show))boxes=pred.boxes total=len(boxes)self.label_total.setText(f"目标数目:{total}")iftotal>0:conf_avg=float(boxes.conf.mean())*100self.label_conf.setText(f"置信度{conf_avg:.2f}%")# 首个目标坐标b=boxes[0].xyxy[0].cpu().numpy()self.xmin.setText(str(int(b[0])))self.ymin.setText(str(int(b[1])))self.xmax.setText(str(int(b[2])))self.ymax.setText(str(int(b[3])))# 清空表格写入数据self.table_result.setRowCount(0)cls_names=self.model.namesforidx,boxinenumerate(boxes):row=self.table_result.rowCount()self.table_result.insertRow(row)cls_id=int(box.cls)cls_name=cls_names[cls_id]conf=float(box.conf)xyxy=[int(i)foriinbox.xyxy[0].cpu().numpy()]self.table_result.setItem(row,0,QTableWidgetItem(str(idx+1)))self.table_result.setItem(row,1,QTableWidgetItem(cls_name))self.table_result.setItem(row,2,QTableWidgetItem(f"{conf:.2f}"))self.table_result.setItem(row,3,QTableWidgetItem(f"{xyxy}"))self.save_img=img_showdefsave_result(self):ifhasattr(self,"save_img"):save_path,_=QFileDialog.getSaveFileName(self,"保存检测结果","","jpg(*.jpg)")ifsave_path:cv2.imwrite(save_path,self.save_img)defcloseEvent(self,event):ifself.cap:self.cap.release()self.timer.stop()event.accept()if__name__=="__main__":app=QApplication(sys.argv)win=TreeDetectWindow()win.show()sys.exit(app.exec_())

2. ui_main.py(Qt界面编译文件,由Qt Designer绘制后转换)

# -*- coding: utf-8 -*-fromPyQt5importQtCore,QtGui,QtWidgetsclassUi_MainWindow(object):defsetupUi(self,MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1350,960)self.centralwidget=QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")# 左侧图像显示区域self.label_img=QtWidgets.QLabel(self.centralwidget)self.label_img.setGeometry(QtCore.QRect(120,150,580,620))self.label_img.setFrameShape(QtWidgets.QFrame.Box)self.label_img.setAlignment(QtCore.Qt.AlignCenter)# 右侧控制面板self.frame_right=QtWidgets.QFrame(self.centralwidget)self.frame_right.setGeometry(QtCore.QRect(750,150,530,620))self.frame_right.setFrameShape(QtWidgets.QFrame.Box)self.label_title=QtWidgets.QLabel(self.centralwidget)self.label_title.setGeometry(QtCore.QRect(300,40,650,70))font=QtGui.QFont()font.setPointSize(22)self.label_title.setFont(font)self.label_title.setText("基于YOLOv11的航拍树种检测")self.label_title.setAlignment(QtCore.Qt.AlignCenter)# 文件导入按钮组self.btn_img=QtWidgets.QPushButton(self.frame_right)self.btn_img.setText("图片导入")self.btn_img.setGeometry(30,40,200,40)self.btn_video=QtWidgets.QPushButton(self.frame_right)self.btn_video.setText("选择视频文件")self.btn_video.setGeometry(30,95,200,40)self.btn_cam=QtWidgets.QPushButton(self.frame_right)self.btn_cam.setText("开启摄像头")self.btn_cam.setGeometry(30,150,200,40)# 检测结果信息self.label_total=QtWidgets.QLabel(self.frame_right)self.label_total.setText("目标数目:0")self.label_total.setGeometry(30,220,220,30)self.label_conf=QtWidgets.QLabel(self.frame_right)self.label_conf.setText("平均置信度:0%")self.label_conf.setGeometry(30,260,220,30)# 坐标显示self.xmin=QtWidgets.QLineEdit(self.frame_right)self.xmin.setPlaceholderText("xmin")self.xmin.setGeometry(30,310,80,30)self.ymin=QtWidgets.QLineEdit(self.frame_right)self.ymin.setPlaceholderText("ymin")self.ymin.setGeometry(130,310,80,30)self.xmax=QtWidgets.QLineEdit(self.frame_right)self.xmax.setPlaceholderText("xmax")self.xmax.setGeometry(30,355,80,30)self.ymax=QtWidgets.QLineEdit(self.frame_right)self.ymax.setPlaceholderText("ymax")self.ymax.setGeometry(130,355,80,30)# 操作按钮self.btn_save=QtWidgets.QPushButton(self.frame_right)self.btn_save.setText("保存结果")self.btn_save.setGeometry(30,420,100,45)self.btn_exit=QtWidgets.QPushButton(self.frame_right)self.btn_exit.setText("退出")self.btn_exit.setGeometry(150,420,100,45)# 底部表格self.table_result=QtWidgets.QTableWidget(self.centralwidget)self.table_result.setGeometry(QtCore.QRect(30,790,1250,140))MainWindow.setCentralWidget(self.centralwidget)self.statusbar=QtWidgets.QStatusBar(MainWindow)MainWindow.setStatusBar(self.statusbar)QtCore.QMetaObject.connectSlotsByName(MainWindow)

五、项目完整文件包清单

航拍树种YOLOv11检测系统/ ├── tree_aerial_dataset/ # 全套数据集(图像+YOLO/VOC/COCO标注+yaml) ├── runs/ │ └── detect/train/ │ └── weights/best.pt # 50轮训练最优模型权重 ├── train.py # 训练代码 ├── test.py # 测试评估代码 ├── main_ui.py # Qt运行入口 ├── ui_main.py # Qt界面文件 └── requirements.txt # 环境依赖清单

六、运行步骤

  1. 配置Python3.8环境,安装依赖库
  2. 解压数据集,核对yaml路径无误
  3. 运行train.py训练50epoch,生成best.pt权重
  4. 执行python main_ui.py打开可视化界面
  5. 可选图片/视频/摄像头三种方式进行树种识别,查看框选、置信度、数量、坐标,可保存检测效果图

七、项目应用场景

  1. 森林资源普查:无人机大范围航拍林地,自动统计白云杉、松树、杨树等林木数量、树种分布,替代人工野外勘测
  2. 林业病虫害监测:通过树冠形态差异,结合树种识别,定位病害林木片区
  3. 国土绿化成效测算:多时相航拍对比,统计各类植被覆盖变化
  4. 毕业论文课题:轻量化YOLOv11航拍遥感目标检测、林业智能监测系统设计