說到物件辨識,YOLO(You Only Look Once)是一系列基於卷積神經網路的即時目標偵測系統,非常常見也易用,且至今不斷有新版本更新。這款工具可以透過事前將大量待測物進行框選訓練,得到一個專屬於自己需求的模型,此後就能用這個模型進行特地物件的即時偵測。

例如,這個影片是來自靜宜大學資工系專任教師劉志俊的教學影片,以YOLO進行惡性腫瘤的檢測示範;在農場中進行即時的雞隻健康預測,農畜使用已經是非常常見的應用了;或者是在工業運作上,也能透過這個方法來快速檢查產品是否有缺陷;這個影片是工程師の師以戴資穎的羽球隊戰影片進行示範,並以免費的Colab來帶領讀者入門學習。YOLO是非常好用的工具,前提是你要給他足夠多「經驗」,這款AI工具就能進行監督式學習,訓練出屬於自己需要的模型。

目前YOLO版本非常多,因為官方的快速入門就以是YOLOv8進行的,因此撰風就先以此版本進行操作示範,其他版本的YOLO可以在官網查詢,詳細的原理大家可以再爬書,我希望以快速上手為主,在此篇就不加入過多艱深的說明。

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

為何使用本地端訓練?

撰風使用YOLOv8訓練時是在本地端進行訓練,在本地端訓練相比使用Google Colab訓練來說,可以有更穩定的訓練環境,而且不會因為Colab儲存空間受限,試想把幾千張的圖片數據上傳,先不論隱私問題,光是上傳幾千張圖片就可能需要很長時間。

因此,如果你只是要練習YOLO,或是自己的電腦本身不夠好沒有GPU的話,那當然可以採用Google Colab測試,畢竟Google Colab是一個有GPU資源的免費程式平台;但如果自己本地端的電腦效能足夠的話,在本地端進行會更靈活一些。

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

安裝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] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

安裝Git和IDE

安裝Git和整合開發環境(IDE)在進行YOLOv8不是必要的,但有這些工具可以在操作上更容易操作。撰風本人習慣使用Visual Studio Code來作為操作介面,網路上很多是採用Anaconda或Pycharm,其實這些都是可以的。如何安裝Visual Studio Code和對應的Python設定,可以先依照之前我寫的這篇文章進行:

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

環境設置

環境安裝的部分,可以參考深度學習實務: YOLOv9 安裝(雖然我這邊寫的是YOLOv8但環境安裝是相同的)這個影片,來自靜宜大學資工系專任教師劉志俊的教學影片。

開啟終端機

等等的指令多會在終端機進行,終端機可以選擇命令提示字元(cmd),也可以在整合開發環境中的終端機,因為資料管理的習慣,撰風選擇在Visual Studio Code的終端機來輸入。當你第一次使用Visual Studio Code,你可以將滑鼠移到右邊區塊的下方,變色後拉出終端機區塊,也可以直接從上方>終端機>新增終端來開啟(快捷鍵:Ctrl+Shift+`)。

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

CUDA

利用命令提示字元(CMD)或IDE的終端機介面查詢電腦是否已經安裝CUDA,下圖以Visual Studio Code的終端機為例,輸入指令確認CUDA版本:

nvcc --version

如果還沒安裝過CUDA的話,可以從NVIDIA官網註冊後下載CUDA版本以及cuDNN,只要選擇自己電腦的作業系統和版本,即可得到對應的載點。

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

GPU版本

在下載Pytorch之前,需要查看電腦GPU版本,這是為了等等在選擇安裝pytorch時需要的資訊。在終端機輸入以下指令:

nvidia-smi

如果你的電腦並沒有GPU的話,會不建議在本地端進行YOLO的訓練,因為這可能會非常的緩慢,甚至失敗,此時可以改用Google Colab具有免費GPU的平台來操作,但就是大量資料上傳和免費的限制可能會影響訓練。

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

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為例)

安裝YOLOv8

在完成圖片標註後,下一步是安裝YOLOv8,並準備進行模型訓練。Ultralytics提供的YOLOv8可以透過在終端機輸入以下指令直接安裝:

pip install ultralytics

安裝完成後,可以在終端機輸入以下指令測試是否安裝成功:

yolo -V

若安裝成功,會顯示YOLOv8的版本號,例如我的版本就顯示8.3.99

[Python] YOLOv8操作步驟!訓練自己的圖像辨識模型(以Visual Studio Code為例)

下載初始模型

YOLOv8提供多種不同大小的模型,每個模型的權重檔案都不同,可以根據需求選擇適合的初始模型:

Modelsize
(pixels)
mAPval
50-95
Speed
CPU ONNX
(ms)
Speed
A100 TensorRT
(ms)
params
(M)
FLOPs
(B)
YOLOv8n64037.380.40.993.28.7
YOLOv8s64044.9128.41.2011.228.6
YOLOv8m64050.2234.71.8325.978.9
YOLOv8l64052.9375.22.3943.7165.2
YOLOv8x64053.9479.13.5368.2257.8

如果電腦記憶體有限,建議採yolov8n.ptyolov8s.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.ptyolov8s.pt
data設定數據集配置檔案(如 dataset.yaml
epochs訓練回合數100
batch批次大小16
imgsz訓練圖片大小(如 640640
device設定使用 cpu 或特定 GPU (0, 1, …)None(自動偵測)
優化與學習率
參數作用預設值
optimizer優化器(SGD, Adam, AdamWauto
lr0初始學習率0.01
momentum動量0.937
weight_decayL2 正則化權重衰減0.0005
早停與驗證
參數作用預設值
patience訓練多少 epochs 無提升則停止50
val是否執行驗證(True / FalseTrue
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學習紀錄
Python基礎語法
主題 文章
編譯器與IDE
  • 註解:Comments
  • 模組:pip install.Module
  • 印出:print
  • 資料型態:numbers.string.list.tuples.dictionary
  • 運算:算數運算子.關係運算子.邏輯運算子
  • 判斷式:if else
  • 迴圈:while.for
  • 自定義函數:def
  • 矩陣:Array
  • 迭代器:Iterators
  • 物件導向:類(Classes).物件(Objects).封裝(Encapsulation).繼承(Inheritance).多型(Polymorphism)
  • 讀取儲存:Files I/O
  • 資料儲存:Json
  • 嘗試:Try Except
  • 互動:Input
  • 日期:Date
常用模組
  • Math:數學
  • Numpy:矩陣與線性代數運算
  • Random:隨機數
  • Matplotlib:資料作圖
  • OpenCV:影像資訊處理庫
  • pandas:配合Excel、CSV、Jason等數據處理
影像處理
  • 影像讀取與屬性修改
  • 網路攝影機
網路爬蟲
  • 網站爬蟲:Web Crawler
圖形介面
  • Tkinter:基礎GUI介面
  • PySide:Qt框架的GUI介面
  • CustomTkinter:基礎GUI介面美化版
  • Eel:結合html、JavaScript、CSS的網頁GUI介面
檔案打包
Python應用學習
主題 文章
影像應用
  • 圖像辨識:YOLO
  • 肢體追蹤:Google MediaPipe
機器學習
  • 數據讀取
  • 資料預處理
  • 訓練集與測試集
  • 特徵縮放
  • 代入模型
  • 模型訓練與學習率測試
  • 損失函數:均方誤差.二元交叉熵.Scikit-Learn
深度學習
  • Keras
  • PyTorch
  • TensorFlow
語言分析
  • SnowNLP
  • Bert WWM
圖像生成
  • Stable Diffusion
寫一點小工具
小小作品
Python學習資源
常用網站
編輯 ] 筆記 » 程式語言 » Python
Python|HTML|CSS|JavaScript|Blender|Unreal Engine
0

Facebook留言

Wordpress留言 (0)

發佈留言

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

關於我們 | 隱私權政策
arrow_downward搜尋卡鐘