将数据分为测试和训练,包括

时间:2018-06-27 13:37:51

标签: python-3.x dataframe video split training-data

如何根据数据帧变量将包含多个视频文件的文件夹拆分为训练和测试文件夹,这些变量告诉我哪个视频应该位于训练文件夹中,哪个视频应该位于测试文件夹中? (在Python 3.0中)。其中多个视频位于单独的类别文件夹中

每个视频都可以在以下类别目录中找到:

C:\Users\Me\Videos\a
C:\Users\Me\Videos\b

这意味着对于每个类别,我都需要一个“ train”和“ test”文件夹,例如:

C:\Users\Me\Videos\a\train
C:\Users\Me\Videos\a\test

虽然我有一个(EDIT)csv文件,其中包含以下信息。因此,我不希望我的训练和拆分是随机的,而是基于工作表中的二进制代码。

videoname |test|train|category|
-------------------------------
video1.mp4| 1  |0    |a       |
video2.mp4| 1  |0    |b       |
video3.mp4| 1  |0    |c       |
video4.mp4| 0  |1    |c       |

任何人都可以指出我如何使用该文件为我执行此操作的方向吗?我能以某种方式将文件放在一个告诉Python将文件移至何处的数据框中吗?

编辑:

import os
import csv
from collections import defaultdict

videoroot = r'H:\Desktop'
transferrable_data = defaultdict(list)
with open(r'H:\Desktop\SVW.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        video_path_source = os.path.join(videoroot, row['Genre'], row['FileName'])
        if (row['Train 1?'] == 0):
            split_type = 'test'
        else:
            split_type = 'train'
        video_destination_path = os.path.join(videoroot, row['Genre'], split_type, row['FileName'])
        transferrable_data[video_path_source].append(video_destination_path)

1 个答案:

答案 0 :(得分:1)

第一件事是阅读您的Excel并构造从源文件到目标文件夹的映射:

VIDEO_ROOT_FOLDER = 'C:\Users\Me\Videos'
transferrable_data = defaultdict(list)
for row in excel_iteratable:
    video_source_path = os.path.join(VIDEO_ROOT_FOLDER, row['category'], row['videoname'])
    if (row['test'] == 1):
        split_type = 'test'
    else:  # I suppose you can only dispatch to test or train in a row
        split_type = 'train'
    video_destination_path = os.path.join(VIDEO_ROOT_FOLDER, row['category'], split_type, row['videoname'])) 
    transferrable_data[video_path_source].append(video_destination_path)

然后,您可以编写脚本,使用以下两种方法之一将文件移动到正确的路径:

import os
os.rename("path/to/current/video", "path/to/destination/folder")

,或者如果您需要复制(不想更改视频文件夹):

from shutil import copyfile
copyfile("path/to/current/video", "path/to/destination/folder")

例如,假设您的映射为:

transferrable_data = {'C:\Users\Me\Videos\a\video1.mp4' : ['C:\Users\Me\Videos\a\train\video1.mp4'], 'C:\Users\Me\Videos\a\video2.mp4': ['C:\Users\Me\Videos\b\test\video2.mp4', 'C:\Users\Me\Videos\c\test\video2.mp4']}

您可以执行以下操作:

from shutil import copyfile
transferrable_data = {'C:\Users\Me\Videos\a\video1.mp4' : ['C:\Users\Me\Videos\a\train\video1.mp4'], 'C:\Users\Me\Videos\a\video2.mp4': ['C:\Users\Me\Videos\b\test\video2.mp4', 'C:\Users\Me\Videos\c\test\video2.mp4']}
for src, destination_list in transferrable_data.items():
    for dest in destination_list:
        copyfile(src, dest)