王婷婷 程鴻芳



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