卞玉麗
(廈門工學院 福建省廈門市 361021)
基于深度學習的目標檢測的思路是首先根據一定規(guī)則在圖片中生成大量的錨框,它們分布在圖片中不同的位置以及具有不同的大小,然后通過深度網絡判斷物體與哪個框比較貼合,同時預測出物體的類別。由于現(xiàn)實世界中的物體有任意的尺寸以及可能處于圖片中的任意位置,因此基于錨框的方法實現(xiàn)需要預生成很多候選框,比如DSSD 超過4 萬[1],RetinaNet 更有超過10 萬的候選框[2],數(shù)以萬計的候選框只有極少數(shù)包含真實的目標,就是說負樣本的個數(shù)遠遠高于正樣本的個數(shù),造成訓練效率較低、訓練過程較長[3]。
CornerNet[4]則屬于Anchor Free,即它不需要候選框。它將一個定位目標位置的長方形框轉變?yōu)榍蠼馄渥笊辖桥c右下角兩個點的坐標問題。CornerNet 通過深度網絡直接回歸出物體的左上角與右下角兩個關鍵點的坐標,這樣就直接定位出物體的位置,避免了基于錨框方法的缺點。
如圖1 所示,論文中基于labelme 進行數(shù)據的標注,標注時選擇創(chuàng)建矩形框,然后在彈出的小窗口中輸入缺陷的名字,比如defect,這樣就會生成該圖片對應的后綴為.json 的標注文件,默認情況下標注文件名與圖片的名字一樣。
圖1:Labelme 標注過程
標注文件的主要信息為缺陷的類別,矩形框的左上角及右下角坐標,形狀類別,以及對應的圖片的名字。
上面的文件分布與標注格式是labelme 生成的,而一般的目標檢測網絡都要求采用微軟的COCO 數(shù)據集標注格式,這樣就需要腳本對前面生成的標注文件進行轉換。COCO 數(shù)據集中,主要分為兩個文件夾,annotations 里面放的是3 個標注文件,這三個文件分別是訓練、驗證、測試時的標注文件。images 目錄下是三個目錄,每一個目錄中包含若干圖片,它們分別是訓練、驗證和測試時用到的圖片,與annotations 中的三個文件相對應。annotations 中的三個后綴為.json 的文件,每個都是多張圖片標注信息的匯總,這一點與labelme 標注產生的每個json 文件僅對應一張圖片有著本質的區(qū)別。coco 數(shù)據集格式如圖2 所示。
圖2:coco 數(shù)據集格式
以instances_trainval2017.json文件為例,其中的文件內容見圖3。catetories,images,annotations 是三個list,每個list 的元素都是一個dict,每個dict 中存放著類別、圖像或者標注信息。
圖3:COCO 標注json 文件內容分布
CornerNet 需要網絡計算出一個box 的左上、右下兩個坐標點,同時給出物體的類別。因此經過骨干網絡提取特征之后,網絡的最后需要生成一個尺寸為(category, height, width)的三維特征數(shù)組。深度學習本質上還是有監(jiān)督學習,因此根據前面json 標注文件中的信息,提取出每個標注框box 左上和右下坐標位置后,生成標簽。每一個標注框除了兩個點的坐標信息外還有一個類別信息,CornerNet 中為每個點生成一組特征集,同樣每個點也需要有一組對應的標簽特征集。圖4(a)為一個點的標簽特征集,圖4(b)為該點的深度學習網絡生成的對應的特征集。圖4 中假定缺陷類別為6,特征的長和寬都為128,因此對應的特征的尺寸為(6,128,128)。
圖4:CornerNet 標簽及生成特征圖
圖5 中為點的標簽信息生成的流程。之所以變成了4 維數(shù)組,是因為增加了batch 作為第一維。神經網絡在訓練時是以一個批次(batch)的圖片為單位進行訓練的,通俗的說就是我們拿數(shù)據喂神經網絡,每次喂的都是若干張圖片的標注框信息。在圖5 中,假定每個批次(batch)的大小為3 張圖片,缺陷的類別為6,生成的單個特征圖的大小為(128,128)。
圖5:CornerNet 中標簽的生成過程
神經網絡本質上是有監(jiān)督學習,訓練時輸入一批次(batch)圖片以及對應標簽信息,標簽是以多維矩陣形式給出的。比如,一次輸入3 張圖片,以及其對應的(3,6,128,128)標簽信息,該四維矩陣中某些點為1,大部分點為0,為1 的那些點意味著此處為某個框的頂點。網絡基于3 張照片提取特征,最后生成與標簽一樣結構及尺寸的4 維矩陣特征。損失函數(shù)的輸入是標簽特征與計算特征兩個矩陣,輸出是一個標量,該標量衡量這兩個矩陣之間的相差程度,如果兩個矩陣完全一樣,那么損失函數(shù)為0,代表著此時網絡的輸出與監(jiān)督信息完全一致,網絡的參數(shù)達到最優(yōu)無需再做優(yōu)化調整。反之如果特征矩陣之間的差異較大,則損失函數(shù)的計算值也就越大,并且一般情況下其導數(shù)也越大,然后按照梯度下降法使得損失函數(shù)減小的方向去調整網絡參數(shù)。接著輸入下一個批次的圖片信息、計算網絡輸出矩陣、計算損失函數(shù)、調整網絡參數(shù),開始了下一代的訓練,如此反復就能將網絡訓練好。
CornerNet 的損失函數(shù)包含三個部分,限于篇幅此處僅分析其最重要最基礎的那部分。此處損失函數(shù)中有三重求和,最外圍(最左側)的求和是指遍歷圖片中的各個類別的標注框的頂點,里面的兩次求和是指在對應類別上那個二維特征圖中進行遍歷計算并求和。最后的Ldet是一個正的標量值。
上式中,ycij是事先標定的標簽值,pcij是網絡的生成值。第一個分支的條件是ycij=1,表示該位置為真實的角點位置,即正樣本,此位置網絡的輸出值應該越大即越接近于1 則越好。第二個分支則是不存在角點的區(qū)域,即負樣本區(qū)域,此處網絡的輸出越接近于0則越好。α,β 是超參數(shù),取2 和4。損失函數(shù)的執(zhí)行過程見圖6。
圖6:損失函數(shù)的執(zhí)行過程
圖6 中,①中的pred 為網絡計算得到的,gt 為標簽值,它們都是多維矩陣且尺寸相同。②③兩步是計算負樣本的損失值,即(1-ycij)4(pcij)2log(1-pcij),其中②實現(xiàn)(1-ycij)4,③中包含3 部分相乘,與公式中一致。④實現(xiàn)正樣本的值,即公式(1-pcij)αlog(pcij)。⑤考慮正樣本與負樣本,并除以樣本點的個數(shù),由于小于1 的數(shù)求對數(shù)時其值為負,即前面各步算出來的值都是負數(shù),因此此處再加一負號使其變?yōu)檎龜?shù)。
總共標注了800 張圖片,其中100 張為驗證集,100 張為測試集,600 張為訓練集。訓練機器配置如下:cpu,W-2135,3.7GHz,顯卡:GRX1080Ti, 內存32G, pytorch1.0,python3.7,CUDA10.0,cuDNN 7.4.采用旋轉、縮放等數(shù)據增強技術,batch 為3,學習率0.00025,訓練次數(shù)60000。部分實驗結果展示如圖7。
圖7:木材缺陷識別結果
CornerNet 基于單階段思路,直接回歸出物體box 區(qū)域的左上與右下兩個角點,效率較高。本文在分析其工作原理之后,并將其成功應用于木材表面缺陷檢測的實際項目中,但目前僅僅用于檢測單個類別的缺陷,將其進一步擴展到多個類別的缺陷檢測尤其是缺陷的樣本不多時該如何對網絡進行改進是下一步研究的內容。