深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-搭建 MobileNet 實(shí)現(xiàn)電表編碼區(qū)域檢測_第1頁
深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-搭建 MobileNet 實(shí)現(xiàn)電表編碼區(qū)域檢測_第2頁
深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-搭建 MobileNet 實(shí)現(xiàn)電表編碼區(qū)域檢測_第3頁
深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-搭建 MobileNet 實(shí)現(xiàn)電表編碼區(qū)域檢測_第4頁
深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)-搭建 MobileNet 實(shí)現(xiàn)電表編碼區(qū)域檢測_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

搭建MobileNet實(shí)現(xiàn)電表編碼區(qū)域檢測深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)知識要點(diǎn)8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介8.1.1目標(biāo)檢測基礎(chǔ)8.1.2YOLO算法8.1.3下載YOLOv3源碼8.2數(shù)據(jù)集介紹及處理8.3主干網(wǎng)絡(luò)搭建與訓(xùn)練8.4模型結(jié)構(gòu)修改8.4.1MobileNet簡介8.4.2MobileNet搭建8.4.3網(wǎng)絡(luò)模型替換8.5模型訓(xùn)練結(jié)果測試目錄目標(biāo)檢測是計(jì)算機(jī)視覺和數(shù)字圖像處理的一個(gè)熱門方向,廣泛應(yīng)用于機(jī)器人導(dǎo)航、智能視頻監(jiān)控、工業(yè)檢測、航空航天等諸多領(lǐng)域,它通過計(jì)算機(jī)視覺減少對人力資源的消耗,具有重要的現(xiàn)實(shí)意義。同時(shí),目標(biāo)檢測也是泛身份識別領(lǐng)域的一個(gè)基礎(chǔ)性的算法,對后續(xù)的人臉識別、步態(tài)識別、人群計(jì)數(shù)、實(shí)例分割等任務(wù)起著至關(guān)重要的作用。8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介8.1.1目標(biāo)檢測基礎(chǔ)目標(biāo)定位。由于目標(biāo)可能出現(xiàn)在圖像的任何位置,而且目標(biāo)的大小、長寬比例也不確定,因此最初采用滑動窗口的策略對整幅圖像進(jìn)行遍歷,而且需要設(shè)置不同的大小及長寬比例。01OPTION區(qū)域選擇尺度不變特征轉(zhuǎn)換(Scale-InvariantFeatureTransform,SIFT)是一種機(jī)器視覺的算法,用來偵測與描述圖像中的局部性特征,它在空間尺度中尋找極值點(diǎn),并提取出其位置、尺度、旋轉(zhuǎn)不變數(shù)。方向梯度直方圖(HistogramofOrientedGradient,HOG)是應(yīng)用在計(jì)算機(jī)視覺和圖像處理領(lǐng)域,用于目標(biāo)檢測的特征描述器,這項(xiàng)技術(shù)用來計(jì)算局部圖像梯度的方向信息的統(tǒng)計(jì)值。02OPTION特征提取8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介傳統(tǒng)的目標(biāo)檢測算法分為以下3個(gè)步驟。根據(jù)第(2)步提取的特征對目標(biāo)進(jìn)行分類,機(jī)器學(xué)習(xí)分類器有支持向量機(jī)(SupportVectorMachine,SVM)、自適應(yīng)增強(qiáng)(AdaptiveBoosting,AdaBoost)等。03OPTION分類8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介one-stage目標(biāo)檢測算法流程(1)one-stage目標(biāo)檢測算法。one-stage目標(biāo)檢測算法也稱one-shot目標(biāo)檢測算法,這種算法可以在一個(gè)階段中直接產(chǎn)生類別的概率和位置坐標(biāo)值。目前對one-stage目標(biāo)檢測算法的主要創(chuàng)新集中在如何設(shè)計(jì)CNN結(jié)構(gòu)、如何構(gòu)建網(wǎng)絡(luò)目標(biāo)以及如何設(shè)計(jì)損失函數(shù)上。8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介(2)two-stage目標(biāo)檢測算法。two-stage目標(biāo)檢測算法可以看作進(jìn)行兩次one-stage檢測,第一次初步檢測出物體位置,第二次對第一次的結(jié)果做進(jìn)一步的精化處理,對每一個(gè)候選區(qū)域進(jìn)行one-stage檢測。

two-stage目標(biāo)檢測算法流程one-stage目標(biāo)檢測算法相對于two-stage目標(biāo)檢測算法在計(jì)算機(jī)中的預(yù)測速度更快,但是由于two-stage目標(biāo)檢測算法還對結(jié)果進(jìn)行了進(jìn)一步的精化,所以two-stage目標(biāo)檢測算法的精度更高。目前對于two-stage目標(biāo)檢測算法的主要創(chuàng)新集中在如何高效準(zhǔn)確地生成RoI、如何獲取更好的RoI特征、如何加速two-stage目標(biāo)檢測算法以及如何改進(jìn)后處理方法等。(YouOnlyLookOnce,YOLO)算法是one-stage目標(biāo)檢測算法中的一員。它通過一個(gè)網(wǎng)絡(luò)就可以輸出類別、置信度、坐標(biāo)位置等。8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介8.1.2YOLO算法對圖像使用重塑(Resize)尺寸方法,變換圖像尺寸為448×448作為輸入,并使用GoogLeNet作為特征提取網(wǎng)絡(luò)。輸出的尺寸為7×7×30。01OPTIONYOLOv18.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介YOLOv1網(wǎng)絡(luò)結(jié)構(gòu)YOLOv1首先將ImageNet作為訓(xùn)練集預(yù)訓(xùn)練模型,最終達(dá)到88%的精度,然后使用遷移學(xué)習(xí)將預(yù)訓(xùn)練的模型應(yīng)用到當(dāng)前標(biāo)注的訓(xùn)練集進(jìn)行訓(xùn)練。模型輸出5維信息(x,y,w,h,score),使用LeakyReLU作為激活函數(shù),在全連接層后添加隨機(jī)失活層防止過擬合。得到輸出值之后,需要計(jì)算每個(gè)邊界框與真實(shí)標(biāo)簽的損失值,然后通過非極大值抑制篩選邊界框。YOLOv2首次提出了以DarkNet-19作為基礎(chǔ)模型,并使用卷積層代替了全連接層,解決了YOLOv1全連接的問題。YOLOv2還使用批量標(biāo)準(zhǔn)化替代了隨機(jī)失活,以提升模型的泛化能力,并且它舍棄了直接預(yù)測邊界框的位置和大小,受FasterRCNN的啟發(fā),有了錨定(Anchor)的概念,直接預(yù)測邊界框相對于錨定邊界框(AnchorBox)的偏移量。02OPTIONYOLOv28.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介YOLOv2網(wǎng)絡(luò)結(jié)構(gòu)YOLOv2網(wǎng)絡(luò)結(jié)構(gòu)如圖所示,其中conv.代表卷積操作;maxpool代表池化操作;classes代表識別的類別,boundaryboxes代表由識別物體的中心點(diǎn)以及寬、高組成的邊界盒。它將YOLOv2中的DarkNet-19改為特征提取能力更強(qiáng)的DarkNet-53;并且,它開始使用多尺度輸出來預(yù)測數(shù)據(jù),這大大提高了YOLO檢測小目標(biāo)的性能;它還使用特征金字塔結(jié)構(gòu),加強(qiáng)特征的提取。YOLOv3網(wǎng)絡(luò)結(jié)構(gòu)如圖所示,其中Backbone指主干網(wǎng)絡(luò)為DarkNet53,Neck指通過圖像金字塔加強(qiáng)特征提取,Prediction指將要進(jìn)行預(yù)測的特征向量,Concat指通過特征融合增強(qiáng)特征提取的效果,CBL是指卷積層(Conv)、批量標(biāo)準(zhǔn)化層(BN)、LeakyReLU激活層的融合層,Resunit是指進(jìn)行殘差連接,ResX是指CBL與Resunit進(jìn)行融合的層。03OPTIONYOLOv38.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介YOLOv3網(wǎng)絡(luò)結(jié)構(gòu)它將YOLOv3中的算法和目前主流的算法進(jìn)行整合,例如,使用空間金字塔池化(SpatialPyramidPooling,SPP)增大感受野(表示網(wǎng)絡(luò)內(nèi)部不同位置的神經(jīng)元對原圖像的感受范圍的大小)、引入注意力機(jī)制、使用Mosaics數(shù)據(jù)增強(qiáng)等。正是這些修改,使得YOLOv4成為業(yè)界中較為好用的目標(biāo)檢測框架,兼顧了精度與速度。圖中飯,MSCOCOObjectDetection是指在COCO數(shù)據(jù)集上進(jìn)行的目標(biāo)檢測,橫坐標(biāo)(FPS(V100))是指不同算法在V100GPU上的識別幀率,單位為幀/秒??v坐標(biāo)(AP)是識別準(zhǔn)確率??梢钥闯鯵OLOv4(ours)算法在兼顧識別準(zhǔn)確率的同時(shí)也有不錯的識別速率。04OPTIONYOLOv48.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介YOLOv4算法與其他算法的效果對比圖本書提供一個(gè)已經(jīng)編寫好的項(xiàng)目。將項(xiàng)目文件以及權(quán)重文件下載下來后,將權(quán)重文件放在keras-yolo3-master的文件夾下。接著使用PyCharm終端輸入圖所示的命令,把DarkNet框架下的YOLOv3配置文件轉(zhuǎn)換成Keras適用的.h5文件。8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介8.1.3下載YOLOv3源碼模型轉(zhuǎn)換然后測試是否可以成功運(yùn)行。進(jìn)入yolo.py文件中,在文件的最后添加如下代碼(需要自定義視頻地址)。運(yùn)行yolo.py文件,若出現(xiàn)圖所示的視頻檢測畫面,說明運(yùn)行成功。8.1目標(biāo)檢測基礎(chǔ)及YOLO網(wǎng)絡(luò)簡介實(shí)時(shí)目標(biāo)檢測yolo=YOLO()detect_video(yolo,'test.mp4')電表數(shù)據(jù)集包含廣州某小區(qū)的實(shí)際電表圖片,詳見本書配套資源,具體如圖所示。圖片是以電表編號以及已使用電量命名的,例如,2001477799000001_018.jpg。8.2數(shù)據(jù)集介紹及處理電表數(shù)據(jù)集需要對這些圖片數(shù)據(jù)進(jìn)行標(biāo)注,這里使用LabelImg進(jìn)行圖片標(biāo)注。8.2數(shù)據(jù)集介紹及處理使用命令pipinstalllabelimg,下載LabelImg工具。01OPTION下載LabelImg工具JPEGImages里面存放的是已經(jīng)修改好名稱的圖片;Annotations里面存放的是將要標(biāo)注好的XML文件;ImageSets里面存放的是后面會切分的訓(xùn)練集、測試集、驗(yàn)證集的圖片命名。02OPTION創(chuàng)建一個(gè)文件,結(jié)構(gòu)如圖所示。文件結(jié)構(gòu)8.2數(shù)據(jù)集介紹及處理按“Win+R”快捷鍵打開“命令提示符”窗口,輸入labelimg,就可以進(jìn)行數(shù)據(jù)標(biāo)注了。LabelImg布局如圖所示,可以打開OpenDir文件夾,對文件夾的圖片進(jìn)行標(biāo)注,文件夾的圖片路徑在右下角顏色框選區(qū)域中。單擊鼠標(biāo)右鍵選擇“Create”即可對指定的區(qū)域進(jìn)行標(biāo)注。命名顯示在右上角紅色框選區(qū)域中。03OPTION進(jìn)行數(shù)據(jù)標(biāo)注LabelImg布局8.2數(shù)據(jù)集介紹及處理04OPTION當(dāng)一張圖片標(biāo)注完成之后,單擊“Save”按鈕將其保存到Annotations文件夾中,往復(fù)循環(huán)標(biāo)注之后,就得到了一個(gè)標(biāo)注好的數(shù)據(jù)集。數(shù)據(jù)標(biāo)注完成之后,需要回到PyCharm中,在VOC2007文件夾中新建train_text.py,寫入如下代碼,目的是對XML文件進(jìn)行切分。05OPTION對XML文件進(jìn)行切分yolo=YOLO()detect_video(yolo,'test.mp4')importosimportrandom#訓(xùn)練集和測試集的比例為8∶2trainval_percent=0.2train_percent=0.8xmlfilepath='Annotations'txtsavepath='ImageSets\Main'total_xml=os.listdir(xmlfilepath)num=len(total_xml)list=range(num)tv=int(num*trainval_percent)tr=int(tv*train_percent)trainval=random.sample(list,tv)train=random.sample(trainval,tr)8.2數(shù)據(jù)集介紹及處理yolo=YOLO()detect_video(yolo,'test.mp4')#分別寫入如下文件ftrainval=open('ImageSets/Main/trainval.txt','w')ftest=open('ImageSets/Main/test.txt','w')ftrain=open('ImageSets/Main/train.txt','w')fval=open('ImageSets/Main/val.txt','w')foriinlist:name=total_xml[i][:-4]+'\n'ifiintrainval:ftrainval.write(name)ifiintrain:ftest.write(name)else:fval.write(name)else:ftrain.write(name)ftrainval.close()ftrain.close()fval.close()ftest.close()06OPTION但是,這幾個(gè)文件并不能直接被YOLOv3讀取,所以需要再做一次轉(zhuǎn)換。修改voc_annotation.py文件,將classes修改為“id_box”“ep_box”,代碼如下。sets=[('2007','train'),('2007','val'),('2007','test')]classes=["id_box","ep_box"]8.2數(shù)據(jù)集介紹及處理07OPTION運(yùn)行后會得到3個(gè).txt文件,它們分別對應(yīng)的是訓(xùn)練集(2007、train.txt)、測試集(2007、test.txt)、驗(yàn)證集(2007、val.txt)的圖片信息。個(gè)文件都記錄著3個(gè)信息:圖片地址、標(biāo)注的坐標(biāo),以及標(biāo)注名稱的索引。文件內(nèi)容生成的文件8.2數(shù)據(jù)集介紹及處理08OPTION接著,修改model_data文件夾下的voc_classes.txt,將classes修改為“id_box”“ep_box”,修改格式如下。id_boxep_box這樣,數(shù)據(jù)集就制作完成了。在程序運(yùn)行的時(shí)候,會分別讀取.txt文件中的路徑信息和標(biāo)注信息。8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練YOLOv3是YOLO系列目標(biāo)檢測算法中的第3版,相比之前的算法,尤其是針對小目標(biāo),精度有顯著提升。YOLOv3中使用與ResNet相似的結(jié)構(gòu),如圖所示。殘差塊結(jié)構(gòu)圖中曲線箭頭代表的便是直接連接。H(x)=F(x)+x,其中x是直接連接開始時(shí)的特征,而F(x)就是對x進(jìn)行的填補(bǔ)與增加,稱為殘差。8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練其中,ResidualBlock代表殘差塊,5L代表經(jīng)過5層的CBI結(jié)構(gòu)。YOLOv3的主干網(wǎng)絡(luò)(backbone)是DarkNet-53,也就是圖中的虛線部分。DarkNet-53輸入尺寸為416×416的3通道圖片,并且它有3個(gè)輸出,分別位于8倍下采樣、16倍下采樣以及32倍下采樣中。YOLOv3的網(wǎng)絡(luò)結(jié)構(gòu)8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練YOLOv3的基礎(chǔ)模型實(shí)際上是對DarkNet-53的擴(kuò)展,在增強(qiáng)特征提取的同時(shí),讓數(shù)據(jù)的輸出規(guī)范化。它使用了一個(gè)特征金字塔的操作,如圖所示。將最底層的特征進(jìn)行上采樣,并和上一層提取出的特征做進(jìn)一步融合,從而增強(qiáng)特征的提取,最終進(jìn)行預(yù)測(predict)。特征金字塔01OPTION主干網(wǎng)絡(luò)的搭建02OPTION增強(qiáng)特征的提取8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練

它們的特征維度分別為(N,13,13,75)、(N,26,26,75)、(N,52,52,75)。以維度最小的輸出(N,13,13,75)為例。第1個(gè)維度的N是指一個(gè)批次中輸入的圖片數(shù)量;第2、3個(gè)維度的13、13可以理解為把原圖劃分到一個(gè)13×13的網(wǎng)格中,如圖所示;第4個(gè)維度的75可以理解為3×(20+5),3是YOLOv3中每組先驗(yàn)框的數(shù)量,20是分類的數(shù)量(20是VOC數(shù)據(jù)集中的類別數(shù)量,放到當(dāng)前的任務(wù)上只有2),而5事實(shí)上是中心點(diǎn)坐標(biāo)和寬高的偏置,以及識別的置信率。輸出網(wǎng)格03OPTION接著,輸出3個(gè)提取后的特征層8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練具體操作為:將train.py中的代碼刪除,并添加如下的代碼,用于制作生成器。04OPTION在開始訓(xùn)練之前,需要把數(shù)據(jù)集制作成一個(gè)生成器的結(jié)構(gòu)importnumpyasnpimportkeras.backendasKfromkeras.layersimportInput,Lambdafromkeras.modelsimportModelfromkeras.callbacksimportTensorBoard,ModelCheckpoint,ReduceLROnPlateaufromyolo3.modelimportpreprocess_true_boxes,yolo_body,yolo_lossfromyolo3.utilsimportget_random_dataimportkeras#數(shù)據(jù)生成器defdata_generator(annotation_lines,batch_size,input_shape,anchors,num_classes):'''annotation_lines:圖片地址區(qū)域,類別batch_size:批大小input_shape:模型輸入大小anchors:anchors_boxnum_classes:類別數(shù)量'''8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練whileTrue:image_data=[]box_data=[]foriinannotation_lines:#獲得通過隨機(jī)截取、圖片增強(qiáng),并且縮放到416×416的圖片,以及相應(yīng)的標(biāo)注框數(shù)據(jù)image,box=get_random_data(i,input_shape,random=True)image_data.append(image)box_data.append(box)

#數(shù)據(jù)達(dá)到一個(gè)批次時(shí)返回iflen(image_data)==batch_size:image_data=np.array(image_data)box_data=np.array(box_data)y_true=preprocess_true_boxes(box_data,input_shape,anchors,num_classes)#組裝數(shù)據(jù)yield[image_data,*y_true],np.zeros(batch_size)image_data=[]box_data=[]8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練用來讀取TXT文件中的數(shù)據(jù)以及構(gòu)建訓(xùn)練模型,代碼如下。05OPTION然后,編寫其他函數(shù)#獲取標(biāo)簽名稱defget_classes(path):withopen(path)asf:class_names=f.readlines()class_names=[c.strip()forcinclass_names]returnclass_names#獲取anchors_boxdefget_anchors(path):withopen(path)asf:anchors=f.readline()anchors=[float(x)forxinanchors.split(',')]returnnp.array(anchors).reshape(-1,2)8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練#創(chuàng)建模型結(jié)構(gòu)defcreate_model(input_shape,anchors,num_classes,load_weight=False,weight_path='logs/000/weights.h5'):K.clear_session()image_input=Input(shape=(None,None,3))h,w=input_shape#(416,416)num_anchors=len(anchors)#9#分別對應(yīng)YOLOv3的3個(gè)輸出13×13、26×26、52×52y_true=[Input(shape=(h//{0:32,1:16,2:8}[l],w//{0:32,1:16,2:8}[l],num_anchors//3,num_classes+5))forlinrange(3)]model_body=yolo_body(image_input,num_anchors//3,num_classes)print('yolo3modelwith%sanchorsand%sclasses'%(num_anchors,num_classes))8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練#是否加載權(quán)重ifload_weight:model_body.load_weights(weight_path,by_name=True,skip_mismatch=True)model_loss=Lambda(yolo_loss,output_shape=(1,),name='yolo_loss',arguments={'anchors':anchors,'num_classes':num_classes,'ignore_thresh':0.7})\([*model_body.output,*y_true])model=Model([model_body.input,*y_true],model_loss)returnmodel8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練使用ModelCheckpoint函數(shù)可以自動保存最佳的模型,使用ReduceLROnPlateau函數(shù)可以控制學(xué)習(xí)率衰減,具體代碼如下。06OPTION接著,進(jìn)行訓(xùn)練函數(shù)的編寫#訓(xùn)練函數(shù)deftrain(model,annotation_path,test_path,input_shape,anchors,num_classes,log_dir='logs/'):'''model:模型annotation_path,test_path:訓(xùn)練路徑和測試路徑input_shape:模型輸入anchors:anchors_boxnum_classes:類別個(gè)數(shù)'''#編譯模型pile(optimizer=keras.optimizers.Adam(lr=3e-4),loss={'yolo_loss':lambday_true,y_pred:y_pred})#定義自動保存最佳模型checkpoint=ModelCheckpoint(log_dir+'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',monitor='val_loss',save_weights_only=True,save_best_only=True,period=1)8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練#學(xué)習(xí)率衰減reduce_lr=ReduceLROnPlateau(monitor='val_loss',factor=0.2,patience=10,min_lr=1e-7,verbose=1)#批大小、訓(xùn)練集和測試集的劃分比例batch_size=6val_split=0.1withopen(annotation_path)asf:train_lines=f.readlines()withopen(test_path)asf:test_lines=f.readlines()#打亂數(shù)據(jù)lines=train_lines+test_linesnp.random.shuffle(lines)num_val=int(len(lines)*val_split)num_train=len(lines)-num_valprint('trainon%s,teston%s,batch_size:%s'%(num_train,num_val,batch_size))8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練#訓(xùn)練model.fit_generator(data_generator(lines[:num_train],batch_size,input_shape,anchors,num_classes),steps_per_epoch=num_train//batch_size,validation_data=data_generator(lines[num_train:],batch_size,input_shape,anchors,num_classes),validation_steps=num_val//batch_size,callbacks=[reduce_lr,checkpoint],epochs=500)model.save_weights(log_dir+'weights.h5')8.3

主干網(wǎng)絡(luò)搭建與訓(xùn)練調(diào)用它即可進(jìn)行訓(xùn)練,代碼如下。07OPTION最后,只需要定義一個(gè)main函數(shù)def_main():#定義路徑annotation_path='2007_train.txt'test_path='2007_test.txt'log_dir='logs/000/'classes_path='model_data/voc_classes.txt'anchors_path='model_data/eq_anchors.txt'#獲取類別class_names=get_classes(classes_path)#獲取anchors_boxanchors=get_anchors(anchors_path)input_shape=(416,416)#搭建模型model=create_model(input_shape,anchors,len(class_names))#keras.utils.plot_model(model,'yolo.png',show_shapes=True)#訓(xùn)練train(model,annotation_path,test_path,input_shape,anchors,len(class_names),log_dir=log_dir)if__name__=='__main__':_main()MobileNet是Google公司在2017年提出的,是一款專注于移動設(shè)備和嵌入式設(shè)備的輕量級CNN,并迅速衍生出了v1、v2、v3這3個(gè)版本。相對于傳統(tǒng)的CNN:在準(zhǔn)確率小幅降低的前提下,可大大減少模型參數(shù)的運(yùn)算量。標(biāo)準(zhǔn)的卷積層換成了深度可分離卷積??煞蛛x卷積,顧名思義就是把一個(gè)大的卷積核換成兩個(gè)小的卷積核。8.4模型結(jié)構(gòu)修改8.4.1MobileNet簡介一個(gè)標(biāo)準(zhǔn)的卷積是將前一層的特征進(jìn)行n個(gè)卷積核的卷積操作,生成n個(gè)通道的特征,如圖所示。標(biāo)準(zhǔn)卷積而深度可分離卷積由深度卷積和逐點(diǎn)卷積組成。8.4模型結(jié)構(gòu)修改所謂深度卷積,就是把卷積核變成單通道,當(dāng)輸入有M個(gè)通道時(shí),就需要有M個(gè)卷積核,然后對每個(gè)通道分別進(jìn)行卷積,最后做疊加,如圖所示。而逐點(diǎn)卷積,可以理解為使用1×1的卷積核進(jìn)行卷積,作用是對深度卷積后的特征進(jìn)行升維,所以將上面兩步組合起來,就形成了深度可分離卷積。逐點(diǎn)卷積如所示。深度卷積逐點(diǎn)卷積MobileNet首先利用3×3的深度可分離卷積提取空間特征,然后利用逐點(diǎn)卷積來組合通道特征,同時(shí)擴(kuò)充到目標(biāo)通道數(shù),這樣既減少了參數(shù)量、計(jì)算量,又提高了網(wǎng)絡(luò)的運(yùn)算速度。8.4模型結(jié)構(gòu)修改8.4.2MobileNet搭建第一列是使用的卷積類型及其步長參數(shù)。第二列是卷積核的尺寸。第三列是輸入的尺寸。重復(fù)使用了Convdw/s2和Conv/s1這兩個(gè)層。MobileNet結(jié)構(gòu)8.4模型結(jié)構(gòu)修改(a)所示的是標(biāo)準(zhǔn)的卷積結(jié)構(gòu),圖片依次通過卷積層、BN層、激活層重復(fù)使用了Convdw/s2和Conv/s1這兩個(gè)層。(b)所示的是MobileNet中的結(jié)構(gòu),它經(jīng)過一個(gè)深度可分離卷積層(DepthwiscConv)之后同樣經(jīng)過了BN層與激活層,不同的是它還通過一個(gè)1×1的卷積層進(jìn)行升維并且再次經(jīng)過BN層與激活層。

(a)

(b)

MobileNet基礎(chǔ)結(jié)構(gòu)由于要修改YOLOv3中的網(wǎng)絡(luò)結(jié)構(gòu),因此可以在YOLOv3文件夾中的model.py中定義一個(gè)MobileNet函數(shù),并寫入如下代碼。_depthwise_conv_block函數(shù)就是MobileNet中重復(fù)的部分,可以看到,圖片依次通過3×3的深度可分離卷積層、BN層、激活層、1×1的卷積層、BN層、激活層。01OPTION提取重復(fù)使用的結(jié)構(gòu),減少重復(fù)代碼8.4模型結(jié)構(gòu)修改importtensorflow.kerasaskfromtensorflow.kerasimportlayersdefMobileNet(inpt,num_classes=1000):#深度可分離卷積def_depthwise_conv_block(inputs,filters,strides=(1,1),block_id=1):ifstrides==(1,1):x=inputs#當(dāng)步長不為1時(shí)填充0,防止尺寸縮小else:x=layers.ZeroPadding2D(((0,1),(0,1)),name='conv_pad_%d'%block_id)(inputs)

8.4模型結(jié)構(gòu)修改#深度可分離卷積x=layers.DepthwiseConv2D((3,3),padding='same'ifstrides==(1,1)else'valid',strides=strides,use_bias=False,name='conv_dw_%d'%block_id)(x)x=layers.BatchNormalization(name='conv_dw_%d_bn'%block_id)(x)x=layers.ReLU(6.,name='conv_dw_%d_relu'%block_id)(x)#正常的卷積步長為1×1x=layers.Conv2D(filters,(1,1),padding='same',use_bias=False,strides=(1,1),name='conv_pw_%d'%block_id)(x)x=layers.BatchNormalization(name='conv_pw_%d_bn'%block_id)(x)returnlayers.ReLU(6.,name='conv_pw_%d_relu'%block_id)(x)因?yàn)镸obileNet的第一層就是一個(gè)普通的卷積,所以在MobileNet函數(shù)中再定義一個(gè)基本卷積的函數(shù),代碼如下。02OPTION在MobileNet函數(shù)中再定義一個(gè)基本卷積的函數(shù)8.4模型結(jié)構(gòu)修改#基本卷積def_conv_block(inputs,filters,kernel=(3,3),strides=(1,1)):x=layers.ZeroPadding2D(padding=((0,1),(0,1)),name='conv1_pad')(inputs)x=layers.Conv2D(filters,kernel,padding='valid',use_bias=False,strides=strides,name='conv1')(x)x=layers.BatchNormalization(name='conv1_bn')(x)returnlayers.ReLU(6.,name='conv1_relu')(x)03OPTION最后,再將前面的2個(gè)函數(shù)按照MobileNet結(jié)構(gòu)堆疊起來,完成MobileNet的網(wǎng)絡(luò)模型的搭建,代碼如下。8.4模型結(jié)構(gòu)修改#模型輸入inpt=k.Input(inpt)#第一個(gè)是正常的卷積操作224×224×3→112×112×32x=_conv_block(inpt,32,strides=(2,2))#第一個(gè)深度可分離卷積塊112×112×32→112×112×32x=_depthwise_conv_block(x,32,block_id=1)#第二個(gè)深度可分離卷積塊112×112×32→112×112×64x=_depthwise_conv_block(x,64,block_id=2)#112×112×64→56×56×128x=_depthwise_conv_block(x,128,strides=(2,2),block_id=3)#56×56×128→56×56×128x=_depthwise_conv_block(x,128,block_id=4)MobileNet結(jié)構(gòu)8.4模型結(jié)構(gòu)修改#56×56×128→28×28×256x=_depthwise_conv_block(x,256,strides=(2,2),block_id=5)#28×28×256→28×28×256x=_depthwise_conv_block(x,256,block_id=6)#28×28×256→14×14×512x=_depthwise_conv_block(x,512,strides=(2,2),block_id=7)#14×14×512→14×14×512x=_depthwise_conv_block(x,512,block_id=8)x=_depthwise_conv_block(x,512,block_id=9)x=_depthwise_conv_block(x,512,block_id=10)x=_depthwise_conv_block(x,512,block_id=11)#14×14×512→7×7×1024x=_depthwise_conv_block(x,1024,strides=(2,2),block_id=12)#7×7×1024→7×7×1024x=_depthwise_conv_block(x,1024,block_id=13)#7×7×1024→1×1×1024

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論