自訂水果模型

      在〈自訂水果模型〉中尚無留言

本例可分辨 guava, lemon, pitaya, wax 四種水果。

安裝套件

請依如下順序安裝套件。

pip install torch torchvision torchaudio --index-url  https://download.pytorch.org/whl/cu130 --no-cache-dir
pip install pip install ultralytics labelme labelme2yolo

水果資料集下載

水果資料集為本人自行搜集,請由本站下載 : fruit_dataset.zip。儲存在專案下,然後「解壓縮至此」,就會產生 dataset 目錄。

標示圖片

在 Terminal 輸入如下指令。

labelme

開啟視窗後,按下 Open Dir 選取 dataset 目錄,然後選擇 Create AI-Polygon,可以更方便快速的選取物件。每標識一個物件即會自動儲存成 json 格式,檔案置於 dataset 之下。

常用的快速鍵如下。

點一下 : 選取物件
Ctrl + 點一下 : 結束選取,並自動儲存成 .json
d : 下一張

轉成 yolo 格式

使用 labelme 標識的圖片,只能儲存成 json 格式,但 yolo 只認識 .txt 檔,所以請使用如下指令轉成 yolo 格式。

labelme2yolo --json_dir ./dataset

上述指令會把 ./dataset 裏的 json 轉成 .txt 檔,並且會自動分割成 train 及 val 兩個目錄,而且還會產生 dataset.yaml 檔案

所有的檔案儲存在 ./dataset/YOLODataset 目錄之下。

模型訓練

使用如下代碼即可開始訓練模型

import os
import shutil
import time
from ultralytics import YOLO
if __name__=='__main__':
    path="./runs/detect/train"
    if os.path.exists(path):
        shutil.rmtree(path)
    
    files=[
        "./dataset/YOLODataset/labels/train.cache",
        "./dataset/YOLODataset/labels/val.cache"
    ]
    for file in files:
        if os.path.exists(file):
            os.remove(file)
    
    model = YOLO("yolo26n.pt")
    #model = YOLO("yolo26n.yaml")
    print(model.model.yaml)
    print("開始訓練 .........")
    t1=time.time()
    model.train(data="./dataset/YOLODataset/dataset.yaml", epochs=200,imgsz=640)
    t2=time.time()
    print(f'訓練花費時間 : {t2-t1}秒')
    print(f'模型匯出路徑 : {model.export()}')

請注意,如果使用空權重 yolo26n.yaml 訓練,幾乎無法辨識。但使用 yolo26n.pt 訓練,雖然圖片沒有幾張,但速度很快且蠻準確的。這是因為 yolon26.pt 模型已經學過邊緣、紋理、形狀、物體概念(人、狗、車),訓練新資料時只是在「微調」自訂的資料

偵測圖片

訓練好的模型式,置於 ./runs/detect/train/weights 之下,檔名為 best.pt。

無法訓練的人,可由如下網址下載 : best.pt。

如下代碼即可偵測新圖片。

import numpy as np
from cv import cv
from ultralytics import YOLO
import cv2
import pylab as plt
model = YOLO("./runs/detect/train/weights/best.pt")
img = cv.read("4.jpg")[...,::-1].copy()
result = model(img)[0]  # 取得第一個結果
boxes = result.boxes  # 邊界框
for box in boxes:
    x1, y1, x2, y2 = box.xyxy[0].cpu().numpy().astype(int)
    conf = box.conf[0].cpu().numpy()
    cls = int(box.cls[0].cpu().numpy())
    name = result.names[cls]
    img=cv.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 3)
    img=cv.text(img, (x1, y1-10), f"{name}\n{conf:.2f}", color=(255,0,0), size=70)
plt.axis("off")
plt.imshow(img)
plt.show()

yolo.exe 訓練權重

在 Terminal 執行如下指令,epochs 設定為 200 次。不過 V8很聰明,在 epochs 約 98 次後,發現無法再逼近,就會自動停止

yolo task=detect mode=train model=./yolov8x.pt data=./data.yaml epochs=200 imgsz=640

發佈留言

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