这些天在做数据集的划分,想这除了自己人力随机挑选以外还有没有更便捷的方式,于是诞生了这篇文章。
这篇文章的思路是:
1.随机在文件夹中挑选按照划分好的数量的比例的图片,将这些图片【移动】到新的文件夹中
2.比对新的文件夹中的图片的名称和旧文件夹中标签(yolov5的格式是txt)的名称,如果在新文件夹中的图片的名称与旧文件夹中txt的名称一致的话,就把txt移动到新的文件夹中
于是,会有两个文件的代码,先执行随机挑选,再执行移动标签
随机挑选的代码:
import os
import random
import shutil
# 定义当前文件夹和目标文件夹的路径
current_folder = "./当前文件夹的路径" # 替换为实际的当前文件夹路径
target_folder = "./目标文件夹的路径" # 替换为实际的目标文件夹路径
# 要移动的图片数量
num_images_to_select = 5 # 替换为您想要的数量,一般是成比例的,需要自行计算
# 获取当前文件夹中的所有图片文件
image_files = [f for f in os.listdir(current_folder) if f.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp'))]
# 检查是否有足够的图片文件供选择
if len(image_files) < num_images_to_select:
print("当前文件夹中的图片文件数量不足以移动指定数量的图片。")
else:
# 随机选择图片文件
selected_images = random.sample(image_files, num_images_to_select)
# 确保目标文件夹存在,如果不存在则创建它
if not os.path.exists(target_folder):
os.makedirs(target_folder)
# 移动选定的图片文件到目标文件夹
for image in selected_images:
source_path = os.path.join(current_folder, image)
target_path = os.path.join(target_folder, image)
shutil.move(source_path, target_path)
print(f"{num_images_to_select} 张图片已成功移动到目标文件夹。")
结束之后,新的图片文件夹已经诞生,执行下一段代码:
import os
import shutil
# 定义文件夹A、B和C的路径
folder_a = "./存放新图片的文件夹路径" #自行替换为自己文件夹的路径
folder_b = "./存放全部原始标签的文件夹路径"
folder_c = "./存放新标签的文件夹路径"
# 获取文件夹A中的所有图片文件名
image_files = [f for f in os.listdir(folder_a) if f.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp'))]
# 获取文件夹B中的所有txt文件名
txt_files = [f for f in os.listdir(folder_b) if f.endswith('.txt')]
# 创建文件夹C(如果它不存在)
if not os.path.exists(folder_c):
os.makedirs(folder_c)
# 检查图片文件名是否与txt文件名匹配
for image_file in image_files:
txt_file_name = os.path.splitext(image_file)[0] + ".txt" # 构造相应的txt文件名
if txt_file_name in txt_files:
txt_file_source = os.path.join(folder_b, txt_file_name)
txt_file_target = os.path.join(folder_c, txt_file_name)
shutil.move(txt_file_source, txt_file_target)
print("已将匹配的txt文件从文件夹B移动到文件夹C。")