【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.pswp.cn/news/899627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899627.shtml
英文地址,請注明出處:http://en.pswp.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. 屬性選擇…