基于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)。
解決類別不平衡問題:在原始混淆矩陣中,某些類別可能因為樣本數較少而表現不佳,歸一化后可以避免類別數量差異對性能評估的影響。
