CLIP论文中关键信息记录
由于clip论文过长,一直无法完整的阅读该论文,故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的(提出背景、训练数据、设计模式、训练超参数、prompt的作用),clip的能力(clip的模型版本、clip的泛化能力)。
提出背景
1、text-to-text的训练方式彻底改变了NLP,其倡导使用任务不相干的数据训练模型,是的模型在计算量、数据规模、模型精度上不断提升。大数据下训练的模型具备极强的zero-shot能力
2、ImageNet是图像领域的基础大数据,其表明在大规模数据集训练后模型具备极强可扩展能力。NLP也可以采用这种模式进行研究
3、目前使用自然语言监督进行图像表示学习仍然很少,该类方法的精度远低于若干年前的计算机视觉方法
训练数据
构建了一个新的数据集,其中包括4亿对(图像,文本),这些数据集从互联网上的各种公开来源中收集起来。为了尽可能广泛地覆盖一组视觉概念,我们搜索(图像、文本)对作为构建过程的一部分,其文本包含50万个查询中的一个。我们大概通过每个查询包含多达20,000对(图像、文本)来平衡结果。所得到的数据集与用于训练GPT-2的WebText数据集具有相似的总字数。我们将这个数据集称为“智慧的网络图像文本”。
在论文附录的表9中提供了多个公开数据集的数量量与类别数,可以做一个额外知识了解一下。

clip模式设计的由来
现有的图像分类模型只能预测1000个ImageNet类时,从自然语言中学习一组开放的视觉概念的任务似乎很艰巨。在我们的努力过程中,我们发现训练效率是成功扩展自然语言监督的关键,因此我们基于这个指标选择了最终的训练方法。
论文最初的方法,类似于VirTex,从头开始联合训练了一个图像CNN和文本Transformer来预测一个图像的标题。这里可以表明基于Transformer 语义模型根据图片预测词汇效率不高然而,我们在有效地扩展这种方法时遇到了困难。在图2中,我们展示了一个6300万参数Transformer语言模型,它已经使用了其ResNet-50图像编码器的两倍计算,学习识别ImageNet类比一个更简单的基线预测相同文本的模型通用的图像分类模型慢三倍。
最终表明,基于对比度的学习效率是最高的。

CLIP方法与图像分类方法都有一个关键的相似之处。他们试图预测每张图片附带的文本的确切文字。这是一项困难的任务,因为有各种各样的描述、评论和相关的文本与图像共存。最近在图像的对比表示学习方面的工作发现,对比目标比其等效的预测目标可以学习更好的表示。们探索了训练一个系统来解决潜在的更容易的代理任务,即只预测哪个文本整体与哪个图像配对,而不是该文本的确切单词。从相同的单词袋编码基线开始,我们将预测目标替换为图2中的一个对比目标,并观察到转移到ImageNet的零镜头转移率的效率进一步提高了4倍。
clip的训练与使用流程
具体训练流程如下:
给定一批N(图像,文本)对,CLIP被训练来预测一批中可能发生的N×N(图像,文本)配对。CLIP将学习一个多模态编码空间通过联合训练图像编码器和文本编码器,以最大化批中N个实对的图像和文本嵌入的余弦相似度,同时最小化N2−N个错误对嵌入的余弦相似度。我们优化了这些相似性分数上的对称交叉熵损失。具体伪代码如下所示:

具体使用流程:
1、对图像组与词汇组进行编码(分别由图像编码器与图像编码器实现)
2、计算图片特征与词汇特征的相似度
3、

模型版本
clip一共有resnet、vit两个系列,其中5个resnet和3个视觉Transformer。对于ResNets,我们训练一个ResNet-50,一个ResNet-101,然后再训练3个ResNet,它们遵循高效的net式模型缩放,使用大约ResNet-50计算的4倍、16倍和64倍。它们分别记为RN50x4、RN50x16和RN50x64。对于视觉Transformer,我们训练了ViT-B/32、ViT-B/16和ViT-L/14。

基于论文中的图标,可以发现VIT系列的模型在同等gflop下,acc比ResNet模型高2~3个点,这里博主觉得ViT-B/16模型是性价比最好的。

论文中的图12也表明,与在ImageNet上预先训练的模型相比,CLIP的特性对任务转移更健壮。对于这两个数据集分割,在CLIP模型表示上训练的线性探针的迁移分数都高于其他具有类似ImageNet性能的模型。这表明,在ImageNet上训练的模型的表示在某种程度上过于适合它们的任务

在论文附录中,各模型版本在27个数据集上的zero-shot性能,可以发现分辨率从224提升到336后,模型精度提升比较明显。

训练超参数
这里可以发现clip训练时的batchsize是3w多,词汇表接近5w(这表明clip支持对5w多个词汇的编码),训练epoch为32。
我们训练了所有的模型32个epoch。我们使用Adam优化器(Kingma & Ba,2014)和解耦的权重衰减正则化(Loshchilov & Hutter,2017),应用于所有非增益或偏差的权重,并使用余弦调度来衰减学习率(Loshchilov & Hutter,2016)。初始超参数是在训练1个epoch,使用网格搜索,随机搜索和对基线ResNet-50模型进行手动调整的组合来设置的。然后,由于计算约束,超参数被启发式地适用于更大的模型。可学习温度参数τ初始化为(Wu et al.,2018)的0.07,并进行裁剪以防止缩放到100以上,我们发现这是防止训练不稳定性所必要的。我们使用一个非常大的小批量,32768。混合精度(Micikevicius et al.,2017)用于加速训练和保存记忆。为了节省额外的内存,梯度检查点(格里ewank&Walther,2000;陈等人,2016)、半精度Adam(Dhariwal等人,2020)和半精度的文本编码器权重。嵌入相似性的计算也被分割了,因为单个gpu只计算其局部批嵌入所需的成对相似性的子集。最大的ResNet型号,RN50x64,在592个V100gpu上训练花了18天,而最大的视觉Transformer在256个V100gpu上训练花了12天。对于ViT-L/14,我们还以更高的336像素分辨率进行了一个额外的epoch的预训练,以提高类似于FixRes的性能(Touvron等人,2019年)。我们将这个模型表示为ViT-L/14@336px。除非另有说明,本文中报告的“CLIP”结果都使用我们认为表现最好的模型。

prompt工程对训练的影响
大多数图像分类数据集都是以事后编码的方式对信息进行描述,只用标签的一个类别id来标注图像,并将类别id映射到特定的字符名称上事后编码。一些数据集,如Flowers102和GTSRB,在他们发布的版本中似乎根本没有包含这个类别映射,不利于零样本迁移。对于许多的数据集,我们观察到他们的标签选择有些随意,只依赖任务的标签编码进行迁移,而在训练中不考虑zero-shot转移相关的问题。图像数据集以map的决定了与自然语言的关联,没有考虑到类别信息的迁移性
一个常见的问题是ploysemy。当一个类的名称是提供给CLIP的文本编码器的唯一信息时,由于缺乏上下文,它无法区分这意味着哪个词的意义。在某些情况下,同一个单词的多个含义可能会作为不同的类包含在同一个数据集中。这发生在ImageNet中,它包括建筑起重机和飞行的起重机。另一个例子是在Oxford-IIIT宠物数据集的类别中,从上下文来看,boxer显然指的是一种狗,但缺乏上下文的文本编码器同样可能指一种运动员。图像数据集的信息标签与语境相关,存在多义词。如cranes、boxer
我们遇到的另一个问题是,在我们的训练前的数据集中,与图像配对的文本只是一个单词是相对罕见的。通常文本是一个完整的句子,以某种方式描述图像。为了帮助弥合这种分布差距,我们发现使用prompt模板“A photo of a {label}.”。作为一个帮助指定文本的默认值,是关于图像的内容。这通常可以提高在仅使用标签文本的基准之上的性能。例如,仅使用这个提示符就可以使ImageNet的准确率提高1.3%。通过prompt模板将label构造为完整的自然语言,将精度在ImageNet上的精度提升了1.3%
类似于关于GPT-3的“prompt engineering”讨论(Brown等人,2020年;Gao等人,2020年),我们还观察到,通过为每个任务定制提示文本,可以显著提高zero-shot性能。下面是几个非详尽的例子。我们在几个细粒度的图像分类数据集上发现,它有助于指定类别。例如,在Oxford-IIIT宠物上,使用“A photo of a {label}, a type of pet.” 为了帮助提供上下文,工作效果很好。同样,在食物101上指定一种食物,在FGVC飞机上一种飞机也有帮助。对于OCR数据集,我们发现在需要识别的文本或数字周围添加引号可以提高性能。最后,我们发现,在卫星图像分类数据集上,它有助于指定图像是这种形式的,我们使用了f “a satellite photo of a {label}.”. 通过更多的语义背景信息融入label的prompt模板,更有利于提升zero-shot性能。具体如类别背景、数据领域
我们还尝试了集成多个zero-shot分类器作为另一种提高性能的方法。这些分类器是通过使用不同的上下文提示来计算的,比如“A photo of a big {label}”和“A photo of a small {label}”。我们在嵌入空间而不是概率空间上构造集合。这允许我们缓存一组平均文本嵌入,以便当在许多预测上摊销时,集成的计算成本与使用单个分类器相同。我们已经观察到对许多生成的zero-shot分类器的集成,以可靠地提高性能,并将其用于大多数数据集。在ImageNet上,我们集成了80个不同的上下文提示,这比上面讨论的单个默认提示额外提高了3.5%的性能。综合考虑,快速工程和集成将ImageNet精度提高近5%。在图4中,我们可视化了与Li等人(2017)中所述的无上下文基线方法相比,快速工程和集成如何改变一组CLIP模型的性能。针对图像数据中的目标成像特性,对一个数据集生成差异化的prompt更有利于提升精度,如尺度信息、目标背景信息等,通过该手段集成了80个不同的上下文提示,将ImageNet精度提高近5%。

clip的泛化性

CLIP在27个数据集中,有16个获胜。查看单个数据集可以发现一些有趣的行为。在细粒度的分类任务上,我们观察到它在性能上的广泛分布。在其中两个数据集上,Stanford Cars和Food101,zero-shot CLIP在ResNet-50特性上的表现超过逻辑回归超过20%,而在flowers102和FGVC飞机上,zero-shot CLIP的表现落后超过10%。在Oxfordpets和Birdsnap上,表现更接近。我们怀疑这些差异主要是由于WIT和ImageNet之间每个任务监督数量不同。在“一般”对象分类数据集上,如ImageNet、CIFAR10/100、STL10和PascalVOC2007的性能相对相似,在所有情况下,zero-shot CLIP都有轻微的优势。在STL10上,CLIP总体上达到了99.3%,这似乎是一种新的技术状态,尽管没有使用任何训练示例。Zero-shot CLIP在两个测量视频动作识别的数据集上显著优于ResNet-50。在Kinetics700上,CLIP的性能比ResNet-50高出14.5%。Zero-shot CLIP在UCF101上的性能也比ResNet-50的功能高出7.7%。我们推测,这是由于自然语言与ImageNet中以名词为中心的宾语监督相比,为涉及动词的视觉概念提供了更广泛的监督。对于泛意义上的图像数据进行迁移zero-shot CLIP都能表现出较优的性能
zero-shot CLIP的表现局部明显不佳,我们看到,零镜头CLIP 在一些专门的、复杂的或抽象的任务,如卫星图像分类(EuroSAT和RESISC45),淋巴结肿瘤检测(PatchCamelyon),计数对象(CLEVRCounts),自动驾驶相关的任务,如德国交通标志识别(GTSRB),识别到最近的汽车的距离(KITTIDistance)。这些结果突出了零镜头CLIP 在更复杂的任务上的能力较差。相比之下,非专家的人类可以稳健地执行其中的一些任务,如计数、卫星图像分类和交通标志识别,这表明有很大的改进空间。然而,我们需要注意的是,目前还不清楚测量zero-shot转移,而不是少射击转移,是否能对学习者之前没有经验的困难任务进行有意义的评估,比如几乎所有人类的淋巴结肿瘤的淋巴结肿瘤分类。在专业领域的图像数据上进行迁移zero-shot CLIP都能表现出较优的性能
当将zero-shot性能与完全监督模型进行比较时,CLIP的任务学习能力,与少射击方法相比是一个更直接的比较,因为zero-shot是它的极限。在图6中,我们可视化了zero-shot CLIP与许多图像模型特征的对比,包括最佳公开的ImageNet模型、自监督学习方法和CLIP本身。虽然可以直观地期望零镜头低于one-shot,但我们发现zero-shot CLIP在相同特征空间上与4次逻辑回归后模型的性能。这可能是由于zero-shot和少射方法之间的重要区别。首先,CLIP的零镜头分类器是通过自然语言生成的,它允许视觉概念被直接指定(“沟通”)。

相比之下,“正常的”监督学习必须从训练的例子中间接地推断出概念。无上下文的基于示例的学习的缺点是,许多不同的假设可以与数据保持一致,特别是在一次性的情况下。单个图像通常包含许多不同的视觉概念。虽然一个有能力的学习者能够利用视觉线索和启发式,设定被演示的概念是图像中的主要对象,但这并不能是所有的图像都如此。当图像目标不是类别标签的主体是,监督学习的信息错误率更高,而prompt一定程度上降低信息错误率
zero-shot和少镜头性能之间的差异的一个潜在解决方案是使用CLIP的零镜头分类器作为少射击分类器的权重的先验。虽然对生成的权值添加L2惩罚是这个想法的一个简单实现,但我们发现超参数优化通常会选择这个正则化器的如此之大的值,以至于产生的少镜头分类器“只是”零镜头分类器。研究将zero-shot转移的强度与few-shot学习的灵活性相结合的更好的方法,是未来工作的一个很有前途的方向。基于zero-shot生产的few-shot模型利用了zero-shot先验,这使得研究者需要设置正则化来平衡先验与新数据适配
当在其他模型的特征上比较zero-shot CLIP和少镜头逻辑回归时,zero-shot CLIP大致与我们的评估套件中表现最好的16-shot分类器的性能相匹配,该套件使用了在ImageNet-21K上训练的BiT-M ResNet-152x2的特征。我们确信,在JFT-300M上训练的BiT-L模型会表现得更好,但这些模型还没有公开发布。BiT-M ResNet-152x2在16-shot设置中表现最好有些令人惊讶,因为正如第3.2节所分析的,在27个数据集上,Noisy Student EfficientNet-l2在完全监督设置中平均表现出近5%。
除了研究零镜头CLIP和少镜头逻辑回归的平均性能外,我们还检查了在单个数据集上的性能。在图7中,我们展示了在同一特征空间上的逻辑回归分类器需要匹配零镜头CLIP性能的每个类的标记示例数量的估计值。由于零镜头CLIP也是一个线性分类器,这估计了在这种设置下零镜头传输的有效数据效率。为了避免训练成千上万的线性分类器,我们基于1、2、4、8、16样本训练(如果可能的话)的性能和在每个数据集上训练一个完全监督的线性分类器来估计有效的数据效率。我们发现zero-shot转移对每个数据集的效率有很大的变化,从每个类少于1个标记的示例到184个。两个数据集,Flowers102 and EuroSAT表现不足的一次性模型。一半的数据集每个类需要的例子少于5个例子,中位数为5.4。然而,平均估计的数据效率是每个类的20.8个例子。这是由于在20%的数据集中,监督分类器需要每个类有许多标记的示例来匹配性能。在ImageNet上,零镜头CLIP与在相同特征空间上训练的16样本-shot线性分类器的性能相匹配。

如果我们假设评估数据集足够大,在它们上训练的线性分类器的参数可以很好地估计,那么,因为CLIP的零镜头分类器也是一个线性分类器,完全监督分类器的性能大致为零镜头传输设定了一个上界。在图8中,我们比较了CLIP的zero-shot性能与跨数据集的完全监督线性分类器。虚线,y = x线表示一个“最优”零镜头分类器,匹配其完全监督等价的性能。对于大多数数据集,zero-shot分类器的性能仍然比完全监督分类器低10%到25%,这表明在提高CLIP的任务学习和zero-shot转移能力方面仍有很大的净空间。

zero-shot性能与完全监督性能之间的正相关关系为0.82(p值<10−6),这表明CLIP在连接潜在的表征和任务学习与zero-shot转移方面是相对一致的。然而,零镜头CLIP只能在5个数据集上接近完全监督的性能: STL10, CIFAR10, Food101, OxfordPets, and Caltech101。在所有5个数据集上,zero-shot精度和完全监督精度均超过90%。这表明,对于那些高质量的任务,CLIP在zero-shot转移中可能更有效。预测zero-shot性能作为完全监督性能函数的预测的线性回归模型的斜率估计,完全监督性能每提高1%,zero-shot性能就会提高1.28%。然而,95百分位的置信区间仍然包括小于1(0.93-1.79)的值。
在过去的几年中,深度学习系统的实证研究已经证明,性能可以作为一个重要的量来预测的函数,如训练计算和数据集大小(Hestness等,2017;Kaplan等,2020年)。到目前为止,GPT系列的模型已经在1000倍的训练计算增长中证明了zero-shot性能的持续改进。在图9中,我们检查了CLIP的zero-shot性能是否遵循类似的缩放模式。我们绘制了对36个不同数据集的39个ResNet CLIP模型的平均错误率,发现在模型计算增加44倍时,CLIP存在类似的对数-对数线性缩放趋势。虽然总体趋势是平稳的,但我们发现,个人评估的表现可能要嘈杂得多。这是由于在子任务上的个体训练运行之间的高度差异(如D‘Amour等人(2020))掩盖了稳步改善的趋势,或者作为某些任务的计算函数,性能实际上是非单调的。

一个理想的鲁棒模型(虚线)在ImageNet分布和其他自然图像分布上表现得同样良好。零镜头CLIP模型将这种“鲁棒性差距”缩小了高达75%。对logit转换值的线性拟合显示与自举估计的95%置信区间。(右)可视化香蕉的分布转移,一个类在7个自然分布转移数据集中的5个中共享。将最佳零镜头CLIP模型ViT-L/14@336px的性能与在ImageNet验证集ResNet-101上具有相同性能的模型进行了比较

基于论文中表5的数据可以发现,在human分类任务中,zero-shot的clip模型比线性分类程序精度更高,同时也可以发现few-shot的clip相比于zero-shot精度提升并不明显。

相关文章:
CLIP论文中关键信息记录
由于clip论文过长,一直无法完整的阅读该论文,故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的(提出背景、训练数据、设计模式、训练超参数、prompt的作用),clip的能力(clip的模型版本、clip…...
sshj使用代理连接服务器
之前我是用jsch连接服务器的,但是没办法使用私钥连接,搜了一下似乎是不支持新版的SSH-rsa,并且jsch很久没更新了,java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…...
【Leetcode:1184. 公交站间的距离 + 模拟】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
VRRP 笔记
一、概念: vrrp:Virtual Router Redundancy Protocol 虚拟路由冗余协议,当网关发生故障时,进行主备切换,保证业务连续性 把多台物理机的网关虚拟成一台Virtual Router,称为 VRID VIP:虚拟IP VM…...
【洛谷】P3743 小鸟的设备 的题解
【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划,但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法:二分答案。 首先,如果一个设备在 t t t 的时间内消耗的…...
算法面经手撕系列(2)--手撕BatchNormlization
BatchNormlization BatchNormlization的编码流程: init阶段初始化 C i n C_in Cin大小的scale向量和shift向量,同时初始化相同大小的滑动均值向量和滑动标准差向量;forward时沿着非channel维度计算均值、有偏方差依据得到均值和有偏方差进…...
mysql-搭建主从复制
文章目录 1、准备主服务器2、准备从服务器3、主库配置3.1、创建MySQL主服务器配置文件: 4、从库配置5、搭建主从&测试5.1、使用命令行登录MySQL主服务器5.2、主机中查询master状态:5.3、从机中查询slave状态:5.4、主机中创建slave用户&am…...
MiniMaxi-共创智能新体验新手入门
新手快速入门 注册指南 个人用户 直接注册即可。 企业团队 主账号:注册时填写的姓名与手机号将成为企业账号的管理员。子账号:在用户中心创建,数量不限。 主账号与子账号权益 相同权益:子账号享有与主账号相同的使用权益和速…...
Docker torchserve 部署模型流程
1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…...
mybatis开启日志
步骤很详细,直接上教程 配置文件的文件格式可能有所不同,这里列举两种 配置方法 一. application.properties(默认 # 配置mybatis的日志信息 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl二. application.y…...
MobaXterm : Network error: Connection refused(连接被拒绝)
具体报错如下如所示: 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动(启用返回 enable) sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…...
电脑的主板,内存条插多少合适?
首先,不是插满4条内存就是最好的。 内存条插得多,确实可以扩充容量,提升性能。但是有些低端的主板配低端CPU,插满4条内存,稳定性下降。这里的稳定性包括供电,单独的内存供电容量等。此时CPU会通过降低内存…...
C++:初始化列表
构造函数在上一篇帖子我们提到了对成员变量初始化的功能,出了在构造函数的函数体中队成员变量一个一个赋值以外,我们还可以采用初始化列表。 #include<iostream> using namespace std;class AA { private:int a;const int b; public:AA():b(200),…...
[000-01-008].第05节:OpenFeign特性-重试机制
我的后端学习大纲 SpringCloud学习大纲 1.1.重试机制的默认值: 1.重试机制默认是关闭的,给了默认值 1.2.测试重试机制的默认值: 1.3.开启Retryer功能: 1.修改配置文件YML的配置: 2.新增配置类: packa…...
Android 11(API 级别 30)及以上版本中,将Bitmap保存到设备上
调用 saveBitmapToMediaStore(getContentResolver(),bitmap,“图片名”,mimeType); 参数解析: Bitmap myBitmap ...; // 这里应该是你获取或创建Bitmap的代码 private String mimeType "image/jpeg"; // 或者"image/png",取决于…...
django orm增删改查操作
1. 基本操作 1.1 创建对象 可以通过 Django ORM 来创建数据库中的记录。 示例: # 方法1:先创建对象,再保存 person Person(nameAlice, age30, emailaliceexample.com) person.save()# 方法2:直接创建 person Person.objects…...
禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)
目录 一、采用TS求解 TSP二、 旅行商问题2.1 实际例子:求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏(后续和其他算法进行对比) 三、 如何修改代码?3.1 减少城市坐标,如下&am…...
Rust 所有权 简介
文章目录 发现宝藏1. 所有权基本概念2. 所有权规则3. 变量作用域4. 栈与堆4.1 栈(Stack)4.2 堆(Heap) 5. String类型5.1 String 类型5.2 String 的内存分配5.3 所有权与内存管理5.4 String 与切片 6. 变量与数据交互方式6.1 移动&…...
linux-网络管理-防火墙配置
Linux 网络管理:防火墙配置 1. 防火墙概述 防火墙是保护计算机系统和网络免受未经授权访问和网络攻击的安全机制。Linux 系统中,防火墙通过控制进入和离开网络的数据包,实现网络流量的过滤和管理。 Linux 上的防火墙配置工具有多种&#x…...
【springboot】实现文件上传和下载
目录 1. 新建一个springboot项目2. 配置文件application.propertiesapplication.yml 3. 控制类实现文件上传和下载4. 测试 1. 新建一个springboot项目 新建一个springboot项目,选择web,默认即可. 主要pom配置文件如下: <parent><gr…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
Python爬虫(52)Scrapy-Redis分布式爬虫架构实战:IP代理池深度集成与跨地域数据采集
目录 一、引言:当爬虫遭遇"地域封锁"二、背景解析:分布式爬虫的两大技术挑战1. 传统Scrapy架构的局限性2. 地域限制的三种典型表现 三、架构设计:Scrapy-Redis 代理池的协同机制1. 分布式架构拓扑图2. 核心组件协同流程 四、技术实…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
Centos 7 服务器部署多网站
一、准备工作 安装 Apache bash sudo yum install httpd -y sudo systemctl start httpd sudo systemctl enable httpd创建网站目录 假设部署 2 个网站,目录结构如下: bash sudo mkdir -p /var/www/site1/html sudo mkdir -p /var/www/site2/html添加测试…...
