Segment Anything Model(SAM)论文解读

在这里插入图片描述

一、引言

在这项工作中,作者的目标是建立一个图像分割的基础模型。也就是说,寻求开发一个提示模型,并使用一个能够实现强大泛化的任务在广泛的数据集上对其进行预训练。有了这个模型,使用即时工程解决新数据分布上的一系列下游分割问题。
该计划的成功取决于三个组成部分:任务、模型和数据。为了开发它们,作者解决了以下关于图像分割的问题:
1、什么任务可以实现zero-shot泛化?
2、相应的模型体系结构是什么?
3、哪些数据可以为这项任务和模型提供支持?
这些问题纠缠在一起,需要综合解决。作者首先定义了一个提示的分割任务,它足够通用,可以提供一个强大的预训练目标,并支持广泛的下游应用程序。此任务需要一个支持灵活提示的模型,并且可以在提示时实时输出分段掩码以允许交互使用。为了训练模型,需要一个多样化的、大规模的数据源。不幸的是,没有网络规模的数据来源的分割;为了解决这个问题,作者构建了一个“数据引擎”,也就是说,在使用高效模型来协助数据收集和使用新收集的数据来改进模型之间进行迭代。
**任务:**在NLP和最近的计算机视觉中,基础模型是一个很有前途的发展,它可以通过使用“提示”技术对新的数据集和任务执行zero-shot和few-shot学习。受这一行工作的启发,作者提出了提示分割任务,其目标是给定任何分割提示返回有效的分割掩码(见图1a)。提示符只是指定图像中要分割的内容,例如,提示符可以包括识别对象的空间或文本信息。即使提示是模糊的,并且可能引用多个对象(例如,衬衫上的一个点可能表示衬衫或穿着它的人),输出也应该是这些对象中至少一个对象的合理掩码。使用提示分割任务作为预训练目标,并通过提示工程解决一般的下游分割任务。
**模型:**可提示的分割任务和实际使用的目标对模型体系结构施加了约束。特别是,模型必须支持灵活的提示、需要实时计算掩码,以实现交互式使用。
而且必须具有模糊感知能力。令人惊讶的是,作者发现一个简单的设计满足所有三个约束:一个强大的图像编码器计算图像嵌入,一个提示编码器嵌入提示,然后将两个信息源组合在一个轻量级的掩码解码器中,该解码器预测分割掩码。作者将此模型称为分段任意模型(Segment Anything model,简称SAM)(见图1b)。通过将SAM分为图像编码器和快速提示编码器/掩码解码器,可以使用不同的提示重复使用相同的图像嵌入(并平摊其成本)。给定图像嵌入,提示编码器和掩码解码器在50ms内从web浏览器中的提示预测掩码。将重点放在点、框和掩码提示上,并使用自由格式的文本提示来呈现初始结果。为了使SAM能够感知歧义,将其设计为预测单个提示的多个掩码,从而允许SAM自然地处理歧义,例如衬衫与人的例子。

**数据引擎:**为了实现对新数据分布的强泛化,有必要在一个大而多样的掩码集上训练SAM,而不仅仅是已经存在的任何分割数据集。虽然基础模型的典型方法是在线获取数据,但掩模并不自然丰富,因此需要一种替代策略。作者的解决方案是建立一个“数据引擎”,也就是说,与模型在循环数据集注释共同开发模型(见图1c)。数据引擎有三个阶段:辅助手动、半自动和全自动。在第一阶段,SAM帮助注释者注释掩码,类似于经典的交互式分段设置。在第二阶段,SAM可以通过提示可能的对象位置来自动为对象子集生成掩码,而注释器则专注于注释剩余的对象,从而帮助增加掩码的多样性。在最后阶段,用前景点的规则网格提示SAM,平均每张图像产生100个高质量掩模。
在这里插入图片描述

**数据集:**最终数据集SA-1B包括来自11M张授权和隐私保护图像的超过1B个掩码(见上图)。SA-1B是使用数据引擎的最后阶段完全自动收集的,比任何现有的分割数据集都多400个掩码,并且经过验证,掩码具有高质量和多样性。除了将SA-1B用于训练SAM具有鲁棒性和通用性之外,作者希望SA-1B成为旨在建立新基础模型的研究的宝贵资源。
实验: 作者广泛评估SAM。首先,使用23个不同的新分割数据集,发现SAM从单个前景点产生高质量的掩模,通常仅略低于手动注释的真值。其次,在zero-shot传输协议下使用即时工程的各种下游任务上发现了一致的强定量和定性结果,包括边缘检测,目标提案生成,实例分割以及文本到掩码预测的初步探索。这些结果表明,SAM可以使用开箱即用的快速工程来解决涉及SAM训练数据之外的对象和图像分布的各种任务

二、Segment Anything Task

作者从NLP中获得灵感,其中令牌预测下一个任务用于基础模型预训练,并通过提示工程解决各种下游任务。为了建立分割的基础模型,作者的目标是定义一个具有类似功能的任务。
任务首先将提示的概念从NLP翻译到分割,其中提示可以是一组前景/背景点,一个粗略的框或蒙版,自由格式的文本,或者一般情况下,任何指示图像中要分割的信息。因此,提示分段任务是在给定任何提示的情况下返回一个有效的分段掩码。“有效”掩码的要求仅仅意味着,即使提示是模糊的,并且可以引用多个对象(例如,回想一下衬衫与人的例子,参见下图),输出也应该是这些对象中至少一个的合理掩码。这个需求类似于期望语言模型对不明确的提示输出一致的响应。之所以选择这个任务,是因为它带来了一种自然的预训练算法和一种通过提示将zero-shot转移到下游分割任务的通用方法。
在这里插入图片描述
预训练提示分割任务提出了一种自然的预训练算法,该算法为每个训练样本模拟一系列提示(例如,点、框、掩码),并将模型的掩码预测与基本事实进行比较。从交互式分割中采用了这种方法,尽管与交互式分割不同,交互式分割的目的是在足够的用户输入后最终预测一个有效的掩码,但作者的目标是始终预测任何提示的有效掩码,即使提示是模糊的。这确保了预训练模型在涉及歧义的用例中是有效的,包括数据引擎所要求的自动注释。在这个任务中表现良好是具有挑战性的,需要专门的建模和训练损失选择。
Zero-shot转移直观地说,预训练任务赋予了模型在推理时对任何提示作出适当响应的能力,因此下游任务可以通过设计适当的提示来解决。例如,如果有一个猫的边界框检测器,猫实例分割可以通过提供检测器的框输出作为提示给模型来解决。一般来说,许多实际的分割任务都可以作为提示。
相关的任务分割是一个很广阔的领域,有交互式分割、边缘检测、超像素化、目标建议生成、前景分割、语义分割、实例分割、全视分割等。提示分割任务的目标是产生一个功能广泛的模型,可以通过快速工程适应许多(尽管不是全部)现有的和新的分割任务。这种能力是任务泛化的一种形式。请注意,这与之前在多任务分割系统上的工作不同。在多任务系统中,单个模型执行一组固定的任务,例如联合语义分割、实例分割和全视分割,但训练和测试任务是相同的。本文是训练用于提示分割的模型可以作为更大系统中的组件在推理时间执行新的不同任务,例如,执行实例分割,提示分割模型与现有的对象检测器相结合。

三、Segment Anything Model

SAM有三个组件,如下图所示:一个图像编码器,一个灵活的提示编码器和一个快速掩码解码器。建立在Transformer视觉模型的基础上,对(平摊)实时性能进行了特定的权衡。在这里插入图片描述
图像编码器 在可扩展性和强大的预训练方法的激励下,使用了MAE预训练的视觉变压器(ViT),以最小程度适应处理高分辨率输入。图像编码器每个图像运行一次,可以在提示模型之前应用。
提示编码器考虑两组提示:稀疏(点、框、文本)和密集(掩码)。通过位置编码来表示点和框,并对每个提示类型和使用CLIP的现成文本编码器的自由格式文本进行学习嵌入求和。密集提示(即掩码)使用卷积嵌入,并在图像嵌入中按元素求和。
掩膜解码器 掩膜解码器有效地将图像嵌入、提示嵌入和输出令牌映射到掩码。该设计采用了对Transformer解码器块的修改,然后是动态掩码预测头。改进的解码器块在两个方向上使用提示自注意和交叉注意(提示到图像嵌入,再由嵌入到图像)来更新所有嵌入。在运行两个块之后,对图像嵌入进行上采样,MLP将输出标记映射到动态线性分类器,然后该分类器计算每个图像位置的掩码前景概率。
解决歧义对于一个输出,如果给出一个模糊的提示,该模型将平均多个有效掩码。为了解决这个问题,修改了模型,以预测单个提示符的多个输出掩码(见下图)。3个掩码输出足以解决大多数常见情况(嵌套掩码通常最多有三个深度:整体、部分和子部分)。在训练中,为了对掩码进行排序,该模型预测每个掩码的置信度得分(即估计的IoU)。

在这里插入图片描述
效率 整个模型的设计很大程度上是出于效率的考虑。给定预先计算的图像嵌入,提示编码器和掩码解码器在网络浏览器中运行,在CPU上,大约50ms。这种运行时性能使模型能够无缝、实时地交互提示。
损失和训练 使用的focal loss和dice loss的线性组合来监督掩模预测。使用几何提示的混合来训练可提示的分割任务。

四、 Segment Anything Data Engine

由于互联网上的分割掩码并不丰富,作者建立了一个数据引擎来收集1.1亿掩码数据集SA-1B。数据引擎有三个阶段:(1)模型辅助的手动注释阶段(2)混合了自动预测掩码和模型辅助注释的半自动阶段,以及(3)模型在没有注释器输入的情况下生成掩码的全自动阶段。
辅助手动阶段在第一阶段,类似于经典的交互式分割,一组专业注释人员通过使用SAM提供的基于浏览器的交互式分割工具点击前景/背景对象点来标记mask。mask可以使用像素级“画笔”和“橡皮擦”工具进行细化。模型辅助注释直接在浏览器中实时运行(使用预先计算的图像嵌入),从而实现真正的交互式体验。作者没有对标记对象施加语义约束,注释器可以自由地标记“东西”和“事物”。作者建议注释器标记他们可以命名或描述的对象,但没有收集这些名称或描述。注释者被要求按照突出的顺序标记对象,并被鼓励在mask注释超过30秒后继续下一张图像。
在这个阶段开始时,SAM是使用公共分割数据集进行训练的。在充分的数据注释之后,仅使用新注释的掩码对SAM进行再训练。随着更多掩模的收集,图像编码器从ViT-B扩展到ViT-H,其他架构细节也在发展;作者总共对模型进行了6次训练。随着模型的改进,每个掩码的平均注释时间从34秒减少到14秒。14秒比COCO的掩码注释快6.5倍,仅比使用极值点的边界框标记慢2倍。随着SAM的改进,每张图像的平均掩模数量从20个增加到44个。总的来说,在这个阶段从120k张图像中收集了430万个mask。
半自动阶段 在这个阶段,作者的目标是增加mask的多样性,以提高模型分割任何东西的能力。为了将注释器集中在不太突出的对象上,首先自动检测到自信的掩码。然后,向注释器展示了预先填充了这些掩码的图像,并要求他们注释任何其他未注释的对象。为了检测有信心的掩码,使用通用的“对象”类别在所有第一阶段掩码上训练了一个边界框检测器。在此阶段,在180k张图像中额外收集了590万个掩模(总共1020万个掩膜)。与第一阶段一样,定期根据新收集的数据对模型进行再训练(5次)。每个掩码的平均注释时间回到了34秒(不包括自动掩码),因为这些对象更难标记。每张图像的平均mask数量从44个增加到72个(包括自动mask)。
全自动阶段 在最后阶段,注释是完全自动的。这是可行的,因为模型有两个主要的增强。首先,在这个阶段开始时,作者收集了足够的mask来大大改进模型,包括前一阶段的各种mask。其次,到了这个阶段,已经开发了模糊感知模型,它能够预测有效的掩码,即使在模糊的情况下也是如此。具体来说,用32×32的规则网格提示模型,并为每个点预测一组可能对应于有效对象的掩码。使用模糊感知模型,如果一个点位于部分或子部分上,模型将返回子部分、部分和整个对象。模型的IoU预测模块用于选择置信掩码;此外,只识别并选择了稳定的掩码(如果在0.5−δ和0.5+δ处对概率图进行阈值处理会导致类似的掩码,则认为掩码是稳定的)。最后,在选择了置信和稳定的掩码后,应用非最大抑制(NMS)来过滤重复。为了进一步提高较小mask的质量,还处理了多个重叠的放大图像裁剪。

五、网络结构细节:

图像编码器 通常,图像编码器可以是输出C×H×W图像嵌入块的任何网络。受可扩展性和强大的预训练的启发,作者使用MAE预训练的视觉transformer(ViT),具有最小的适应能力来处理高分辨率输入,特别是具有14×14窗口注意力和四个等距全局注意力块的ViT-H/16。图像编码器的输出是输入图像的16倍缩小的嵌入。由于运行时目标是实时处理每个提示,因此可以提供大量的图像编码器FLOP,因为每个图像只计算一次FLOP,而不是每个提示。
根据标准实践,使用1024×1024的输入分辨率,该分辨率是通过重新缩放图像并填充短边获得的。因此,图像嵌入是64×64。为了降低通道维度,使用1×1卷积来获得256个通道,然后使用3×3卷积来获得同样的256个通道。每个卷积后面都有一个层归一化。

提示编码器 稀疏提示被映射到256维矢量嵌入。一个点被表示为该点的位置的位置编码和指示该点是在前景中还是在背景中的两个学习嵌入之一的总和。方框由嵌入对表示:(1)其左上角的位置编码与表示“左上角”的学习嵌入相加;(2)相同的结构,但使用表示“右下角”的习得嵌入。最后,为了表示自由形式的文本,使用CLIP中的文本编码器(通常可以使用任何文本编码器)。密集提示(即掩码)与图像具有空间对应关系。以比输入图像低4倍的分辨率输入掩码,然后使用两个分别具有输出通道4和16的2×2,跨步-2卷积来缩小另外的4倍。最后的1×1卷积将通道维度映射到256。每一层通过GELU激活和层标准化进行分离。然后将掩码逐元素添加图像嵌入。如果没有掩码提示,则向每个图像嵌入位置添加表示“无掩码”的学习嵌入。

轻量级掩码解码器 该模块有效地将图像嵌入和一组提示嵌入映射到输出掩码。为了组合这些输入,从Transformer分割模型中获得灵感,并修改了标准Transformer解码器。在应用解码器之前,首先在提示嵌入集中插入一个学习的输出令牌嵌入,该嵌入将在解码器的输出中使用。为了简单起见,我们将这些嵌入(不包括图像嵌入)统称为“令牌”

在这里插入图片描述

我们的解码器设计如上图所示。每个解码器层执行4个步骤:(1)对令牌的自注意力(2)从令牌(作为查询)到图像嵌入的交叉注意力(3)逐点MLP更新每个令牌,以及(4)从图像嵌入(作为查询的)到令牌的交叉关注。最后一步使用提示信息更新图像嵌入。在交叉关注期间,图像嵌入被视为642个256维向量的集合。每个自/交叉注意力和MLP在训练时都有残差连接、层归一化和dropout。下一解码器层从上一层获取更新的令牌和更新的图像嵌入。使用两层解码器。
为了确保解码器能够访问关键的几何信息,每当位置编码参与注意力层时,都会将其添加到图像嵌入中。此外,当整个原始提示标记(包括它们的位置编码)参与注意力层时,它们都会被重新添加到更新的标记中。这允许强烈依赖提示标记的几何位置和类型。
在运行解码器之后,用两个转置卷积将更新的图像嵌入上采样4×(现在它相对于输入图像缩小了4倍)。然后,令牌再次参与图像嵌入,并且将更新的输出令牌嵌入传递给小的3层MLP,该MLP输出与放大图像嵌入的通道维度匹配的向量。最后,预测了在放大图像嵌入和MLP的输出之间具有空间逐点乘积的掩模。转换器使用256的嵌入尺寸。转换器MLP块具有2048的大尺寸,但MLP仅应用于相对较少(很少大于20)的提示令牌。然而,在具有64×64图像嵌入的交叉关注层中,为了提高计算效率,将查询、键和值的通道维度降低了2×至128。所有注意力层使用8个头。用于升级输出图像嵌入的转置卷积是2×2,步长2,输出通道尺寸为64和32,并且具有GELU激活。它们通过层规范化来分隔。
Making the model ambiguity-aware 如上所述,单个输入提示可能是模糊的,因为它对应于多个有效掩码,并且模型将学习在这些掩码上求平均值。作者通过一个简单的修改来消除这个问题:使用少量输出令牌并同时预测多个掩码,而不是预测单个掩码。默认情况下,预测三个掩码,因为作者观察到三个层(整体、部分和子部分)通常足以描述嵌套掩码。在训练过程中,计算真值和每个预测掩码之间的损失,但仅从最低损失进行反向传播。这是一种常见的技术,用于具有多个输出的模型。为了在应用程序中使用,希望对预测掩码进行排序,因此我们添加了一个小头(对额外的输出令牌进行操作),用于估计每个预测掩码与其覆盖的对象之间的IoU。
多个提示的歧义要少得多,三个输出掩码通常会变得相似。为了最大限度地减少训练中退化损失的计算,并确保单个无模糊掩码接收规则梯度信号,只在给出多个提示时预测单个掩码。这是通过添加用于附加掩码预测的第四输出令牌来实现的。第四个掩码从不为单个提示返回,也是为多个提示返回的唯一掩码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos docker实现nacos高可用集群项目

目录 Nacos是什么? Nacos在公司里的运用是什么? 使用docker构建nacos容器高可用集群 实验规划图:​编辑 1、拉取nacos镜像 2、创建docker网桥(实现集群内的机器的互联互通(所有的nacos和mysql)&#x…

环境变量与Path环境变量

“环境变量”和“path环境变量”其实是两个东西,这一点大家一定要区分开,不要混为一谈。 “环境变量”是操作系统工作环境设置的一些选项或属性参数。每个环境变量由变量名和文件路径组成的,可以设置很多个环境变量。 我们一般使用环境变量…

冒泡排序、选择排序、插入排序、希尔排序

冒泡排序 基本思想 代码实现 # 冒泡排序 def bubble_sort(arr):length len(arr) - 1for i in range(length):flag Truefor j in range(length - i):if arr[j] > arr[j 1]:temp arr[j]arr[j] arr[j 1]arr[j 1] tempflag Falseprint(f第{i 1}趟的排序结果为&#…

正规好用的电脑端抽奖软件有哪些?

这几个软件都是本人反复用过、反复比较的,且都超过5年。 1. 518抽奖软件 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽…

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

岩土工程安全监测利器:振弦采集仪的发展

岩土工程安全监测利器:振弦采集仪的发展 岩土工程安全监测是保障建筑物、地下工程和地质环境安全稳定运行的重要手段。传统上,监测手段主要依靠人工巡视以及基础设施安装的传感器,但是这些方法都存在着缺陷。人工巡视存在的问题是数据采集精…

Linux驱动【day2】

mychrdev.c: #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include<linux/uaccess.h> #include<linux/io.h> #include"head.h" unsigned int major; // 保存主设备号 char kbuf[128]{0}; unsigned int…

【linux基础(五)】Linux中的开发工具(上)---yum和vim

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

4、Nginx 配置实例-反向代理

文章目录 4、nginx 配置实例-反向代理4.1 反向代理实例一4.1.1 实验代码 4.3 反向代理实例二4.3.1 实验代码 【尚硅谷】尚硅谷Nginx教程由浅入深 志不强者智不达&#xff1b;言不信者行不果。 4、nginx 配置实例-反向代理 4.1 反向代理实例一 实现效果&#xff1a;使用 nginx…

窗口函数-分组排序:row_number()、rank() 、dense_rank()、ntile()

窗口函数语法结构&#xff1a; 分析函数() over(partition by 分组列名 order by 排序列名 rows between 开始位置 and 结束位置) 开窗函数和聚合函数区别&#xff1a; 聚合函数会对一组值进行计算并返回一个值&#xff0c;常见的比如sum()&#xff0c;count()&#xff0c;ma…

Python入门学习13(面向对象)

一、类的定义和使用 类的使用语法&#xff1a; 创建类对象的语法&#xff1a; ​​​​​​​ class Student:name None #学生的名字age None #学生的年龄def say_hi(self):print(f"Hi大家好&#xff0c;我是{self.name}")stu Student() stu.name &q…

FFMPEG视频压缩与Python使用方法

一、简介 FFMPEG 是一个完整的&#xff0c;跨平台的解决方案&#xff0c;记录&#xff0c;转换和流音频和视频。 官网&#xff1a;https://ffmpeg.org/ 二、安装 1、Linux&#xff1a; sudo apt install ffmpeg 2、Mac: brew install ffmpeg 3、Windows: 下载文件&#…

基于googlenet网络的动物种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................. % 获取输入层的尺寸 Inp…

Pytorch Advanced(一) Generative Adversarial Networks

生成对抗神经网络GAN&#xff0c;发挥神经网络的想象力&#xff0c;可以说是十分厉害了 参考 1、AI作家 2、将模糊图变清晰(去雨&#xff0c;去雾&#xff0c;去抖动&#xff0c;去马赛克等)&#xff0c;这需要AI具有“想象力”&#xff0c;能脑补情节&#xff1b; 3、进行数…

centos 下 Makefile 独立模块编译ko

1、安装编译内核环境包 编译需要用到kernel 源码&#xff0c;centos 下需先安装 kernel-devel 包&#xff0c;要下与自己kernel 对应版本 yum install kernel-devel 2、首先从内核或自己写的模块&#xff0c;发到编译环境中 注&#xff1a;就像我自己拷贝一个 bcache 驱动的目…

从零开始在树莓派上搭建WordPress博客网站并实现公网访问

文章目录 序幕概述1. 安装 PHP2. 安装MySQL数据库3. 安装 Wordpress4. 设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 5. WordPress configuration6. 将WordPress站点发布到公网安装相对URL插件修改config.php配置 7. 支持好友链接样式8. 定制主题 序幕 …

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现LSSVM时间序列预测未来(最小二乘支持向量机)&#xff1b; 2.运行环境Mat…

LabVIEW更改Tab所选标签的颜色

LabVIEW更改Tab所选标签的颜色 在开发过程中&#xff0c;有时会出现要将不同tab页设置不同颜色的情况。此VI允许编程方式更改前面板选项卡控件上选项卡的颜色。它是突出显示所选选项卡的理想选择 在某些应用程序中&#xff0c;用户希望在按下时突出显示选项卡控件。此VI使用事…

借助ChatGPT使用Pandas实现Excel数据汇总

一、问题的提出 现在有如下一个Excel表&#xff1a; 上述Excel表中8万多条数据&#xff0c;记录的都是三年以来花菜类的销量&#xff0c;现在要求按月汇总实现统计每个月花菜类的销量总和&#xff0c;如果使用Python的话要给出代码。 二、问题的解决 1.首先可以用透视表的方…

idea配置git(gitee)并提交(commit)推送(push)

Intellij Idea VCS | 版本控制 - 知乎 IDEA项目上传到gitee仓库_idea上传代码到gitee_robin19712的博客-CSDN博客 git程序下载国内镜像地址&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/v2.42.0.windows.2/ 解压后放到固定路径&#xff1a…