问题描述
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()
解决方法
您对评论中的建议和问题的回答向我表明,这段代码并不是您的,而且您不清楚这一行是什么
sequence_type,sequence_name = video_path.split(".avi")[0].split("/")[-2:]
应该这样做。所以让我解释一下。它需要 video_path
,它是 .avi
文件的完整路径,例如 '~/folder/subfolder/subsubfolder/myfile.avi'
。它分离扩展 .avi
,从剩下的 '~/folder/subfolder/subsubfolder/myfile'
中取出最后两个元素,即 subsubfolder
和 {{1 }},并将它们用作 myfile
和 sequence_type
的值。
但要使其起作用,sequence_name
必须同时包含 video_path
和 subsubfolder
,中间有一个斜杠,因此,至少为 myfile
。
'subsubfolder/myfile.avi'
返回的路径名之一甚至不包含一个 glob.glob()
字符。这就是为什么 /
返回一个 1-list,它不足以解包成 2-tuple split("/")
,导致错误 Not enough values to unpack。
我想到为什么会发生这种情况的唯一原因是您正在使用路径分隔符为 \ 而不是 / 的 Windows。这意味着您的代码从 (sequence_type,sequence_name)
返回的路径名类似于 glob.glob()
。没有斜线:不可能,因为 Windows 文件名不能包含斜线。
这就是为什么评论者要求您向我们展示您试图挖掘的价值,而不是仅仅告诉我们。编程问题通常是关于微小的具体细节。因此,在您没有明确回应的情况下,这仍然只是一个猜测,但如果猜测是正确的,那么给出错误的行应该是
'C:\Users\folder\subfolder\subsubfolder\myfile.avi'
(注意,您必须将反斜杠加倍)或者,如果您希望代码与平台无关,
sequence_type,sequence_name = video_path.split(".avi")[0].split("\\")[-2:]