Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
在上一篇文章詳解阿里99大促活動頁內容識別技術實現,我們介紹了在淘寶99大促中,我們使用了怎樣的算法模型去識別并完成自動化測試的。
迫切解決的樣本問題
淘寶大促有近百個模塊、上千個頁面,模塊間具有相似性,并且模塊內部具備多種狀態,如果想要準確識別每個模塊類型,單模塊的樣本數量至少要達到萬級,而人工標注成本高、效率低下、數據量少,純靠人力是無法滿足模型訴求的。基于此,今天,我來介紹下,模型識別背后的大批量數據樣本生成的技術方案。
總體技術方案如下:
模型的樣本要求
算法模型識別的輸入是99大促的各個會場截圖,輸出是目標模塊名稱及其在截圖中的坐標位置。
模型訓練時,就是把模塊渲染圖、相應坐標位置與模塊類型輸入給模型,交給模型去進行監督學習。而模型需要的,就是各個模塊大批量的圖片樣本。
一個模塊,是由View和ViewModel組合而成,而View是固定的,ViewModel跟隨會場場景不同,是動態變化的。
那么,如果我們能拿到描述模塊的View的這一層DSL,輔助以動態的ViewModel數據,再把View和ViewModel渲染成圖片,那我們就可以生成無窮無盡的樣本數據了。
DSL描述View
仔細梳理之后,View拆分為原子級元素(Text、Image、Shape)和原子級元素的組合關系(Group),即與HTML DOM樹狀結構中的各層級容器嵌套與葉子節點類型是同樣的邏輯。
基于節點類型和節點樣式的DSL,我們就能描述一個完整的View了。
{ "layers": [{ "frame": { "y": 354, "x": 44, "height": 32, "width": 312 }, "id": 2, "type": "text", "value": "Adidas Stan Smith", "textStyles": { "fontFamily": "Helvetica, sans-serif", "fontSize": 24 } }, { "frame": { "y": 0, "x": 384, "height": 342, "width": 342 }, "id": 3, "type": "image", "value": "http://img.alicdn.com/bao/uploaded/i1/TB1.mcuNpXXXXctXFXXSutbFXXX.jpg_350x350Q50s50.jpg_.webp", "styles": { "height": 342, "width": 342 } }, { "frame": { "y": 0, "x": 384, "height": 342, "width": 342 }, "id": 4, "type": "shape", "styles": { "height": 342, "width": 342, "backgroundColor": "rgba(0, 0, 0, 0.1)" } }], "frame": { "y": 0, "x": 0, "height": 4920, "width": 750 }, "id": 1, "type": "group", "moduleName": "pmod-zebra-recommand-item" }
其中,除了節點類型和節點樣式之外,最外層的moduleName代表模塊名稱,id是為了標記每一個子元素,frame是每個子元素的坐標位置、輔助算法模型識別模塊內部子元素,value值只有text和image才有,對應相應的文本值還有圖片鏈接。
獲取模塊View的DSL
有3種方案可以獲取到模塊View的DSL,分別是:
1、從代碼倉庫中獲取;
2、從sketch視覺稿中生成;
3、從瀏覽器渲染好的頁面中獲取。
我最后選擇了第三種方案,放棄第一個方案是因為代碼寫法千差萬別,很多展現邏輯還包含在js代碼中,并且還要處理各種for循環子View、style的映射關系等等,復雜度太高。第二個方案目前集團內已有技術方案imgcook,這一塊的準確率聽說還不錯,并且一直在持續優化,而最終選擇第三個方案的原因是,能100%準確地還原模塊DSL,并且只需要關注模塊最終展現給用戶時候的形態,不需要理會過程中開發者做得各種復雜業務邏輯,復雜度相對低很多。
技術方案
在開發流程上,每個模塊在開發完成后,都會有對應的模塊預覽頁面。我使用了puppeteer模擬真實瀏覽器,對模塊的節點信息進行提取,并保存為規范的DSL。
清洗window.getComputedStyle
通過window.getComputedStyle獲取DOM節點的樣式,會返回包含280個樣式屬性的對象,如果把每個DOM節點的所有280個樣式屬性都存儲到DSL中,會造成兩個問題:
1、DSL文件冗余,且文件大小過大,解析耗時;
2、增加算法同學對DSL的理解和調整成本。
第一步,隱藏默認屬性值;
大部分的樣式屬性都是默認值,我們首先把默認的樣式屬性剔除出去。
{ alignSelf: 'auto', ... }
第二步,剔除無效屬性;
開發者常用的樣式屬性在20個左右,有很多的樣式是不具備實際效用的,把無效用的樣式屬性剔除掉,比如說:
{ zoom: '1', writingMode: 'horizontal-tb', ... }
第三步,transform動態計算
通過getComputedStyle拿到的transform屬性值是一個矩陣方法matrix(),感興趣的同學可以戳這里理解下2D轉換矩陣。我們使用puppeteer模擬瀏覽器設置的屏幕寬度是750,也就是說,得到的transform值中translateX和translateY兩個值是以750為基準換算得到的一個數字,假如想要在下面描述到的將DSL渲染成圖時(算法同學期望能模擬各種各樣的屏幕尺寸去生成樣本),就必須將獲取到的transform值換算成相應屏幕設備時的值。
# 為了方便算法同學更好使用DSL渲染成圖的工具,這里使用python來實現 # screenshotShape是一個數組,代表屏幕寬高 [width, height] if 'transform' in style and 'matrix' in style['transform']: matrix = style['transform'][7:-1].split(',') translate = list(map(float, matrix[-2:])) translateResult = list(map(str, [distance*(screenshotShape[0]/750) for distance in translate])) matrix[-2:] = translateResult
通過以上3個步驟,最終得到的DOM節點樣式屬性個數一般維持在20個以內,能使輸出的DSL精簡非常多。
DSL渲染成圖片
同樣的,我們能基于puppeteer去對頁面做操作,也能使用它去把DSL渲染成目標模塊頁面,并截圖。
首先,建立DSL與HTML標簽的映射關系
其次,如果是DSL類型為Group,就遞歸遍歷里面的所有子元素,以此類推。
完整的渲染流程圖如下:
ViewModel動態數據
一個模塊,應用到99大促、雙十一等各種會場,背后樣式都是一致的,只有對應的數據不同,動態的數據一般是商品圖片和商品信息。
閑魚有一億多的商品數據,如果把這商品數據拿過來與View一起渲染成模塊,每個模塊就有了成千上萬種展現形態,且貼合算法模型實際識別過程中的輸入,既能滿足樣本數量的要求,也能符合模型實際識別的場景,使模型準確率獲得更大地提升。
效果
通過這樣一條生成樣本的通道,每個模塊都能夠提供給算法同學幾萬張質量很高的樣本截圖,使模型的準確率達到98%以上。
未來
上述文章描述了如何批量生成樣本來幫助解決算法模型對99大促和雙十一會場中各個模塊的識別。
目前,對模塊DSL的動態調整依賴算法同學對模塊的理解,eg.改變圓角borderRadius生成更多正向樣本,或者增加噪聲,eg.刪除商品內容節點等生成負向樣本,這些操作都需要算法同學對DSL進行定制化配置。在未來,我們希望嘗試把這部分的工作也交給模型去處理,讓模型對樣本生成做決策,調整DSL的局部,并生成樣式更加豐富和可靠的樣本。
作者:閑魚技術-云聽
里國際運營篇:阿里國際站的培訓課程中都可以看到內頁首部再次輸入標題,并且對其使用<h2>標簽,以此強調標題,提高排名權重的說法,那么這種看似神奇的操作是否行之有效呢?這篇文章從SEO的角度入手,解析一下<h2>的作用和用法。
培訓講解的<h2>標簽用法:
目前看到的培訓課程的說法是產品詳情頁的第一行或首部復制粘貼一遍標題,切換到HTML代碼模式,給標題插入<h2>標簽如:<h2>你的標題</h2>,目的是強調標題,提高搜索權重,以此提高排名
分析:
插入方式:<h2>標簽用于文章的每一個分段文字的子標題,用于描述該段落的核心意思,一篇文章可以出現多次<h2>標簽,分塊描述不同的段落。所以SEO角度上看將產品標題再次復制加上<h2>的做法并不對爬蟲方式:產品的標題已定義于<title>標簽內,爬蟲蜘蛛爬取過一遍<title>標簽后,已獲取文章標題和文章核心內容;進而深入爬取<h2>標簽,意圖獲取不同文本段落的子標題,卻再次在<h2>標簽內爬取到和標題一模一樣的內容,細致化一點來說這是內容堆砌,二次復制,對搜索引擎不友好阿里排名:官方規則文本上未看到<h2>標簽有利于阿里搜索引擎爬取的明文,同時根據已知的阿里索引的方式為標題和屬性這兩個部分,內頁詳情頁文本對排名沒有影響(測試過內頁填入自創的關鍵詞,搜索0結果,無法排序)
結論:
從SEO角度看,<h2>標簽對頁面不同部分的重要性和內容解釋性是有幫助,但是對Google排名的輔助作用是越來越小。相反頁面的載入速度對排名的影響是越來越大(可以參考圖片優化文章,優化圖片大小,降低圖片容量:https://www.losvincent.com/no-visitors.html)國際站這種二三級URL的產品頁面,能夠參與上google排名的可能性比獨立站的首頁頁面(權重一般相對站內是最高)更小,個人搜索測試除非小競爭的長尾詞下,大多數詞基本較難有排名,所以阿里國際站的產品詳情頁在Google能產生排名的概率,可以相對忽略不計因此目前設置<h2>的方式,從SEO角度看是不對勁的寫法;從Google排名效果看等于0
那么<H2>標簽的正確用法是什么呢?
國外SEOer的解釋是:H2 is for subheadings of that H1. Use it to divide content into scannable blocks; both Google and your visitor will like it. H3 is for subheadings of that H2
也就是說,<h2>標簽和大學寫論文一樣,是定義每個段落或模塊的子標題,或者說二級標題。因此從SEO角度看,目前國際站流行的<h2>標簽用法是不太對勁的。下圖是標配的正確用法:
正規的寫法如下:
My h1 = <h1>H1, H2 and H3 Header Tags for SEO</h1>My h2 = <h2>Why are h1, h2 and h3 header tags important for SEO?</h2>My h3 = <h3>How to use the h1, h2 and h3 tags</h3>
<h2>標簽可以出現多次,分別是對不同文章段落的概述
根據對國外客戶網站的觀察,發現如下現象:
<h1>標簽被使用的概率小或者直接沒有使用,這是因為一個頁面最多建議出現一個<h1>標簽,一般為標題或者最重要的核心文本部分,不過可能被濫用,Google似乎對<h1>標簽有點禁忌<h2>標簽出現在文章內容的不同段落作為段落子標題,或者出現在一些欄目等重要節點(如網站導航欄)
那么阿里國際站如何使用呢?
以2018 new design mobile phone case這個標題舉例,寫法方式為:
2018 new design mobile phone case(產品發布時填寫的標題)
<h2>details of phone case</h2>
一段手機殼參數,性能描述的段落
<h2>生產工藝 of phone case</h2>
一段手機殼工藝流程的段落
<h2>支持型號of phone case</h2>
一段講支持型號的的段落
面就是總結HTML5<meat>的標簽:
<h2>一些常用的移動端的meta屬性設置</h2> <!DOCTYPE html> <!-- 使用 HTML5 doctype,不區分大小寫 --> <html lang="zh-cmn-Hans"> <!-- 更加標準的 lang 屬性寫法 http://zhi.hu/XyIa --> <head> <!-- 聲明文檔使用的字符編碼 --> <meta charset='utf-8'> <!-- 優先使用 IE 最新版本和 Chrome --> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <!-- 頁面描述 --> <meta name="description" content="不超過150個字符"/> <!-- 頁面關鍵詞 --> <meta name="keywords" content=""/> <!-- 網頁作者 --> <meta name="author" content="name, email@gmail.com"/> <!-- 搜索引擎抓取 --> <meta name="robots" content="index,follow"/> <!-- 為移動設備添加 viewport --> <meta name="viewport" content="initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no"> <!-- `width=device-width` 會導致 iPhone 5 添加到主屏后以 WebApp 全屏模式打開頁面時出現黑邊 http://bigc.at/ios-webapp-viewport-meta.orz --> <!-- iOS 設備 begin --> <meta name="apple-mobile-web-app-title" content="標題"> <!-- 添加到主屏后的標題(iOS 6 新增) --> <meta name="apple-mobile-web-app-capable" content="yes"/> <!-- 是否啟用 WebApp 全屏模式,刪除蘋果默認的工具欄和菜單欄 --> <meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL"> <!-- 添加智能 App 廣告條 Smart App Banner(iOS 6+ Safari) --> <meta name="apple-mobile-web-app-status-bar-style" content="black"/> <!-- 設置蘋果工具欄顏色 --> <meta name="format-detection" content="telphone=no, email=no"/> <!-- 忽略頁面中的數字識別為電話,忽略email識別 --> <!-- 啟用360瀏覽器的極速模式(webkit) --> <meta name="renderer" content="webkit"> <!-- 避免IE使用兼容模式 --> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- 不讓百度轉碼 --> <meta http-equiv="Cache-Control" content="no-siteapp" /> <!-- 針對手持設備優化,主要是針對一些老的不識別viewport的瀏覽器,比如黑莓 --> <meta name="HandheldFriendly" content="true"> <!-- 微軟的老式瀏覽器 --> <meta name="MobileOptimized" content="320"> <!-- uc強制豎屏 --> <meta name="screen-orientation" content="portrait"> <!-- QQ強制豎屏 --> <meta name="x5-orientation" content="portrait"> <!-- UC強制全屏 --> <meta name="full-screen" content="yes"> <!-- QQ強制全屏 --> <meta name="x5-fullscreen" content="true"> <!-- UC應用模式 --> <meta name="browsermode" content="application"> <!-- QQ應用模式 --> <meta name="x5-page-mode" content="app"> <!-- windows phone 點擊無高光 --> <meta name="msapplication-tap-highlight" content="no"> <!-- iOS 圖標 begin --> <link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-57x57-precomposed.png"/> <!-- iPhone 和 iTouch,默認 57x57 像素,必須有 --> <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/apple-touch-icon-114x114-precomposed.png"/> <!-- Retina iPhone 和 Retina iTouch,114x114 像素,可以沒有,但推薦有 --> <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144x144-precomposed.png"/> <!-- Retina iPad,144x144 像素,可以沒有,但推薦有 --> <!-- iOS 圖標 end --> <!-- iOS 啟動畫面 begin --> <link rel="apple-touch-startup-image" sizes="768x1004" href="/splash-screen-768x1004.png"/> <!-- iPad 豎屏 768 x 1004(標準分辨率) --> <link rel="apple-touch-startup-image" sizes="1536x2008" href="/splash-screen-1536x2008.png"/> <!-- iPad 豎屏 1536x2008(Retina) --> <link rel="apple-touch-startup-image" sizes="1024x748" href="/Default-Portrait-1024x748.png"/> <!-- iPad 橫屏 1024x748(標準分辨率) --> <link rel="apple-touch-startup-image" sizes="2048x1496" href="/splash-screen-2048x1496.png"/> <!-- iPad 橫屏 2048x1496(Retina) --> <link rel="apple-touch-startup-image" href="/splash-screen-320x480.png"/> <!-- iPhone/iPod Touch 豎屏 320x480 (標準分辨率) --> <link rel="apple-touch-startup-image" sizes="640x960" href="/splash-screen-640x960.png"/> <!-- iPhone/iPod Touch 豎屏 640x960 (Retina) --> <link rel="apple-touch-startup-image" sizes="640x1136" href="/splash-screen-640x1136.png"/> <!-- iPhone 5/iPod Touch 5 豎屏 640x1136 (Retina) --> <!-- iOS 啟動畫面 end --> <!-- iOS 設備 end --> <meta name="msapplication-TileColor" content="#000"/> <!-- Windows 8 磁貼顏色 --> <meta name="msapplication-TileImage" content="icon.png"/> <!-- Windows 8 磁貼圖標 --> <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/> <!-- 添加 RSS 訂閱 --> <link rel="shortcut icon" type="image/ico" href="/favicon.ico"/> <!-- 添加 favicon icon --> <!-- sns 社交標簽 begin --> <!-- 參考微博API --> <meta property="og:type" content="類型" /> <meta property="og:url" content="URL地址" /> <meta property="og:title" content="標題" /> <meta property="og:image" content="圖片" /> <meta property="og:description" content="描述" /> <!-- sns 社交標簽 end --> <title>標題</title> </head
下面是小編整理的一整套系統的前端學習教程,關注小編頭條號,私信【前端】即可免費領取!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。