(1)機器學習小白入門YOLOv :從概念到實踐
(2)機器學習小白入門 YOLOv:從模塊優化到工程部署
(3)機器學習小白入門 YOLOv: 解鎖圖片分類新技能
前言
YOLOv 算法通常被用于目標檢測任務,但通過對其進行適當的調整和改造,也能夠滿足圖片分類的需求。接下來,我將基于之前 YOLOv 的開發框架,詳細介紹如何利用它實現圖片分類。
一、核心思路轉換
在目標檢測任務中,YOLOv 會輸出目標的位置和類別;而圖片分類只需要判斷整張圖片屬于哪個類別。我們可以將 YOLOv 的輸出進行簡化處理:不再關注目標的位置信息,僅提取置信度最高的類別作為圖片的分類結果 。
二、代碼模塊調整
2.1 模型調用與推理模塊優化
在原有的模型調用和推理代碼基礎上,我們需要修改結果解析部分。原代碼中解析結果時會獲取所有檢測到的目標信息,現在我們只需要獲取置信度最高的類別。
from ultralytics import YOLO
import cv2
import torch# 加載預訓練模型
model = YOLO('yolov8n.pt')# 讀取圖像
image = cv2.imread('test.jpg')
# 預處理:調整尺寸、歸一化、維度轉換
input_tensor = torch.from_numpy(image).unsqueeze(0).float() / 255.0
input_tensor = input_tensor.permute(0, 3, 1, 2) # NHWC -> NCHW# 執行推理
results = model.predict(source=input_tensor, show=False)# 解析結果,獲取置信度最高的類別
max_score = 0
predicted_class = None
for result in results:boxes = result.boxes.xyxy.tolist()scores = result.boxes.conf.tolist()classes = [result.names[int(cls)] for cls in result.boxes.cls.tolist()]for score, cls in zip(scores, classes):if score > max_score:max_score = scorepredicted_class = clsprint(f"圖片分類結果為:{predicted_class},置信度:{max_score:.2f}")
2.2 訓練數據集與配置修改
如果需要訓練自己的模型用于圖片分類,數據集準備和配置環節也需要相應調整。
-
數據集標注:標注工具仍可使用 LabelImg,但每張圖片僅需標注一個類別,且標注框應覆蓋整張圖片 。標注生成的
.txt
文件中,每行格式為類別索引 0.5 0.5 1.0 1.0
,其中0.5 0.5 1.0 1.0
表示標注框覆蓋整張圖片。 -
數據集配置:在
data.yaml
文件中,nc
設置為實際的類別數量,names
列表填寫對應的類別名稱。同時,確保訓練集、驗證集和測試集路徑正確指向處理好的圖片和標注文件。
train: path/to/train/images # 訓練集圖像路徑
val: path/to/val/images # 驗證集圖像路徑
test: path/to/test/images # 測試集圖像路徑nc: 5 # 假設圖片分類有5個類別
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 類別名稱列表
三、訓練與評估調整
3.1 訓練參數設置
訓練參數配置與目標檢測類似,但由于任務性質改變,部分參數可根據實際情況微調。例如,學習率、訓練輪數等可以在原基礎上進行嘗試性調整,以獲得更好的分類效果。
python train.py \
--weights yolov8n.pt \
--data data.yaml \
--epochs 50 \
--batch 32 \
--lr0 0.0005 # 調整后的初始學習率
3.2 模型評估指標
評估模型時,不再使用目標檢測的mAP@0.5:0.95
指標,而是采用圖片分類常用的準確率(Accuracy)、精確率(Precision)、召回率(Recall)、F1 值等指標 。可以通過編寫自定義腳本,加載測試集數據進行預測,然后計算這些指標來評估模型的分類性能。
# 讀取測試集標簽?
with open(test_label_file, 'r') as f:?max_score = 0?predicted_class = None?for result in results:?scores = result.boxes.conf.tolist()?classes = [result.names[int(cls)] for cls in result.boxes.cls.tolist()]?for score, cls in zip(scores, classes):?if score > max_score:?max_score = score?predicted_class = cls?predicted_labels.append(predicted_class)?
?
# 計算評估指標?
accuracy = accuracy_score(true_labels, predicted_labels)?
precision = precision_score(true_labels, predicted_labels, average='weighted')?
recall = recall_score(true_labels, predicted_labels, average='weighted')?
f1 = f1_score(true_labels, predicted_labels, average='weighted')?
?
print(f"準確率: {accuracy:.4f}")?
print(f"精確率: {precision:.4f}")?
print(f"召回率: {recall:.4f}")?
print(f"F1值: {f1:.4f}")
-
遍歷測試集的每一張圖片,進行預處理后輸入模型進行預測,提取置信度最高的類別作為預測結果。
-
最后,使用
sklearn
庫中的函數計算準確率、精確率、召回率和 F1 值,并打印輸出評估結果。
3.3核心評估指標詳解?
3.3.1 準確率(Accuracy)?
準確率是最直觀的評估指標,它表示模型正確分類的樣本數占總樣本數的比例。
在圖片分類中,準確率反映了模型對所有樣本的整體判斷正確程度,但當數據集中類別不均衡時,準確率可能會產生誤導。例如,數據集中 90% 是類別 A,10% 是類別 B,模型將所有樣本都預測為類別 A,雖然準確率很高,但模型實際上無法識別類別 B。?
3.3.2 精確率(Precision)?
精確率衡量的是模型預測為正類的樣本中,真正為正類的比例。
?
?
精確率關注的是模型預測結果的準確性。在圖片分類中,如果精確率較低,說明模型容易將其他類別誤判為目標類別,導致誤報較多。?
3.3.3 召回率(Recall)?
召回率也稱為靈敏度或真正率,它表示實際為正類的樣本中,被模型正確預測為正類的比例。召回率反映了模型對正類樣本的捕捉能力。在圖片分類中,召回率低意味著模型容易遺漏正類樣本,出現漏報的情況。?
3.3.4 F1 值?
F1 值是精確率和召回率的調和平均數,綜合考慮了精確率和召回率兩個指標,能夠更全面地評估模型性能。F1 值越高,說明模型在精確率和召回率之間取得了較好的平衡
通過上述指標和腳本,能夠全面、準確地評估基于 YOLOv 的圖片分類模型性能,為模型的優化和改進提供有力依據。