【保姆級視頻教程(二)】YOLOv12訓練數據集構建:標簽格式轉換-劃分-YAML 配置 避坑指南 | 小白也能輕松玩轉目標檢測!

【2025全站首發】YOLOv12訓練數據集構建:標簽格式轉換-劃分-YAML 配置 避坑指南 | 小白也能輕松玩轉目標檢測!

文章目錄

  • 1. 數據集準備
    • 1.1 標簽格式轉換
    • 1.2 數據集劃分
    • 1.3 yaml配置文件創建
  • 2. 訓練驗證

1. 數據集準備

示例數據集下載鏈接:PKU-Market-PCB數據集

1.1 標簽格式轉換

cursor prompt

請撰寫一個py腳本。將@Annotations文件夾下的所有類別的xml格式的標注轉換成為yolo格式。轉換后的標簽請新建一個labels文件夾,保存在該文件夾下。

生成的xml2yolo.py腳本內容如下:

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() 

1.2 數據集劃分

cursor prompt

請創建一個py腳本,對數據進行劃分。對于image文件夾下的每一個類別按照8:2進行隨機劃分。請直接生成包含所有圖像絕對路徑的train.txt和val.txt文件。并輸出每個類別訓練集驗證集的數量。

生成的split_dataset.py腳本內容如下:

import os
import glob
import randomdef split_dataset(image_root='images', train_ratio=0.8, seed=42):"""數據集劃分函數:param image_root: 圖片根目錄路徑:param train_ratio: 訓練集比例:param seed: 隨機種子"""# 設置隨機種子保證可重復性random.seed(seed)# 初始化路徑列表train_paths = []val_paths = []# 獲取所有類別目錄class_dirs = [d for d in glob.glob(os.path.join(image_root, '*')) if os.path.isdir(d)]# 初始化統計字典class_stats = {}for class_dir in class_dirs:# 獲取類別名稱class_name = os.path.basename(class_dir)# 獲取當前類別所有圖片路徑image_paths = glob.glob(os.path.join(class_dir, '*.*'))image_paths = [p for p in image_paths if p.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))]# 打亂順序random.shuffle(image_paths)# 計算分割點split_idx = int(len(image_paths) * train_ratio)# 分割數據集train = image_paths[:split_idx]val = image_paths[split_idx:] if split_idx < len(image_paths) else []# 轉換為絕對路徑并添加路徑分隔符train_paths.extend([os.path.abspath(p) + '\n' for p in train])val_paths.extend([os.path.abspath(p) + '\n' for p in val])# 記錄統計信息class_stats[class_name] = {'total': len(image_paths),'train': len(train),'val': len(val)}# 寫入文件with open('train.txt', 'w') as f:f.writelines(train_paths)with open('val.txt', 'w') as f:f.writelines(val_paths)# 新增統計信息輸出print("\n各類別數據分布:")print("{:<15} {:<10} {:<10} {:<10}".format('類別', '總數', '訓練集', '驗證集'))for cls, stat in class_stats.items():print("{:<15} {:<10} {:<10} {:<10}".format(cls, stat['total'], stat['train'], stat['val']))# 原有總樣本數輸出保持不變print(f'\n數據集劃分完成!\n訓練集樣本數: {len(train_paths)}\n驗證集樣本數: {len(val_paths)}')if __name__ == '__main__':# 使用示例(根據實際情況修改路徑)split_dataset(image_root='images') 

1.3 yaml配置文件創建

pcb_detect.yaml具體內容如下:

path: E:\project\YOLOv12\dataset\PCB_DATASET # dataset root dir
train: train.txt # train images (relative to 'path') 118287 images
val: val.txt # val images (relative to 'path') 5000 images
test: # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
names:0: Missing_hole1: Mouse_bite2: Open_circuit3: Short4: Spur5: Spurious_copper

2. 訓練驗證

train.py訓練驗證腳本內容如下:

from ultralytics import YOLOmodel = YOLO('yolov12n.yaml')# Train the model
results = model.train(data='pcb_detect.yaml',epochs=300, batch=4, imgsz=640,scale=0.5,  # S:0.9; M:0.9; L:0.9; X:0.9mosaic=1.0,mixup=0.0,  # S:0.05; M:0.15; L:0.15; X:0.2copy_paste=0.1,  # S:0.15; M:0.4; L:0.5; X:0.6device="0",workers=0,
)# Evaluate model performance on the validation set
metrics = model.val()

遇到``AttributeError: ‘InfiniteDataLoader‘ object has no attribute ‘` 報錯,查看解決方案~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71988.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【人工智能】藍耘智算平臺盛大發布DeepSeek滿血版:開創AI推理體驗新紀元

&#x1f4dd;個人主頁&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; ? 藍耘智算平臺 藍耘智算平臺核心技術與突破元生代推理引擎快速入門&#xff1a;三步調用大模型接口&#xff0c;OpenAI SDK無縫兼容實戰用例文…

【網絡編程】幾個常用命令:ping / netstat / xargs / pidof / watch

ping&#xff1a;檢測網絡聯通 1. ping 的基本功能2. ping 的工作原理3. ping 的常見用法4. ping 的輸出解釋5. ping 的應用場景6. 注意事項 netstat&#xff1a;查看網絡狀態 1. netstat 的基本功能2. 常見用法3. 示例4. 輸出字段解釋5. netstat 的替代工具6. 注意事項 xargs&…

【C++】:STL詳解 —— list類

目錄 list的概念 list的構造函數 list的大小 size() resize() empty() list的插入 push_front()和emplace_front() push_back()和emplace_back() insert()和emplace() list的刪除 pop_front() pop_back() erase() remove() remove_if() unique() clear()…

【數據結構】(11) Map 和 Set

一、Map 和 Set 的簡介 1、Set 和 Map Map 和 Set 是集合類框架學習的最后一部分。Map 和 Set 都是接口&#xff0c;需要通過 TreeSet、HashSet 和 TreeMap、HashMap 實例化。注意&#xff0c;Set 實現了 Collection&#xff0c;Map 并沒有。 Set 存放的是鍵&#xff08;Key&a…

關于CanvasRenderer.SyncTransform觸發調用的機制

1&#xff09;關于CanvasRenderer.SyncTransform觸發調用的機制 2&#xff09;小游戲Spine裁剪掉幀問題 3&#xff09;Dedicated Server性能問題 4&#xff09;.mp4視頻放入RT進行渲染的性能分析閉坑指南 這是第421篇UWA技術知識分享的推送&#xff0c;精選了UWA社區的熱門話題…

Kronecker分解(K-FAC):讓自然梯度在深度學習中飛起來

Kronecker分解&#xff08;K-FAC&#xff09;&#xff1a;讓自然梯度在深度學習中飛起來 在深度學習的優化中&#xff0c;自然梯度下降&#xff08;Natural Gradient Descent&#xff09;是一個強大的工具&#xff0c;它利用Fisher信息矩陣&#xff08;FIM&#xff09;調整梯度…

【HTML— 快速入門】HTML 基礎

準備工作 vscode下載 百度網盤 Subline Text 下載 Sublime Text下載 百度網盤 vscode 下載 Sublime Text 是一款輕量好用的文本編輯器&#xff0c;我們在寫前端代碼時&#xff0c;使用 Sublime Text 打開比使用記事本打開&#xff0c;得到的代碼體驗更好&#xff0c;比 vscode…

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar)

鴻蒙開發深入淺出01&#xff08;基本環境搭建、頁面模板與TabBar&#xff09; 1、效果展示2、下載 DevEco Studio3、創建項目4、新建頁面模板5、更改應用信息6、新建以下頁面7、Index.ets8、真機運行9、圖片資源文件 1、效果展示 2、下載 DevEco Studio 訪問官網根據自己的版本…

自動駕駛泊車算法詳解(一)

自動駕駛泊車算法是自動駕駛技術中的重要組成部分&#xff0c;主要用于實現車輛在復雜場景下的自動泊車功能&#xff08;如垂直泊車、側方位泊車、斜列泊車等&#xff09;。其核心目標是通過感知、規劃和控制技術&#xff0c;使車輛在無人工干預的情況下安全、高效地完成泊車動…

鴻蒙next 點擊穿透實現

點擊穿透可以參考華為開發的保留文章,該章節只能在developer preview版本下查看 點擊穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…

27.[前端開發-JavaScript基礎]Day04-函數基本使用-遞歸-變量作用域-函數式編程

一、JavaScript函數 1 認識JavaScript函數 程序中的foo、bar、baz 認識函數 函數使用的步驟 2 函數的聲明和調用 聲明和調用函數 函數的參數 有參數的函數練習 函數的返回值 函數的練習 arguments參數&#xff08;JS高級再學習&#xff09; 3 函數的遞歸調用 函數中調用函數…

藍橋杯練習代碼

一、最長公共前綴 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 ""。 示例 1: 輸入:strs = ["flower","flow","flight"] 輸出:"fl"示例 2: 輸入:strs = ["dog",&q…

添加成對約束后的標簽傳播算法研究:使用Python語言編寫算法,在空手道數據集下驗證算法的準確性,在一定程度上解決非對齊問題

背景&#xff1a; 輔導的過程中遇到了一個比較新穎的問題&#xff0c;下面是我對這個問題的分析和簡要思路介紹。 思路分析&#xff1a; 這算機器學習下面的無監督學習&#xff0c;標簽傳播算法簡稱LPA&#xff0c;傳統的標簽傳播算法會出現非對齊問題&#xff0c;一句話描述就…

鴻蒙開發第4篇__關于在鴻蒙應用中使用Java語言進行設計

本博文很重要 HarmonyOS從 API8 開始不再支持使用Java作為開發語言&#xff0c;未來的新功能將在ArkTS中實現. API 8對應的是HarmonyOS 3.0.0版本。請看下圖&#xff1a; 因此&#xff0c; 讀者如果看到類似《鴻蒙應用程序開發》(2021年版本 清華大學出版計)書 還使用Java語言…

sklearn機器學習 Python代碼通用模板

以下是一個使用 scikit-learn&#xff08;sklearn&#xff09;進行機器學習的通用 Python 代碼模板。這個模板涵蓋了數據加載、預處理、模型訓練、評估和預測的基本流程&#xff0c;適用于常見的機器學習任務。 python # 導入必要的庫 import numpy as np import pandas as …

P9420 [藍橋杯 2023 國 B] 雙子數--最高效的質數篩【埃拉托斯特尼篩法】

P9420 [藍橋杯 2023 國 B] 雙子數 題目 分析代碼 題目 分析 首先&#xff0c;我們如何找到雙子數&#xff1f; 1&#xff09;找到所有質數滿足范圍內的質數&#xff08;即至少質數^2<23333333333333) 我們看見雙子數x的范圍2333<x<23333333333333&#xff0c;又因為…

deepseek 導出導入模型(docker)

前言 實現導出導入deepseek 模型。deepseek 安裝docker下參考 docker 導出模型 實際生產環境建議使用docker-compose.yml進行布局&#xff0c;然后持久化ollama模型數據到本地參考 echo "start ollama" docker start ollama#壓縮容器內文件夾&#xff0c;然后拷貝…

mysql有索引但是查詢沒有使用索引是什么問題

關鍵原因分析 索引選擇性問題 如果 order_id 沒有索引&#xff0c;即使 insert_time 有索引&#xff0c;優化器可能認為先通過 order_id 過濾數據更高效。但由于 order_id 無索引&#xff0c;只能全表掃描后過濾。即使 insert_time 有索引&#xff0c;如果滿足 insert_time >…

【Qt】為程序增加閃退crash報告日志

背景 隨著軟件代碼量的增加&#xff0c;軟件崩潰閃退的肯能行越來越大&#xff0c;其中一些是難以復現的&#xff0c;比如訪問了訪問了非法地址、被操作系統殺死等。 為此&#xff0c;在軟件出現閃退情況時&#xff0c;盡可能多的記錄閃退發生時信息&#xff0c;對排查閃退原…

C#從入門到精通(35)—如何防止winform程序因為誤操作被關閉

前言: 大家好,我是上位機馬工,碩士畢業4年年入40萬,目前在一家自動化公司擔任軟件經理,從事C#上位機軟件開發8年以上!我們在開發的上位機軟件運行起來以后,一般在右上角都有一個關閉按鈕,正常情況下點擊關閉按鈕就能關閉軟件,但是不排除我們不想關閉軟件,但是因為不…