YOLO電力物目標檢測訓練

最近需要進行電力物檢測相關的業務,因此制作了一個電力物數據集,使用YOLO目標檢測方法進行實驗,記錄實驗過程如下:

數據集標注

首先需要對電力物相關設備進行標注,這里我們選用labelme進行標注,使用無人機進行數據采集,得到了600余張圖像,我們的數據集包含三類:防振錘、間隔棒以及壓接管。

在這里插入圖片描述

數據集轉換為YOLO格式

使用Labelme標注完后,得到的是JSON文件(COCO格式),我們需要將其進行轉換,同時,還需要將其按照8:2的比例劃分數據集,代碼如下:

import argparse
import json
import os
from tqdm import tqdm
import shutil
import random#矩形轉換
def convert_label_json(json_dir, save_dir, classes):json_paths = os.listdir(json_dir)classes = classes.split(',')if not os.path.exists(save_dir):os.makedirs(save_dir)for json_path in tqdm(json_paths):path = os.path.join(json_dir, json_path)# 嘗試多種編碼讀取 JSONjson_dict = Noneencodings = ["utf-8", "gbk"]for encoding in encodings:try:with open(path, "r", encoding=encoding) as load_f:json_dict = json.load(load_f)breakexcept (UnicodeDecodeError, json.JSONDecodeError):continueif json_dict is None:print(f"Failed to read {json_path}")continueh, w = json_dict['imageHeight'], json_dict['imageWidth']txt_path = os.path.join(save_dir, json_path.replace('.json', '.txt'))txt_file = open(txt_path, 'w')for shape_dict in json_dict['shapes']:label = shape_dict['label']label_index = classes.index(label)points = shape_dict['points']# 提取所有點的 x 和 y 坐標xs = [p[0] for p in points]ys = [p[1] for p in points]# 計算最小外接矩形x_min, x_max = min(xs), max(xs)y_min, y_max = min(ys), max(ys)# 計算中心點和寬高xc = (x_min + x_max) / 2 / wyc = (y_min + y_max) / 2 / hbw = (x_max - x_min) / wbh = (y_max - y_min) / h# 寫入 YOLO 格式line = f"{label_index} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}\n"txt_file.write(line)txt_file.close()# 檢查文件夾是否存在
def mkdir(path):if not os.path.exists(path):os.makedirs(path)def split_datasets(image_dir, txt_dir, save_dir):# 創建文件夾mkdir(save_dir)images_dir = os.path.join(save_dir, 'images')labels_dir = os.path.join(save_dir, 'labels')img_train_path = os.path.join(images_dir, 'train')img_test_path = os.path.join(images_dir, 'test')img_val_path = os.path.join(images_dir, 'val')label_train_path = os.path.join(labels_dir, 'train')label_test_path = os.path.join(labels_dir, 'test')label_val_path = os.path.join(labels_dir, 'val')mkdir(images_dir)mkdir(labels_dir)mkdir(img_train_path)mkdir(img_test_path)mkdir(img_val_path)mkdir(label_train_path)mkdir(label_test_path)mkdir(label_val_path)# 數據集劃分比例,訓練集75%,驗證集15%,測試集15%,按需修改train_percent = 0.8val_percent = 0.2test_percent = 0total_txt = os.listdir(txt_dir)num_txt = len(total_txt)list_all_txt = range(num_txt)  # 范圍 range(0, num)num_train = int(num_txt * train_percent)num_val = int(num_txt * val_percent)num_test = num_txt - num_train - num_valtrain = random.sample(list_all_txt, num_train)# 在全部數據集中取出trainval_test = [i for i in list_all_txt if not i in train]# 再從val_test取出num_val個元素,val_test剩下的元素就是testval = random.sample(val_test, num_val)print("訓練集數目:{}, 驗證集數目:{},測試集數目:{}".format(len(train), len(val), len(val_test) - len(val)))for i in list_all_txt:name = total_txt[i][:-4]srcImage = os.path.join(image_dir, name + '.jpg')srcLabel = os.path.join(txt_dir, name + '.txt')if i in train:dst_train_Image = os.path.join(img_train_path, name + '.jpg')dst_train_Label = os.path.join(label_train_path, name + '.txt')shutil.copyfile(srcImage, dst_train_Image)shutil.copyfile(srcLabel, dst_train_Label)elif i in val:dst_val_Image = os.path.join(img_val_path, name + '.jpg')dst_val_Label = os.path.join(label_val_path, name + '.txt')shutil.copyfile(srcImage, dst_val_Image)shutil.copyfile(srcLabel, dst_val_Label)else:dst_test_Image = os.path.join(img_test_path, name + '.jpg')dst_test_Label = os.path.join(label_test_path, name + '.txt')shutil.copyfile(srcImage, dst_test_Image)shutil.copyfile(srcLabel, dst_test_Label)if __name__=="__main__":# labelme生成的json格式標注轉為yolov8支持的txt格式"""python json2txt_nomalize.py --json-dir my_datasets/color_rings/jsons --save-dir my_datasets/color_rings/txts --classes "cat,dogs""""parser = argparse.ArgumentParser(description='json convert to txt params')parser.add_argument('--json-dir', type=str,default='D:\project_mine\detection\datasets/fangxiandata\data/labels', help='json path dir')parser.add_argument('--save-dir', type=str,default='D:\project_mine\detection\datasets/fangxiandata\data/outputs' ,help='txt save dir')parser.add_argument('--classes', type=str, default='fangzhenchui,jiangebang,yajieguan',help='classes')#,道路,房屋,水渠,橋args = parser.parse_args()json_dir = args.json_dirsave_dir = args.save_dirclasses = args.classesconvert_label_json(json_dir, save_dir, classes)# 將圖片和標注數據按比例切分為 訓練集和測試集# """# python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data# """parser = argparse.ArgumentParser(description='split datasets to train,val,test params')parser.add_argument('--image-dir', type=str,default='D:\project_mine\detection\datasets/fangxiandata\data/images', help='image path dir')parser.add_argument('--txt-dir', type=str,default='D:\project_mine\detection\datasets/fangxiandata\data/outputs' , help='txt path dir')parser.add_argument('--save-dir', default='D:\project_mine\detection\datasets/fangxian',type=str, help='save dir')args_split = parser.parse_args()image_dir = args_split.image_dirtxt_dir = args_split.txt_dirsave_dir_split = args_split.save_dirsplit_datasets(image_dir, txt_dir, save_dir_split)

數據集配置

我們的數據集放到了fangxian文件夾中,需要設置對應的數據集配置文件:

path: ../datasets/fangxian # 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: fangzhenchui1: jiangebang2: yajieguan

開啟訓練

我們使用YOLO11網絡,設置batch8epoch100

from ultralytics import YOLO
model=YOLO("yolo11.yaml")
# Train the model
results = model.train(data="fangxian.yaml",epochs=100,batch=8,       # 根據GPU顯存調整(T4建議batch=8)imgsz=640,device="0",     # 指定GPU IDoptimizer="AdamW",lr0=1e-4,warmup_epochs=4,label_smoothing=0.1,amp=True)

在這里插入圖片描述

訓練過程

從訓練過程來看,這個數據集可能較為復雜,且博主沒有使用任何預訓練模型,因此其擬合的較慢,前十幾個epoch都均為0,但從第20個epoch開始,其AP值逐漸有起色

在這里插入圖片描述

隨后AP便逐漸正常了。

在這里插入圖片描述

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

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

相關文章

從阿里云域名解析異常事件看下域名解析過程

近日阿里云核心域名aliyuncs.com解析異常,涉及眾多依賴阿里云服務的網站和應用,故障從發現到修復耗時5個多小時。本文簡要分析下整個事件的過程,并分析域名解析的過程,了解根域名服務器在其中的作用,以了解。 1、aliyu…

應用分享 | 精準生成和時序控制!AWG在確定性三量子比特糾纏光子源中的應用

在量子技術飛速發展的今天,實現高效穩定的量子態操控是推動量子計算、量子通信等領域邁向實用化的關鍵。任意波形發生器(AWG)作為精準信號控制的核心設備,在量子實驗中發揮著不可或缺的作用。丹麥哥本哈根大學的研究團隊基于單個量…

基于規則的自然語言處理

基于規則的自然語言處理 規則方法形態還原(針對英語、德語、法語等)中文分詞切分歧義分詞方法歧義字段消歧方法分詞帶來的問題 詞性標注命名實體分類機器翻譯規則方法的問題 規則方法 以規則形式表示語言知識,強調人對語言知識的理性整理&am…

Vue Fragment vs React Fragment

文章目錄 前言🧩 一、概念對比:Vue Fragment vs React Fragment📦 二、使用示例對比? Vue 3 中使用 Fragment? React 中使用 Fragment 🔍 三、差異解析1. **使用方式**2. **傳遞屬性(如 key)**3. **插槽系…

3D圖像渲染和threejs交互坐標系入門知識整理

1. Games101 b站上面就有,看到第9節課基本對于圖形渲染的原理和渲染過程有所了解。然后就可以使用openGL和GLSL。 點輸入->投影到二維(生成三角形面)->光柵化為像素->z-buffer深度緩存判斷層級->著色shading 2. openGL和GLSL 參…

跨平臺架構區別

文章目錄 重編譯時輕運行時(uniapp)輕編譯時重運行時(Taro) 重編譯時輕運行時(uniapp) 對 vue 語法直接進行編譯轉換成對應平臺代碼,再通過添加運行時代碼去補充能力,比如 nextTick…

windows系統MySQL安裝文檔

概覽:本文討論了MySQL的安裝、使用過程中涉及的解壓、配置、初始化、注冊服務、啟動、修改密碼、登錄、退出以及卸載等相關內容,為學習者提供全面的操作指導。關鍵要點包括: 解壓 :下載完成后解壓壓縮包,得到MySQL 8.…

macOS多出來了:Google云端硬盤、YouTube、表格、幻燈片、Gmail、Google文檔等應用

文章目錄 問題現象問題原因解決辦法 問題現象 macOS啟動臺(Launchpad)多出來了:Google云端硬盤、YouTube、表格、幻燈片、Gmail、Google文檔等應用。 問題原因 很明顯,都是Google家的辦公全家桶。這些應用并不是通過獨立安裝的…

HarmonyOS 應用開發學習記錄 - 從Windows開發者視角看鴻蒙開發

起始 2024年6月21日召開的華為開發者大會2024上宣布Harmony OS NEXT(即鴻蒙星河版)面向開發者啟動Beta版,這也被人們稱為“純血鴻蒙”,它基于鴻蒙內核,不再兼容安卓開發的APP應用。 時至今日近一年了,我也有…

MySQL 事務管理與鎖優化:確保數據一致性和并發性

在多用戶并發訪問的數據庫系統中,如何確保數據的**一致性(Consistency)和并發性(Concurrency)**是一個核心挑戰。**事務(Transaction)和鎖(Lock)**是 MySQL 應對這一挑戰的兩大利器。事務保證了操作的原子性、一致性、隔離性和持久性,而鎖機制則在并發環境下協調不同…

OpenPrompt 有沒有實現連續提示詞和提手動示詞一起優化的

OpenPrompt 有沒有實現連續提示詞和提手動示詞一起優化的 OpenPrompt 中連續提示詞與手動提示詞的混合優化 OpenPrompt 確實支持同時優化連續提示詞(Soft Prompt)和手動設計的離散提示詞(Manual Prompt)。這種混合優化策略可以結合兩者的優勢: 連續提示詞:通過梯度下降…

Android添加語言列表

方式一 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java Settings.System.putString(context.getContentResolver(),Settings.System.SYSTEM_LOCALES, "ru-RU,en-US"); 方式2 packages/apps/Settings/src/co…

解決uniapp開發app map組件最高層級 遮擋自定義解決底部tabbar方法

subNvue,是 vue 頁面的原生子窗體,把weex渲染的原生界面當做 vue 頁面的子窗體覆蓋在頁面上。它不是全屏頁面,它給App平臺vue頁面中的層級覆蓋和原生界面自定義提供了更強大和靈活的解決方案。它也不是組件,就是一個原生子窗體。 …

如何保障服務器的安全

如何保障服務器的安全 以下是保障服務器安全的核心措施及實施建議: 一、基礎設施層防護 物理安全 機房設置防火/防水/防雷系統,部署門禁監控設備。 服務器固定于抗震機架,避免物理損壞。 網絡防護 防火墻規則:僅開放業務必要端…

C語言 學習 C程序的內存模型 2025年6月10日08:55:13

堆棧與內存管理 堆棧(Stack) : 后進先出(LIFO) 線性數據結構 包含壓棧(Push) ,彈棧(Pop) 用途:臨時存儲數據(函數調用,局部變量) 管理:由系統自動分配和回收 速度快 ,容量有限! 堆棧代碼示例: //堆棧示例 :局部變量 void getText() {int text20;//儲存在堆棧中 } 內存管理…

CppCon 2015 學習:Implementing class properties effectively

這段內容講的是C中“屬性”(Property)的實現及其設計理念,并結合一個實際類Text來說明。中文理解如下: 關于“屬性”(Property) 屬性:介于類的字段(field)和方法&#…

[electron]預腳本不顯示內聯script

script-src self 是 Content Security Policy (CSP) 中的一個指令,它的作用是限制加載和執行 JavaScript 腳本的來源。 具體來說: self 表示 當前源。也就是說,只有來自當前網站或者當前頁面所在域名的 JavaScript 腳本才被允許執行。"…

基于安卓的文件管理器程序開發研究源碼數據庫文檔

摘 要 伴隨著現代科技的發展潮流,移動互聯網技術快速發展,各種基于通信技術的移動終端設備做的也越來越好了,現代智能手機大量的進入到了我們的生活中。電子產品的各種軟硬技術技術的發展,操作系統的不斷更新換代,谷歌…

MySQL主從復制實現指南

MySQL主從復制實現指南 一、主從復制原理 #mermaid-svg-i1zOswdD4OORQ35t {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-i1zOswdD4OORQ35t .error-icon{fill:#552222;}#mermaid-svg-i1zOswdD4OORQ35t .error-text…

spring jms使用

文章目錄 一、背景介紹二、注意點說明三、代碼pom.xmlmq.propertiesActiveMqConfigJmsSenderActiveMqInfoActivemqProtocolEnum生產者消費者 一、背景介紹 <dependency> 標簽中列出的 spring-jms 是 Spring Framework 提供的一個模塊&#xff0c;用于簡化 Java Message …