Python 运行报错:RuntimeError: An attempt has been made to start a new process before the current process
·
报错背景
今天,编写了下面的一段计算数字人视频生成评价指标 FID 的代码如下:
import torch
from pytorch_fid import fid_score
# 定义真实图像和生成图像的路径
# 注意:这两个路径下应该存放的是一帧帧的图片文件
real_images_path = 'path/to/real_images'
generated_images_path = 'path/to/generated_images'
# 设置设备(如果可用,建议使用GPU加速)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 计算FID分数
# dims: Inception-V3模型提取的特征维度,2048是常用默认值
# batch_size: 计算时每个批次处理的图像数量
fid_value = fid_score.calculate_fid_given_paths(
paths=[real_images_path, generated_images_path],
batch_size=50,
device=device,
dims=2048
)
但是,运行时,出现了下面的报错:
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.
报错分析
- Windows平台多进程机制:在 Windows 系统上,Python 的 multiprocessing 模块使用 spawn 方式创建子进程,这与Linux / MacOS 的 fork 机制不同,需要重新导入主模块。如果没有适当的保护机制,会导致子进程再次执行主模块代码,形成无限递归。
- PyTorch DataLoader 的多进程机制:
pytorch_fid库内部使用torch.utils.data.DataLoader来加载图像,而DataLoader默认使用多进程(num_workers>0)来加速数据加载。在 Windows 上,这些工作进程需要重新导入主模块 - 缺少主模块保护:Python脚本直接执行时,
__name__等于'__main__'。子进程重新导入脚本时,也会执行其中的代码。没有if __name__ == '__main__':保护时,会重复执行 FID 计算逻辑。
解决方式
将代码包装在 if __name__ == '__main__': 下即可。修改后的代码如下:
import torch
from pytorch_fid import fid_score
if __name__ == '__main__':
# 定义真实图像和生成图像的路径
# 注意:这两个路径下应该存放的是一帧帧的图片文件
real_images_path = "real_images"
generated_images_path = "generated_images"
# 设置设备(如果可用,建议使用GPU加速)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 计算FID分数
# dims: Inception-V3模型提取的特征维度,2048是常用默认值
# batch_size: 计算时每个批次处理的图像数量
fid_value = fid_score.calculate_fid_given_paths(
paths=[real_images_path, generated_images_path],
batch_size=50,
device=device,
dims=2048
)
print(f"FID Score: {fid_value}")
更多推荐


所有评论(0)