前言:
目前较多的图像数据集都是由视频划分出来的,然而这样划分出来的文件包含了大量的冗余图像。全部用于训练将会增加不必要的训练时间。
╮(╯▽╰)╭
为此写了一个拆分数据集代码,主要实现就是通过间隔采样,将原来20帧的图像,每间隔5帧(可以自定义)进行选取,从而减少冗余图像的数量。
代码:
import glob
import shutil
import os
import random
from PIL import Image
def init():
count = 0
txtList = []
# 注意修改提取帧数,目前是25帧选取一张
frame = 25
# 按比例选取
for image_path in glob.glob(r'E:\project\dataset\UA-DETRAC\images\train/*.jpg'):
count = count + 1
# 每25张收取一张
if count % frame == 0:
image_name = image_path.split("\\")[-1][:-3] + 'jpg'
txtList.append(image_name)
# 全部选取 (用于转标注文件或者其他)
#for image_path in glob.glob(r'E:\project\毕业论文数据集\UA-DETRAC\UA-DETRAC\labels\val/*.txt'):
# image_name = image_path.split("\\")[-1][:-3] + 'jpg'
# txtList.append(image_name)
return txtList
# 想获取的训练集和测试集移动至新的目录
def move_file(txt_list):
old_path = r'E:\project\dataset\UA-DETRAC\images\train\old_image' # 原始文件放置路径
new_path = r'E:\project\dataset\UA-DETRAC\images\new_iamge' # 新的文件放置路径
file_list = os.listdir(old_path) # 列出该目录下的所有文件,listdir返回的文件列表是不包含路径的。
if len(file_list) == 0:
print("该目录为空!请重新检查目录")
return
for file in file_list:
# 移动指定文件
if file in txt_list:
train_src = os.path.join(old_path, file) # 源图片目录
train_dsc = os.path.join(new_path, file) # 移动至train图片目录
print('train_src:', train_src)
print('train_dsc:', train_dsc)
shutil.move(train_src, train_dsc)
print('train images move succeed!')
if __name__ == '__main__':
txt_list = init()
print(len(txt_list))
move_file(txt_list)
操作流程
1. 参数修改
注意参数frame帧数对应的你需要多少张选取一张。
文件放置路径注意修改,原文件目录,新的文件目录
修改为执行就行了,此时间隔采样的图像已经被移动到新的目录了。然后我们需要根据新目录的图像把其标注文件转移过来。
2. 转移标注文件
将上面for循环的注释了,使用下面for循环代码转移标注
原理:就是读取你现在新目录下的图片文件名信息,然后根据这个文件名把原始标注文件目录下的标注移动到新的标注文件下。
修改目录路径
执行即可。
基本操作就是这样,该代码功能还是比较强也可以用于移动其他文件,自行探索。