蔣達央
(常州信息職業(yè)技術學院,江蘇 常州213164)
隨著人工智能技術的發(fā)展,在商業(yè)領域基于機器識別的AI應用越來越廣泛。用二維碼掃描商品的傳統(tǒng)結算模式因結算誤差率高、人工占用多、結算效率低等問題而矛盾凸顯?;贏I技術的新零售商品結算形式——商品圖像識別自動結算系統(tǒng)正逐步成為研究的熱點?;诰矸e神經(jīng)網(wǎng)絡的商品圖像識別系統(tǒng)涉及的內(nèi)容很多,筆者重點針對系統(tǒng)設計、網(wǎng)絡架構和學習設計展開研究。
卷積神經(jīng)網(wǎng)絡(CNN)是一種人工神經(jīng)網(wǎng)絡,具有深度前饋特性[1]。CNN與傳統(tǒng)BP神經(jīng)網(wǎng)絡相比,其優(yōu)勢在于對圖像這類二維矩陣有良好的抽象表達,每個神經(jīng)元可以直接輸入,做卷積計算。一個典型的CNN包含5個層:數(shù)據(jù)輸入層、卷積層、ReLU激勵層、池化層、全連接層[2]?;谏窠?jīng)網(wǎng)絡的圖像識別人工智能在安防領域應用廣泛,如人臉識別、車牌識別、違禁物體檢測等。目前流行的CNN框架有FACEBOOK使用的Torch、Google使用的TensorFlow、Berkeley的CV工具包Caffe[3]。
在一個圖像識別網(wǎng)絡系統(tǒng)中,卷積網(wǎng)絡的輸入層負責將商品圖像信息錄入并進行預處理,是一個二維矩陣;卷積層將挖掘二維圖像矩陣的關聯(lián)性和不變性特征;激勵層是指卷積神經(jīng)采用收斂速度更快、梯度運算更簡單的ReLU激勵函數(shù)[4];池化層通常也稱為采樣層,主要用來降低圖像的維度,例如過濾不重要的高頻信息,減少冗余信息,通俗說法就是壓縮圖像;全連接層是指在各個卷積層之間,層與層都有神經(jīng)元連接。
根據(jù)智能商務運行的需求分析和使用場景,綜合考慮系統(tǒng)的響應時間、識別準確率、系統(tǒng)穩(wěn)定性這3個性能指標,筆者著重從總體框架和網(wǎng)絡架構2個層面展開分析。
基于CNN的商品圖像識別系統(tǒng)總體框架如圖1所示。
圖1 商品圖像識別系統(tǒng)總體框架圖
商品圖像由數(shù)據(jù)采集模塊將采集到的多張原始商品圖片數(shù)據(jù)進行處理,并篩選出相機在不同角度拍攝而產(chǎn)生的商品差異化照片,而后按類別分類存放于文件系統(tǒng);數(shù)據(jù)預處理模塊主要對文件系統(tǒng)中的原始照片數(shù)據(jù)進行諸如去除背景、凸顯圖像特征等數(shù)據(jù)歸一化處理操作,并將處理后的數(shù)據(jù)存放于文件系統(tǒng);訓練學習模塊則從文件系統(tǒng)中讀取預處理后的數(shù)據(jù),實施卷積訓練學習計算,并將學習結果置于文件系統(tǒng);實時識別模塊則對訓練學習文件進行識別,得到最終的識別結果,而后根據(jù)數(shù)據(jù)庫中查到的相關商品信息,核算出該商品的價格。
2幅圖像在CNN中的對比是劃塊進行的,這些被劃分的小區(qū)域被稱為特征。相比于采用基于全圖逐像素的全量匹配比較,CNN效率更高。它通過尋找給定的2張圖片中相似位置上的粗糙特征實施匹配計算,可以更快、更好地反映圖片的相似度。通常使用濾波器來計算這些特征,這個濾波器又稱為卷積模板。
目前主流CNN的卷積核通常采用3×3,5×5,11×11尺寸。在實際應用中,針對不同使用場景,可以采用不同尺寸的卷積核。卷積核越大,感受域(receptive field)就越大,圖片包含的信息就越多,因此獲得的圖像特征就越完整。但是卷積核越大,同時也造成計算量暴增,不利于圖像模型的深度增加,因而會降低計算性能。綜合考慮,通常使用多個小卷積核疊加的方式來替代1個單獨的大卷積核。這種方式的效果是在連通性保持不變的情況下,可以有效降低計算復雜度和參數(shù)個數(shù)。
系統(tǒng)的神經(jīng)網(wǎng)絡由3層卷積層和3層池化層組成。在第1層模型中,采用3×3卷積核、深度為32、通道數(shù)為32、步長為1的相同填充的辦法進行卷積計算,并使用2×2最大池化(max-pooling)的方式進行池化計算;在第2層模型中,采用以第1層的輸出作為輸入,除了深度和通道數(shù)變?yōu)?4,其余均不變的辦法進行卷積和池化計算;第3層模型與第2層模型類似,以第2層的輸出為輸入,卷積核大小不變,深度改為128,通道數(shù)改為128,步長不變,填充方法不變,進行卷積計算和池化計算。當3層卷積和池化計算完成后,輸出數(shù)據(jù)進入全連接層。在全連接層,要對第3層的輸出做全連接,且要得出訓練結果,并將結果存儲到模型文件中。
訓練學習設計是在搭建基礎的運行環(huán)境的前提下,通過對商品實時識別系統(tǒng)設計CNN,并對輸入的商品圖像數(shù)據(jù)進行訓練學習。針對訓練學習的結果,提供相應的接口給其他的功能模塊調(diào)用。
系統(tǒng)采用大型深度CNN算法中的AlexNet模型,這種模型的優(yōu)勢在于訓練時間加快,且能有效地防止過擬合。MXNet作為其中功能強大的工具包,能滿足CNN的結構和每個卷積層的設置。精簡模型代碼如下:
#INPUT
Import_data=mxnet.symbol.Variable('pic')
#one /*第一層*/
conv1=mx.symbol.Convolution(kernel=(11,11),stride=(3,3),num_filter=95,data=import_data) /*設置第一層卷積層的參數(shù)*/
R1=mx.symbol.Activation(act_type="relu",data=conv1) /*設置激活層參數(shù)*/
P1=mx.symbol.Pooling(pool_type="max",kernel=(4,4),stride=(3,3),data=R1) /*設置池化層參數(shù)*/
L1=mx.symbol.LRN(alpha=0.00001,nsize=6,beta=0.77,knorm=2,data=P1)
#two /*第二層*/
conv2=mx.symbol.Convolution(kernel=(4,4),pad=(1,1),num_filter=384,data=l1)
R2=mx.symbol.Activation(act_type="relu",data=conv2)
P2=mx.symbol.Pooling(kernel=(4,4),stride=(3,3),pool_type="max",data=R2)
L2=mx.symbol.LRN(alpha=0.00001,beta=0.77,knorm=2,nsize=6,data=P2)
#thr /*第三層*/
conv3=mx.symbol.Convolution(kernel=(5,5),pad=(1,1),num_filter=256,data=L2)
R3=mx.symbol.Activation(act_type="relu",data=conv3)
#four /*第四層*/
conv4=mx.symbol.Convolution(kernel=(5,5),pad=(1,1),num_filter=256,data=R3)
R4=mx.symbol.Activation(act_type="relu",data=conv4)
#five /*第五層*/
conv5=mx.symbol.Convolution(kernel=(4,4),pad=(1,1),num_filter=384,data=R4)
R5=mx.symbol.Activation(act_type="relu",data=conv5)
P3=mx.symbol.Pooling(kernel=(4,4),stride=(3,3),pool_type="max",data=R5)
#six /*第六層*/
Flat6=mx.symbol.Flatten(data=P3) /*j將多位數(shù)據(jù)轉(zhuǎn)化為1維數(shù)據(jù)*/
Fc6=mx.symbol.Fully Connected(num_hidden=6144,data=Flat6) /*設置全連接層參數(shù)*/
R6=mx.symbol.Activation(act_type="relu",data=Fc6)
Drop1=mx.symbol.Dropout(p=1,data=R6)
#sev /*第七層*/
Fc7=mx.symbol.Fully Connected(data=Drop1,num_hidden=6144)
R7=mx.symbol.Activation(act_type="relu",data=Fc7)
Drop2=mx.symbol.Dropout(p=1,data=R7)
#eight /*第八層*/
Conn8=mx.symbol.Fully Connected(num_hidden=55,data=Drop2)
#OUTPUT
Img_symbol=mxnet.symbol.Softmax Output(data=Fc8,name='imgmax') /*對輸出層神經(jīng)元產(chǎn)生的誤差值進行調(diào)整*/
首先通過初始化網(wǎng)絡模型結構,設置模型訓練次數(shù)train_num為200次,顯示誤差值的迭代頻率frequent為20次,設置學習率learning_rate=0.02。在經(jīng)過對該神經(jīng)網(wǎng)絡進行4 000次的迭代,得到最終訓練結果[5]。核心算法如下:
NM1=mxnet.mod.Module(context=mxnet.Gpu(),symbol=img_sym)
NM1.fit(optimizer='SGD',le_data=val_Fliter,execise_Fliter,optimizer_pams={'learning_rate':0.02},le_metric='acd',finnal_batch=mxnet.callback.Speedometer(batch_size=40,frequent=20),train_num=200)
Rigth_levl=NM1.score(le_fiter,['acd']) /*對訓練結果實施評估,預測數(shù)據(jù)集并計算準確率*/
經(jīng)過6 h左右的計算訓練后,系統(tǒng)得出了穩(wěn)定的有效結果,交叉訓練網(wǎng)絡模型獲得的bath數(shù)據(jù)集的準確率基本穩(wěn)定在81.34%。收斂結果如下所示:
Train_right_result=0.8134245
Validation_right_result=0.802854
通過觀察圖像識別訓練模型每次訓練得出的模型正確率,由于初始數(shù)據(jù)樣本較小,準確率不穩(wěn)定,待多次訓練后準確率逐步趨于穩(wěn)定。最終通過使用model.save()函數(shù),即可保存訓練穩(wěn)定后的網(wǎng)絡結構模型與相關參數(shù),且所保存的文件占內(nèi)存很小。
系統(tǒng)基于商品圖像識別訓練模型展開學習訓練后,得到學習的最終結果。而后利用商品圖像實時識別模塊對擺放在底座的商品的多個場景(如完整商品、80%擠壓變形商品、60%擠壓變形商品)進行圖像識別。測試發(fā)現(xiàn),圖像的識別率提升明顯,識別速度顯著提高。對于商品外包裝完整的商品,識別率在100%;擠壓變形率80%的商品,識別率在90%以上,其價格顯示以及總價累計均正確;對于變形率低于80%的商品,則會提示重新掃描,出現(xiàn)無法計價情況。綜合測試,該系統(tǒng)的識別結果不會影響商品的正確結算,系統(tǒng)達到預期要求。
基于CNN的商品圖像識別系統(tǒng)的應用前景非常廣闊,但由于實際使用環(huán)境不同,導致商品識別的效果和性能受到不同程度的影響,進而采用的系統(tǒng)優(yōu)化設計方案也會有差異。這種差異性設計限制了系統(tǒng)的產(chǎn)品化發(fā)展,在一定程度上影響了商業(yè)推廣應用。盡管商品圖像自動識別系統(tǒng)利用CNN技術提高了應用效果,但還有很多實際問題需要解決,諸如識別性能和模型結構的優(yōu)化,尤其是當前云計算技術的發(fā)展,給卷積計算提供了另一種提高計算效率的途徑,給CNN的發(fā)展提供了新的挑戰(zhàn)和機遇。