callable
是 Python 中一个非常重要的概念,它指的是可以被调用的对象。换句话说,任何可以使用括号 ()
来执行的对象都可以被称为 callable
。
在 Python 中,有以下几种常见的 callable
对象:
- 函数 (function): 这是最基本的
callable
对象,可以使用括号()
来调用执行。def my_function(x): return x + 1 result = my_function(5) # 调用 my_function 这个 callable 对象
- 类 (class): 类本身也是一种
callable
对象,可以用来创建实例对象。class MyClass: def __init__(self, value): self.value = value my_object = MyClass(10) # 调用 MyClass 这个 callable 对象创建实例
- 类实例: 如果类实现了
__call__
方法,那么该类的实例也是callable
的。class Adder: def __init__(self, x): self.x = x def __call__(self, y): return self.x + y adder = Adder(5) result = adder(3) # 调用 adder 实例这个 callable 对象
- 匿名函数 (lambda): 使用
lambda
关键字定义的匿名函数也是callable
的。square = lambda x: x * x result = square(4) # 调用 square 这个 callable 对象
总之,任何可以使用括号
()
来调用执行的对象都可以被称为callable
。这种抽象概念使得 Python 代码更加灵活和可扩展,是 Python 编程中一个非常重要的基础概念。
Args:
transforms (list[dict | callable]):
Either config dicts of transforms or transform objects.
在深度学习中,数据预处理通常需要经过一系列的转换(transforms)操作,将原始数据转换为模型可以接受的格式。这些转换操作可以是诸如图像裁剪、旋转、归一化等常见的操作,也可以是自定义的复杂操作。
transforms
参数就是用来定义这些预处理操作的。它可以接受两种不同的输入形式:
- 转换对象(transform object)
- 转换配置字典(transform config dict)
转换对象是一个可调用的 Python 对象,实现了特定的数据转换逻辑。例如 torchvision.transforms.Resize
就是一个常见的转换对象,它可以用于调整图像的大小。
转换配置字典则是一个 Python 字典,描述了转换操作的配置信息。这种形式更加灵活,可以动态地构建和修改转换管道。字典中通常包含以下信息:
'type'
:转换操作的类型,对应于一个可调用的转换对象'params'
:转换操作的参数,以键值对的形式提供
例如,下面的配置字典描述了一个图像裁剪操作:
crop_config = {
'type': 'RandomCrop',
'params': {
'size': (224, 224)
}
}
在使用 transforms
参数时,可以混合使用这两种形式。通常情况下,常见的转换操作可以直接使用对象形式,而一些复杂或自定义的操作则使用配置字典形式更加灵活。
总之,transforms
参数为数据预处理提供了高度的可配置性和可扩展性,使得我们可以根据具体任务和数据类型构建出最适合的数据预处理管道。
比如现在这个
[{'type': 'UniformSampleFrames', 'clip_len': 48, 'num_clips': 10}, {'type': 'PoseDecode'}, {'type': 'PoseCompact', 'hw_ratio': 1.0, 'allow_imgpad': True}, {'type': 'Resize', 'scale': (64, 64), 'keep_ratio': False}, {'type': 'GeneratePoseTarget', 'with_kp': False, 'with_limb': True, 'double': True, 'left_kp': [1, 3, 5, 7, 9, 11, 13, 15], 'right_kp': [2, 4, 6, 8, 10, 12, 14, 16]}, {'type': 'FormatShape', 'input_format': 'NCTHW_Heatmap'}, {'type': 'Collect', 'keys': ['imgs', 'label'], 'meta_keys': []}, {'type': 'ToTensor', 'keys': ['imgs']}]
这个是一个常见的视频数据预处理管道,由多个转换操作组成。逐一解释一下每个转换操作的作用:
-
{'type': 'UniformSampleFrames', 'clip_len': 48, 'num_clips': 10}
:- 将视频统一采样成 10 个长度为 48 的视频片段。这样可以把变长的视频转换成固定长度的输入。
- 这个操作从视频中均匀地抽取 10 个片段,每个片段包含 48 帧。
-
{'type': 'PoseDecode'}
:- 对输入的视频片段进行人体姿态解码,提取出每一帧的人体关键点信息。
-
{'type': 'PoseCompact', 'hw_ratio': 1.0, 'allow_imgpad': True}
:- 将人体姿态关键点信息压缩成正方形图像,并允许进行图像填充。
-
{'type': 'Resize', 'scale': (64, 64), 'keep_ratio': False}
:- 将压缩后的人体姿态图像统一resize到 64x64 的大小。
-
{'type': 'GeneratePoseTarget', 'with_kp': False, 'with_limb': True, 'double': True, 'left_kp': [1, 3, 5, 7, 9, 11, 13, 15], 'right_kp': [2, 4, 6, 8, 10, 12, 14, 16]}
:- 根据人体关键点信息,生成人体骨骼线条特征图作为模型的输入目标。这里特别针对左右身体特征进行了分别编码。
-
{'type': 'FormatShape', 'input_format': 'NCTHW_Heatmap'}
:- 将上一步生成的人体骨骼线条特征图调整成模型期望的输入格式 (NCTHW)。
-
{'type': 'Collect', 'keys': ['imgs', 'label'], 'meta_keys': []}
:- 收集上述预处理步骤生成的所有数据,包括视频帧序列
imgs
和标签label
。
- 收集上述预处理步骤生成的所有数据,包括视频帧序列
-
{'type': 'ToTensor', 'keys': ['imgs']}
:- 将图像数据从 numpy 格式转换为 PyTorch 的 Tensor 格式。
总的来说,这个预处理管道完成了从原始视频到模型可用输入的全部转换过程,包括视频采样、姿态解码、特征提取、格式转换等步骤。这种灵活组合的预处理方式非常适合于复杂的深度学习视频任务。
Python:什么是callable?_python callable-CSDN博客
pyskl/pyskl/datasets/pipelines/compose.py at main · kennymckormick/pyskl · GitHub