前端如何快速训练一个表单识别模型?

avatar
阿里巴巴 前端委员会智能化小组 @阿里巴巴

文 / 阿里淘系 F(x) Team - 天可
注:目前 pipcook 2.0 已发布,请翻阅 20秒完成机器学习模型训练和部署? 说说 Pipcook 2.0

本文将使用 Pipcook 1.0 版本快速训练一个表单识别模型,并用该模型去提升表单的开发效率。

痛点

在前端还原页面的过程中,会遇到这样一个痛点:设计师在设计稿里画了一个表单,你去 AntD 或者 Fusion 库里找了一个差不多的表单,把代码拷贝过来改改。这样不仅效率低,而且很麻烦


那么能不能快捷一点,截图就可以生成表单代码呢?答案是 Yes。

解法

我们可以训练一个目标检测模型,模型输入是表单截图,输出是所有表单项的类型和坐标。这样只需要将设计稿中的表单截图,就可以拿到它里面所有的表单项,配合文字识别出的 Label,就可以生成表单代码了。比如,笔者之前就实现了这样的功能:截图生成表单代码。


图中的红框是目标检测模型检测出的表单项,绿框是文字识别接口识别出的文字。两者结合,经过一些计算,就可以生成表单协议或者代码了。

文字识别是通用的,我们就不介绍了。那么表单项检测功能是怎么做出来的呢?下面就是总体步骤:

  • 样本:收集成千上万张表单图片,并对里面的表单项进行打标。
  • 训练:将样本喂给机器去学习。
  • 预测:训练好之后,将一张新的表单图片传给模型,模型就可以预测出标签了。

下面会详细介绍每一步怎么做。

样本

这里的表单识别样本是通用的目标检测样本,打标方法请参考前面的章节。为了方便,这里为大家提供一份表单识别样本数据集。

http://ai-sample.oss-cn-hangzhou.aliyuncs.com/pipcook/datasets/mid/mid_base.zip

训练

接下来我会演示,如何使用 Pipcook 运行样本页生成海量样本,并进行目标检测模型训练。 ​

介绍下Pipcook

Pipcook 是淘系技术部 D2C 团队研发的一款面向前端开发者的机器学习应用框架,我们希望 Pipcook 能成为前端人员学习和实践机器学习的一个平台,从而推进前端智能化。 Pipcook( github.com/alibaba/pip… ) 是个开源的框架,欢迎大家一起来共建。 ​

安装

确保你的 node 在 12 版本及以上。然后执行:

// 同时安装 cnpm 主要是为了加速
npm i @pipcook/pipcook-cli cnpm -g --registry=https://registry.npm.taobao.org

接下来初始化:

pipcook init --tuna -c cnpm 
pipcook daemon start

配置

表单识别就是个目标检测任务,那么你可以新建一个这样的配置文件,格式是个json文件。不用担心,这个配置文件大多参数都不需要改,只需要修改极少数参数即可。 ​

form.json

{
  "plugins": {
    "dataCollect": {
      "package": "@pipcook/plugins-object-detection-pascalvoc-data-collect",
      "params": {
        "url": "http://ai-sample.oss-cn-hangzhou.aliyuncs.com/pipcook/datasets/mid/mid_base.zip"
      }
    },
    "dataAccess": {
      "package": "@pipcook/plugins-coco-data-access"
    },
    "modelDefine": {
      "package": "@pipcook/plugins-detectron-fasterrcnn-model-define"
    },
    "modelTrain": {
      "package": "@pipcook/plugins-detectron-model-train",
      "params": {
        "steps": 20000
      }
    },
    "modelEvaluate": {
      "package": "@pipcook/plugins-detectron-model-evaluate"
    }
  }
}

需要设置一下 dataCollect.params 里的参数:

  • url:你的样本地址。

当然你也可以直接运行这个配置文件,可以训练出一个表单检测模型。

运行

由于目标检测模型计算量巨大,所以你可能需要一个 GPU 机器,否则训练时间将会是好几周……

pipcook run form.json --tuna

训练时间可能有点长,去吃个午饭或者去写点业务代码吧!

训练完成后,会生成一个模型在 output 目录里。

预测

训练完成后,会在当前目录生成 output,这是一个全新的 npm 包,那么我们首先安装依赖:

cd output
// BOA_TUNA=1 主要是为了国内加速
BOA_TUNA=1 npm install

安装好环境之后,回到根目录,并下载一张测试图片为 test.jpg

cd ..

curl https://img.alicdn.com/tfs/TB1bWO6b7Y2gK0jSZFgXXc5OFXa-1570-522.jpg --output test.jpg

最后我们就可以开始预测了:

const predict = require('./output');
(async () => {
  const v1 = await predict('./test.jpg');
  console.log(v1); 
  // {
  //   boxes: [
  //   	[83, 31, 146, 71],  // xmin, ymin, xmax, ymax
  //     [210, 48, 256, 78],
  //     [403, 30, 653, 72],
  //     [717, 41, 966, 83]
  //   ],
  //   classes: [
  //   	0, 1, 2, 2  // class index
  //   ],
  //   scores: [
  //   	0.95, 0.93, 0.96, 0.99 // scores
  //   ]
  // }
})();

注意,给出的结果包含三个部分:

  • boxes: 此属性是一个数组,每个元素是另一个包含四个元素的数组,分别是 xmin, xmax, ymin, ymax
  • scores:此属性是一个数组,每个元素是对应的预测结果的置信度
  • classes:此属性是一个数组,每个元素是对应的预测出来的类别

可视化后的 boxes、scores、classes:




淘系前端-F-x-Team 开通微博 啦!(微博登录后可见)
除文章外还有更多的团队内容等你解锁🔓