歡迎關注『跟我學 YOLO』系列
【跟我學YOLO】(1)YOLO12:以注意力為中心的物體檢測
【跟我學YOLO】(2)YOLO12 環境配置與基本應用
【跟我學YOLO】(3)YOLO12 訓練自己的數據集
【跟我學YOLO】(3)YOLO12 訓練自己的數據集
- 1. 創建和配置 YOLO12 使用環境
- 2. 準備 YOLO12 訓練數據集
- 2.1 YOLOv12 數據集的格式
- 2.2 下載 YOLO 數據集
- 2.3 重新整理 YOLOv11 數據集
- 3. 自有數據集的訓練
- 3.1 下載 YOLO12 預訓練模型
- 3.2 使用 Python 接口的模型訓練
- 3.4 訓練日志
- 3.5 斷點訓練
- 4. 模型驗證與模型預測
- 4.1 模型驗證
- 4.2 模型預測
- 5. 報錯處理
- 5.1 路徑配置報錯:RuntimeError: Dataset 'data.yaml' error
- 5.2 拉取 Arial.ttf 報錯:Downloading https://ultralytics.com/assets/Arial.ttf to...
- 5.3 虛擬內存不足報錯:OSError: [WinError 1455]
YOLO12 引入了一種以注意力為中心的架構,該模型通過對注意力機制和整體網絡架構進行新穎的方法創新,實現了最先進的物體檢測精度,同時保持了實時性能。YOLO12 支持一系列核心計算機視覺任務:物體檢測、實例分割、圖像分類、姿態估計和定向物體檢測 (OBB)。YOLO12 效率更高,部署靈活。
上節介紹了 YOLO12 的下載、配置和推理,本節介紹使用用戶自己的數據集訓練 YOLO12 模型,建立特定任務的私有模型。創建自定義模型來檢測對象,包括圖像的采集和標注、訓練模型、模型部署,以及使用部署的模型進行推理。
YOLOv12 下載:GitHub - YOLO12
Ultralytics 官方文檔: YOLO12 使用指南(中文版)
1. 創建和配置 YOLO12 使用環境
官方參考步驟如下,主要包括 創建虛擬環境和安裝項目依賴。但考慮國內安裝環境問題,以及使用的操作系統(官方步驟針對 Linux 系統),直接使用 requirements.txt 安裝項目依賴可能報錯,推薦按照 【跟我學YOLO】(2)YOLO12 環境配置與基本應用 中“3. 虛擬環境的創建與配置” 的步驟操作,準備 YOLO12 環境。
# 創建conda環境
conda create -n yolov12 python=3.8
conda activate yolov12# 安裝PyTorch (根據CUDA版本選擇)
pip install torch torchvision torchaudio# 克隆YOLOv12代碼庫
git clone https://github.com/xxx/yolov12.git
cd yolov12# 安裝依賴
pip install -r requirements.txt
2. 準備 YOLO12 訓練數據集
YOLO11 項目中提供了不同數據集轉換的指南和例程,位于 “.\docs\en\datasets” 路徑,例如在文件 coco.md 中介紹了使用 COCO 數據集來訓練 YOLOv11 目標檢測模型。YOLO12 項目沒有提供數據集轉換的指南和例程,但方法與 YOLO11 是一致的,可以參考使用。
2.1 YOLOv12 數據集的格式
1、數據集的組織
YOLOv12 數據集通常包含圖像文件和標注文件。圖像文件通常是 jpg、png 等圖像格式,包含了待檢測的目標。標注文件則是包含每張圖像中目標對象的類別和位置信息的文本文件。
YOLOv12 默認使用 COCO2017 數據集進行訓練,結構如下。
- images 目錄包含 train、valid 文件夾,這兩個文件夾下包含模型訓練所需要的圖片文件;
- labels 目錄包含 train、valid 文件夾,這兩個文件夾下包含模型訓練圖片所對應的標注文件;
- images 目錄可以包含 test 文件夾,其中包含測試所用的圖片文件。
dataset/
├── images/
│ ├── train/
│ └── val/
│ └── test/ # (option)
└── labels/├── train/└── val/
2、標注文件的格式
YOLO格式的標注文件通常是一個文本文件,每一行代表一個目標物體的標注信息。
標注信息通常包含類別編號、目標中心橫坐標(相對于圖像寬度)、目標中心縱坐標(相對于圖像高度)、目標寬度(相對于圖像寬度)和目標高度(相對于圖像高度),具體格式如下:
<object-class-id> <x> <y> <width> <height>
其中:
<object-class-id>是目標對象的類別編號,整數表示。
<x>和<y>是目標中心位置的坐標,經過歸一化處理(即目標的真實x、y值除以圖像的寬度和高度),是小于1的浮點數。
<width>和<height>是目標的寬度和高度(同樣經過歸一化處理),也是小于1的浮點數。
例如,某一行的標注信息為 “2 0.3 0.6 0.25 0.40”,其中“2”表示類別編號,后面的 4個數字表示目標在圖像中的位置 <x> <y> 和寬高 <width> <height>。
3、XML 標注文件的格式轉換
對于 Pascal VOC數據集,常用XML格式的標注文件,需要將文件夾下的所有類別的 xml 格式的標注轉換成為yolo格式。轉換后的標簽要保存在 labels文件夾文件夾下。
將 xml 格式的標注轉換成為yolo格式的例程如下。
import os
import xml.etree.ElementTree as ET
import globdef convert_coordinates(size, box):"""將XML中的邊界框坐標轉換為YOLO格式"""dw = 1.0/size[0]dh = 1.0/size[1]# XML格式為 xmin, ymin, xmax, ymaxx = (box[0] + box[2])/2.0y = (box[1] + box[3])/2.0w = box[2] - box[0]h = box[3] - box[1]# 歸一化x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)def convert_xml_to_yolo(xml_path, class_mapping):"""轉換單個XML文件到YOLO格式"""tree = ET.parse(xml_path)root = tree.getroot()# 獲取圖像尺寸size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)# 創建對應的txt文件路徑txt_path = xml_path.replace('Annotations', 'Labels').replace('.xml', '.txt')# 確保Labels目錄存在os.makedirs(os.path.dirname(txt_path), exist_ok=True)with open(txt_path, 'w') as txt_file:# 處理每個目標for obj in root.iter('object'):# 獲取類別名稱class_name = obj.find('name').text# 獲取類別IDif class_name not in class_mapping:continueclass_id = class_mapping[class_name]# 獲取邊界框坐標xmlbox = obj.find('bndbox')xmin = float(xmlbox.find('xmin').text)ymin = float(xmlbox.find('ymin').text)xmax = float(xmlbox.find('xmax').text)ymax = float(xmlbox.find('ymax').text)# 轉換坐標bb = convert_coordinates((width,height), (xmin,ymin,xmax,ymax))# 寫入txt文件txt_file.write(f"{class_id} {bb[0]:.6f} {bb[1]:.6f} {bb[2]:.6f} {bb[3]:.6f}\n")def main():# 定義類別映射class_mapping = {'missing_hole': 0,'mouse_bite': 1,'open_circuit': 2,'short': 3,'spur': 4,'spurious_copper': 5}# 獲取所有XML文件xml_files = glob.glob('Annotations/*/*.xml')# 轉換每個XML文件for xml_file in xml_files:try:convert_xml_to_yolo(xml_file, class_mapping)print(f"成功轉換: {xml_file}")except Exception as e:print(f"轉換失敗 {xml_file}: {str(e)}")if __name__ == "__main__":main()
2.2 下載 YOLO 數據集
- 打開 Roboflow 網站,從Roboflow 公開數據集中選擇一個數據集,下載到本地。
本文選擇 “水族館數據集(Aquarium Dataset)”。該數據集由 Roboflow 從美國兩個水族館收集的 638 張圖像組成:Henry Doorly Zoo 和 National Aquarium in Baltimore。Roboflow對這些圖像進行了標記,以便進行物體檢測。圖像和注釋在知識共享署名許可下發布。
該數據集標記了 7 個類別:魚類(fish)、水母(jellyfish)、企鵝(penguins)、鯊魚(sharks)、海雀(puffins)、黃貂魚(stingrays)和海星(starfish)。大多數圖像包含多個邊界框。
- Roboflow 提供了多種下載格式,主要是數據集組織和標注格式的區別。注意要以YOLOv12 格式導出,如下圖所示。
選擇 YOLO12 格式,下載 水族館數據集(Aquarium Dataset)。
- 下載后將數據集解壓縮。
下載的 Aquarium 數據集的文件路徑如下:
DatasetAquariumYolo/
├── train/
│ ├── images/
│ └── labels/
├── valid/
│ ├── images/
│ └── labels/
├── test/ (option)
│ ├── images/
│ └── labels/
└── data.yaml
下載的 Aquarium 數據集設有 test,train,valid 三個文件夾,分別用作測試、訓練和檢驗。每個文件夾下設有 images,labels 兩個文件夾,分別保存圖像文件和標注文件。
一個典型的標注文件的內容如下。文件有 4 行,每行表示一個檢測目標。每行有 5個參數,第 1 列是類別標簽,后 4個參數是 BoundingBox 的坐標位置。
3 0.5 0.5361328125 0.08854166666666667 0.1142578125
3 0.30859375 0.3115234375 0.09244791666666667 0.103515625
3 0.71875 0.5859375 0.15104166666666666 0.0888671875
3 0.3072916666666667 0.494140625 0.10807291666666667 0.0693359375
如果自己收集和標注數據集,也要按照以上格式來組織數據集和標注文件。
- 數據集配置文件 .yaml
下載數據集配置文件中給出了數據集的路徑,訓練集、檢驗集和驗證集的路徑,分類任務的類別數量 nc 和類名列表 names。
Aquarium Dataset 數據集配置文件 data.yaml 位于數據集的根目錄,內容如下:
train: ../train/images
val: ../valid/images
test: ../test/imagesnc: 7
names: ['fish', 'jellyfish', 'penguin', 'puffin', 'shark', 'starfish', 'stingray']roboflow:workspace: brad-dwyerproject: aquarium-combinedversion: 2license: CC BY 4.0url: https://universe.roboflow.com/brad-dwyer/aquarium-combined/dataset/2
其中,train 表示訓練集圖像文件夾的路徑,val 表示驗證集圖像文件夾的路徑,test 表示測試集圖像文件夾的路徑。nc:7 表示類別數為 7,names 表示類別名。
注意,nc 是由數據集的標注內容決定的,不能自行修改。
2.3 重新整理 YOLOv11 數據集
YOLO13 模型訓練對于格式的要求非常嚴格,需要重新組織樣本圖片和標簽。
- 為了方便在不同項目中使用數據集,將 YOLO12_Aquarium 項目和 DatasetAquariumYolo12 數據集都保存在 Projects 目錄下。其中,我們把 YOLO12 項目另存為 YOLO12_Aquarium,以便與下載的 YOLO12 區別。
- Projects- DatasetAquarium- YOLO12_Aquarium
- 按照 YOLO12 的數據格式組織數據集的樣本圖片和標簽。
- PyProjects- DatasetAquarium- test- images- labels- train- images- labels- valid- images- labels- YOLO12_Aquarium- dataAquariumYolo12.yaml- Yolo12_train.py
- 編寫數據集配置文件 YAML(dataAquariumYolo12.yaml )。
YOLO12 模型訓練時,要調用數據集配置文件 YAML 文件,用于指定數據集的路徑和分類類別。
在 YOLO12 項目中,提供了多個數據集配置文件,例如:“\YOLOv12\ultralytics\cfg\datasets\coco8.yaml” 可供參考。其內容如下。
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)# Classes
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant...
現在,我們根據Aquarium Dataset 數據集配置文件 data.yaml ,編寫本項目的數據集配置文件 dataAquarium.yaml,保存到 YOLO12_Aquarium 項目的根目錄,內容如下。
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
# path: ../DatasetAnimalYolo # The database root directory is located one level below the YOLO12 root directory
path: C:/Python/PyProjects2025/DatasetAquarium # The database root directory is located at the same level as the YOLO12 root directory
train: train/images # train images (relative to 'path')
val: valid/images # val images (relative to 'path')
test: test/images # test images (optional)# Classes
names:0: fish1: jellyfish2: penguin3: puffin4: shark5: starfish6: stingray
3. 自有數據集的訓練
3.1 下載 YOLO12 預訓練模型
在 YOLO12/GitHub 項目倉,提供了在 COCO數據集上訓練達到的檢測(Detection)、分類(Classification)、分割(Segmentation)、姿態估計(Pose)、定向邊界框檢測(OBB)等任務的預訓練模型。
YOLO12 有多個不同規模的模型,從小到大依次是:YOLO12n、YOLO12s、YOLO12m、YOLO12l、YOLO12x。這些模型與各種操作模式兼容,包括推理、驗證、訓練和導出,便于在部署和開發的不同階段使用。在 下載 YOLO12 項目 中的 Readme.md 文件中可以找到以下內容(包括模型下載地址): YOLO12n , YOLO12s, YOLO12m, YOLO12l , YOLO12x。
以檢測任務為例,如下圖所示,點擊所需的模型即可下載相應的預訓練模型。
說明:YOLO12 在運行時如果在本地沒有檢測到預訓練模型,,將會自動從網絡下載并保存,但下載速度可能很慢甚至連接失敗(視網絡條件和限制),因此推薦先將 YOLO12 預訓練模型下載到本地。
本文選擇檢測任務模型 YOLO12n,參數約 2.5M。下載完成后,將模型文件保存在 YOLO12 項目的根目錄路徑下,即 “.\YOLOv12_Aquarium\yolov12n.pt”。
3.2 使用 Python 接口的模型訓練
YOLO12 提供了 Python 接口的調用方式。它提供了加載和運行模型以及處理模型輸出的函數。該界面設計易于使用,以便用戶可以在他們的項目中快速實現目標檢測。
使用 Diabetic Retinopathy 數據集進行模型訓練的 Python 參考例程如下。
from ultralytics import YOLOif __name__ == '__main__':# 創建 YOLO12 模型對象,加載指定的模型配置model = YOLO('ultralytics/cfg/models/v12/yolov12.yaml')# 加載預訓練的權重文件,加速訓練并提升模型性能model.load(f'yolov12n.pt')# 用指定數據集訓練模型results = model.train(data=f'dataAquariumYolo12.yaml', # 指定訓練數據集的配置文件路徑epochs=100, # 設置訓練的總輪數為100輪batch=64, # 設置每個訓練批次的大小為16imgsz=640, # 指定訓練時使用的圖像尺寸workers=4, # 設置用于數據加載的線程數為4cache=True, # 是否緩存數據集以加快后續訓練速度device='0', # 運行設備, 指定使用 GPU 設備optimizer='SGD', # 設置優化器為SGD(隨機梯度下降)freeze=10 # ? 凍結模型前10層(backbone部分))
注意:
(1)本例程使用的 YOLOv12 項目的路徑為 “C:\Python\Projects\YOLOv12_Aquarium” 。
(2)本例程使用的訓練數據集配置文件路徑為 “C:\Python\Projects\YOLOv12_Aquarium\dataAnimalYolo12.yaml” 。
(3)本例程運行后的訓練模型及訓練日志保存在 “C:\Python\Projects\YOLOv12_Aquarium\runs\detect\train” 目錄下。
在 PyCharm 編譯并運行程序,就實現對 Aquarium數據集進行模型訓練。運行時在 PyCham 窗口中輸出模型訓練的信息如下。
C:\Python\Miniconda3\envs\YOLO12\python.exe C:\Python\PyProjects2025\Yolov12-Aquarium\Yolo12_train01.py
WARNING ?? no model scale passed. Assuming scale='n'.
Transferred 739/739 items from pretrained weights
New https://pypi.org/project/ultralytics/8.3.169 available 😃 Update with 'pip install -U ultralytics'
Ultralytics 8.3.63 🚀 Python-3.11.13 torch-2.6.0+cu124 CUDA:0 (NVIDIA GeForce RTX 4060 Ti, 16380MiB)
engine\trainer: task=detect, mode=train, model=ultralytics/cfg/models/v12/yolov12.yaml, data=dataAquariumYolo12.yaml, epochs=200, time=None, patience=100, batch=64, imgsz=640, save=True, save_period=-1, cache=True, device=0, workers=4, project=None, name=train, exist_ok=False, pretrained=yolov12n.pt, optimizer=SGD, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=True, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=10, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.0, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.1, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train
Overriding model.yaml nc=80 with nc=7
WARNING ?? no model scale passed. Assuming scale='n'.from n params module arguments 0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2] 1 -1 1 2368 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2, 1, 2] 2 -1 1 6640 ultralytics.nn.modules.block.C3k2 [32, 64, 1, False, 0.25] ...Logging results to runs\detect\train
Starting training for 200 epochs...Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size1/200 5.52G 1.534 4.307 1.379 749 640: 100%|██████████| 7/7 [00:03<00:00, 2.21it/s]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 1.65it/s]all 127 909 0.0024 0.149 0.00428 0.0022...Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size200/200 5.28G 1.037 0.7246 1.001 488 640: 100%|██████████| 7/7 [00:02<00:00, 2.54it/s]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:00<00:00, 1.18it/s]all 127 909 0.734 0.691 0.744 0.443Validating runs\detect\train\weights\best.pt...
Ultralytics 8.3.63 🚀 Python-3.11.13 torch-2.6.0+cu124 CUDA:0 (NVIDIA GeForce RTX 4060 Ti, 16380MiB)
YOLOv12 summary (fused): 376 layers, 2,509,709 parameters, 0 gradients, 5.8 GFLOPsClass Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 1/1 [00:01<00:00, 1.07s/it]all 127 909 0.787 0.671 0.744 0.451fish 63 459 0.845 0.678 0.785 0.429jellyfish 9 155 0.839 0.876 0.912 0.508penguin 17 104 0.702 0.644 0.675 0.3puffin 15 74 0.72 0.417 0.556 0.283shark 28 57 0.832 0.579 0.733 0.494starfish 17 27 0.835 0.748 0.82 0.63stingray 23 33 0.737 0.758 0.73 0.512
Speed: 0.2ms preprocess, 1.7ms inference, 0.0ms loss, 1.0ms postprocess per image
Results saved to runs\detect\train
3.4 訓練日志
訓練日志的圖表對于評估和理解模型的性能非常重要,可以幫助我們分析模型的優勢和不足。
訓練結果保存在 runs\detect\train,訓練日志的圖表如下圖所示。
- 訓練完成后,訓練的最優模型保存為文件: “./Projects/YOLO12_Animal/runs/detect/train/weights/best.py”。
- weights 文件夾- best.pt:損失值最小的模型文件- last.pt:訓練到最后的模型文件
- args.yaml:模型訓練的配置參數
- 混淆矩陣
- confusion_matrix.png 展示了分類模型的性能。圖中的每一行代表模型預測的類別,每一列代表實際的類別。對角線上的數值表示模型正確預測的數量。對角線上較深的顏色表示該類別預測正確的數量較多。
- confusion_matrix_normalized.png:標準化混淆矩陣,顯示每個類別的預測正確比例。
- F1-置信度曲線
- F1_curve.png:F1-置信度曲線,顯示了F1得分隨著置信度閾值的變化。
F1得分是精確度和召回率的調和平均值,曲線的峰值表示給定置信度閾值下精確度和召回率的最佳平衡點。
- 標簽分布圖和標簽相關圖
- labels.jpg:標簽分布圖和邊界框分布圖。
柱狀圖顯示了不同類別的實例分布數量。散點圖則展示了目標檢測任務中邊界框的空間分布情況,反映了常見的尺寸和長寬比。 - labels_correlogram.jpg:標簽相關圖
相關圖提供了不同類別標簽之間的關系,以及它們在圖像中位置的相關性。這有助于理解模型在識別不同類別時可能出現的關聯或混淆。
- P/PR/R 曲線
- P_curve.png:精確度-置信度曲線,展示了模型預測的精確度隨著置信度閾值的變化。
精確度是模型預測正確正例與預測為正例總數的比值。 - PR_curve.png:精確度-召回曲線,展示了模型的精確度與召回率之間的關系。
理想情況下,模型應在精確度和召回率之間保持良好的平衡。 - R_curve.png:召回-置信度曲線,顯示了模型的召回率隨置信度閾值的變化。
召回率是模型正確預測的正例與實際正例總數的比值。
- 訓練結果圖表和數據
- results.png 和 results.csv:訓練結果圖表和數據
展示了模型在訓練過程中的性能變化,包括損失函數的變化和評估指標(如精確度、召回率和mAP)的變化。
3.5 斷點訓練
YOLO11 提供了參數 “resume” 進行斷點訓練。
對于大型數據集,使用 YOLO11 進行模型訓練所需的時間很長,如果訓練中斷或者出現異常,可以接著從上一次中斷時的模型繼續訓練。
-
將 “resume” 參數修改為 “True”,則會加載上一次訓練的模型權重和優化器狀態,繼續從斷點開始訓練。
-
加載預訓練模型權重文件時,使用上次中斷的模型或最后一次訓練的權重(last.pt)。
from ultralytics import YOLOif __name__ == '__main__':# 創建 YOLO 模型對象,加載指定的模型配置model = YOLO(model=r'yolo11_Animal.yaml')# 加載預訓練的權重文件,加速訓練并提升模型性能model.load("\runs\detect\train\weights\last.pt")# 用指定數據集訓練模型model.train(data=r'dataAnimalYolo11.yaml', # 指定訓練數據集的配置文件路徑cache=False, # 是否緩存數據集以加快后續訓練速度imgsz=640, # 指定訓練時使用的圖像尺寸epochs=100, # 設置訓練的總輪數為100輪batch=16, # 設置每個訓練批次的大小為16close_mosaic=10, # 設置在訓練的最后 10 輪中關閉 Mosaic 數據增強workers=4, # 設置用于數據加載的線程數為4device='0', # 運行設備, 指定使用的 CPU/GPU 設備optimizer='SGD' # 設置優化器為SGD(隨機梯度下降)resume = 'True' # 設置)
關鍵參數說明:
–img: 輸入圖像尺寸
–batch: 批次大小
–epochs: 訓練輪數
–data: 數據集配置文件
–cfg: 模型配置文件
–weights: 預訓練權重路徑,''表示從零開始
–name: 實驗名稱
4. 模型驗證與模型預測
4.1 模型驗證
訓練后驗證。
- 將訓練好的模型 best.pt 保存在項目的根目錄,并將文件名改為 “yolo11nAnimal.pt”。
- 模型驗證程序如下。
from ultralytics import YOLOif __name__ == '__main__':# 讀取模型,傳入訓練好的模型model = YOLO('yolo11nAnimal.pt')# 驗證模型metrics = model.val() # 無需參數,使用 best.pt中的配置文件
- 運行模型驗證程序,結果保存在 “.\runs\detect\val” 文件夾。
C:\Python\miniconda3\envs\yolo11\python.exe C:\Python\Projects\YOLOv11_Animal\test01.py
Ultralytics 8.3.57 🚀 Python-3.8.20 torch-2.4.1+cpu CPU (Intel Core(TM) i7-4790 3.60GHz)
YOLO11_Animal summary (fused): 238 layers, 2,583,517 parameters, 0 gradients, 6.3 GFLOPs
val: Scanning C:\Python\Projects\DatasetAnimalYolo11\labels\valid.cache... 127 images, 0 backgrounds, 0 corrupt: 100%|██████████| 127/127 [00:00<?, ?it/s]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 8/8 [00:12<00:00, 1.51s/it]all 127 909 0.568 0.441 0.469 0.216fish 63 459 0.654 0.458 0.531 0.243jellyfish 9 155 0.595 0.748 0.766 0.379penguin 17 104 0.356 0.538 0.419 0.146puffin 15 74 0.541 0.175 0.234 0.08shark 28 57 0.651 0.351 0.424 0.184starfish 17 27 0.584 0.333 0.38 0.243stingray 23 33 0.592 0.485 0.531 0.236
Speed: 1.3ms preprocess, 70.8ms inference, 0.0ms loss, 7.0ms postprocess per image
Results saved to runs\detect\val
4.2 模型預測
訓練后驗證。
- 將訓練好的模型 best.pt 保存在項目的根目錄,并改名為 “yolo12nAquarium.pt”。
- 模型預測程序如下。
參數 source 可以是一個或多個圖片文件,一個視頻文件,也可以是一個文件夾,或視頻采集設備。
from ultralytics import YOLOif __name__ == '__main__':# 讀取模型,傳入訓練好的模型model = YOLO('yolo12nAquarium.pt')outputs = model.predict(source=f"C:\\Python\\PyProjects2025\\DatasetAquarium\\test\\images", save=True)
- 運行模型預測程序,結果保存在 “.\runs\detect\predict” 文件夾。
5. 報錯處理
5.1 路徑配置報錯:RuntimeError: Dataset ‘data.yaml’ error
raise RuntimeError(emojis(f"Dataset '{clean_url(self.args.data)}' error ? {e}")) from e
RuntimeError: Dataset 'dataAnimalYolo11.yaml' error
Dataset 'dataAnimalYolo12.yaml' images not found , missing path 'C:\Python\Projects\Yolo12\DatasetAnimalYolo\images\valid'
Note dataset download directory is 'C:\Python\Projects\Yolo12\datasets'. You can update this in 'C:\Users\David Huang\AppData\Roaming\Ultralytics\settings.json'
問題分析與解決方法:
這是由于路徑配置錯誤或數據集結構不正確。需要用戶檢查YAML文件中的路徑配置,并驗證實際文件結構,確保程序在正確的位置尋找數據集。
具體地,以 YOLO 項目絕對路徑 “C:\Python\Projects\YOLO12_Animal”、數據集絕對路徑 “C:\Python\Projects\DatasetAnimalYolo” 為例,檢查用戶目錄下 “AppData\Roaming\Ultralytics\settings.json” 中的下載目錄設置,修改 “datasets_dir” 如下:
{..."datasets_dir": "C:\\Python\\Projects",...
}
5.2 拉取 Arial.ttf 報錯:Downloading https://ultralytics.com/assets/Arial.ttf to…
在 Downloading https://ultralytics.com/assets/Arial.ttf to /home/zelan/.config/Ultralytics/Arial.ttf…卡住并報錯:“Remote Disconnected: Remote end closed connection without response”。
問題分析與解決方法:
進行訓練時會自動下載 Arial.ttf 字體,可能由于網絡原因無法下載或者下載很慢。可以預先下載 Arial.ttf 并保存到用戶目錄下 “AppData\Roaming\Ultralytics\Arial.ttf”。注意不是保存到當前的 YOLO12 項目的根目錄下。
Arial.ttf 下載地址
5.3 虛擬內存不足報錯:OSError: [WinError 1455]
Error loading “C:\Python\Anaconda\anaconda3\envs\torch1.8\lib\site-packages\torch\lib\cudnn_cnn_infer64_8.dll” or one of its dependencies
問題分析與解決方法:
dll 文件或其依賴項時出現了問題,原因是頁面文件(即虛擬內存)的大小不足以完成操作。通過降低數據加載的線程數可以解決這個問題。
例如設置線程數 “workers” 為 1,減小每個訓練批次的大小 “batch”:
batch=4, # 設置每個訓練批次的大小為4close_mosaic=10, # 設置在訓練的最后 10 輪中關閉 Mosaic 數據增強workers=1, # 設置用于數據加載的線程數為1
【本節完】
版權聲明:
歡迎關注『跟我學YOLO』系列
轉發必須注明原文鏈接:
【跟我學YOLO】(3)YOLO12 訓練自己的數據集
Copyright by youcans@qq.com 2025
Crated:2025-07