王婷婷 程鴻芳
摘要:目前主流的基于CNN的目標(biāo)檢測(cè)算法大致分為兩大類:一類是2-stage檢測(cè)算法,把檢測(cè)問題分為兩個(gè)階段,首先生成候選區(qū)域,然后再對(duì)候選區(qū)域進(jìn)行分類,這類算法的典型代表是基于region proposal的R-CNN系列算法,如R-CNN、Fast R-CNN、Faster R-CNN等;另一類是1-stage檢測(cè)算法,對(duì)圖像中的每一個(gè)部分都會(huì)進(jìn)行預(yù)測(cè),而且還可以直接生成對(duì)象的類別概率以及其位置坐標(biāo)值,不需要region proposal階段,也就是不需要生成候選區(qū)域,比較典型的算法有YOLO和SSD。在此基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于CNN模型的目標(biāo)檢測(cè)系統(tǒng),其開發(fā)環(huán)境為Windows10,使用了Tensorflow的深度學(xué)習(xí)框架,利用PyQt5作為界面的開發(fā)框架,底層使用Python語言。
關(guān)鍵詞:目標(biāo)檢測(cè);CNN模型;Tensorflow;Python
0 引言
CNN(Convolutional Neural Network)是一種前饋神經(jīng)網(wǎng)絡(luò),其本質(zhì)是一個(gè)多層感知機(jī),它最開始并不是由計(jì)算機(jī)專業(yè)的學(xué)者提出來的,而是由一個(gè)生物學(xué)家在研究視覺皮層的時(shí)候提出。CNN人工神經(jīng)元可以響應(yīng)一部分覆蓋范圍內(nèi)的周圍單元,包括卷積層(convolutional layer)和池化層(pooling layer),其基本結(jié)構(gòu)如圖1所示。
CNN采用局部連接和權(quán)值共享的方式,減少了權(quán)值數(shù)量,使網(wǎng)絡(luò)易于優(yōu)化,降低了模型的復(fù)雜度,減小了過擬合的風(fēng)險(xiǎn),在處理二維圖像的問題上,特別是在識(shí)別位移、縮放及其他形式扭曲不變形的應(yīng)用上,具有良好的魯棒性和運(yùn)算效率,在大型圖像處理方面也有著出色表現(xiàn),是深度學(xué)習(xí)算法應(yīng)用最成功的領(lǐng)域之一。
1 系統(tǒng)環(huán)境配置
GPU版本為:
(1)系統(tǒng):Linux;
(2)處理器:GPU RTX 2080Ti;
(3)已安裝的內(nèi)存(RAM):16 GB+16 GB;
(4)固態(tài)硬盤:1 TB;
(5)系統(tǒng)類型:64位操作系統(tǒng),基于x64的處理器。
本目標(biāo)檢測(cè)系統(tǒng)的開發(fā)環(huán)境為Windows 10+Tensorflow 1.13.1+Python 3.5.4,利用PyQt5作為界面的開發(fā)框架,底層使用了Python語言,主要實(shí)現(xiàn)Faster R-CNN、YOLO和SSD 3個(gè)算法的目標(biāo)檢測(cè)。
2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
系統(tǒng)大致分為3個(gè)部分:
(1)模型訓(xùn)練模塊:該模塊負(fù)責(zé)使用Faster R-CNN、YOLO和SSD 3個(gè)算法進(jìn)行網(wǎng)絡(luò)模型的訓(xùn)練,生成訓(xùn)練得到的最終模型;
(2)模型檢測(cè)模塊:檢測(cè)模塊是整個(gè)檢測(cè)系統(tǒng)的核心模塊,使用訓(xùn)練好的模型進(jìn)行加載,驗(yàn)證模型的準(zhǔn)確度,然后使用編寫好的API實(shí)現(xiàn)前向檢測(cè);
(3)結(jié)果顯示模塊:該模塊提供了一個(gè)交互式平臺(tái),用于輸出最后檢測(cè)對(duì)象的類別以及位置信息的判斷結(jié)果。
2.1? ? 模型訓(xùn)練模塊
系統(tǒng)在做目標(biāo)檢測(cè)時(shí),需要有訓(xùn)練集、驗(yàn)證集以及測(cè)試集。首先,使用VOC2007數(shù)據(jù)集,VOC2007數(shù)據(jù)集文件夾如圖2所示。JPEGImages:所有的樣本圖片,圖片格式必須是jpg、jpeg格式,VOC數(shù)據(jù)集格式采用6位數(shù)字編碼,所以圖片的標(biāo)號(hào)為000001.jpg、000002.jpg等。Annotations:人工設(shè)置的圖像標(biāo)注,為xml格式文件。ImageSets:數(shù)據(jù)集文件夾,包含文本文件,存放訓(xùn)練樣本和測(cè)試樣本的索引信息。
然后,下載VGG16的預(yù)訓(xùn)練模型,放在相應(yīng)的路徑中,所有的文件就是Faster R-CNN程序,F(xiàn)aster R-CNN程序主要文件夾如圖3所示。
data:存放數(shù)據(jù)圖片,下載的VOC2007數(shù)據(jù)集和VGG16預(yù)訓(xùn)練模型都存放在這里。
default:存放自己訓(xùn)練好的模型。
lib:存放Python的接口文件,如數(shù)據(jù)讀入等。
train.py:訓(xùn)練的Python文件。
demo.py:測(cè)試的Python文件。
圖4是兩張測(cè)試原圖。
在Linux系統(tǒng)GPU版本的Tensorflow下運(yùn)行,把最大迭代次數(shù)改為40 000,在GPU下運(yùn)行7~8 h完成模型訓(xùn)練,最后得到的訓(xùn)練模型文件如圖5所示。
最后得到的測(cè)試結(jié)果如圖6所示。
圖6(a)中得到了目標(biāo)person和potted plant,圖6(b)中分別檢測(cè)到了car、dog、horse以及person,但是圖片中被框出來的部分不在一張圖片上顯示,而是按照類別進(jìn)行劃分,即每一類一張圖片,此時(shí),需要修改plt的位置,把plt從vis_detections中放到demo中,這樣所有類別都會(huì)在同一個(gè)plt中,修改后的結(jié)果如圖7所示。
本目標(biāo)檢測(cè)系統(tǒng)中還有2個(gè)算法是YOLO和SSD,YOLO訓(xùn)練使用的是VOC2007數(shù)據(jù)集和預(yù)訓(xùn)練好的模型yolo-small.ckpt,其中因?yàn)閥olo-small.ckpt預(yù)訓(xùn)練好了,可以直接拿來測(cè)試,得到的結(jié)果如圖8所示。
YOLO訓(xùn)練的迭代次數(shù)也同樣可以在config.py里面修改,在訓(xùn)練過程中,YOLO是對(duì)變量通過采用指數(shù)平均數(shù)EMA(exponential moving average)來提高整體訓(xùn)練性能,同時(shí),為了獲得較好的學(xué)習(xí)性能,對(duì)學(xué)習(xí)速率同樣進(jìn)行了指數(shù)衰減,使用exponential_decay函數(shù)來實(shí)現(xiàn)此功能。本系統(tǒng)所使用的YOLO算法不太精確,通過測(cè)試結(jié)果能夠明顯感受到Y(jié)OLO的精確度不如Faster R-CNN算法,尤其是圖6(a)這種復(fù)雜的圖,YOLO能夠檢測(cè)到的目標(biāo)很少。
SSD的訓(xùn)練使用的是VOC2007數(shù)據(jù)集和預(yù)訓(xùn)練好的模型ssd_300_vgg.ckpt,其中,直接用ssd_300_vgg.ckpt測(cè)試,得到的結(jié)果如圖9所示。
測(cè)試結(jié)果中對(duì)象的類別用數(shù)字表示,這對(duì)于使用者來說很不直觀,在研究了SSD算法中可視化部分visualization.py程序后發(fā)現(xiàn),原始代碼檢測(cè)后的圖像分類是數(shù)字號(hào),不能夠直接讀取,然后對(duì)代碼進(jìn)行了修改,主要是對(duì)list的讀取,然后再按照數(shù)字查找key值并顯示,修改后得到的結(jié)果如圖10所示。
2.2? ? 檢測(cè)模塊
為了驗(yàn)證訓(xùn)練出的模型的準(zhǔn)確率,使用測(cè)試數(shù)據(jù)集對(duì)其進(jìn)行測(cè)試,輸出測(cè)試結(jié)果的可視化部分,檢測(cè)模塊流程如圖11所示。
在最后的結(jié)果可視化這一步操作中,3個(gè)算法主要都是利用了Matplotlib和OpenCV來實(shí)現(xiàn)的。Matplotlib是一個(gè)Python的2D繪圖庫(kù),它以各種硬拷貝格式和跨平臺(tái)的交互式環(huán)境生成出版質(zhì)量級(jí)別的圖形,通過Matplotlib,開發(fā)者可以僅需要幾行代碼便可生成繪圖,Matplotlib使用NumPy進(jìn)行數(shù)組運(yùn)算,并調(diào)用一系列其他的Python庫(kù)來實(shí)現(xiàn)硬件交互。OpenCV是一個(gè)包含了2 500多個(gè)經(jīng)過優(yōu)化的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)算法的開源計(jì)算機(jī)視覺庫(kù),基于C/C++語言,支持Linux/Windows/MacOS/Android/iOS,并提供了Python、Matlab和Java等語言的接口,和Python一樣,當(dāng)前的OpenCV也有2個(gè)大版本,即OpenCV2和OpenCV3。
2.3? ? 系統(tǒng)實(shí)現(xiàn)
本目標(biāo)檢測(cè)系統(tǒng)的界面基于PyQt5,利用QtDesigner來進(jìn)行開發(fā),底層通過Pycharm來調(diào)用Tensorflow環(huán)境,集成了加載檢測(cè)模型、目標(biāo)圖像讀取、可視化檢測(cè)結(jié)果這些模塊。首先,配置pycharm來實(shí)現(xiàn)在pycharm里面打開QtDesigner,生成Qt文件,通過PyUIC來完成Qt界面到Python代碼的轉(zhuǎn)換,然后,將3種目標(biāo)檢測(cè)算法的文件夾導(dǎo)入到界面文件夾中,如圖12所示。
界面的主要類別放在了main.py文件中,start.py文件用來運(yùn)行界面,在3個(gè)子窗口文件中存放了目標(biāo)檢測(cè)算法的主要調(diào)用函數(shù),主窗口類別為class Ui_MainWindow(object),子窗口類別為class childWindow1(QDialog)、class childWindow2(QDialog)、class childWindow3(QDialog),通過主窗口跳轉(zhuǎn)到子窗口來進(jìn)行測(cè)試:
3 結(jié)語
CNN憑借其強(qiáng)大的特征提取能力,近年來被廣泛應(yīng)用于計(jì)算機(jī)視覺領(lǐng)域,而目標(biāo)檢測(cè)作為計(jì)算機(jī)視覺領(lǐng)域中的一個(gè)重要研究方向,是完成圖像語義識(shí)別、目標(biāo)跟蹤、圖像描述等高級(jí)復(fù)雜的視覺任務(wù)的基礎(chǔ),通過對(duì)CNN和目標(biāo)檢測(cè)的研究,發(fā)現(xiàn)基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法已是主流趨勢(shì)。在目標(biāo)檢測(cè)領(lǐng)域,還有很多未知知識(shí)值得我們?nèi)ヌ剿?,相信隨著深度學(xué)習(xí)技術(shù)的不斷進(jìn)步,人工智能在計(jì)算機(jī)視覺領(lǐng)域的應(yīng)用將會(huì)獲得進(jìn)一步發(fā)展。
[參考文獻(xiàn)]
[1] REN S Q,HE K M,GIRSHICK R,et al.Faster R-CNN:Towards real-time object detection with region proposal networks[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2017,39(6):1137-1149.
[2] CHENG G,HAN J,ZHOU P,et al.Learning rotation-invariant and fisher discriminative convolutional neural networks for object detection[J].IEEE Transactions on? Image Processing,2019,28(1):265-278.
[3] 沈鵬.基于圖像的草地退化識(shí)別研究[D].成都:電子科技大學(xué),2019.
[4] 包樺楠,秦建波,唐曼玲,等.基于淺層神經(jīng)網(wǎng)絡(luò)的電視臺(tái)標(biāo)識(shí)別算法的研究[J].智能建筑,2018(8):33-36.
[5] 鄧志鋒,閔衛(wèi)東,鄒松.一種基于CNN和人體橢圓輪廓運(yùn)動(dòng)特征的摔倒檢測(cè)方法[J].圖學(xué)學(xué)報(bào),2018,39(6):1042-1047.
[6] 朱林.基于深度學(xué)習(xí)的蘇南鄉(xiāng)村建筑物提取及年代分類研究[D].徐州:中國(guó)礦業(yè)大學(xué),2019.
[7] 曹湘,李譽(yù)坤,錢葉,等.基于混合神經(jīng)網(wǎng)絡(luò)的電力短文本分類方法研究[J].計(jì)算機(jī)與數(shù)字工程,2019,47(5):1145-1150.
[8] 方春,孫福振,任崇廣.基于深度學(xué)習(xí)的大蒜鱗芽朝向識(shí)別研究[J].計(jì)算機(jī)應(yīng)用研究,2018,36(2):598-600.
[9] 張少巍,倪紹洲.基于混合神經(jīng)網(wǎng)絡(luò)的人臉表情識(shí)別研究[J].長(zhǎng)春大學(xué)學(xué)報(bào),2019,29(2):37-40.
[10] 師利霞.基于python的氣象統(tǒng)計(jì)數(shù)據(jù)的等值線應(yīng)用[J].信息技術(shù)與信息化,2019(5):95-97.
收稿日期:2020-07-08
作者簡(jiǎn)介:王婷婷(1982—),女,江蘇贛榆人,碩士,講師,主要從事計(jì)算機(jī)軟件、大數(shù)據(jù)方面的教學(xué)與研究工作。