severstal谢韦尔金属数据集CSV格式转YOLO格式

2024-04-20 00:52

本文主要是介绍severstal谢韦尔金属数据集CSV格式转YOLO格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谢韦尔数据集

在kaggle上即可找到,在csdn、百度、知乎上搜索都能搜到,这里不附下载链接了
谢韦尔数据集的标注为CSV文件,格式如下:
谢韦尔数据集格式
谢韦尔数据集为分割数据集,像素编码格式

格式

谢韦尔数据集为像素编码格式,使用YOLO相关模型进行检测任务,需要进行格式转换。
YOLO的格式为:
类别id 坐标1x 坐标1y 坐标2x 坐标2y 坐标3x 坐标3y 坐标4x 坐标4y…

像素编码格式为:
29102 12 ,为一对,从第29102开始往后数12个像素。

要直接转成YOLO格式的顶点坐标有点困难,所以我采用了先转换为掩码形式,然后再寻找顶点。

处理代码

import os
import cv2
import numpy as np
import pandas as pd
from PIL import Image
from PIL import Image, ImageOpsdef mask_pil2xy(mask_pil,ImageId,ClassId,save_txtfolder):# 转换为 NumPy 数组mask_np = np.array(mask_pil)# 使用阈值化将图像转换为二值图像_, binary_image = cv2.threshold(mask_np, 200, 255, cv2.THRESH_BINARY)# 查找轮廓contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 存储有效区域的顶点坐标valid_vertices = []# 设置最小轮廓点数阈值(根据需要调整)min_contour_points = 3label_name=os.path.splitext(ImageId)[0]+ ".txt"save_path = os.path.join(save_txtfolder, label_name)#保存到文件with open(save_path, 'a') as f:# 遍历每个轮廓for contour in contours:# 忽略太小的轮廓if len(contour) < min_contour_points:continue# 获取轮廓的顶点坐标approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)# 确保轮廓有足够的顶点来形成有效区域if len(approx) >= min_contour_points:# 存储当前区域的顶点坐标# vertices_str = ""vertices_str = f"{ClassId} "for point in approx:x, y = point[0]# 归一化顶点坐标并保留小数点后6位normalized_x = round(x / 1600, 6)normalized_y = round(y / 256, 6)vertices_str += f"{normalized_x} {normalized_y} "# 移除末尾的空格vertices_str = vertices_str[:-1]# 将当前区域的顶点坐标字符串添加到列表中valid_vertices.append(vertices_str + "\n")# 输出所有有效区域的顶点坐标for vertices_str in valid_vertices:print(vertices_str)f.write(vertices_str)def rle2mask(rle, imgshape):width = imgshape[1]height = imgshape[0]mask = np.zeros(width * height, dtype=np.uint8)array = np.asarray([int(x) for x in rle.split()])starts = array[0::2]lengths = array[1::2]for index, start in enumerate(starts):mask[int(start):int(start + lengths[index])] = 1# 将掩码数组重塑为图像尺寸mask = mask.reshape(height, width)# 将 numpy 数组转换为 PIL 图像mask_pil = Image.fromarray(mask * 255)# 旋转图像以横向显示(逆时针旋转90度)mask_pil = mask_pil.rotate(90, expand=True)# 保存掩码图像前进行垂直翻转mask_pil = ImageOps.flip(mask_pil)return mask_pil#路径
# 设置保存标签文件的路径
save_txtfolder = ""
os.makedirs(save_txtfolder, exist_ok=True)  # 确保保存目录存在
save_folder = ""
os.makedirs(save_folder, exist_ok=True)  # 确保保存目录存在# 读取CSV文件
csv_path = ""
df = pd.read_csv(csv_path)# 过滤出带有有效掩码的数据
df_train = df[df['EncodedPixels'].notnull()].reset_index(drop=True)# 处理每个带有有效掩码的样本
for index in range(len(df_train)):ImageId = df_train['ImageId'].iloc[index]  # 获取图像标识ClassId = df_train['ClassId'].iloc[index]  # 获取类别 IDmaskName = ImageId.split(".")[0] + ".png"  # 生成保存的掩码文件名,去除后缀并添加文件扩展名# 生成掩码图像mask_pil = rle2mask(df_train['EncodedPixels'].iloc[index], (1600, 256))mask_pil2xy(mask_pil,ImageId,ClassId,save_txtfolder)save_path = os.path.join(save_folder, maskName)mask_pil.save(save_path)print(f"Saved mask image: {save_path}")

上述内容为作者原创,转载请附上链接

这篇关于severstal谢韦尔金属数据集CSV格式转YOLO格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/918893

相关文章

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

SpringBoot定制JSON响应数据的实现

《SpringBoot定制JSON响应数据的实现》本文主要介绍了SpringBoot定制JSON响应数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录前言一、如何使用@jsonView这个注解?二、应用场景三、实战案例注解方式编程方式总结 前言

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内