Python | OpenCV YOLOv8 資料集準備
📑 目錄
📚 前言
在上一篇 YOLOv8 介紹與環境安裝 中,我們完成了環境設定並測試了預訓練模型。
這一篇進入自訓練的第一步:準備自己的資料集。
YOLOv8 對資料集的格式要求非常嚴格,如果格式錯誤,訓練時就會直接報錯。因此我們必須一步一步按照正確流程來做。
完整流程如下:
走完這些步驟後,你的專案目錄會變成這樣:
1 | project/ |
🗃️ 步驟 1:蒐集圖片
與分類任務不同,物件偵測的原始圖片不需要分類別放進不同資料夾,全部放在同一個資料夾即可。
以下是使用 Bing 搜尋引擎批量下載圖片的範例:
1 | # download_images.py |

圖:使用 BingImageCrawler 批次下載 cat 與 dog 圖片至 raw_images 目錄
⚠️ 注意版權問題,建議僅用於研究與學習目的。
💻 步驟 2:使用 LabelImg 進行標註
LabelImg 的完整安裝、操作步驟與已知的 PyQt5 崩潰修法,已在 LabelImg 標註工具實戰 篇完整說明,這裡只補充 YOLOv8 工作流程中特有的設定:
標註時需要注意以下重點:
- Open Dir:選擇
raw_images/資料夾 - Change Save Dir:選擇
raw_labels/資料夾(建議先分開存放) - 儲存格式:務必切換成 YOLO 格式(不是 Pascal VOC)
- 每張圖片標註完後,會產生一個同名的
.txt檔案

圖:在 LabelImg 中設定 Open Dir 為 raw_images/、Change Save Dir 為 raw_labels/,並切換儲存格式為 YOLO
💡 若想減少手動標記的工作量,可先參考 YOLOv8 預標籤 篇,讓模型自動產生標籤草稿,再用 LabelImg 修正。
✂️ 步驟 3:自動分割訓練集與驗證集
標註完成後,使用以下腳本自動切分資料(推薦 80% 訓練集、20% 驗證集):
YOLOv8 要求的結構,需要的是 images/ 和 labels/ 分開的結構,以下是對應的版本:
1 | dataset/ |
重要規則:
images/與labels/的子目錄結構必須完全對應- 圖片檔名與標籤檔名必須相同(只有副檔名不同)
- 例如
images/train/0001.jpg→labels/train/0001.txt - 訓練集與驗證集的比例建議為 80% / 20%
1 | # split_dataset.py |

圖:自動依比例將圖片與標籤隨機分割為訓練集與驗證集,並建立對應的目錄結構
🧠 步驟 4:產生 data.yaml 設定檔
data.yaml 是告訴 YOLOv8 資料集位置與類別定義的設定檔,訓練時必須指定。跑完 split_dataset.py 後建立,放在專案根目錄(與 dataset/ 同層):
1 | project/ |
1 | # create_yaml.py |
產生的 data.yaml 內容範例:
1 | path: ./dataset |
⚠️
names的順序就是標註時的 class_id,必須與標籤檔案中的 ID 完全對應,不能錯位。

圖:執行 create_yaml.py 自動產生 data.yaml 設定檔
💻 步驟 5:驗證資料集格式
在開始訓練前,務必執行驗證,避免格式錯誤導致訓練失敗:
1 | # verify_dataset.py |

圖:逐一檢查圖片與標籤的對應關係、格式正確性及 class_id 範圍,輸出驗證結果
✨ 補充說明
YOLO txt 格式在 LabelImg 實際產出的座標是怎麼計算的,方便理解標籤檔的內容。
每張圖片對應一個同名 .txt,每行一個物件:
1 | <class_id> <x_center> <y_center> <width> <height> |
所有座標都是相對比例(0.0 ~ 1.0),不是像素值。以一張 640×480 的圖片為例,貓(class_id=0)的邊界框左上角在 (100, 80)、右下角在 (300, 280):
1 | x_center = (100 + 300) / 2 / 640 = 0.3125 |
若同一張圖片有多個物件,每行寫一個:
1 | 0 0.3125 0.375 0.3125 0.4167 |
💡 若圖片中沒有任何標註物件,對應的
.txt應為空檔案,而非不存在。
⚠️ 注意事項
- 類別 ID 從 0 開始:標籤檔案中的 class_id 必須從 0 開始,且不能有跳號。
- 圖片與標籤一定要一一對應:若有圖片沒有對應的
.txt,YOLOv8 訓練時會報錯。 - 座標必須是相對比例:絕對像素座標不是有效的 YOLO 格式,必須換算成 0.0~1.0 的比例值。
- 建議圖片解析度一致:不同解析度的圖片混在一起沒有問題,YOLOv8 會自動 resize,但解析度差異太大可能影響訓練效果。
🎯 結語
資料集準備是 YOLOv8 自訓練最重要也最容易出錯的步驟。
只要確實按照「蒐集 → 標註 → 分割 → 產生 yaml → 驗證」的順序來做,並在最後一步用 verify_dataset.py 確認無誤,就可以放心進入訓練階段。
下一步是 YOLOv8 預標籤(Pre-Label),學習如何利用預訓練模型自動產生標籤草稿,減少手動標記的工作量。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。