【YOLO 物件偵測教學】#02 環境建置:用 Ultralytics 跑你的第一個 YOLO 模型

測驗:YOLO 環境建置與第一個模型

共 5 題,點選答案後會立即顯示結果

1. 安裝 Ultralytics 套件時,會自動安裝哪些依賴?

  • A. torch、tensorflow、numpy
  • B. torch、opencv-python、numpy
  • C. keras、opencv-python、pandas
  • D. torch、pillow、scipy

2. YOLOv8 模型名稱中的字母代表什麼意義?例如 yolov8n、yolov8s、yolov8m

  • A. 訓練資料集的版本編號
  • B. 模型的發布日期代碼
  • C. 模型大小,n=nano, s=small, m=medium 等
  • D. 支援的影像解析度等級

3. 使用 Python API 取得偵測結果時,box.xyxy 的座標格式代表什麼?

  • A. 左上角 (x1, y1) 和右下角 (x2, y2) 座標
  • B. 中心點 (cx, cy) 和寬高 (w, h)
  • C. 四個角落的 x 座標
  • D. 相對於圖片的百分比位置

4. YOLOv8 預訓練模型使用哪個資料集訓練,可以辨識多少種物件?

  • A. ImageNet,1000 種物件
  • B. COCO,80 種物件
  • C. PASCAL VOC,20 種物件
  • D. Open Images,500 種物件

5. 當信心度(confidence)為 0.72 時,這代表模型對這個偵測的把握程度如何?

  • A. 很確定(0.9 以上)
  • B. 還蠻確定(0.7-0.9)
  • C. 有點不確定(0.5-0.7)
  • D. 可能是誤判(0.5 以下)

前言

上一篇我們認識了 YOLO 的核心概念,了解它如何一次看完整張圖片來偵測物件。這篇要動手做了——安裝 Ultralytics 套件,然後用預訓練模型跑一張圖片,看看 YOLO 能偵測出什麼。

讀完這篇,你會學到:

  • 安裝 Ultralytics 套件和相關依賴
  • 使用預訓練模型進行物件偵測
  • 理解 YOLO 的輸入輸出格式
  • 用 Python 和 CLI 兩種方式執行偵測

環境需求

在開始之前,先確認你的環境符合以下條件:

Python 版本

Python 3.8 以上(建議 3.10 或 3.11Code language: CSS (css)

檢查你的 Python 版本:

python --version
# 輸出範例:Python 3.11.4
Code language: CSS (css)

GPU 支援(可選但建議)

YOLO 可以純 CPU 跑,但 GPU 會快很多。如果你有 NVIDIA 顯卡,確認已安裝 CUDA:

nvidia-smi

看到類似這樣的輸出就表示 GPU 可用:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.104.05   Driver Version: 535.104.05   CUDA Version: 12.2    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
+-------------------------------+----------------------+----------------------+

沒有 GPU 也沒關係,Ultralytics 會自動偵測並使用 CPU。

安裝 Ultralytics

基本安裝

最簡單的方式,一行搞定:

pip install ultralytics

這會安裝 Ultralytics 套件和所有必要的依賴,包括:

  • torch(PyTorch,深度學習框架)
  • opencv-python(影像處理)
  • numpy(數值運算)

驗證安裝

安裝完成後,確認可以正常 import:

from ultralytics import YOLO
print("Ultralytics 安裝成功!")
Code language: JavaScript (javascript)

或用 CLI 檢查版本:

yolo version
# 輸出範例:8.0.200
Code language: CSS (css)

下載預訓練模型

Ultralytics 提供多種預訓練模型,差別在於大小和準確度:

模型 參數量 速度 準確度
YOLOv8n 3.2M 最快 較低
YOLOv8s 11.2M 中等
YOLOv8m 25.9M 中等 較高
YOLOv8l 43.7M
YOLOv8x 68.2M 最慢 最高

字母代表大小:n(nano)、s(small)、m(medium)、l(large)、x(extra large)。

新手建議從 yolov8n 開始,輕量又快速。

模型會自動下載

第一次使用時,Ultralytics 會自動下載模型到 ~/.cache/ultralytics/ 目錄:

from ultralytics import YOLO

# 第一次執行會自動下載 yolov8n.pt
model = YOLO("yolov8n.pt")
Code language: PHP (php)

你也可以手動下載:

yolo predict model=yolov8n.pt source=https://ultralytics.com/images/bus.jpg
Code language: JavaScript (javascript)

CLI 使用方式

Ultralytics 提供了方便的命令列工具,不用寫程式就能跑偵測。

基本語法

yolo predict model=模型檔 source=輸入來源

偵測圖片

yolo predict model=yolov8n.pt source=image.jpg

偵測資料夾內所有圖片

yolo predict model=yolov8n.pt source=./images/

偵測影片

yolo predict model=yolov8n.pt source=video.mp4

使用網路攝影機

yolo predict model=yolov8n.pt source=0

調整信心閾值

只顯示信心度超過 0.5 的偵測結果:

yolo predict model=yolov8n.pt source=image.jpg conf=0.5

輸出結果

預設結果會存到 runs/detect/predict/ 目錄。你可以指定輸出位置:

yolo predict model=yolov8n.pt source=image.jpg project=output name=my_result

結果會存到 output/my_result/

Python API 使用方式

如果你想在程式中使用 YOLO,Python API 更靈活。

最簡單的範例

from ultralytics import YOLO

# 載入預訓練模型
model = YOLO("yolov8n.pt")

# 執行偵測
results = model("image.jpg")

# 顯示結果
results[0].show()
Code language: PHP (php)

儲存結果圖片

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model("image.jpg")

# 儲存標註後的圖片
results[0].save("output.jpg")
Code language: PHP (php)

取得偵測資訊

這是最重要的部分——如何讀懂偵測結果:

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model("image.jpg")

# 取得第一張圖的結果
result = results[0]

# 遍歷每個偵測到的物件
for box in result.boxes:
    # 取得 bounding box 座標 (x1, y1, x2, y2)
    coords = box.xyxy[0].tolist()
    x1, y1, x2, y2 = coords

    # 取得信心度(0-1 之間)
    confidence = box.conf[0].item()

    # 取得類別 ID
    class_id = int(box.cls[0].item())

    # 取得類別名稱
    class_name = result.names[class_id]

    print(f"偵測到:{class_name}")
    print(f"  位置:({x1:.0f}, {y1:.0f}) 到 ({x2:.0f}, {y2:.0f})")
    print(f"  信心度:{confidence:.2%}")
    print()
Code language: PHP (php)

輸出範例:

偵測到:person
  位置:(42, 85) 到 (198, 520)
  信心度:92.34%

偵測到:car
  位置:(320, 200) 到 (580, 380)
  信心度:87.65%
Code language: CSS (css)

解讀偵測結果

讓我們深入理解 YOLO 的輸出格式。

Bounding Box(邊界框)

YOLO 用矩形框住偵測到的物件。座標有兩種格式:

xyxy 格式(左上角和右下角):

box.xyxy  # tensor([[x1, y1, x2, y2]])
Code language: CSS (css)
  • (x1, y1):左上角座標
  • (x2, y2):右下角座標

xywh 格式(中心點和寬高):

box.xywh  # tensor([[cx, cy, w, h]])
Code language: CSS (css)
  • (cx, cy):中心點座標
  • (w, h):寬度和高度

Confidence(信心度)

表示模型對這個偵測的把握程度,範圍 0 到 1:

box.conf  # tensor([0.9234])
Code language: CSS (css)
  • 0.9 以上:很確定
  • 0.7-0.9:還蠻確定
  • 0.5-0.7:有點不確定
  • 0.5 以下:可能是誤判

Class(類別)

YOLOv8 預訓練模型使用 COCO 資料集,能辨識 80 種物件:

# 類別 ID(整數)
box.cls  # tensor([0])  # 0 = person

# 查詢類別名稱
result.names[0]  # 'person'
Code language: PHP (php)

常見類別對照:

  • 0: person
  • 1: bicycle
  • 2: car
  • 3: motorcycle
  • 5: bus
  • 7: truck
  • 16: dog
  • 17: cat

完整列表可以這樣查看:

from ultralytics import YOLO
model = YOLO("yolov8n.pt")
print(model.names)
Code language: JavaScript (javascript)

完整範例:偵測圖片中的所有物件

把以上學到的串起來:

from ultralytics import YOLO

def detect_objects(image_path, conf_threshold=0.5):
    """偵測圖片中的物件並列出結果"""

    # 載入模型
    model = YOLO("yolov8n.pt")

    # 執行偵測,設定信心閾值
    results = model(image_path, conf=conf_threshold)

    # 取得結果
    result = results[0]

    # 統計各類別數量
    counts = {}

    for box in result.boxes:
        class_id = int(box.cls[0].item())
        class_name = result.names[class_id]
        confidence = box.conf[0].item()

        # 統計
        counts[class_name] = counts.get(class_name, 0) + 1

        # 印出詳細資訊
        coords = box.xyxy[0].tolist()
        print(f"{class_name}: {confidence:.1%} @ {[int(c) for c in coords]}")

    print(f"\n總共偵測到 {len(result.boxes)} 個物件")
    print("各類別數量:", counts)

    # 儲存標註後的圖片
    result.save("detected.jpg")
    print("結果已儲存到 detected.jpg")

# 使用範例
detect_objects("street.jpg")
Code language: PHP (php)

常見問題

Q: 第一次執行很慢?

A: 第一次會下載模型和編譯 CUDA kernel,之後就快了。

Q: 出現 CUDA out of memory?

A: 試試較小的模型(如 yolov8n)或降低圖片大小:

results = model("image.jpg", imgsz=640)  # 預設 640,可以改小
Code language: PHP (php)

Q: 偵測不到想要的物件?

A: 預訓練模型只能辨識 COCO 資料集的 80 種物件。如果你要偵測其他物件(如特定零件、產品),需要自己訓練模型,這是後續文章的內容。

Q: 如何提高偵測準確度?

A: 換用較大的模型(如 yolov8m 或 yolov8l),但速度會變慢。

小結

這篇我們學會了:

  1. 安裝 Ultralytics:一行 pip install ultralytics 搞定
  2. 選擇模型:n/s/m/l/x 代表不同大小,越大越準但越慢
  3. CLI 用法yolo predict model=模型 source=來源 快速測試
  4. Python API:載入模型、執行偵測、解讀結果
  5. 輸出格式:bounding box 座標、confidence 信心度、class 類別

下一篇,我們會學習如何準備自己的訓練資料集,為訓練自訂模型做準備。


延伸資源

進階測驗:YOLO 環境建置與第一個模型

測驗目標:驗證你是否能在實際情境中應用所學。
共 5 題,包含情境題與錯誤診斷題。

1. 你需要在一個資源有限的嵌入式裝置上部署物件偵測功能,需要在速度和準確度之間取得平衡。你應該選擇哪個模型? 情境題

  • A. yolov8x – 追求最高準確度
  • B. yolov8n – 最輕量快速,適合資源受限環境
  • C. yolov8l – 大模型通常更穩定
  • D. yolov8m – 中等大小一定是最佳選擇

2. 小華執行偵測程式時出現以下錯誤訊息,最可能的原因是什麼? 錯誤診斷

RuntimeError: CUDA out of memory. Tried to allocate 256.00 MiB
  • A. Python 版本不相容
  • B. Ultralytics 套件安裝不完整
  • C. GPU 記憶體不足,應換用較小的模型或降低圖片大小
  • D. 輸入的圖片格式不支援

3. 你想從偵測結果中篩選出所有信心度超過 80% 的「person」類別。根據文件內容,以下哪段程式碼的邏輯是正確的? 情境題

for box in result.boxes: class_id = int(box.cls[0].item()) class_name = result.names[class_id] confidence = box.conf[0].item() # 篩選條件寫在這裡
  • A. if class_name == “person” and confidence > 80:
  • B. if class_name == “person” and confidence > 0.8:
  • C. if class_id == “person” and confidence > 0.8:
  • D. if result.names == “person” and box.conf > 80:

4. 小明想偵測工廠產線上的特定零件瑕疵,但執行預訓練模型後完全偵測不到任何物件。根據文件內容,最可能的原因是什麼? 錯誤診斷

  • A. 圖片解析度太低
  • B. 預訓練模型只能辨識 COCO 資料集的 80 種物件,特定零件不在其中
  • C. 需要先執行 nvidia-smi 啟用 GPU
  • D. 信心閾值設定太低導致過濾掉所有結果

5. 你需要用 CLI 偵測 images 資料夾中的所有圖片,只顯示信心度超過 0.6 的結果,並將輸出存到 results/test1 目錄。以下哪個指令是正確的? 情境題

  • A. yolo predict model=yolov8n.pt source=images conf=60 output=results/test1
  • B. yolo detect model=yolov8n.pt source=./images/ conf=0.6 save=results/test1
  • C. yolo predict model=yolov8n.pt source=./images/ threshold=0.6 project=results name=test1
  • D. yolo predict model=yolov8n.pt source=./images/ conf=0.6 project=results name=test1

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *