YOLOv8 使用範例可以拆成兩段:先用 Roboflow 匯出的 `data.yaml` 訓練模型,再用訓練完成的 `best.pt` 做圖片或攝影機畫面偵測。這篇保留 2023-12-15 的實作筆記,補上安裝、資料集位置、訓練程式、常見路徑錯誤,以及 OpenCV 即時偵測的拆解。
YOLOv8 訓練前要先準備什麼?
YOLOv8 訓練前需要先安裝 `ultralytics`,再準備含有 `data.yaml` 的 YOLOv8 格式資料集。`data.yaml` 會告訴訓練流程圖片資料夾、驗證資料夾與類別名稱。
先用下面指令安裝好所需的套件:
```bash
pip install ultralytics
```
然後在 Roboflow Universe 下載要訓練的素材集,格式選擇 YOLOv8。Roboflow 匯出的壓縮檔通常會包含 `data.yaml`、訓練圖片、驗證圖片與 label 檔案;Ultralytics 的訓練 API 會透過 `data.yaml` 找到資料集路徑與類別設定(Ultralytics,存取日期:2026-08-28)。

Roboflow 下載後的資料夾應該怎麼放?
Roboflow 下載後的資料夾要和訓練程式放在容易引用的位置,並確認 `data.yaml` 路徑正確。最簡單的做法是把資料集解壓縮到專案同層,讓程式直接讀取 `./data.yaml`。
把裡面的資料(含 `data.yaml`)解壓縮在同層資料夾下,如圖:

這個結構的好處是訓練程式可以用 `model.train(data='./data.yaml', epochs=300, imgsz=640)` 直接讀取設定,不需要在程式裡拼很長的絕對路徑。若資料夾移動過,先打開 `data.yaml` 檢查 `train`、`val` 與 `names` 是否仍對應正確。
YOLOv8 訓練程式怎麼寫?
YOLOv8 訓練程式可以用 `YOLO('yolov8.yaml').load('yolov8n.pt')` 建立模型並載入預訓練權重。接著呼叫 `train()` 指定 `data.yaml`、訓練週期與輸入影像尺寸,再用 `val()` 驗證模型。
接著直接執行下面的程式,YOLOv8 會自動下載所需要的 `yolov8.yaml` 及 `yolov8n.pt`:
```python
import multiprocessing
import os
from ultralytics import YOLO
os.environ["CUDA_LAUNCH_BLOCKING"] = "1"
def my_function():
model = YOLO("yolov8.yaml").load("yolov8n.pt")
model.train(data="./data.yaml", epochs=300, imgsz=640)
model.val(data="./data.yaml")
if name == "main":
multiprocessing.freeze_support()
my_function()
```
Ultralytics 官方 Python 文件也提供相同方向的流程:建立或載入 YOLO 模型、呼叫 `train()` 訓練、呼叫 `val()` 驗證,再用模型物件進行預測(Ultralytics,存取日期:2026-08-28)。這裡沿用當時筆記中的 `yolov8.yaml` 與 `yolov8n.pt`,不延伸到其他新版模型命名。
datasets_dir 錯誤要怎麼處理?
YOLOv8 若找不到資料集,通常要檢查 Ultralytics 設定檔裡的 `datasets_dir`。資料集路徑不是訓練腳本猜出來的,`data.yaml` 和 Ultralytics 全域設定都可能影響實際讀取位置。
這時候可能會出現錯誤如下,因為資料集放在哪邊也是剛剛才自動下載或解壓縮好的,所以要打開設定檔案,設定資料集的正確位置 `datasets_dir`。

我的排查順序通常是:
| 檢查項目 | 要確認的內容 |
|---|---|
| `data.yaml` 位置 | 程式中的 `data='./data.yaml'` 是否真的讀得到檔案 |
| `train` / `val` 路徑 | `data.yaml` 裡的相對路徑是否對到圖片資料夾 |
| `datasets_dir` | Ultralytics 設定檔是否指向資料集所在目錄 |
| 執行工作目錄 | 終端機目前目錄是否和程式預期一致 |
看到這些訊息就代表成功開始建模型了:

訓練完成後如何載入 best.pt 做偵測?
YOLOv8 訓練完成後,推論重點是載入自己的 `best.pt`。`best.pt` 是訓練過程保留下來的模型權重,載入後就可以對圖片、影片或攝影機畫面呼叫模型進行預測。
重點是在這行:
```python
model = YOLO("best.pt")
```
這行在載入我們建好的模型:
```python
results = model(image, show=False, verbose=False)
```
`model` 這個預測方法有很多可控制的參數,例如要不要直接秀出圖片、要不要存圖片等等。Ultralytics 官方文件說明,預測結果會回傳 `Results` 物件;對物件偵測任務來說,常用欄位包含 `result.boxes`、`result.boxes.xywh`、`result.boxes.cls` 與 `result.names`(Ultralytics,存取日期:2026-08-28)。

YOLOv8 如何搭配 OpenCV 做即時攝影機偵測?
YOLOv8 搭配 OpenCV 做即時偵測時,流程是讀取攝影機畫面、縮放影像、呼叫模型預測、取出 bounding box,再用 OpenCV 畫框與標籤。`result.boxes.xywh` 可用來取得中心點、寬與高。
YOLOv8 很方便的一點是,吐出的物件如 `result`,只要 `print` 這個物件,就會有很詳細的結構和屬性意義教學,在開發上很省時間。

下面是搭配 OpenCV 即時攝影機畫面做偵測的範例。這段程式保留當時的 `VideoStream` 使用方式;如果專案沒有這個自訂模組,需要改成自己的攝影機讀取類別或 OpenCV 的 `cv2.VideoCapture()`。
```python
import VideoStream
import cv2
import numpy as np
from ultralytics import YOLO
videostream = VideoStream.VideoStream((1280, 720), 30, 0).start()
cam_quit = 0
model = YOLO("best.pt")
def detect(image):
results = model(image, show=False, verbose=False)
result = list(results)[0]
for i in range(len(result.boxes)):
r = result[i].boxes
cls = int(r.cls[0].item())
xywh = r.xywh[0].tolist()
x_center, y_center, width, height = [int(x) for x in xywh[:4]]
if width < 100 and height < 100:
x1 = int(x_center - (width / 2))
y1 = int(y_center - (height / 2))
x2 = x1 + width
y2 = y1 + height
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 3)
cv2.putText(
image,
result.names[cls],
(x1, y1),
cv2.FONT_HERSHEY_SIMPLEX,
0.8,
(0, 255, 255),
1,
cv2.LINE_AA,
)
while cam_quit == 0:
imageSource = videostream.read()
imageSource = cv2.resize(imageSource, (960, 540))
detect(imageSource)
cv2.imshow("image", imageSource)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
cam_quit = 1
videostream.stop()
cv2.destroyAllWindows()
```
這段範例有一個實務限制:只畫出寬高都小於 100 的偵測框。如果自己的任務不是小物件偵測,`if width < 100 and height < 100:` 這個條件要拿掉或改成符合應用場景的門檻。
延伸閱讀
- YOLOv8 物件偵測模型介紹:安裝、預測、訓練與輸出流程
- YOLOv8 模型訓練指標解析:IoU、mAP、Precision、Recall 與優化策略
- 使用現有模型標記新圖片:SAM、Roboflow 與 YOLO label 轉換流程
- OpenCV 圖像幾何變換教學:縮放、平移、旋轉、仿射與透視變換
- TensorFlow.js coco-ssd 物件偵測教學:瀏覽器與攝影機範例
常見問題
YOLOv8 使用範例一定要先準備 Roboflow 資料集嗎?
YOLOv8 使用範例不一定要用 Roboflow,但訓練自己的物件偵測模型時,一定要有符合 YOLO 格式的圖片與標註。Roboflow 的好處是可以直接匯出 YOLOv8 格式,減少手動整理資料夾與 label 的時間。
YOLOv8 的 `data.yaml` 是做什麼用的?
`data.yaml` 是 YOLOv8 訓練資料的入口設定檔。Ultralytics 會透過 `data.yaml` 找到訓練集、驗證集與類別名稱,所以路徑錯誤時模型通常不是壞掉,而是資料集位置沒有對齊。
`yolov8.yaml`、`yolov8n.pt` 和 `best.pt` 差在哪?
`yolov8.yaml` 描述模型結構,`yolov8n.pt` 是預訓練權重,`best.pt` 是用自己的資料訓練後保留下來的最佳權重。訓練時可以從預訓練權重開始,推論時則載入自己的 `best.pt`。
YOLOv8 找不到資料集時應該先改哪裡?
YOLOv8 找不到資料集時,先確認程式執行目錄與 `data='./data.yaml'` 是否一致,再檢查 `data.yaml` 裡的 `train` 和 `val` 路徑。若錯誤訊息指向 Ultralytics 設定檔,再調整 `datasets_dir`。
YOLOv8 可以直接吃 OpenCV 的影像陣列嗎?
YOLOv8 可以直接對 OpenCV 讀到的影像陣列做預測。Ultralytics Python API 支援圖片路徑、影片、URL、PIL 影像與 NumPy 陣列等輸入型態,因此攝影機串流可以先由 OpenCV 讀取,再交給模型推論。
參考資料
- Roboflow Universe,〈Roboflow Universe〉,存取日期:2026-08-28。
- Ultralytics,〈YOLO Python Usage〉,存取日期:2026-08-28。
- Ultralytics,〈Model Prediction with Ultralytics YOLO〉,存取日期:2026-08-28。
最後更新
2023-12-15(本文保留 2023-12-15 的實作筆記內容,並補上 GEO 結構、FAQ 與站內延伸閱讀。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2023-12-15
