【YOLOv8】物件偵測與識別測試

 

Yolo V8使用 pytorch 開發的,因此這邊採用Pycharm Community開發工具。
並進行Pytorch下載引入


開發測試環境Windows 11 電腦
Acer Predator PH315-54-72VQ 電競筆記型電腦
處理器:Intel® Core™ i7-11800H
記憶體:32GB DDR4 3200MHz Memory
硬碟:512GB PCIe NVMe SSD
顯卡:NVIDIA® GeForce RTX™ 3070

記得先在Pycharm創建好Project-based的venv,這邊採用Python3.8。
之後依序執行已下指令把Pytorch需要的給裝一裝,安裝對應 CUDA 11.8 的 PyTorch 套件。
不要採用Anaconda內建虛擬環境提供的不支援GPU的Pytorch。

電腦有GPU顯卡用這下載方式的指令
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 --no-cache-dir

電腦無GPU顯卡只能用CPU跑用這下載方式的指令
pip install torch torchvision torchaudio --no-cache-dir

YOLO在演進到6之後版本就交由ultralytics這間公司團隊繼續精進研發。
到了第八版算是成熟也十分多產品在使用的版本。(目前最新還有出到11的樣子)

pip install ultralytics

CUDA 與 cuDNN 的關係與角色
  • CUDA(Compute Unified Device Architecture) 是 NVIDIA 開發的一套平行運算平台與程式設計模型,底層是用 C/C++ 所實作,允許開發者撰寫程式碼,並將運算密集的任務交由 GPU(圖形處理器) 處理。
  • CUDA 提供一組 API,可以讓像 Python、C++ 等高階語言編寫的程式,透過 CUDA 將資料與任務分派到 GPU 執行。
  • 當 Python 呼叫如 TensorFlow、PyTorch 等深度學習框架中的 GPU 運算時,其實是透過這些框架內部的 CUDA binding,間接地呼叫 CUDA API 來執行。
  • cuDNN(CUDA Deep Neural Network library) 是 NVIDIA 專為深度學習打造的 高效能 GPU 加速函式庫,它是建立在 CUDA 基礎上的一層抽象。是 cuda 跟 GPU 溝通的橋樑,裡面封裝了龐大豐富的函數。


可以用簡短的程式確認目前電腦環境可否啟用cuda GPU

import torch
print(torch.cuda.is_available())



前置確認程式

import torch
print("是否可用 GPU?", torch.cuda.is_available())
print("PyTorch 用的是哪個 CUDA 版本?", torch.version.cuda)
print("目前 GPU 裝置:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "無")

cmd 也可以打上nvidia-smi來顯示確認資訊




pip show ultralytics
Version: 8.3.165



測試程式範例

import platform
from PIL import Image, ImageFont, ImageDraw
import numpy as np
from ultralytics import YOLO
import cv2
import pylab as plt
def text(img, txt, xy=(0,0), color=(0,0,0), size=12):
    pil=Image.fromarray(img)#cv2 轉 Pillow 格式
    s=platform.system()
    if s == "Linux":
        font=ImageFont.truetype("/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc", size)
    elif s == "Darwin": #Mac OS
        font = ImageFont.truetype("......", size)
    else:#Windows OS
        font = ImageFont.truetype("simsun.ttc", size)#中易宋體
    draw=ImageDraw.Draw(pil)
    draw.text(xy, txt, font=font, fill=color)
    return np.array(pil)#Pillow 轉成 opencv cv2 格式

model=YOLO('yolov8x.pt')

img=cv2.imdecode(np.fromfile("Bus_Bike_Car.jpg", dtype=np.uint8), cv2.IMREAD_COLOR)
img=img[:,:,::-1].copy()#必用copy,不然原先的 numpy格式 會是 readonly
results=model.predict(img)
boxes=results[0].boxes.xyxy

print(results)
print("種類",results[0].boxes.cls)
print("座標",results[0].boxes.xyxy)

names=[results[0].names[int(i.cpu().numpy())] for i in results[0].boxes.cls]#有顯卡的用的指令
for box, name in zip(boxes, names):
    box=box.cpu().numpy()#有顯卡的用的指令
    x1 = int(box[0])
    y1 = int(box[1])
    x2 = int(box[2])
    y2 = int(box[3])
    img=cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 3)
    img=text(img, name, (x1, y1-20), color=(255,0,255), size=150)
plt.imshow(img)
plt.show()

權重(.pt)下載位置->預設程式碼執行也會自動去幫忙下載抓到專案指定目錄中
https://github.com/ultralytics/ultralytics 
權重有分很多種不同等級精準度的,愈後面愈精準,但速度愈慢。
yolov8n(tiny)
yolov8s(small)
yolov8m(median)
yolov8l(large)
yolov8x(exterl large) ->在此採用此預訓權重

預訓練權重pt檔案,是由 coco資料集訓練出來的,可辨識約 80 種物件。
80個類別如下

0 person                    1 bicycle                 2 car
3 motorcycle                4 airplane                5 bus
6 train                     7 truck                   8 boat
9 traffic light            10 fire hydrant          11 stop sign
12 parking meter           13 bench                 14 bird
15 cat16 dog                   17 horse
18 sheep                   19 cow                   20 elephant
21 bear                    22 zebra                 23 giraffe
24 backpack                25 umbrella              26 handbag
27 tie                     28 suitcase              29 frisbee
30 skis                    31 snowboard             32 sports ball
33 kite                    34 baseball bat          35 baseball glove
36 skateboard              37 surfboard             38 tennis racket
39 bottle                  40 wine glass            41 cup
42 fork43 knife                 44 spoon
45 bowl                    46 banana                47 apple
48 sandwich                49 orange                50 broccoli
51 carrot                  52 hot dog               53 pizza
54 donut                   55 cake                  56 chair
57 couch                   58 potted plant          59 bed
60 dining table61 toilet                62 TV
63 laptop                  64 mouse                 65 remote
66 keyboard67 cell phone            68 microwave
69 oven                    70 toaster               71 sink
72 refrigerator            73 book                  74 clock
75 vase                    76 scissors              77 teddy bear
78 hair drier              79 toothbrush


效果如下
根據YOLO 採用微軟COCO資料集訓練出80個類別
可細到車子、公車甚至坐在裡面的人

邊框與顯示字體大小可自己調整程式碼來校正




https://www.pexels.com/photo/woman-on-bicycle-and-man-on-scooter-on-road-10751746/

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header