YOLO 是目前最快速也是最精準的圖型辨識模型,烏俄戰爭的無人機就是使用此模型。
一開始 YOLO 只是一篇論文,到了 2025 年 進化到了 v12 版本,其歷史如下。
| 版本 | 發布日期 | 主要特點與改進 |
|---|---|---|
| YOLOv1 | 2015 年 | 首次提出單次前向傳播的物體偵測方法 |
| YOLOv2 | 2016 年 | 引入批量正規化和錨框機制,提升準確度 |
| YOLOv3 | 2018 年 | 多尺度偵測和更複雜的骨幹網絡,進一步改善性能 |
| YOLOv4 | 2020 年 | 結合 CSPNet 和其他技術,提升速度和準確度 |
| YOLOv5 | 2020 年 | 由 Ultralytics 開發,提供 PyTorch 支援,易於部署 |
| YOLOv6 | 2022 年 | 針對工業應用進行優化,提升小物體偵測能力 |
| YOLOv7 | 2022 年 | 引入可訓練的 bag-of-freebies,達到新的實時偵測最佳表現 |
| YOLOv8 | 2023 年 | 支援物體偵測、分割、姿勢估計等多任務,提供多種模型變體 |
| YOLOv9 | 2024 年 | 引入 Programmable Gradient Information (PGI) 和 GELAN 架構,提升效率和準確度 |
| YOLOv10 | 2024 年 | 優化模型架構,提升速度和效率,適用於端到端部署 |
| YOLOv11 | 2024 年 | 引入 C3k2、SPPF 和 C2PSA 等新組件,提升特徵提取能力 |
| YOLOv12 | 2025 年 | 最新版本,進一步提升性能和效率 |
原由
1991 年魔鬼終結者 2 這部電影出現很多驚人的橋段,如下圖所示。
一部 “機器” 竟然能判斷這個是 “人類”,甚至還能丈量尺寸大小。這畫面對當時的人非常震憾,也覺得這個導演是個天才。
丈量尺寸的方法,是有紅外線等方式精準測量。但判讀 “人類” 這件事經過 30 年的研發,才發展出可以 “大約” 辨識 “人類” 的演算法。

安裝
自 v8 開始直接由 pip 安裝 ultralytics 套件即可,不用像 v7 版還要手動下載 github 原始碼那麼麻煩。
但是 ultralytics 會自動安裝無法使用 cuda 的 Pytorch,所以請先安裝可用 cuda 的 Pytorch,然後才安裝 ultralytics。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130 --no-cache-dir
pip install ultralytics opencv-python
偵測
直接在 Terminal 執行如下指令,此指令會自動下載 “yolov12n.pt” 權重,偵測的結果放置在 ./run/detect/predict目錄下。
yolo predict model=yolov12n.pt source="https://ultralytics.com/images/bus.jpg"
其它權重下載
上述的 yolov12n.pt 又稱為預訓練權重(pretrain),由官網使用 coco 資料集所訓練出來的權重。除了可以用來偵測 80 種物件外,也可以用來訓練其它資料集的權重,可以到如下網址下載。
https://github.com/ultralytics/ultralytics 網站往下拉就有預訓練權重可供下載。預訓練權重有 yolov8n、yolov8s、yolov8m、yolov8l、yolov8x 共 5 種,愈往下愈精準但速度愈慢。請將下載的 .pt 檔儲存在專案目錄下。
使用程式碼偵測
使用程式碼偵測
import numpy as np
# import torch
# print(torch.cuda.is_available())
from ultralytics import YOLO
import cv2
import pylab as plt
# 載入模型
model = YOLO("yolo12s.pt")
# 讀取圖片
img = cv2.imdecode(np.fromfile("dog.jpg", dtype=np.uint8), cv2.IMREAD_UNCHANGED)
img=img[:,:,::-1].copy()
# 辨識圖片
results = model(img)[0] # 取得第一個結果
# 取得辨識結果
boxes = results.boxes # 邊界框
probs = results.probs # 各類別機率
classes = results.names # 類別名稱映射
# 繪制邊框
for box in boxes:
x1, y1, x2, y2 = box.xyxy.cpu().numpy().astype(int)[0]
conf = box.conf.cpu().numpy()[0]
cls = int(box.cls.cpu().numpy()[0])
label = results.names[cls]
cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2)
cv2.putText(img, f"{label}:{conf:.2f}", (x1, y1-10),
cv2.FONT_HERSHEY_SIMPLEX, 5.0, (0,255,0), 10)
plt.axis("off")
plt.imshow(img)
plt.show()
todo
使用程式碼偵測
import YOLO 產生 model 模型,然用 model.predict() 即可偵測,傳入裏面的參數,可以是圖片檔名,也可以是讀入記憶体的 cv2 格式。
results[0].boxes.cls 是偵測到的物件索引編號,為 torch 格式。results[0].boxes.xyxy 則是所有物件方框的座標。
import platform
import cv2
import numpy as np
from PIL import Image, ImageFont, ImageDraw
from ultralytics import YOLO
import pylab as plt
def text(img, text, xy=(0, 0), color=(0, 0, 0), size=12):
pil = Image.fromarray(img)
s = platform.system()
if s == "Linux":
font =ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc', size)
elif s == "Darwin":
font = ImageFont.truetype('....', size)
else:
font = ImageFont.truetype('simsun.ttc', size)
ImageDraw.Draw(pil).text(xy, text, font=font, fill=color)
return np.array(pil)
model=YOLO('yolov8x.pt')
img=cv2.imdecode(np.fromfile("street.jpg", dtype=np.uint8), cv2.IMREAD_UNCHANGED)
img=img[:,:,::-1].copy()#一定要 copy,否則無法畫框線
#results=model.predict("street.jpg")
results=model.predict(img)
print('物件種類 : ',results[0].boxes.cls)#cls : class
print('座標 : ',results[0].boxes.xyxy)
#print(results[0].names)#列出80種物件的索引及名稱
# for i in results[0].boxes.cls:
# idx=int(i.cpu().numpy())
# print(idx, results[0].names[idx])
names=[results[0].names[int(i.cpu().numpy())] for i in results[0].boxes.cls]
boxes=results[0].boxes.xyxy
for box, name in zip(boxes, names):
box=box.cpu().numpy()
print(name, box)
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), 1)
img=text(img, name, (x1, y1-20), color=(0,0,255), size=16)
plt.imshow(img)
plt.show()

