邢臺網(wǎng)站建設(shè) 冀icp備信息流優(yōu)化師證書
這幾天做了給Yolov8檢測物體的小任務(wù),今天來做下總結(jié)。
首先介紹下整個Yolov8檢測的步驟吧,安裝庫那些就不講了。
這是我的文件包的對象樹。
有images包,里面裝了訓(xùn)練和驗(yàn)證的圖像。
labels包,裝了標(biāo)注好的labels的txt文件,一開始標(biāo)注好是json文件,要經(jīng)過腳本轉(zhuǎn)化,變成yolov能識別的txt文件。
這里我之前遇到一個麻煩,就是我已經(jīng)開始是用多邊形標(biāo)注的,結(jié)果yolov8訓(xùn)練出來一坨,我查了查yolov8好像在目標(biāo)識別這塊不能用多邊形。分割的話可以用多邊形做。然后就改成矩形做了。
dataset.yaml文件
path: C:/Users/ren/Desktop/gm/guardrail_monitoring/datasets/guardrail
train: C:/Users/ren/Desktop/gm/guardrail_monitoring/datasets/guardrail/images/train
val: C:/Users/ren/Desktop/gm/guardrail_monitoring/datasets/guardrail/images/val# 類別信息
nc: 1
names: ['fence']
script文件里裝的是運(yùn)行腳本
train.py
from ultralytics import YOLOdef train_model():"""訓(xùn)練 YOLOv8 目標(biāo)檢測模型。"""# 加載預(yù)訓(xùn)練的目標(biāo)檢測模型model = YOLO("yolov8n.pt") # 使用 YOLOv8 的目標(biāo)檢測模型# 訓(xùn)練模型results = model.train(data="C:/Users/ren/Desktop/gm/guardrail_monitoring/datasets/dataset.yaml", # 數(shù)據(jù)集配置文件路徑epochs=100, # 訓(xùn)練輪數(shù)imgsz=640, # 圖像大小batch=16, # 批量大小name="guardrail_detection", # 訓(xùn)練任務(wù)名稱patience=10, # 早停機(jī)制,如果 10 輪驗(yàn)證集性能沒有提升,則停止訓(xùn)練device="0", # 使用 GPU 訓(xùn)練(如果有 GPU)workers=4, # 數(shù)據(jù)加載的線程數(shù)optimizer="auto", # 自動選擇優(yōu)化器lr0=0.01, # 初始學(xué)習(xí)率lrf=0.01, # 最終學(xué)習(xí)率weight_decay=0.0005, # 權(quán)重衰減save=True, # 保存訓(xùn)練結(jié)果save_period=10, # 每 10 輪保存一次模型)print("訓(xùn)練完成!模型權(quán)重保存在 runs/detect/guardrail_detection/weights/ 目錄下。")if __name__ == "__main__":train_model()
device = “0”就代表我用的GPU訓(xùn)練,記得要裝pytorch的GPU版本。
訓(xùn)練完了之后權(quán)值會在run/../weight文件里面,選里面最好的best,吧它的地址換進(jìn),infer_image文件里面
from ultralytics import YOLO
from PIL import Image, ImageDraw, ImageFont
import osdef draw_boxes(image, boxes, labels, confidences):"""在圖像上繪制邊界框和標(biāo)簽。:param image: PIL 圖像對象:param boxes: 邊界框坐標(biāo)列表:param labels: 類別標(biāo)簽列表:param confidences: 置信度列表:return: 繪制后的圖像"""draw = ImageDraw.Draw(image)font = ImageFont.load_default()for box, label, confidence in zip(boxes, labels, confidences):x1, y1, x2, y2 = boxdraw.rectangle([x1, y1, x2, y2], outline="red", width=2)draw.text((x1, y1), f"{label} {confidence:.2f}", fill="red", font=font)return imagedef infer_image(image_path, output_dir):"""對單張圖像進(jìn)行推理。:param image_path: 圖像路徑:param output_dir: 輸出目錄"""# 加載訓(xùn)練好的模型model = YOLO("C:/Users/ren/Desktop/gm/runs/detect/guardrail_detection2/weights/best.pt")# 推理(降低置信度閾值)results = model(image_path, conf=0.1) # 設(shè)置置信度閾值為 0.1# 處理結(jié)果for result in results:boxes = result.boxes.xyxy.tolist() # 獲取邊界框坐標(biāo)labels = result.boxes.cls.tolist() # 獲取類別 IDconfidences = result.boxes.conf.tolist() # 獲取置信度names = result.names # 獲取類別名稱# 將類別 ID 轉(zhuǎn)換為類別名稱labels = [names[int(cls)] for cls in labels]# 打開圖像image = Image.open(image_path)# 繪制標(biāo)注if boxes: # 如果有檢測到目標(biāo)image = draw_boxes(image, boxes, labels, confidences)else:print(f"{image_path} 未檢測到目標(biāo)!")# 創(chuàng)建輸出目錄(如果不存在)os.makedirs(output_dir, exist_ok=True)# 保存圖像image_name = os.path.basename(image_path) # 獲取圖像文件名output_path = os.path.join(output_dir, image_name)image.save(output_path)print(f"推理完成!結(jié)果保存在 {output_path}")def infer_validation_set(validation_dir, output_dir):"""對驗(yàn)證集進(jìn)行批量推理。:param validation_dir: 驗(yàn)證集目錄:param output_dir: 輸出目錄"""# 遍歷驗(yàn)證集目錄中的所有圖像for image_name in os.listdir(validation_dir):if image_name.lower().endswith((".jpg", ".jpeg", ".png")): # 僅處理圖像文件image_path = os.path.join(validation_dir, image_name)infer_image(image_path, output_dir)if __name__ == "__main__":validation_dir = "C:/Users/ren/Desktop/gm/guardrail_monitoring/datasets/guardrail/images/val" # 驗(yàn)證集目錄output_dir = "C:/Users/ren/Desktop/outputs/images" # 輸出目錄infer_validation_set(validation_dir, output_dir)
最后就訓(xùn)練好了Yolov8模型
明天來解析一下yolov8的源代碼邏輯。