【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)。
解决类别不平衡问题:在原始混淆矩阵中,某些类别可能因为样本数较少而表现不佳,归一化后可以避免类别数量差异对性能评估的影响。
相关文章:
【YOLO系列】基于YOLOv8的无人机野生动物检测
基于YOLOv8的无人机野生动物检测 1.前言 在野生动物保护、生态研究和环境监测领域,及时、准确地检测和识别野生动物对于保护生物多样性、预防人类与野生动物的冲突以及制定科学的保护策略至关重要。传统的野生动物监测方法通常依赖于地面巡逻、固定摄像头或无线传…...
一文详细讲解Python(详细版一篇学会Python基础和网络安全)
引言 在当今数字化时代,Python 作为一种简洁高效且功能强大的编程语言,广泛应用于各个领域,从数据科学、人工智能到网络安全等,都能看到 Python 的身影。而网络安全作为保障信息系统和数据安全的关键领域,其重要性不言…...
NFS 重传次数速率监控
这张图展示的是 NFS 重传次数速率监控,具体解释如下: 1. 指标含义 监控指标 node_nfs_rpc_retransmissions_total 统计 NFS(网络文件系统)通信中 RPC(远程过程调用)的重传次数,rate(node_nfs_…...
【Java】Hibernate的一级缓存
Session是有一个缓存, 又叫Hibernate的一级缓存 session缓存是由一系列的Java集合构成的。当一个对象被加入到Session缓存中,这个对象的引用就加入到了java的集合中,以后即使应用程序中的引用变量不再引用该对象,只要Session缓存不被清空&…...
学习笔记--(6)
import numpy as np import matplotlib.pyplot as plt from scipy.special import erfc# 设置参数 rho 0.7798 z0 4.25 # 确保使用大写 Z0,与定义一致def calculate_tau(z, z_prime, rho, s_values):return np.log(rho * z * z_prime * s_values / 2)# 定义 chi_…...
【QT5 网络编程示例】TCP 通信
文章目录 TCP 通信 TCP 通信 QT主要通过QTcpSocket 和 QTcpServer两个类实现服务器和客户端的TCP 通信。 QTcpSocket 是 Qt 提供的套接字类,看用于建立、管理和操作 TCP 连接。 常用方法 connectToHost(host, port):连接到指定服务器。disconnectFro…...
JWT在线解密/JWT在线解码 - 加菲工具
JWT在线解密/JWT在线解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.top 或者直接进入JWT 在线解密/解码 https://www.orcc.top/tools/jwt 进入功能页面 使用 输入对应的jwt内容,点击解码按钮即可...
【Linux】用户向硬件寄存器写入值过程理解
思考一下,当我们咋用户态向寄存器写入一个值,这个过程是怎么样的呢?以下是应用程序通过标准库函数(如 write()、ioctl() 或 mmap())向硬件寄存器写入值的详细过程,从用户空间到内核再到硬件的完整流程&…...
【Easylive】convertVideo2Ts 和 union 方法解析
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 这两个方法是 transferVideoFile 中用于视频文件处理的核心辅助方法,下面我将结合它们在 transferVideoFile 中的使用场景进行详细解释。 1. convertVideo2Ts 方法解析 方法签…...
飞桨PP系列新成员PP-DocLayout开源,版面检测加速大模型数据构建,超百页文档图像一秒搞定
背景介绍 文档版面区域检测技术通过精准识别并定位文档中的标题、文本块、表格等元素及其空间布局关系,为后续文本分析构建结构化上下文,是文档图像智能处理流程的核心前置环节。随着大语言模型、文档多模态及RAG(检索增强生成)等…...
Java 锁机制详解:用“厕所门”和“防盗门”轻松理解多线程同步
Java 锁机制详解:用“厕所门”和“防盗门”轻松理解多线程同步 目录 锁的作用synchronized 关键字ReentrantLockReadWriteLockStampedLock避免死锁的诀窍总结与对比 锁的作用 生活中的例子:公共厕所一次只能进一人,门上的“有人/无人”标志…...
关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题:
关于修改 vue Element admin、若依, 等后台管理系统模板的一些全局样式问题: 1、修改左侧菜单和顶部(菜单)的背景色、把背景色改为炫酷的背景图。 1)上传图片 src/assets/images/menu-icon.png、 src/assets/images/…...
并发多线程八股
并发多线程 1.Java里面的线程和操作系统的线程一样吗?2.Java的线程安全在三个方面体现:3.保证数据一致性的方案4.线程创建的方式1)Thread类2)Runnable接口3)Callable接口和FutureTask4)线程池(e…...
飞速(FS)HPC无损组网:驱动AI高性能计算网络转型升级
案例亮点 部署低功耗、高密度飞速(FS)以太网交换机,紧凑机身设计节省70%机房空间,冗余电源和智能风扇确保系统高可用性,有效优化散热和降低能耗。 支持25G/40G/100G多速率自适应交换架构,构建超低时延企业…...
Nest.js学习路径
作为前端开发工程师,系统学习Nest.js可以从以下步骤入手,结合其模块化架构、依赖注入和TypeScript特性,逐步掌握核心功能。以下是结合多个资源的综合学习路径: 1. 环境搭建与项目初始化 安装CLI工具 使用Nest.js官方CLI快速生成项…...
git 常用操作整理
一.git 的概念 Git 是一个分布式版本控制系统,用于跟踪文件的更改历史,帮助开发者管理代码的版本。以下是关于 Git 的一些基本概念: 1. 仓库(Repository) - **本地仓库**:在你的计算机上存储的项目文件及…...
JAVA数据库增删改查
格式 Main.java(测试类) package com.example;import com.example.dao.UserDao; import com.example.model.User;public class Main {public static void main(String[] args) {UserDao userDao new UserDao();// 测试添加用户System.out.println(" 添加用户 ");Us…...
上海某海外视频平台Android高级工程师视频一面
问的问题比较细,有很多小细节在里面,平时真不一定会注意到,做一个备忘: 1.Object类里面有哪些方法? Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写1. 常用方法 1…...
前后端数据序列化:从数组到字符串的旅程(附优化指南)
🌐 前后端数据序列化:从数组到字符串的旅程(附优化指南) 📜 背景:为何需要序列化? 在前后端分离架构中,复杂数据类型(如数组、对象)的传输常需序列化为字符…...
idea报错:程序包不存在
这里的程序包是我们项目里自己写的,idea却报错不存在。 解决方法: 参考这位大佬的方法,OK。...
【TVM教程】使用 TVMC Micro 执行微模型
Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/ 作者:Andrew Reusch, Mehrdad Hessar 本教程介绍如何用 C runtime 自动调优模型。 安装 microTVM Python 依赖项…...
spring boot 整合redis
1.在pom文件中添加spring-boot-starter-data-redis依赖启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.编写三个实体类 RedisHash("p…...
进程间信号
进程间信号 信号的认识信号的产生进程对信号的处理机制普通信号的处理机制实时信号的处理机制 信号集操作函数信号的捕捉 信号的认识 信号的概念: 信号是一种软件中断,它用于通知进程一个异步事件的发生。 这些事件可能来自系统内部(如硬…...
2011-2019年各省地方财政国债还本付息支出数据
2011-2019年各省地方财政国债还本付息支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政粮油物资储备管理等事务 4、范围:31省 5、指标说明:地方财政的国债…...
2025华为软件精英挑战赛2600w思路分享
这里写自定义目录标题 得分展示对象定义请求价值计算时间同步删除操作完整思路 得分展示 对象定义 // 将一个磁盘划分为多个基于标签聚合的区块 class Block{ public:int tag 0; // 区块标签int start_pos;int end_pos;int id;int use_size 0;int v;// 为区块确定范围Bloc…...
WEB安全-CTF中的PHP反序列化漏洞
什么是序列化? 简单来说序列化是将数组或对象转换成字符串的过程,这样的好处是利于对象存储与传输,在PHP中,序列化函数是serialize(),反序列化是unserialize() 无类序列化 无类序列化顾名思义就是不包含class的序列…...
【论文阅读】Co2l: Contrastive continual learning
原文链接:[2106.14413] Co$^2$L: Contrastive Continual Learning 阅读本文前,需要对持续学习的基本概念以及面临的问题有大致了解,可参考综述: Wang L, Zhang X, Su H, et al. A comprehensive survey of continual learning: …...
OpenMCU(五):STM32F103时钟树初始化分析
概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化,AHB总线时钟,APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树,如下所示: 时钟源选择 从STM32F103的时钟树框图,我们可以…...
ISIS报文
IS-IS 报文 目录 IS-IS 报文 一、报文类型与功能 二、报文结构解析 三、核心功能特性 四、典型应用场景 五、抓包数据分析 六、总结 IS-IS(中间系统到中间系统)协议报文是用于链路状态路由协议中网络设备间交换路由信息的关键载体,其设…...
【Android】BluetoothSocket.connect () 的实现与协议栈交互源码解析
本文以 Android 蓝牙框架中的BluetoothSocket.connect()方法为切入点,深入剖析 Android 设备与远程蓝牙设备建立连接的全流程。从 Java 层的 API 调用出发,逐步追踪至 JNI 层的接口转发,最终进入 Buedroid 协议栈(RFCOMM/L2CAP 层),揭示蓝牙连接的核心机制。重点解析了权…...
