摘要: UI2CODE项目是闲鱼技术团队研发的一款经过机器视觉理解+AI人工智能将UI视觉图片转化为端侧代码的工具。微信
随着移动互联网时代的到来,人类的科学技术日新月异。然而软件工程师们依旧须要花费大量精力在重复的还原UI视觉稿的工做。
UI视觉研发拥有明显的特征:组件,位置和布局,符合机器学习处理范畴。可否经过机器视觉和深度学习等手段自动生成UI界面代码,来解放重复劳动力,成为咱们关注的方向。网络
UI2CODE项目是闲鱼技术团队研发的一款经过机器视觉理解+AI人工智能将UI视觉图片转化为端侧代码的工具。架构
2018年3月UI2CODE开始启动技术可行性预研工做,到目前为止,经历了3次总体方案的重构(或者重写)。咱们参考了大量的利用机器学习生成代码的方案,但都没法达到商用指标,UI2CODE的主要思想是将UI研发特征分而治之,避免鸡蛋放在一个篮子里。咱们着重关注如下3个问题的解法:app
视觉稿还原精度:咱们的设计师甚至没法容忍1像素的位置误差; 准确率:机器学习还处于几率学范畴,但咱们须要100%的准确率; 易维护性:工程师们看的懂,改的动是起点,合理的布局结构才能保障界面流畅运行。
UI2CODE插件化运行效果,以下视频:进过几轮重构,最终咱们定义UI2CODE主要解决feeds流的卡片自动生成,固然它也能够对页面级自动生成。框架
视频地址:https://yunqivedio.alicdn.com/od/mm4Te1551157852340.mov机器学习
简化分析下UI2CODE的流程:工具
大致分为4个步骤:布局
1.经过机器视觉技术,从视觉稿提取GUI元素 2.经过深度学习技术,识别GUI元素类型 3.经过递归神经网络技术,生成DSL 4.经过语法树模板匹配,生成flutter代码
版面分析只作一件事:切图。学习
图片切割效果直接决定UI2CODE输出结果的准确率。咱们拿白色背景的简单UI来举例:字体
上图是一个白色背景的UI,咱们将图片读入内存,进行二值化处理:
def image_to_matrix(filename): im = Image.open(filename) width, height = im.size im = im.convert("L") matrix = np.asarray(im) return matrix, width, height
获得一个二维矩阵:将白色背景的值转化为0.
像切西瓜同样,咱们只须要5刀,就能够将GUI元素分离,切隔方法多种多样:(下面是横切的代码片断,实际切割逻辑稍微复杂些,基本是递归过程)
def cut_by_col(cut_num, _im_mask): zero_start = None zero_end = None end_range = len(_im_mask) for x in range(0, end_range): im = _im_mask[x] if len(np.where(im==0)[0]) == len(im): if zero_start == None: zero_start = x elif zero_start != None and zero_end == None: zero_end = x if zero_start != None and zero_end != None: start = zero_start if start > 0: cut_num.append(start) zero_start = None zero_end = None if x == end_range-1 and zero_start != None and zero_end == None and zero_start > 0: zero_end = x start = zero_start if start > 0: cut_num.append(start) zero_start = None zero_end = None
客户端的UI基本都是纵向流式布局,咱们能够先横切在纵切。
将切割点的x,y轴坐标记录下来,它将是处理组件位置关系的核心。切割完成后,咱们获取到2组数据:6个GUI元素图片和对应的坐标系记录。后续步骤经过分类神经网络进行组件识别。
在实际生产过程当中,版面分析会复杂些,主要是在处理复杂背景方面。
关注咱们的技术公众号,咱们后续会详细分解。
进行组件识别前咱们须要收集一些组件样本进行训练,使用Tensorflow提供的CNN模型和SSD模型等进行增量训练。
UI2CODE对GUI进行了几十种类型分类:IMAGE, TEXT,SHAP/BUTTON,ICON,PRICE等等,分别归类为UI组件,CI组件和BI组件。
UI组件,主要针对flutter原生的组件进行分类。 CI组件,主要针对闲鱼自定义UIKIT进行分类。 BI组件,主要针对具有必定业务意义的feed卡片进行分类。
组件的识别须要反复的经过全局特征反馈来纠正,一般会采用SSD+CNN协同工做,好比下图的红色“全新“shape,这该图例中是richtext的部分,一样的shape样式可能属于button或者icon。
这块的技术点比较杂,概括起来须要处理3部份内容:shape轮廓, 字体属性和组件的宽高。
完成属性提取,基本上咱们完成全部GUI信息的提取。生成的GUI DSL以下图:
经过这些数据咱们就能够进行布局分析了。
其中文字属性的提取最为复杂,后续咱们会专门介绍。
前期咱们采用4层LSTM网络进行训练学习,因为样本量比较小,咱们改成规则实现。规则实现也比较简单,咱们在第一步切图时5刀切割的顺序就是row和col。缺点是布局比较死板,须要结合RNN进行前置反馈。
视频地址:https://yunqivedio.alicdn.com/od/7DD7w1551157938106.mp4
视频中展现的是经过4层LSTM预测布局结构的效果,UI的布局结构就像房屋的框架,建造完成后经过GUI的属性进行精装修就完成了一个UI图层的代码还原工做。
机器学习本质上来讲还属于几率学范畴,自动生成的代码须要很是高的还原度和100%的准确率,几率注定UI2CODE很难达到100%的准确率,因此咱们须要提供一个可编辑工具,由开发者经过工具可以快速理解UI的布局结构和修改布局结构。
咱们将UI2CODE生成的DSL TREE进行代码模板化匹配,代码模板的内容由资深的flutter技术专家来定义,它表明目前咱们发现的最优代码实现方案。
代码模板中会引入一些标签,由Intellij plugin来检索flutter工程中是否存在对应的自定义UIKIT,并进行替换,提升代码的复用度。
整个插件化工程须要提供自定义UIKIT的检索,替换和校验工做,以及DSL Tree的建立,修改,图示等工做,整体来讲,更像ERP系统,花费一些时间可以作的更加完美。
本篇咱们简单介绍了UI2CODE的设计思路,咱们将整个工程结构分为5个部分,其中4块内容核心处理机器视觉的问题,经过机器学习将它们连接起来。代码的线上发布是很是严格的事情,而单纯的机器学习方式,很难达到咱们要求,因此咱们选择以机器视觉理解为主,机器学习为辅的方式,构建整个UI2CODE工程体系。咱们将持续关注AI技术,来打造一个完美的UI2CODE工具。
原文连接 更多技术干货 请关注阿里云云栖社区微信号 :yunqiinsight