YOLOv5入門實踐(3)— 手把手教你如何去劃分數據集

前言:Hello大家好,我是小哥談。數據集標注完成之后,下一步就是對這些數據集進行劃分了。面對繁雜的數據集,如果手動劃分的話,不僅麻煩而且不能保持隨機性。本節課就給大家介紹一種方法,即使用代碼去劃分數據集。那現在就讓我們開始今天的學習吧!🌈?

?前期回顧:

? ? ? ? ? ??YOLOv5入門實踐(1)— 手把手教你使用labelimg標注數據集(附安裝包+使用教程)

? ? ? ? ? ??YOLOv5入門實踐(2)— 手把手教你使用make sense標注數據集(附工具地址+使用教程)

? ? ? ? ?? ?目錄

🚀1.訓練集、驗證集和測試集

🚀2.數據集劃分原則

🚀3.準備數據集

步驟1:創建數據集文件夾

步驟2:標注數據集

步驟3:創建劃分后數據集的文件夾

🚀4.劃分代碼

步驟1:在YOLOv5項目目錄下創建split.py文件

步驟2:將代碼復制到split.py文件中

步驟3:設置路徑并設置劃分比例

🚀1.訓練集、驗證集和測試集

數據集標注完成之后,我們通常需要把數據集劃分為三類:訓練集、驗證集和測試集。🌺

舉個例子:模型的訓練與學習,類似于老師教學生知識的過程。

訓練集(train set):用于訓練模型(擬合參數),即模型擬合的數據樣本集合。相當于老師上課教學生知識的過程

驗證集(validation set):用于確定網絡結構或者控制模型復雜程度的超參數(擬合超參數),是模型訓練過程中單獨留出的樣本集,它可以用于調整模型的超參數和用于對模型的能力進行初步評估。 通常用來在模型迭代訓練時,用以驗證當前模型泛化能力(準確率,召回率等),防止過擬合的現象出現,以決定如何調整超參數。相當于上完課后的課后練習題,用于幫助學生查漏補缺

測試集(test set):用來評估最終模型的性能如何(評價模型好壞),測試集沒有參于訓練,主要是測試訓練好的模型的準確能力等,但不能作為調參、選擇特征等算法相關的選擇的依據,說白了就只是用于評價模型好壞的一個數據集。相當于期末考試,真正地去檢驗學生的學習效果

說明:??????

參數:指由模型通過學習得到的變量,如權重和偏置。?

超參數:指根據經驗設定的參數,如迭代次數、隱藏層數、每層神經元的個數、學習率等。?


🚀2.數據集劃分原則

數據集劃分的方法并沒有明確的規定,不過可以參考3個原則

1.對于小規模樣本集(幾萬量級),常用的分配比例是 70% 訓練集、20% 驗證集、10% 測試集。
2.對于大規模樣本集(百萬級以上),只要驗證集和測試集的數量足夠即可,例如有 100w 條數據,那么留 1w 驗證集,1w 測試集即可。1000w 的數據,同樣留 1w 驗證集和 1w 測試集。
3.超參數越少,或者超參數很容易調整,那么可以減少驗證集的比例,更多的分配給訓練集。


🚀3.準備數據集

步驟1:創建數據集文件夾

在與項目文件同級目錄的datasets文件夾中,創建SafetyHelmetWearingDataset文件夾接著在該文件夾下創建imageslabels文件夾。

  • images:存放需要打標簽的圖片文件
  • labels:存放標注的標簽文件

說明:??????

1.也可以在YOLOv5項目目錄下創建數據集文件夾并命名,其性質是一樣的。?

2.datasets?和?SafetyHelmetWearingDataset是我自己命名的,是為后期訓練安全帽佩戴檢測模型做準備,此處名字可以自定義?

步驟2:標注數據集

說明:

關于數據集的標注,可以參考我的另外兩篇標注數據集的文章。??????

YOLOv5入門實踐(1)— 手把手教你使用labelimg標注數據集(附安裝包+使用教程)

YOLOv5入門實踐(2)— 手把手教你使用make sense標注數據集(附工具地址+使用教程)

步驟3:創建劃分后數據集的文件夾

創建一個名為imageSets的文件夾,用來保存稍后劃分好的訓練集、驗證集和測試集。🌱

說明:??????

1.所有訓練所需的圖片存于一個文件夾中(指images),所有訓練所需的標簽存于一個文件夾中(指labels)。?

2.圖片名與標簽名要一一對應。?


🚀4.劃分代碼

步驟1:在YOLOv5項目目錄下創建split.py文件

步驟2:將代碼復制到split.py文件中

import os
import shutil
import randomrandom.seed(0)def split_data(file_path,xml_path, new_file_path, train_rate, val_rate, test_rate):each_class_image = []each_class_label = []for image in os.listdir(file_path):each_class_image.append(image)for label in os.listdir(xml_path):each_class_label.append(label)data=list(zip(each_class_image,each_class_label))total = len(each_class_image)random.shuffle(data)each_class_image,each_class_label=zip(*data)train_images = each_class_image[0:int(train_rate * total)]val_images = each_class_image[int(train_rate * total):int((train_rate + val_rate) * total)]test_images = each_class_image[int((train_rate + val_rate) * total):]train_labels = each_class_label[0:int(train_rate * total)]val_labels = each_class_label[int(train_rate * total):int((train_rate + val_rate) * total)]test_labels = each_class_label[int((train_rate + val_rate) * total):]for image in train_images:print(image)old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'train' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in train_labels:print(label)old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'train' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)for image in val_images:old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'val' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in val_labels:old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'val' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)for image in test_images:old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'test' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in test_labels:old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'test' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)if __name__ == '__main__':file_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images"xml_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\labels"new_file_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\imageSets"split_data(file_path,xml_path, new_file_path, train_rate=0.7, val_rate=0.2, test_rate=0.1)

步驟3:設置路徑并設置劃分比例

file_path:圖片所在位置的絕對路徑,即?images

xml_path:標簽所在位置的絕對路徑,即?labels

new_file_path:劃分后三個文件的保存位置,即 imageSets

最后一行是劃分比例,大家可以根據實際情況來劃分,這里我劃分的是7:2:1

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

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

相關文章

Xcode升級導致關聯庫報錯

想辦法找到對應的庫 然后到 Build Phases -- LinkBinary With Libraries中點擊,選擇對應的framework即可,就像我工程的報錯 Undefined symbol: _OBJC_CLASS_$_ADClient _OBJC_CLASS_$_ASIdentifierManager 缺失的庫是AdSupport.framework 添加后再次編…

Elasticsearch6.x和7.x的區別

Elasticsearch6.x和7.x的區別 1、查找方面的區別 在增刪改方面,6.x和7.x是一樣的,在查找方面(分為普通查找和有高亮的查找),6.x和7.x有區別。 在7.x的es中: org.springframework.data.elasticsearch.cor…

Styled-components,另一種css in js的方案

介紹 Styled-components是一種流行的CSS-in-JS庫,它為React和React Native應用程序提供了一種優雅的方式來管理組件的樣式。它的設計理念是將CSS樣式與組件邏輯緊密綁定在一起,從而使樣式在組件層級中作用更加清晰和可維護 使用 安裝Styled-components…

【C語言】操作符詳解

目錄 一、算數操作符 二、移位操作符 1.左移操作符 2.右移操作符 (1) 邏輯右移 (2) 算術右移 (3)小總結 三、位操作符 四、賦值操作符 五、單目操作符 六、關系操作符 七、邏輯操作符 八、 條件操作符 九、逗號表達式 十、下標引用、函數調用和結構成員 1. [ ]下…

QT-如何使用RS232進行讀寫通訊

以下是一個使用Qt進行RS232通訊的具體示例&#xff0c;包括讀取和寫入數據的操作&#xff1a; #include <QCoreApplication> #include <QDebug> #include <QSerialPort> #include <QTimer>QSerialPort serial; // 串口對象void readData() {QByteArra…

GO學習之 微框架(Gin)

GO系列 1、GO學習之Hello World 2、GO學習之入門語法 3、GO學習之切片操作 4、GO學習之 Map 操作 5、GO學習之 結構體 操作 6、GO學習之 通道(Channel) 7、GO學習之 多線程(goroutine) 8、GO學習之 函數(Function) 9、GO學習之 接口(Interface) 10、GO學習之 網絡通信(Net/Htt…

UDS的DID(Data identification)

引言 DID是UDS中的一個重要概念&#xff0c;它代表著特定的數據標識符。DID用于標識和獲取ECU中的特定參數數據&#xff0c;如傳感器數據、狀態信息等。通過使用DID&#xff0c;診斷工具可以準確地獲取所需的數據&#xff0c;從而幫助診斷人員更好地了解車輛的狀態和性能。 D…

開發者必知:.gitignore 文件的魔法,助你管理項目文件如虎添翼!

前言&#xff1a; 在軟件開發的世界中&#xff0c;版本控制是一個至關重要的環節。而 Git 作為目前最流行的分布式版本控制系統之一&#xff0c;已經成為開發者不可或缺的工具。然而&#xff0c;在日常的開發過程中&#xff0c;有些文件是不適合被納入版本控制的&#xff0c;比…

leetcode242. 有效的字母異位詞

題目&#xff1a;leetcode242. 有效的字母異位詞 描述&#xff1a; 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的字母異位詞。 注意&#xff1a;若 s 和 t 中每個字符出現的次數都相同&#xff0c;則稱 s 和 t 互為字母異位詞。 示例 1: 輸入: s “…

【React | 前端】在React的前端頁面中,判斷某個變量值是否被定義?根據是否定義顯示不同的內容?

問題描述 在React的前端頁面中&#xff0c;判斷某個變量值是否被定義&#xff1f;根據是否定義顯示不同的內容&#xff1f; 問題場景 假如&#xff0c;現在有一個需求是設計一個新功能&#xff0c;新功能中要求新增一個之前沒有的變量&#xff0c;假設是計算某一個數組的長度…

基于Java+SpringBoot+Vue的數碼論壇系統設計與實現(源碼+LW+部署文檔等)

博主介紹&#xff1a; 大家好&#xff0c;我是一名在Java圈混跡十余年的程序員&#xff0c;精通Java編程語言&#xff0c;同時也熟練掌握微信小程序、Python和Android等技術&#xff0c;能夠為大家提供全方位的技術支持和交流。 我擅長在JavaWeb、SSH、SSM、SpringBoot等框架…

【C語言】深度剖析數據在內存中的存儲

一、數據類型詳細介紹 1、數據類型介紹 &#xff08;1&#xff09;基本的內置類型 //內置類型就是C語言自帶的類型char //字符數據類型 short //短整型 int //整形 long //長整型 long long //更長的整形 float //單精度浮點數 double …

微信小程序使用rich-text解析富文本字符串的時候,遇到image標簽圖片很大超過屏幕

場景&#xff1a; 使用uniapp開發微信小程序&#xff0c;解析富文本文章需求 用到的組件&#xff1a; u-view2.0的u-parse uniapp提供的rich-text 以上兩種組件都是解析富文本的作用&#xff0c;一般用于富文本解析場景&#xff0c;比如解析文章內容&#xff0c;商品詳情&am…

桶排序-1184:明明的隨機數

【題目描述】 明明想在學校中請一些同學一起做一項問卷調查&#xff0c;為了實驗的客觀性&#xff0c;他先用計算機生成了N個1到1000之間的隨機整數&#xff08;N≤100&#xff09;&#xff0c;對于其中重復的數字&#xff0c;只保留一個&#xff0c;把其余相同的數去掉&#x…

安防監控視頻匯聚平臺EasyCVR分發的FLV視頻流在VLC中無法播放是什么原因?

眾所周知&#xff0c;TSINGSEE青犀視頻匯聚平臺EasyCVR可支持多協議方式接入&#xff0c;包括主流標準協議國標GB28181、RTSP/Onvif、RTMP等&#xff0c;以及廠家私有協議與SDK接入&#xff0c;包括海康Ehome、海大宇等設備的SDK等。在視頻流的處理與分發上&#xff0c;視頻監控…

【jvm】jvm的生命周期

目錄 一、啟動二、執行三、退出 一、啟動 1.java虛擬機的啟動是通過引導類加載器bootstrap class loader創建一個初始類&#xff08;initial class&#xff09;來完成的&#xff0c;這個類是由虛擬機的具體實現指定的(根據具體虛擬機的類型) 二、執行 1.一個運行中的java虛擬機…

ORACLE行轉列、列轉行實現方式及案例

ORACLE行轉列、列轉行實現方式及案例 行轉列案例方式1.PIVOT方式2.MAX和DECODE方式3.CASE WHEN和GROUP BY 列轉行案例方式1.UNPIVOT方式2.UNION ALL 行轉列 案例 假設我們有一個名為sales的表&#xff0c;其中包含了產品銷售數據。表中有三列&#xff1a;product&#xff08;…

FPGA實踐 ——Verilog基本實驗步驟演示

0x00 回顧&#xff1a;AND/OR/NOT 邏輯的特性 AND&#xff1a;與門可以具有兩個或更多的輸入&#xff0c;并返回一個輸出。當所有輸入值都為 1 時&#xff0c;輸出值為 1。如果輸入值中有任何一個為 0&#xff0c;則輸出值為 0。 OR&#xff1a;或門可以具有兩個或更多的輸入…

【python】-【】

文章目錄 轉義字符和原字符二進制與字符編碼標識符和保留字變量的定義和使用變量字符串列表for 一、print會輸出①數字②字符串&#xff08;必須加引號&#xff09;③含有運算符的表達式&#xff08;例如 31 其中3&#xff0c;1是操作數&#xff0c;是運算符&#xff09;&#…

vector的模擬實現

什么是vector vector是一個封裝了動態大小數組的順序容器跟任意其它類型容器一樣&#xff0c;它能夠存放各種類型的對象。 模擬實現 實現前的準備 在實現vector之前&#xff0c;為了和庫里的區分開需要將實現的vector放在一個自定義的命名空間里。而且vector需要實現成模版…