Transformers 任务全景指南:用 Pipeline 三行代码完成 NLP、计算机视觉、音频与多模态任务
2026/9/11 17:24:40 网站建设 项目流程

Transformers 任务全景指南:用 Pipeline 三行代码完成 NLP、计算机视觉、音频与多模态任务

【免费下载链接】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 是一个覆盖自然语言处理(NLP)、计算机视觉以及音频/语音处理的预训练模型库,不仅包含 Transformer 架构,也包含用于视觉任务的现代卷积网络等非 Transformer 模型。本文以 docs/source/es/task_summary.md 的任务总览为骨架,系统梳理音频、视觉、NLP、多模态四类任务的定义、应用场景与实战代码,并深入仓库源码,说明pipeline统一推理接口的底层实现与调用关系。读完本文,你将掌握如何用三行代码完成情感分析、语音识别、目标检测、文档问答等典型任务,并理解这些能力在当前仓库中的落点与扩展方式。

Pipeline:三行代码背后的统一推理入口

原文档反复强调"仅用三行代码"即可解决各类任务,其关键正是pipeline这一高层封装。在仓库中,所有任务代码示例都从同一入口出发:

>>> from transformers import pipeline

pipeline函数定义在 src/transformers/pipelines/init.py,它会根据传入的task字符串在SUPPORTED_TASKS映射表中查找到对应的 Pipeline 实现类并实例化。从源码可见,pipeline()支持的核心参数包括:

  • task:任务名称,如"sentiment-analysis""audio-classification""object-detection"
  • model:模型名称(Hub 上的模型 ID)或已加载的模型实例,不传时使用该任务的默认模型;
  • configtokenizerfeature_extractorimage_processorvideo_processorprocessor:各类预处理组件的覆盖选项;
  • revision:模型版本(分支/标签/commit);
  • device/device_map:指定推理设备或分布式放置策略;
  • dtype:推理精度(如"auto");
  • trust_remote_code:是否允许运行仓库自定义代码;
  • 其余**kwargs(如batch_sizetop_k)会透传给具体的 Pipeline 实例。

例如"sentiment-analysis""text-classification"的别名(源码第 137 行),二者指向同一个 Pipeline 类。每个任务都有对应的独立实现文件,例如 audio_classification.py、automatic_speech_recognition.py、image_segmentation.py、document_question_answering.py 等,均位于src/transformers/pipelines/目录下。这意味着同一套pipeline抽象统一了不同模态的预处理、模型推理与结果后处理流程。

下面按模态逐一展开各类任务。

音频与语音任务

音频任务与其他模态最本质的差异在于:音频输入是连续信号。与文本不同,原始音频波形无法像句子切分为单词那样被整齐地分割成离散单元。解决办法是以固定时间间隔对原始信号进行采样——每个间隔内采样的样本越多,采样率越高,音频就越接近原始声源。

早期做法是先预处理音频、人工提取有用特征;现在更常见的做法是把原始音频波形直接送入特征编码器提取音频表示,从而简化预处理步骤,并让模型自行学习最核心的特征。

音频分类(Audio Classification)

音频分类是从预定义类别集合中为音频数据打标签的任务,属于覆盖极广的类别,典型应用包括:

  • 声学场景分类:用场景标签("办公室"、"海滩"、"体育场")标记音频;
  • 声学事件检测:用声音事件标签("汽车喇叭声"、"鲸鱼叫声"、"玻璃破碎声")标记音频;
  • 标记(tagging):为包含多种声音的音频打标签(如鸟鸣、会议中的说话人识别);
  • 音乐分类:用流派标签("金属"、"嘻哈"、"乡村")标记音乐。

三行代码示例(来自原文档,模型为superb/hubert-base-superb-er,输出按置信度排序的标签列表):

>>> from transformers import pipeline >>> classifier = pipeline(task="audio-classification", model="superb/hubert-base-superb-er") >>> preds = classifier("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac") >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> preds [{'score': 0.4532, 'label': 'hap'}, {'score': 0.3622, 'label': 'sad'}, {'score': 0.0943, 'label': 'neu'}, {'score': 0.0903, 'label': 'ang'}]

从源码结构看,该任务由 audio_classification.py 中的AudioClassificationPipeline实现:它负责对输入音频(路径、URL 或波形数组)调用特征编码器预处理,再由分类头输出各类别得分,最后格式化为{"score", "label"}结构。示例中的hubert-base-superb-er是经过 SUPERB 基准微调的情感识别模型,因此输出hap(happy)、sadneu(neutral)、ang(angry)等情感标签。

自动语音识别(ASR)

自动语音识别(Automatic Speech Recognition,ASR)将语音转录为文本,是最常见的音频任务之一——语音本就是人类自然的交流方式。如今 ASR 已嵌入音箱、手机、汽车等"智能"产品,用户可以要求虚拟助手播放音乐、设置提醒、播报天气。

Transformer 架构帮助攻克的关键挑战之一是低资源语言:通过在大量语音数据上预训练,即便只用一小时低资源语言的标注语音数据微调,仍能取得与以往用 100 倍标注数据训练的传统 ASR 系统相当的高质量结果。

>>> from transformers import pipeline >>> transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-small") >>> transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac") {'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}

该任务由 automatic_speech_recognition.py 中的AutomaticSpeechRecognitionPipeline实现,输出为包含转录文本的{"text": ...}字典。示例使用openai/whisper-small模型,输入是马丁·路德·金演讲音频,模型直接输出对应英文文本。

计算机视觉任务

计算机视觉最早的成功案例之一是用卷积神经网络(CNN)识别邮政编码数字图像。图像由像素组成,每个像素都有数值,因此图像可以表示为像素值矩阵,每个像素值组合描述了图像的颜色。

视觉任务大体有两条解决路径:

  1. 卷积学习图像的层次化特征,从低级特征逐步到高级抽象特征;
  2. 把图像切成块(patch),用 Transformer 逐步学习每个图像块之间的关联以构成整幅图像——与 CNN 自底向上的方式不同,这更像是从一张模糊图像开始、逐步聚焦变清晰。

图像分类(Image Classification)

图像分类将整幅图像标记为预定义类别集合中的某个类,应用场景广泛:

  • 医疗健康:标记医学影像以检测疾病或监测患者状况;
  • 环境:标记卫星图像以监测森林砍伐、辅助野外管理或检测野火;
  • 农业:标记作物图像以监测植物健康,或用卫星图像做土地利用监测;
  • 生态学:标记动植物物种图像以监测野生种群、追踪濒危物种。
>>> from transformers import pipeline >>> classifier = pipeline(task="image-classification") >>> preds = classifier( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> print(*preds, sep="\n") {'score': 0.4335, 'label': 'lynx, catamount'} {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'} {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'} {'score': 0.0239, 'label': 'Egyptian cat'} {'score': 0.0229, 'label': 'tiger cat'}

示例未显式指定modelpipeline会自动加载该任务的默认模型(从源码SUPPORTED_TASKS映射可见image-classification有默认模型与对应的 image_classification.py 实现类)。输入一张猫的图片,输出按得分排序的多组{"score", "label"},其中得分最高的是 "lynx, catamount"(猞猁/山猫)。

目标检测(Object Detection)

与图像分类不同,目标检测要在图像中识别多个对象,并给出每个对象在图像中的位置(由边界框bounding box 定义)。典型应用:

  • 自动驾驶:检测日常交通对象,如其他车辆、行人、红绿灯;
  • 遥感:灾害监测、城市规划、天气预报;
  • 缺陷检测:检测建筑物裂缝或结构损伤,以及制造业产品缺陷。
>>> from transformers import pipeline >>> detector = pipeline(task="object-detection") >>> preds = detector( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"], "box": pred["box"]} for pred in preds] >>> preds [{'score': 0.9865, 'label': 'cat', 'box': {'xmin': 178, 'ymin': 154, 'xmax': 882, 'ymax': 598}}]

输出中的box字段(xmin/ymin/xmax/ymax)即边界框的像素坐标。该能力由 object_detection.py 中的ObjectDetectionPipeline提供,推理时对输入图像执行目标检测并过滤低置信度结果。

图像分割(Image Segmentation)

图像分割是像素级任务,将图像中每个像素分配到某个类别。相比用边界框标记对象的检测任务,分割粒度更细,能在像素级别勾勒对象轮廓。常见分割类型:

  • 实例分割:除标记对象类别外,还区分同一类别的不同实例("dog-1"、"dog-2");
  • 全景分割:语义分割与实例分割的结合——既为每个像素标记语义类别,又区分每个对象的不同实例。

分割在自动驾驶中用于构建周围世界的像素级地图,以便安全绕开行人与车辆;在医学影像中,更细的粒度有助于识别异常细胞或器官特征;在电商中还可用于虚拟试衣,或通过摄像头把虚拟物体叠加到现实世界打造增强现实体验。

>>> from transformers import pipeline >>> segmenter = pipeline(task="image-segmentation") >>> preds = segmenter( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> print(*preds, sep="\n") {'score': 0.9879, 'label': 'LABEL_184'} {'score': 0.9973, 'label': 'snow'} {'score': 0.9972, 'label': 'cat'}

输出中除类别标签(snowcat)外,还可能包含LABEL_184这类需要结合模型标签映射表解释的类别编号。实现位于 image_segmentation.py。

深度估计(Depth Estimation)

深度估计预测图像中每个像素到相机的距离,对场景理解与重建尤为重要。例如自动驾驶车辆需要知道行人、交通标志、其他车辆的距离以避障防撞;深度信息也有助于从 2D 图像构建 3D 表示,可生成生物结构或建筑物的高质量 3D 模型。

两种主流方法:

  • 立体(stereo):通过比较同一场景两张角度略有不同的图像来估计深度;
  • 单目(monocular):从单张图像直接估计深度。
>>> from transformers import pipeline >>> depth_estimator = pipeline(task="depth-estimation") >>> preds = depth_estimator( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... )

该任务由 depth_estimation.py 中的DepthEstimationPipeline实现,输出通常包含深度图(predicted_depth)与对应的深度彩色化图像(depth)。

自然语言处理任务

NLP 任务是最常见的任务类型之一,因为文本是人类最自然的交流方式。要让文本变成模型可识别的格式,必须先分词(tokenize):把文本序列切分成独立的单词或子词(tokens),再把 tokens 转换为数字。于是文本序列变成数字序列,即可输入模型解决各类 NLP 任务。分词细节可参考 docs/source/en/tokenizer_summary.md 与 docs/source/en/glossary.md。

文本分类(Text Classification)

与任何模态的分类任务一样,文本分类为一段文本(句子、段落或文档级别)从预定义类别集合中打标签。常见应用:

  • 情感分析:按极性(如positive/negative)标记文本,支撑政治、金融、营销等领域的决策;
  • 内容分类:按主题(如天气体育金融)组织与过滤新闻、社交媒体信息流。
>>> from transformers import pipeline >>> classifier = pipeline(task="sentiment-analysis") >>> preds = classifier("Hugging Face is the best thing since sliced bread!") >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> preds [{'score': 0.9991, 'label': 'POSITIVE'}]

如前所述,"sentiment-analysis""text-classification"的别名(见 src/transformers/pipelines/init.py 中SUPPORTED_TASKS映射),两者都指向 text_classification.py 中的TextClassificationPipeline

Token 分类(Token Classification)

任何 NLP 任务中文本都会被切分为单词或子词,这些单元即tokens。Token 分类为每个 token分配一个预定义类别集合中的标签。两种常见子任务:

  • 命名实体识别(NER):按实体类别(组织、人物、地点、日期)标记 token。NER 在生物医学领域尤其流行,可标记基因、蛋白质和药物名称;
  • 词性标注(POS):按词性(名词、动词、形容词)标记 token,帮助翻译系统理解两个相同单词在语法上的差异(如作为名词的 "bank" 与作为动词的 "bank")。
>>> from transformers import pipeline >>> classifier = pipeline(task="ner") >>> preds = classifier("Hugging Face is a French company based in New York City.") >>> preds = [ ... { ... "entity": pred["entity"], ... "score": round(pred["score"], 4), ... "index": pred["index"], ... "word": pred["word"], ... "start": pred["start"], ... "end": pred["end"], ... } ... for pred in preds ... ] >>> print(*preds, sep="\n") {'entity': 'I-ORG', 'score': 0.9968, 'index': 1, 'word': 'Hu', 'start': 0, 'end': 2} {'entity': 'I-ORG', 'score': 0.9293, 'index': 2, 'word': '##gging', 'start': 2, 'end': 7} {'entity': 'I-ORG', 'score': 0.9763, 'index': 3, 'word': 'Face', 'start': 8, 'end': 12} {'entity': 'I-MISC', 'score': 0.9983, 'index': 6, 'word': 'French', 'start': 18, 'end': 24} {'entity': 'I-LOC', 'score': 0.999, 'index': 10, 'word': 'New', 'start': 42, 'end': 45} {'entity': 'I-LOC', 'score': 0.9987, 'index': 11, 'word': 'York', 'start': 46, 'end': 50} {'entity': 'I-LOC', 'score': 0.9992, 'index': 12, 'word': 'City', 'start': 51, 'end': 55}

示例输出中I-ORG表示组织实体(Hugging Face)、I-MISC表示其他实体(French)、I-LOC表示地点(New York City);word字段保留子词切分(如Hu+##gging),start/end是实体在原始文本中的字符偏移。实现见 token_classification.py。

问答(Question Answering)

问答是另一个 token 级任务,返回问题的答案,有时带上下文(开放领域),有时不带(封闭领域)。虚拟助手回答"餐厅是否营业"、客服技术支持、搜索引擎检索相关信息,都属于问答的落地场景。两种常见类型:

  • 提取式(extractive):给定问题与上下文,答案是从上下文中提取出的一段文本;
  • 抽象式(abstractive):给定问题与上下文,答案由模型从上下文中生成。

该任务在仓库中由 question-answering 示例与 pipeline 实现共同支撑,示例目录包含完整的训练/推理脚本与说明文档(examples/pytorch/question-answering/README.md)。

摘要(Summarization)

摘要从较长文本生成较短版本,同时尽量保留原文核心含义。摘要是**序列到序列(sequence-to-sequence)**任务:输出比输入更短的文本序列。立法草案、法律与财务文件、专利、科学论文等长文档都可以摘要,帮助读者快速抓住要点。

与问答类似,摘要有两种类型:

  • 提取式(extractive):从原文中识别并抽取最重要的句子;
  • 抽象式(abstractive):从原文生成目标摘要(可能包含输入文档中不存在的新词)。

翻译(Translation)

翻译把一种语言的文本序列转换为另一种语言,帮助不同背景的人交流、让内容触达更广受众,也可作为语言学习工具。与摘要一样,翻译是序列到序列任务:模型接收输入序列,返回目标输出序列。

早期翻译模型大多是单语的,而近期业界越来越关注可在多种语言组合间互译的多语言模型

语言模型(Language Modeling)

语言模型预测文本序列中的一个词,是非常流行的 NLP 任务——因为预训练语言模型可被微调用于众多下游任务。近年来大语言模型(LLMs)展示了**零样本(zero-shot)少样本(few-shot)**学习能力,即模型可以解决未被显式训练过的任务。语言模型可生成流畅且有说服力的文本,但需注意生成内容并不总是准确的。两种类型:

  • 因果(causal):模型目标是预测序列中的下一个 token,未来 tokens 被掩蔽:

    >>> from transformers import pipeline >>> prompt = "Hugging Face is a community-based open-source platform for machine learning." >>> generator = pipeline(task="text-generation") >>> generator(prompt) # doctest: +SKIP
  • 掩蔽(masked):模型目标是预测序列中被掩蔽的 token,同时对序列中所有 tokens 拥有完全访问权:

    >>> text = "Hugging Face is a community-based open-source <mask> for machine learning." >>> fill_mask = pipeline(task="fill-mask") >>> preds = fill_mask(text, top_k=1) >>> preds = [ ... { ... "score": round(pred["score"], 4), ... "token": pred["token"], ... "token_str": pred["token_str"], ... "sequence": pred["sequence"], ... } ... for pred in preds ... ] >>> preds [{'score': 0.2236, 'token': 1761, 'token_str': ' platform', 'sequence': 'Hugging Face is a community-based open-source platform for machine learning.'}]

两段示例分别对应 text_generation.py 与 fill_mask.py 中的实现;fill_mask通过top_k=1只返回得分最高的补全结果,输出中token是预测 token 的 ID,token_str是其文本形式,sequence是补全后的完整句子。

多模态任务

多模态任务要求模型同时处理多种数据模态(文本、图像、音频、视频)以解决特定问题。图像描述(image captioning)就是典型例子:模型接收图像输入,输出描述图像或其属性的文本序列。

尽管多模态模型处理的数据类型各异,内部预处理步骤会帮助模型把各类数据统一转换为embeddings(包含数据有意义信息的向量/数字列表)。以图像描述为例,模型学习的是图像 embedding 与文本 embedding 之间的关系。

文档问答(Document Question Answering)

文档问答是从文档中回答自然语言问题的任务。与输入纯文本的 token 级问答不同,文档问答把文档图像连同问题一起作为输入,返回答案。它可用于解析结构化文档并抽取关键信息——下面的例子中,从一张收据图像中抽取了总金额:

>>> from transformers import pipeline >>> from PIL import Image >>> import requests >>> url = "https://huggingface.co/datasets/hf-internal-testing/example-documents/resolve/main/jpeg_images/2.jpg" >>> image = Image.open(requests.get(url, stream=True).raw) >>> doc_question_answerer = pipeline("document-question-answering", model="magorshunov/layoutlm-invoices") >>> preds = doc_question_answerer( ... question="What is the total amount?", ... image=image, ... ) >>> preds [{'score': 0.8531, 'answer': '17,000', 'start': 4, 'end': 4}]

示例中用requests拉取收据图片并用 PIL 打开,随后用magorshunov/layoutlm-invoices模型回答"总金额是多少",得到答案17,000。该任务实现位于 document_question_answering.py,仓库对应的模型族包括 layoutlm 系列(tests/models/layoutlm、tests/models/layoutlmv2 等测试目录可佐证)。

结语:从任务概览到动手实践

至此,本文沿原文档脉络覆盖了四大模态的十余类任务:音频(音频分类、ASR)、视觉(图像分类、目标检测、图像分割、深度估计)、NLP(文本分类、Token 分类、问答、摘要、翻译、语言模型)以及多模态(文档问答),每一类都给出了可直接运行的三行代码示例,并指出了仓库中对应的 pipeline 实现文件,方便你继续深入阅读源码。

需要指出的是,pipeline只是 🤗 Transformers 的高层入口;若要进一步了解 pipeline 的组装细节(预处理、推理、后处理的完整流程),可继续阅读 docs/source/en/pipeline_tutorial.md;若想从任务视角快速体验完整 API,可参考 docs/source/en/quicktour.md;安装与环境配置请参阅 docs/source/en/installation.md。原文档提到的任务机制详解("Transformers 如何解决这些任务")对应内容可结合上述文档与src/transformers/pipelines/下的源码逐步深入。

【免费下载链接】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),仅供参考

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

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

立即咨询