【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)。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive UDF开发实战:构建高性能JSON生成器

目录 一、背景与需求场景 二、开发环境准备 2.1 基础工具栈 2.2 Maven依赖配置 三、核心代码实现

分布式特性对比

以下是关于 分片(Sharding)、一致性哈希、两阶段提交(2PC)、Paxos、Raft协议、数据局部性 的对比分析与关联性总结,涵盖核心机制、适用场景及相互关系: 一、概念对比与关联 概念核心目标关键特性典型应用场景与其它技术的关联分片(Sharding)数据水平拆分按规则(哈希、…

历史分钟高频数据

外盘期货高频分钟历史回测行情数据下载 链接: https://pan.baidu.com/s/1RUbAMxfiSyBlXfrwT_0n2w?pwdhgya 提取码: hgya通过美国期货高频交易所历史行情可以看到很多细节比如品种之一:FGBX_1min (1)在2024-02-29 11:14:00关键交易时刻,一笔大规模订单突…

final+模版设计模式的理解

模板设计模式在 Java 里是一种行为设计模式,它在抽象类里定义算法的骨架,把部分步骤的具体实现延迟到子类。如此一来,子类可以在不改变算法结构的基础上,重新定义算法中的特定步骤。 模式组成 抽象类(Abstract Class…

JAVA接口调用限速器

目录 1、并发限速 2、串行限速 需求:批量调用第三方ERP接口,对方接口限流时,减缓调用速率。 1、并发限速 Slf4j RestController public class ApiCallTask {//第三方接口Resourceprivate ErpService erpService;//异步线程池Resourcepriv…

STM32 CAN控制器硬件资源与用法

1、硬件结构图 以STM32F4为例,他有2个can控制器,分别为 CAN1 CAN2。 每个CAN控制器,都有3个发送邮箱、2个接收fifo,每个接收fifo又由3个接收邮箱组成。也即每个CAN控制器都有9个邮箱,其中3个供发送用,3个…

【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

Qt warning LNK4042: 对象被多次指定;已忽略多余的指定

一、常规原因: pro或pri 文件中源文件被多次包含 解决:删除变量 SOURCES 和 HEADERS 中重复条目 二、误用 对于某些pri库可以使用如下代码简写包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如该目录下只有头文件,没…

Visual Studio Code 无法打开源文件解决方法

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 🔥 系列专栏:C从入门到精通 目录 一:🔥 突发状况 二:🔥 共勉 一:🔥 突发状况 🐬…

js文字两端对齐

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.text-align: justify; 不就可以了吗?但是实际测试无效 二、原因及解决方法 1.原因:text-align只对非最后一行文字有效。只有一行文字时,text-align无效,要用text-alig…

LeetCode算法题(Go语言实现)_20

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…

每天认识一个设计模式-桥接模式:在抽象与实现的平行宇宙架起彩虹桥

一、前言:虚拟机桥接的启示 使用过VMware或者Docker的同学们应该都接触过网络桥接,在虚拟机网络配置里,桥接模式是常用的网络连接方式。选择桥接模式时,虚拟机会通过虚拟交换机与物理网卡相连,获取同网段 IP 地址&…

java笔记02

运算符 1.隐式转换和强制转换 类型转换的分类 1.隐式转换: 取值范围小的数值 转换为 取值范围大的数值 2.强制转换: 取值范围大的数值 转换为 取值范围小的数值隐式转换的两种提升规则 取值范围小的,和取值范围大的进行运算,小的…

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]: sadd set1 a b c d sadd set1 a 0表示没有添加成功,因为集合中已经有了这个元素了,因此无法重复添加。 SMEMBERS key: smembers set1 SCARD key: scard set1 SADD key member1 …

李飞飞、吴佳俊团队新作:FlowMo如何以零卷积、零对抗损失实现ImageNet重构新巅峰

目录 一、摘要 二、引言 三、相关工作 四、方法 基于扩散先前的离散标记化器利用广告 架构 阶段 1A:模式匹配预训练 阶段 1B:模式搜索后训练 采样 第二阶段:潜在生成建模 五、Coovally AI模型训练与应用平台 六、实验 主要结果 …

CSS3:现代Web设计的魔法卷轴

一、布局革命:从平面到多维空间 1.1 Grid布局的次元突破 星际战舰布局系统 .galaxy {display: grid;grid-template-areas: "nav nav nav""sidebar content ads""footer footer footer";grid-template-rows: 80px 1fr 120p…

美观快速的react 的admin框架

系统特色: - 🎨 精心设计的UI主题系统,提供优雅的配色方案和视觉体验 - 📦 丰富完整的组件库,包含大量开箱即用的高质量组件 - 🔨 详尽的组件使用示例,降低开发者的学习成本 - &#x1f680…

【C++】 string底层封装的模拟实现

目录 前情提要Member functions —— 成员函数构造函数拷贝构造函数赋值运算符重载析构函数 Element access —— 元素访问Iterator —— 迭代器Capacity —— 容量sizecapacityclearemptyreserveresize Modifiers —— 修改器push_backappendoperator(char ch)operator(const …

计算机网络相关知识小结

计算机网络 1.计算机网络:独立计算机,通信线路连接,实现资源共享 2.组成:资源子网和通信子网 3.拓扑分类 4.范围:LAN, MAN. WAN 5、有线和无线 6.按照方向:单工、双工,全双工 7.传输对象方式&a…

16-CSS3新增选择器

知识目标 掌握属性选择器的使用掌握关系选择器的使用掌握结构化伪类选择器的使用掌握伪元素选择器的使用 如何减少文档内class属性和id属性的定义,使文档变得更加简洁? 可以通过属性选择器、关系选择器、结构化伪类选择器、伪元素选择器。 1. 属性选择…