如何使用YOLOv8模型训练无人机视角火灾烟雾检测数据集 通过训练出的无人机火焰烟雾权重,建立基于深度学习的无人机火灾烟雾检测系统
文章目录
无人机森林火灾烟雾检测数据集,2603张图片 TXT标注
基于YOLO系列的森林火灾检测系统,从数据准备、格式转换、数据划分、环境搭建、数据配置、模型训练、超参数配置、模型推理、批量推理、性能评估等步骤进行详细说明,代码示例,仅供参考。
1. 数据准备
假设你的数据集结构如下:
forest_fire_dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
1.1 格式转换
如果同学的数据集标注文件不是YOLO格式(即每行包含类别ID、中心点坐标和宽高),同学你需要将其转换为YOLO格式。这里假设你已经有了对应的TXT格式标注文件。
import os
def convert_annotation(image_id, list_file):
in_file = open('forest_fire_dataset/labels/%s.txt' % (image_id))
out_file = open('forest_fire_dataset/labels_yolo/%s.txt' % (image_id), 'w')
for line in in_file:
elements = line.strip().split()
class_id = int(elements[0])
x_center = float(elements[1])
y_center = float(elements[2])
width = float(elements[3])
height = float(elements[4])
out_file.write(f"{class_id} {x_center} {y_center} {width} {height}\n")
in_file.close()
out_file.close()
for image_id in os.listdir('forest_fire_dataset/images'):
if image_id.endswith('.jpg'):
convert_annotation(image_id[:-4], None)
1.2 数据划分
将数据集划分为训练集、验证集和测试集。
import random
from sklearn.model_selection import train_test_split
# 获取所有图片路径
image_files = [f for f in os.listdir('forest_fire_dataset/images') if f.endswith('.jpg')]
random.shuffle(image_files)
# 划分数据集
train_files, test_val_files = train_test_split(image_files, test_size=0.3, random_state=42)
val_files, test_files = train_test_split(test_val_files, test_size=0.5, random_state=42)
# 写入文件列表
with open('forest_fire_dataset/train.txt', 'w') as f:
for file in train_files:
f.write(f"forest_fire_dataset/images/{file}\n")
with open('forest_fire_dataset/val.txt', 'w') as f:
for file in val_files:
f.write(f"forest_fire_dataset/images/{file}\n")
with open('forest_fire_dataset/test.txt', 'w') as f:
for file in test_files:
f.write(f"forest_fire_dataset/images/{file}\n")
2. 环境搭建
确保安装了必要的库和依赖项:
pip install ultralytics opencv-python-headless
3. 数据配置
创建data.yaml
文件来定义数据集路径和类别信息。
train: forest_fire_dataset/train.txt
val: forest_fire_dataset/val.txt
test: forest_fire_dataset/test.txt
nc: 2 # number of classes
names: ['fire', 'smoke'] # class names
4. 模型训练
使用YOLOv8进行训练。
from ultralytics import YOLO
# 加载预训练的YOLOv8模型或从头开始训练
model = YOLO('yolov8n.yaml') # 使用YOLOv8 nano架构作为起点,或者加载预训练权重如 'yolov8n.pt'
# 开始训练
results = model.train(data='forest_fire_dataset/data.yaml', epochs=100, imgsz=640)
# 训练完成后,结果会保存在 runs/detect/expN 文件夹内
5. 配置超参数
在训练过程中,你可以通过调整以下超参数来优化模型性能:
batch
: 批处理大小。epochs
: 训练周期数。imgsz
: 输入图像尺寸。lr0
: 初始学习率。lrf
: 最终学习率比例。momentum
: 动量。weight_decay
: 权重衰减。
6. 模型推理
训练完成后,可以使用以下代码对新的图像或视频进行推理:
# 加载训练好的模型
model = YOLO('runs/detect/exp/weights/best.pt') # 替换为你的最佳模型路径
def detect_image(image_path):
results = model(image_path)
for result in results:
annotated_frame = result.plot() # 自动绘制边界框和标签
cv2.imshow("Fire Detection", annotated_frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
def detect_video(video_path=0):
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = model(frame)
for result in results:
annotated_frame = result.plot()
cv2.imshow("Fire Detection", annotated_frame)
if cv2.waitKey(1) == ord('q'): # 按 Q 键退出
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
detect_image("path/to/test/image.jpg")
# detect_video("path/to/test/video.mp4")
7. 批量推理
对于批量推理,可以遍历文件夹中的所有图片并进行检测。
import os
def batch_detect(folder_path):
for filename in os.listdir(folder_path):
if filename.endswith(".jpg"):
image_path = os.path.join(folder_path, filename)
detect_image(image_path)
batch_detect("path/to/folder")
8. 性能评估
使用验证集评估模型性能。
metrics = model.val(data='forest_fire_dataset/data.yaml')
print(metrics)
这将输出模型在验证集上的各种指标,如mAP、精度、召回率等。
以上是完整的代码示例流程,包括数据准备、格式转换、数据划分、环境搭建、数据配置、模型训练、超参数配置、模型推理、批量推理和性能评估。请根据实际情况替换所有路径为你自己的实际路径。
使用训练好的权重文件建立一个基于深度学习的无人机火灾烟雾检测系统,
环境设置、加载模型、执行推理以及开发用户界面。在下面代码示例。
1. 环境配置
确保同学你的环境中已安装了必要的库和依赖项。这里以YOLOv8为例进行说明:
# 创建虚拟环境(可选)
python -m venv yolov8-env
source yolov8-env/bin/activate # Windows: yolov8-env\Scripts\activate
# 安装 ultralytics 和其他必要库
pip install ultralytics opencv-python-headless pillow
2. 加载训练好的模型
假设你已经有了训练好的YOLOv8模型权重文件(例如best.pt
),你可以通过下面的Python代码加载模型:
from ultralytics import YOLO
# 加载训练好的模型
model = YOLO('path/to/best.pt') # 替换为你的模型路径
3. 执行推理
接下来是实现对图像或视频流进行推理的功能。针对单张图片和视频流的推理代码示例。
对单张图片进行推理
import cv2
def detect_fire_smoke(image_path):
img = cv2.imread(image_path)
results = model(img)
for result in results:
annotated_frame = result.plot() # 自动绘制边界框和标签
cv2.imshow("Fire and Smoke Detection", annotated_frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
对视频流进行推理
def process_video(video_path=0):
cap = cv2.VideoCapture(video_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 进行推理
results = model(frame)
# 绘制结果
for result in results:
annotated_frame = result.plot()
cv2.imshow("Fire and Smoke Detection", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按 Q 键退出
break
cap.release()
cv2.destroyAllWindows()
4. 开发用户界面
使用Tkinter来创建一个简单的GUI界面。这个界面将允许用户选择图片或视频文件,并显示检测结果。
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
import threading
class FireSmokeDetectionApp:
def __init__(self, root):
self.root = root
self.root.title("无人机火灾烟雾检测系统")
# 加载模型
self.model = YOLO('path/to/best.pt') # 替换为你的模型路径
# GUI组件
self.select_image_button = tk.Button(root, text="选择图片", command=self.detect_image)
self.select_image_button.pack(pady=10)
self.select_video_button = tk.Button(root, text="选择视频", command=self.detect_video)
self.select_video_button.pack(pady=10)
self.image_label = tk.Label(root)
self.image_label.pack(pady=10)
def detect_image(self):
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png")])
if file_path:
self._run_detection(file_path, is_video=False)
def detect_video(self):
file_path = filedialog.askopenfilename(filetypes=[("Video Files", "*.mp4;*.avi")])
if file_path:
threading.Thread(target=self._run_detection, args=(file_path, True)).start()
def _run_detection(self, file_path, is_video):
if is_video:
cap = cv2.VideoCapture(file_path)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
results = self.model(frame)
annotated_frame = results[0].plot()
# 转换颜色通道并显示
img = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
img = Image.fromarray(img)
imgtk = ImageTk.PhotoImage(image=img)
self.image_label.imgtk = imgtk
self.image_label.configure(image=imgtk)
self.root.update_idletasks()
self.root.update()
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
else:
results = self.model(file_path)
annotated_image = results[0].plot()
# 转换颜色通道并调整大小以适应窗口
img = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)
img = Image.fromarray(img)
img = img.resize((640, 480), Image.ANTIALIAS)
imgtk = ImageTk.PhotoImage(image=img)
self.image_label.imgtk = imgtk
self.image_label.configure(image=imgtk)
messagebox.showinfo("完成", "图像处理完成")
if __name__ == '__main__':
root = tk.Tk()
app = FireSmokeDetectionApp(root)
root.mainloop()
总结
以上步骤提供了一个完整的流程。仅供参考学习。注意,具体实现细节可能会有所变化,请参考最新的官方文档或资源进行调整。
仅供参考学习。