—深度学习在秸秆焚烧监测检测、森林火灾预警、环保监管等AI系统开发及应用 YOLOV8模型训练无人机秸秆焚烧火灾检测监测数据集文章目录**无人机视角秸秆焚烧识别数据集目标检测 分类****数据分类统计表****目标检测标注信息****数据用途说明**✅ 数据集概览✅ 一、环境搭建从零开始1. 确认 CUDA 驱动GPU 加速2. 安装 Anaconda3. 创建 Python 虚拟环境4. 安装必要依赖✅ 二、数据集结构YOLO 格式文件目录结构1. 数据划分建议8:22. 创建 data.yaml✅ 三、数据预处理脚本组织数据 organize_data.py✅ 四、训练代码YOLOv8 官方预训练模型 train.py✅ 五、推理代码检测新图像 predict.py✅ 六、评估模型性能 evaluate.py✅ 七、分类任务可选 温馨提示无人机视角秸秆焚烧识别数据集目标检测 分类项目内容数据集名称无人机视角秸秆焚烧识别目标检测分类数据集无人机型号DJI Mini 2图像总数8,600 张图片分辨率512 × 512 像素采集高度40 ~ 90 米采集角度30° ~ 90°倾斜至垂直视角总内存大小3.73 GB数据类型原始图片 目标检测标签 已分类图片任务类型目标检测、图像分类火灾/非火灾标注格式目标检测标签如YOLO.txt或 VOC.xml格式数据分类统计表类别图像数量说明火灾场景正样本5,000 张包含明火、烟雾等焚烧现象非火灾场景负样本3,600 张正常农田、无火无烟场景用于分类任务目标检测标注信息项目内容标注图像数量4,500 张含“火”类目标未标注图像数量4,100 张主要为非火灾图像或无可见火点检测类别火fire标注文件数量4,500 个每个对应一张标注图像注并非所有火灾图像都有边界框标注仅 4,500 张进行了目标检测标注。数据用途说明✅目标检测可用于训练 YOLO、SSD 等模型识别“火”区域。✅图像分类可用于训练分类模型判断是否发生焚烧火灾 vs 非火灾。✅多角度真实场景覆盖不同高度和角度贴近实际无人机巡检应用。✅高实用性适用于秸秆焚烧监测、森林火灾预警、环保监管等AI系统开发。1✅ 数据集概览项目说明图像总数8600 张512×512火灾图像正样本5000 张非火灾图像负样本3600 张目标检测标注文件数4500 个.txt文件仅含“火”类类别fireclass_id 0分辨率512×512采集平台DJI Mini 2 无人机4090m 高度3090° 角度标注类型YOLO 格式目标检测 分类标签 注意只有 4500 张图像有标注框说明其余 500 张火灾图或部分非火图为背景/无框图。我们将分两个任务进行建模目标检测任务检测图像中的“火”区域推荐图像分类任务判断整图是否为“火灾”场景可选本教程以目标检测为主使用 YOLOv8 训练fire类检测器。✅ 一、环境搭建从零开始1. 确认 CUDA 驱动GPU 加速nvidia-smi查看 CUDA 版本如 11.8 或 12.1。若无 GPU 可用 CPU但训练较慢。2. 安装 Anaconda下载地址https://www.anaconda.com/products/distribution安装后打开Anaconda PromptWindows或终端Mac/Linux3. 创建 Python 虚拟环境# 创建环境conda create-nfire-dronepython3.9# 激活环境conda activate fire-drone4. 安装必要依赖# 安装 PyTorch以 CUDA 11.8 为例pipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118# 安装 Ultralytics YOLOv8pipinstallultralytics# 安装 OpenCV 和其他工具pipinstallopencv-python matplotlib pillow tqdm✅ 验证安装importtorchprint(torch.cuda.is_available())# 应输出 True有 GPU 时✅ 二、数据集结构YOLO 格式文件目录结构datasets/ └── fire_drone/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml1. 数据划分建议8:2总标注图像4500 张有火非火图像3600 张可用于训练背景建议划分方式集合图像来源数量train3600 张火图 2880 张非火图6480 张val900 张火图 720 张非火图1620 张✅ 所有 4500 张标注图像都应参与训练/验证。2. 创建data.yaml# datasets/fire_drone/data.yamltrain:../datasets/fire_drone/images/trainval:../datasets/fire_drone/images/valnc:1names:[fire]✅ 三、数据预处理脚本组织数据organize_data.py# organize_data.pyimportosimportshutilimportrandomfrompathlibimportPath# 路径配置请根据你的实际路径修改image_diryour_dataset/images# 所有 8600 张图像label_diryour_dataset/labels# 4500 个 .txt 标注文件# 输出路径dstdatasets/fire_droneimg_trainf{dst}/images/trainimg_valf{dst}/images/vallbl_trainf{dst}/labels/trainlbl_valf{dst}/labels/valos.makedirs(img_train,exist_okTrue)os.makedirs(img_val,exist_okTrue)os.makedirs(lbl_train,exist_okTrue)os.makedirs(lbl_val,exist_okTrue)# 获取所有标注图像有火labeled_images[f.replace(.txt,.jpg)forfinos.listdir(label_dir)iff.endswith(.txt)]labeled_images[fforfinlabeled_imagesifos.path.exists(os.path.join(image_dir,f))]# 随机划分 8:2random.seed(42)random.shuffle(labeled_images)split_idxint(0.8*len(labeled_images))train_labeledlabeled_images[:split_idx]# 3600val_labeledlabeled_images[split_idx:]# 900# 获取非火图像无标注all_images[fforfinos.listdir(image_dir)iff.endswith((.jpg,.png))]non_fire_imageslist(set(all_images)-set(labeled_images))random.shuffle(non_fire_images)train_non_firenon_fire_images[:2880]val_non_firenon_fire_images[2880:2880720]# 合并训练集和验证集图像train_filestrain_labeledtrain_non_fire val_filesval_labeledval_non_fire# 复制图像和标签defcopy_with_labels(img_list,img_dst,lbl_dst):forimg_fileinimg_list:src_imgos.path.join(image_dir,img_file)dst_imgos.path.join(img_dst,img_file)shutil.copy(src_img,dst_img)# 如果是标注图像复制对应 .txttxt_fileimg_file.replace(.jpg,.txt).replace(.png,.txt)src_lblos.path.join(label_dir,txt_file)ifos.path.exists(src_lbl):dst_lblos.path.join(lbl_dst,txt_file)shutil.copy(src_lbl,dst_lbl)else:# 非火图创建空标签文件YOLO 要求存在withopen(os.path.join(lbl_dst,txt_file),w)asf:passcopy_with_labels(train_files,img_train,lbl_train)copy_with_labels(val_files,img_val,lbl_val)print(f✅ 数据集划分完成)print(f 训练集:{len(train_files)}张含{len(train_labeled)}个火)print(f 验证集:{len(val_files)}张含{len(val_labeled)}个火)⚠️ 请将your_dataset/替换为你的实际路径。运行python organize_data.py✅ 四、训练代码YOLOv8 官方预训练模型train.py# train.pyfromultralyticsimportYOLOimporttorch devicecudaiftorch.cuda.is_available()elsecpuprint(fUsing device:{device})# 推荐使用 yolov8m 或 yolov8l小火点检测更强modelYOLO(yolov8m.pt)resultsmodel.train(datadatasets/fire_drone/data.yaml,epochs200,imgsz512,# 与图像分辨率一致batch32,# 显存足够可设 32不足则 16namefire_drone_yolov8m,devicedevice,workers4,optimizerAdamW,lr00.001,weight_decay0.0005,patience30,projectruns/fire,ampTrue,close_mosaic15,# --- 数据增强 ---hsv_h0.015,hsv_s0.7,hsv_v0.5,# 增强火光亮度translate0.2,scale0.5,fliplr0.5,mosaic1.0,mixup0.5,degrees10.0,)✅ 五、推理代码检测新图像predict.py# predict.pyfromultralyticsimportYOLO modelYOLO(runs/fire/fire_drone_yolov8m/weights/best.pt)resultsmodel.predict(sourcedrone_fire.jpg,saveTrue,conf0.3,iou0.45,showFalse,projectruns/predict,namefire_test,imgsz512)forresultinresults:boxesresult.boxesprint(f检测到{len(boxes)}处火点)forboxinboxes:conffloat(box.conf)print(f 置信度:{conf:.3f})✅ 六、评估模型性能evaluate.py# evaluate.pyfromultralyticsimportYOLO modelYOLO(runs/fire/fire_drone_yolov8m/weights/best.pt)metricsmodel.val(datadatasets/fire_drone/data.yaml,splitval,imgsz512,batch32,conf0.001,iou0.6,devicecudaiftorch.cuda.is_available()elsecpu,projectruns/eval,namefire_val)print(fmAP0.5:{metrics.box.map:.4f})print(fmAP0.5:0.95:{metrics.box.map50_95:.4f})print(fPrecision:{metrics.box.p:.4f})print(fRecall:{metrics.box.r:.4f})✅ 七、分类任务可选如果你只想做图像级分类是否起火可使用 YOLOv8 分类模型# 分类训练modelYOLO(yolov8m-cls.pt)model.train(datadatasets/fire_cls,epochs100,imgsz512)需组织为datasets/fire_cls/ ├── train/ │ ├── fire/ │ └── no_fire/ └── val/ ├── fire/ └── no_fire/ 温馨提示关注Recall避免漏检小火点可使用imgsz640提升小目标检测需裁剪或缩放若部署到边缘设备可导出为 ONNX