宋昕彤, 王 駿, 李 甫, 潘 祥
(1.江南大學(xué) 人工智能與計(jì)算機(jī)學(xué)院,江蘇 無錫 214122; 2.上海大學(xué) 通信與信息工程學(xué)院,上海 200444; 3.無錫量子云數(shù)字新媒體科技有限公司,江蘇 無錫 214122)
近年來,隨著網(wǎng)絡(luò)和人工智能的快速發(fā)展,網(wǎng)絡(luò)直播和自媒體行業(yè)逐漸占據(jù)很大一部分。相關(guān)報道表明,網(wǎng)絡(luò)中存在的非法元素給監(jiān)管人員造成了不小的麻煩。因此對于合規(guī)圖片及視頻的檢測與監(jiān)管就有著非常重要的作用,目標(biāo)檢測是其中的一個代表性技術(shù)。最常見的目標(biāo)檢測算法[1,2]主要有基于區(qū)域卷積神經(jīng)網(wǎng)絡(luò)(region-CNN,R-CNN)類方法和基于SSD(single shot multibox detector)方法?;赗-CNN類方法中,最初的R-CNN算法的候選框由速度較慢的選擇搜索(selective search)算法完成,加之卷積網(wǎng)絡(luò)的重復(fù)計(jì)算,使得檢測速度慢,內(nèi)存占用量大。而Girshick R在2015年推出的Fast R-CNN算法,選擇運(yùn)用整張?jiān)紙D片輸入卷積神經(jīng)網(wǎng)絡(luò)(CNN)[3],因此計(jì)算量明顯降低,但檢測速度依舊不夠高。相比之下,YOLOv1[4]使用統(tǒng)一的網(wǎng)絡(luò)去直接預(yù)測輸入圖像的類別和位置,一步到位,明顯加快了檢測速度。而基于SSD方法的目標(biāo)檢測,檢測速率快且準(zhǔn)確度超過了R-CNN類方法和YOLOv1方法,但與YOLOv1以上版本算法相比,YOLOv2[5]和YOLOv3[6,7]算法在準(zhǔn)確率與SSD方法接近的同時,速度更快。很多學(xué)者對于YOLOv3進(jìn)行了運(yùn)用和改進(jìn)。文獻(xiàn)[8,9]中提出了基于改進(jìn)YOLOv3的有遮擋行人檢測,體現(xiàn)出了YOLOv3在目標(biāo)檢測方面的優(yōu)勢。
目前的深度學(xué)習(xí)模型需要大量計(jì)算力、內(nèi)存和電量。YOLO算法雖然大大增加了對于目標(biāo)的檢測速度,但由于網(wǎng)絡(luò)層數(shù)量的增加也導(dǎo)致了訓(xùn)練和推理計(jì)算量的增加,嵌入式設(shè)備等并不能很好解決這一問題。因此提高推斷效率,進(jìn)行網(wǎng)絡(luò)瘦身[10~13]就尤為重要。運(yùn)用剪枝的方法可以使得模型結(jié)構(gòu)更小、內(nèi)存利用率更高、運(yùn)行速度更快。
本文設(shè)計(jì)實(shí)現(xiàn)了面向人工智能圖片合規(guī)檢測的仿生模型,提出了一種融合神經(jīng)網(wǎng)絡(luò)剪枝和YOLOv3算法的合規(guī)圖片檢測和識別的方法。為了提高模型的準(zhǔn)確率和泛化能力,本文提出了混合人物訓(xùn)練集的訓(xùn)練方式,將開源的URL文件轉(zhuǎn)換為圖片格式,手動提取并分類文件中的合規(guī)與非合規(guī)圖片,建立為合規(guī)圖片數(shù)據(jù)集。其中部分合規(guī)人物圖像來源于VOC2007數(shù)據(jù)集,這在一定程度上降低了網(wǎng)絡(luò)的漏檢率。最后,本文針對提出的網(wǎng)絡(luò)模型,使用剪枝的方法對神經(jīng)網(wǎng)絡(luò)模型進(jìn)行壓縮,降低了模型的計(jì)算量,提高了運(yùn)行速度。
YOLO屬于回歸系列的目標(biāo)檢測方法,輸入(input)整張圖像來預(yù)測矩形框的坐標(biāo)、框中包含物體的置信度和物體所屬類別概率的預(yù)測。YOLO網(wǎng)絡(luò)目標(biāo)檢測的流程如圖1所示。
圖1 YOLO網(wǎng)絡(luò)流程
相比之下,YOLOv2又對每個候選框都進(jìn)行一個獨(dú)立類別的預(yù)測,提高了網(wǎng)絡(luò)對于多目標(biāo)的檢測能力。而YOLOv3網(wǎng)絡(luò)由于沒有使用全連接層,因此可以對應(yīng)任意大小的輸入圖像。此外,用設(shè)定卷積層的步長來代替池化層又使得YOLOv3很好地解決了對于小目標(biāo)的檢測,提高了檢測的精度。
目前,深度學(xué)習(xí)模型需要大量的計(jì)算和內(nèi)存,成為在需要實(shí)時推理或計(jì)算資源有限的邊緣設(shè)備和瀏覽器上運(yùn)行模型的瓶頸。剪枝(pruning)是深度學(xué)習(xí)的一種技術(shù),目標(biāo)是為了開發(fā)更小、更高效的神經(jīng)網(wǎng)絡(luò)。剪枝的模型優(yōu)化技術(shù)可以去掉權(quán)重張量中冗余的值,使得剪枝過后的神經(jīng)網(wǎng)絡(luò)模型更加輕便、運(yùn)行速度更快。
剪枝的標(biāo)準(zhǔn)有很多,最簡單的是暴力剪枝。假設(shè)C{D|W}為數(shù)據(jù)集D,參數(shù)集W的代價函數(shù),最小化L1-norm
(1)
這是一個組合問題,因?yàn)槊總€參數(shù)都有保留和去除兩種情況,所以,總共需要進(jìn)行計(jì)算的次數(shù)達(dá)到2|W|次。
Oracle剪枝計(jì)算每次去除一個神經(jīng)元,觀察代價函數(shù)的變化,如果代價函數(shù)更小,則說明去除這個神經(jīng)元有利于精度提高。但是這種方式的計(jì)算量也很大。
最小權(quán)重方法:每個權(quán)重的大小會消耗大量的計(jì)算,所以可以計(jì)算一系列相關(guān)的權(quán)重大小。定義一個計(jì)算核心權(quán)重L2范數(shù)大小的量
(2)
如果這個L2范數(shù)較小,那么說明這個核心權(quán)重對結(jié)果的影響較小,就可以舍棄。這種方式在微調(diào)(fine-tuning)中就可以完成,不需要再增加額外的計(jì)算。
Taylor展開:如果將代價函數(shù)進(jìn)行泰勒展開,忽略高階項(xiàng),可以通過代價函數(shù)最小化來剪枝的技術(shù)。假設(shè)hi為來自i參數(shù)的輸出結(jié)果,如果值為0,表示這個參數(shù)可以被去除。那么去除后對代價函數(shù)的影響可以用公式表示為
θ=ΔC(hi)|C(D,hi=0)-C(D,hi)|
(3)
如果對代價函數(shù)的影響較小,那么說明這個參數(shù)是冗余的,就可以被優(yōu)化掉。
剪枝在決策樹中用于解決過擬合問題,同時也可以降低計(jì)算量。而在深度學(xué)習(xí)中主要是為了減少神經(jīng)網(wǎng)絡(luò)中冗余,減少參數(shù),加速硬件的計(jì)算。
本文提出的面向人工智能圖片合規(guī)檢測的基本流程:獲得人物圖像,經(jīng)過YOLO目標(biāo)檢測模塊,判斷其是否為合規(guī)圖像,非合規(guī)圖像標(biāo)記為警告(warning),合規(guī)圖像則標(biāo)記為人物(person)。
本文基于YOLOv3目標(biāo)檢測模型,每次對矩形框預(yù)測時,都輸出tx,ty,tw,th,to,這表示每一個框的位置。之后通過以下公式計(jì)算出絕對的位置
bx=σ(tx+cx),by=σ(ty+cy),bw=Pwetw,bh=Pheth,
Pr(object)×IoU(b,object)=σ(to)
(4)
式中 IoU(intersection over union)為交并比,包含了預(yù)測框的準(zhǔn)確程度和預(yù)測框內(nèi)存在目標(biāo)的概率。Pr(object)為人工標(biāo)注的框是否落在一個網(wǎng)格單元中,是則取1,否則取0。
對于YOLO來說,損失函數(shù)非常重要,YOLOv3除了w,h寬高的損失函數(shù)是總方誤差之外,其他部分的損失函數(shù)用的是二值交叉熵。故模型的損失函數(shù)表示為
(5)
二元交叉熵(binary cross entropy,BCE)的具體公式計(jì)算如下
(6)
此外,YOLOv3還使用了殘差結(jié)構(gòu),學(xué)習(xí)的目標(biāo)就從學(xué)習(xí)完整的信息變成了學(xué)習(xí)殘差,學(xué)習(xí)優(yōu)質(zhì)特征的難度大大減小。
本文針對YOLO存在的問題[14],提出一種基于深度神經(jīng)網(wǎng)絡(luò)剪枝(仿生模型)的YOLO改進(jìn),即Prune-YOLO。
神經(jīng)網(wǎng)絡(luò)的剪枝借鑒了生物學(xué)思想,如圖2所示。
圖2 神經(jīng)元剪枝
網(wǎng)絡(luò)通??雌饋砼c圖2中左邊的類似:下層的每個神經(jīng)元都與上層每個神經(jīng)元相連,這意味著需要進(jìn)行大量的浮點(diǎn)數(shù)相乘計(jì)算。然而理想情況下,只需要將每個神經(jīng)元連接到其他的幾個神經(jīng)元上就可以省去一些乘法。這就是所謂的“稀疏”網(wǎng)絡(luò)。如果可以根據(jù)神經(jīng)元的貢獻(xiàn)大小對網(wǎng)絡(luò)中的神經(jīng)元進(jìn)行排序,那么就可以將排名較低的神經(jīng)元從網(wǎng)絡(luò)中移除,從而得到一個更小、更快的網(wǎng)絡(luò)。網(wǎng)絡(luò)通常是進(jìn)行訓(xùn)練—修剪—訓(xùn)練—修剪的循環(huán),即不斷迭代,這可以較大程度保證模型的準(zhǔn)確率。如果一次修剪太多,可能嚴(yán)重破壞網(wǎng)絡(luò)。因此在實(shí)際操作中,這是一個迭代的過程,即通常稱為“迭代剪枝”。
針對 YOLO 進(jìn)行深度神經(jīng)壓縮,主要通過模型稀疏化訓(xùn)練完成。稀疏的想法是對于每一個通道都引入一個縮放因子,通道的輸出相乘。之后融合訓(xùn)練網(wǎng)絡(luò)權(quán)重和縮放因子,最后將小的縮放因子通道直接移除,微調(diào)剪枝后的網(wǎng)絡(luò)。損失函數(shù)被定義為
(7)
式中 (x,y)為訓(xùn)練數(shù)據(jù)和標(biāo)簽,W為網(wǎng)絡(luò)中可訓(xùn)練的參數(shù),函數(shù)中第一項(xiàng)是網(wǎng)絡(luò)的訓(xùn)練損失函數(shù)。g(?)為在縮放因子上的乘法項(xiàng),λ為平衡因子。本文的實(shí)驗(yàn)采用L1正則化,選擇g(s)=|s|,L1正則化是稀疏化中運(yùn)用最廣泛的一點(diǎn)。引入了縮放因子正則化后,訓(xùn)練出來的模型許多因子都會趨于0。
本文的實(shí)驗(yàn)環(huán)境如下:CPU為Intel?CoreTMi7 8th Gen;內(nèi)存16 GB;在Python 3.6 64 bit環(huán)境下運(yùn)行,Tensorflow—GPU 1.14.0 + Keras 2.1.5。
為了對非合規(guī)圖片進(jìn)行識別,保證實(shí)驗(yàn)的完整性,YOLO需要對大量的數(shù)據(jù)進(jìn)行訓(xùn)練。本文的圖像識別只是一個合規(guī)圖片與非合規(guī)圖片的二分類問題,所以輸出層只有兩個神經(jīng)元,對應(yīng)了合規(guī)圖片與非合規(guī)圖片。實(shí)驗(yàn)共采集到4 500張圖片,其中包括2 100張非合規(guī)圖片的正樣本和2 400張合規(guī)圖片的負(fù)樣本。其中共3 900張訓(xùn)練圖片,包含1 800張非合規(guī)圖片以及2 100張合規(guī)圖片,測試圖片以隨機(jī)的方式分別從合規(guī)圖片樣本與非合規(guī)圖片樣本中各自選取300張。采集到的非合規(guī)圖片由NSFW數(shù)據(jù)源URL獲取,合規(guī)圖片的人物圖像部分來源于VOC2007數(shù)據(jù)集,將其建立為本文所需數(shù)據(jù)集。之后將所需圖片制作成YOLO需要的VOC格式數(shù)據(jù)集,制作過程如下:1)將URL網(wǎng)絡(luò)地址文件下載并保存為JPG格式,找出重復(fù)項(xiàng)及破損的文件并刪除。2)將所有圖片統(tǒng)一命名為000001.jpg的形式。3)使用LableImg人工制作數(shù)據(jù)集,生成VOC格式所需的.xml文件,并放入VOC格式相應(yīng)的文件夾中。4)生成所需訓(xùn)練集和驗(yàn)證集。
本文目標(biāo)檢測算法中使用mAP(mean average precision)值作為一種標(biāo)準(zhǔn)來衡量算法的精確度高低。精確率P為模型預(yù)測的所有目標(biāo)中,預(yù)測正確的比例。召回率R為所有真實(shí)目標(biāo)中,預(yù)測正確的比例。評價標(biāo)準(zhǔn)被定義為
(8)
其中,TP為真陽性,TN為真陰性,F(xiàn)P為假陽性,F(xiàn)N為假陰性。
3.4.1 合規(guī)圖片檢測結(jié)果
運(yùn)用YOLO網(wǎng)絡(luò)檢測合規(guī)圖片的構(gòu)建及實(shí)現(xiàn)基于深度學(xué)習(xí)框架Keras。實(shí)驗(yàn)以4 500張圖片進(jìn)行迭代操作,迭代100次,迭代之后的結(jié)果作為最終的權(quán)重模型。實(shí)驗(yàn)主要以預(yù)測損失值的大小來判斷網(wǎng)絡(luò)迭代學(xué)習(xí)的效果。實(shí)驗(yàn)結(jié)果如圖3所示。
圖3 迭代次數(shù)與損失值的關(guān)系
圖3中的橫坐標(biāo)(x)為迭代次數(shù),其中圖(a)的縱坐標(biāo)為loss值(訓(xùn)練集的損失值),圖(b)的縱坐標(biāo)為val_loss值(測試集的損失值)。從圖中可以看出,損失值不斷下降,說明網(wǎng)絡(luò)仍在學(xué)習(xí)。由此可以看出本文訓(xùn)練的模型有效。
圖片檢測的實(shí)驗(yàn)中,對于負(fù)樣本的預(yù)測準(zhǔn)確度如圖4所示,而對于正樣本(非合規(guī)圖片)也可以準(zhǔn)確生成預(yù)測框,且準(zhǔn)確度達(dá)到了95 %以上。實(shí)驗(yàn)結(jié)果表明,訓(xùn)練之后的網(wǎng)絡(luò)模型在經(jīng)過100次迭代之后,損失值可降低到個位數(shù)。并且在對人像圖片進(jìn)行預(yù)測時,準(zhǔn)確度達(dá)到99 %以上。
圖4 目標(biāo)圖片檢測結(jié)果
為了綜合評價本文算法在合規(guī)圖片數(shù)據(jù)集上的有效性,綜合上述提出的目標(biāo)檢測算法,在本文制作的合規(guī)圖片數(shù)據(jù)集上,從預(yù)測時間和mAP值兩方面將本文算法與R-CNN,F(xiàn)ast R-CNN,F(xiàn)aster R-CNN,SSD等目標(biāo)檢測算法進(jìn)行對比。實(shí)驗(yàn)結(jié)果如表1所示。
表1 各目標(biāo)檢測算法的對比
由實(shí)驗(yàn)結(jié)果可知,本文算法在合規(guī)圖片數(shù)據(jù)集中達(dá)到了很好的實(shí)驗(yàn)效果。相對于其他目標(biāo)檢測算法,本文使用的算法明顯優(yōu)于其他算法,檢測的速度更快,準(zhǔn)確度更高。
3.4.2 Prune-YOLO的實(shí)驗(yàn)結(jié)果
Prune-YOLO是對YOLO模型的剪枝,本文首先對模型進(jìn)行稀疏化訓(xùn)練,之后在神經(jīng)網(wǎng)絡(luò)中進(jìn)行剪枝的操作,然后對網(wǎng)絡(luò)進(jìn)行重新訓(xùn)練。重訓(xùn)練的目的是使網(wǎng)絡(luò)模型具有更高的精度,防止網(wǎng)絡(luò)過擬合。多次迭代之后由于部分卷積層的通道數(shù)大幅度減少,因此最終得到體積更小、檢測效果更好的網(wǎng)絡(luò)模型。
表2為壓縮后的YOLO模型與原有模型的對比。
表2 模型壓縮前后參數(shù)對比
針對網(wǎng)絡(luò)合規(guī)圖像提出了一種面向人工智能圖片合規(guī)檢測的仿生模型。實(shí)驗(yàn)結(jié)果表明:YOLOv3在合規(guī)圖像數(shù)據(jù)集上能夠更好地定位和檢測目標(biāo)。而基于深度神經(jīng)網(wǎng)絡(luò)剪枝(仿生模型)的YOLO改進(jìn),即Prune-YOLO,使得網(wǎng)絡(luò)模型更小,檢測速度更快。實(shí)驗(yàn)結(jié)果表明,經(jīng)過優(yōu)化的YOLO網(wǎng)絡(luò)模型可以在大小減少60 %的情況下穩(wěn)定運(yùn)行,且準(zhǔn)確率相較于原模型只有2 %以內(nèi)的差距,在嵌入式設(shè)備上的檢測速度也獲得原模型1倍的加速效果。整體的實(shí)驗(yàn)結(jié)果表明,本文提出的面向人工智能圖片合規(guī)檢測的仿生模型有效地完成了對合規(guī)圖像的檢測和定位,具有比較好的魯棒性。