使用 YOLOv8 进行训练无人机视角的可见光-红外配对火点和烟雾检测数据集 双模态输入(多模态)无人机红外可见光火灾烟雾数据集的训练评估及推理
以下文字及代码可供参考。仅供参考。
文章目录
- **1. 环境搭建**
- **2. 数据准备**
- **2.1 数据格式转换(COCO 到 YOLO)**
- **3. 数据划分**
- **4. 数据配置**
- **5. 模型训练**
- **6. 模型推理**
- **单张图片推理**
- **批量推理**
- **7. 性能评估**
- **8. 多模态数据融合(可选)**
- **8.1 图像融合**
- **8.2 修改 YOLO 输入**
- **总结**
无人机视角可见光-红外配对的火点,烟雾检测数据集
1200余对可见光-红外图像,拍摄森林火灾情况,yolo标注
1
基于无人机视角的可见光-红外配对火点和烟雾检测数据集的详细处理流程。同学
使用 YOLOv8 进行训练,并附带完整的代码实现。
1. 环境搭建
确保安装了 Python 和必要的依赖库。推荐使用conda创建虚拟环境。
# 安装 conda(如果未安装)wgethttps://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbashMiniconda3-latest-Linux-x86_64.sh# 创建虚拟环境conda create-nyolov8_envpython=3.9conda activate yolov8_env# 安装 PyTorch 和 torchvisionpipinstalltorch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118# CUDA 11.8# 如果没有 GPU,可以使用 CPU 版本:# pip install torch torchvision torchaudio# 安装 ultralytics (YOLOv8 的官方库)pipinstallultralytics# 其他依赖库pipinstallopencv-python matplotlib numpy只是假设
2. 数据准备
假设你的数据集已经标注为 YOLO 格式(txt 文件),每张图片对应一个 txt 文件,内容如下:
<class_id> <x_center> <y_center> <width> <height>如果你的数据集是其他格式(如 Pascal VOC 或 COCO),需要先将其转换为 YOLO 格式。
2.1 数据格式转换(COCO 到 YOLO)
如果数据集是 COCO 格式,可以使用以下脚本将其转换为 YOLO 格式:
importosimportjsondefconvert_coco_to_yolo(coco_json,output_dir):os.makedirs(output_dir,exist_ok=True)withopen(coco_json,'r')asf:data=json.load(f)images={img['id']:imgforimgindata['images']}annotations=data['annotations']foranninannotations:img_id=ann['image_id']img_info=images[img_id]img_w,img_h=img_info['width'],img_info['height']bbox=ann['bbox']# [x_min, y_min, width, height]# 转换为 YOLO 格式x_center=(bbox[0]+bbox[2]/2)/img_w y_center=(bbox[1]+bbox[3]/2)/img_h width=bbox[2]/img_w height=bbox[3]/img_h class_id=ann['category_id']txt_file=os.path.join(output_dir,os.path.splitext(img_info['file_name'])[0]+'.txt')withopen(txt_file,'a')asf_txt:f_txt.write(f"{class_id}{x_center:.6f}{y_center:.6f}{width:.6f}{height:.6f}\n")# 示例调用convert_coco_to_yolo('path/to/coco_annotations.json','path/to/yolo_labels')3. 数据划分
按照 8:1:1 的比例划分训练集、验证集和测试集。
importosimportrandomimportshutildefsplit_dataset(image_dir,label_dir,output_dir,train_ratio=0.8,val_ratio=0.1):os.makedirs(os.path.join(output_dir,'images/train'),exist_ok=True)os.makedirs(os.path.join(output_dir,'images/val'),exist_ok=True)os.makedirs(os.path.join(output_dir,'images/test'),exist_ok=True)os.makedirs(os.path.join(output_dir,'labels/train'),exist_ok=True)os.makedirs(os.path.join(output_dir,'labels/val'),exist_ok=True)os.makedirs(os.path.join(output_dir,'labels/test'),exist_ok=True)images=os.listdir(image_dir)random.shuffle(images)train_split=int(len(images)*train_ratio)val_split=int(len(images)*(train_ratio+val_ratio))train_images=images[:train_split]val_images=images[train_split:val_split]test_images=images[val_split:]forimgintrain_images:shutil.copy(os.path.join(image_dir,img),os.path.join(output_dir,'images/train',img))shutil.copy(os.path.join(label_dir,os.path.splitext(img)[0]+'.txt'),os.path.join(output_dir,'labels/train',os.path.splitext(img)[0]+'.txt'))forimginval_images:shutil.copy(os.path.join(image_dir,img),os.path.join(output_dir,'images/val',img))shutil.copy(os.path.join(label_dir,os.path.splitext(img)[0]+'.txt'),os.path.join(output_dir,'labels/val',os.path.splitext(img)[0]+'.txt'))forimgintest_images:shutil.copy(os.path.join(image_dir,img),os.path.join(output_dir,'images/test',img))shutil.copy(os.path.join(label_dir,os.path.splitext(img)[0]+'.txt'),os.path.join(output_dir,'labels/test',os.path.splitext(img)[0]+'.txt'))# 示例调用split_dataset('path/to/images','path/to/labels','path/to/split_data')4. 数据配置
创建data.yaml文件,定义数据集路径和类别信息:
train:path/to/split_data/images/trainval:path/to/split_data/images/valtest:path/to/split_data/images/testnc:2# 类别数量(火点和烟雾)names:['fire','smoke']# 类别名称5. 模型训练
使用ultralytics库进行模型训练。
fromultralyticsimportYOLO# 加载预训练模型model=YOLO('yolov8n.pt')# 可选择其他模型:'yolov8s.pt', 'yolov8m.pt'# 配置超参数并训练model.train(data='path/to/data.yaml',epochs=100,batch=16,imgsz=640,device=0)# 使用 GPU6. 模型推理
训练完成后,可以加载模型进行推理。
单张图片推理
fromultralyticsimportYOLO# 加载训练好的模型model=YOLO('runs/detect/train/weights/best.pt')# 推理单张图片results=model('path/to/image.jpg')# 可视化结果results.show()批量推理
fromultralyticsimportYOLO# 加载训练好的模型model=YOLO('runs/detect/train/weights/best.pt')# 批量推理results=model(['path/to/image1.jpg','path/to/image2.jpg'])# 保存结果fori,rinenumerate(results):r.save(filename=f'result_{i}.jpg')7. 性能评估
使用验证集评估模型性能。
fromultralyticsimportYOLO# 加载训练好的模型model=YOLO('runs/detect/train/weights/best.pt')# 评估模型metrics=model.val()# 自动使用验证集print(metrics.box.map)# mAP@0.5print(metrics.box.map50)# mAP@0.5:0.958. 多模态数据融合(可选)
如果需要结合可见光和红外图像进行多模态学习,可以尝试以下方法:
8.1 图像融合
将可见光和红外图像进行特征级或像素级融合:
importcv2importnumpyasnpdeffuse_images(rgb_image_path,ir_image_path,output_path):rgb_image=cv2.imread(rgb_image_path)ir_image=cv2.imread(ir_image_path,cv2.IMREAD_GRAYSCALE)# 将红外图像转为伪彩色ir_color=cv2.applyColorMap(ir_image,cv2.COLORMAP_JET)# 图像融合fused_image=cv2.addWeighted(rgb_image,0.7,ir_color,0.3,0)# 保存融合图像cv2.imwrite(output_path,fused_image)# 示例调用fuse_images('path/to/rgb.jpg','path/to/ir.jpg','path/to/fused.jpg')8.2 修改 YOLO 输入
在训练时,可以通过修改输入通道数(从 3 改为 6)来支持双模态输入。
总结
从数据准备到模型训练、推理和评估的完整流程。同学你可以根据具体需求调整超参数或数据增强策略以进一步提升模型性能。对于多模态数据,建议探索更复杂的融合方法,例如深度学习中的多流网络架构。
以上文章仅供参考。