背景

在上一篇文章详解阿里99大促活动页内容识别技术实现,我们介绍了在淘宝99大促中,我们使用了怎样的算法模型去识别并完成自动化测试的。

迫切解决的样本问题

淘宝大促有近百个模块、上千个页面,模块间具有相似性,并且模块内部具备多种状态,如果想要准确识别每个模块类型,单模块的样本数量至少要达到万级,而人工标注成本高、效率低下、数据量少,纯靠人力是无法满足模型诉求的。基于此,今天,我来介绍下,模型识别背后的大批量数据样本生成的技术方案。

思路

总体技术方案如下:

模型的样本要求

算法模型识别的输入是99大促的各个会场截图,输出是目标模块名称及其在截图中的坐标位置。

模型训练时,就是把模块渲染图、相应坐标位置与模块类型输入给模型,交给模型去进行监督学习。而模型需要的,就是各个模块大批量的图片样本。

一个模块,是由View和ViewModel组合而成,而View是固定的,ViewModel跟随会场场景不同,是动态变化的。

那么,如果我们能拿到描述模块的View的这一层DSL,辅助以动态的ViewModel数据,再把View和ViewModel渲染成图片,那我们就可以生成无穷无尽的样本数据了。

DSL描述View

仔细梳理之后,View拆分为原子级元素(Text、Image、Shape)和原子级元素的组合关系(Group),即与HTML DOM树状结构中的各层级容器嵌套与叶子节点类型是同样的逻辑。 
基于节点类型和节点样式的DSL,我们就能描述一个完整的View了。

{"layers": [{"frame": {"y": 354,"x": 44,"height": 32,"width": 312},"id": 2,"type": "text","value": "Adidas Stan Smith","textStyles": {"fontFamily": "Helvetica, sans-serif","fontSize": 24}}, {"frame": {"y": 0,"x": 384,"height": 342,"width": 342},"id": 3,"type": "image","value": "//img.alicdn.com/bao/uploaded/i1/TB1.mcuNpXXXXctXFXXSutbFXXX.jpg_350x350Q50s50.jpg_.webp","styles": {"height": 342,"width": 342}}, {"frame": {"y": 0,"x": 384,"height": 342,"width": 342},"id": 4,"type": "shape","styles": {"height": 342,"width": 342,"backgroundColor": "rgba(0, 0, 0, 0.1)"}}],"frame": {"y": 0,"x": 0,"height": 4920,"width": 750},"id": 1,"type": "group","moduleName": "pmod-zebra-recommand-item"
}

其中,除了节点类型和节点样式之外,最外层的moduleName代表模块名称,id是为了标记每一个子元素,frame是每个子元素的坐标位置、辅助算法模型识别模块内部子元素,value值只有text和image才有,对应相应的文本值还有图片链接。

获取模块View的DSL

有3种方案可以获取到模块View的DSL,分别是: 
1、从代码仓库中获取; 
2、从sketch视觉稿中生成; 
3、从浏览器渲染好的页面中获取。

我最后选择了第三种方案,放弃第一个方案是因为代码写法千差万别,很多展现逻辑还包含在js代码中,并且还要处理各种for循环子View、style的映射关系等等,复杂度太高。第二个方案目前集团内已有技术方案imgcook,这一块的准确率听说还不错,并且一直在持续优化,而最终选择第三个方案的原因是,能100%准确地还原模块DSL,并且只需要关注模块最终展现给用户时候的形态,不需要理会过程中开发者做得各种复杂业务逻辑,复杂度相对低很多。

技术方案

在开发流程上,每个模块在开发完成后,都会有对应的模块预览页面。我使用了puppeteer模拟真实浏览器,对模块的节点信息进行提取,并保存为规范的DSL。

清洗window.getComputedStyle

通过window.getComputedStyle获取DOM节点的样式,会返回包含280个样式属性的对象,如果把每个DOM节点的所有280个样式属性都存储到DSL中,会造成两个问题: 
1、DSL文件冗余,且文件大小过大,解析耗时; 
2、增加算法同学对DSL的理解和调整成本。

第一步,隐藏默认属性值; 
大部分的样式属性都是默认值,我们首先把默认的样式属性剔除出去。

{
alignSelf: 'auto',
...
}

第二步,剔除无效属性; 
开发者常用的样式属性在20个左右,有很多的样式是不具备实际效用的,把无效用的样式属性剔除掉,比如说:

{
zoom: '1',
writingMode: 'horizontal-tb',
...
}

第三步,transform动态计算 
通过getComputedStyle拿到的transform属性值是一个矩阵方法matrix(),感兴趣的同学可以戳这里理解下2D转换矩阵。我们使用puppeteer模拟浏览器设置的屏幕宽度是750,也就是说,得到的transform值中translateX和translateY两个值是以750为基准换算得到的一个数字,假如想要在下面描述到的将DSL渲染成图时(算法同学期望能模拟各种各样的屏幕尺寸去生成样本),就必须将获取到的transform值换算成相应屏幕设备时的值。

# 为了方便算法同学更好使用DSL渲染成图的工具,这里使用python来实现
# screenshotShape是一个数组,代表屏幕宽高  [width, height]
if 'transform' in style and 'matrix' in style['transform']:matrix = style['transform'][7:-1].split(',')translate = list(map(float, matrix[-2:]))translateResult =  list(map(str, [distance*(screenshotShape[0]/750) for distance in translate]))matrix[-2:] = translateResult

通过以上3个步骤,最终得到的DOM节点样式属性个数一般维持在20个以内,能使输出的DSL精简非常多。

DSL渲染成图片

同样的,我们能基于puppeteer去对页面做操作,也能使用它去把DSL渲染成目标模块页面,并截图。

首先,建立DSL与HTML标签的映射关系

其次,如果是DSL类型为Group,就递归遍历里面的所有子元素,以此类推。
完整的渲染流程图如下:

ViewModel动态数据

一个模块,应用到99大促、双十一等各种会场,背后样式都是一致的,只有对应的数据不同,动态的数据一般是商品图片和商品信息。 
闲鱼有一亿多的商品数据,如果把这商品数据拿过来与View一起渲染成模块,每个模块就有了成千上万种展现形态,且贴合算法模型实际识别过程中的输入,既能满足样本数量的要求,也能符合模型实际识别的场景,使模型准确率获得更大地提升。

效果

通过这样一条生成样本的通道,每个模块都能够提供给算法同学几万张质量很高的样本截图,使模型的准确率达到98%以上。

未来

上述文章描述了如何批量生成样本来帮助解决算法模型对99大促和双十一会场中各个模块的识别。

目前,对模块DSL的动态调整依赖算法同学对模块的理解,eg.改变圆角borderRadius生成更多正向样本,或者增加噪声,eg.删除商品内容节点等生成负向样本,这些操作都需要算法同学对DSL进行定制化配置。在未来,我们希望尝试把这部分的工作也交给模型去处理,让模型对样本生成做决策,调整DSL的局部,并生成样式更加丰富和可靠的样本。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

阿里99大促 | 模型识别背后的样本生成相关推荐

  1. 左手供给,右手营销,聚划算99大促首战告捷的下沉市场进攻方法论

    文 | 陈选滨 来源 | 螳螂财经(ID:TanglangFin) 618激战下沉市场热度尚未冷却,99大促就把行业焦点转移到下沉市场. 从聚划算"复活"到99划算节,阿里动作频频 ...

  2. 【定金膨胀】2018天猫聚划算99大促欢聚盛典付尾款时间

    2018天猫聚划算99大促欢聚盛典付尾款时间+99大促定金膨胀+99欢聚盛典,是秋冬新爆款集中发力.多品牌强参与,粉丝齐聚互动的一年一度的重要大促! 入口:复制淘口令€1avcbdn28oi€打开手机 ...

  3. 深度技术揭秘 | 大促狂欢背后,如何有效评估并规划数据库计算资源?

    简介:经过"双11"."618"这类互联网促销活动的验证,越来越多的互联网公司采用不定期营销活动来刺激消费,达到提升营收能力的目标.然而,在每一次业务狂欢的背后 ...

  4. 京东物流仓储系统618大促保障背后的运维秘诀

    前言 京东物流极速的购物体验背后隐藏着怎样的秘诀?仓储和配送时效是其中最为关键的一环.京东物流超强仓配体系,特别是在电商行业中独有的仓储系统,在其中起到了决定性的作用. 当前京东的库房已经遍布全国,京 ...

  5. 阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促

    本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,梁笑专家是该专场第一位演讲的嘉宾,本篇文章是根据梁笑专家在<阿里云栖开发者沙龙-Java技术专场& ...

  6. 阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促 1

    本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,梁笑专家是该专场第一位演讲的嘉宾,本篇文章是根据梁笑专家在<阿里云栖开发者沙龙-Java技术专场& ...

  7. 【Java开发者专场】阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促...

    本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,梁笑专家是该专场第一位演讲的嘉宾,本篇文章是根据梁笑专家在<阿里云栖开发者沙龙-Java技术专场& ...

  8. 【Java开发者专场】阿里专家梁笑:2018双十一下单成功率99.9%!供应链服务平台如何迎接大促... 1

    本篇文章来自于2018年12月22日举办的<阿里云栖开发者沙龙-Java技术专场>,梁笑专家是该专场第一位演讲的嘉宾,本篇文章是根据梁笑专家在<阿里云栖开发者沙龙-Java技术专场& ...

  9. 2019淘宝天猫拼多多大促时间表!附:大促售后/公号私号吸粉黑科技!

    作为电商卖家,首先要了解各大电商平台每一年的大促时间节奏,提前为店铺流量冲刺做准备.淘宝什么时候活动最大? 上半年就属618大促活动力度最大了: 下半年就是双十一.双十二,这几个促销都是不容错过的. ...

最新文章

  1. 2022-2028年中国氧化铟锡薄膜行业市场深度分析及前瞻研究报告
  2. Pytorch之深入理解torch.nn.Parameter()
  3. HDU2050 折线分割平面
  4. Python实现换位加密
  5. Pycharm上Django的使用 Day8
  6. JS-取出字符串中重复次数最多的字符并输出
  7. SQL Server向表中插入数据
  8. 洛谷省选斗兽场全通关祭~以及之后的打算!
  9. nginx添加nginx_mod_h264_streaming-2.2.7模块编译报错
  10. 什么是计算机游戏技术,dlss技术是什么意思有什么用?目前支持dlss的游戏有哪些?...
  11. uwp - ContentDialog - 自定义仿iphone提示框,提示框美化
  12. 洛谷 P1114 “非常男女”计划
  13. 3.关于python函数,以及作用域,递归等知识点
  14. 2位8421bcd码相加实验
  15. 项目实施如何推动落地?(PDCA戴明环)
  16. 华为防火墙用户与认证
  17. 获取当前日期的年月日
  18. 计算机内部为什么采用二进制表示数据,计算机内部为什么使用二进制处理数据? - 问答库...
  19. 2021水利水电安全员模拟考试多选题库及答案
  20. 网站抢单搭建什么服务器,12306抢票、嘀嘀抢单服务器如何搭建?

热门文章

  1. c++ 多态 运行时多态和编译时多态_C++核心编程 第十一节 多态
  2. http://www.od85c.com.cn/html/,OllyDbg script for unpacking Enigma 4.xx and 5.xx
  3. python实现多语言语种识别_用Python进行语言检测
  4. c# combobox集合数据不显示_excel打开数据时显示乱码/问号amp;看起来一样却v不出来怎么办...
  5. c mysql 视图_MySQL入门教程(七)之视图
  6. 中奖人js滚动效果_js使用transition效果实现无缝滚动
  7. 排序算法 --- 希尔排序
  8. 怎样解决外键约束_《设计心理学》|找寻“设计师”所遇的真正问题与解决之道...
  9. 央视记者王冰冰为何走红?博导和研究生写了一篇论文进行了分析
  10. 耿美玉起诉饶毅名誉侵权,法院判了!驳回请求,但对饶毅方也应给予批评