得物多模态大模型在重复商品识别上的应用和架构演进

news2024/11/25 20:37:41

重复商品治理介绍

根据得物的平台特性,同一个商品在平台上不能出现多个链接,原因是平台需要保证一品一链的特点,以保障商品的集中竞价,所以说一个商品在整个得物平台上只能有一个商详链接,因此我们需要对一品多链的情况做治理,也就是我们所说的重复商品治理。

目前重复商品的治理流程是:

  • 算法识别出疑似重复商品

  • 人工对疑似重复商品做审核

  • 人工确认重复后对SPU下架或合并

在商品重复识别的过程中,算法识别的重复商品人工审核后实际认可率较低,导致有大量的非重复商品需要进行审核,浪费了较多的人力成本,重复商品治理的效率也偏低。

引入多模态大模型

基于这样的业务场景和遇到的难点痛点问题,我们尝试通过多模态大模型对疑似重复商品做识别,一方面提升疑似重复商品识别的准确率,另一方面降低需要人工审核的数据量,提升人效降低成本。

主要的方案是在算法识别出的疑似商品的基础上,基于重复商品判别规则+多模态大模型进行重复商品的识别,过滤掉不重复只保留下模型识别为重复的商品,作为人工审核的数据。

Q3通过测试,在规则+google大模型的双重识别下,认可率至少提升了20%+,过滤掉有效非重复商品约60w,节省了15个人力/季度,节约成本30.6W。通过三盲标注一致的样本数据进行测试,模型识别准确率均在80%以上,部分类目可达90%+。

期间我们也对比了字节、百度、阿里等多模态大模型,进行了内部测试。测试结果表明,谷歌的Gemini 1.5模型在处理复杂多模态数据方面表现最佳,识别准确率比较认可,最终我们确定选择Gemini大模型。

接下来我来介绍下在重复商品识别的过程中我们是怎样应用多模态大模型并对架构进行一次次演进优化的。

第一版方案

首先在第一版的方案设计中,第一要素是要快,需要快速拿到验证的效果,所以基本上是一把梭的架构设计,按一级类目的维度设计提示词,将重复商品识别拆分成两个子任务:1、文本比较,2、图片比较,每个子任务都有自己的结构输出要求,最后再让大模型将2个任务的结果进行合并,返回最终的判定结果。

其中多模态模型的执行链路如下: 

在提示词中定义了大模型输出结果的格式:

主要输出2行纯文本内容,第一行是文本识别的信息,其中包含了当前类目中所有需要对比的字段或属性,让大模型按照我们定义的格式进行结果输出;第二行是最终判定的结果,让模型返回2个商品是否重复,如果不重复需要给出理由。

文本识别信息=一级类目:相同(鞋与鞋);品牌:相同(AUTRY与AUTRY);适用人群:不相同(女与男);鞋面材质:相同(皮革与皮革);颜色:颜色相同(白浅绿与白浅绿); 最终判定结果=判断结果:不重复;理由:实际的理由

可以看到在第一版中,所有的业务逻辑都被封装在了大模型的prompt中,这对大模型的文本理解能力、指令遵循能力、复杂规则的处理能力都要求极高,识别结果的准确率可能不会太高,因为第一轮主要目的是先把链路跑通。通过拿以往人工审核过的有结果的数据作为数据集进行模型训练。模型识别的结果与人工的结果一致即认为是正确,在第一轮模型训练之后,针对服装女装内衣(3个类目的规则是一致的)的重复商品识别的准确率在90%以上。

以下是一些测试过程中的抽样数据:

因为第一轮主要是快速验证可行性,并且快速在多个类目中进行试验,所以第一版的方案非常适合,因为架构设计简单,只需要编写不同类目的提示词即可,并且提示词设计也比较简单具有通用性,在快速批量扩类目的过程中,可以利用大模型帮我写其他类目的提示词,事实上也确实是这样做的。

但是第一版的方案的缺点也是很明显的,首先因为是按照一级类目的维度设计的提示词,只适合服装类、鞋类这些规则简单的类目,其他类目的规则比较复杂需要细化到三级类目的维度,所以就不适合了。另外把判别结果交给模型进行推断,这本身就是一件靠运气的事,因为模型是通过推理进行任务处理,本身就是一种概率事件,当要处理的文本信息比较少的情况下,模型推理会比较稳定,当需要处理的内容过多时模型就会出现幻觉,文本识别信息和最终判定的结果会存在不一致,导致最终结果不正确,准确率低。

所以第一版的方案只适合验证方案的可行性,不适合正式使用。

第二版方案

第二版的方案也是按一级类目的维度设计提示词。只不过是在第一版的基础上优化了提示词,只让模型专注于判断具体的字段是否相同、图片是否相同,而不用给出结论,这样可以降低最终结果不一致的情况

修改了提示词中定义的输出结果的格式:

三级类目:是否相同=相同/不同,原因=具体的原因; 品牌:是否相同=相同/不同,原因=具体的原因; 属性信息:是否相同=相同/不同,原因=具体的原因; 图片信息:是否相同=相同/不同,原因=具体的原因;

只让模型按照规则分析商品信息中对应字段是否相同,而不用给出最终的判定结果,由应用系统根据模型返回的结果判断最终的结果。

但是第二版方案依然存在以下问题:

1.依然是按照一级类目的维度设计提示词,无法适应复杂类目下的复杂规则

2.文本和图片一起识别,当图文本身不一致时,模型无法判断是以文本为准还是图片为准,会存在互相干扰的情况,导致最终结果不正确

第三版方案

为了解决第二版存在的问题,第三版方案在第二版的基础上做了2个优化调整:

  • 分类目情况按一级、二级、三级维度分别设计提示词。

  • 将文本识别和图片识别拆分,分成2个单独的提示词任务,避免图文一起识别时互相干扰

拆分后的文本任务单独返回字段对比相关的结果:

三级类目:是否相同=相同/不同,原因=具体的原因; 品牌:是否相同=相同/不同,原因=具体的原因; 属性信息:是否相同=相同/不同,原因=具体的原因;

图片任务单独返回图片对比的结果:

图片信息:是否相同=相同/不同,原因=具体的原因;

拆分之后的收益是很明显的:不会存在文本与图片对比互相干扰的情况,并且当文本识别结果明确是不重复时,即可取消对图片的识别,应用系统直接可以判定该条记录为不重复,从而减少一次多模态的模型调用。

另外按细化后的类目设计提示词后,可以根据具体的类目规则进行更详细的提示词设计,准确率提升明显

类目规则定义描述

为了能够在运行时根据类目动态确定具体的提示词,我们定义了一套按类目进行规则描述的方案,并在定义中配置不同类目的提示词和具体的规则,如下所示:

首先规则描述按一级类目、二级类目、三级类目分成了3个规则组,因为有的类目的规则比较简单,只需要按一级类目设计对比规则即可,例如箱包和服装;但是有的类目规则非常复杂,需要细化到具体的二级类目或三级类目,这时我们就需要在二级或三级类目规则组中描述具体的规则,例如3C数码。

在运行时匹配具体的规则时,会依次从三级类目、二级类目、一级类目进行匹配,如果三级类目配置了特定的规则,则会优先使用三级类目的规则,否则会使用一级类目的兜底规则。

第三版方案虽然提升了准确率,但仍然存下以下问题:

1.按三级类目维度设计提示词工作量骤升,并且需要在运行时根据类目动态确定具体的提示词,代码复杂度也变高了,扩类目的成本升高

2.针对特定字段的识别结果依然存在幻觉,并且在处理特别复杂的对比任务时,准确率下降很厉害。例如在对比2个箱包的尺寸时(长宽高误差在2cm内即可认为相同)准确率非常低

第四版方案

到目前为止文本类的字段对比任务依然是依赖大模型,大模型的优势在于能处理并解析复杂的不规范的内容,但是缺点也很明显,因为大模型的推理是一种概率事件,结果是不稳定的。

怎么保证每次输入的内容都能得到稳定、准确的结果是非常难的一件事,因此需要通过工程化的方式进行优化,通过在模型推理的流程中加入代码执行逻辑,以保证结果的稳定。

例如需要对比两个疑似重复商品中的适用型号字段中的品牌的值是否一致,而适用型号的内容值非常长,可能会有几十个型号,对于简短的适用型号模型可以很好的进行品牌信息的提取并对比,而对于长内容的对比,模型可能就会出现失误。

我们在使用大模型处理这个任务时,通常会将任务分为2个子任务:

1)从型号中提取出对应的品牌值,可能有多个品牌值

2)对比多个品牌值是否存在相同值

子任务越多,模型出错的概率越大,最好的方法是让每个模型只执行单一的、确定的子任务,这里我们可以只让模型执行第一个子任务,然后通过代码执行第二个子任务,这样就可以大大增加整个任务的准确率。

基于此,我们在第四版的方案中,引入了FunctionCall的功能,也就是将文本对比的任务拆成:

  • 字段值提取

  • 字段值对比

对于字段值的提取仍然交给大模型,只要把需要提取的字段是什么,按照怎样的规则进行提取描述清楚,一般模型提取出来的值都是比较稳定的。第二步对于字段值的对比,就交给我们的Function,因为函数的处理是按照规则稳定执行的,不可能存在字段值相等但却返回对比结果不相等的情况,即避免了模型出现幻觉的可能性。

第四版方案修改了提示词返回的结果的格式:

文本任务返回:

三级类目:商品1=xxx,商品2=xxx; 品牌:商品1=xxx,商品2=xxx; 尺寸:商品1=xxx,商品2=xxx;

图片任务返回:

图片信息:是否相同=相同/不同,原因=具体的原因;

在链路中引入FunctionCall

原来的重复商品识别的逻辑是完全由大模型执行,主要分为:文本对比和图片对比。

优化后的方案针对文本对比引入了FunctionCall,大模型主要负责:标准字段值提取,然后由应用系统提供的Function进行具体的字段对比。

优化后的图片对比由一次对比改为多次对比,需要查询出CSPU维度的所有规格图后进行一次相似度预识别,找出最相似的2张规格图之后,再对最相似的2张规格图进行一次多模态识别。

例如:spuA与spuB是一对重复组的商品,其中spuA中有5个CSPU:a1,a2,a3,a4,a5,spuB中有3个CSPU:b1,b2,b3,新链路中除了会返回spuA和spuB的相似度distance,还会返回spuA的CSPU中与spuB的CSPU中最相似的一个CSPU,比如a1,b3最相似,则会返回a1和b3的相似度。

标准FunctionCall介绍

谷歌FunctionCall介绍:

https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling?hl=zh-cn

标准的FunctionCall中大模型将外部系统的函数作为模型能力的一种补充,通过定义FunctionCall,大模型在执行推理时,可以通过外部系统的函数获取到推理过程中所需要的信息,然后进行推理。

例如我们想让大模型帮我们进行行程规划,此时可能会需要关注目的地的天气情况,这时就可以通过定义一个天气查询的FunctionCall并通过工具参数配置到大模型中,当大模型进行行程规划并且需要根据天气情况进行行程推荐时,此时大模型就会激活FunctionCall,调用工具中指定的函数获取具体的天气信息,然后进行下一步动作。

自定义FunctionCall设计

标准的FunctionCall对于我们重复商品识别的场景有2个问题:

  • 重复商品识别的规则复杂,不同类目下关注的字段或属性项不同,很难通过编程式的方式定义出所有的FunctionCall的函数定义

  • 标准的FunctionCall链路中,推理结果主要还是依赖模型进行返回,而我们的场景对于准确率的要求非常高,依赖模型会存在一定的幻觉

为此我设计了一套自定义FunctionCall的方案,通过提示词让模型提取出特定自定标准值的方案。

标准字段提取规则设计如下:

在promptPath中定义提示词,在提示词中指定模型的任务目标为:从输入字段或属性中提取出当前类目所关注的对比字段,并按照输出字段中定义的格式进行返回。

当模型提取出对应的对比字段的标准值之后,就可以调用外部系统的函数进行字段匹配了,如下所示在outputFields中定义了每个需要对比的字段的matcher函数是什么,执行FunctionCall时直接指定需要对比的matcher函数即可。

{
    "lv1CategoryPromotConfigs" : [
        {
            "categorys" : ["箱包"],
            "fieldCompare" : {
                "promptPath" : "prompts_extract_args/luggage_extract.txt",
                "llmInputFields" : [],
                "llmInputProperties" : ["尺寸"],
                "matchFields" : [
                    {"field" : "一级类目", "source" : "inputField", "sourceField" : "lv1Category", "matcher" : "EqualsItemMatcher"},
                    {"field" : "品牌", "source" : "inputField", "sourceField" : "brand", "matcher" : "EqualsItemMatcher"},
                    {"field" : "质地", "source" : "inputProperty", "sourceField" : "质地", "matcher" : "AnyOfEqualsItemMatcher"},
                    {"field" : "尺寸", "source" : "outputLlm", "sourceField" : "尺寸", "matcher" : "SizeOfEqualsItemMatcher"}
                ]
            }
        }
    ]
}

这里获取要对比的字段的值也有个巧妙的设计,通过source配置字段值的来源:

  • inputField:直接从商品标准字段中提取

  • inputProperty:直接从商品的属性字段中提取

  • outputLlm:经过大模型处理后的输出值

有了字段来源之后,在通过Matcher函数进行对比:

首先定义一个抽象类和抽象方法:

 

CSPU维度图片重识别

除此之外,第四版方案针对两个商品的主图识别不重复的情况,还会再对两个SPU的所有CSPU维度规格图再做一次重识别,防止遗漏掉重复商品,因为有的商品存在很多的规格,虽然主商品不相似,但是规格中存在相似的相同。

但是对CSPU规格图做重识别也是有前提条件的,会根据类目确定是否需要进行CSPU维度的重复判别,如果该类目需要根据CSPU维度判重,则此时才会查询出两个商品的所有CSPU子集,然后获取CSPU维度下最相似的2张规格图进行对比。

获取规格图的过程如下:

首先将spu_id,cspu_url_list查询到一张宽表中,其中cspu_url_list字段中是所有规格图片,以逗号分隔,如下所示:

spu_id1, logo_url1, cspu_url_list1[cspu_url1_1,cspu_url1_2,cspu_url1_3], spu_id2, logo_url2, cspu_url_list2[cspu_url2_1,cspu_url2_2,cspu_url2_3,cspu_url2_4]

最终得到一个包含主图、规格图列表、最相似规格图的宽表,如下所示:

spu_id1, logo_url1, cspu_url_list1, most_similar_cspu_url1 spu_id2, logo_url2, cspu_url_list2, most_similar_cspu_url2

得到最相似的2张规格图之后,只要再调用一次多模态模型进行图片对比即可,这步可以将那些主图不相同但是规格图相同的商品找出来,避免了重复商品的遗漏。

但是目前算法提供的图片相似度识别接口,设置召回的阈值比较高,只有对于相似度非常高的图片,才会召回出相似图片,如以下这些高相似度的图片:

架构升级演进总结

版本

架构设计

模型输出结果

优点

缺点

架构设计变化

第一版

按一级类目的维度设计提示词。

将重复商品识别拆分成两个子任务:1、文本比较,2、图片比较,每个子任务按照要求产出具体的结果数据,最后再将2个任务的结果进行合并,返回最终的判定结果

文本识别信息=一级类目:相同(鞋与鞋);品牌:相同(AUTRY与AUTRY);适用人群:不相同(女与男);鞋面材质:相同(皮革与皮革);颜色:颜色相同(白浅绿与白浅绿);

最终判定结果=判断结果:不重复;理由:实际的理由

1.提示词设计简单,可以快速验证结果

2.提示词具有通用性,可以快速批量扩展不同类目的提示词

1.按照一级类目设计重复商品识别的规则,只适合鞋、服等规则简单的类目,其他复杂类目需要细化到三级类目分别设置规则

2.模型处理的任务过多,文本识别信息和最终判定的结果存在不一致,导致最终结果不正确,准确率低

重复商品识别的结果完全由模型判断,准确率依赖于模型的智力。

最终的识别结果由模型确定。

第二版

按一级类目的维度设计提示词。

只让模型按照规则分析商品信息中对应字段是否相同,而不用给出最终的判定结果,由应用系统根据模型返回的结果判断最终的结果。

三级类目:是否相同=相同/不同,原因=具体的原因;

品牌:是否相同=相同/不同,原因=具体的原因;

属性信息:是否相同=相同/不同,原因=具体的原因;

图片信息:是否相同=相同/不同,原因=具体的原因;

1.只让模型专注于判断具体的字段是否相同、图片是否相同,而不用给出结论,可以降低最终结果不一致的情况

1.依然是按照一级类目的维度设计提示词,无法适应复杂类目下的复杂规则

2.文本和图片一起识别,当图文本身不一致时,模型无法判断是以文本为准还是图片为准,会存在互相干扰的情况,导致最终结果不正确

重复商品识别的结果不需要由模型判断了,模型只需要分析具体的字段是否相同。

最终的识别结果由应用系统确定。

第三版

分类目情况按一级、二级、三级维度分别设计提示词。

并将文本识别和图片识别拆分,分成2个单独的提示词任务,避免图文一起识别时互相干扰

文本任务返回:

三级类目:是否相同=相同/不同,原因=具体的原因;

品牌:是否相同=相同/不同,原因=具体的原因;

属性信息:是否相同=相同/不同,原因=具体的原因;

图片任务返回:

图片信息:是否相同=相同/不同,原因=具体的原因;

1.按细化后的类目设计提示词后,可以根据具体的类目规则进行更详细的提示词设计,准确率提升明显

2.文本识别和图片识别拆分后,不会存在互相干扰的情况,并且当文本识别结果明确是不重复时,即可取消对图片的识别

1.按三级类目维度设计提示词工作量骤升,并且需要在运行时根据类目动态确定具体的提示词,代码复杂度也变高了,扩类目的成本升高

2.针对特定字段的识别结果依然存在幻觉,并且在处理特别复杂的对比任务时,准确率下降很厉害。例如在对比2个箱包的尺寸时(长宽高误差在2cm内即可认为相同)准确率非常低

文本对比任务和图片对比任务做拆分,让模型每次只专注于做一件事,降低互相干扰的概率。

最终的识别结果由应用系统确定。

第四版

分类目情况按一级、二级、三级维度分别设计提示词。

并将文本识别和图片识别拆分,分成2个单独的提示词任务,避免图文一起识别时互相干扰

并且在文本识别任务中引入FunctionCall,提升文本对比的准确性。

针对主图识别为不重复的商品,再对规格图做重识别。

文本任务返回:

三级类目:商品1=xxx,商品2=xxx;

品牌:商品1=xxx,商品2=xxx;

尺寸:商品1=xxx,商品2=xxx;

图片任务返回:

图片信息:是否相同=相同/不同,原因=具体的原因;

1.文本识别任务只让模型提取出对应商品对应字段的标准值,然后通过FunctionCall进行字段值的对比,准确率进一步提升

2.对规格图做重识别,可以进一步识别出主图不重复,但是规格图重复的商品。

1.需要针对不同的对比规则编写不同的对比函数,代码复杂度进一步提升

文本对比任务也不需要模型判断了,模型只需要提取的需要对比的字段的标准值,值的对比交给应用系统的对比函数。

进一步优化图片对比,优先对比主图,如果主图不重复,再对比规格图。

最终的识别结果由应用系统确定。

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

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

相关文章

1、DevEco Studio 鸿蒙仓颉应用创建

1. 仓颉鸿蒙应用简介 因为仓颉是静态编译型语言,使用仓颉开发的应用执行效率更高。而且主打全场景,后续可并入仓颉生态,其和ArkTS都是基于ArkUI进行开发,最大的区别是typescript和仓颉语法间的差异。 2. 应用创建 前置条件&…

vue3项目中实现el-table分批渲染表格

开篇 因最近工作中遇到了无分页情景下页面因大数据量卡顿的问题&#xff0c;在分别考虑并尝试了懒加载、虚拟滚动、分批渲染等各个方法后&#xff0c;最后决定使用分批渲染来解决该问题。 代码实现 表格代码 <el-table :data"currTableData"borderstyle"wi…

LeetCode:82. 删除排序链表中的重复元素 II(重复的一个都不保留)

目录 题目描述: 代码: 第一种: 第二种: 题目描述: 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2…

偏差与方差的基本概念

在机器学习中&#xff0c;Bias-Variance Tradeoff&#xff08;偏差-方差权衡&#xff09; 是一个核心概念&#xff0c;帮助我们理解模型的误差来源以及如何调节模型复杂度以达到更好的泛化性能。在这篇博客中&#xff0c;我们将深入讨论什么是偏差和方差&#xff0c;以及如何平…

0-ARM Linux驱动开发-字符设备

一、字符设备概述 Linux 系统中&#xff0c;设备被分为字符设备、块设备和网络设备等。字符设备以字节流的方式进行数据传输&#xff0c;数据的访问是按顺序的&#xff0c;一个字节一个字节地进行读取和写入操作&#xff0c;没有缓冲区。例如&#xff0c;终端&#xff08;/dev…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

【优选算法】——二分查找!

目录 1、二分查找 2、在排序数组中查找元素的第一个和最后一个位置 3、搜索插入位置 4、x的平方根 5、山脉数组的封顶索引 6、寻找峰值 7、寻找旋转排序数组中的最小值 8、点名 9、完结散花 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组…

东北虎豹国家公园shp格式范围

东北虎豹国家公园地处中国吉林、黑龙江两省交界的老爷岭南部&#xff08;珲春—汪清—东宁—绥阳&#xff09;区域&#xff0c;东起吉林省珲春林业局青龙台林场&#xff0c;与俄罗斯滨海边疆区接壤&#xff0c;西至吉林省大兴沟林业局岭东林场&#xff0c;南自吉林省珲春林业局…

Spring 中的 Environment 对象

可参考官网&#xff1a;Environment Abstraction 核心概念 Environment 对象对两个关键方面进行建模&#xff1a;profiles 和 属性&#xff08;properties&#xff09;。 Profile 简单来说&#xff1a;profile 机制在 IOC 容器中提供了一种机制&#xff1a;允许在不同的环境…

Puppeteer点击系统:解锁百度流量点击率提升的解决案例

在数字营销领域&#xff0c;流量和搜索引擎优化&#xff08;SEO&#xff09;是提升网站可见性的关键。我开发了一个基于Puppeteer的点击系统&#xff0c;旨在自动化地提升百度流量点击率。本文将介绍这个系统如何通过模拟真实用户行为&#xff0c;优化关键词排名&#xff0c;并…

浅谈UI自动化

⭐️前言⭐️ 本篇文章围绕UI自动化来展开&#xff0c;主要内容包括什么是UI自动化&#xff0c;常用的UI自动化框架&#xff0c;UI自动化原理等。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f349;博主将持续更新学习记录收获&#xff0c;友友们有任何问题…

[Android]从FLAG_SECURE禁止截屏看surface

在应用中&#xff0c;设置activity的flag为FLAG_SECURE就可以禁止截屏&#xff0c;截屏出来是黑色的&#xff0c; 试验一下&#xff0c; 注意事项 影响&#xff1a; 设置 FLAG_SECURE 标志后&#xff0c;用户将无法对该Activity进行截屏或录制屏幕。这个标志会影响所有屏幕录…

设计模式之模块方法

定义 模板与方法应该是最常使用的设计模式&#xff0c;在GOF&#xff08;设计模式&#xff09;中的定义&#xff1a;定义一个操作中的算法的骨架 &#xff0c;而将一些步骤延迟到子类中。 Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 …

深度学习之降维和聚类

1 降维和聚类 1.1 图解为什么会产生维数灾难 ​ 假如数据集包含10张照片&#xff0c;照片中包含三角形和圆两种形状。现在来设计一个分类器进行训练&#xff0c;让这个分类器对其他的照片进行正确分类&#xff08;假设三角形和圆的总数是无限大&#xff09;&#xff0c;简单的…

uni-app 下拉刷新、 上拉触底(列表信息)、 上滑加载(短视频) 一键搞定

一、下拉刷新 1. 首先找到pages.json中 给需要进行下拉刷新的页面设置可以下拉刷新 2. 然后在需要实现下拉刷新的script标签内添加 导入onPullDownRefresh import {onPullDownRefresh} from dcloudio/uni-app 下拉刷新触发的事件 onPullDownRefresh(()> {console.log(正…

AprilTag在相机标定中的应用简介

1. AprilTag简介 相机标定用的标靶类型多样,常见的形式有棋盘格标靶和圆形标靶。今天要介绍的AprilTag比较特别,它是一种编码形式的标靶。其官网为AprilTag,它是一套视觉基准系统,包含标靶编解码方法(Tag生成)和检测算法(Tag检测),可用于AR、机器人、相机标定等领域。…

stm32入门教程--USART外设 超详细!!!

目录 简介 什么是UART&#xff1f; 什么是USART&#xff1f; 简介 USART&#xff08;Universal Synchron /Asynchronous Receiver /Transmitter&#xff09;通用同步/异步收发器 1、USART是STM32内部集成的硬件外设&#xff0c;可根据数据寄存器的一个字节数据自动生成数据帧…

ubuntu20.04 加固方案-设置重复登录失败后锁定时间限制

一、编辑PAM配置文件 打开终端。 使用文本编辑器&#xff08;如vim&#xff09;编辑/etc/pam.d/common-auth文件。 sudo vim /etc/pam.d/common-auth 二、添加配置参数 在打开的配置文件中&#xff0c;添加或修改以下参数&#xff1a; auth required pam_tally2.so deny5 un…

Linux操作系统指令(部分)

Linux操作系统 要求如下&#xff1a; 1、查看/etc/passwd文件的第18-20行内容&#xff0c;并将找到的内容存储至/home/passwd文件中 2、查找/etc/passwd文件中包含root字符的行并将找到的行存储至/root/passwd文件中 3、将/home目录复制到/root目录 4、将/root/home目录&a…

钉子户绷不住了,Win 10正式改为「付费续命」模式

众所周知&#xff0c;「终止支持」是所有 Windows 版本早已既定又让人非常操蛋的最终归宿。 当微软认为一代操作系统已完成其生命周期使命的那一刻&#xff0c;便会毫不犹豫地宣告它的死期。 Windows 系统一旦结束支持&#xff0c;微软将不会再提供任何技术维护和安全更新。 …