C#本地将labelme数据集转换为机器视觉yolo数据集格式
C#本地,将labelme数据集转换为机器视觉yolo数据集格式
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.RegularExpressions;
using System.Text.Unicode;
using System.Threading.Tasks;
using System.Windows.Ink;
using System.Windows.Media.Media3D;namespace WpfAppYolo11_test1
{/// <summary>/// 将labelme数据集转换为yolo数据集格式/// </summary>public class LabelmeToYoloDataSetUtils{Dictionary<string, short> labels = new Dictionary<string, short>();/// <summary>/// 转换后保存目录/// </summary>const string outDir = "D:\\yoloTrainDataSet";const int saveLength = 10;/// <summary>/// labelme转yolo格式数据,要转换的目录/// </summary>/// <param name="inputDir"></param>/// 2025-3-4 00:45:38,public void FileConvert(string inputDir){//labels.Clear();var files = System.IO.Directory.GetFiles(inputDir, "*.json");if (files == null || files.Length == 0){return;}//获取目录中文件夹,以数字升序命名最新的训练文件夹var folders = Directory.GetDirectories(outDir);int lastNum = 1;if (folders != null && folders.Length > 0){List<DirectoryInfo> dirList = new List<DirectoryInfo>();foreach (var item in folders){DirectoryInfo directoryInfo = new DirectoryInfo(item);dirList.Add(directoryInfo);}var lastDir = dirList.OrderByDescending(g => g.CreationTime).FirstOrDefault();//获取文件夹后缀var lastNumStr = Regex.Match(lastDir.Name, "\\d*$").Value;lastNum = Convert.ToInt32(lastNumStr) + 1;}//此次训练保存的文件夹string newTrainDir = "train" + lastNum;//string dirNew = "train" + Guid.NewGuid().ToString("n");string dirNew = outDir + "\\" + newTrainDir + "\\train";//处理json文件foreach (var item in files){//处理单个json文件SingleFileConvert(item, dirNew);}//挑选训练图片前两个图片作为验证集//创建val文件夹string val = Path.Combine(outDir, newTrainDir, "val"); var files21 = System.IO.Directory.GetFiles(inputDir, "*.jpg");var files22 = System.IO.Directory.GetFiles(inputDir, "*.png");var fileContainer = files21.Union(files22).ToList();var first1 = fileContainer[0];var first2 = fileContainer[1];//将训练图片全部复制到train中var trainImgNew = Path.Combine(dirNew, "images");if (!Directory.Exists(trainImgNew)){Directory.CreateDirectory(trainImgNew);}foreach (var itemImg in fileContainer){string fileNew2 = Path.Combine(trainImgNew, Path.GetFileName(itemImg));File.Copy(itemImg, fileNew2);}//只有2个样本时,将训练的文件夹作为验证if (files.Length <= 2){val = dirNew;goto Val_done;}if (!Directory.Exists(val)){Directory.CreateDirectory(val);}//图片文件夹string valImage = Path.Combine(val, "images");if (!Directory.Exists(valImage)){Directory.CreateDirectory(valImage);}string file1Name = Path.GetFileName(first1);string file2Name = Path.GetFileName(first2);string img1 = Path.Combine(valImage, file1Name);File.Copy(first1, img1);string img2 = Path.Combine(valImage, file2Name);File.Copy(first2, img2);//坐标数据string vallabels = Path.Combine(val, "labels");if (!Directory.Exists(vallabels)){Directory.CreateDirectory(vallabels);}//找到train目录中的坐标数据string vallabels2 = Path.Combine(dirNew, "labels");string txt1 = Path.GetFileNameWithoutExtension(file1Name) + ".txt";string txt2 = Path.GetFileNameWithoutExtension(file2Name) + ".txt";string fileLabel1 = Path.Combine(vallabels2, txt1);string fileLabel2 = Path.Combine(vallabels2, txt2);if (File.Exists(fileLabel1)){string fileLabelTxt1 = Path.Combine(vallabels, txt1);File.Copy(fileLabel1, fileLabelTxt1);}if (File.Exists(fileLabel2)){string fileLabelTxt2 = Path.Combine(vallabels, txt2);File.Copy(fileLabel2, fileLabelTxt2);}Val_done://生成data.yamlstring dir = dirNew;//Path.Combine(outDir, newTrainDir);dir = dir.Replace("\\", "/");val = val.Replace("\\", "/");StringBuilder sb = new StringBuilder();sb.AppendLine("train: " + dir);sb.AppendLine("val: " + val);sb.AppendLine("test: " + val);sb.AppendLine("");sb.AppendLine("nc: " + labels.Count);//设置编码支持中文string labelName = System.Text.Json.JsonSerializer.Serialize(labels.Keys,new System.Text.Json.JsonSerializerOptions(){Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)});labelName = labelName.Replace("\"", "'");//替换双引号为单引号sb.AppendLine("names: " + labelName);//保存//var arr = inputDir.Split("\\");//var lastDir = arr.Last();//string newDir = inputDir.TrimEnd(lastDir.ToArray());//string filePath = Path.Combine(newDir, "yoloTrainDataSet", "data.yaml");string yamlDir = outDir + "\\" + newTrainDir;string filePath = Path.Combine(yamlDir, "data.yaml");System.IO.File.WriteAllText(filePath, sb.ToString());}/// <summary>/// 单个json文件转换/// </summary>public void SingleFileConvert(string file, string inputDir){string json = System.IO.File.ReadAllText(file);var data2 = System.Text.Json.JsonSerializer.Deserialize<LabelMeView>(json);if (data2 == null || data2.shapes == null || data2.shapes.Count == 0){return;}StringBuilder stringBuilder = new StringBuilder();//读取每个形状foreach (var item in data2.shapes){//忽略没名称的形状if (string.IsNullOrEmpty(item.label)){continue;}labels.TryAdd(item.label, 1);double x1 = 0, x2 = 0, y1 = 0, y2 = 0;if (item.shape_type == "rectangle"){x1 = item.points[0][0];y1 = item.points[0][1];x2 = item.points[1][0];y2 = item.points[1][1];}else if (item.shape_type == "polygon"){x1 = item.points.Select(g => g[0]).Min();y1 = item.points.Select(g => g[1]).Min();x2 = item.points.Select(g => g[0]).Max();y2 = item.points.Select(g => g[1]).Max();}//中心点double x_center = (x1 + x2) / (double)2 / data2.imageWidth;double y_center = (y1 + y2) / (double)2 / data2.imageHeight;double width = Math.Abs((x2 - x1) / data2.imageWidth);double height = Math.Abs((y2 - y1) / data2.imageHeight);//获取对象idint classId = labels.Keys.ToList().IndexOf(item.label);stringBuilder.AppendLine($"{classId} {x_center} {y_center} {width} {height}");}//保存txt文件//var arr = inputDir.Split("\\");//var lastDir = arr.Last();//string newDir = inputDir.TrimEnd(lastDir.ToArray());// string dir = System.IO.Path.Combine( outDir, "labels");string dir = System.IO.Path.Combine(inputDir, "labels");if (!System.IO.Directory.Exists(dir)){System.IO.Directory.CreateDirectory(dir);}//string fileName = Path.GetFileName(file) + "_" + Guid.NewGuid().ToString("n") + ".txt";string fileName = Path.GetFileNameWithoutExtension(file) + ".txt";string filePath = System.IO.Path.Combine(dir, fileName);File.WriteAllText(filePath, stringBuilder.ToString());}}public class LabelMeView{public string version { get; set; }public List<ShapeView> shapes { get; set; }public string imagePath { get; set; }/// <summary>/// 图片高度,px/// </summary>public int imageHeight { get; set; }/// <summary>/// 图片宽度,px/// </summary>public int imageWidth { get; set; }}public class ShapeView{/// <summary>/// 对象说明,标签/// </summary>public string label { get; set; }/// <summary>/// 形状描述;rectangle;polygon/// </summary>public string shape_type { get; set; }public object flags { get; set; }/// <summary>/// 坐标点/// </summary>public List<double[]> points { get; set; }public string version { get; set; }}}相关文章:
C#本地将labelme数据集转换为机器视觉yolo数据集格式
C#本地,将labelme数据集转换为机器视觉yolo数据集格式 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Text.RegularExpressions; using System.Text.U…...
【软件系统架构】单体架构
一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…...
【求助】【建议放弃】【谷粒商城版】Kubernetes
本文作者: slience_me 文章目录 Kubernetes【谷粒商城版】【建议放弃】1. docker安装2. kubernetes安装前3. kubeadm,kubelet,kubectl3.1 简介kubeadmkubeletkubectl常用指令 3.2 安装3.3 kubeadm初始化3.4 加入从节点(工作节点)3.5 安装Pod网络插件(CNI…...
uniapp 实现微信小程序电影选座功能
拖动代码 /*** 获取点击或触摸事件对应的座位位置* 通过事件对象获取座位的行列信息* param {Event|TouchEvent} event - 点击或触摸事件对象* returns {Object} 返回座位位置对象,包含行(row)和列(col)信息,若未找到有效位置则返回 {row: -1, col: -1}*…...
python+flask实现360全景图和stl等多种格式模型浏览
1. 安装依赖 pip install flask 2. 创建Flask应用 创建一个基本的Flask应用,并设置路由来处理不同的文件类型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 设置静态文件路径 app.static_folder static app.r…...
IntelliJ 配置文件plugin.xml
在 IntelliJ IDEA 插件开发中,plugin.xml 是插件的配置文件,它包含了关于插件的所有基本信息、扩展点、依赖关系等。该文件使用 XML 格式进行定义。以下是 plugin.xml 中常见的元素及其用途: <idea-plugin><!-- 插件的基本信息 --&…...
C# Unity 唐老狮 No.10 模拟面试题
本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…...
数据库系统——规范化1NF~BCNF
数据库规范化完全指南:从零到BCNF,中学生也能秒懂!📚✨ 一、什么是数据库规范化? 科学定义 🔍 数据库规范化是通过一系列规则(范式)将数据库表结构分解为更小、更高效、无冗余的表…...
第十五届蓝桥杯2024JavaB组省赛试题A:报数游戏
简单的找规律题目。题目给得数列,第奇数项是20的倍数,第偶数项时24的倍数。题目要求第n 202420242024 项是多少。这一项是偶数,所以答案一定是24的倍数,并且偶数项的个数和奇数项的个数各占一半,所以最终的答案ans( n…...
Matlab 汽车二自由度转弯模型
1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态,其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…...
关于 2>/dev/null 的作用以及机理
每个进程都有三个标准文件描述符:stdin(标准输入)、stdout(标准输出)和stderr(标准错误)。默认情况下,stderr会输出到终端。使用2>可以将stderr重定向到其他地方,比如…...
学c++的人可以几天速通python?
学了俩天啊,文章写纸上了 还是蛮有趣的...
HTML,CSS,JavaScript
HTML:负责网页的结构(页面元素和内容)。 CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。 Javascript:负责网页的行为(交互效果)。 MDN前端开发文档(MDN Web Docs) HTML HTML(HyperText Markup Language):超文本标记语言超文本:超越了文本的…...
微信小程序面试内容整理-图片优化
在微信小程序中,图片优化是提升加载速度、节省网络带宽和提高用户体验的重要步骤。图片通常是小程序页面中的主要资源,合理的图片优化能显著提高小程序的性能,尤其是在用户网络状况较差的情况下。 1. 选择合适的图片格式 不同的图片格式有不同的特点,选择合适的格式能够有效…...
Rocky Linux 9.x 基于 kubeadm部署k8s 1.32
一、部署说明 1、主机操作系统说明 序号操作系统及版本备注1Rocky Linux release 9下载链接:https://mirrors.163.com/rocky/9.5/isos/x86_64/Rocky-9.5-x86_64-minimal.iso 2、主机硬件配置说明 作用IP地址操作系统配置关键组件k8s-master01192.168.234.51Rocky…...
【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择
1、HarmonyOS 实现只需要保留上拉加载更多,但是不需要下拉刷新? Refresh通过参数refreshing判断当前组件是否正在刷新,可以控制该参数变化来触发下拉刷新:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5…...
解决git init 命令不显示.git
首先在自己的项目代码右击 打开git bash here 输入git init 之后自己的项目没有.git文件,有可能是因为.git文件隐藏了,下面是解决办法...
利用AI让数据可视化
1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是()。2、()可以判断企业在行业中所处的地位。3、()是指店铺内有…...
神经网络微调技术解析
神经网络微调技术 微调(Fine-tuning)是迁移学习的核心技术,通过在预训练模型基础上调整参数,使其适应特定任务或领域。以下从传统方法、参数高效微调(PEFT)、新兴技术三个维度展开,覆盖主流技术…...
WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)深度解析与实战复现
0x00 漏洞概述 CVE-2017-10271 是Oracle WebLogic Server WLS Security组件中的远程代码执行漏洞。攻击者通过构造恶意XML请求,利用XMLDecoder反序列化机制绕过安全验证,最终实现服务器权限接管。 影响版本 WebLogic 10.3.6.0WebLogic 12.1.3.0WebLog…...
解决qt中自定插件加载失败,不显示问题。
这个问题断断续续搞了一天多,主要是版本不匹配问题。 我们先来看下 Based on Qt 6.6.0 → 说明 Qt Creator 本身 是基于 Qt 6.6.0 框架构建的。MSVC 2019, 64-bit → 说明 Qt Creator 是使用 Microsoft Visual C 2019 编译器(64 位) 编译的。…...
Git 面试问题,解决冲突
1.问题描述 在多人协作开发中,当多个开发者在同一文件的同一部分进行修改并提交时,Git 无法自动合并这些更改,从而产生代码冲突(Conflict)。冲突的代码会被 Git 标记出来,需要开发者手动解决。 冲突原因 多…...
Apache Shiro 使用教程
Apache Shiro 使用教程 Apache Shiro是一个强大且灵活的开源安全框架,主要用于处理身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(Session Manage…...
用maven生成springboot多模块项目
用Maven生成Spring Boot多模块项目,可以按照以下步骤操作: 1. 创建父项目 首先,使用Maven的archetype插件创建一个空的Maven项目作为父项目。打开终端,执行以下命令: mvn archetype:generate -DgroupIdcom.example -…...
【最佳实践】Go 状态模式
设计思路 状态模式的核心在于将对象的行为封装在特定的状态类中,使得对象在不同的状态下表现出不同的行为。每个状态实现同一个接口,允许对象在运行时通过改变其内部状态对象来改变其行为。状态模式使得状态转换更加明确,并且易于扩展新的状…...
智慧社区3.0
项目介绍: 此项目旨在推动成都市探索**超大城市社区发展治理新路**,由三个实验室负责三大内容 1、**研发社区阵地空间管理模块**:AI算法实现态势感知(如通过社区图片和视频、文本,对环境 空间质量、绿视率、安全感分…...
C#语法基础总结
输入和输出 输入 Console.Read(); 从屏幕读取一个字符,并返回该字符所对应的整型数字 Console.ReadLine(); 从屏幕读取一串字符,并返回该字符串 输出 Console.WriteLine(); 输出内容,并换行 Console.Write(); 输出内容,不换行…...
Springboot+Vue登录、注册功能(含验证码)(后端!)
我们首先写一个接口,叫login!然后对传入一个user,因为我们前端肯定是要传过来一个user,然后我们后端返回一个user,因为我们要根据这个去校验!我们还引入了一个hutool的一个东西,在pom文件里面引…...
深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
一、引言 在 HTML 的世界里,<div>和元素虽看似普通,却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木,能够将各种 HTML 元素巧妙地组合起来,无论是构建页面布局,还是对局部内容进行样式调整ÿ…...
搞定python之八----操作mysql
本文是《搞定python》系列文章的第八篇,讲述利用python操作mysql数据库。相对来说,本文的综合性比较强,包含了操作数据库、异常处理、元组等内容,需要结合前面的知识点。 1、安装mysql模块 PyMySql模块相当于数据库的驱动&#…...
