本例可分辨 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
