背景:
  随着移动互联网时代的到来,人类的科学技术突飞猛进。然而软件工程师们依旧需要花费大量精力在重复的还原UI视觉稿的工作。
UI视觉研发拥有明显的特征:组件,位置和布局,符合机器学习处理范畴。能否通过机器视觉和深度学习等手段自动生成UI界面代码,来解放重复劳动力,成为我们关注的方向。

UI2CODE简单介绍:
  UI2CODE项目是闲鱼技术团队研发的一款通过机器视觉理解+AI人工智能将UI视觉图片转化为端侧代码的工具。

  2018年3月UI2CODE开始启动技术可行性预研工作,到目前为止,经历了3次整体方案的重构(或者重写)。我们参考了大量的利用机器学习生成代码的方案,但都无法达到商用指标,UI2CODE的主要思想是将UI研发特征分而治之,避免鸡蛋放在一个篮子里。我们着重关注以下3个问题的解法:

视觉稿还原精度:我们的设计师甚至无法容忍1像素的位置偏差;
准确率:机器学习还处于概率学范畴,但我们需要100%的准确率;
易维护性:工程师们看的懂,改的动是起点,合理的布局结构才能保障界面流畅运行。
UI2CODE运行效果:
  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基本都是纵向流式布局,我们可以先横切在纵切。
demo3.png
将切割点的x,y轴坐标记录下来,它将是处理组件位置关系的核心。切割完成后,我们获取到2组数据:6个GUI元素图片和对应的坐标系记录。后续步骤通过分类神经网络进行组件识别。

在实际生产过程中,版面分析会复杂些,主要是在处理复杂背景方面。
demo5.png

关注我们的技术公众号,我们后续会详细分解。

组件识别:
  进行组件识别前我们需要收集一些组件样本进行训练,使用Tensorflow提供的CNN模型和SSD模型等进行增量训练。

  UI2CODE对GUI进行了几十种类型分类:IMAGE, TEXT,SHAP/BUTTON,ICON,PRICE等等,分别归类为UI组件,CI组件和BI组件。

UI组件,主要针对flutter原生的组件进行分类。
CI组件,主要针对闲鱼自定义UIKIT进行分类。
BI组件,主要针对具备一定业务意义的feed卡片进行分类。

demo4.png

组件的识别需要反复的通过全局特征反馈来纠正,通常会采用SSD+CNN协同工作,比如下图的红色“全新“shape,这该图例中是richtext的部分,同样的shape样式可能属于button或者icon。

图例1.png

属性提取:
  这块的技术点比较杂,归纳起来需要处理3部分内容:shape轮廓, 字体属性和组件的宽高。

demo6.png
完成属性提取,基本上我们完成所有GUI信息的提取。生成的GUI DSL如下图:

demo7.png
通过这些数据我们就可以进行布局分析了。
其中文字属性的提取最为复杂,后续我们会专门介绍。

布局分析:
  前期我们采用4层LSTM网络进行训练学习,由于样本量比较小,我们改为规则实现。规则实现也比较简单,我们在第一步切图时5刀切割的顺序就是row和col。缺点是布局比较死板,需要结合RNN进行前置反馈。

0:00
/ 0:40

视频中展示的是通过4层LSTM预测布局结构的效果,UI的布局结构就像房屋的框架,建造完成后通过GUI的属性进行精装修就完成了一个UI图层的代码还原工作。

代码生成及插件化:
  机器学习本质上来说还属于概率学范畴,自动生成的代码需要非常高的还原度和100%的准确率,概率注定UI2CODE很难达到100%的准确率,所以我们需要提供一个可编辑工具,由开发者通过工具能够快速理解UI的布局结构和修改布局结构。
  我们将UI2CODE生成的DSL TREE进行代码模板化匹配,代码模板的内容由资深的flutter技术专家来定义,它代表目前我们发现的最优代码实现方案。
001.png
代码模板中会引入一些标签,由Intellij plugin来检索flutter工程中是否存在对应的自定义UIKIT,并进行替换,提高代码的复用度.
demo11.png

整个插件化工程需要提供自定义UIKIT的检索,替换和校验工作,以及DSL Tree的创建,修改,图示等工作,总体来说,更像ERP系统,花费一些时间能够做的更加完美。
002.png

小结:
  本篇我们简单介绍了UI2CODE的设计思路,我们将整个工程结构分为5个部分,其中4块内容核心处理机器视觉的问题,通过机器学习将它们链接起来。代码的线上发布是非常严格的事情,而单纯的机器学习方式,很难达到我们要求,所以我们选择以机器视觉理解为主,机器学习为辅的方式,构建整个UI2CODE工程体系。我们将持续关注AI技术,来打造一个完美的UI2CODE工具。

转载于:https://blog.51cto.com/14031893/2357945

UI2Code智能生成Flutter代码--整体设计篇相关推荐

  1. UI2CODE智能生成flutter代码--整体架构 资料下载

    云栖社区前端技术交流群直播课在昨天完美落幕啦!我们邀请的是阿里闲鱼优秀的无线开发专家[上叶]为我们做技术分享.没有看到直播的小伙伴不要遗憾,运营小编为你们准备了这篇博文,将优秀的直播课程以及PPT资料 ...

  2. UI2Code智能生成Flutter代码——版面分析篇

    开篇:   在<UI2CODE--整体设计>篇中,我们提到UI2CODE工程的第一步是版面分析,如果是白色的简单背景,我们可以像切西瓜一样,将图片信息切割为GUI元素.但是在实际生产过程中 ...

  3. UI2Code智能生成Flutter代码——机器生成代码

    背景 在<UI2CODE--整体设计>篇中,我们提到UI2Code工程的整体流程.前步图片分析之后,我们可以得到对应的DSL布局描述.利用DSL的资讯,结合IntelliJ Plugin介 ...

  4. UI2CODE智能生成代码——组件识别篇

    1.背景 在<UI2CODE--整体设计篇>中,我们介绍了UI2CODE工程的整体流程: 在组件识别这个环节,需要有一种处理布局信息的方法,来解析和计算控件间的布局关系(比如识别业务组件( ...

  5. 闲鱼Flutter互动引擎系列——整体设计篇

    什么是Candy引擎 Candy引擎是闲鱼技术团队设计开发的一款: APP嵌入式的.轻量级的.易于开发.性能稳定的互动引擎: 绘制系统高度融合Flutter体系,游戏场景和Flutter UI支持无缝 ...

  6. XMODEM设计与C代码实现(1.整体设计篇)

    1. XMODEM协议 XMODEM帧结构按照校验形式分为2种,如下表所示: 校验和校验帧结构 BYTE1 BYTE2 BYTE3 BYTE4~131 BYTE132 头标志 帧序号 ~帧序号 帧数据 ...

  7. STM32 四轴无人机的设计——代码整体设计

    1.前言 从现在开始我们要接触一个完整的工程,所以我们要对整个工程进行分析,将硬件设计.软件设计模块化,一个模块一个模块的完成,最后将各个模块融合在一起,就是我们整个工程.模块化设计是现在代码开发非常 ...

  8. 软件智能:aaas系统整体设计的内容构成和简单介绍---正文开篇 之 --重说“’得名’的’A字面指称’及其’C字里暗藏’和’B行间隐含’” 之1

    在前面的一篇<三析"中台">中,有说"'得名'的'A字面指称'及其'C字里暗藏'和'B行间隐含'". 简单的说,就是 "得名"的 ...

  9. 智能家居工厂模式整体设计框架控制设备测试

    通俗理解的步骤就是链表通用模板定义(在头文件里定义).链表的创建(头插尾插,在.C 文件里).链表的初始化(init配置管脚初始电平等).链表内容的读取(指令工厂TCP服务端读取客户端发来的指令.串口 ...

最新文章

  1. 微软:超过96%的企业用户正在测试Win10
  2. 【转】几种页面重定向代码总结
  3. 06丨MongoDB基本操作
  4. 单继承-问题的抛出-单纯封装可能会出现重复的代码
  5. sql的执行顺序(from平凡世界)
  6. python实验报告实验总结_python实验报告一
  7. Android之使用自定义华为扫描SDK扫描二维码和识别本地图片
  8. MATLAB符号运算
  9. java软件汉化工具_6款程序员必备的开源中文处理工具
  10. RabbitMQ使用教程
  11. 三校生计算机教学计划,三校生高考英语教学计划
  12. 不平衡电网电压下虚拟同步发电机VSG控制策略-实现不平衡电压下控制三相电流平衡
  13. Word隐藏回车符技巧
  14. ps还原上一步快捷键,ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么...
  15. uniapp实现简易的霍兰德职业倾向测评
  16. python离线翻译包下载_Python翻译
  17. EMQ-保留消息 概述和案例
  18. MSVCR110.dll文件找不到修复
  19. 微信公众号添加word文件
  20. [海思]--Hi3516a--添加新Sensor

热门文章

  1. 一键Ghost 脱机下载不再愁
  2. 关于ORACLE 10g中“ORA-12541:TNS:no listener”的问题解决方案
  3. ORACLE 执行计划2
  4. NULL 值处理遇到的错误问题.
  5. Android.text.TextUtils类
  6. JS系统库:预定义对象(内建对象)
  7. Linux中ELF格式 可执行文件+动态链接器 的加载
  8. mysql索引实现原理
  9. resource.arsc二进制内容解析 之 Dynamic package reference
  10. kotlin集合操作符——生产操作符