周 勉,劉秉瀚
(福州大學(xué) 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,福建 福州 350108)
條形碼技術(shù)[1]在日常生活中應(yīng)用廣泛,比如物流管理、智能倉庫、圖書館自動(dòng)借閱等。雖然條形碼相關(guān)技術(shù)發(fā)展至今已然相當(dāng)成熟,但在多個(gè)條碼同時(shí)出現(xiàn)的應(yīng)用場景中(比如物流),由于背景復(fù)雜,定位難度相對(duì)較大,目前主要還是依賴人工逐個(gè)完成,費(fèi)時(shí)費(fèi)力,效率低下。為此,研究復(fù)雜背景中的多條形碼具有極大應(yīng)用前景。
目前常見的方法是借助條形碼的灰度、條紋特征進(jìn)行檢測,文獻(xiàn)[2]提出了一種基于窗口直方圖的算法,實(shí)現(xiàn)了條碼的方向不變性,但需要選取與條碼規(guī)格接近的窗口才能取得較好的效果;文獻(xiàn)[3]采用Max-Min和Canny算子相結(jié)合的方法過濾背景噪聲,通過投影的方式定位目標(biāo)區(qū)域?qū)崿F(xiàn)快速定位,但在多條碼場景下,投影區(qū)域往往存在重疊部分,導(dǎo)致檢出失??;文獻(xiàn)[4-5]提出了基于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)的定位算法,這種方法需要預(yù)先提取候選塊的特征,然后將特征作為神經(jīng)網(wǎng)絡(luò)的輸入。一方面特征提取步驟繁瑣,另一方面候選塊的選取也將影響檢測效果。總的來看,傳統(tǒng)的檢測條形碼的方法應(yīng)用在復(fù)雜背景的多條碼檢測中存在魯棒性較差、步驟繁瑣、閾值選取困難等弊端。
相比于傳統(tǒng)方法,基于深度學(xué)習(xí)的目標(biāo)檢測不僅可以自動(dòng)地提取豐富的特征,同時(shí)可以將特征提取、選擇、分類融合在同一個(gè)網(wǎng)絡(luò)模型中進(jìn)行優(yōu)化,具有極大的優(yōu)勢。文獻(xiàn)[6]提出了一種基于卷積神經(jīng)網(wǎng)絡(luò)的QR碼定位方法。該方法首先對(duì)二值化后的圖像按照固定的寬、高劃分候選cell,然后通過卷積神經(jīng)網(wǎng)絡(luò)對(duì)cell進(jìn)行分類,過濾掉不含QR碼的部分。最后根據(jù)cell的邊緣數(shù)、紋理等信息進(jìn)行合并得到檢測結(jié)果。該方法在復(fù)雜背景下有較好的QR碼定位效果,但這種需要預(yù)處理和后處理的檢測方式,要設(shè)置多項(xiàng)閾值,檢測效果受先驗(yàn)知識(shí)影響較大。
為了避免復(fù)雜閾值設(shè)定帶來的困擾,同時(shí)降低條碼被分段檢出的風(fēng)險(xiǎn),本文借鑒深度學(xué)習(xí)領(lǐng)域流行的目標(biāo)檢測思想,提出一種可在復(fù)雜背景中直接提取條形碼位置、傾斜角度以及掃描線的端對(duì)端檢測算法。本文算法具有檢測步驟簡單、人工干預(yù)少、魯棒性好等優(yōu)點(diǎn)。
目前用于目標(biāo)檢測的深度學(xué)習(xí)模型大致可以分為以下兩類:
(1)兩步檢測法。這類方法將目標(biāo)檢測過程分為區(qū)域推薦和區(qū)域分類兩個(gè)過程。區(qū)域推薦過程的目的是從原始圖片信息中得到多個(gè)可能存在目標(biāo)的區(qū)域;區(qū)域分類過程的目的是對(duì)第一步所產(chǎn)生的區(qū)域進(jìn)行逐個(gè)分類、甄別。兩步法的優(yōu)點(diǎn)是準(zhǔn)確率高,但缺點(diǎn)是需要大量計(jì)算、速度慢,候選區(qū)較多的情況下問題尤為明顯,難以滿足實(shí)時(shí)檢測的要求。這類算法包括R-CNN[7]、Faster-RCNN[8]等。
(2)端到端檢測法。相比起兩步法這類方法舍棄了區(qū)域推薦,采用單個(gè)神經(jīng)網(wǎng)絡(luò),通過擬合的方式直接從待檢測的圖片中計(jì)算出目標(biāo)區(qū)域。此類方法的典型代表包括YOLO[9]和SSD[10],兩者均為“特征提取網(wǎng)絡(luò)+分類回歸”的設(shè)計(jì)思路,這種模型僅采用一個(gè)神經(jīng)網(wǎng)絡(luò)完成目標(biāo)檢測,具有訓(xùn)練過程簡單、檢測速度快的優(yōu)點(diǎn)。相比起SSD,YOLO的設(shè)計(jì)更為簡潔,易于實(shí)現(xiàn)。
YOLO的模型結(jié)構(gòu)采用了24個(gè)卷積層+2個(gè)全連接層的模型設(shè)計(jì),卷積層用于提取物體的特征,全連接層用于分類和預(yù)測。
YOLO將待檢測的圖片分為S×S個(gè)區(qū)域(cell),目標(biāo)中心點(diǎn)所在的cell負(fù)責(zé)預(yù)測該目標(biāo)的“邊框(bounding-box,bbox)”。因此網(wǎng)絡(luò)訓(xùn)練目標(biāo)就是對(duì)S×S個(gè)cell進(jìn)行分類,找出那些目標(biāo)中心點(diǎn)所在的cell并計(jì)算目標(biāo)區(qū)域的bbox。每個(gè)cell首先要預(yù)測B個(gè)bbox,同時(shí)給出每個(gè)bbox的置信,理想情況下與目標(biāo)完全貼合的bbox其置信度為1,如果一個(gè)bbox不含任何目標(biāo)其置信度為0。除此之外每個(gè)cell還需給出C個(gè)條件概率,用于說明該cell所屬的物體類別。置信度與條件概率的乘積即可認(rèn)為是某個(gè)bbox屬于具體類別的可能性,這么設(shè)計(jì)的目的是希望經(jīng)過訓(xùn)練可以讓特定大小的bbox與某些特定的類別產(chǎn)生一定的關(guān)聯(lián)。在YOLO模型中,B=2,S=7,C=20,所以最終的網(wǎng)絡(luò)輸出為7×7×30。
考慮到條形碼的使用場景多為實(shí)時(shí)檢測,對(duì)檢測速度有較高的要求,本文借鑒了YOLO “特征提取+分類回歸”的設(shè)計(jì)思路,構(gòu)建一個(gè)針對(duì)多條形碼檢測且設(shè)計(jì)更加精簡的深度學(xué)習(xí)模型。由于存在大小不一、角度不同的多條碼目標(biāo),基于bbox的檢測模式不僅不能提供角度信息,而且多個(gè)條碼的bbox相互干擾可能導(dǎo)致小目標(biāo)無法檢出。為此本文提出一個(gè)針對(duì)多條形碼的檢測模式,同時(shí),為了達(dá)到快速檢測的目的,本文以“卷積+maxpool”的結(jié)構(gòu)設(shè)計(jì)神經(jīng)網(wǎng)絡(luò),并行地完成條形碼多特征的檢測。另外,本文模型采用卷積的方式替代全連接層,以減少模型的參數(shù)量。
由于實(shí)際中條形碼解碼過程并不需要獲取完整的圖片信息,只需要沿著條形碼長度延伸的方向(掃描線)讀取完整的條形信息即可,因此,本文將條形碼的中心位置、掃描線以及傾斜角作為條形碼的代表性特征。
本文借鑒YOLO思想將待檢測圖片分為S×S個(gè)cell,每個(gè)cell負(fù)責(zé)檢測條形碼代表性特征。為便于區(qū)分,本文把目標(biāo)中心點(diǎn)所在的cell稱為rcell。設(shè)計(jì)思路如下:
(1)bbox的置信度評(píng)估方面,為避免閾值選取問題,本文設(shè)計(jì)每個(gè)bbox輸出兩個(gè)預(yù)測值,分別表示為rcell和非rcell的置信度,通過softmax函數(shù)映射成概率分布后采用交叉熵進(jìn)行l(wèi)oss評(píng)估。
(2)條形碼首尾顛倒對(duì)后續(xù)識(shí)別影響不大,因此傾斜角只需考慮第一象限和第二象限(180°范圍)。由于bbox的置信度采用了交叉熵,傾斜角loss評(píng)估如果采用平方差估算可能導(dǎo)致loss不均衡。為了降低角度預(yù)測的誤差,本文將傾斜角分為兩個(gè)部分進(jìn)行預(yù)測(見圖1):①傾斜角所屬象限,分為2個(gè)類別(0:第一象限;1:第二象限);②傾斜角在象限中的角度(以10°為間隔將90°的象限角分為10個(gè)類別)。這樣共計(jì)12個(gè)輸出,與直接將180°按10°間隔分成19個(gè)分類相比,減少了參數(shù)量。
圖1 傾斜角分類
(3)出于與傾斜角預(yù)測相同的考慮,對(duì)條碼掃描線歸一化長度l/w(l為條碼長度,w為圖片寬度)的預(yù)測也采用了分部預(yù)測方式:十分位a的預(yù)測以及剩余位b的預(yù)測,如式(1)所示:
l/w=a×0.1+b×0.01
(1)
其中,a為[0,9]之間的任意整數(shù),本文采用分類方法進(jìn)行預(yù)測,并用交叉熵作為loss評(píng)估函數(shù);b為[0,10)之間任意實(shí)數(shù),采用均方誤差評(píng)估。因?yàn)樵赼正確的情況下誤差就已經(jīng)得到了有效的控制,b在這部分并不是很重要,采用均方誤差評(píng)估有利于減少運(yùn)算量。
(4)在中心點(diǎn)預(yù)測方面,由于條形碼由平行的線條組成,為此對(duì)中心的定位要求并不是很高,這部分采取與YOLO相同的方式進(jìn)行預(yù)測。
(5)在S的選取方面,設(shè)置太小將無法有效地檢出目標(biāo),設(shè)置太大將大幅增加運(yùn)算量,根據(jù)待檢測圖片中條碼與圖像的實(shí)際比例,本文S設(shè)置為7。由于本文僅涉及“條碼”與“非條碼”的二分類問題,而這個(gè)問題與cell的二分類是一致的,為此本文中C=0,B=1。根據(jù)上述思路,本文提出的模型結(jié)構(gòu)中,每個(gè)cell的輸出包含27個(gè)值,含義如表1所示。
表1 模型輸出定義
本文所設(shè)計(jì)模型為多任務(wù)模型,因此loss由多個(gè)部分組成。
(1)cell分類loss(式(2)):
(2)
(3)
(4)
(2)角度預(yù)測loss:
(5)
(3)條碼長度loss:
(6)
(4)目標(biāo)bbox中心點(diǎn)的回歸loss:
(7)
最終模型的loss函數(shù)為:
(8)
本文所設(shè)計(jì)的模型結(jié)構(gòu)如表2所示。
表2 本文的模型結(jié)構(gòu)
本文模型的基本設(shè)計(jì)思路是通過控制卷積核的移動(dòng)步長以及采用max_pool結(jié)構(gòu)將448×448圖像輸入映射為7×7×27模型輸出。由于條形碼主要由平行的線條組成,為此即便在“條”與“空”之間缺失部分像素,也不會(huì)對(duì)條碼的整體形態(tài)有太大影響。因此在模型的第一個(gè)卷積層,本文設(shè)置卷積的步長為4,進(jìn)行“跳躍式”的卷積。在YOLO的設(shè)計(jì)中,一個(gè)邏輯上的卷積層由多個(gè)子卷積過程組成,期間通過1×1的卷積核進(jìn)行壓縮,以減少運(yùn)算。一方面條碼的特征更為簡單,同時(shí)為了減少運(yùn)算量,本文并未采用這種卷積結(jié)構(gòu)。
對(duì)于每層卷積核數(shù)的設(shè)置,參照YOLO的模型設(shè)計(jì)方法:隨著網(wǎng)絡(luò)深度的加大,逐漸減小特征圖大小,并增加卷積核個(gè)數(shù)。因此,本文以N為增量逐層遞增卷積核,設(shè)第一層的核數(shù)為N,則其后卷積層的核數(shù)分別為2N、3N…。
本文通過一系列實(shí)驗(yàn)確定N的取值。顯然卷積核越多,則需要越多的運(yùn)行時(shí)間和越多的迭代周期。
為了簡化實(shí)驗(yàn),本文將所有模型的訓(xùn)練周期固定設(shè)為20,僅從召回率和精確率入手考察N的不同取值對(duì)實(shí)驗(yàn)結(jié)果的影響,實(shí)驗(yàn)結(jié)果如圖2所示。
圖2 不同N值對(duì)比圖
圖4 模擬場景實(shí)驗(yàn)效果圖
相比起誤檢,漏檢將造成更大的損失,為此優(yōu)先考慮召回率較高的模型。從圖2可以看出,當(dāng)N取16時(shí),在提升模型精確率的同時(shí)沒有引起召回率的下降。為此,本文選擇N=16作為模型第一層的卷積核個(gè)數(shù)。
由于網(wǎng)絡(luò)上可用于進(jìn)行訓(xùn)練的條形碼樣本稀少,而完全人工標(biāo)注的方式進(jìn)行數(shù)據(jù)集制作,工作量巨大,其數(shù)量也很難滿足實(shí)驗(yàn)需求,為此,本文設(shè)計(jì)算法自動(dòng)生成訓(xùn)練、測試數(shù)據(jù)集。
數(shù)據(jù)集制作步驟如下:
(1)采集背景圖片。其途徑包括上網(wǎng)下載和人工采集兩種。上網(wǎng)下載的圖片其題材、分辨率不限,盡可能多樣。人工采集的圖片主要源于日常拍攝、人工繪制(如網(wǎng)格、條紋)等。共得到背景圖片約5 000張。將這些圖片隨機(jī)分為兩個(gè)集合,其中較小的集合含圖片約100張。較大的集合用于制作訓(xùn)練數(shù)據(jù),較小的集合用于制作測試數(shù)據(jù)。
圖3 真實(shí)場景實(shí)驗(yàn)效果圖
(2)生成目標(biāo)背景圖片。如果只采用原始的圖片作為目標(biāo)圖片的背景,在大量生成樣本后難免出現(xiàn)背景重復(fù)的情況。為此,需要采用剪裁、縮放、加入隨機(jī)文字、平行線條、翻轉(zhuǎn)等手段為每一個(gè)樣本獨(dú)立地生成背景圖片。
(3)通過程序生成大量條形碼圖片,將這些條形碼進(jìn)行不同程度的旋轉(zhuǎn)、模糊后,不重疊地隨機(jī)置于背景圖片中,并詳細(xì)記錄它們的位置信息,如旋轉(zhuǎn)角、寬、高等。
經(jīng)過上述步驟理論上可產(chǎn)生任意多的訓(xùn)練數(shù)據(jù),雖然不能夠完全模擬現(xiàn)實(shí)場景,但足以用作理論驗(yàn)證。
為驗(yàn)證模型效果,通過機(jī)器隨機(jī)生成1 000張測試圖片,每張圖片包含2~4個(gè)大小不等的條形碼,圖片大小為448×448,每張圖片包含2~4個(gè)目標(biāo)。
經(jīng)過試驗(yàn),本文方法檢出成功率約為96%,每張圖片耗時(shí)約150 ms。
本文與其他方法進(jìn)行了對(duì)比,部分效果如圖3(真實(shí)場景)、圖4(模擬場景)所示。
從實(shí)驗(yàn)結(jié)果可看出,在背景較為復(fù)雜、條碼存在不同程度扭曲的情況下,文獻(xiàn)[11]的檢測效果較差(見圖4(d)),主要原因在于,在復(fù)雜背景中閾值選取較為困難,同時(shí)圖像的腐蝕、膨脹操作也在一定程度上增加了算法的誤差。
YOLO算法雖然能夠檢出條碼,但無法提供角度相關(guān)信息,且有一定概率將連續(xù)的條碼分為多個(gè)檢出(見圖3(c))。本文所述方法不僅可以定位出條碼的位置,同時(shí)還能給出條形碼的旋轉(zhuǎn)信息,且在復(fù)雜背景下能夠較好地完成條碼檢測任務(wù)。
在不使用GPU加速的情況下,三者的召回率及耗時(shí)對(duì)比如表3所示。
表3 性能對(duì)比
經(jīng)對(duì)比可見,本文所述方法能較好地完成復(fù)雜背景下的條碼檢測任務(wù),且有較好的實(shí)時(shí)性。
針對(duì)復(fù)雜背景下的多條碼檢測問題,本文提出基于深度學(xué)習(xí)的檢測方法,不僅避免了復(fù)雜閾值設(shè)定帶來的困擾,同時(shí)可直接提取條形碼位置及掃描線,具有檢測步驟簡單、時(shí)效性好的特點(diǎn)。