在《UI2CODE——總體設計篇》中,咱們介紹了UI2CODE工程的總體流程:算法
在組件識別這個環節,須要有一種處理佈局信息的方法,來解析和計算控件間的佈局關係(好比識別業務組件(BI組件)和查找重複佈局),以此來提升最終代碼的可用性。數組
在這篇文章,咱們將介紹一種佈局信息的結構化方法:「連線法」,以及一種佈局間的計算和比較方法: 「引導連線法」。數據結構
首先來看咱們須要解決的問題:佈局
業務組件是指某些特定的卡片,好比一個商品詳情卡片,這些卡片會在不一樣頁面出現,而這些卡片的代碼通常是已經存在的。咱們在拿到一張圖片的時候,須要先識別出這些組件,這樣這一區塊就能複用已有的組件代碼,而不會形成不少冗餘的一次性代碼。學習
若是把尋找業務組件這個問題當作從一張大圖片上尋找小圖片的話,那麼最直接的作法就是用一個物體檢測模型(好比SSD)來作,這樣只要訓練模型來識別每一個業務組件的圖片就能夠了。所以咱們嘗試了用訓練SSD模型來解決這個問題。測試
通過訓練和測試之後,咱們發現用物體檢測模型來解這個問題的弊端:優化
既然前面已經解析出了各個控件的信息(包含類型以及位置等),那麼咱們是否能夠直接利用這些信息來作處理呢?所以咱們想要尋找一種新的方式,來處理和解析控件信息,利用這些信息來實現相似「物體檢測」功能spa
如上圖這個case,對於相似「GridView」的這種佈局,咱們理想的佈局方式應該是有8個Item,每一個Item包含一個TextView和ImageView(上圖左邊)。設計
然而實際狀況是,咱們沒有作重複佈局的檢測,所以佈局的時候變成了4行(上圖右邊)。3d
爲了解決上面的問題,咱們就須要尋找一種方法,從多個控件信息中,找到一些規律,自動找到這些具備類似狀況的佈局。
以上就是咱們須要解決的兩個問題,咱們分析這兩個問題,會發現他們有一些共同點:
首先咱們須要將非結構化數據轉換爲結構化數據(或者叫特徵提取),這個思路能夠參考圖片分類任務的作法,不論是聚類算法仍是AI模型,都是先作特徵提取,再進行進一步處理,實際上作的就是非結構化數據轉換成結構化數據。
所以,咱們的問題解決思路也就分爲兩步:
爲了分析控件間的關係,咱們能夠先從簡單的開始,看一下兩個控件之間的關係都包含哪些信息。
兩個控件間的關係,包含如下2個方面的信息:
對於控件屬性,能夠直接用它自身表示,包含控件類型、內容、位置、大小等
對於兩個控件的方向和距離,咱們能夠用一條虛擬的「連線」來表示,這條連線鏈接兩個控件的中心點。這樣,這條連線的長度和角度就能夠表示兩個控件的方向和距離。好比上圖,咱們能夠獲得:一個TextView在一個ImageView正上方,距離xxx像素。
可是除了角度和方向,實際上還存在着一個「對齊方式」信息。
好比上圖這個case,若是咱們仍是鏈接兩個控件的中心點的話(圖中藍色虛線),那這左右兩邊的圖就是指不一樣的佈局(由於兩個控件的角度和距離都不同)。
可是由咱們人「肉眼」來看,咱們會認爲這兩個佈局是同樣的,都是左邊一個頭像,右邊上面跟着一個文本。
所以,咱們須要鏈接TextView的「左邊中點」(圖上紅色實線),這樣,不一樣的鏈接點位置,就能夠表達不一樣的對齊方式。左對齊的TextView鏈接左邊中點,右對齊的TextView鏈接右邊中點,居中的鏈接中心點。
有了上面的分析,咱們就能夠定義一個數據結構。咱們用一個Connection對象表達2個控件間的佈局關係,它包含:
這樣,2個Connection之間就能夠進行比較、判斷是否「匹配」
兩個Connection之間是否「匹配」,必須知足:
兩個控件間的關係能夠用一個Connection來表示,那麼多個控件組成的大布局,就能夠用一組Connection來表示。
咱們對每兩個控件創建一個Connection,就能夠獲得一個Connection數組
這樣,咱們的第一步「佈局信息結構化」就完成了。
將佈局信息轉換成Connection數組之後,咱們就能夠開始利用這些信息來查找類似佈局。
首先,咱們能夠理解這樣一個概念,就是:
一個佈局,能夠當作由一組Connection對象串聯起來,獲得的一個「路徑」
如上圖,藍色圈內的佈局能夠當作一組Connection串聯起來(紅色連線)。
那麼,尋找類似佈局,就是尋找兩條類似「路徑」的過程
爲了尋找類似路徑,咱們定義了一個「引導連線法」。
所謂「引導連線法」,就是一個 Leader,一個 Follower,Follower 嘗試着跟隨 Leader 走出一條同樣的路徑。
步驟以下:
有告終構化的方法和「引導連線法」,咱們就能夠應用到上述兩個問題。
應用這套算法之後,擴展要識別的組件變得很是簡單,只要把新組件的的結構化數據預先計算好存儲起來,在查找的時候應用」引導連線法「便可。
查找重複佈局步驟以下:
這樣,最終咱們就能夠找到,圖上有8個佈局類似的Item。
應用這套算法,能夠查找出頁面上任意的重複佈局,不管是簡單的仍是複雜的,極大得提高了代碼的可用性。
以上就是咱們針對佈局信息的處理和計算的總體思路。固然其中還有不少複雜細節須要處理,好比類似佈局類似度計算、重複佈局多個「pair」組合起來的時候組合條件的判斷、重複佈局其它額外信息的提取等。可是整體上都是圍繞着「佈局信息結構化」和「引導連線法展開」,咱們也在不斷的繼續探尋和持續優化各個環節。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。