- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
作者:京东零售 谷伟 。
1.1网络购物的搜索手段 。
随着移动互联网发展,手机端购物已成为人们生活的常态。人们在搜索商品时采用的手段也越来越丰富,当前的主要搜索方式是文本搜索与拍照搜索.
1.2文本搜索 。
文本搜索应用比较广泛,较为常用的是关键字匹配,针对商品信息的相关描述进行分词,并对分词建立索引库,从而达到查找的目的。随着人工智能的发展,语义搜索得到了快速的发展,它通过用户输入的搜索内容来理解用户真正的意图,从而获得更有价值的内容。其本质是将所有要搜索的内容转化为高维数学向量,用统一的特征向量来描述不同内容,把检索输入的内容向量化,并与要搜索的内容进行向量匹配,把相似度最高的结果展现出来.
1.3拍照搜索 。
拍照搜索也就是以图搜图,是近几年的视觉AI发展的一个产物。用户登录电商平台,可以通过上传图片,经过图像分析与识别来查找相似的商品主图,从而找出相关的商品。其基本原理是经图像分析抽取图像的颜色、形状、纹理等特征,建立特征索引库,对用户上传的图像进行特征化描述,从索引库中查找出与之近似的特征图像.
2.1需要专业人员参与 。
文本搜索需要文本描述的支持,也就是需要对短视频进行文本描述,需要人员对短视频进行准确的文本描述,尤其描述中要含有代表其商品的关键词,否则可能难以被搜索引擎所命中,这对视频的发布人员产生了一定的门槛,增加搜索命中的难度.
拍照搜索主要是对商品的主图进行特征匹配,这也就需要商品发布人员要制作尽可能与之匹配的图片,尤其需要美工设计人员的参与,从而增加了人力成本.
2.2难以支持短视频搜索 。
随着近几年自媒体的发展,短视频逐渐成为互联网信息传播的主要手段。而短视频可以认为是大量图片的集合,不可能对短视频的每张图片建立特征索引,因为这会浪费大量的计算机算力.
以前商品介绍主要以图文方式来展现商品,不仅要展示商品主图还要配细节图,以及产品参数,从而达到全面涵盖产品信息的能力。而短视频能够全方位的展示商品,并搭配语言描述以及背景音乐,可进一步形象的给消费者介绍商品的功能,给顾客更直观的体验,有助于促进下单。同时商家制作的短视频可将其推送到自媒体平台上,便于给商品引流,提高商品销量,从而拓宽了销售市场.
因此短视频营销相对于图文营销更有优势,如何让顾客能够更快更便捷地搜索到其感兴趣的商品短视频,是本发明所要解决的主要问题。本方案主要解决的是商品短视频搜索,按照类目维度对商品短视频进行筛选,并提高视频搜索的命中率,为商品短视频搜索建立桥梁.
流程图:
1.关键帧提取 。
卖家在制作好商品介绍的短视频后,在发布商品时对短视频进行上传,视频时长不能超过2分钟。对该视频进行关键帧提取。视频是由一组连续的图像组成,如果每张图片都存储下来,则会导致视频文件过大,因此视频都会被压缩,在压缩过程中,产生了I帧、P帧、B帧。I帧是画面的完整保存,它尽可能去除了图像空间的冗余信息;P帧则是记录与前一个关键帧的差别;B帧是记录本帧与上一帧和下一帧的差别.
因此只需提取出I帧即可。在MPEG-4标准中,stss部分标识了哪些sample是关键帧,如果没有stss则全部sample是关键帧。当获取的关键帧太多时,以时间轴维度,随机选取20帧的图像供商家选择,把商家选取的5张图片与视频文件一同保存到文件数据库中.
Mp4标准 。
Box类型 | 说明 | |||||
---|---|---|---|---|---|---|
ftyp | 文件类型 | |||||
moov | 记录媒体信息 | |||||
mvhd | 视频文件信息,如时长、创建时间等 | |||||
track | 存放视频的容器 | |||||
tkhd | 媒体总体信息,如宽高等 | |||||
mdia | 媒体容器 | |||||
mdhd | 换算真实事件 | |||||
hdlr | 媒体类型,指明是video、audio、hint | |||||
minf | 媒体信息容器 | |||||
stbl | 偏移映射关系表 | |||||
stsd | sample描述 | |||||
stts | 时戳-sample序号映射表 | |||||
stsc | sample与chunk的映射表 | |||||
stsz | sample的大小 | |||||
stz2 | 另一种存储sample的大小,更节省空间 | |||||
stss | 关键帧列表(从该处获得I帧) | |||||
stco | 每个chunk的偏移 | |||||
co64 | 64位chunk的偏移 | |||||
mdat | 具体的媒体数据 |
2.特征向量计算 。
本次的特征向量计算采用的是VGG16模型。由于关键帧的图片都是彩色图片,因此采用3通道。卷积核为3×3,池化核为2×2。以224×224的视频图像为例,过程如下:
输入图像大小为224×224×3,经64个通道的卷积核3×3,步长为1,共卷积2次,输出尺寸为224×224×64的特征向量。进行池化,采用池化核2×2,步长为2,输出尺寸为112×112×64的特征向量.
经128个3×3的卷积核,步长为1,卷积2次,尺寸变为112×112×128,进行池化,步长为2,输出尺寸为56×56×128.
经256个3×3的卷积核,步长为1,卷积3次,尺寸变为56×56×256,进行池化,步长为2,输出尺寸为28×28×256.
经512个3×3的卷积核,步长为1,卷积3次,尺寸变为28×28×512,进行池化,步长为2,输出尺寸为14×14×256.
经512个3×3的卷积核,步长为1,卷积3次,尺寸变为14×14×512,进行池化,步长为2,输出尺寸为7×7×256.
将数据拉平成一维数组,7×7×256=25088.
经两层1×1×4096与一层1×1×1000的全连接层,最终输出1×1000的特征向量.
3.向量数据库 。
向量在存储时要把文件数据库中的ID同时存下来,以及商品ID,从而建立向量、文件、商品的关系。向量搜索都是相似性搜索,通过两个向量在高位空间的距离来做判断,其实就是在高维空间中找到与目标向量最接近的K个向量,一般采用欧式距离计算,其公式:
为了召回精度高,暴力搜索的是最好的选择。但这会产生大量的不必要的计算,浪费了计算机资源。因此本方案采用类目维度进行切割。减少搜索范围.
4.视频搜索 。
买家需要选择要搜索的类目再进行图片上传,通过VGG16模型计算出特征向量,然后基于类目维度进行暴力搜索把最接近的K个向量筛选出来。最后再根据向量与文件的关系,把视频文件查找出来,返回给买家.
5.视频淘汰策略 。
每日进行定时巡检,对于长时间没有流量或者流量低于阈值的商品,需要从向量库中对其短视频进行逻辑删除,尽可能减少搜索的体积,减少计算资源的浪费.
最后此篇关于一种基于图片搜索视频的方案的文章就讲到这里了,如果你想了解更多关于一种基于图片搜索视频的方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我应该编写一个函数来打印一组给定的三个数字中两个较大数字的平方和。 我对这种情况的处理相当笨拙。我没有编写返回一组 3 中最大的两个数字的函数,而是编写了函数,以便表达式减少到两个所需的数字。 # S
如果有人可以提供帮助,我将不胜感激。我一直在敲我的头一天试图让这个工作。我已经在互联网上搜索并重新阅读了手册,但我就是不明白。 guile << __EOF__ ( define heading-li
目前我正在处理一个方案问题,其中我们正在使用方案列表表示一个图。我们使用的第一个变体是表示为 的边列表图 '((x y) (y z) (x z)) 我们正在使用的图的第二个变体被称为 x 图,表示为
我正在尝试创建一个函数,该函数将两个函数作为参数并执行它们。 我尝试使用 cond ,但它只执行 action1 . (define seq-action (lambda (action1 act
我提前为我的原始英语道歉;我会尽量避免语法错误等。 两周前,我决定更新我对 Scheme(及其启示)的知识,同时实现我在手上获得的一些数学 Material ,特别是我注册的自动机理论和计算类(cla
Scheme中有没有函数支持分数的“div”操作? 意思是 - 11 格 2.75 = 4。 最佳答案 我认为你的问题的答案是:没有,但你可以定义它: #lang racket (define (di
我在scheme中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。 Merge 需要两个列表(已经按递增顺序)并将它们合并在一起。我这样做了如下: (define merge
尝试从终端加载方案文件。我创建了一个名为 test.scm 的文件,其中包含以下代码: (define (square x) (* x x)) (define (sum-of-squares x y)
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我有点了解如何将基本函数(例如算术)转换为Scheme中的连续传递样式。 但如果函数涉及递归怎么办?例如, (define funname (lambda (arg0 arg1)
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
这个问题已经有答案了: How do I pass a list as a list of arguments in racket? (2 个回答) 已关闭 8 年前。 我有一个函数,它需要无限数量的
我对这段代码的工作方式感到困惑: (define m (list 1 2 3 '(5 8))) (let ((l (cdr m))) (set! l '(28 88))) ==>(1 2 3 (5 8
我正在为学校做一项计划作业,有一个问题涉及我们定义记录“类型”(作为列表实现)(代表音乐记录)。 我遇到的问题是我被要求创建一个过程来创建这些记录的列表,然后创建一个将记录添加到该列表的函数。这很简单
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
如何使用抽象列表函数(foldr、foldl、map 和 filter 编写函数),无需递归,消耗数字列表 (list a1 a2 a3 ...) 并产生交替和 a1 - a2 + a3 ...? 最
我试图找出在 Scheme 中发生的一些有趣的事情: (define last-pair (lambda (x) (if (null? (cdr x))
这个问题在这里已经有了答案: Count occurrence of element in a list in Scheme? (4 个答案) 关闭 8 年前。 我想实现一个函数来计算列表中元素出现
我正在尝试使用下面的代码获取方案中的导数。谁能告诉我哪里出错了?我已经尝试了一段时间了。 (define d3 (λ (e) (cond ((number? e) 0) ((e
我是一名优秀的程序员,十分优秀!