Python 如何通过多处理加载大型视频数据集?

Python 如何通过多处理加载大型视频数据集?,python,dataset,multiprocess,imread,Python,Dataset,Multiprocess,Imread,我正在处理一个大的视频数据集,这些视频经过预处理并在帧中转换。因此,我有以下文件夹树: 资料 训练集 第一类 视频1 Frame0.png,…,FrameN.png 维登 Frame0.png,…,FrameN.png 类别2 视频1 Frame0.png,…,FrameN.png 维登 Frame0.png,…,FrameN.png 验证集 第一类 视频1 Frame0.png,…,FrameN.png 维登 Frame0.png,…,

我正在处理一个大的视频数据集,这些视频经过预处理并在帧中转换。因此,我有以下文件夹树:

  • 资料
    • 训练集

      • 第一类
        • 视频1
          • Frame0.png,…,FrameN.png
        • 维登
          • Frame0.png,…,FrameN.png
      • 类别2
        • 视频1
          • Frame0.png,…,FrameN.png
        • 维登
          • Frame0.png,…,FrameN.png
    • 验证集

      • 第一类
        • 视频1
          • Frame0.png,…,FrameN.png
        • 维登
          • Frame0.png,…,FrameN.png
      • 类别2
        • 视频1
          • Frame0.png,…,FrameN.png
        • 维登
          • Frame0.png,…,FrameN.png
我需要加载所有这些数据,每次我从class1文件夹中读取视频时,我将0添加到标签列表中,每次我从class2文件夹中读取视频时,我将1添加到标签中

由于视频有数千个,我希望多处理,但我不知道如何保持视频和标签之间的一致性

sets = [TRAINING_DIR, VALIDATION_DIR]

for dataset in sets:
    for folder in classes:
        subfolder = os.path.join(dataset, folder)
        if max_videos > -1:
            bar_length = min(max_videos, len(os.listdir(subfolder)))
        else:
            bar_length = len(os.listdir(subfolder))

        bar = ChargingBar('Loading ' + subfolder, max=bar_length)
        bar_interval = int(min(max_videos, len(os.listdir(subfolder)))/bar_length)
        if bar_interval == 0:
            bar_interval = 1

        for index, video_folder_name in enumerate(os.listdir(subfolder)):
            if index == max_videos:
                break
            video_path = os.path.join(subfolder, video_folder_name)
            frames_number = len(os.listdir(video_path))
            frames_interval = int(frames_number / min_video_frames)
            frames_paths = os.listdir(video_path)
            if frames_interval > 0:
                frames_paths = frames_paths[::frames_interval]
            frames = []
            for index, frame_image in enumerate(frames_paths):
                if len(frames) >= min_video_frames:
                    break
                image = np.asarray(cv2.imread(os.path.join(video_path, frame_image)))
                image = cv2.resize(image, (IMAGE_SIZE, IMAGE_SIZE))
                frames.append(image)

            while len(frames) < min_video_frames:
                frames.append(frames[-1])

            if dataset == TRAINING_DIR:
                videos.append(frames)
                if "class1" in folder:
                    labels.append(0)
                else:
                    labels.append(1)
            else:
                validation_videos.append(frames)
                if "class1" in folder:
                    validation_labels.append(0)
                else:
                    validation_labels.append(1)
            
            if index % bar_interval == 0:
                bar.next()
            
        bar.finish()
set=[TRAINING\u DIR,VALIDATION\u DIR]
对于集合中的数据集:
对于类中的文件夹:
子文件夹=os.path.join(数据集,文件夹)
如果最大视频数>-1:
bar_length=min(max_视频,len(os.listdir(子文件夹)))
其他:
bar_length=len(os.listdir(子文件夹))
bar=ChargingBar('加载'+子文件夹,最大值=bar_长度)
bar\u interval=int(最小(最大视频,len(os.listdir(子文件夹)))/bar\u长度)
如果bar_间隔=0:
bar_间隔=1
对于索引,枚举(os.listdir(子文件夹))中的视频文件夹名称:
如果索引==最大视频:
打破
视频路径=os.path.join(子文件夹,视频文件夹名称)
帧数=len(os.listdir(视频路径))
帧间隔=整数(帧数/分钟视频帧)
帧路径=os.listdir(视频路径)
如果帧间隔>0:
帧\路径=帧\路径[::帧\间隔]
帧=[]
对于索引,枚举中的帧图像(帧路径):
如果len(帧)>=最小视频帧:
打破
image=np.asarray(cv2.imread(os.path.join(video\u path,frame\u image)))
image=cv2.调整大小(图像,(图像大小,图像大小))
frames.append(图像)
而len(帧)
我不明白问题出在哪里。但我看到了其他问题-进程不共享内存,因此它们将在单独的内存中保存数据,并且为了将所有数据都保存在一个列表/数据帧中,一个进程必须将其保存在磁盘上,另一个进程必须读取它-因此它的工作速度可能比正常方式慢。也许您应该将其成对保存
(帧,标签)
在一个列表
训练数据
(和
验证数据
)上,而不是两个列表
视频
标签
。或者,您应该将其保存在
数据框
@furas中,我如何处理编辑相同结构的更多进程?