劉文豪 姜勝明
(上海海事大學信息工程學院 上海 201306)
新零售[1]是最近幾年的一個熱門話題,一般采用條形碼來進行商品識別,然后通過人工結算,在一定程度上提高了結算效率。然而隨著電子射頻技術的發(fā)展,RFID技術開始在商品識別中應用[2],該技術是在商品上粘貼一個電子標簽,然后通過RFID讀取器來讀取商品的詳細信息,最后在后臺自動進行結算,由于零售行業(yè)對成本比較敏感,現(xiàn)實生活中,該技術只能在部分場景下應用。
自深度學習技術在2012年的imageNet[3]圖像識別大賽上取得了突破性的進展之后,深度學習不管是在理論研究,還是在實踐應用中都取得了長足的發(fā)展。隨著新零售概念日益流行,文獻[4-5]提出了利用深度學習技術來解決商品識別的問題,不但可以降低成本,還能做到全自動化結算,為用戶帶來了全新的購物體驗[6]。
現(xiàn)有基于深度學習的目標檢測[7]技術主要是識別圖片中物體的種類以及確定物體位置信息,常見的有one-stage[8-11]和two-stage[12,13]兩大類檢測算法。但這兩類算法本身需要大量訓練樣本,只有訓練樣本數(shù)量足夠多、多樣性足夠廣,才能使模型準確率足夠高。然而在商品識別中,圖像數(shù)據(jù)往往是復雜多變的,例如數(shù)據(jù)采集困難、標注需要大量的人工、無標簽數(shù)據(jù)大量存在等問題,都在一定程度上影響了目標檢測技術在商品識別中的應用。Tonioni等[5,14]提出的基于深度學習的貨架商品識別技術是目前最優(yōu)秀的解決方案,利用深度學習技術識別物體,使用全局描述符搜索匹配物體,但是沒有考慮到實際情況下數(shù)據(jù)集的問題。通常貨架商品數(shù)據(jù)的獲取是通過部署在貨架上某個固定位置的攝像頭,使用網(wǎng)絡將數(shù)據(jù)傳輸?shù)胶笈_服務器,該途徑是一種比較便捷常規(guī)的方式,會產(chǎn)生海量的樣本數(shù)據(jù)。然而只是簡單的圖像數(shù)據(jù)并不能直接被神經(jīng)網(wǎng)絡利用,需要額外的人工標注,來確定圖像中商品的種類和位置信息,這是一種強度高、勞動密集的工作,往往需要多人耗時數(shù)周乃至數(shù)月的時間來完成?,F(xiàn)有的深度學習商品識別方案中就是使用已經(jīng)標注好的數(shù)據(jù)來訓練模型,最后將模型部署進行預測,嚴重依賴已標注好的數(shù)據(jù)。
此外,在實際應用中,也要考慮到被識別物品本身的變化,例如在該套系統(tǒng)下添加一個新的產(chǎn)品、更換產(chǎn)品的包裝等一系列變化。因此,要讓已有的模型快速地利用無標簽的海量數(shù)據(jù)來適應各種變化,降低訓練的成本,構建一套適用的商品識別數(shù)據(jù)集[15]也成為了要解決的問題。
針對商品識別中的問題,即有標簽數(shù)據(jù)集獲取成本較高,無標簽數(shù)據(jù)大量存在的問題。在特征分布上,無論是有標簽數(shù)據(jù)還是無標簽數(shù)據(jù)都具有相同的特征分布,為充分利用無標簽數(shù)據(jù)來提高模型的特征學習能力,本文提出了一種半監(jiān)督學習[16]框架,具體是:
1) 使用少量的有標簽數(shù)據(jù)分別訓練SSD[8]和YOLOv3[9]兩個目標檢測模型,在達到穩(wěn)定之后,通過self-training的方式來利用無標簽數(shù)據(jù);
2) 在self-training階段中,對目標檢測網(wǎng)絡損失函數(shù)添加基于熵的正則化損失項,使預測的結果更加準確。
3) 解決self-training階段中由于錯誤偽標簽數(shù)據(jù)重復利用導致模型精度變糟糕問題。采用co-training訓練方法,將無標簽數(shù)據(jù)分別在兩個不同的模型上進行預測,產(chǎn)生一些偽標簽數(shù)據(jù),再將偽標簽結果分別在另一個模型上訓練,不斷迭代,使其能夠從數(shù)據(jù)中學習更多的特征信息。
將基于RFID的無人售貨柜進行改裝,在每層加裝兩個攝像頭,我們選用了市面上銷售量比較大的20種飲料,模擬實際使用場景,20種類別的飲料被放置在同一售貨柜的不同層,這里選用其中的一層進行說明,其他層具有相同的場景設置。
對于每一層,經(jīng)過測試發(fā)現(xiàn),在該硬件條件下能夠放置8列飲料,這一特點受到攝像頭的鏡頭、層高、箱體寬度等因素影響??紤]到實際應用過程,每行飲料的類別是完全相同的,其中每個攝像頭能夠看到4種類型的飲料,每個攝像頭看到的排列情況會因為實際情況不同會有所差別,但仍然可以看成是在同一個攝像頭下拍攝的圖片。圖1展示了同一時刻左右兩邊兩個攝像頭看到的商品。
(a) 左側攝像頭圖像(b) 右側攝像頭圖像圖1 左右兩側同一時刻拍攝的畫面
針對20種飲料,每個攝像頭能夠看到的是4種類型,根據(jù)數(shù)學中排列組合理論,我們可以得出全排列的結果是116 280,即該數(shù)據(jù)集的所有解為116 280種結果。為了在較少標注工作量以及滿足實際應用場景,并沒有列舉所有的結果,而是采集了20種飲料抽取4種組合的方式,即4 845種組合方式,作為基礎數(shù)據(jù)集,并進行了標注,用于基礎模型的訓練。為了模擬實際應用中產(chǎn)生的其他的組合方式,我們隨機采集了無重復的10 000多幅無標簽數(shù)據(jù),作為無標簽數(shù)據(jù)集,圖2展示了有標簽數(shù)據(jù)和無標簽數(shù)據(jù)不同。
(a) 使用labelImg標注的有標簽數(shù)據(jù)
此外為了驗證模型的訓練效果,從4 845種組合中選取480種不同的組合方式,每種組合按照與訓練集不同的排列方式進行采集,最后進行標注,形成標準訓練集,表1展示了構建的數(shù)據(jù)集詳細信息。
表1 數(shù)據(jù)集信息
SSD(Single Shot MultiBox Detector)模型[8]和YOLOv3[9]模型分別是劉偉在2016年提出和Joseph Redmon在2018年提出的one-stage深度學習目標檢測模型,該類模型將目標檢測中分類和位置回歸整合到一個網(wǎng)絡中,使模型的訓練更加簡單,相比于two-stage目標檢測模型來說,在運行效率上快了許多,十分適合于商品檢測對場景的要求。SSD模型和YOLOv3模型使用了卷積神經(jīng)網(wǎng)絡中的多層特征,每層特征代表著不同的語義信息,總體上提高了模型的表達能力。
在商品識別中,除了對準確率等技術指標有要求之外,也應該充分考慮實際的使用場景中,對實時性的要求,SSD和YOLOv3相對于R-CNN系列模型FPS普遍要高。這兩個模型采用完全不同特征提取網(wǎng)絡,SSD使用VGG-16,如表2所示,YOLOv3使用darknet-53,如表3所示。兩個神經(jīng)網(wǎng)絡通過特征提取之后,將位置預測和類別預測整合到一個網(wǎng)絡中,從而達到one-stage目標檢測的目的。從深度學習抽象層理解的話,兩個模型分別代表著不同的視角來學習數(shù)據(jù)集中存在的特征,避免不同的特征在后期的訓練中出現(xiàn)無效的重復學習。
表2 SSD提取網(wǎng)絡特征參數(shù)
表3 YOLOv3特征提取網(wǎng)絡模型參數(shù)
續(xù)表3
SSD主要是使用VGG作為基礎的網(wǎng)絡,將全連接層(FC6和FC7)替換為卷積層,并在后面加上額外的卷積層,用于多層特征的預測。
dark-net網(wǎng)絡主要是由一系列的1×1和3×3的卷積層組成,每個卷積層后都會跟一個BN層和一個LeakyReLU層,一共有53層卷積(包括全連接層),所以稱為darknet-53。
分別利用VOC數(shù)據(jù)集訓練好的權重參數(shù),初始化SSD和YOLOv3模型,這種pre-training訓練方式在目前的深度學習參數(shù)初始化中方法十分常見。將同樣的訓練集分別轉換為SSD和YOLOv3可以識別的格式,按照作者原文中的訓練方法對模型繼續(xù)訓練,直到訓練結束,這種被稱作有標簽的全監(jiān)督訓練。
模型的初始化訓練是一個利用有標簽數(shù)據(jù)的全監(jiān)督學習過程。為了提高大量無標簽數(shù)據(jù)的利用率,從中提取到有用的特征信息,可以采用自訓練的方式。先使用訓練好的模型在無標簽數(shù)據(jù)上進行預測,選擇置信度比較高的偽標簽數(shù)據(jù)加入到訓練數(shù)據(jù)集中,直到無標簽數(shù)據(jù)集中的數(shù)據(jù)不再變化為止,參考算法1。
算法1Self-training算法
Input:訓練集U和L、學習率η
repeat:
3:根據(jù)預測出來的結果,將(xu,yu)加入到L中,并將xu從U中移除。
自訓練的方式雖然能夠在一定程度上利用無標簽數(shù)據(jù),但偽標簽的選擇一直是自訓練的核心,本文中采用基于熵正則化的方法來選擇偽標簽數(shù)據(jù)。假設模型預測的結果呈現(xiàn)某種分布,如果在結果中比較集中于某個類別,那么就有大概率認為是屬于這個類別,通常用熵表示分布的集中程度,分布越集中,則熵越小。用yu代表模型預測中分類結果,則:
(1)
式中:等式右邊第一項是針對有標簽的損失函數(shù),和全監(jiān)督訓練時使用的損失函數(shù)一樣,第二項是針對無標簽預測的類別熵,λ為協(xié)調有標簽數(shù)據(jù)和無標簽數(shù)據(jù)對損失函數(shù)的影響系數(shù),最后通過最小化損失函數(shù)求解模型的參數(shù)。
SSD和YOLOv3模型產(chǎn)生了不同的標簽數(shù)據(jù),這些數(shù)據(jù)結果從一定意義上來說可信的,但即使可信度再高,依然有一部分是錯誤數(shù)據(jù)。為了避免模型重復使用錯誤的數(shù)據(jù),致使模型朝著糟糕的方向訓練,引入了一種類似于對抗機制。如圖3所示,使用自訓練之后的模型在無標簽數(shù)據(jù)集U下進行預測,SSD和YOLOv3模型分別獲得偽標簽數(shù)據(jù)集PLa和PLb,將標準訓練集分別與PLa和PLb合并,形成新的有標簽數(shù)據(jù)集NLa和NLb,最后使用SSD模型在NLb下訓練,使用YOLOv3模型在NLa數(shù)據(jù)集下訓練,通過交叉協(xié)同訓練直到滿足迭代停止條件。
圖3 協(xié)同交叉訓練流程
為了快速驗證半監(jiān)督學習框架的有效性,在深度學習平臺Pytorch框架下,使用Python代碼編寫SSD算法和YOLOv3算法,實驗軟件環(huán)境為ubuntu 16.04系統(tǒng),硬件平臺使用的是一塊GTX 2080Ti 11G顯卡,intel E5處理器,模型的訓練和測試都是在顯卡GPU上進行,CPU處理器主要完成簡單的數(shù)據(jù)處理工作。
4.1.1有標簽數(shù)據(jù)的訓練
為了使模型的初始訓練能夠獲得更好的效果,兩個模型在訓練之前都采用了圖像增強技術,如隨機裁剪、圖像歸一化、色彩扭曲、隨機水平翻轉等。其中SSD模型的初始化參數(shù)使用基于VOC數(shù)據(jù)集權重結果,圖片的輸入大小為300×300,采用SGD權重更新策略,學習率為0.001,在整個數(shù)據(jù)集上迭代了200個epoch之后停止訓練,YOLOv3模型的初始化采用了官方[9]權重結果,圖片的輸入大小為416×416,同樣經(jīng)過了200個epoch的訓練,采用了adam權重更新方法,學習率為0.001,在數(shù)據(jù)集迭代訓練200次。
4.1.2無標簽數(shù)據(jù)的訓練
無標簽數(shù)據(jù)的訓練主要分為兩個部分,自訓練和交叉協(xié)同訓練。在自訓練中,我們采用4.1.1節(jié)訓練好的模型在無標簽上進行預測,將結果和標準訓練集合并成新的訓練數(shù)據(jù)集,之后在新數(shù)據(jù)集下訓練50個epoch,學習率調整為更小的0.000 5,整個過程經(jīng)過多輪迭代,完成SSD模型和YOLOv3模型訓練。
由于自訓練固有的缺陷,接下來采用交叉協(xié)同訓練,其中主要是學習率的設置與前面有所不同,因為在訓練的后期,主要是模型的微調,所以我們進一步降低學習率,將兩個模型的學習率都調整為0.000 1,在達到10次交叉訓練之后終止訓練,每次交叉訓練,模型迭代15個epoch,最終經(jīng)過1天左右的時間完成交叉協(xié)同訓練。
采用原始的SSD模型和YOLOv3算法模型,對有標簽的數(shù)據(jù)集進行了訓練,隨著迭代次數(shù)的增加,模型的損失函數(shù)不斷下降,直到趨于穩(wěn)定;對于無標簽數(shù)據(jù)的訓練分為自訓練階段和協(xié)同交叉訓練階段,加入自訓練和協(xié)同交叉訓練之后,模型的損失值進一步下降,圖4展示了在數(shù)據(jù)集下不同階段訓練的結果。
圖4 不同階段訓練損失值曲線
為了防止訓練的模型存在過擬合的問題,需要在測試集上進行評估,首先需要評估的是模型在有標簽數(shù)據(jù)集下的預測效果,我們采用在目標檢測中常用的mAP(mean average precision)指標來確定網(wǎng)絡模型的分類和定位性能,半監(jiān)督學習的檢測也采取相同的評價指標,確保半監(jiān)督學習前后評估方法的一致性,更加科學合理地評估半監(jiān)督學習算法。
和傳統(tǒng)的分類任務類似,首先需要計算precision和recall,這些指標依賴于真正例(TP)、假正例(FP)、真負例(TN)和假負例(FN)。IOU(交并比)的設置決定檢測結果是正確還是錯誤,最常用的閾值是0.5。使用P代表precision,使用R代表recall,則:
式中:TP是根據(jù)IOU的值檢測正確的數(shù)量;FP為檢測錯誤的數(shù)量;FN表示漏檢的數(shù)量。
表4 有標簽數(shù)據(jù)集下模型AP值結果
在完成有標簽的學習之后,采用self-training和co-training對偽標簽數(shù)據(jù)進行學習,這些偽標簽數(shù)據(jù)的學習效果直接影響著最終模型的性能。最后的驗證部分,以是否使用偽標簽為基準,分別對比使用偽標簽前后模型的性能是否有所提高。偽標簽性能驗證時,每經(jīng)過10個epoch,在驗證集T上進行一輪驗證實驗,圖5和圖6分別展示了SSD和YOLOv3模型使用偽標簽前后的實驗結果。實驗發(fā)現(xiàn),無論是SSD模型還是YOLOv3模型在使用偽標簽數(shù)據(jù)之后,相比沒有單純使用有標簽數(shù)據(jù),模型的mAP值都有所提高。
圖5 YOLOv3使用偽標簽前后性能結果
圖6 SSD使用偽標簽前后性能結果
在半監(jiān)督學習框架下完成自訓練和交叉協(xié)同訓練,并在每個訓練階段的結束后,在測試集上進行一次性能測試,結果如表5所示。
表5 半監(jiān)督框架實驗結果對比
實驗結果表明,在經(jīng)過無標簽數(shù)據(jù)集的訓練后,SSD模型的精度從90.6%提高到了97.2%,YOLOv3模型精度從91.7%提高到了96.9%,半監(jiān)督學習框架相比全監(jiān)督學習方法有明顯提高,說明了半監(jiān)督學習框架的有效性,在模型的預測中有很好的效果,能夠準確地預測圖片中商品的位置和類別,如圖7所示。在實驗環(huán)境中達到了60幀/s的實時處理效果,完全能夠滿足實際需要。
圖7 半監(jiān)督學習框架預測結果展示
基于半監(jiān)督框架的商品識別算法在一定程度上解決了有標簽數(shù)據(jù)不足、無標簽數(shù)據(jù)無法利用等實際問題,為基于圖像的商品識別應用提供了一種可行的解決思路。利用有標簽數(shù)據(jù)進行預訓練,再用無標簽數(shù)據(jù)進行交叉訓練,最終提高了模型的準確性,但依然存在一些問題,例如如何減少模型訓練時長等,這些問題也將成為下一階段的研究重點。未來無人售貨這種新型的零售方式也將給人們帶來全新的購物體驗。