第39周——訓練自己的數據集

目錄

1. 下載數據

2. 配置開發環境

3. 預處理數據


  • 🍨 本文為🔗365天深度學習訓練營?中的學習記錄博客
  • 🍖 原作者:K同學啊

1. 下載數據

百度網盤:百度網盤 請輸入提取碼
壓縮文件中有兩個文件夾,分別是Annotations和ImageSet文件夾,我的理解:
ImageSet:原始圖片
Annotations:針對原始圖片標注了有效信息的文件,比如位置信息等。

2. 配置開發環境

第1天課里已經下載了yolov5的github項目,將該項目作為項目文件,通過各類IDE打開即可。你可能需要安裝依賴包(pip install -r requirement.txt),可能需要配置python解釋器和虛擬環境。
在項目根目錄下本身有一個data文件,里面有很多預置的數據集文件。為了區分,我在根目錄下建立一個mydata的文件夾,然后將下載的數據解壓后的兩個文件夾copy到mydata中。

3. 預處理數據

腳本1:1. 數據集劃分 (split_train_val.py) :將數據分為訓練集、驗證集和測試集
輸出:
ImageSets/Main/train.txt:訓練集文件名列表
ImageSets/Main/val.txt:驗證集文件名列表
ImageSets/Main/test.txt:測試集文件名列表
腳本2:2. 格式轉換 (voc_label.py):將VOC格式(XML格式)轉換為YOLO格式(TXT格式,具體查詢資料)
輸出:
labels/:YOLO格式標注文件夾
train.txt:訓練集圖像路徑列表
val.txt:驗證集圖像路徑列表

split_train_val.py腳本代碼:

# 導入必要的庫  
import os  
import random  
import argparse  # 創建一個參數解析器  
parser = argparse.ArgumentParser()  # 添加命令行參數,用于指定XML文件的路徑,默認為 'Annotations' 文件夾  
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')  # 添加命令行參數,用于指定輸出txt標簽文件的路徑,默認為 'ImageSets/Main' 文件夾  
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')  # 解析命令行參數  
opt = parser.parse_args()  # 定義訓練驗證集和測試集的劃分比例  
trainval_percent = 1.0  # 使用全部數據  
train_percent = 0.9  # 訓練集占訓練驗證集的90%  # 設置XML文件夾的路徑,根據命令行參數指定  
xmlfilepath = opt.xml_path  # 設置輸出txt標簽文件的路徑,根據命令行參數指定  
txtsavepath = opt.txt_path  # 獲取XML文件夾中的所有XML文件列表  
total_xml = os.listdir(xmlfilepath)  # 如果輸出txt標簽文件的文件夾不存在,創建它  
if not os.path.exists(txtsavepath):  os.makedirs(txtsavepath)  # 獲取XML文件的總數  
num = len(total_xml)  # 創建一個包含所有XML文件索引的列表  
list_index = range(num)  # 計算訓練驗證集的數量  
tv = int(num * trainval_percent)  # 計算訓練集的數量  
tr = int(tv * train_percent)  # 從所有XML文件索引中隨機選擇出訓練驗證集的索引  
trainval = random.sample(list_index, tv)  # 從訓練驗證集的索引中隨機選擇出訓練集的索引  
train = random.sample(trainval, tr)  # 打開要寫入的訓練驗證集、測試集、訓練集、驗證集的txt文件  
file_trainval = open(txtsavepath + '/trainval.txt', 'w')  
file_test = open(txtsavepath + '/test.txt', 'w')  
file_train = open(txtsavepath + '/train.txt', 'w')  
file_val = open(txtsavepath + '/val.txt', 'w')  # 遍歷所有XML文件的索引  
for i in list_index:  name = total_xml[i][:-4] + '\n'  # 獲取XML文件的名稱(去掉后綴.xml),并添加換行符  # 如果該索引在訓練驗證集中  if i in trainval:  file_trainval.write(name)  # 寫入訓練驗證集txt文件  if i in train:  # 如果該索引在訓練集中  file_train.write(name)  # 寫入訓練集txt文件  else:  file_val.write(name)  # 否則寫入驗證集txt文件  else:  file_test.write(name)  # 否則寫入測試集txt文件  # 關閉所有打開的文件  
file_trainval.close()  
file_train.close()  
file_val.close()  
file_test.close()

voc_label.py代碼:

# -*- coding: utf-8 -*-  # 導入必要的庫  
import xml.etree.ElementTree as ET  
import os  
from os import getcwd  # 定義數據集的名稱  
sets = ['train', 'val', 'test']  # 定義類別列表,這里有兩個類別,可以根據需要添加更多類別  
classes = ["A", "B"]  # 請根據您的數據集修改這些類別名稱  # 獲取當前工作目錄的絕對路徑  
abs_path = os.getcwd()  
print(abs_path)  # 定義一個函數,將邊界框的坐標從絕對值轉換為相對于圖像大小的比例  
def convert(size, box):  dw = 1. / (size[0])  # 計算圖像寬度的倒數  dh = 1. / (size[1])  # 計算圖像高度的倒數  x = (box[0] + box[1]) / 2.0 - 1  # 計算中心點的x坐標  y = (box[2] + box[3]) / 2.0 - 1  # 計算中心點的y坐標  w = box[1] - box[0]  # 計算邊界框的寬度  h = box[3] - box[2]  # 計算邊界框的高度  x = x * dw  # 縮放x坐標  w = w * dw  # 縮放寬度  y = y * dh  # 縮放y坐標  h = h * dh  # 縮放高度  return x, y, w, h  # 定義一個函數,將標注文件從XML格式轉換為YOLO格式  
def convert_annotation(image_id):  in_file = open('./Annotations/%s.xml' % (image_id), encoding='UTF-8')  # 打開XML標注文件  out_file = open('./labels/%s.txt' % (image_id), 'w')  # 打開要寫入的YOLO格式標簽文件  tree = ET.parse(in_file)  # 解析XML文件  root = tree.getroot()  filename = root.find('filename').text  # 獲取圖像文件名  filenameFormat = filename.split(".")[1]  # 獲取文件格式  size = root.find('size')  # 獲取圖像尺寸信息  w = int(size.find('width').text)  # 獲取圖像寬度  h = int(size.find('height').text)  # 獲取圖像高度  for obj in root.iter('object'):  difficult = obj.find('difficult').text  # 獲取對象的難度標志  cls = obj.find('name').text  # 獲取對象的類別名稱  if cls not in classes or int(difficult) == 1:  continue  cls_id = classes.index(cls)  # 獲取類別的索引  xmlbox = obj.find('bndbox')  # 獲取邊界框坐標信息  b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),  float(xmlbox.find('ymax').text))  b1, b2, b3, b4 = b  # 標注越界修正  if b2 > w:  b2 = w  if b4 > h:  b4 = h  b = (b1, b2, b3, b4)  bb = convert((w, h), b)  # 調用convert函數,將邊界框坐標轉換為YOLO格式  out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')  # 寫入YOLO格式標簽文件  return filenameFormat  # 獲取當前工作目錄  
wd = getcwd()  # 遍歷每個數據集(train、val、test)  
for image_set in sets:  # 如果labels目錄不存在,創建它  if not os.path.exists('./labels/'):  os.makedirs('./labels/')  # 從數據集文件中獲取圖像ID列表  image_ids = open('./ImageSets/Main/%s.txt' % (image_set)).read().strip().split()  # 打開要寫入的文件,寫入圖像的文件路徑和格式  list_file = open('./%s.txt' % (image_set), 'w')  for image_id in image_ids:  filenameFormat = convert_annotation(image_id)  list_file.write(abs_path + '/images/%s.%s\n' % (image_id, filenameFormat))  # 注意你的圖片格式,如果是.jpg記得修改  list_file.close()

? ? ? ? ? ? ? ? ? ? ? ??

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

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

相關文章

CentOS7中Docker的安裝與卸載

CentOS7 從零開始:Docker 安裝與卸載全指南(新手友好版) 作為一名剛接觸 Linux 和容器技術的新手,你是否曾在安裝 Docker 時被各種命令和報錯搞得一頭霧水?比如執行 yum install docker 時提示 “倉庫不存在”,或者啟動 Docker 后用 docker version 只顯示 client 不顯示…

解決MinIO上傳圖片后返回URL無法訪問的問題

一、問題現象 上傳接口返回了文件的訪問路徑,比如: http://127.0.0.1:9005/lease/20250808/xxx-uuid.png但是用瀏覽器直接打開該地址卻顯示權限拒絕,前端也訪問不到:二、問題原因分析 桶權限設置不正確: MinIO默認桶權限是私有的,即使瀏覽器能…

系統網絡端口安全掃描腳本及詳解

#!/bin/bash # 系統服務端口安全掃描 - 修正版echo " 系統服務端口安全掃描報告 "# 1. 高風險端口識別 echo "?? 對外開放的高風險端口:" awk /0.0.0.0:21/ {print " 端口 21 - FTP (明文傳輸)\n 🚨 嚴重安全風險,建議…

DAY 39 圖像數據與顯存

知識點回顧 圖像數據的格式:灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 一、 圖像數據的介紹 1.1 灰度圖像 從這里開始我們進入到了圖像數據相關的部分,也是默認…

從大數據視角理解時序數據庫選型:為何選擇 Apache IoTDB?

目錄一、什么是時序數據庫?為什么你需要它?🔧典型應用場景:二、時序數據庫選型維度有哪些?三、為什么推薦 Apache IoTDB?🧠 Apache 頂級項目,工業 IoT 場景原生支持🚀 性…

[ MySQL 數據庫 ] 環境安裝配置和使用

目錄 一. 數據庫(DataBase) 1.定義: 2. 常見的數據庫產品: 3. MySQL數據庫 (1). 介紹 : (2). cmd命令行方式連接 MySQL (3). MySQL的常用命令 二. MySQL數據庫 環境安裝及配置 三. SQL 1.定義 : 2. DDL (1)數據庫 (2)數據表 1. 字段(列)和記錄(行) 2. 表特征 3.…

Numpy科學計算與數據分析:Numpy布爾索引與花式索引實戰

Numpy高級索引 學習目標 通過本課程,學員將掌握Numpy中布爾索引和花式索引的使用方法,能夠靈活運用這些高級索引技術進行復雜的數據操作和處理。 相關知識點 Numpy高級索引 學習內容 1 Numpy高級索引 1.1 布爾索引 布爾索引是Numpy中一種非常強大…

【Linux】patch補丁的生成與使用方法總結

引言 在 Linux 和開源世界中,patch 是一個極其強大且常用的工具。它允許開發者和系統管理員以增量方式修改文件,特別適用于源代碼的更新、錯誤修復、功能補丁的分發與應用。 目錄 引言 一、patch介紹 二、生成補丁文件 三、補丁文件內容解析 四、p…

雜談 001 · VScode / Copilot 25.08 更新

原文鏈接https://www.castamerego.com/blog/talk-001 2025.08.08 , VS code 發布八月更新,同一天 Copilot 也更新了 GPT-5, 淺體驗一下 VS code 更新 發行說明更新頁面內跳轉顯示 AI 比例頁面內跳轉 Copilot 更新 對話回溯 checkpoints頁面內跳轉進度列表頁面內…

微軟發布Project Ire項目:可自主檢測惡意軟件的人工智能系統

微軟Project Ire項目利用AI自主逆向工程并分類軟件性質微軟近日公布了Project Ire項目,這是一個能夠自主進行逆向工程并分類軟件性質的人工智能(AI)系統。該系統由大型語言模型(LLM)驅動,通過使用反編譯器等…

k8s核心組件——kubelet詳解

🚀Kubernetes 核心組件解析:什么是 Kubelet?它的作用是什么? 在 Kubernetes(K8s)集群中,Kubelet 是最重要的 Node 組件之一,它負責管理和維護 Pod 的生命周期,確保容器在…

C++ 部署LSTM(.onnx)

0、 背景 在工業自動化控制領域,預測某些變量是否關鍵。根據工廠的數據,訓練好模型之后,將其轉我通用的onnx 模型,并實現高效的推理。 模型訓練 import numpy as np from para import * from data_utils import MyDataset from da…

深度學習-卷積神經網絡CNN-1×1卷積層

1x1卷積核,又稱為網中網(Network in Network):NIN卷積的本質是有效提取相鄰像素間的相關特征,而11的卷積顯然沒有此作用。它失去了卷積層的特有能力——在高度和寬度維度上,識別相鄰元素間相互作用的能力。…

使用 Python 異步爬蟲抓取豆瓣電影Top250排行榜

導讀 在現代網絡爬蟲開發中,面對 海量網頁數據、慢速響應的網絡接口,傳統的同步爬蟲方式已經不能滿足高效抓取需求。本文將手把手帶你構建一個 基于 aiohttp + asyncio 的異步爬蟲系統,實戰目標是抓取豆瓣電影 Top250 排行榜中的電影名稱、評分和詳情頁地址。 目錄 導讀 …

云原生開發全面解析:從核心理念到實踐挑戰與解決方案

1. 云原生開發的核心理念與定義 云原生(Cloud Native)是一種基于云計算環境設計和運行應用程序的方法論,其三大技術支柱為容器化、微服務和聲明式API。根據CNCF定義,云原生技術通過標準化接口和自動化管理,使應用具備…

WebForms 實例

WebForms 實例 引言 WebForms 是 ASP.NET 技術中的一種重要技術,它允許開發者以表單的形式創建動態網頁。本文將通過具體的實例,深入探討 WebForms 的基本概念、實現方法以及在實際項目中的應用。 WebForms 簡介 WebForms 是一種用于創建動態網頁的框架,它允許開發者以類…

Java 之 多態

一、多態 多態故名思義,多種狀態。比如Animal 這個類中,eat 方法是 公共的方法,但是當 People,Dog , Cat,繼承時,我們知道人要吃的是米飯,狗要吃的是狗糧,貓要吃的是貓糧。所以當不同類型的引用…

文件結構樹的├、└、─ 符號

目錄一、├、└、─符號的背景二、├、└、─ 符號的含義2.1 ├ 帶豎線的分支符號2.2 └不帶豎線的分支符號2.3 ─橫線符號三、Windows系統中生成目錄樹一、├、└、─符號的背景 我們在編程中,可能會經常遇到一些特殊符號├、└、─。這并非偶然,二十由…

微軟XBOX游戲部門大裁員

近日有報道稱,微軟正計劃對Xbox游戲部門進行另外一次裁員,影響的將是整個團隊,而不是特定崗位或者部門,大概10%至20%的Xbox團隊成員受到影響,這是微軟這次對Xbox業務重組的一部分。 據報道,微軟已經開始新…

【關于Java 8 的新特性】

問:“Java 8 有啥新東西?” 你憋了半天,只說出一句:“嗯……有 Lambda 表達式。”別慌!Java 8 可不只是“語法糖”那么簡單。它是一次真正讓 Java 從“老派”走向“現代” 的大升級!一、Lambda 表達式&…