2026/1/11 6:10:25
网站建设
项目流程
自己的网站怎么做商城,东莞市外贸网站建设平台,linux下装wordpress,打造网站品牌文章目录多模态文档问答可视化问答零样本可视化问答特征提取文本特征提取音频特征提取提取特征提取器支持类输入预处理填充截断重采样图像特征提取图像描述生成图片转文本图片文本转文本蒙版生成Transformers 是一个采用当下技术最新、表现最佳#xff08;
State-of-the-artState-of-the-artSoTA的模型和技术在预训练自然语言处理、计算机视觉、音频和多模态模型方面提供推理和训练的的开源库旨在快速易用以便每个人都可以开始使用transformer模型进行学习或构建。该库不仅包含Transformer模型还包括用于计算机视觉任务的现代卷积网络等非Transformer模型。多模态多模态任务要求模型处理多种数据模态文本、图像、音频、视频以解决特定问题。图像描述是一个多模态任务的例子其中模型将图像作为输入并输出描述图像或图像某些属性的文本序列。虽然多模态模型处理不同的数据类型或模态但内部预处理步骤帮助模型将所有数据类型转换为embeddings向量或数字列表包含有关数据的有意义信息。对于像图像描述这样的任务模型学习图像嵌入和文本嵌入之间的关系。文档问答文档问答Document Question Answering是从文档中回答“自然语言问题”的任务。与token-level问答任务不同文档问答根据输入文本问题从提供的文档中的图像寻找答案并返回答案。文档问答可用于解析结构化文档并从中提取关键信息。在下面的例子中可以从收据中提取总金额和找零金额。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, streamTrue).raw) doc_question_answerer pipeline(document-question-answering, modelmagorshunov/layoutlm-invoices) preds doc_question_answerer( questionWhat is the total amount?, imageimage, ) preds结果为[{score: 0.8531, answer: 17,000, start: 4, end: 4}]可视化问答视觉问答Visual Question AnsweringVQA是一个根据图像和开放式问题给出答案的任务。该任务的模型输入通常是一张图像和一个问题的组合输出是以自然语言表达的答案。VQA应用案例有面向视力障碍个体的辅助应用。教育对讲座或教科书中呈现的视觉材料提问。VQA还可以在互动博物馆展示或历史遗址中应用。客户服务和电子商务VQA可以通过允许用户提问产品来提升用户体验。图像检索VQA模型可以用于检索具有特定特征的图像。如用户通过询问“Is there a dog”从一组图像中找到所有包含狗的图像等。from transformers import pipeline pipe pipeline(visual-question-answering, modelMariaK/vilt_finetuned_200)然后准备输入包括一张图片和一个问题example dataset[0] image Image.open(example[image_id]) question example[question] print(question) pipe(image, question)以上案例假定有一个数据集并从数据集中提取出第一条记录然后从iamge_id节点取出图片地址从question节点取出问题信息数据集的第一条记录结构如下{question: Where is he looking?, question_type: none of the above, question_id: 262148000, image_id: /root/.cache/huggingface/datasets/downloads/extracted/ca733e0e000fb2d7a09fbcc94dbfe7b5a30750681d0e965f8e0a23b1c2f98c75/val2014/COCO_val2014_000000262148.jpg, answer_type: other, label: {ids: [at table, down, skateboard, table], weights: [0.30000001192092896, 1.0, 0.30000001192092896, 0.30000001192092896]}}执行推理得到结果如下Where is he looking? [{score: 0.5498199462890625, answer: down}]零样本可视化问答前一模型将VQA视为分类任务进行处理。近期的一些模型如BLIP、BLIP-2和InstructBLIP则将VQA视为生成任务。以BLIP-2为例。它引入了一种支持预训练视觉编码器和LLM的任意组合的新的视觉语言visual-language预训练范式。这使得在多个视觉语言任务中实现了最先进的结果包括视觉问答。下面开始讲解如何在VQA任务上使用这个模型。首先先加载模型。如果设备支持GPU则将加载的模型指给GPU。之前在训练时不需要这样做训练器会自动处理from transformers import AutoProcessor, Blip2ForConditionalGeneration import torch processor AutoProcessor.from_pretrained(Salesforce/blip2-opt-2.7b) model Blip2ForConditionalGeneration.from_pretrained(Salesforce/blip2-opt-2.7b, torch_dtypetorch.float16) device cuda if torch.cuda.is_available() else cpu model.to(device)然后准备输入包括一张图像和一段文本example dataset[0] image Image.open(example[image_id]) question example[question]以上案例假定有一个数据集并从数据集中提取出第一条记录然后从iamge_id节点取出图片地址从question节点取出问题信息数据集的第一条记录结构如下{question: Where is he looking?, question_type: none of the above, question_id: 262148000, image_id: /root/.cache/huggingface/datasets/downloads/extracted/ca733e0e000fb2d7a09fbcc94dbfe7b5a30750681d0e965f8e0a23b1c2f98c75/val2014/COCO_val2014_000000262148.jpg, answer_type: other, label: {ids: [at table, down, skateboard, table], weights: [0.30000001192092896, 1.0, 0.30000001192092896, 0.30000001192092896]}}要使用BLIP-2进行视觉问答任务文本提示必须遵循特定的格式Question: {} Answer:.prompt fQuestion: {question} Answer:现在使用processor预处理图像/提示并将处理过的输入传给实例model然后解码输出inputs processor(image, textprompt, return_tensorspt).to(device, torch.float16) generated_ids model.generate(**inputs, max_new_tokens10) generated_text processor.batch_decode(generated_ids, skip_special_tokensTrue)[0].strip() print(generated_text)结果He is looking at the crowd正如你所见模型识别了人群和面部的朝向向下看但它似乎忽略了人群在滑冰者后面的事实。尽管如此在无法获取人工注释数据集的情况下这种方法可以快速产生有用的结果。特征提取特征抽取feature-extraction用途非常广泛指将文本、语音、图片、视频抽帧等多模态内容向量化在内容相似比对、推荐模型、迁移学习、检索排序、RAG等场景非常常用。文本特征提取首先将Pipeline实例化并在实例化时指定任务feature-extraction和所使用的模型facebook/bart-base:from transformers import pipeline feature_extractor pipeline(modelgoogle-bert/bert-base-uncased, taskfeature-extraction)然后调用实例feature_extractor并传入要处理的文本得到预测的结果并打印输出text Transformers is an awesome library! outputfeature_extractor(text,return_tensors pt) print(output)音频特征提取特征提取器将音频数据预处理成给定模型所需的正确格式。它接受原始音频信号并将其转换为可以馈送到模型中的张量。张量的形状取决于模型但是特征提取器会根据你使用的模型正确地预处理音频数据。特征提取器还包括填充、截断和重采样的方法。提取特征调用 [~AutoFeatureExtractor.from_pretrained] 从Hugging Face Hub站点或本地目录加载特征提取器及其预处理器配置。特征提取器和预处理器配置保存在preprocessor_config.json文件中。将音频信号通常保存在array中传递给特征提取器并设置sampling_rate参数为预训练音频模型的采样率。注意音频数据的采样率与预训练音频模型所训练的数据的采样率要相匹配。from transformers import AutoFeatureExtractor feature_extractor AutoFeatureExtractor.from_pretrained(facebook/wav2vec2-base) processed_sample feature_extractor(dataset[0][audio][array], sampling_rate16000) processed_sample结果{input_values: [array([ 9.4472744e-05, 3.0777880e-03, -2.8888427e-03, ..., -2.8888427e-03, 9.4472744e-05, 9.4472744e-05], dtypefloat32)]}从输出的结果可知特征提取器预处理的结果保存在input_values属性节点中。提取器支持类Transformers提供的所有特征提取器都继承自 [SequenceFeatureExtractor] 类 [SequenceFeatureExtractor] 类是 [FeatureExtractionMixin] 的子类。[SequenceFeatureExtractor] 需要提供一个填充方法设置到 [~SequenceFeatureExtractor.pad] 属性上整个方法用来处理序列的长度以避免序列长度不均匀[FeatureExtractionMixin] 提供[~FeatureExtractionMixin.from_pretrained]来载入配置和特征提取器 提供[~FeatureExtractionMixin.save_pretrained]来保存更改的配置和特征提取器.有两种方式可以载入特征提取器一种是通过[AutoFeatureExtractor] 使用[AutoFeatureExtractor] 会从给定的模型自动装配上正确的特征提取器如from transformers import AutoFeatureExtractor feature_extractor AutoFeatureExtractor.from_pretrained(openai/whisper-tiny)另外一种是直接使用特定模型提供的专有特征提取器。每个预训练模型都会有一个对应的特征提取器以便能够正确的处理音频数据。在载入特征提取器的时候它会从preprocessor_config.json文件中载入特征提取配置项如特征大小、块大小等。from transformers import WhisperFeatureExtractor feature_extractor WhisperFeatureExtractor.from_pretrained(openai/whisper-tiny)输入预处理特征提取器期望输入为特定形状的PyTorch张量。输入形状则会因为所使用的特定音频模型的不同而有所不同。例如[Whisper] 期望input_features是包含batch_size,feature_size,sequence_length) 在内的形状张量但[Wav2Vec2]期望input_values’是包含batch_size,sequence_length的形状张量。特征提取器会根据所使用的音频模型生成正确的输入形状特征提取器还设置音频文件的采样率每秒获取的音频信号值的数量。音频数据的采样率必须与预训练模型所训练的数据集的采样率相匹配。这个值通常在模型卡中给出。使用特征提取器的 [~FeatureExtractionMixin.from_pretrained]方法加载一个数据集from datasets import load_dataset, Audio from transformers import AutoFeatureExtractor dataset load_dataset(PolyAI/minds14, nameen-US, splittrain) feature_extractor AutoFeatureExtractor.from_pretrained(facebook/wav2vec2-base)从给定的数据集的音频子集audio中的array中检出原始音频信号dataset[0][audio][array] array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, 0. , 0. ])填充不同的音频序列长度不一定相同但Transformers希望所有序列都具有相同的长度这样它们就可以批量处理。不均匀的序列长度不能成批处理。如dataset[0][audio][array].shape (86699,) dataset[1][audio][array].shape (53248,)为了保证批处理中的每个序列拥有相同的长度需要为每个序列添加特殊的“填充标识”。实际处理中特征提取器以批处理中的最长序列为基准为其他序列添加0 00至和最长的序列等长。可以设置paddingTrue来启用填充操作。def preprocess_function(examples): audio_arrays [x[array] for x in examples[audio]] inputs feature_extractor( audio_arrays, sampling_rate16000, paddingTrue, ) return inputs processed_dataset preprocess_function(dataset[:5]) processed_dataset[input_values][0].shape # (86699,) processed_dataset[input_values][1].shape # (86699,)截断在崩溃之前模型只能处理确定长度的序列。截断是一种策略用于从序列中删除多余的token以确保它不超过最大长度。设置truncationTrue启用截断功能将序列截断为max_length参数中设定的长度值。def preprocess_function(examples): audio_arrays [x[array] for x in examples[audio]] inputs feature_extractor( audio_arrays, sampling_rate16000, max_length50000, truncationTrue, ) return inputs processed_dataset preprocess_function(dataset[:5]) processed_dataset[input_values][0].shape #(50000,) processed_dataset[input_values][1].shape #(50000,)重采样[Datassets]库也可以重新采样音频数据以匹配音频模型的预期采样率。这种方法只针对加载的音频数据对其进行重新采样这比对整个数据集进行重新采样要快得多。下面用的音频数据集的采样率为8 k H z 8kHz8kHz但预训练模型的采样率为16 k H z 16kHz16kHz。dataset[0][audio] {path: /root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav, array: array([ 0. , 0.00024414, -0.00024414, ..., -0.00024414, 0. , 0. ]), sampling_rate: 8000}调用 [~datasets.Dataset.cast_column] 将audio列的采样率转换到16 k H z 16kHz16kHzdataset dataset.cast_column(audio, Audio(sampling_rate16000))现在再看样例数据集采样率已经变成了16 k H z 16kHz16kHzdataset[0][audio] {path: /root/.cache/huggingface/datasets/downloads/extracted/f507fdca7f475d961f5bb7093bcc9d544f16f8cab8608e772a2ed4fbeb4d6f50/en-US~JOINT_ACCOUNT/602ba55abb1e6d0fbce92065.wav, array: array([ 1.70562416e-05, 2.18727451e-04, 2.28099874e-04, ..., 3.43842403e-05, -5.96364771e-06, -1.76846661e-05]), sampling_rate: 16000}图像特征提取图像特征提取Image feature extraction是对给定图像提取语义上有意义的特征。它有许多用例包括图像相似度和图像检索等。此外大多数计算机视觉模型都可以用于图像特征提取如去除特定任务的头部如图像分类目标检测等并获得特征。这些特征在更高的层次上的视觉处理如边缘检测角点检测等是非常有用的。它们也可能包含关于现实世界的信息例如猫的样子这取决于模型的深度。因此这些输出可用于在特定数据集上训练新的分类器。假定现在有两张猫坐在渔网上图片其中一张是生成的from PIL import Image import requests img_urls [https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png, https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.jpeg] image_real Image.open(requests.get(img_urls[0], streamTrue).raw).convert(RGB) image_gen Image.open(requests.get(img_urls[1], streamTrue).raw).convert(RGB)现在开始使用Pipeline来演示如何提取特征的。首先通过初始化Pipeline实例加载google/vit-base-patch16-224模型如果想计算相似度需设置参数pool为Trueimport torch from transformers import pipeline from accelerate.test_utils.testing import get_backend # automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.) DEVICE, _, _ get_backend() pipe pipeline(taskimage-feature-extraction, model_namegoogle/vit-base-patch16-384, deviceDEVICE, poolTrue)然后对输入进行推理并打印结果outputs pipe([image_real, image_gen]) # get the length of a single output print(len(outputs[0][0])) # show outputs print(outputs)结果# 768 # [[[-0.03909236937761307, 0.43381670117378235, -0.06913255900144577,...获取相似度得分后需要将结果作为参数传给cosine_similarityfrom torch.nn.functional import cosine_similarity similarity_score cosine_similarity(torch.Tensor(outputs[0]), torch.Tensor(outputs[1]), dim1) print(similarity_score)结果# tensor([0.6043])如果想在池化前获取最后的隐藏状态切记不要设置poolTruepipe pipeline(taskimage-feature-extraction, model_namegoogle/vit-base-patch16-224, deviceDEVICE) outputs pipe(image_real)既然不需要对输出做池化处理那么输出的结果的第一个维度表示批数后两个值为形状的隐藏状态值。import numpy as np print(np.array(outputs).shape)结果# (1, 197, 768)图像描述生成图像描述生成Image captioning是为给定图像预测出一段描述的任务可以看作“开图说话”。它在现实世界中的常见应用包括帮助视力受损的人在不同的情况下导航。因此图像字幕通过识别给定图片向人们描述图像。首先我们先加载微调的模型假定模型名为microsoft/git-basefrom transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained(checkpoint)然后加载要分析的图片from PIL import Image import requests url https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/pokemon.png image Image.open(requests.get(url, streamTrue).raw) image接下来将分析的图片传入到模型中from accelerate.test_utils.testing import get_backend # automatically detects the underlying device type (CUDA, CPU, XPU, MPS, etc.) device, _, _ get_backend() inputs processor(imagesimage, return_tensorspt).to(device) pixel_values inputs.pixel_values最后调用[~AutoModelForCausalLM.generate]来解码预测结果generated_ids model.generate(pixel_valuespixel_values, max_length50) generated_caption processor.batch_decode(generated_ids, skip_special_tokensTrue)[0] print(generated_caption)结果a drawing of a pink and blue pokemon除了这种方式外采用图片转文本或图片文本转文本也可以实现图像描述生成的功能。图片转文本作为可视化语言模型vision language models,VLMs的一种图片转文本Image-to-text是一个接受一张图像分析图像中的文字并将其提取出来的任务。它不依赖于OCR引擎。应用场景包括文档扫描与数字化将纸质文档快速转化为电子版自动字幕生成对视频进行实时字幕提取适用于听觉障碍的人群社交媒体分析提取图像中的文字喜喜用于新闻摘要、情感分析等大数据应用智能办公自动识别表格数据提升工作效率。首先将Pipeline实例化并在实例化时指定任务为image-to-text和传入nlpconnect/vit-gpt2-image-captioning模型from transformers import pipeline # 设置镜像地址如果能访问Huging Face Hub或者通过其他方式已把模型下载则可省略 import os os.environ[HF_ENDPOINT] https://hf-mirror.com os.environ[CUDA_VISIBLE_DEVICES] 2 image_to_text pipeline(image-to-text, modelnlpconnect/vit-gpt2-image-captioning)然后调用实例进行预测并将结果打印outputimage_to_text(./parrots.png) print(output)结果图像中的文本[{generated_text: two birds are standing next to each other}]图片文本转文本作为可视化语言模型vision language models,VLMs的一种图片文本转文本Image-text-to-text是一个接受图像和文本输入的语言模型。该模型可以解决从视觉问答到图像分割等不同的任务它与image-to-text有一些相似之处如图像描述生成Image captioning但image-to-text模型仅接受图像输入提取图像中的文字信息而Image-text-to-text接受开放式的文本和图像输入是更通用的模型。在本节中我们简要概述VLMs并展示了如何将它们与transformer一起使用来进行推理。首先有多种类型的VLMs可选用于微调的基础模型用于会话的调整好的对话模型指令微调模型首先通过 实例化Pipeline指定任务image-text-to-text并传入llava-hf/llava-interleave-qwen-0.5b-hf模型from transformers import pipeline pipe pipeline(image-text-to-text, modelllava-hf/llava-interleave-qwen-0.5b-hf)下面使用聊天模板格式化文本输入作为案例messages [ { role: user, content: [ { type: image, image: https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg, }, {type: text, text: Describe this image.}, ], }, { role: assistant, content: [ {type: text, text: Theres a pink flower}, ], }, ]将格式化的文本和图像传给Pipeline并设置参数’return_full_textFalse表示要从生成的输出中删除输入。outputs pipe(textmessages, max_new_tokens20, return_full_textFalse) outputs[0][generated_text]结果# with a yellow center in the foreground. The flower is surrounded by red and white flowers with green stems如果需要也可以单独加载图像并将它们传给pipeline如下所示pipe pipeline(image-text-to-text, modelHuggingFaceTB/SmolVLM-256M-Instruct) img_urls [ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/cats.png, https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg, ] images [ Image.open(requests.get(img_urls[0], streamTrue).raw), Image.open(requests.get(img_urls[1], streamTrue).raw), ] messages [ { role: user, content: [ {type: image}, {type: image}, {type: text, text: What do you see in these images?}, ], } ] outputs pipe(textmessages, imagesimages, max_new_tokens50, return_full_textFalse) outputs[0][generated_text]结果 In the first image, there are two cats sitting on a plant. In the second image, there are flowers with a pinkish hue.此时图像仍然会被包含在输出的input_text字段中outputs[0][input_text]结果[{role: user, content: [{type: image, image: PIL.PngImagePlugin.PngImageFile image modeRGBA size622x412}, {type: image, image: PIL.JpegImagePlugin.JpegImageFile image modeRGB size5184x3456}, {type: text, text: What do you see in these images?}]}]蒙版生成蒙版生成Mask generation是一个为图像生成语义上有意义的蒙版任务。该任务与“图像分割”非常相似但存在许多不同之处。“图像分割”模型在标记过的数据集上进行训练且仅限于在训练期间看到的分类并返回给定图像的一组掩码和相应的分类。掩码生成模型在大量数据上进行训练并在两种模式下运行。提示模式该模式下模型输入接受一张图像和一组提示提示是图像中物体或者物体周围的边界框的平面坐标直角坐标。在提示模式下模型只返回提示所指向的对象的掩码。分割模式在给定一个图像可以分割任意的内容模型生成图像中的每个遮罩。为此生成一个点网格并覆盖在图像上进行推理。掩码生成任务由SAMSegment Anything Model] 提供支持。它是一个由一个基于视觉转换器的图像编码器、一个提示编码器和一个双向转换掩码解码器组成的功能强大的模型。图像和提示被编码解码器接受这些嵌入并生成有效的掩码。小提示SAMSegment Anything Model是一个强大的分割基础模型拥有很大的数据覆盖。它是在一个拥有100万张图像和11亿个掩模的数据集[SA-1B]上训练的。首先我们通过实例化Pipeline并在实例化时指定mask-generation任务和预训练模型facebook/sam-vit-base。from transformers import pipeline checkpoint facebook/sam-vit-base mask_generator pipeline(modelcheckpoint, taskmask-generation)然后准备一张图片from PIL import Image import requests img_url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg image Image.open(requests.get(img_url, streamTrue).raw).convert(RGB)在分割模式下设置参数points-per-batch可以启用并行对图像点进行推理这样可以实现更快的推理但会消耗更多的内存。此外SAM只支持对点而不是图像进行批处理。pred_iou_thresh是IoU置信度阈值其中只返回高于该阈值的掩码。masks mask_generator(image, points_per_batch128, pred_iou_thresh0.88)输出结果{masks: [array([[False, False, False, ..., True, True, True], [False, False, False, ..., True, True, True], [False, False, False, ..., True, True, True], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]]), array([[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., scores: tensor([0.9972, 0.9917, ..., }如果愿意可以使用以下代码可视化import matplotlib.pyplot as plt plt.imshow(image, cmapgray) for i, mask in enumerate(masks[masks]): plt.imshow(mask, cmapviridis, alpha0.1, vmin0, vmax1) plt.axis(off) plt.show()