常见问题解答¶
概述¶
我们在这里列出了许多用户常遇到的问题以及相应的解决方案。
如果您发现任何频繁出现的问题并且有解决方法,欢迎在列表中补充。如果这里的内容没有涵盖您的问题,请使用提供的模板创建一个问题,并确保在模板中填写所有必要的信息。
安装¶
“No module named ‘mmcv.ops’”; “No module named ‘mmcv._ext’”
使用
pip uninstall mmcv
命令卸载环境中的现有 mmcv。参照安装说明安装 mmcv。
“OSError: MoviePy Error: creation of None failed because of the following error”
使用
pip install moviepy
安装。更多信息可以参考官方安装文档, 请注意(根据这个 issue):对于 Windows 用户,ImageMagick 不会自动被 MoviePy 检测到,需要修改
moviepy/config_defaults.py
文件,提供 ImageMagick 二进制文件magick
的路径,例如IMAGEMAGICK_BINARY = "C:\\Program Files\\ImageMagick_VERSION\\magick.exe"
对于 Linux 用户,如果 MoviePy 没有检测到 ImageMagick,需要修改
/etc/ImageMagick-6/policy.xml
文件,将<policy domain="path" rights="none" pattern="@*" />
注释掉,改为<!-- <policy domain="path" rights="none" pattern="@*" /> -->
。
“即使我已经安装了 XXCODEBASE,为什么还会收到 ‘Please install XXCODEBASE to use XXX’ 的错误消息?”
您收到该错误消息是因为我们的项目无法从 XXCODEBASE 中导入一个函数或类。您可以尝试运行相应的代码行来查看发生了什么。一个可能的原因是,在 OpenMMLAB 的某些代码库中,您需要在安装它们之前先安装 mmcv 和 mmengine。您可以按照教程来安装它们。
数据¶
FileNotFound 错误,例如
No such file or directory: xxx/xxx/img_00300.jpg
在我们的仓库中,我们将
start_index=1
设置为 rawframe 数据集的默认值,将start_index=0
设置为视频数据集的默认值。如果用户遇到数据的第一帧或最后一帧的 FileNotFound 错误,需要检查以 0 或 1 作为偏移量开始的文件,例如xxx_00000.jpg
或xxx_00001.jpg
,然后在配置文件中更改数据处理流水线的start_index
值。我们应该如何预处理数据集中的视频?将它们调整为固定大小(所有视频的高宽比相同),例如
340x256
(1),还是调整它们使得所有视频的短边具有相同的长度(256px 或 320px)(2)?我们尝试过这两种预处理方法,并发现(2)通常是更好的解决方案,因此我们使用(2)作为默认的预处理设置,短边长度为 256px。我们对这些预处理方法进行了基准测试,您可以在TSN 数据基准测试和SlowOnly 数据基准测试中找到结果。
数据处理流水线中的项不匹配导致出现类似
KeyError: 'total_frames'
的错误我们有用于处理视频和帧的两个处理流水线。
对于视频,我们应该在处理流水线中动态解码视频,所以在这种情况下应该使用
DecordInit & DecordDecode
、OpenCVInit & OpenCVDecode
或PyAVInit & PyAVDecode
这样的配对,例如这个示例。对于帧,图像已经在离线状态下解码,所以在这种情况下应该使用
RawFrameDecode
这样的处理流水线项,例如这个示例。KeyError: 'total_frames'
是由于错误地将RawFrameDecode
步骤用于视频,因为当输入是视频时,无法预先获取total_frames
。
训练¶
如何只使用训练好的识别模型进行主干网络的预训练?
为了使用预训练模型进行整个网络的训练,新的配置文件在
load_from
中添加了预训练模型的链接。要使用主干进行预训练,可以将配置文件中主干部分的
pretrained
值更改为权重路径/URL。在训练时,未预料到的键将被忽略。在微调模型时如何固定主干的某些阶段?
您可以参考
def _freeze_stages()
和frozen_stages
。 提醒在配置文件中设置find_unused_parameters = True
,以进行分布式训练或测试。实际上,除了少数模型,如 C3D 等,用户可以设置
frozen_stages
来冻结主干的阶段,因为几乎所有继承自ResNet
和ResNet3D
的主干都支持内部函数_freeze_stages()
。如何在配置文件中设置 memcached ?
在 MMAction2 中,您可以将 memcached 的参数传递给用于视频数据集的
class DecordInit
或用于原始帧数据集的RawFrameDecode
。有关更多细节,请参阅 MMEngine 中的class FileClient
。以下是一个示例,演示如何在原始帧数据集中使用 memcached:mc_cfg = dict(server_list_cfg='server_list_cfg', client_cfg='client_cfg', sys_path='sys_path') train_pipeline = [ ... dict(type='RawFrameDecode', io_backend='memcached', **mc_cfg), ... ]
如何在配置文件中设置
load_from
的值以微调模型?在 MMAction2 中,我们将
load_from=None
设置为configs/_base_/default_runtime.py
中的默认值,并且由于继承设计,用户可以直接通过在其配置文件中设置load_from
来更改它。如何在训练时使用
RawFrameDataset
?在 MMAction2 1.x 版本中,大多数配置文件默认使用
VideoDataset
作为数据集类型,这对于文件存储更加友好。如果您想使用RawFrameDataset
,需要进行两个修改步骤:dataset
相关: 将train_dataloader
/val_dataloader
/test_dataloader
中的dataset
从dataset=dict( type=VideoDataset, data_prefix=dict(video=xxx), ...)
修改为
dataset=dict( type=RawFrameDataset, data_prefix=dict(img=xxx), filename_tmpl='{:05}.jpg', ...)
数据集的其他字段不需要修改。请确保
filename_tmpl
与帧数据匹配,并参考配置文件文档了解更多关于配置文件的详细信息。transform
相关:在train_pipeline
/val_pipeline
/test_pipeline
中删除dict(type='DecordInit', **file_client_args)
,将dict(type='DecordDecode')
修改为dict(type='RawFrameDecode', **file_client_args)
,并确保在配置文件中定义了file_client_args = dict(io_backend='disk')
。
测试¶
如何使预测得分在 softmax 内归一化到 [0, 1] ?
在配置文件中将
model.cls_head.average_clips
设置为'prob'
。如果模型过大,GPU 内存无法容纳甚至只有一个测试样本怎么办?
默认情况下,3D 模型使用 10 个 clips x 3 个 crops 进行测试,总共有 30 个视图。对于非常大的模型,即使只有一个测试样本,GPU 内存也无法容纳(因为有 30 个视图)。为了解决这个问题,您可以在配置文件的
model['test_cfg']
中设置max_testing_views=n
。这样,在前向传播过程中,会使用 n 个视图作为一个批次,以节省 GPU 内存的使用。