使用OpenFace和openSMILE提取MOSI视频特征提示无此文件如何解决
MOSI数据集特征提取路径报错解决方案
报错原因
触发
foldername: No such file or directory的核心是代码的变量传递和路径拼接错误,共3处问题:
- Shell命令里直接写的
filename、foldername是固定字符串,没有代入Python循环的实际变量值,系统会直接去找叫filename的文件,自然找不到os.listdir()仅返回文件名本身,不带MOSI/videos/的父路径前缀,OpenFace和ffmpeg无法定位到实际存储的视频文件- 你全程没有定义
foldername变量,ffmpeg执行时自然找不到对应路径
修复步骤
- 提前创建
processed相关输出目录,避免后续输出时触发路径不存在报错 - 循环时给每个视频文件拼接完整的相对/绝对路径,不要直接使用
os.listdir返回的裸文件名 - 用f-string把Python变量的实际值传入shell命令,不要把变量名当字符串直接写在命令里
- 先通过ffmpeg从视频中提取独立的wav音频文件,再送入openSMILE处理,不要直接把视频传给openSMILE解析
修正后参考代码
import os import pickle # 提前创建输出目录 os.makedirs("processed/openface", exist_ok=True) os.makedirs("processed/audio", exist_ok=True) os.makedirs("processed/feature", exist_ok=True) video_root = "MOSI/videos" for filename in os.listdir(video_root): # 跳过文件夹,只处理视频文件,可根据你的实际视频后缀调整判断条件 if not filename.endswith((".mp4", ".avi", ".mov", ".flv")): continue print(f"当前处理:{filename}") # 拼接视频完整路径 video_full_path = os.path.join(video_root, filename) # 提取OpenFace视觉特征 os.system(f"./OpenFace/build/bin/FeatureExtraction -f {video_full_path} -out_dir processed/openface") # 提取16k单声道wav音频用于openSMILE处理 audio_name = filename.rsplit(".", 1)[0] + ".wav" audio_full_path = os.path.join("processed/audio", audio_name) os.system(f"ffmpeg -y -loglevel error -i {video_full_path} -ac 1 -ar 16000 {audio_full_path}") # 提取openSMILE声学特征 opensmile_feature = smile.process_file(audio_full_path) # 保存特征为pickle文件 feature_save_path = os.path.join("processed/feature", filename.rsplit(".",1)[0] + "_opensmile.pkl") with open(feature_save_path, "wb") as f: pickle.dump(opensmile_feature, f)
后续操作提示
- 若运行仍提示工具找不到,将
./OpenFace/build/bin/FeatureExtraction和ffmpeg替换为你本地对应工具的绝对路径即可 - 如果
MOSI/videos下是每个样本的子文件夹,不是直接存的视频,需要再加一层循环遍历子文件夹内的视频文件 - 数据集划分直接调用
sklearn.model_selection.train_test_split按比例拆分样本即可,特征拼接可以在模型定义时用torch.cat(PyTorch)或tensorflow.concat(TensorFlow)实现
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

