![89372aea1509e58d3e0e6b8a20bb4a75.png](https://i-blog.csdnimg.cn/blog_migrate/98d77526ac8def36a743bfb17daf7575.jpeg)
作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了 2019 双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块 79.34% 的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次 《前端代码是怎样智能生成的》 系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。
背景介绍
我们在做一些 Deisgn2Code 的时候,一种比较直接的方式是借助设计师使用的设计工具的开发插件来帮我们提取设计稿里的元数据,这样我们可以快速提取设计稿里的图像、文本、Shape 等原生元素,从而组装生成一个页面。但目前我们的开发体系里还有许多基础组件是不在设计工具体系里,比如表单、表格、开关等组件,虽然像 Sketch 这类工具提供了灵活的方式能让设计师设计出相应的 UI 类型,但是同样的 UI 所对应 Sketch 里的 DSL 描述并不是我们所期望的。此时,我们往往需要借助其他途径来获取这些组件的准确描述,通过深度学习不断学习图像中所需要识别的组件是一个比较好的方式,本文将从一个实践思路的角度来介绍如何借助算法模型来识别前端组件。
![170eb88fddad4048a4ea31c7ed6eedb6.png](https://i-blog.csdnimg.cn/blog_migrate/c90a4a43e54eecacd7fc51fcacef2b42.png)
所在分层
本文讲述前端智能化 D2C 里技术分层中的 基础组件识别 能力层,主要识别图像中可能存在预先定义的一些基础组件,从而辅助下游技术体系中对已识别的图层进行表达优化,比如优化图层嵌套结构从而产出合规的组件树,优化图层语义化的结果等。
![6a13835425c26f1a279070bafeaa9a83.png](https://i-blog.csdnimg.cn/blog_migrate/e0533d4dd23b35975ca737a2d964f832.jpeg)
整体方案
前端组件识别可以类比到传统的目标检测任务,参照以往的算法工程方案,我们的整体方案同样涉及到样本获取、样本评估、模型训练、模型评估以及模型预测一整条流程链路,下面依次介绍各步骤所做的事情。
![bf8fb037a7adb75362ca2083df0cb524.png](https://i-blog.csdnimg.cn/blog_migrate/42c9021b114538e3ba32a6b0b27c09e4.png)
样本获取 & 评估
样本集是整个模型的关键,样本的质量决定了模型质量的上限,算法模型的调优只是不断得往这个质量靠近。我们的样本可以来源于多种途径,因为目前的目标检测模型涉及到组件上下文的识别场景较少,此篇的组件识别我们选择结合业界使用量比较多的一些 UI 类库自己编码生成样本,确保编程部分对样本数据质量的保障。
在具体的样本编码开始前,我们需要对我们需要识别的组件做一个简单的分类,设定好此次分类的类目类型。在对整个样本的生成上,我们需要遵循以下几点原则:
- 数据种类丰富且均等,即每种种类数量一致,尽可能涵盖多种种类(组件属性、样式影响,组件库的样式尽量只在合理的范围内随机化通用的背景色、宽高、圆角等,泛化组件样式)
- 针对一些特定场景(比如覆盖问题),也需要构造相关的场景(图上文本、图上图遮罩等)
- 针对一些线框型的组件(比如 Input),可以在周边 Padding 几像素的空白避免模型处理学习到边缘特征
下图为编码生成的一个简单样本的 DEMO:
![5befabc1d252b0d13e37439e45693a15.png](https://i-blog.csdnimg.cn/blog_migrate/6cbb6bde47dfd652a8f6529465920464.jpeg)
在样本生成后,你可能需要对自己的样本集进行一个评估,评估过程中可以适当引入数据校验 和类目统计等相关的工程,来评估整体的样本质量:
- 检测标注数据是否存在错误:参考标注区域结合背景色计算方差等方式
- 统计所有 UI 类型的数据分布情况,每个分类的数量以及数据是否均衡等
模型选型
在目前众多的目标检测模型中,根据一份最近的 PASCAL VOC 数据集的目标检测模型报告,我们选择了一种排名第一的 YOLO One-Stage 算法作为我们基础组件模型的迁移学习,来快速进行试验。
![21128e0b61638406b28b268d42c46955.png](https://i-blog.csdnimg.cn/blog_migrate/bed4140aa5ecf3266eeb25d88c42ff1f.jpeg)
简单介绍下,YOLO 即 You Only Look Once,主要分为三个步骤:
- 将图像 Resize 到 416 * 416(v3)尺寸
- 卷积网络学习样本集里的分类特性
- 预测的时候进行非极大值抑制,筛选 Boxes
![217ee43370262e6b29d9940d3b01f29d.png](https://i-blog.csdnimg.cn/blog_migrate/8bd610da70af2ff3962e45538f857848.jpeg)
YOLO 采用一个单独的 CNN 模型来实现端到端的目标检测,相比其他的二段流(R-CNN 等)算法,YOLO 的训练和预测速度更快。它将输入的图片切分成 S * S 网格,然后让每个单元格负责去检测中心点落在各个单元格中的目标,每个单元格会预测所在目标的边界框(bounding box)以及边界框的置信度(confidence score),置信度包含边界框内含目标的可能性大小以及边界框的准确度。最后将各个单元格预测的结果做整合得到最终的预测结果。YOLO 相关的其他更多设计细节,感兴趣的同学可以访问 yolo 官网来了解。
![a824a0b5c923b4e704f7103468596fd6.png](https://i-blog.csdnimg.cn/blog_migrate/c59446cfd167ec76ac36787de6b0c033.jpeg)
我们在做 Web 里的基础组件的目标检测时,期望卷积网络在相应的单元格中能够学习到其中每一类组件的特征,从而能够识别并区分出不同组件之间的差异,因此在对组件样本的选取上,要保障组件之间的特性差异,避免卷积网络丢失这部分的学习。
模型评估
在模型选型结束使用我们准备的样本完成训练后,我们可以对训练生成的模型做一个简单的评估,我们选择使用均值平均精度 mAP 来进行衡量模型的准确率(基于 COCO 的算法)。可以选择部分测试集数据的模型预测结果,对结果数据跟数据的真实值(Ground Truth)进行比较,从而计算出每个分类的 AP。
![a6bfdc6aa4dc7e104cb7bd10b490a82e.png](https://i-blog.csdnimg.cn/blog_migrate/7024aabe01709dc55aa67d3e6fc6c0e5.jpeg)
此处可以选择 IoU 超过 0.5 的对所有分类进行一个简单的制图比较,可以观察到目前对于小目标的识别检测(部分文本元素影响因素较大)精度较差,后续在样本的处理上可以进一步对此类小目标结合规则部分的预处理做检测加强。
![f4425838bc9a5ecd9fbcc4139cf29f7c.png](https://i-blog.csdnimg.cn/blog_migrate/6061dec3133b81814cda25424cccf6a1.jpeg)
模型预测处理
因为模型的迁移学习上我们选用了 yolo3,在对图像做处理时都会将图像预处理成 416 * 416 的尺寸做训练学习,为了在模型预测的时候结合训练数据得到更好的效果,我们可以在预测阶段的前置过程中也可将输入的图像做一定尺寸的适配,经测试适配后的图像预测后的 IoU 比未经适配的图像预测后的 IoU 高出很多(测试集显示有 10%+ 的提升)。
图像尺寸适配后,我们训练完的模型会对输入的图像直接做预测,此时会得到一个大致的类别区域框,但往往我们需要一个围绕 UI 组件的更加精确的框,此时我们可以借助 OpenCV 的能力结合图像本身做一个梯度裁边 Refine 以达到一个更精确的效果,如下图是边框 Refine 前后的对比。
![45138d4e32e9d096b28ad130cb3e5201.png](https://i-blog.csdnimg.cn/blog_migrate/ac547eeac7a250b48ffa9e3cc8cc5d94.jpeg)
总结
目前 imgcook 内部支持的基础组件包含 20+ 种类,后续将继续在样本精细化的分类以及基础组件的属性测量表达上做进一步的投入研发,并将模型的数据样本管理规范化,统一做输出。未来用户可以根据我们面向外部开源的样本集对部分基础组件识别后做特定的表达处理。