欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【YOLO系列】基于YOLOv8的无人机野生动物检测

【YOLO系列】基于YOLOv8的无人机野生动物检测

2025/4/2 11:21:46 来源:https://blog.csdn.net/qq_43619271/article/details/146775983  浏览:    关键词:【YOLO系列】基于YOLOv8的无人机野生动物检测

基于YOLOv8的无人机野生动物检测

1.前言

在野生动物保护、生态研究和环境监测领域,及时、准确地检测和识别野生动物对于保护生物多样性、预防人类与野生动物的冲突以及制定科学的保护策略至关重要。传统的野生动物监测方法通常依赖于地面巡逻、固定摄像头或无线传感器网络,但这些方法往往受地形限制,监测范围有限,且成本较高。

无人机(UAV)的引入为野生动物监测提供了一种高效、低成本且大范围覆盖的解决方案。借助无人机搭载的高分辨率摄像头和先进的计算机视觉算法,如YOLOv8(You Only Look Once v8),可以在复杂的自然环境中快速、精准地检测和识别不同种类的野生动物。这不仅提高了数据采集的效率,还减少了对动物栖息地的干扰,使研究人员能够更好地了解动物的行为、种群动态及生态环境变化。

无人机视角下的野生动物检测具有广泛的应用前景,包括:

  • 野生动物保护与巡查:实时监测濒危物种,防止非法捕猎,保护栖息地。
  • 生态研究与种群调查:分析动物种群数量、活动范围及迁徙模式,提供科学依据。
  • 农业与林业管理:监测野生动物对农作物的影响,预防人兽冲突。
  • 灾害评估与环境监测:在森林火灾、洪水等自然灾害发生后评估野生动物的生存状况。

借助YOLOv8的高效目标检测能力,无人机可以在复杂背景下快速、准确地识别和追踪野生动物,为生态研究和野生动物保护提供强有力的技术支持。

2.YOLOv8模型的训练评估和推理

YOLOv8 由Ultralytics 于 2023 年 1 月 10 日发布,在准确性和速度方面具有尖端性能。在以往YOLO 版本的基础上,YOLOv8 引入了新的功能和优化,使其成为广泛应用中各种物体检测任务的理想选择。

在这里插入图片描述

2.1 YOLOv8的基本原理

YOLOv8 主要基于 单阶段检测(one-stage detection)原理,即直接从输入图像预测目标类别和边界框,而不像两阶段方法(如 Faster R-CNN)那样需要先生成候选区域。这使得 YOLOv8 具有高效的计算性能,并能够在资源受限的设备上运行。

相较于前几代 YOLO,YOLOv8 主要改进点包括:

  • 更高的检测精度:采用 Anchor-Free(无锚框) 设计,使得模型更加灵活,减少计算复杂度。
  • 更快的推理速度:优化了模型架构,使得推理更高效,适用于边缘设备。
  • 更强的泛化能力:改进了损失函数和训练策略,使得模型在不同任务上的适应性更强。
  • 支持多任务:不仅可以进行目标检测,还支持 实例分割、图像分类、姿态估计 等任务。

2.2 YOLOv8的网络结构

YOLOv8 在网络结构上相比于 YOLOv5 进行了优化,主要采用了 CSP(Cross Stage Partial)结构轻量化设计,提高了模型的计算效率和准确率。

在这里插入图片描述
2.2.1. Backbone(主干网络)

YOLOv8 采用 CSPDarknet 作为主干网络,用于提取图像的高级特征。该部分主要包括:

  • CBS(Conv + BatchNorm + SiLU):基本的卷积块,提高特征表达能力。
  • C2f(CSP 变体):改进的 CSP 结构,提高信息流通能力,减少冗余计算。
  • SPP (Spatial Pyramid Pooling) 模块:用于增加感受野,提高对多尺度目标的检测能力。
2.2.2. Neck(颈部网络)

Neck 负责融合不同尺度的特征,以提升检测性能。YOLOv8 采用 PAFPN(Path Aggregation Feature Pyramid Network) 结构,包括:

  • PAN(Path Aggregation Network):增强多尺度特征的融合,提高小目标检测能力。
  • C2f 结构:进一步优化计算效率,提高信息利用率。
2.2.3 Head(检测头)

YOLOv8 的检测头采用 Anchor-Free 设计,直接预测目标类别和边界框回归信息。主要特点包括:

  • 分类分支:预测目标的类别。
  • 回归分支:预测目标框的位置(中心点、宽度、高度)。
  • IoU 质量预测:估计目标框的置信度,提高检测稳定性。

2.3 环境部署

(1.1). 创建虚拟环境,虚拟环境配置最好在python=3.7及以上

conda create -n yolov8 python=3.8

(1.2). 安装项目运行需要的依赖

pip install ultralytics

2.4 模型训练评估和推理

2.4.1 数据集准备

无人机视角下的大规模野生动物检测数据集,包括6种类别,分别是:绵羊、牛、海豹、骆驼、藏野驴和斑马

2.4.2 数据集目录结构

参考官网:https://docs.ultralytics.com/datasets/detect/#supported-dataset-formats

2.4.3 训练

代码结构:

data.yaml

path: ../datasets/WAID										# 数据集源路经(目录结构参考2。4.2)
train: images/train												# 训练集路经
val: images/valid													# 验证集路经
test: images/test													# 测试集路经# 类别数量
nc: 6  # 类别名称(使用列表格式)
names: - sheep   # 绵羊- cattle  # 牛- seal    # 海豹- camelus # 骆驼- kiang   # 藏野驴- zebra   # 斑马

train.py

import os
import cv2
import torch
from ultralytics import YOLO# 读取图像
image_path = "sheep.jpg"# 获取图像的shape和通道数
if os.path.exists(image_path):image = cv2.imread(image_path)if image is not None:height, width, channels = image.shapeprint(f"The image has dimensions {width}x{height} and {channels} channels.")else:print("Error: Unable to load image.")
else:print("Error: Image file does not exist.")# 加载模型
model = YOLO('yolov8n.pt')# 训练模型
results = model.train(data='data.yaml',epochs=100,imgsz=640,								# 图像的shape sizebatch=32,  								# batchsizepatience=20,device='cuda' if torch.cuda.is_available() else 'cpu',workers=4,project='runs/train',name='exp',save=True,verbose=True
)

注意:如果本地没有对应的yolov8n.pt模型权重,在加载模型时会自动下载对应的模型权重,其次,若用的是官网的代码,可能会自动下载yolov11n.pt的模型权重,可以注释如下代码行:ultralytics\utils\checks.py

2.4.3 验证

val.py

import os
import cv2
import torch
from ultralytics import YOLO# Loading the best performing model
model = YOLO('best.pt')
# Evaluating the model on the test dataset
val_results = model.val(data='data.yaml')
print(f"验证结果: {val_results}")
2.4.4 测试

test.py

import os
import cv2
import torch
from ultralytics import YOLO# 使用训练好的模型进行预测
def predict_image(model, image_path):# 加载图像img = cv2.imread(image_path)if img is None:print(f"无法读取图像: {image_path}")return# 进行预测results = model.predict(source=image_path, conf=0.25, save=True)# 输出结果for result in results:boxes = result.boxesprint(f"检测到 {len(boxes)} 个目标")# 显示每个目标的详细信息for box in boxes:# 获取类别cls = int(box.cls[0])class_name = model.names[cls]# 获取置信度conf = float(box.conf[0])# 获取边界框x1, y1, x2, y2 = box.xyxy[0].tolist()print(f"类别: {class_name}, 置信度: {conf:.2f}, 边界框: [{int(x1)}, {int(y1)}, {int(x2)}, {int(y2)}]")# Loading the best performing model
model = YOLO('best.pt')# 测试单张图片
# test_image_path = 'b4frame00000036.jpg'  # 替换为你的测试图像路径
# predict_image(model, test_image_path)# 指定目标文件夹
folder_path = "../dataset/images/test"  # 这里替换成你的文件夹路径# 允许的图像文件扩展名
image_extensions = (".jpg", ".jpeg", ".png", ".bmp", ".gif", ".tiff")# 遍历文件夹并获取所有图像文件的路径
image_paths = [os.path.join(folder_path, filename)for filename in os.listdir(folder_path)if filename.lower().endswith(image_extensions)
]# 输出结果
for path in image_paths:print(path)predict_image(model, path)

2.5 模型性能评价指标

  • Train Box Loss

训练框损失指标衡量训练数据中对象的预测边界框与实际边界框之间的差异。较低的框损失意味着模型的预测边界框与实际边界框更接近。

  • Train Class Loss

训练类别损失指标衡量训练数据中对象的预测类别概率与实际类别标签之间的差异。类别损失越低,意味着模型的预测类别概率与实际类别标签越接近。

  • Train DFL Loss

训练DFL(动态特征学习)损失指标衡量训练数据中对象的预测特征图与实际特征图之间的差异。较低的 DFL 损失意味着模型的预测特征图与实际特征图更接近一致。

  • Metrics Precision(Box)

精度指标衡量所有预测边界框中真正阳性(True Positive)检测的比例。精度越高,意味着模型越能正确识别真正阳性检测,并最大限度地减少误报,越高越好。(模型预测检测到的目标)

  • Metric Recall(Box)

召回率指标衡量所有实际边界框中真正阳性检测的比例。召回率越高,意味着模型越能正确识别所有真正阳性检测,并将假阴性检测降至最低,越低越好。(实际存在的目标,但是模型没有检测到)

  • Metrics mAP50(Box)

mAP50 (B) 指标衡量模型在不同物体类别中的平均精度,其交并比 (IoU) 阈值为 50%。mAP50 越高,表示模型在不同类别中检测和定位物体的准确率越高。

  • Metrics mAP50-95(Box)

mAP50-95 (B) 指标衡量模型在不同物体类别中的平均精度,IoU 阈值范围为50%到95%。mAP50-95越高,表示模型越能准确地检测和定位不同类别中的物体,IoU 阈值范围越广。

2.6 可视化

Labels:

Preds:

2.6.1 训练结果
  • 定位损失 box loss: 预测框与标定框之间的误差,越小定位得越准。
  • 分类损失 cls loss: 计算锚框与对应的标定分类是否正确,越小分类得越准。
  • 其他指标均在上文介绍过。

PR曲线主要用于评估分类模型在不同阈值下的性能,特别是在不平衡数据集中,它比ROC曲线更有效,因为它专注于正类样本的表现。

  • 精度召回率的平衡:PR曲线帮助我们理解在特定阈值下,模型的精度和召回率如何平衡。高精度意味着低假阳性,然而高召回率意味着低漏检。
  • 曲线下面积(AUC):PR曲线的面积可以反映出模型的整体性能,AUC越大,模型越强。

通过PR曲线,我们可以更细致地了解YOLOv8在不同物种和不同阈值下的检测表现,有助于调优模型参数并优化在无人机视角下的物体检测任务。

mAP表示Precision和Recall作为两轴作图后围成的面积,m表示平均,@后面的数表示判定iou为正负样本的阈值。mAP@.5:表示阈值大于0.5的平均mAP,

Confusion Matrix: 混淆矩阵,显示预测类别与实际类别的对应关系。横轴表示真实值,纵轴表示预测值。

  • sheep行cattle列的1表示:1个羊被错误识别为牛。
  • background行sheep列的548表示:548个背景被错误识别为羊。
  • zebra行background列的164表示:164个斑马被错误识别为背景。

Confusion Matrix Normalize: **归一化的混淆矩阵**主要是将混淆矩阵中的数值转换成比例(或百分比),从而更容易理解模型的性能,尤其是对于类别不平衡的数据集。在归一化的混淆矩阵中,每一行的和为 1(或者 100%),表示每个真实类别在所有预测中所占的比例。

归一化分为对真实值(列)和预测值(行)进行归一化(下图展示的是**列归一化**):

  • 列归一化:对应某个真实类别(例如猫、狗、鸟),表示在所有该类别的样本中,预测为其他类别的比例。
  • 行归一化:对应模型预测的类别,展示该类别预测的准确性。

归一化的目的:

  • 对比不同类别的预测精度:可以直观地看到每个类别的 准确率(True Positive Rate)。

  • 解决类别不平衡问题:在原始混淆矩阵中,某些类别可能因为样本数较少而表现不佳,归一化后可以避免类别数量差异对性能评估的影响。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词