当前位置: 首页 > news >正文

使用CLIP模型进行零样本图像分类的分步指南

零样本学习允许AI系统对未明确训练过的类别进行图像分类,标志着计算机视觉和机器学习的重大进步。本文将介绍使用CLIP实现零样本图像分类的详细分步指南,从环境设置到最终的图像处理和分类。我们首先介绍零样本学习的概念及其在现代AI应用中的重要性。然后深入探讨CLIP模型的概述,解释其架构以及其强大的跨模态学习能力背后的原理。最后用一个实际的实现样例来介绍,设置工作环境、加载CLIP模型和处理器以及准备图像进行分类的基本步骤。

1、零样本图像分类简介

零样本图像分类是一涉及使用未经明确训练的特定类别的模型将图像分类到不同的类别中的任务。模型的任务是预测图像所属的类别。

当只有少量标记数据,或者想要快速将图像分类整合到应用程序中时,这很有用。我们可以使用预先存在的预训练模型,而不是训练自定义模型。这些模型通常是多模态的,并且已经在大量的图像和描述数据集上进行了训练,它们可以用于许多不同的任务。

我们只需要给模型一些关于它没有见过的类别的额外信息(这被称为辅助信息,可以是描述或属性),模型就能够预测未见到的分类,零样本分类是迁移学习的一个子领域。

零样本图像分类任务包括在推理时根据自己的标签对图像进行分类。例如,可以传递一个标签列表,如飞机、汽车、狗、鸟,以及您想要分类的图像。模型将选择最可能的标签。

对比语言-图像预训练(CLIP)是零样本分类最流行的模型之一。它可以根据图像的常见对象或特征对图像进行分类,不需要为每个新用例进行微调。

2、CLIP模型概述

CLIP是一个从自然语言监督中学习视觉概念的神经网络。它在图像和文本对上进行训练,学会预测与给定图像相对应的文本。然后它可以用于新图像的零样本分类。

CLIP具有灵活性,可以应用于各种视觉分类基准。它不需要针对基准的性能进行优化,并且在表示学习评估中使用线性探针时,已经显示出最先进的性能和分布鲁棒性。它在表示学习评估中使用线性探针时优于现有模型,如ImageNet。

该网络由一个图像编码器和一个文本编码器组成,它们被联合训练以预测正确的配对。在训练过程中,图像和文本编码器被训练以最大化真实配对的图像和文本嵌入的余弦相似度,同时最小化不正确配对的余弦相似度。

CyCLIP是一个建立在CLIP基础上的框架,它形式化了一致性。它优化学习到的表示,使其在图像和文本空间中在几何上保持一致,并且已经被证明可以提高CLIP的性能。

3、设置环境

我们从设置工作环境开始。首先下载本文中将使用的包。

 !pip install transformers  !pip install torch

4、加载模型和处理器

我们需要两个主要组件来构建零样本图像分类:模型处理器。让我们首先从Transformers加载CLIP模型。要加载模型,我们将使用

from_pretrained

方法,并传递此特定任务的正确检查点。

 model = CLIPModel.from_pretrained(  "./models/openai/clip-vit-large-patch14")  

然后使用Hugging Face的Transformers库为clip模型加载一个预训练的处理器

 from transformers import AutoProcessor  processor = AutoProcessor.from_pretrained(  "./models/openai/clip-vit-large-patch14")

5、加载和显示图像

为了加载图像,我们将使用PIL库并导入Image类。使用

Image.open

加载图像,并指定图像的路径。

 from PIL import Image  image = Image.open("./occupiers.png")  image

6、定义标签和输入

创建标签。我们可以使用"占领者的照片"作为第一个标签,"猫的照片"作为第二个标签。

 labels = ["a photo of a occupiers", "a photo of a cats"]

然后创建模型的输入。这里将使用处理器。我们需要传递文本(即标签)和图像。

 inputs = processor(text=labels,  images=image,  return_tensors="pt",  padding=True)

7、处理和分类图像

我们将上面的预处理内容输入模型

 outputs = model(**inputs)  

结果如下:

 CLIPOutput(loss=None, logits_per_image=tensor([[21.8763, 9.7856]], grad_fn=<TBackward0>), logits_per_text=tensor([[21.8763],[ 9.7856]], grad_fn=<MulBackward0>), text_embeds=tensor([[-2.9747e-03, 2.6380e-03, 3.2704e-04, …, -1.7559e-02,-7.0350e-05, 3.6619e-03],[-1.9645e-02, 2.0558e-02, 2.9485e-02, …, 3.1643e-02,1.4714e-02, 6.7246e-03]], grad_fn=<DivBackward0>), image_embeds=tensor([[ 5.7789e-03, -4.3962e-02, -3.9901e-03, 5.6101e-02, 6.3676e-03,2.9096e-02, 2.6953e-02, 4.0592e-02, -8.4450e-06, 5.8055e-03,-1.4274e-02, -3.1642e-02, 2.4113e-02, -2.4111e-02, -1.1296e-02,9.6764e-03, 1.0219e-02, 8.4689e-03, 3.4425e-02, 1.2221e-02,2.7957e-02, 3.0495e-02, 1.3093e-02, 1.7346e-02, 5.5131e-03,-2.7130e-02, -5.8669e-02, -2.7784e-02, -4.0745e-02, -3.3350e-02,-2.0706e-02, 2.8432e-02, 5.9084e-03, 5.6609e-03, -9.2576e-03,1.0789e-02, 2.0793e-02, -4.7598e-03, 2.2963e-02, -3.3255e-02,-1.6315e-02, -2.4104e-02, 1.5616e-02, 3.3750e-02, -2.6935e-02,8.7083e-03, 2.1546e-03, -3.3888e-02, 4.7085e-02, -3.9901e-03,-1.2575e-02, -5.2894e-02, 3.6603e-02, -7.6685e-03, 2.7837e-02,3.0959e-02, 2.0127e-02, -2.4038e-02, -2.8744e-02, -1.4038e-02,1.5173e-02, 1.8799e-02, -2.9608e-03, -2.2345e-02, 4.7702e-02,-1.4433e-02, 1.4635e-02, 3.1230e-02, 5.9901e-02, -1.3265e-03,7.6162e-03, 1.2988e-02, 5.5220e-03, 1.4117e-02, -1.4327e-02,2.1601e-03, -1.1008e-02, -3.7867e-02, 1.6744e-02, 1.1719e-02,1.8613e-02, 3.0909e-02, 3.1654e-02, 2.1501e-02, 7.9533e-03,1.0662e-02, -1.1237e-02, -4.3277e-02, 2.6244e-02, 1.2052e-02,4.5038e-02, -2.9739e-02, -1.0173e-02, -6.4970e-03, -4.3230e-03,5.1218e-03, -3.4656e-02, -6.2149e-02, 8.0739e-03, 4.5069e-02,-1.3734e-02, -1.9803e-02, 1.0912e-03, -5.1993e-02, -2.2205e-02,1.8498e-02, -2.1908e-02, -4.6194e-03, 3.1051e-04, -3.7240e-03,1.7533e-02, 1.6989e-02, -4.8901e-02, 1.3751e-02, 6.9713e-03,2.8202e-02, 2.1325e-02, -3.6354e-02, -7.1071e-02, -2.9884e-02,-2.0108e-03, -3.9210e-02, 1.8043e-02, 2.5318e-02, 2.7652e-02,-1.6892e-02, -2.4670e-02, -5.6512e-03, -1.4796e-02, 9.8687e-03,-1.7640e-02, 8.6374e-02, 7.8690e-03, 7.9550e-04, -4.2292e-02,9.5068e-02, 5.3002e-03, 7.0152e-03, -1.5667e-02, -2.9754e-02,1.6179e-02, 4.1414e-02, -3.3988e-02, -6.1861e-02, -4.3325e-03,2.5685e-04, 4.3989e-03, -5.8877e-03, 1.1796e-02, 1.5167e-02,-5.2949e-02, 2.1775e-02, 2.7675e-02, 2.2198e-02, 1.7648e-02,-3.4697e-02, 7.0108e-03, 5.2061e-02, -1.1802e-02, 1.5102e-02,-1.4692e-02, -5.4631e-03, -2.1430e-02, -9.3270e-04, 2.9920e-02,-2.4192e-02, -2.3823e-02, 9.7590e-03, 7.7101e-03, 1.7580e-03,3.9310e-03, -9.8752e-03, -8.6602e-03, 4.7450e-02, 2.0988e-02,3.0213e-02, -1.6734e-02, -1.8952e-01, -6.4087e-02, 3.9655e-02,4.8678e-02, 1.7897e-03, 6.5058e-03, 3.5143e-02, -3.7138e-02,8.1137e-03, -3.1982e-02, -7.0958e-03, 6.4963e-03, 1.4733e-02,4.0858e-03, -1.5045e-02, 5.5016e-03, -1.3627e-02, -3.6162e-03,-1.3287e-02, -6.2757e-02, -1.3430e-03, -2.7292e-05, 6.0769e-04,1.2674e-02, 8.1904e-03, 8.9082e-03, 1.9957e-02, 3.8102e-03,3.6519e-03, -4.4056e-02, -1.5661e-02, -9.5863e-03, -2.4219e-03,8.5753e-03, 1.6604e-02, -2.0069e-02, -4.6871e-02, 2.4206e-02,-4.8668e-03, 1.1664e-02, -6.8940e-03, -1.3681e-02, 1.6395e-02,9.4232e-03, -3.0263e-02, 3.2366e-03, 4.0138e-02, -6.1738e-03,-3.2676e-02, -1.8601e-02, 1.7904e-02, -1.3817e-02, -1.8048e-02,5.5864e-03, 1.0975e-02, -1.4123e-02, -3.0170e-02, 3.3311e-02,4.9997e-03, -1.0391e-02, 3.1777e-03, 1.9882e-02, 6.2273e-03,-3.2720e-02, -4.0859e-02, 1.5610e-02, -1.6431e-02, -3.8654e-03,8.7215e-02, -3.3904e-02, 6.1722e-03, -3.5134e-02, -1.6150e-02,1.4944e-02, -2.3586e-02, -1.0361e-02, 3.7658e-03, -3.6290e-02,-8.9540e-03, -1.3771e-02, -6.8122e-03, 3.0026e-03, -4.5137e-02,6.4355e-03, -3.3159e-03, -1.5333e-02, 3.4441e-02, -1.5725e-02,1.1518e-02, -5.9313e-03, 4.2979e-02, 2.8261e-02, 4.7787e-03,3.1031e-02, 1.7139e-03, 1.6778e-02, 2.6897e-04, -2.6202e-02,5.4559e-02, 7.4263e-04, -4.5143e-03, 1.2781e-03, 1.4802e-02,-3.7519e-03, 3.3716e-02, -2.1538e-02, -1.0190e-02, -5.5602e-02,-2.2949e-02, -1.6017e-02, -2.0295e-02, -6.1467e-03, -4.1679e-02,-3.3808e-02, -1.5946e-02, 1.2528e-02, -1.7425e-03, 1.0002e-02,1.3999e-03, -2.1473e-02, 2.9041e-02, 8.1162e-03, -3.6859e-03,-2.8920e-02, -1.9641e-02, 4.9203e-02, 1.1021e-02, -1.3119e-02,1.9755e-02, -3.8844e-02, -1.1669e-02, 3.3912e-02, 1.3763e-02,-3.5422e-02, 2.3399e-03, -4.5410e-02, -5.0237e-02, -1.2711e-02,6.7663e-03, -3.8081e-02, -4.7378e-02, 9.1057e-03, 9.7086e-03,1.8040e-02, -1.2091e-02, 1.0468e-02, -1.0993e-02, 8.1390e-04,-1.5350e-02, -5.2436e-02, -2.2084e-02, 5.2573e-03, -4.9846e-02,3.6649e-03, -1.9814e-03, -3.5178e-02, 3.8680e-04, 1.6706e-03,1.8115e-02, 1.4849e-03, 8.6505e-03, -2.5120e-02, 3.9394e-02,-9.8747e-03, 2.3633e-02, -3.0123e-02, -9.2278e-03, 2.5567e-02,-7.3859e-03, -1.4000e-02, 2.2307e-02, -2.9660e-02, 2.5312e-03,1.6757e-02, -1.2032e-02, -6.9583e-03, -2.8649e-02, 9.3962e-03,-6.9555e-02, -2.1766e-02, -1.2629e-02, -3.7239e-02, -3.6394e-02,-1.8847e-02, 3.1566e-02, -4.9777e-02, -4.2465e-03, -2.7758e-02,3.7707e-04, 8.1679e-02, -1.7641e-02, -9.5395e-03, -7.5895e-04,-3.7009e-02, 1.7522e-03, -8.6521e-03, -3.1135e-02, 1.1772e-02,2.9063e-02, 3.0317e-03, 2.3242e-02, 4.1135e-03, 2.4706e-03,1.9642e-02, 4.5938e-03, -2.0781e-02, -2.3492e-02, -2.0666e-02,5.8963e-02, 4.1321e-02, 1.2015e-02, -1.2244e-02, -3.4152e-02,

得到了一个非常大的输出,但我们感兴趣的是每个图像的logits。为了获得概率,需要将这些logits传入softmax层。通过对每个logit的输出调用softmax来获得概率。

 outputs.logits_per_image

tensor([[21.8763, 9.7856]], grad_fn=)

这样就获取logits的softmax,并取第一个元素,现在我们有了看起来像概率的东西。第一个元素是图像确实是占领者照片的概率,第二个是照片是猫照片的概率。

 probs = outputs.logits_per_image.softmax(dim=1)[0]  probs

tensor([9.9999e-01, 5.6118e-06], grad_fn=)

最后,我们可以看到,对于标签"占领者的照片",概率几乎是100%,而对于第二个标签,概率接近于零

 probs = list(probs)  for i in range(len(labels)):  print(f"label: {labels[i]} - probability of {probs[i].item():.4f}")

label: a photo of occupiers — probability of 1.0000 label: a photo of a cats — probability of 0.0000

总结

本文详细介绍了如何使用CLIP模型实现零样本图像分类。零样本学习是计算机视觉领域的一项重大进展,它使AI系统能够对未经明确训练的类别进行分类。我们首先解释零样本学习和CLIP模型的基本概念,然后提供实际实现的详细步骤指南。

主要内容包括:环境设置、CLIP模型和处理器的加载、图像准备、自定义标签定义、模型输入构建,以及分类结果的处理和解释。我们重点强调了CLIP模型的灵活性和强大的跨模态学习能力,这使其能在各种视觉分类任务中表现卓越。

最后我们通过一个具体示例,演示如何使用CLIP模型对图像进行分类,并详细解释如何解读模型输出的概率。无论您是零样本学习的新手,还是寻找在实际项目中实现CLIP的参考,本文都能为你提供有价值的信息和指导。

https://avoid.overfit.cn/post/b88b5ce03e304aee87997c31ac80dc92

作者:Youssef Hosni

相关文章:

使用CLIP模型进行零样本图像分类的分步指南

零样本学习允许AI系统对未明确训练过的类别进行图像分类,标志着计算机视觉和机器学习的重大进步。本文将介绍使用CLIP实现零样本图像分类的详细分步指南,从环境设置到最终的图像处理和分类。我们首先介绍零样本学习的概念及其在现代AI应用中的重要性。然后深入探讨CLIP模型的概…...

Llama 3.1用了1.6万个英伟达H100 GPU,耗费......

目录 Llama 3.1发布简介 Llama 3.1模型规模与训练 大模型企业发展面临的问题与困境 算力和能耗算力方面 数据和资金方面 技术和人才方面 Llama 3.1发布简介 当地时间 2024年 7月 23号&#xff0c;Meta 公司发布了迄今为止最强大的开源 AI 模型 Llama 3.1。该模型不仅规模…...

学习c语言第24天(练习)

编程题 第一题 最大公约数最小公倍数求和 //求最大公约数和最小公倍数之和 //暴力求解 //int main() //{ // int n 0; // int m 0; // while (scanf("%d %d", &n, &m)2) // { // int min n < m ? n : m; // int max n > m ? n : m; //…...

【微信小程序开发】——奶茶点餐小程序的制作(一)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

鱼眼相机去畸变和矫正

基于smart3D计算完空三进行导出opt文件 xx.opt文件,类似于xml文件 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <OpticalProperties version="1.0"><Id>0</Id><Name>201空三任务_1_…...

Llama 3.1论文中文对照翻译

The Llama 3 Herd of Models 模型群 Llama 3 Llama Team, Al Meta 1 {}^{1} 1 Llama 团队&#xff0c;Meta Al 1 {}^{1} 1 1 {}^{1} 1 A detailed contributor list can be found in the appendix of this paper. 1 {}^{1} 1 详细的贡献者名单可在本文附录中找到。 Mod…...

Vue js-cookie的使用存储token操作

在Vue项目中使用js-cookie库存储token可以按照下面的步骤进行操作&#xff1a; 首先&#xff0c;安装js-cookie库&#xff0c;可以使用npm安装&#xff0c;命令为&#xff1a; npm install js-cookie 然后&#xff0c;在需要存储token的组件中引入js-cookie库&#xff1a; imp…...

C到C++——C++基础

C是一种通用的、静态类型的、跨平台的编程语言。它是在1979年由Bjarne Stroustrup创建的&#xff0c;最初是作为C语言的扩展来支持面向对象编程。 C在保留C语言的特性的同时&#xff0c;添加了许多其他的功能&#xff0c;包括类、对象、继承、多态、模板等。这使得C成为了一种…...

trie算法

1、定义 高效的存储和查找字符串集合的数据结构 它的优点是&#xff1a;利用字符串的公共前缀来减少查询时间&#xff0c;最大限度地减少无谓的字符串比较&#xff0c;查询效率比哈希树高 2、构建 我们可以使用数组来模拟实现Trie树。 我们设计一个二维数组 son[N] [26] 来…...

Kubernetes之pod的基本概念

目录 什么是pod 启动一个pod 说明 Pod 和控制器 Pod 模板 Pod 更新与替换 资源共享和通信 Pod 中的存储 Pod 联网 Pod 安全设置 什么是pod Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod&#xff08;就像豌豆荚中&#xff09;是一组&#…...

PostgreSQL的学习心得和知识总结(一百五十)|[performance]更好地处理冗余 IS [NOT] NULL 限定符

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…...

sqllabs游戏

文章目录 总体思路&#xff1a;less-1:less-2:less-3:less-4:less-5:less-6:less-7:less-8:布尔盲注less-9:时间盲注less-21:less-24: 总体思路&#xff1a; 1、第一件事情 逃脱出单引号的控制 闭合单引号 2、单双引号需要成对出现 在python php Java中 3、2个办法 继续把多出…...

React Native Firebase:移动应用后端集成

React Native Firebase 是一个强大的库&#xff0c;它允许你在 React Native 应用中集成 Firebase 后端服务。Firebase 提供了一系列的服务&#xff0c;包括实时数据库、身份验证、云存储、云消息推送等&#xff0c;这些服务可以帮助你构建功能丰富、可扩展的移动应用。 安装和…...

趣味算法------开灯问题

题目描述 有 n 盏灯&#xff0c;编号为 1~n&#xff0c;第 1 个人把所有灯打开&#xff0c;第 2 个人按下所有编号为 2 的倍数的开关&#xff08;这些灯将被关掉&#xff09;&#xff0c;第 3 个人按下所有编号为 3 的倍数的开关&#xff08;其中关掉的灯将被打开&#xff0c;…...

如何长生?重要的是对内求索!

文章目录 1. 世界上没有仙丹2. 长生只能对内求索 1. 世界上没有仙丹 小说中的九转大还丹&#xff0c;修仙中的仙丹&#xff0c;蟠桃是不存在的。这是理所当然的废话。但是世界上总有很多广告词&#xff0c;用老山参、野生、纯天然&#xff0c;补肾、补肝等词来形容自己的产品&…...

SD-WAN解决方案

联通国际公司企业SD-WAN解决方案 产品介绍 随着数字化转型的加速推进&#xff0c;企业对网络连接的需求也在不断提高。联通国际公司推出的SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;解决方案&#xff0c;旨在为企业提供更…...

什么是C++的引用,请举例说明

C中的引用&#xff08;Reference&#xff09;是C语言的一个特性&#xff0c;它允许一个变量&#xff08;称为引用变量&#xff09;成为另一个变量&#xff08;被引用的变量&#xff09;的别名。这意味着&#xff0c;对引用变量的任何操作都会直接反映在被引用的变量上&#xff…...

大数据_SQL_5min访问达到100次的用户

某公司网站每日访问量达到10亿级别的访问量&#xff0c; 每次访问记录一条数据&#xff0c;数据包含如下字段&#xff1a;用户ID&#xff0c;访问时间&#xff08;毫秒级&#xff09;&#xff0c;访问页面。 要求使用hive求出所有在5分钟内访问次数达到100次的用户&#xff08;…...

Python PDF文本处理技巧 - 查找和高亮文字

目录 使用工具 Python在PDF中查找和高亮文字并统计出现次数和页码 Python在PDF的特定页面区域中查找和高亮文字 Python使用正则表达式在PDF中查找和高亮文字 Python在PDF中查找文字并获取它的坐标位置 其他查找条件设置 在日常工作和学习中&#xff0c;我们常常需要处理各…...

虚幻引擎 C++ 实现平面阴影

1、平面阴影介绍 平面阴影是一种相对简单的渲染阴影的方式&#xff0c;可以理解为对一个模型渲染两次&#xff0c;一次是渲染模型本身&#xff0c;另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染&#xff0c;可以理解为渲染了一个“压扁”…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...