报错背景

今天,编写了下面的一段计算数字人视频生成评价指标 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}")
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐