我有两个文件夹,一个文件夹有500张猫的图像,另外一个文件夹有500张狗的图像。请帮我用python写出将这1000张图像按照8:1:1的比例划分成训练集、验证集和测试集,并且生成训练集、验证集和测试集三个文件夹,每个文件夹下有猫和狗两个图片文件夹
时间: 2024-03-05 17:49:43 浏览: 22
好的,您可以使用Python中的os、random和shutil库来实现这个需求。以下是一个简单的代码示例:
```python
import os
import random
import shutil
# 定义猫和狗两个类别
classes = ['cat', 'dog']
# 定义训练集、验证集和测试集的比例
train_ratio = 0.8
val_ratio = 0.1
test_ratio = 0.1
# 定义原始图像文件夹的路径和新文件夹的路径
orig_dir = '/path/to/original/folder'
train_dir = '/path/to/train/folder'
val_dir = '/path/to/validation/folder'
test_dir = '/path/to/test/folder'
# 创建新文件夹
os.makedirs(train_dir)
os.makedirs(val_dir)
os.makedirs(test_dir)
# 遍历每个类别的图像文件夹
for cls in classes:
cls_dir = os.path.join(orig_dir, cls)
images = os.listdir(cls_dir)
random.shuffle(images)
# 计算每个类别的图像数量
num_images = len(images)
num_train = int(num_images * train_ratio)
num_val = int(num_images * val_ratio)
num_test = num_images - num_train - num_val
# 将图像按比例分配到训练集、验证集和测试集
train_images = images[:num_train]
val_images = images[num_train:num_train+num_val]
test_images = images[num_train+num_val:]
# 复制图像到新文件夹
for image in train_images:
src = os.path.join(cls_dir, image)
dst = os.path.join(train_dir, cls, image)
shutil.copyfile(src, dst)
for image in val_images:
src = os.path.join(cls_dir, image)
dst = os.path.join(val_dir, cls, image)
shutil.copyfile(src, dst)
for image in test_images:
src = os.path.join(cls_dir, image)
dst = os.path.join(test_dir, cls, image)
shutil.copyfile(src, dst)
```
在上面的代码中,您需要替换以下变量的值:
- `classes`:您的类别名称列表,例如['cat', 'dog']。
- `train_ratio`、`val_ratio` 和 `test_ratio`:您希望分配到训练集、验证集和测试集的比例。
- `orig_dir`:原始图像文件夹的路径。
- `train_dir`、`val_dir` 和 `test_dir`:新文件夹的路径,用于存储训练集、验证集和测试集。
最后,您需要运行代码并等待它完成。完成后,您应该会在新文件夹中看到一个类别子文件夹,其中包含分配给训练集、验证集和测试集的图像。