Transformers Feature Extractor 完全指南:音频与视觉输入特征的前处理管线
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
导读
在 🤗 Transformers 中,Feature Extractor(特征提取器)承担着「把原始输入加工成模型可消费的输入特征」这一关键职责:对音频文件完成 Log-Mel 频谱图等序列特征提取,对图像完成裁剪、缩放与归一化,并统一处理填充(padding)、注意力掩码以及到 NumPy / PyTorch / TensorFlow 张量的转换。本文以仓库中的 docs/source/ja/main_classes/feature_extractor.md 为骨架,结合 feature_extraction_utils.py、feature_extraction_sequence_utils.py 与 image_utils.py 的源码实现,完整讲解FeatureExtractionMixin、SequenceFeatureExtractor、BatchFeature与ImageFeatureExtractionMixin四大核心类,使读者既能掌握开箱即用的调用方法,也能理解底层张量转换与填充策略的实现原理。
什么是 Feature Extractor
按官方文档的定义,feature extractor 负责为音频(audio)或视觉(vision)模型准备输入特征,具体包括:
- 从序列中提取特征:例如对音频文件做预处理,生成 Log-Mel 频谱图(Log-Mel Spectrogram)特征;
- 从图像中提取特征:例如对图像文件进行裁剪(cropping)等几何变换;
- 张量化与批处理:完成 padding(填充)、normalization(归一化),以及到 NumPy、PyTorch、TensorFlow 张量的转换。
从源码结构看,该文档对应的四个类构成了整个特征提取体系的分层骨架:
| 类 | 定义文件 | 职责 |
|---|---|---|
FeatureExtractionMixin | feature_extraction_utils.py | 提供from_pretrained/save_pretrained等保存加载基座 |
SequenceFeatureExtractor | feature_extraction_sequence_utils.py | 面向语音识别等序列任务的通用提取器,含pad核心方法 |
BatchFeature | feature_extraction_utils.py | 持有并转换pad/__call__输出的字典式容器 |
ImageFeatureExtractionMixin | image_utils.py | 提供图像尺寸调整、裁剪、归一化等工具方法 |
FeatureExtractionMixin:特征提取器的保存与加载基座
FeatureExtractionMixin是所有序列 / 音频特征提取器的公共基类,定义在 feature_extraction_utils.py,它继承自PushToHubMixin,因此天然支持推送到 Hub。其构造函数会把kwargs中的键值对直接设置为对象属性,并弹出processor_class(避免污染序列化结果)。
from_pretrained:从任意来源实例化
类方法from_pretrained支持三种来源(见 feature_extraction_utils.py):
- Hub 上的模型 ID:例如
"facebook/wav2vec2-base-960h",会从 Hub 下载并缓存特征提取器配置; - 本地目录:包含
save_pretrained保存出的配置文件的目录,例如./test/saved_model/; - 单个 JSON 文件:例如
./test/saved_model/preprocessor_config.json。
关键参数(来自 docstring 与源码签名):
| 参数 | 默认值 | 说明 |
|---|---|---|
pretrained_model_name_or_path | 必填 | 模型 ID、目录或 JSON 文件路径 |
cache_dir | None | 自定义下载缓存目录 |
force_download | False | 是否强制重新下载并覆盖缓存 |
local_files_only | False | 是否只允许使用本地文件 |
token | None | Hub 访问令牌(True时使用hf auth login产生的令牌) |
revision | "main" | 分支名 / 标签 / commit id,也可传"refs/pr/<pr_number>"测试 PR |
return_unused_kwargs | False | 为True时返回(feature_extractor, unused_kwargs)元组 |
源码中的示例用法:
from transformers import Wav2Vec2FeatureExtractor # 1) 从 Hub 下载并缓存 feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("facebook/wav2vec2-base-960h") # 2) 从本地目录加载 feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("./test/saved_model/") # 3) 从单个 JSON 文件加载 feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("./test/saved_model/preprocessor_config.json") # 4) kwargs 覆盖已加载属性,未知键默认被忽略 feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained( "facebook/wav2vec2-base-960h", return_attention_mask=False, foo=False ) assert feature_extractor.return_attention_mask is False # 5) return_unused_kwargs=True 时回收未使用的键 feature_extractor, unused_kwargs = Wav2Vec2FeatureExtractor.from_pretrained( "facebook/wav2vec2-base-960h", return_attention_mask=False, foo=False, return_unused_kwargs=True ) assert unused_kwargs == {"foo": False}从加载链路看(get_feature_extractor_dict,feature_extraction_utils.py),from_pretrained会依次尝试解析processor_config.json(新版嵌套格式)与preprocessor_config.json(旧版平铺格式),并按「嵌套配置优先 → 旧版配置兜底」的顺序合并出特征提取器字典,最终交给from_dict构造实例。这解释了为什么同一份代码能同时兼容新老格式的模型仓库。
save_pretrained:序列化到 JSON
save_pretrained(feature_extraction_utils.py)会把特征提取器序列化为preprocessor_config.json写入指定目录;如果该目录不存在会自动创建。若push_to_hub=True,还会在保存后通过PushToHubMixin上传到 Hub。序列化时to_dict会剔除mel_filters、window等无法 JSON 化的中间数组(见 feature_extraction_utils.py),保证配置文件的纯净与可复现。
SequenceFeatureExtractor:语音特征提取的核心实现
SequenceFeatureExtractor是面向语音识别(speech recognition)的通用特征提取类,定义在 feature_extraction_sequence_utils.py。构造函数需要三个关键参数:
| 参数 | 类型 | 说明 |
|---|---|---|
feature_size | int | 提取特征的维度(如 Mel 滤波器组数量) |
sampling_rate | int | 音频数字化采样率,单位 Hz |
padding_value | float | 填充位置使用的值 |
此外它还会读取两个可配置项:padding_side(默认"right",决定左/右填充)与return_attention_mask(默认True)。
pad 方法与填充策略
pad是整个类最核心的方法(feature_extraction_sequence_utils.py),既可以用于单样本预处理,也可以直接作为 PyTorchDataLoader的collate_fn。其参数语义如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
processed_features | 必填 | 单个BatchFeature/ dict,或它们的列表 / 嵌套字典;支持 numpy 数组与 PyTorch 张量 |
padding | True | True/'longest':填充到 batch 内最长序列;'max_length':填充到max_length;False/'do_not_pad':不填充 |
max_length | None | 返回序列的最大长度(与填充 / 截断配合) |
truncation | False | 是否将超过max_length的序列截断 |
pad_to_multiple_of | None | 把序列长度向上取整为该值的倍数 |
return_attention_mask | None | 是否返回注意力掩码,缺省时使用特征提取器自身默认值 |
return_tensors | None | 'pt'返回 PyTorch 张量,'np'返回 NumPy 数组 |
实现上有几个值得注意的细节:
- 输入自动归一:若传入的是 list[dict],
pad会先转置成 dict[list] 以便批量处理;随后把 Python 列表 / 张量统一转为 NumPy 数组(见 feature_extraction_sequence_utils.py); - 填充策略枚举:
PaddingStrategy定义在 utils/generic.py,取值longest/max_length/do_not_pad; pad_to_multiple_of的硬件意义:源码注释明确指出,该参数对 NVIDIA compute capability ≥ 7.5(Volta 起)的 Tensor Cores,以及受益于 128 倍数字列长度的 TPU 特别有用(见 feature_extraction_sequence_utils.py);- 填充实现:
_pad方法按padding_side在左或右侧调用np.pad填充padding_value,feature_size > 1时填充形状为((0, difference), (0, 0))以保留特征维度,同时同步扩展attention_mask(见 feature_extraction_sequence_utils.py); - 截断前置:先
_truncate后_pad,截断启用但未提供max_length时会直接抛出ValueError,避免静默出错。
BatchFeature:字典式的张量容器
BatchFeature是pad与各特征提取器__call__方法的统一返回值,定义在 feature_extraction_utils.py。它继承自UserDict,因此可以像普通 dict 一样使用,键通常是input_values、attention_mask等。
构造参数
| 参数 | 默认值 | 说明 |
|---|---|---|
data | None | __call__/pad返回的字典,值为 list / 数组 / 张量 |
tensor_type | None | 初始化时是否立即将整数列表转换为 PyTorch / NumPy 张量 |
skip_tensor_conversion | None | 需要跳过张量转换的键集合,即使指定了tensor_type也不转换 |
convert_to_tensors 与 to 方法
convert_to_tensors(feature_extraction_utils.py)负责把内部内容批量转换为指定类型的张量,TensorType枚举支持'pt'/'np'/'mlx'(见 utils/generic.py)。实现细节包括:
- 非类数组结构(字符串、字典、字符串列表)自动跳过转换;
- 转换失败时给出可操作的错误提示:建议
padding=True保证形状一致,或return_tensors=None返回 Python 对象; - 针对
overflowing_values键给出专门的报错信息,便于定位填充溢出的问题。
to方法(feature_extraction_utils.py)提供 PyTorch 设备的迁移能力:只对浮点张量做 dtype 转换,避免像 tokenizer 那样把LongTensor意外转成FloatTensor;也支持non_blocking=True的异步传输。
ImageFeatureExtractionMixin:图像特征处理工具箱
ImageFeatureExtractionMixin定义在 image_utils.py,提供图像特征准备的实用工具,是视觉类特征提取器 / 图像处理器的公共能力集合。所有方法都通过_ensure_format_supported校验输入,仅接受PIL.Image.Image、np.ndarray与torch.Tensor三种格式。
常用工具方法一览:
| 方法 | 作用 |
|---|---|
to_pil_image | 转 PIL 图像;浮点数组默认按×255缩放并转uint8,必要时把通道维移回末尾(image_utils.py) |
convert_rgb | 将 PIL 图像转为 RGB 格式(image_utils.py) |
rescale | 对 numpy 图像乘以缩放系数(image_utils.py) |
to_numpy_array | 转 NumPy 数组;默认把通道维放到最前(channel_first=True),并可选缩放到[0, 1](image_utils.py) |
normalize | 按逐通道mean/std归一化(image_utils.py) |
resize | 调整尺寸,支持default_to_square与max_size(image_utils.py) |
center_crop | 中心裁剪到指定尺寸(image_utils.py) |
flip_channel_order | 通道顺序翻转,如 RGB ↔ BGR(image_utils.py) |
配合使用示例:
from transformers.image_utils import ImageFeatureExtractionMixin mixin = ImageFeatureExtractionMixin() image = mixin.convert_rgb(pil_image) # 统一为 RGB array = mixin.to_numpy_array(image) # (C, H, W),值域 [0, 1] array = mixin.resize(array, (224, 224)) # 缩放到模型期望尺寸 array = mixin.center_crop(array, (224, 224)) # 中心裁剪 array = mixin.normalize(array, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 归一化面向现代生态:从 Feature Extractor 到 Processor
需要说明的是,原文档 feature_extractor.md 描述的是较早的设计形态。在当前仓库中,图像侧的能力已逐渐迁移到ImageProcessor(见 image_processing_base.py 中的BatchFeature相关实现),而语音识别等模态则由Processor(如Wav2Vec2Processor)统一编排 tokenizer 与 feature extractor。从get_feature_extractor_dict优先解析processor_config.json的加载逻辑(feature_extraction_utils.py)可以看出,新老格式的兼容是当前仓库的默认行为,旧代码中直接调用 feature extractor 的方式依然可用。理解本文的四大类,是进一步掌握AutoFeatureExtractor与多模态Processor体系的基础。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考