【YOLOv8】物件偵測與識別測試
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 cat 16 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 fork 43 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 table 61 toilet 62 TV 63 laptop 64 mouse 65 remote 66 keyboard 67 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/
留言
張貼留言