无人机树木检测数据集 航拍图像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 | 白云杉 | 1898 | 52359 |
| pine | 松树 | 1348 | 45804 |
| aspen | 杨树 | 967 | 11599 |
| larch | 落叶松 | 889 | 3503 |
| black_spruce | 黑云杉 | 172 | 915 |
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 # 环境依赖清单六、运行步骤
- 配置Python3.8环境,安装依赖库
- 解压数据集,核对yaml路径无误
- 运行
train.py训练50epoch,生成best.pt权重 - 执行
python main_ui.py打开可视化界面 - 可选图片/视频/摄像头三种方式进行树种识别,查看框选、置信度、数量、坐标,可保存检测效果图
七、项目应用场景
- 森林资源普查:无人机大范围航拍林地,自动统计白云杉、松树、杨树等林木数量、树种分布,替代人工野外勘测
- 林业病虫害监测:通过树冠形态差异,结合树种识别,定位病害林木片区
- 国土绿化成效测算:多时相航拍对比,统计各类植被覆盖变化
- 毕业论文课题:轻量化YOLOv11航拍遥感目标检测、林业智能监测系统设计