首页 文章 精选 留言 我的

精选列表

搜索[face],共1291篇文章
优秀的个人博客,低调大师

基于 Hugging Face Datasets 和 Transformers 的图像相似性搜索

基于 HuggingFace Datasets 和 Transformers 的图像相似性搜索 通过本文,你将学习使用 🤗 Transformers 构建图像相似性搜索系统。找出查询图像和潜在候选图像之间的相似性是信息检索系统的一个重要用例,例如反向图像搜索 (即找出查询图像的原图)。此类系统试图解答的问题是,给定一个 查询 图像和一组 候选 图像,找出候选图像中哪些图像与查询图像最相似。 我们将使用 🤗 datasets 库,因为它无缝支持并行处理,这在构建系统时会派上用场。 尽管这篇文章使用了基于 ViT 的模型 (nateraw/vit-base-beans) 和特定的 (Beans) 数据集,但它可以扩展到其他支持视觉模态的模型,也可以扩展到其他图像数据集。你可以尝试的一些著名模型有: Swin Transformer ConvNeXT RegNet 此外,文章中介绍的方法也有可能扩展到其他模态。 要研究完整的图像相似度系统,你可以参考 这个 Colab Notebook。 我们如何定义相似性? 要构建这个系统,我们首先需要定义我们想要如何计算两个图像之间的相似度。一种广泛流行的做法是先计算给定图像的稠密表征 (即嵌入 (embedding)),然后使用 余弦相似性度量 (cosine similarity metric) 来确定两幅图像的相似程度。 在本文中,我们将使用 “嵌入” 来表示向量空间中的图像。它为我们提供了一种将图像从高维像素空间 (例如 224 × 224 × 3) 有意义地压缩到一个低得多的维度 (例如 768) 的好方法。这样做的主要优点是减少了后续步骤中的计算时间。 计算嵌入 为了计算图像的嵌入,我们需要使用一个视觉模型,该模型知道如何在向量空间中表示输入图像。这种类型的模型通常也称为图像编码器 (image encoder)。 我们利用 AutoModel 类来加载模型。它为我们提供了一个接口,可以从 HuggingFace Hub 加载任何兼容的模型 checkpoint。除了模型,我们还会加载与模型关联的处理器 (processor) 以进行数据预处理。 from transformers import AutoFeatureExtractor, AutoModel model_ckpt = "nateraw/vit-base-beans" extractor = AutoFeatureExtractor.from_pretrained (model_ckpt) model = AutoModel.from_pretrained (model_ckpt) 本例中使用的 checkpoint 是一个在 beans 数据集 上微调过的 ViT 模型。 这里可能你会问一些问题: Q1: 为什么我们不使用 AutoModelForImageClassification? 这是因为我们想要获得图像的稠密表征,而 AutoModelForImageClassification 只能输出离散类别。 Q2: 为什么使用这个特定的 checkpoint? 如前所述,我们使用特定的数据集来构建系统。因此,与其使用通用模型 (例如 在 ImageNet-1k 数据集上训练的模型),不如使用使用已针对所用数据集微调过的模型。这样,模型能更好地理解输入图像。 注意 你还可以使用通过自监督预训练获得的 checkpoint, 不必得由有监督学习训练而得。事实上,如果预训练得当,自监督模型可以 获得 令人印象深刻的检索性能。 现在我们有了一个用于计算嵌入的模型,我们需要一些候选图像来被查询。 加载候选图像数据集 后面,我们会构建将候选图像映射到哈希值的哈希表。在查询时,我们会使用到这些哈希表,详细讨论的讨论稍后进行。现在,我们先使用 beans 数据集 中的训练集来获取一组候选图像。 from datasets import load_dataset dataset = load_dataset ("beans") 以下展示了训练集中的一个样本: 该数据集的三个 features 如下: dataset ["train"].features >>> {'image_file_path': Value (dtype='string', id=None), 'image': Image (decode=True, id=None), 'labels': ClassLabel (names=['angular_leaf_spot', 'bean_rust', 'healthy'], id=None)} 为了使图像相似性系统可演示,系统的总体运行时间需要比较短,因此我们这里只使用候选图像数据集中的 100 张图像。 num_samples = 100 seed = 42 candidate_subset = dataset ["train"].shuffle (seed=seed).select (range (num_samples)) 寻找相似图片的过程 下图展示了获取相似图像的基本过程。 稍微拆解一下上图,我们分为 4 步走: 从候选图像 (candidate_subset) 中提取嵌入,将它们存储在一个矩阵中。 获取查询图像并提取其嵌入。 遍历嵌入矩阵 (步骤 1 中得到的) 并计算查询嵌入和当前候选嵌入之间的相似度得分。我们通常维护一个类似字典的映射,来维护候选图像的 ID 与相似性分数之间的对应关系。 根据相似度得分进行排序并返回相应的图像 ID。最后,使用这些 ID 来获取候选图像。 我们可以编写一个简单的工具函数用于计算嵌入并使用 map() 方法将其作用于候选图像数据集的每张图像,以有效地计算嵌入。 import torch def extract_embeddings (model: torch.nn.Module): """Utility to compute embeddings.""" device = model.device def pp (batch): images = batch ["image"] # `transformation_chain` is a compostion of preprocessing # transformations we apply to the input images to prepare them # for the model. For more details, check out the accompanying Colab Notebook. image_batch_transformed = torch.stack ( [transformation_chain (image) for image in images] ) new_batch = {"pixel_values": image_batch_transformed.to (device)} with torch.no_grad (): embeddings = model (**new_batch).last_hidden_state [:, 0].cpu () return {"embeddings": embeddings} return pp 我们可以像这样映射 extract_embeddings(): device = "cuda" if torch.cuda.is_available () else "cpu" extract_fn = extract_embeddings (model.to (device)) candidate_subset_emb = candidate_subset.map (extract_fn, batched=True, batch_size=batch_size) 接下来,为方便起见,我们创建一个候选图像 ID 的列表。 candidate_ids = [] for id in tqdm (range (len (candidate_subset_emb))): label = candidate_subset_emb [id]["labels"] # Create a unique indentifier. entry = str (id) + "_" + str (label) candidate_ids.append (entry) 我们用包含所有候选图像的嵌入矩阵来计算与查询图像的相似度分数。我们之前已经计算了候选图像嵌入,在这里我们只是将它们集中到一个矩阵中。 all_candidate_embeddings = np.array (candidate_subset_emb ["embeddings"]) all_candidate_embeddings = torch.from_numpy (all_candidate_embeddings) 我们将使用 余弦相似度 来计算两个嵌入向量之间的相似度分数。然后,我们用它来获取给定查询图像的相似候选图像。 def compute_scores (emb_one, emb_two): """Computes cosine similarity between two vectors.""" scores = torch.nn.functional.cosine_similarity (emb_one, emb_two) return scores.numpy ().tolist () def fetch_similar (image, top_k=5): """Fetches the`top_k`similar images with`image`as the query.""" # Prepare the input query image for embedding computation. image_transformed = transformation_chain (image).unsqueeze (0) new_batch = {"pixel_values": image_transformed.to (device)} # Comute the embedding. with torch.no_grad (): query_embeddings = model (**new_batch).last_hidden_state [:, 0].cpu () # Compute similarity scores with all the candidate images at one go. # We also create a mapping between the candidate image identifiers # and their similarity scores with the query image. sim_scores = compute_scores (all_candidate_embeddings, query_embeddings) similarity_mapping = dict (zip (candidate_ids, sim_scores)) # Sort the mapping dictionary and return `top_k` candidates. similarity_mapping_sorted = dict ( sorted (similarity_mapping.items (), key=lambda x: x [1], reverse=True) ) id_entries = list (similarity_mapping_sorted.keys ())[:top_k] ids = list (map (lambda x: int (x.split ("_")[0]), id_entries)) labels = list (map (lambda x: int (x.split ("_")[-1]), id_entries)) return ids, labels 执行查询 经过以上准备,我们可以进行相似性搜索了。我们从 beans 数据集的测试集中选取一张查询图像来搜索: test_idx = np.random.choice (len (dataset ["test"])) test_sample = dataset ["test"][test_idx]["image"] test_label = dataset ["test"][test_idx]["labels"] sim_ids, sim_labels = fetch_similar (test_sample) print (f"Query label: {test_label}") print (f"Top 5 candidate labels: {sim_labels}") 结果为: Query label: 0 Top 5 candidate labels: [0, 0, 0, 0, 0] 看起来我们的系统得到了一组正确的相似图像。将结果可视化,如下: 进一步扩展与结论 现在,我们有了一个可用的图像相似度系统。但实际系统需要处理比这多得多的候选图像。考虑到这一点,我们目前的程序有不少缺点: 如果我们按原样存储嵌入,内存需求会迅速增加,尤其是在处理数百万张候选图像时。在我们的例子中嵌入是 768 维,这即使对大规模系统而言可能也是相对比较高的维度。 高维的嵌入对检索部分涉及的后续计算有直接影响。 如果我们能以某种方式降低嵌入的维度而不影响它们的意义,我们仍然可以在速度和检索质量之间保持良好的折衷。本文 附带的 Colab Notebook 实现并演示了如何通过随机投影 (random projection) 和位置敏感哈希 (locality-sensitive hashing,LSH) 这两种方法来取得折衷。 🤗 Datasets 提供与 FAISS 的直接集成,进一步简化了构建相似性系统的过程。假设你已经提取了候选图像的嵌入 (beans 数据集) 并把他们存储在称为 embedding 的 feature 中。你现在可以轻松地使用 dataset 的 add_faiss_index() 方法来构建稠密索引: dataset_with_embeddings.add_faiss_index (column="embeddings") 建立索引后,可以使用 dataset_with_embeddings 模块的 get_nearest_examples() 方法为给定查询嵌入检索最近邻: scores, retrieved_examples = dataset_with_embeddings.get_nearest_examples ( "embeddings", qi_embedding, k=top_k ) 该方法返回检索分数及其对应的图像。要了解更多信息,你可以查看 官方文档 和 这个 notebook。 在本文中,我们快速入门并构建了一个图像相似度系统。如果你觉得这篇文章很有趣,我们强烈建议你基于我们讨论的概念继续构建你的系统,这样你就可以更加熟悉内部工作原理。 还想了解更多吗?以下是一些可能对你有用的其他资源: Faiss: 高效相似性搜索库 ScaNN: 高效向量相似性搜索 在移动应用程序中集成图像搜索引擎 英文原文: https://hf.co/blog/image-similarity 译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。 审校、排版: zhongdongy (阿东)

优秀的个人博客,低调大师

Hugging Face 创始人 Thomas Wolf 对工作和 AI 关系的思考

https://thomwolf.substack.com/p/what-jobs-are-made-of 工作的本质 ---- 判断力、主体性,以及 AI 评测指标的局限性 Thomas Wolf 2025年12月22日 十五年前,也就是 2010 年的冬天,我正处于博士阶段的最后冲刺期,开始探索学术界以外的世界。我记得在一个创纪录严寒的巴黎冬日,参加完一场研发岗位的面试后乘车返回。到处都是积雪,我坐在寒冷的区域通勤火车上,感到既失望又有些困惑。 我熟悉该行业研发团队使用的大部分工具,并有信心能轻松学会剩下的部分。然而,这似乎并不够,面试官一直告诉我,他们正在寻找“更有经验”的人。 当时,我并不真正理解这句话的含义。相比我能展示的具体知识,他们更看重工作年限,这让我感到极度不公。在我二十出头的时候,“经验”听起来更像是一个模糊的借口,用来拒绝像我这样既有明确能力又渴望学习的申请者。 这种久违的感觉最近又回来困扰我了。 看到近期关于初级岗位招聘萎缩的数据(尤其是软件开发领域),我不禁想起了当年的自己。 斯坦福大学在 2025 年夏季进行的一项分析显示,在 AI 暴露程度最高的职业中,22-25 岁的员工就业人数在 2022 年底至 2025 年中期下降了约 6%。而在同一时期,这些职业中资深员工的就业人数却增加了约 6-9%。 在这个图表上,转折点清晰可见。 无论是因为相关性还是因果关系,2022 年秋季标志着 ChatGPT 的发布——那是公众发现 AI 模型真实能力的时刻,也是 AI 性能竞赛真正点燃的时刻。这场竞赛最初由 OpenAI 和 Anthropic 驱动,随后 Google 以及 xAI、阿里巴巴 (Qwen)、DeepSeek、Mistral 等越来越多的公司也加入了第一梯队。 在过去的三年里,AI 评测指标(Benchmarks)的进步令人惊叹。像 Claude Opus 4.5 这样的模型现在能在 SWE-bench上解决约 75% 的真实世界编程任务;Gemini 3 和 GPT 5 在科学奥林匹克竞赛中达到了金牌水平⁴。与此同时,ChatGPT 的周活跃用户已接近 10 亿⁵。 从许多技术指标来看,AI 的能力和普及率都以惊人的速度增长,往往预示着它已达到行业专家或人类专家的水平。 然而,尽管拿了奖牌、尽管初级招聘在下降,宏观经济的表现却显得平淡得多。 在全球和行业层面,AI 的影响依然有限,对 GDP 的拉动作用微乎其微。近期有说法称,在那些光鲜的公告背后,许多(如果不是大多数)生成式 AI 的试点项目都未能为公司产生持续的价值⁷。此外,在一些模拟真实环境的测试中——例如评估 AI Agent 在真实兼职项目上表现的“远程劳动指数”(Remote Labor Index),即使是目前最强大的系统(如 ManusAI),成功率也仅为 2.5% 左右。 模型在评测指标上展示的能力,似乎很难与组织内部正在发生的情况相调和。 对于这种“理论与实践”之间的差距,通常有几种解释:一种是组织惯性,大公司反应慢,遗留系统混乱,部署困难;另一种可能性是,我们还没跨过正确的能力阈值。也许在与人类智能相比的 AGI 定义和量化尝试中,拿到接近 60% 的分数还是不够的。 这些因素可能都发挥了作用。但它们往往倾向于将“工作”仅仅视为一种“任务执行”。 这种定义在我看来是不完整的。在实践中,一份工作很少只是待执行任务的列表,一个同事也极少能被简化为一捆技术技能的集合。 作为一名初创公司创始人,我有近 50% 的时间花在公司不同阶段的招聘上,这可能是我人生中教训最深的部分。其中一个教训是:在面对大多数申请者和岗位时,我倾向于寻找三种品质的结合: 🌟执行力或技术技能:正确完成任务、掌握相关工具和方法的能力。 🌟常识或判断力:理解任务为什么重要,以及任务如何适应更广泛的目标、公司价值观、文化和方向。 🌟主体性(Agency)或品味:预判下一步该做什么,该提议什么,不该做什么,什么时候改变方向;有时,理解为什么彻底停止任务才是最佳决策。 执行力和技术知识在评测指标中相对容易观察、测试和衡量。一旦给定任务,核心就是解决它。 判断力和主体性则极难评估。它们往往在非稳态或非衡平的情况下才显现价值——当问题定义不明确、优先级发生转移,或者正确的做法是质疑任务本身时。这通常是优秀的团队成员开始脱颖而出的地方,也日益成为当今企业所处的常态。 通过这个视角,我终于理解了我 2010 年的那场面试。 我的面试官不仅在评估我是否会使用他们的工具和方法,他们还在隐性地评估:一旦问题不再被清晰定义时,我会如何表现。 这种对“劳动者”的定义,解释了为什么初级职位首先受到冲击。职业生涯早期的角色传统上更侧重于执行。随着时间的推移,随着人们经验的增长,他们的贡献往往会转向判断力和主体性:定义问题、选择工作内容以及应对模糊性。 AI 系统在“执行”方面的进步远快于其他维度。结果是,执行层的成本变得更低、更薄,从而不成比例地影响了初级岗位的招聘。 从长期来看,这是令人担忧的。判断力和主体性部分源于天赋,但更多时候是在执行密集型的工作经验中习得的。如果入门层流失太快,将会削弱产生未来资深人才的培养管道。 同样的框架也有助于理解为什么 AI 的经济影响依然有限,以及自动化更长周期、更广泛任务所面临的挑战。 AI 能力的限制因素通常不是孤立生成文本或代码的能力,而是难以兼顾大局:将指令适应公司/团队范围的语境、解读模糊的需求、排列优先级、进行基于常识的权衡,以及决定什么才是重要的,甚至决定何时停止任务。 执行力显然很重要。但它几乎从来不是工作的全部。或者,正如 Cursor 的 Ryo Lu 最近写的,执行并不是我们曾经认为的工作中最重要的部分: ----Ryo Lu (@ ryolu_ ) 传统的团队扩张方式已经过时了: ----我们过去习惯于聘请专家——设计师、工程师、产品经理——各司其职,通过增加人手来扩大规模。但当 Cursor 能让你在几分钟内将想法变成代码时,执行力就不再是瓶颈了。品味和判断力才是。 挑战在于,判断力和主体性要难衡量得多。通常,它们只有在更广泛的、非静态的背景下才有意义,这解释了为什么它们在评测指标中受到的关注较少。 然而,它们通常是一个员工在组织中创造价值的核心。如果我们想真正理解 AI 的经济潜力,我们最终需要超越技术执行的评估方式,去反映真实工作中跨团队和纵向协作的本质,并承认:极少有工作是仅仅在一个完全静态的环境中遵循一套预设的固定规则。 AI 时代最终可能会让判断力、品味和主体性占据更高的权重——而这些恰恰是工作中最难量化、最难评测、也最难被取代的部分。 回过头看,AI 评测性能与经济影响之间的这种差距,对于 20 岁时的我来说,其实是有一种似曾相识的熟悉感的。 来源:https://weibo.com/2194035935/QjH4Fh95o

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册