用python写一个能按照一个包含图片名称和类别的csv文件将图片自动分为训练,测试和验证集的程序
时间: 2024-11-18 15:16:37 浏览: 4
要编写一个Python脚本来按CSV文件中的类别将图像自动分为训练、测试和验证集,可以使用pandas库来处理CSV数据,以及os库来操作文件系统。以下是一个基本示例,假设我们有一个CSV文件,其中包含两列:`image_path`(图像路径)和`class_name`(类别名),并且已经安装了所需的库:
```python
import os
import pandas as pd
# 读取CSV文件
data = pd.read_csv('your_image_classifications.csv')
# 假设划分比例为70%训练,15%验证,15%测试
train_size = int(0.7 * len(data))
val_size = int(0.15 * len(data))
# 按类别对数据进行分组并分配到相应的集合
def split_data(df, train_df, val_df, test_df):
for class_name, group in df.groupby('class_name'):
n_train = int(train_size / len(group['class_name'].unique()))
train_df[class_name] = group.head(n_train)
if val_size > 0:
val_df[class_name] = group.iloc[n_train:n_train + val_size]
if test_size > 0:
test_df[class_name] = group.iloc[n_train + val_size:]
# 创建空的数据框存储结果
train_df = pd.DataFrame()
val_df = pd.DataFrame()
test_df = pd.DataFrame()
split_data(data, train_df, val_df, test_df)
# 现在,你可以分别保存这些数据帧到文件夹中
for dataset_name, df in {'train': train_df, 'val': val_df, 'test': test_df}.items():
for _, row in df.iterrows():
img_path = row['image_path']
class_dir = os.path.join(dataset_name, row['class_name'])
os.makedirs(class_dir, exist_ok=True)
dest_path = os.path.join(class_dir, os.path.basename(img_path))
os.rename(img_path, dest_path)
阅读全文