日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

零基础 从 yolo8 入门计算机视觉超简单:物体识别、图像分类、轨迹追踪、姿势识别

發布時間:2023/12/24 windows 40 coder
生活随笔 收集整理的這篇文章主要介紹了 零基础 从 yolo8 入门计算机视觉超简单:物体识别、图像分类、轨迹追踪、姿势识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄
  • 安裝 Ultralytics
  • 訓練
  • 模型驗證
  • 預測 & 識別
  • 導出
  • 追蹤
  • 圖像分割提取
  • 分類
  • 姿勢識別
  • 軌跡生成

Ultralytics YOLOv8 是備受好評的實時目標檢測和圖像分割模型,主要功能是物體識別、分割圖片物體、分類、姿態識別和跟蹤等。Ultralytics 支持使用 CPU、GPU 進行訓練,支持 x64、arm64 等 CPU 架構,支持蘋果的 M1/M2 芯片,支持在邊緣設備中訓練和使用。

Ultralytics 對于個人免費,使用 【AGPL-3.0 許可】 開源協議,對于企業則需要付費。

Ultralytics 是框架的名稱,YOLOv8 是該框架默認攜帶的模型的版本號,框架默認會自帶多種用途模型,我們一般會選擇在官方的模型上做訓練。

Ultralytics YOLOv8 的物體識別功能很強大,如下圖所示,能夠準確識別圖片中化了妝的妹子為 person(人類),甚至把床也識別出來了。

使用 Ultralytics,一般會經歷以下過程:

  • 訓練(Train)模式:在自定義或預加載的數據集上微調您的模型。
  • 驗證(Val)模式:訓練后進行校驗,以驗證模型性能。
  • 預測(Predict)模式:在真實世界數據上釋放模型的預測能力。
  • 導出(Export)模式:以各種格式使模型準備就緒,部署至生產環境。
  • 跟蹤(Track)模式:將您的目標檢測模型擴展到實時跟蹤應用中。
  • 基準(Benchmark)模式:在不同部署環境中分析模型的速度和準確性。

所以,本文也會按照該順序,逐步講解。

安裝 Ultralytics

一般來說,直接使用 pip 安裝即可。

# 從PyPI安裝ultralytics包
pip install ultralytics

官方文檔的安裝方式是最詳細的,其它安裝方式直接參考官方文檔即可。

官方安裝文檔:https://docs.ultralytics.com/zh/quickstart/#ultralytics

安裝 ultralytics 之后,在項目中使用 YOLO 名稱引入 ultralytics:

from ultralytics import YOLO

ultralytics 默認是從運行目錄中讀寫數據集、訓練模型的,這樣可能會比較亂。

可以在程序啟動時,修改配置運行配置:

# 模型和訓練模塊,核心
from ultralytics import YOLO
# 設置模塊
from ultralytics import settings

# 更新設置
settings.update({'runs_dir': './' , 'tensorboard': False})

settings 也可以導出配置,或者從文件中加載配置:

    def load(self):
        """Loads settings from the YAML file."""
        super().update(yaml_load(self.file))

    def save(self):
        """Saves the current settings to the YAML file."""
        yaml_save(self.file, dict(self))

    def update(self, *args, **kwargs):
        """Updates a setting value in the current settings."""
        super().update(*args, **kwargs)
        self.save()

    def reset(self):
        """Resets the settings to default and saves them."""
        self.clear()
        self.update(self.defaults)
        self.save()

settings 可以設置的全部配置如下:

名稱 示例值 數據類型 描述
settings_version '0.0.4' str Ultralytics settings 版本
datasets_dir '/path/to/datasets' str 存儲數據集的目錄
weights_dir '/path/to/weights' str 存儲模型權重的目錄
runs_dir '/path/to/runs' str 存儲實驗運行的目錄
uuid 'a1b2c3d4' str 當前設置的唯一標識符
sync True bool 是否將分析和崩潰同步到HUB
api_key '' str Ultralytics HUB API Key
clearml True bool 是否使用ClearML記錄
comet True bool 是否使用Comet ML進行實驗跟蹤和可視化
dvc True bool 是否使用DVC進行實驗跟蹤和版本控制
hub True bool 是否使用Ultralytics HUB集成
mlflow True bool 是否使用MLFlow進行實驗跟蹤
neptune True bool 是否使用Neptune進行實驗跟蹤
raytune True bool 是否使用Ray Tune進行超參數調整
tensorboard True bool 是否使用TensorBoard進行可視化
wandb True bool 是否使用Weights & Biases記錄

訓練

ultralytics 中常見的文件格式有兩種,模型以 .pt 結尾,模型或數據集以 .yaml 結尾。

可以基于官方模型進行訓練,或者從已有模型進行訓練,甚至在沒有模型的情況下訓練出自己的模型。

如果已經有模型,則無需再次訓練。

官方文檔的 demo 如下:

下面的代碼不能直接啟動。

from ultralytics import YOLO

# 加載一個模型
model = YOLO('yolov8n.yaml')  # 從YAML建立一個新模型
model = YOLO('yolov8n.pt')  # 加載預訓練模型(推薦用于訓練)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # 從YAML建立并轉移權重

# 訓練模型
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)

官方的 yolov8n.pt 模型和 coco128.yaml 數據集,主要是人、動物、常見物體,可用于物體識別。

如果選擇使用官方模型,則第一次使用時,會自動下載 yolov8n.pt 到代碼所在目錄。

我們先來看看 .train() 訓練模型時的參數。epochs 表示訓練多少輪,一般 10 輪即可,100輪需要非常久的!imgsz 表示圖片大小,當數據集的圖片大小太大時,可以適當降低像素,官方的數據集圖片大小是 640*480 ,已經提前處理好大小了。

coco128.yaml 是官方提供的數據集合,有 128 張圖片,在程序首次運行時,會自動從官方倉庫中拉取數據集存儲到 datasets/coco128 下面,其中里面包含了一些圖片和標注。當然,我們也可以從開源社區中獲取更多的數據集,以及自己制作數據集,用來訓練模型。

然后再回到加載模型這里。

我們通過官方配置文件,從零訓練出一個模型:

from ultralytics import YOLO

# 加載一個模型
model = YOLO('yolov8n.yaml')  # 從YAML建立一個新模型

# 訓練模型
results = model.train(data='coco128.yaml', epochs=10, imgsz=640)

由于筆者只有 AMD 5600G,是集成顯卡,因此跑起來特別慢。

如果你有指定的多個,可以在訓練時指定:

results = model.train(data='coco128.yaml', epochs=10, imgsz=640, device=0)

如果不指定,框架會自動選擇 GPU。

可能筆者是 AMD 的 CPU,也有可能是因為不支持集成顯卡,所以筆者是使用 CPU 訓練的,超級慢。

訓練出的模型會存儲在 detect 目錄下。其它兩種方式訓練的模型也是如此,都會在 detect 目錄下。

我們也可以導入已有的模型:

# 加載官方預訓練模型
# model = YOLO('yolov8n.pt')
# 訓練過的模型
model = YOLO('detect/train/weights/best.pt') 

在使用 .train() 訓練模型時,可以傳遞很多參數,全部參數說明如下:

描述
model None 模型文件路徑,例如 yolov8n.pt, yolov8n.yaml
data None 數據文件路徑,例如 coco128.yaml
epochs 100 訓練的輪次數量
patience 50 早停訓練的等待輪次
batch 16 每批圖像數量(-1為自動批大小)
imgsz 640 輸入圖像的大小,以整數表示
save True 保存訓練檢查點和預測結果
save_period -1 每x輪次保存檢查點(如果<1則禁用)
cache False True/ram, disk 或 False。使用緩存加載數據
device None 運行設備,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers 8 數據加載的工作線程數(如果DDP則為每個RANK)
project None 項目名稱
name None 實驗名稱
exist_ok False 是否覆蓋現有實驗
pretrained True (bool 或 str) 是否使用預訓練模型(bool)或從中加載權重的模型(str)
optimizer 'auto' 使用的優化器,選擇范圍=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verbose False 是否打印詳細輸出
seed 0 隨機種子,用于可重復性
deterministic True 是否啟用確定性模式
single_cls False 將多類數據作為單類訓練
rect False 矩形訓練,每批為最小填充整合
cos_lr False 使用余弦學習率調度器
close_mosaic 10 (int) 最后輪次禁用馬賽克增強(0為禁用)
resume False 從最后檢查點恢復訓練
amp True 自動混合精度(AMP)訓練,選擇范圍=[True, False]
fraction 1.0 訓練的數據集比例(默認為1.0,即訓練集中的所有圖像)
profile False 在訓練期間為記錄器分析ONNX和TensorRT速度
freeze None (int 或 list, 可選) 在訓練期間凍結前n層,或凍結層索引列表
lr0 0.01 初始學習率(例如 SGD=1E-2, Adam=1E-3)
lrf 0.01 最終學習率 (lr0 * lrf)
momentum 0.937 SGD動量/Adam beta1
weight_decay 0.0005 優化器權重衰減5e-4
warmup_epochs 3.0 熱身輪次(小數ok)
warmup_momentum 0.8 熱身初始動量
warmup_bias_lr 0.1 熱身初始偏差lr
box 7.5 框損失增益
cls 0.5 cls損失增益(根據像素縮放)
dfl 1.5 dfl損失增益
pose 12.0 姿態損失增益(僅限姿態)
kobj 2.0 關鍵點obj損失增益(僅限姿態)
label_smoothing 0.0 標簽平滑(小數)
nbs 64 標稱批大小
overlap_mask True 訓練期間掩碼應重疊(僅限分割訓練)
mask_ratio 4 掩碼降采樣比率(僅限分割訓練)
dropout 0.0 使用dropout正則化(僅限分類訓練)
val True 訓練期間驗證/測試

模型驗證

前一小節中,我們使用了官方帶有 128 張圖片的 coco128.yaml 數據集進行訓練,訓練完成后,需要進行模型驗證,以便在 coco128.yaml 數據集上驗證訓練過的模型的準確性。

此外,數據集也分為多種:

  • 訓練集(Training Set):用于訓練和調整模型參數。
  • 驗證集(Validation Set):用于驗證模型精度和調整模型參數。
  • 測試集(Test Set):用于驗證模型的泛化能力。

對于模型驗證這一部分,官方文檔的描述不多,同時本文作為入門文章,不會深入講解這些細節,所以我們只需要記得自行訓練的模型,都加上模型驗證的代碼模板即可。

在已經訓練的模型中驗證的模板如下:

from ultralytics import YOLO

# 加載訓練后的模型
model = YOLO('detect/train3/weights/best.pt')

# 驗證模型
metrics = model.val()  # 無需參數,數據集和設置記憶
metrics.box.map    # map50-95
metrics.box.map50  # map50
metrics.box.map75  # map75
metrics.box.maps   # 包含每個類別的map50-95列表

一般,在訓練之后立即驗證:

from ultralytics import YOLO

model = YOLO('yolov8n.pt')  # 加載預訓練模型(推薦用于訓練)

# 訓練模型
results = model.train(data='coco128.yaml', epochs=10, imgsz=640)

# 驗證模型
metrics = model.val()  # 無需參數,數據集和設置記憶
metrics.box.map    # map50-95
metrics.box.map50  # map50
metrics.box.map75  # map75
metrics.box.maps   # 包含每個類別的map50-95列表

驗證結果:

前面提到過,coco128.yaml 數據集主要是人、動物和常見物體的圖片,因此控制臺列出了每種標記(person 人類、car 汽車等) 的識別驗證結果。

當然,我們是入門階段,這些信息對我們作用不大。

預測 & 識別

來到了激動人心的階段,我們可以使用現有的模型或官方模型對圖片進行識別。

你可以將下面兩張圖片下載保存:

下面兩張圖片,是代碼識別后的結果,會自動將圖片中識別到的物體標記名稱以及使用矩形框選出來。

from ultralytics import YOLO
from PIL import Image
# 加載訓練后的模型
model = YOLO('detect/train3/weights/best.pt')


# 導入并識別圖片,results 是處理后的結果
results = model(['img1.jpg', 'img2.jpg'])

# 保存處理后的圖片到目錄中
i = 0
for r in results:
    i += 1
    im_array = r.plot()  # 繪制包含預測結果的BGR numpy數組
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL圖像
    im.save('results/' + str(i) + '.jpg')  # 保存圖像

當然,我們也可以在處理圖片之前預覽圖片:

im.show()  # 彈出窗口,預覽圖像
im.save('results/' + str(i) + '.jpg')  # 保存圖像

如果只需要獲取識別信息,不需要處理圖片,那么可以這樣打印信息:

from ultralytics import YOLO
from PIL import Image

# 加載訓練后的模型
model = YOLO('detect/train3/weights/best.pt')

# 導入并識別圖片,results 是處理后的結果
results = model(['img1.jpg', 'img2.jpg'])

# 處理結果列表
for result in results:
    boxes = result.boxes  # 邊界框輸出的 Boxes 對象
    masks = result.masks  # 分割掩碼輸出的 Masks 對象
    keypoints = result.keypoints  # 姿態輸出的 Keypoints 對象
    probs = result.probs  # 分類輸出的 Probs 對象
    print("圖片邊框")
    print(boxes)
    print("分割掩碼")
    print(masks)
    print("姿勢輸出")
    print(keypoints)
    print("分類輸出")
    print(probs)

注意,上面的結果除了邊框有值,其它都是 None,因為我們只識別圖片,并沒有做分類、切割、姿勢識別等。

前面提到,results 是處理之后的結果,results 是一個 Results 對象,Results 對象具有的屬性如下:

屬性 類型 描述
orig_img numpy.ndarray 原始圖像的numpy數組。
orig_shape tuple 原始圖像的形狀,格式為(高度,寬度)。
boxes Boxes, 可選 包含檢測邊界框的Boxes對象。
masks Masks, 可選 包含檢測掩碼的Masks對象。
probs Probs, 可選 包含每個類別的概率的Probs對象,用于分類任務。
keypoints Keypoints, 可選 包含每個對象檢測到的關鍵點的Keypoints對象。
speed dict 以毫秒為單位的每張圖片的預處理、推理和后處理速度的字典。
names dict 類別名稱的字典。
path str 圖像文件的路徑。

Results具有以下方法:

方法 返回類型 描述
__getitem__() Results 返回指定索引的Results對象。
__len__() int 返回Results對象中的檢測數量。
update() None 更新Results對象的boxes, masks和probs屬性。
cpu() Results 將所有張量移動到CPU內存上的Results對象的副本。
numpy() Results 將所有張量轉換為numpy數組的Results對象的副本。
cuda() Results 將所有張量移動到GPU內存上的Results對象的副本。
to() Results 返回將張量移動到指定設備和dtype的Results對象的副本。
new() Results 返回一個帶有相同圖像、路徑和名稱的新Results對象。
keys() List[str] 返回非空屬性名稱的列表。
plot() numpy.ndarray 繪制檢測結果。返回帶有注釋的圖像的numpy數組。
verbose() str 返回每個任務的日志字符串。
save_txt() None 將預測保存到txt文件中。
save_crop() None 將裁剪的預測保存到save_dir/cls/file_name.jpg
tojson() None 將對象轉換為JSON格式。

除了本地圖片外,ultralytics 還支持視頻流,可以從本地或網絡中導入要識別的資源。對于視頻流的處理,本文的后續章節再介紹。

ultralytics 支持識別的其它資源:

來源 參數 類型 備注
image 'image.jpg' strPath 單個圖像文件。
URL 'https://ultralytics.com/images/bus.jpg' str 圖像的 URL 地址。
screenshot 'screen' str 截取屏幕圖像。
PIL Image.open('im.jpg') PIL.Image RGB 通道的 HWC 格式圖像。
OpenCV cv2.imread('im.jpg') np.ndarray BGR 通道的 HWC 格式圖像 uint8 (0-255)
numpy np.zeros((640,1280,3)) np.ndarray BGR 通道的 HWC 格式圖像 uint8 (0-255)
torch torch.zeros(16,3,320,640) torch.Tensor RGB 通道的 BCHW 格式圖像 float32 (0.0-1.0)
CSV 'sources.csv' strPath 包含圖像、視頻或目錄路徑的 CSV 文件。
video? 'video.mp4' strPath 如 MP4, AVI 等格式的視頻文件。
directory? 'path/' strPath 包含圖像或視頻文件的目錄路徑。
glob ? 'path/*.jpg' str 匹配多個文件的通配符模式。使用 * 字符作為通配符。
YouTube ? 'https://youtu.be/LNwODJXcvt4' str YouTube 視頻的 URL 地址。
stream ? 'rtsp://example.com/media.mp4' str RTSP, RTMP, TCP 或 IP 地址等流協議的 URL 地址。
multi-stream? 'list.streams' strPath 一個流 URL 每行的 *.streams 文本文件,例如 8 個流將以 8 的批處理大小運行。

如果要了解每種資源的導入方式,可以打開 https://docs.ultralytics.com/zh/modes/predict/#_4

本文不再贅述所有導入方式,不過本文后續會介紹視頻流等資源識別。

導出

ultralytics 支持將訓練后的模型導出為 ONNX、 TensorRT、 CoreML 等格式,然后我們可以使用其它框架或其它語言進行調用,例如 C# 的 ML.NET 框架。

from ultralytics import YOLO

# 加載模型 .pt 文件模型
model = YOLO('path/to/best.pt')

# 導出為其它類型的模型
model.export(format='onnx')

導出為其它模型時,需要安裝對應支持包,如果本地沒有安裝過,則第一次會自動安裝。

代碼執行后,控制臺會打印出模型文件被導出到哪個位置:

ultralytics 支持將模型導出為以下格式:

格式 format 參數 模型 元數據 參數
PyTorch - yolov8n.pt ? -
TorchScript torchscript yolov8n.torchscript ? imgsz, optimize
ONNX onnx yolov8n.onnx ? imgsz, half, dynamic, simplify, opset
OpenVINO openvino yolov8n_openvino_model/ ? imgsz, half
TensorRT engine yolov8n.engine ? imgsz, half, dynamic, simplify, workspace
CoreML coreml yolov8n.mlpackage ? imgsz, half, int8, nms
TF SavedModel saved_model yolov8n_saved_model/ ? imgsz, keras
TF GraphDef pb yolov8n.pb ? imgsz
TF Lite tflite yolov8n.tflite ? imgsz, half, int8
TF Edge TPU edgetpu yolov8n_edgetpu.tflite ? imgsz
TF.js tfjs yolov8n_web_model/ ? imgsz
PaddlePaddle paddle yolov8n_paddle_model/ ? imgsz
ncnn ncnn yolov8n_ncnn_model/ ? imgsz, half

追蹤

Ultralytics 的追蹤可以處理視頻中的物體。前面筆者已經介紹了通過圖片進行物體識別,其實還支持對圖片進行姿勢識別、圖片分類、將物體從圖片中切割出來,這些等后面的章節再介紹。Ultralytics 的追蹤也支持物體識別、姿勢識別等,在本節中,筆者將介紹如何在視頻中識別和追蹤物體,在后面的章節中會介紹更多的示例。

Ultralytics YOLO 擴展了其物體檢測功能,以提供強大且多功能的物體追蹤:

  • 實時追蹤: 在高幀率視頻中無縫追蹤物體。
  • 支持多個追蹤器: 從多種成熟的追蹤算法中選擇。
  • 自定義追蹤器配置: 通過調整各種參數來定制追蹤算法,以滿足特定需求。

Ultralytics 默認有兩種追蹤器。

  • BoT-SORT - 模型文件為 botsort.yaml ,默認使用,不需要配置。
  • ByteTrack - 模型文件為bytetrack.yaml

以下代碼演示了使用 cv2 加載視頻文件,并逐幀識別圖片中的物體,然后每識別一幀,就顯示到桌面中。

from ultralytics import YOLO
import cv2

# 加載自己訓練的物體識別模型
model = YOLO('detect/train3/weights/best.pt')
# 或者使用官方訓練的物體識別模型
# model = YOLO('yolov8n.pt')

# 使用 cv2 加載視頻文件
video_path = "1.mp4"
cap = cv2.VideoCapture(video_path)

# 循環遍歷視頻幀
while cap.isOpened():
    # 從視頻讀取一幀
    success, frame = cap.read()

    if success:
        # 在幀上運行YOLOv8追蹤,持續追蹤幀間的物體
        results = model.track(frame, persist=True)

        # 在幀上展示結果
        annotated_frame = results[0].plot()

        # 使用 cv2 彈出窗口,并展示帶注釋的幀
        # 也就是一邊識別,一邊播放視頻
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # 如果按下'q'則退出循環
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # 如果視頻結束則退出循環
        break

# 釋放視頻捕獲對象并關閉顯示窗口
cap.release()
cv2.destroyAllWindows()

當然,由于筆者下載的視頻比較模糊,以及訓練的數據集不大,識別出來的物體名稱不是很理想,不過其追蹤器確實確實牛批。

圖像分割提取

圖像分割用于在識別圖片中的物體后,將物體從圖片中提取出來。

示例代碼如下:

from ultralytics import YOLO

# 加載 yolov8n-seg 模型
model = YOLO('yolov8n-seg.pt')

# 訓練模型
# results = model.train(data='coco128-seg.yaml', epochs=100, imgsz=640)

# 驗證
# ... ...

# 對圖像進行處理
results = model(['img1.jpg', 'img2.jpg'])

# 保存處理后的圖片到目錄中
i = 0
for r in results:
    i += 1
    im_array = r.save_crop(save_dir="results")

提取到的物體圖片會被存儲到:

如果不需要提取物體,由于 ultralytics 會先創建圖片蒙版,因此我們可以導出帶有物體蒙版的圖片。

from ultralytics import YOLO
from PIL import Image

# 加載 yolov8n-seg 模型
model = YOLO('yolov8n-seg.pt')

# 訓練模型
# results = model.train(data='coco128-seg.yaml', epochs=100, imgsz=640)

# 驗證
# ... ...

# 對圖像進行處理
results = model(['img1.jpg', 'img2.jpg'])

# 保存處理后的圖片到目錄中
i = 0
for r in results:
    i += 1
    im_array = r.plot()  # 繪制包含預測結果的BGR numpy數組
    im = Image.fromarray(im_array[..., ::-1])  # RGB PIL圖像
    im.save('results/' + str(i) + '.jpg')  # 保存圖像

分類

很明顯,用于分類圖片。

分類圖片需要使用官方的 yolov8n-cls.pt 模型。

官方提供了一個 mnist160 數據集,該數據集是從 0-9 的手寫圖片,因此我們訓練模型之后,也是用來做手寫數字識別的。

這里隨便寫三個數字:

由于數據量不大,因此我們可以直接訓練然后使用訓練后的模型提取圖片中的文字:

from ultralytics import YOLO

# 加載 yolov8n-cls 模型
model = YOLO('yolov8n-cls.pt')

# 訓練模型
results = model.train(data='mnist160', epochs=100, imgsz=64)

# 驗證
# ... ...

# 對圖像進行處理
results = model(['666.png'])

# 保存處理后的圖片到目錄中
i = 0
for r in results:
    r.save_txt(txt_file="results/cls"+ str(i) + '.txt')
    i += 1

因為訓練的數據集是單數字的,因此對多數字的支持有點問題。

改成大大的 6 ,再次識別:

姿勢識別

姿勢識別用于在圖片或視頻中給人體進行打點、劃線,然后追蹤人體的姿勢變化。

示例代碼如下:

import cv2
from ultralytics import YOLO

# 加載 yolov8n-pose 模型,并進行訓練
model = YOLO('yolov8n-pose.pt')
results = model.train(data='coco8-pose.yaml', epochs=10, imgsz=640)

# 打開視頻文件
video_path = "1.mp4"
cap = cv2.VideoCapture(video_path)

# 循環遍歷視頻幀
while cap.isOpened():
    # 從視頻讀取一幀
    success, frame = cap.read()

    if success:
        # 在幀上運行YOLOv8追蹤,持續追蹤幀間的物體
        results = model.track(frame, persist=True)

        # 在幀上展示結果
        annotated_frame = results[0].plot()

        # 展示帶注釋的幀
        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        # 如果按下'q'則退出循環
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # 如果視頻結束則退出循環
        break

# 釋放視頻捕獲對象并關閉顯示窗口
cap.release()
cv2.destroyAllWindows()

軌跡生成

在視頻中識別追蹤物體時,還可以對物體的運行軌跡進行追蹤。

手頭上沒有更多視頻演示,將就一下。

示例代碼如下:

from collections import defaultdict

import cv2
import numpy as np

from ultralytics import YOLO

# 加載 yolov8n.pt 模型,也可以使用其它模型
model = YOLO('yolov8n.pt')

# 打開視頻
video_path = "0.mp4"
cap = cv2.VideoCapture(video_path)

# 保存歷史記錄
track_history = defaultdict(lambda: [])

# 處理視頻的每一幀
while cap.isOpened():
    success, frame = cap.read()

    if success:
        # 追蹤
        results = model.track(frame, persist=True)

        # 讀取當前幀中物體的框
        boxes = results[0].boxes.xywh.cpu()
        # 如果未識別到圖像有框時,則忽略
        if results[0].boxes.id is None:
            continue
        # 獲取每個被追蹤的物體 id
        track_ids = results[0].boxes.id.int().cpu().tolist()

        annotated_frame = results[0].plot()

        # 繪制
        for box, track_id in zip(boxes, track_ids):
            x, y, w, h = box
            track = track_history[track_id]
            track.append((float(x), float(y))) 
            if len(track) > 30:
                track.pop(0)

            points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
            cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)

        cv2.imshow("YOLOv8 Tracking", annotated_frame)

        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

總結

以上是生活随笔為你收集整理的零基础 从 yolo8 入门计算机视觉超简单:物体识别、图像分类、轨迹追踪、姿势识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。