文 / 阿里淘系 F(x) Team - 天可javascript
本文將使用 Pipcook 快速訓練一個表單識別模型,並用該模型去提高表單的開發效率。前端
在前端還原頁面的過程當中,會遇到這樣一個痛點:設計師在設計稿裏畫了一個表單,你去 AntD 或者 Fusion 庫裏找了一個差很少的表單,把代碼拷貝過來改改。這樣不只效率低,並且很麻煩。java
那麼能不能快捷一點,截圖就能夠生成表單代碼呢?答案是 Yes。node
咱們能夠訓練一個目標檢測模型,模型輸入是表單截圖,輸出是全部表單項的類型和座標。這樣只須要將設計稿中的表單截圖,就能夠拿到它裏面全部的表單項,配合文字識別出的 Label,就能夠生成表單代碼了。好比,筆者以前就實現了這樣的功能:截圖生成表單代碼。git
圖中的紅框是目標檢測模型檢測出的表單項,綠框是文字識別接口識別出的文字。二者結合,通過一些計算,就能夠生成表單協議或者代碼了。github
文字識別是通用的,咱們就不介紹了。那麼表單項檢測功能是怎麼作出來的呢?下面就是整體步驟:npm
下面會詳細介紹每一步怎麼作。json
這裏的表單識別樣本是通用的目標檢測樣本,打標方法請參考前面的章節。爲了方便,這裏爲你們提供一份表單識別樣本數據集。數組
http://ai-sample.oss-cn-hangzhou.aliyuncs.com/pipcook/datasets/mid/mid_base.zip
複製代碼
接下來我會演示,如何使用 Pipcook 運行樣本頁生成海量樣本,並進行目標檢測模型訓練。 bash
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文件。不用擔憂,這個配置文件大多參數都不須要改,只須要修改極少數參數便可。
{
"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、scores、classes: