Transformers Feature Extractor 完全指南:音频与视觉输入特征的前处理管线
2026/9/11 5:35:45 网站建设 项目流程

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 的源码实现,完整讲解FeatureExtractionMixinSequenceFeatureExtractorBatchFeatureImageFeatureExtractionMixin四大核心类,使读者既能掌握开箱即用的调用方法,也能理解底层张量转换与填充策略的实现原理。

什么是 Feature Extractor

按官方文档的定义,feature extractor 负责为音频(audio)或视觉(vision)模型准备输入特征,具体包括:

  • 从序列中提取特征:例如对音频文件做预处理,生成 Log-Mel 频谱图(Log-Mel Spectrogram)特征;
  • 从图像中提取特征:例如对图像文件进行裁剪(cropping)等几何变换;
  • 张量化与批处理:完成 padding(填充)、normalization(归一化),以及到 NumPy、PyTorch、TensorFlow 张量的转换。

从源码结构看,该文档对应的四个类构成了整个特征提取体系的分层骨架:

定义文件职责
FeatureExtractionMixinfeature_extraction_utils.py提供from_pretrained/save_pretrained等保存加载基座
SequenceFeatureExtractorfeature_extraction_sequence_utils.py面向语音识别等序列任务的通用提取器,含pad核心方法
BatchFeaturefeature_extraction_utils.py持有并转换pad/__call__输出的字典式容器
ImageFeatureExtractionMixinimage_utils.py提供图像尺寸调整、裁剪、归一化等工具方法

FeatureExtractionMixin:特征提取器的保存与加载基座

FeatureExtractionMixin是所有序列 / 音频特征提取器的公共基类,定义在 feature_extraction_utils.py,它继承自PushToHubMixin,因此天然支持推送到 Hub。其构造函数会把kwargs中的键值对直接设置为对象属性,并弹出processor_class(避免污染序列化结果)。

from_pretrained:从任意来源实例化

类方法from_pretrained支持三种来源(见 feature_extraction_utils.py):

  1. Hub 上的模型 ID:例如"facebook/wav2vec2-base-960h",会从 Hub 下载并缓存特征提取器配置;
  2. 本地目录:包含save_pretrained保存出的配置文件的目录,例如./test/saved_model/
  3. 单个 JSON 文件:例如./test/saved_model/preprocessor_config.json

关键参数(来自 docstring 与源码签名):

参数默认值说明
pretrained_model_name_or_path必填模型 ID、目录或 JSON 文件路径
cache_dirNone自定义下载缓存目录
force_downloadFalse是否强制重新下载并覆盖缓存
local_files_onlyFalse是否只允许使用本地文件
tokenNoneHub 访问令牌(True时使用hf auth login产生的令牌)
revision"main"分支名 / 标签 / commit id,也可传"refs/pr/<pr_number>"测试 PR
return_unused_kwargsFalseTrue时返回(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_filterswindow等无法 JSON 化的中间数组(见 feature_extraction_utils.py),保证配置文件的纯净与可复现。

SequenceFeatureExtractor:语音特征提取的核心实现

SequenceFeatureExtractor是面向语音识别(speech recognition)的通用特征提取类,定义在 feature_extraction_sequence_utils.py。构造函数需要三个关键参数:

参数类型说明
feature_sizeint提取特征的维度(如 Mel 滤波器组数量)
sampling_rateint音频数字化采样率,单位 Hz
padding_valuefloat填充位置使用的值

此外它还会读取两个可配置项:padding_side(默认"right",决定左/右填充)与return_attention_mask(默认True)。

pad 方法与填充策略

pad是整个类最核心的方法(feature_extraction_sequence_utils.py),既可以用于单样本预处理,也可以直接作为 PyTorchDataLoadercollate_fn。其参数语义如下:

参数默认值说明
processed_features必填单个BatchFeature/ dict,或它们的列表 / 嵌套字典;支持 numpy 数组与 PyTorch 张量
paddingTrueTrue/'longest':填充到 batch 内最长序列;'max_length':填充到max_lengthFalse/'do_not_pad':不填充
max_lengthNone返回序列的最大长度(与填充 / 截断配合)
truncationFalse是否将超过max_length的序列截断
pad_to_multiple_ofNone把序列长度向上取整为该值的倍数
return_attention_maskNone是否返回注意力掩码,缺省时使用特征提取器自身默认值
return_tensorsNone'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_valuefeature_size > 1时填充形状为((0, difference), (0, 0))以保留特征维度,同时同步扩展attention_mask(见 feature_extraction_sequence_utils.py);
  • 截断前置:先_truncate_pad,截断启用但未提供max_length时会直接抛出ValueError,避免静默出错。

BatchFeature:字典式的张量容器

BatchFeaturepad与各特征提取器__call__方法的统一返回值,定义在 feature_extraction_utils.py。它继承自UserDict,因此可以像普通 dict 一样使用,键通常是input_valuesattention_mask等。

构造参数

参数默认值说明
dataNone__call__/pad返回的字典,值为 list / 数组 / 张量
tensor_typeNone初始化时是否立即将整数列表转换为 PyTorch / NumPy 张量
skip_tensor_conversionNone需要跳过张量转换的键集合,即使指定了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.Imagenp.ndarraytorch.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_squaremax_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询