說到物件辨識,YOLO(You Only Look Once)是一系列基於卷積神經網路的即時目標偵測系統,非常常見也易用,且至今不斷有新版本更新。這款工具可以透過事前將大量待測物進行框選訓練,得到一個專屬於自己需求的模型,此後就能用這個模型進行特地物件的即時偵測。
例如,這個影片是來自靜宜大學資工系專任教師劉志俊的教學影片,以YOLO進行惡性腫瘤的檢測示範;在農場中進行即時的雞隻健康預測,農畜使用已經是非常常見的應用了;或者是在工業運作上,也能透過這個方法來快速檢查產品是否有缺陷;這個影片是工程師の師以戴資穎的羽球隊戰影片進行示範,並以免費的Colab來帶領讀者入門學習。YOLO是非常好用的工具,前提是你要給他足夠多「經驗」,這款AI工具就能進行監督式學習,訓練出屬於自己需要的模型。
目前YOLO版本非常多,因為官方的快速入門就以是YOLOv8進行的,因此撰風就先以此版本進行操作示範,其他版本的YOLO可以在官網查詢,詳細的原理大家可以再爬書,我希望以快速上手為主,在此篇就不加入過多艱深的說明。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331003606_0_dfeee6-1200x630.jpg)
內容索引
Toggle為何使用本地端訓練?
撰風使用YOLOv8訓練時是在本地端進行訓練,在本地端訓練相比使用Google Colab訓練來說,可以有更穩定的訓練環境,而且不會因為Colab儲存空間受限,試想把幾千張的圖片數據上傳,先不論隱私問題,光是上傳幾千張圖片就可能需要很長時間。
因此,如果你只是要練習YOLO,或是自己的電腦本身不夠好沒有GPU的話,那當然可以採用Google Colab測試,畢竟Google Colab是一個有GPU資源的免費程式平台;但如果自己本地端的電腦效能足夠的話,在本地端進行會更靈活一些。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250401005520_0_6e1639.jpg)
安裝Python
在進行YOLOv8時,安裝Python是必要的。撰風測試使用Python 3.8.10可以順利運作,而Python 3.10的版本在labelImg標記圖片時會出現bug強制關閉,因此經驗可以安裝Python 3.8.10就能順利使用labelImg進行標記。這部分我會在其他台電腦再做測試。如何設定Python環境變數,以及如果安裝多個版本的Python要如何調整優先採用的Python版本?可以參考這篇的步驟:
- 如何設定Python環境變數?如何調整預設Python版本[待寫文]
撰風測試使用Python 3.8.10可以順利運作,因此若沒有這個版本的話,可以從Python官網下載,載點如下:
- 下載Python 3.8.10:Python Release Python 3.8.10
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331022749_0_ff35e2-1200x630.jpg)
安裝Git和IDE
安裝Git和整合開發環境(IDE)在進行YOLOv8不是必要的,但有這些工具可以在操作上更容易操作。撰風本人習慣使用Visual Studio Code來作為操作介面,網路上很多是採用Anaconda或Pycharm,其實這些都是可以的。如何安裝Visual Studio Code和對應的Python設定,可以先依照之前我寫的這篇文章進行:
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2023/08/20230803011004_3.jpg)
環境設置
環境安裝的部分,可以參考深度學習實務: YOLOv9 安裝(雖然我這邊寫的是YOLOv8但環境安裝是相同的)這個影片,來自靜宜大學資工系專任教師劉志俊的教學影片。
開啟終端機
等等的指令多會在終端機進行,終端機可以選擇命令提示字元
(cmd),也可以在整合開發環境中的終端機,因為資料管理的習慣,撰風選擇在Visual Studio Code的終端機來輸入。當你第一次使用Visual Studio Code,你可以將滑鼠移到右邊區塊的下方,變色後拉出終端機區塊,也可以直接從上方⋯
>終端機
>新增終端
來開啟(快捷鍵:Ctrl+Shift+`
)。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331025345_0_293ae5-1200x630.jpg)
CUDA
利用命令提示字元(CMD)或IDE的終端機介面查詢電腦是否已經安裝CUDA,下圖以Visual Studio Code的終端機為例,輸入指令確認CUDA版本:
nvcc --version
如果還沒安裝過CUDA的話,可以從NVIDIA官網註冊後下載CUDA版本以及cuDNN,只要選擇自己電腦的作業系統和版本,即可得到對應的載點。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331025744_0_0a5421-1200x630.jpg)
GPU版本
在下載Pytorch之前,需要查看電腦GPU版本,這是為了等等在選擇安裝pytorch時需要的資訊。在終端機輸入以下指令:
nvidia-smi
如果你的電腦並沒有GPU的話,會不建議在本地端進行YOLO的訓練,因為這可能會非常的緩慢,甚至失敗,此時可以改用Google Colab具有免費GPU的平台來操作,但就是大量資料上傳和免費的限制可能會影響訓練。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331025826_0_732886-1200x630.jpg)
Pytorch
如果不確定自己電腦是否安裝過Pytorch,可以在終端機輸入以下指令:
pip show torch
在Pytorch官網,選擇自己電腦對應的版本,得到相對應的pip安裝指令,輸入到終端機中進行安裝。舉例而言,我的電腦得到對應的pytorch指令如下:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Pytorch的檔案非常大,安裝需要等待一陣子。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331025920_0_b1bd20-1200x630.jpg)
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331025946_0_8fe1eb-1200x630.jpg)
安裝YOLOv8
在完成圖片標註後,下一步是安裝YOLOv8,並準備進行模型訓練。Ultralytics提供的YOLOv8可以透過在終端機輸入以下指令直接安裝:
pip install ultralytics
安裝完成後,可以在終端機輸入以下指令測試是否安裝成功:
yolo -V
若安裝成功,會顯示YOLOv8的版本號,例如我的版本就顯示8.3.99
。
![[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例) [Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)](https://img.jfsblog.com/2025/03/20250331030050_0_eb7877-1200x630.jpg)
下載初始模型
YOLOv8提供多種不同大小的模型,每個模型的權重檔案都不同,可以根據需求選擇適合的初始模型:
Model | size (pixels) | mAPval 50-95 | Speed CPU ONNX (ms) | Speed A100 TensorRT (ms) | params (M) | FLOPs (B) |
---|---|---|---|---|---|---|
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv8s | 640 | 44.9 | 128.4 | 1.20 | 11.2 | 28.6 |
YOLOv8m | 640 | 50.2 | 234.7 | 1.83 | 25.9 | 78.9 |
YOLOv8l | 640 | 52.9 | 375.2 | 2.39 | 43.7 | 165.2 |
YOLOv8x | 640 | 53.9 | 479.1 | 3.53 | 68.2 | 257.8 |
如果電腦記憶體有限,建議採yolov8n.pt
或 yolov8s.pt
。
資料蒐集
創建資料夾
在使用YOLO進行訓練時,首先需要建立適當的資料夾結構並蒐集足夠的圖片作為訓練數據。一般來說,YOLO的資料夾結構建議如下:
dataset/
├ images/
│ ├ train/ # 訓練集圖片
│ ├ val/ # 驗證集圖片
│ └ test/ # 測試集圖片(可選)
└ labels/
├ train/ # 訓練集標註檔(.txt 格式)
├ val/ # 驗證集標註檔(.txt 格式)
└ test/ # 儲存測試集標註檔(可選)
蒐集圖片數量
圖片數量取決於訓練的需求與模型的複雜度,通常建議每個類別至少1,000張圖片,理想狀況下5,000~10,000張會提供更好的泛化能力。如果數據較少,可以考慮資料增強來提升數據量,這部分可以參考訓練模型時有相應的說明。
訓練集、驗證集、測試集
一般而言,訓練數據會依以下比例進行劃分:
類型 | 用途 | 資料比例 |
---|---|---|
訓練集 (train) | 提供模型學習 | 80% |
驗證集 (val) | 用於調整超參數,評估模型在訓練過程中的表現 | 10% |
測試集 (test) | 最終評估模型泛化能力,若沒有額外的測試需求可省略 | 10% |
數量上有些差異是沒有關係的,只是一個參考比例和數量。
資料標記
在使用YOLO進行訓練時,我們需要為圖片創建標註,以讓模型學習物件的位置信息,常見的標註工具有labelImg或線上的RoboFlow,能夠將物件的框標註(Bounding Box)轉換為YOLO格式的.txt
檔案。這部分我把它寫成單獨的文章,避免本篇篇幅過長。
- labelImg標記方法
- RoboFlow標記方法
新增dataset.yaml
配置檔案
在dataset/
資料夾內,使用文字編輯器(如 Visual Studio Code 或 Notepad++)新建dataset.yaml
,並填入以下內容:
path: dataset # 數據集的根目錄
train: images/train # 訓練集
val: images/val # 驗證集
test: images/test # 測試集
nc: 3 # 你的類別數量 (請修改為實際的數量)
names: ["class1", "class2", "class3"] # 類別名稱
path
:數據集的根目錄train
:訓練圖片的路徑val
:驗證圖片的路徑test
:測試圖片的路徑(不參與訓練,但可用來評估模型)nc
:物件類別數量names
:類別名稱(根據你的數據集修改)- 路徑可以改用絕對路徑
訓練模型
當 dataset.yaml
配置完成後,即可使用YOLOv8進行訓練。
基本訓練指令
YOLOv8 有許多不同類型的初始模型,yolov8n.pt
是YOLOv8的Nano版本,是最小且最快的模型。將以下指令輸入終端機可進行訓練:
yolo task=detect mode=train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=512 batch=8 workers=0
資料增強訓練指令
如果數據量較少,可以透過資料增強來增加數據量,例如調整hsv_*, flipud, fliplr, mosaic, mixup等參數。將以下指令輸入終端機可進行訓練:
yolo task=detect mode=train model=yolov8n.pt data=dataset.yaml epochs=100 imgsz=512 batch=8 workers=0 augment=True
訓練參數調整
訓練時可以調整設定,例如電腦設備的記憶體不足,可以縮小 imgsz
或是 batch
值。其他參考整理如下,可點擊展開查看:
基本設定
參數 | 作用 | 預設值 |
---|---|---|
task | 設定任務類型(detect =物件偵測、segment =實例分割、classify =圖像分類) | detect |
mode | 訓練模式(train =訓練、val =驗證、predict =推論) | train |
model | 使用的模型(如 yolov8n.pt 、yolov8s.pt ) | – |
data | 設定數據集配置檔案(如 dataset.yaml ) | – |
epochs | 訓練回合數 | 100 |
batch | 批次大小 | 16 |
imgsz | 訓練圖片大小(如 640 ) | 640 |
device | 設定使用 cpu 或特定 GPU (0 , 1 , …) | None (自動偵測) |
優化與學習率
參數 | 作用 | 預設值 |
---|---|---|
optimizer | 優化器(SGD , Adam , AdamW ) | auto |
lr0 | 初始學習率 | 0.01 |
momentum | 動量 | 0.937 |
weight_decay | L2 正則化權重衰減 | 0.0005 |
早停與驗證
參數 | 作用 | 預設值 |
---|---|---|
patience | 訓練多少 epochs 無提升則停止 | 50 |
val | 是否執行驗證(True / False ) | True |
save | 是否儲存最佳模型 | True |
資料增強
參數 | 說明 | 預設值 |
---|---|---|
hsv_h | 色相變化範圍 | 0.015 |
hsv_s | 飽和度變化範圍 | 0.7 |
hsv_v | 亮度變化範圍 | 0.4 |
degrees | 旋轉角度(±10 度) | 10 |
translate | 平移範圍(10%) | 0.1 |
scale | 縮放範圍(50%) | 0.5 |
shear | 斜切變換(±2°) | 2 |
perspective | 透視變形 | 0.0005 |
flipud | 垂直翻轉機率 20% | 0.2 |
fliplr | 水平翻轉機率 50% | 0.5 |
mosaic | 使用 mosaic(1.0 = 100%) | 1.0 |
mixup | 使用 mixup 增強 | 0.2 |
測試模型
訓練完成後,會生成資料夾runs/train/exp/weights/
,裡面會有best.pt
,代表著此次訓練後的最佳模型,模型的表現請參考訓練結果確認待撰寫,如果水準符合自己預期就可以到此為止,如果還不滿意可以繼續訓練。為了繼續訓練的需求,撰風希望可以將測試結果的框選標註以 YOLO 格式儲存,這樣就能將偵測失誤的部分再以LabelImg重新調整框選範圍,以便再次放入訓練。這樣可以透過save_txt=True
來儲存標註:
yolo task=detect mode=predict model=runs/train/exp/weights/best.pt source=images/test save=True save_txt=True
save=True
:儲存標註圖片(會畫出偵測框)save_txt=True
:儲存偵測框標註到YOLO格式的.txt
檔案,方便labelImg進行調整
測試結果會儲存到runs/detect/predict/
內:
runs/detect/predict/
├ test_image1.jpg # 帶有框選的測試圖片
├ test_image1.txt # YOLO 格式標註
├ test_image2.jpg
├ test_image2.txt
└ classes.txt # 把 train/ 裡面的 classes.txt 複製貼到這裡
把train/裡面的classes.txt複製貼到這裡,然後將其中所有生成.txt
標註檔案用LabelImg再次開啟調整框選範圍,完成後再把一部分.jpg放入images/train/
資料夾中,對應的.txt放入labels/train/
中;另一部份.jpg放入images/val/
資料夾中,對應的.txt放入labels/val/
中。蒐集一些新的測試圖片放入images/test/
中,然後重複訓練模型的步驟,直到模型符合自己的需求。
即時偵測
經過訓練後,我們得到了best.pt
,我們可以將此模型直接套用到Python中,用以進行圖片的偵測、影片的偵測,或是將電腦連接網路攝影機進行即時的偵測。
- 圖片偵測:使用
cv2.imread()
讀取圖片並進行偵測 - 影片偵測:使用
cv2.VideoCapture()
讀取影片並輸出新影片 - 即時攝影機偵測:
cv2.VideoCapture(0)
讀取即時影像
在此會需要用到OpenCV模組,開啟IDE,在終端機輸入以下指令安裝 cv2:
pip install opencv-python
圖片偵測
這段程式碼會載入best.pt
,並對單張圖片進行物件偵測,最後顯示偵測結果。請把best.pt
置換成自己訓練出來的模型的路徑。
from ultralytics import YOLO
import cv2
# 載入 YOLOv8 訓練好的模型
model = YOLO("best.pt")
# 讀取圖片
image_path = "test.jpg" # 請替換成你的圖片路徑
image = cv2.imread(image_path)
# 進行偵測
results = model(image)
# 繪製偵測結果
for result in results:
for box in result.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0]) # 邊界框
conf = box.conf[0].item() # 信心度
cls = int(box.cls[0].item()) # 類別索引
# 畫框
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
label = f"Class {cls}: {conf:.2f}"
cv2.putText(image, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 顯示圖片
cv2.imshow("YOLOv8 Image Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
影片偵測
這段程式碼會對影片進行物件偵測,並將結果輸出到新影片。請把best.pt
置換成自己訓練出來的模型的路徑。
from ultralytics import YOLO
import cv2
# 載入模型
model = YOLO("best.pt")
# 讀取影片
video_path = "input.mp4" # 請替換成你的影片路徑
cap = cv2.VideoCapture(video_path)
# 取得影片的基本資訊
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 設定輸出影片
output_path = "output.mp4"
fourcc = cv2.VideoWriter_fourcc(*"mp4v") # 設定影片格式
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# 進行偵測
results = model(frame)
# 繪製偵測結果
for result in results:
for box in result.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0])
conf = box.conf[0].item()
cls = int(box.cls[0].item())
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
label = f"Class {cls}: {conf:.2f}"
cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 寫入影片
out.write(frame)
# 顯示畫面
cv2.imshow("YOLOv8 Video Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放資源
cap.release()
out.release()
cv2.destroyAllWindows()
即時攝影機偵測
這段程式碼會啟動攝影機進行即時偵測,在運行程式之前,請將電腦的相機打開,或是連接一個Webcam。請把best.pt
置換成自己訓練出來的模型的路徑。
from ultralytics import YOLO
import cv2
# 載入模型
model = YOLO("best.pt")
# 開啟攝影機 (0 代表內建攝影機,1, 2... 代表外接攝影機)
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, frame = cap.read()
if not success:
print("無法讀取影像,請檢查攝影機。")
break
# 進行偵測
results = model(frame)
# 繪製偵測結果
for result in results:
for box in result.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0]) # 邊界框
conf = box.conf[0].item() # 信心度
cls = int(box.cls[0].item()) # 類別索引
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
label = f"Class {cls}: {conf:.2f}"
cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 顯示畫面
cv2.imshow("YOLOv8 Webcam Detection", frame)
# 按 'q' 離開
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 釋放攝影機資源
cap.release()
cv2.destroyAllWindows()
相關列表
Python學習紀錄
主題 | 文章 |
編譯器與IDE |
|
|
|
常用模組 |
|
影像處理 |
|
網路爬蟲 |
|
圖形介面 |
|
檔案打包 |
|
主題 | 文章 |
影像應用 |
|
機器學習 |
|
深度學習 |
|
語言分析 |
|
圖像生成 |
|
小小作品 |
常用網站 |
[ 編輯 ] 筆記 » 程式語言 » Python |
Python|HTML|CSS|JavaScript|Blender|Unreal Engine |
Facebook留言
Wordpress留言 (0)