UI2CODE系列文章 如何批量製造高質量樣本

2021-09-25 23:33:55 字數 2572 閱讀 4857

在 ui2code 專案中,我們大量使用了深度學習方法來做一些物體檢測。而深度學習模型的訓練,避免不了需要大量的樣本,因此如何製造大量樣本,來滿足模型訓練需要是我們必須要解決的乙個問題。在這篇文章中,我們將介紹我們如何利用工具,批量泛化出大量樣本,為模型訓練提供資料保障。

標註成本高:物體檢測的樣本標註,不僅需要標註物體的類別,更需要標註出物體的具體位置,而乙個樣本上會存在多個物體標註。因此,這類樣本打標成本非常大。

獲取樣本,主要有幾種途徑。

對於真實樣本,這類質量是最高的,要想訓練出效果很好的模型,這類樣本基本是必不可少的,但是由於這類樣本數量少,成本高,因此還需要其他方法來補充樣本量。

對於資料增廣,這種方法簡單快速,但是效果也有限,特別是對於我們 ui2code 裡識別控制項這個任務來說,做旋轉等操作基本是無效的。

在這裡,我們介紹如何利用 weex 頁面,來批量泛化樣本,並且得到樣本標註的方法。

之所以選擇使用前端頁面來生成樣本,是因為前端頁面更多的是做一些資料展示,並且其擁有完整的 dom 樹,只要我們拿著dom樹就可以解析出裡面的各個元素。

對於節點內容,只要我們改變元素內容即可。這樣我們就可以由乙個前端頁面很方便地泛化出不同文字、不同的多個樣本。

我們需要的基礎控制項的分類有「文字」、「」、「shape」這三類,對於乙個頁面來說,我們的文字和內容基本都是可替換的,因此我們解析出所有節點以後,對裡面的文字和進行替換,再進行渲染就可以得到新的樣本。

要想得到weex頁面,需要有乙個渲染容器,並且我們可以很方便地修改其內容。這裡,我們選擇了google的puppeteer,它是google推出的可以執行 chrome headless 環境以及對其進行操控的js介面套裝。通過它,我們可以模擬乙個chrome執行環境,並且進行操控。官方簡介在這裡.

首先啟動乙個不帶介面的瀏覽器:

const browser = await puppeteer.launch();
啟動乙個頁面,然後開啟乙個**:

const page = await browser.newpage();

await page.goto(nowurls, );

模擬iphone6環境:

await page.emulate(

});

搜尋所需控制項:

let d_root = document.queryselectorall('.weex-root');

let nodes_root = ;

collectchildren(d_root, nodes_root);

/*** 遍歷節點,蒐集所有需要的控制項

*/function collectchildren(d, _nodes)

if(d[i].style)

}if(d[i].haschildnodes())else

if(_classname && !haspushed)}}

}return _nodes;

}

獲取控制項資訊:

/**

* 獲取 基礎檢視元素的屬性

*/function getrealystyle(node,attrkey)else

}/**

* 獲取 基礎檢視元素的位置

*/function getviewposition(node) = node.getboundingclientrect();

return

}

獲取頁面:

await page.screenshot();
清理資料:部分頁面會存在彈窗的情況(mask圖層),而我們的標註規則是希望只標註上面的圖層,因此還需要根據mask圖層的位置和大小,過濾掉底下圖層裡的控制項。

通過上述方法,我們就能得到各個文字、、shape以及他們的位置和屬性等。基於位置和控制項類別資訊,我們就能夠得到帶有位置和類別標註的樣本。

通過上面的方法,只要提供乙個weex頁面的url,就可以獲取到乙個帶有標註的真實樣本,後面我們只要修改裡面文字和節點的內容,就可以批量泛化出多個樣本。這些樣本基於真實的頁面布局,質量相對較高,並且可以隨意控制泛化比例,比如設定 1:10,就可以有100分樣本生成出10000份,大大提高了樣本量。

通過weex泛化樣本的方法,我們由100多個weex活動頁,泛化出10000+個樣本,並且無需手動打標,節省了大量的打標成本。且由於樣本質量相對較高,模型的準確率得到了很大的提公升。當然,我們也探索了很多其它方法,包括抓取android執行時的頁面資料來生成自動打標的資料,以及利用已訓練模型自動預打標來節省手動打標的人力成本等,未來我們還會繼續探索更多的樣本生成及自動打標方法,為模型訓練提供更多有用資料。

StringGrid系列文章2

在string的灰色單元中寫的字能夠分成兩行 stringgrid控制項如何連線按鈕控制項 mouse在tstringgrid外單擊時,tstringgrid如何得到通知 如何在stringgrid當前行第一列也像dbgrid樣標出箭頭呢 如何在delphi 的stringgrid 控制項的 cel...

NLog文章系列 如何優化日誌效能

翻譯 crazycoder 由衷感謝他的熱心!原文 更多關於nlog的中文文章,請參考 nlog文章系列 概述 日誌的記錄有時也要化為頗為可觀的時間。本文的目的就是揭開日誌記錄的內部機理並提供一些有用的技巧幫助使用者優化日誌記錄的效能。日誌記錄過程分析 每條日誌資訊的記錄都需要經過一系列的步驟才能完...

快取系列文章 2 是否真的需要快取?

一 快取的成本和收益是什麼 既然要討論是否真的需要快取這個問題,就要知道快取帶來的成本與收益 好處 壞處 是什麼?收益成本 快取 後端儲存 資源 1.加速讀寫 2.降低後端負載 1.資料不一致性 2.維護成本 3.架構複雜度 上面的 應該清楚的表達了使用快取後的收益和成本分別是什麼。下面將進行詳細的...