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
- 视频1
- 类别2
- 视频1
- Frame0.png,…,FrameN.png
- 维登
- Frame0.png,…,FrameN.png
- 视频1
- 第一类
- 验证集
- 第一类
- 视频1
- Frame0.png,…,FrameN.png
- 维登
- Frame0.png,…,FrameN.png
- 视频1
- 类别2
- 视频1
- Frame0.png,…,FrameN.png
- 维登
- Frame0.png,…,FrameN.png
- 视频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中,我如何处理编辑相同结构的更多进程?