【跑实验06】如何数据集中加入图像尺寸?如何把tuple格式的坐标按顺序写成四列数据?如何把某一列放到最后?

一、如何数据集中加入图像尺寸?

部分核心代码如下:

image_files = [filename for filename in os.listdir(folder_path) if filename.endswith(('.jpg', '.png'))]

num_batches = len(image_files) // batch_size + 1

for batch_idx in range(num_batches):
    start_idx = batch_idx * batch_size
    end_idx = min(start_idx + batch_size, len(image_files))
    batch_files = image_files[start_idx:end_idx]

    df = pd.DataFrame(columns=['feature_{}'.format(i) for i in range(512)] + ['width', 'height', 'coordinates', 'image_name', 'label'])

    for filename in batch_files:
        image_path = os.path.join(folder_path, filename)

        image = Image.open(image_path).convert('RGB')
        image_width, image_height = image.size
        image_input = preprocess(image).unsqueeze(0).to(device)

        with torch.no_grad():
            image_features = model.encode_image(image_input)

        name_parts = filename.split('_')
        coordinates = tuple(map(float, name_parts[1].strip('()').split(',')))
        object_name = '_'.join(name_parts[2:])

        row_data = image_features.squeeze().tolist() + [image_width, image_height, coordinates, object_name, 0]
        df.loc[len(df)] = row_data

这段代码的作用是逐行处理图像数据,并将其存储在一个DataFrame中。让我们逐行解读代码:

image_files = [filename for filename in os.listdir(folder_path) if filename.endswith(('.jpg', '.png'))]

这行代码用于获取指定文件夹路径下以’.jpg’或’.png’结尾的图像文件名列表。

num_batches = len(image_files) // batch_size + 1

这行代码计算需要进行的批次数量。根据图像文件的数量和指定的批次大小,计算出总共需要多少个批次。

for batch_idx in range(num_batches):

这行代码开始对每个批次进行迭代。batch_idx是当前迭代的批次索引。

start_idx = batch_idx * batch_size
end_idx = min(start_idx + batch_size, len(image_files))
batch_files = image_files[start_idx:end_idx]

这部分代码确定当前批次的起始索引和结束索引,并从图像文件列表中选择对应的文件。根据批次索引和批次大小,计算出当前批次的起始和结束位置,并从图像文件列表中选择这些位置之间的文件。

df = pd.DataFrame(columns=['feature_{}'.format(i) for i in range(512)] + ['width', 'height', 'coordinates', 'image_name', 'label'])

这行代码创建一个空的DataFrame,列名包括512个特征列(‘feature_0’到’feature_511’),以及’width’、‘height’、‘coordinates’、‘image_name’和’label’。

for filename in batch_files:

这行代码开始对当前批次中的每个文件进行迭代处理。filename是当前迭代的文件名。

image_path = os.path.join(folder_path, filename)
image = Image.open(image_path).convert('RGB')
image_width, image_height = image.size

这部分代码构建图像的完整路径,并使用PIL库的Image.open方法打开图像文件。然后,将图像转换为RGB模式,并获取图像的宽度和高度。

image_input = preprocess(image).unsqueeze(0).to(device)
with torch.no_grad():
    image_features = model.encode_image(image_input)

这部分代码对图像进行预处理,并将其作为输入传递给模型。通过调用模型的encode_image方法,获取图像的特征向量。

name_parts = filename.split('_')
coordinates = tuple(map(float, name_parts[1].strip('()').split(',')))
object_name = '_'.join(name_parts[2:])

这部分代码根据文件名解析出坐标和物体名称。首先,通过下划线将文件名拆分为多个部分。然后,从第二部分中提取坐标信息,将其转换为浮点数,并存储在一个元组中。最后,将剩余的部分拼接成物体名称。

row_data = image_features.squeeze().tolist() + [image_width, image_height, coordinates, object_name, 0]
df.loc[len(df)] = row_data

这部分代码构建了一行数据,其中包含图像特征向量、图像的宽度和高度、坐标、物体名称和标签。然后,将这一行数据添加到DataFrame中。

整个过程会针对每个批次中的每个图像文件重复执行,将图像的特征和相关信息添加到DataFrame中。

我们看一下输出的结果:

在这里插入图片描述

顺利提取成功!

二、如何把tuple格式的坐标按顺序写成四列数据?

可以使用Python中的字符串分割和提取操作,将包含坐标信息的字符串进行分割,然后提取出对应的xmin、ymin、xmax、ymax值。以下是一个示例代码:

import pandas as pd

# 读取数据集
df = pd.read_csv('your_dataset.csv')

# 创建新的列
df['xmin'] = 0
df['ymin'] = 0
df['xmax'] = 0
df['ymax'] = 0

# 遍历每一行数据
for index, row in df.iterrows():
    # 提取坐标字符串
    coordinates = row['coordinates']
    # 分割字符串并提取坐标值
    xmin, ymin, xmax, ymax = map(float, coordinates.strip('()').split(','))
    # 将提取的值赋给对应的列
    df.at[index, 'xmin'] = xmin
    df.at[index, 'ymin'] = ymin
    df.at[index, 'xmax'] = xmax
    df.at[index, 'ymax'] = ymax

# 打印结果
print(df[['xmin', 'ymin', 'xmax', 'ymax']])

这段代码假设您的数据集已保存为一个名为"your_dataset.csv"的CSV文件,并使用pandas库来读取和处理数据。代码会遍历数据集中的每一行,提取坐标字符串,并分割成四个值,然后将这些值分别赋给新创建的四列。最后,打印生成的四列(xmin、ymin、xmax、ymax)。

请注意,根据您提供的数据集,示例代码中的列名可能需要进行适当调整。

我们来看一下输出的结果:

在这里插入图片描述
提取成功!

三、如何把某一列放到最后?

我们上面数据集的输出结果为:

Index(['feature_0', 'feature_1', 'feature_2', 'feature_3', 'feature_4',
       'feature_5', 'feature_6', 'feature_7', 'feature_8', 'feature_9',
       ...
       'feature_511', 'width', 'height', 'coordinates', 'image_name', 'label',
       'xmin', 'ymin', 'xmax', 'ymax'],
      dtype='object', length=521)

可以看到,label列不在最后一列,我们需要将其放到最后一列,该如何操作?

要将"label"列移动到最后一列,您可以使用pandas库的reindex方法。以下是相应的示例代码:

import pandas as pd

# 读取数据集
df = pd.read_csv('your_dataset.csv')

# 将"label"列移动到最后一列
column_order = list(df.columns)
column_order.remove('label')
column_order.append('label')
df = df.reindex(columns=column_order)

# 打印结果
print(df)

这段代码假设您的数据集已保存为一个名为"your_dataset.csv"的CSV文件,并使用pandas库来读取和处理数据。首先,将数据集的列名存储在一个列表中。然后,从列表中移除"label"列,并将其追加到列表的末尾。最后,使用pandas的reindex方法按新的列顺序重新排列数据集。

请注意,示例代码中的列名可能需要根据您的实际数据集进行适当调整。

输出结果为:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wzk4869/article/details/131549702
今日推荐