【发布时间】:2021-01-06 14:05:40
【问题描述】:
Python
我正在尝试从 UCF-101 数据集中提取帧,但出现此错误: ValueError:没有足够的值来解包(预期 2,得到 1)。 我正在使用 Anaconda 1.7.2
这一行显示参数错误:sequence_type, sequence_name = video_path.split(".avi")[0].split("/")[-2:]
import av
import glob
import os
import time
import tqdm
import datetime
import argparse
def extract_frames(video_path):
frames = []
video = av.open(video_path)
for frame in video.decode(0):
yield frame.to_image()
prev_time = time.time()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--dataset_path", type=str, default="UCF-101", help="Path to UCF-101 dataset")
opt = parser.parse_args()
print(opt)
time_left = 0
video_paths = glob.glob(os.path.join(opt.dataset_path, "*", "*.avi"))
for i, video_path in enumerate(video_paths):
sequence_type, sequence_name = video_path.split(".avi")[0].split("/")[-2:]
sequence_path = os.path.join(f"{opt.dataset_path}-frames", sequence_type, sequence_name)
if os.path.exists(sequence_path):
continue
os.makedirs(sequence_path, exist_ok=True)
# Extract frames
for j, frame in enumerate(
tqdm.tqdm(
extract_frames(video_path, time_left),
desc=f"[{i}/{len(video_paths)}] {sequence_name} : ETA {time_left}",
)
):
frame.save(os.path.join(sequence_path, f"{j}.jpg"))
# Determine approximate time left
videos_left = len(video_paths) - (i + 1)
time_left = datetime.timedelta(seconds=videos_left * (time.time() - prev_time))
prev_time = time.time()
【问题讨论】:
-
在错误之前打印
video_path,然后我们会看看出了什么问题。 -
在尝试将其分配给 2 元组之前打印出
video_path.split(".avi")[0].split("/")[-2:],您将看到为什么会收到错误 Not enough values to unpack. -
@JustinEzequiel 它显示包含在数据集文件夹中的所有路径
-
@BoarGules 显示没有.avi扩展名的视频路径
-
这部分
.split("/")[-2:]最多返回两个字符串;注意“最多”。由于您没有显示video_path在错误点的值是多少,我只能指出[-2:]切片为您提供了一个仅包含一个字符串而不是您期望的两个字符串的列表。也许video_path不包含正斜杠。