如何使用一个包含8000多张图像的鸟类数据集进行YOLOv8目标检测训练。这个数据集已经按照YOLO格式进行了标注,并且分为训练集、验证集和测试集,共有六类鸟类。
数据集介绍
数据集描述
数据量:8000多张图像
类别数量:6类
数据格式:YOLO格式
数据集划分:
训练集:约6000张
验证集:约1000张
测试集:约1000张
数据集目录结构
假设你的数据集目录结构如下:
深色版本
dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── labels/
├── train/
├── val/
└── test/
- 创建数据集配置文件
创建一个名为 birds_dataset.yaml 的文件,内容如下:
yaml
深色版本
数据集路径
train: ./dataset/images/train/
val: ./dataset/images/val/
test: ./dataset/images/test/
类别数量
nc: 6
类别名称
names: [‘sparrow’, ‘robin’, ‘pigeon’, ‘eagle’, ‘owl’, ‘duck’]
2. 安装必要的库
确保已经安装了 ultralytics 库和其他依赖项:
bash
深色版本
pip install ultralytics
3. 编写训练脚本
以下是一个详细的训练脚本:
python
深色版本
import os
from ultralytics import YOLO
1. 加载预训练模型
model = YOLO(‘yolov8n.yaml’) # 你可以选择不同的预训练权重,如’yolov8s’, 'yolov8m’等
2. 设置数据集路径
data_yaml_path = ‘birds_dataset.yaml’
3. 配置训练参数
training_config = {
‘data’: data_yaml_path, # 数据集配置文件路径
‘epochs’: 100, # 训练轮次
‘imgsz’: 640, # 输入图像大小
‘batch’: 16, # 批量大小
‘name’: ‘bird_detection’, # 日志保存名称
‘patience’: 50, # 如果验证集上的性能没有提升,等待多少个epoch后停止训练
‘device’: ‘cuda’, # 使用GPU进行训练
‘cache’: False, # 是否缓存数据
‘project’: ‘runs/train’, # 项目保存路径
‘exist_ok’: False, # 如果项目已存在是否覆盖
‘save_period’: -1, # 每隔多少个epoch保存一次模型
‘rect’: False, # 是否使用矩形训练
‘cos_lr’: False, # 是否使用余弦退火学习率
‘label_smoothing’: 0.0, # 标签平滑
‘upload_dataset’: False, # 是否上传数据集到HUB
‘bbox_interval’: -1, # 每隔多少个epoch保存一次bbox
‘artifact_alias’: ‘latest’ # 保存的模型别名
}
4. 开始训练
results = model.train(**training_config)
5. 模型评估
metrics = model.val()
6. 保存模型
model.save(‘bird_detection_model.pt’)
7. 可视化训练结果
if results:
print(“Training completed successfully!”)
print(f"Final validation metrics: {metrics}")
else:
print(“Training failed.”)
8. 清理临时文件
if training_config[‘cache’]:
os.system(‘rm -rf runs/dataset_cache’)
print(“Training and evaluation complete.”)
4. 运行训练脚本
将上述脚本保存为 train_bird_detection.py,然后在终端中运行:
bash
深色版本
python train_bird_detection.py
5. 监控训练过程
训练过程中,你可以在 runs/train/bird_detection 目录下找到训练日志和模型保存文件。你可以使用TensorBoard等工具来监控训练过程:
bash
深色版本
tensorboard --logdir runs/train
6. 测试模型
训练完成后,你可以使用以下代码测试模型:
python
深色版本
from ultralytics import YOLO
import cv2
加载训练好的模型
model = YOLO(‘bird_detection_model.pt’)
加载测试图像
test_image_path = ‘path/to/test/image.jpg’
image = cv2.imread(test_image_path)
进行推理
results = model(image)
显示结果
for result in results:
boxes = result.boxes # 获取检测框
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0] # 获取边界框坐标
conf = box.conf # 获取置信度
cls = int(box.cls) # 获取类别
label = model.names[cls] # 获取类别名称
color = (0, 255, 0) # 绿色框
thickness = 2
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), color, thickness)
cv2.putText(image, f’{label} {conf:.2f}', (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
显示图像
cv2.imshow(‘Result’, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 模型优化
如果你发现模型性能不佳,可以尝试以下方法进行优化:
数据增强:增加数据增强策略,如随机裁剪、翻转等。
调整超参数:调整学习率、批量大小、训练轮次等。
使用更强大的模型:尝试使用更大的YOLOv8模型,如yolov8l或yolov8x。
增加训练数据:如果可能,增加更多标注数据以提高模型泛化能力。
类别平衡:如果某些类别的标注数量较少,可以使用数据增强或重采样技术来平衡类别分布。
8. 处理不同格式的数据
如果你的数据集提供多种格式(如XML、TXT、JSON),你需要将它们转换为YOLO格式。以下是一些常用的转换工具和脚本:
XML to YOLO
python
深色版本
import xml.etree.ElementTree as ET
import os
def convert_xml_to_yolo(xml_file, output_dir, class_names):
tree = ET.parse(xml_file)
root = tree.getroot()
image_width = int(root.find(‘size/width’).text)
image_height = int(root.find(‘size/height’).text)
with open(output_dir + '/' + os.path.basename(xml_file).replace('.xml', '.txt'), 'w') as out_file:
for obj in root.findall('object'):
class_name = obj.find('name').text
if class_name not in class_names:
continue
class_id = class_names.index(class_name)
bndbox = obj.find('bndbox')
x_min = int(bndbox.find('xmin').text)
y_min = int(bndbox.find('ymin').text)
x_max = int(bndbox.find('xmax').text)
y_max = int(bndbox.find('ymax').text)
x_center = (x_min + x_max) / 2.0 / image_width
y_center = (y_min + y_max) / 2.0 / image_height
width = (x_max - x_min) / image_width
height = (y_max - y_min) / image_height
out_file.write(f"{class_id} {x_center} {y_center} {width} {height}\n")
示例调用
xml_dir = ‘path/to/xml/files’
output_dir = ‘path/to/output/yolo/labels’
class_names = [‘sparrow’, ‘robin’, ‘pigeon’, ‘eagle’, ‘owl’, ‘duck’]
os.makedirs(output_dir, exist_ok=True)
for xml_file in os.listdir(xml_dir):
if xml_file.endswith(‘.xml’):
convert_xml_to_yolo(os.path.join(xml_dir, xml_file), output_dir, class_names)
JSON to YOLO
python
深色版本
import json
import os
def convert_json_to_yolo(json_file, output_dir, class_names):
with open(json_file, ‘r’) as f:
data = json.load(f)
image_width = data['imageWidth']
image_height = data['imageHeight']
with open(output_dir + '/' + os.path.basename(json_file).replace('.json', '.txt'), 'w') as out_file:
for shape in data['shapes']:
class_name = shape['label']
if class_name not in class_names:
continue
class_id = class_names.index(class_name)
points = shape['points']
x_min = min(points[0][0], points[1][0])
y_min = min(points[0][1], points[1][1])
x_max = max(points[0][0], points[1][0])
y_max = max(points[0][1], points[1][1])
x_center = (x_min + x_max) / 2.0 / image_width
y_center = (y_min + y_max) / 2.0 / image_height
width = (x_max - x_min) / image_width
height = (y_max - y_min) / image_height
out_file.write(f"{class_id} {x_center} {y_center} {width} {height}\n")
示例调用
json_dir = ‘path/to/json/files’
output_dir = ‘path/to/output/yolo/labels’
class_names = [‘sparrow’, ‘robin’, ‘pigeon’, ‘eagle’, ‘owl’, ‘duck’]
os.makedirs(output_dir, exist_ok=True)
for json_file in os.listdir(json_dir):
if json_file.endswith(‘.json’):
convert_json_to_yolo(os.path.join(json_dir, json_file), output_dir, class_names)
希望这些详细的步骤能帮助你成功训练鸟类目标检测模型。