闲鱼技术
2019-05-14
1494浏览量
作者:闲鱼技术-楚丰
在《UI2CODE——整体设计篇》中,我们介绍了UI2CODE工程的整体流程:
在组件识别这个环节,需要有一种处理布局信息的方法,来解析和计算控件间的布局关系(比如识别业务组件(BI组件)和查找重复布局),以此来提高最终代码的可用性。
在这篇文章,我们将介绍一种布局信息的结构化方法:“连线法”,以及一种布局间的计算和比较方法: “引导连线法”。
首先来看我们需要解决的问题:
业务组件是指某些特定的卡片,比如一个商品详情卡片,这些卡片会在不同页面出现,而这些卡片的代码一般是已经存在的。我们在拿到一张图片的时候,需要先识别出这些组件,这样这一区块就能复用已有的组件代码,而不会造成很多冗余的一次性代码。
如果把寻找业务组件这个问题看成从一张大图片上寻找小图片的话,那么最直接的做法就是用一个物体检测模型(比如SSD)来做,这样只要训练模型来识别每个业务组件的图片就可以了。因此我们尝试了用训练SSD模型来解决这个问题。
经过训练和测试以后,我们发现用物体检测模型来解这个问题的弊端:
既然前面已经解析出了各个控件的信息(包含类型以及位置等),那么我们是否可以直接利用这些信息来做处理呢?因此我们想要寻找一种新的方式,来处理和解析控件信息,利用这些信息来实现类似“物体检测”功能
如上图这个case,对于类似“GridView”的这种布局,我们理想的布局方式应该是有8个Item,每个Item包含一个TextView和ImageView(上图左边)。
然而实际情况是,我们没有做重复布局的检测,因此布局的时候变成了4行(上图右边)。
为了解决上面的问题,我们就需要寻找一种方法,从多个控件信息中,找到一些规律,自动找到这些具有相似情况的布局。
以上就是我们需要解决的两个问题,我们分析这两个问题,会发现他们有一些共同点:
首先我们需要将非结构化数据转换为结构化数据(或者叫特征提取),这个思路可以参考图片分类任务的做法,不管是聚类算法还是AI模型,都是先做特征提取,再进行进一步处理,实际上做的就是非结构化数据转换成结构化数据。
因此,我们的问题解决思路也就分为两步:
为了分析控件间的关系,我们可以先从简单的开始,看一下两个控件之间的关系都包含哪些信息。
两个控件间的关系,包含以下2个方面的信息:
对于控件属性,可以直接用它自身表示,包含控件类型、内容、位置、大小等
对于两个控件的方向和距离,我们可以用一条虚拟的“连线”来表示,这条连线连接两个控件的中心点。这样,这条连线的长度和角度就可以表示两个控件的方向和距离。比如上图,我们可以得到:一个TextView在一个ImageView正上方,距离xxx像素。
但是除了角度和方向,实际上还存在着一个“对齐方式”信息。
比如上图这个case,如果我们还是连接两个控件的中心点的话(图中蓝色虚线),那这左右两边的图就是指不同的布局(因为两个控件的角度和距离都不一样)。
但是由我们人“肉眼”来看,我们会认为这两个布局是一样的,都是左边一个头像,右边上面跟着一个文本。
因此,我们需要连接TextView的“左边中点”(图上红色实线),这样,不同的连接点位置,就可以表达不同的对齐方式。左对齐的TextView连接左边中点,右对齐的TextView连接右边中点,居中的连接中心点。
有了上面的分析,我们就可以定义一个数据结构。我们用一个Connection对象表达2个控件间的布局关系,它包含:
这样,2个Connection之间就可以进行比较、判断是否“匹配”
两个Connection之间是否“匹配”,必须满足:
两个控件间的关系可以用一个Connection来表示,那么多个控件组成的大布局,就可以用一组Connection来表示。
我们对每两个控件建立一个Connection,就可以得到一个Connection数组
这样,我们的第一步“布局信息结构化”就完成了。
将布局信息转换成Connection数组以后,我们就可以开始利用这些信息来查找相似布局。
首先,我们可以理解这样一个概念,就是:
一个布局,可以看成由一组Connection对象串联起来,得到的一个“路径”
如上图,蓝色圈内的布局可以看成一组Connection串联起来(红色连线)。
那么,寻找相似布局,就是寻找两条相似“路径”的过程
为了寻找相似路径,我们定义了一个“引导连线法”。
所谓“引导连线法”,就是一个 Leader,一个 Follower,Follower 尝试着跟随 Leader 走出一条一样的路径。
步骤如下:
有了结构化的方法和“引导连线法”,我们就可以应用到上述两个问题。
应用这套算法以后,扩展要识别的组件变得非常简单,只要把新组件的的结构化数据预先计算好存储起来,在查找的时候应用”引导连线法“即可。
查找重复布局步骤如下:
这样,最终我们就可以找到,图上有8个布局相似的Item。
应用这套算法,可以查找出页面上任意的重复布局,无论是简单的还是复杂的,极大得提升了代码的可用性。
以上就是我们针对布局信息的处理和计算的整体思路。当然其中还有很多复杂细节需要处理,比如相似布局相似度计算、重复布局多个“pair”组合起来的时候组合条件的判断、重复布局其它额外信息的提取等。但是总体上都是围绕着“布局信息结构化”和“引导连线法展开”,我们也在不断的继续探寻和持续优化各个环节。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里巴巴集团-闲鱼技术团队官方账号 简历投递:guicai.gxy@alibaba-inc.com