版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于U-Net的工業(yè)缺陷檢測(cè)深度學(xué)習(xí)與圖像處理實(shí)戰(zhàn)知識(shí)要點(diǎn)10.1U-Net簡(jiǎn)介10.2數(shù)據(jù)集介紹及處理10.3主干網(wǎng)絡(luò)搭建與訓(xùn)練10.4模型訓(xùn)練結(jié)果測(cè)試目錄10.1U-Net簡(jiǎn)介FCN開創(chuàng)了深度學(xué)習(xí)在圖像分割領(lǐng)域應(yīng)用的先河,其變種U-Net作為圖像分割網(wǎng)絡(luò)的一種,在醫(yī)學(xué)領(lǐng)域以及工業(yè)領(lǐng)域應(yīng)用十分廣泛。首先要理解一個(gè)概念:U-Net不是一個(gè)特定的網(wǎng)絡(luò),它只是一個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的代號(hào)而已。其網(wǎng)絡(luò)結(jié)構(gòu)如圖所示。U-Net結(jié)構(gòu)10.1U-Net簡(jiǎn)介U-Net結(jié)構(gòu)的形狀呈U字,整體結(jié)構(gòu)是先編碼(下采樣,左側(cè)網(wǎng)絡(luò)),再解碼(上采樣,右側(cè)網(wǎng)絡(luò)),接著回歸到跟原始圖像一樣大小的像素的分類。U-Net結(jié)構(gòu)的左半部分是特征提取部分,U-Net經(jīng)過4次下采樣進(jìn)行特征提取,并且它和FCN一樣除去了全連接層,在特征提取的最后一層直接進(jìn)行上采樣,并與前面相同尺度的特征進(jìn)行融合,這就是U-Net中上采樣的部分。10.1U-Net簡(jiǎn)介下采樣是通過2×2的最大池化層來(lái)進(jìn)行的,下采樣之間是兩個(gè)卷積層,這里的卷積使用無(wú)填充模式,所以在卷積過程中圖像的大小是會(huì)減小的。這會(huì)造成一個(gè)問題,即在進(jìn)行特征融合的時(shí)候圖像大小不一致,所以在U-Net結(jié)構(gòu)圖中有一個(gè)copy&crop操作(剪裁操作),crop就是為了將大小進(jìn)行裁剪的操作。但若在卷積的時(shí)候使用的是填充模式,就無(wú)須進(jìn)行crop操作。10.2數(shù)據(jù)集介紹及處理本章數(shù)據(jù)集使用的是Kaggle上的數(shù)據(jù),經(jīng)解壓后共有10個(gè)類別,如圖所示,分別對(duì)應(yīng)不同的花紋缺陷,如磨損、白點(diǎn)、多線等。數(shù)據(jù)類別數(shù)據(jù)詳情并且,每個(gè)類別里面有Train、Test兩個(gè)文件夾,分別存放著圖片數(shù)據(jù)和標(biāo)簽數(shù)據(jù),但并不是每張圖片都有對(duì)應(yīng)的標(biāo)簽,數(shù)據(jù)詳情如圖所示。10.2數(shù)據(jù)集介紹及處理這樣的數(shù)據(jù)處理起來(lái)比較復(fù)雜,本章中使用的方式是將它們的路徑一
一讀取出來(lái),然后進(jìn)行隨機(jī)打亂,按比例劃分,最后把它們寫入TXT文件中,后續(xù)只需要讀取這個(gè)文件中的路徑即可。具體步驟如下。首先,新建一個(gè)writeline.py文件,寫入如下代碼。01OPTION數(shù)據(jù)集處理importosimportglobimportrandom#讀取有標(biāo)簽數(shù)據(jù)的圖片defwrite_lines(split=0.9):lines=[]foriinrange(1,11):10.2數(shù)據(jù)集介紹及處理label_dir=r'\DAGM_KaggleUpload\Class%s\Train\Label'%i#label_paths=[os.path.join(label_dir,p)forpinos.listdir(label_dir)]#讀取擴(kuò)展名為PNG的圖片label_paths=glob.glob(label_dir+'\*.PNG')#print(path)forlabel_pathinlabel_paths:name=label_path.split('\\')[-1].split('_')[0]img_path='\\'.join(label_dir.split('\\')[:-1])img_path=img_path+'\%s.PNG'%namelines.append('%s%s\n'%(img_path,label_path))#隨機(jī)打亂random.shuffle(lines)train_len=int(len(lines)*split)train_lines=lines[:train_len]test_lines=lines[train_len:]#寫入文件withopen('train.txt','w',encoding='utf8')asf:f.writelines(train_lines)withopen('test.txt','w',encoding='utf8')asf:f.writelines(test_lines)if__name__=='__main__':write_lines()10.2數(shù)據(jù)集介紹及處理可以發(fā)現(xiàn)在當(dāng)前目錄中多出了兩個(gè)TXT文件,分別是test.txt、train.txt。里面存放的數(shù)據(jù)結(jié)構(gòu)為“數(shù)據(jù)圖片路徑+空格+標(biāo)簽圖片路徑”,如圖所示。02OPTION運(yùn)行程序存放的數(shù)據(jù)10.2數(shù)據(jù)集介紹及處理讀取數(shù)據(jù)的時(shí)候只需要讀取這兩個(gè)TXT文件中的數(shù)據(jù)即可。新建一個(gè)load_data.py文件,定義一個(gè)readline函數(shù)用來(lái)讀取路徑,代碼如下。03OPTION讀取數(shù)據(jù)importnumpyasnpfromPILimportImage#讀取TXT文件中的數(shù)據(jù)defreadline(path):withopen(path,'r',encoding='utf8')asf:lines=f.readlines()img_lists=[]label_list=[]forlineinlines:line=line.strip('\n')data,label=line.split('')img_lists.append(data)label_list.append(label)returnimg_lists,label_list10.2數(shù)據(jù)集介紹及處理接著,定義一個(gè)數(shù)據(jù)處理函數(shù)get_data用來(lái)加載圖片,并對(duì)標(biāo)簽進(jìn)行處理,代碼如下。04OPTION數(shù)據(jù)處理、加載圖片、縮放圖片#數(shù)據(jù)處理defget_data(x,y,size):#加載圖片data=cv2.imread(x)label=Image.open(y)h,w=size,size#縮放圖片label=label.resize((h,w))image_data=cv2.resize(data,(size,size))/255.
label=np.array(label)label[label>0]=1.returnimage_data,label10.2數(shù)據(jù)集介紹及處理代碼如下。05OPTION組裝一個(gè)生成器函數(shù)gen_datadefgen_data(x_data,y_data,batch_size,size=224):whileTrue:data=[]label=[]forindex,image_pathinenumerate(x_data):data_,label_=get_data(image_path,y_data[index],size)data.append(data_)label.append(label_)iflen(data)==batch_size:data=np.array(data).reshape(-1,size,size,3)label=np.array(label).reshape(-1,size,size,1)#print(label.shape,data.shape)yielddata,labeldata=[]label=[]10.2數(shù)據(jù)集介紹及處理最后,為了確認(rèn)數(shù)據(jù)與標(biāo)簽是否一
一匹配,還可以在main函數(shù)中寫入如下代碼。06OPTION使用main函數(shù)if__name__=='__main__':color=np.array([(0,0,0),(0,255,0)])x_train,y_train=readline('train.txt')gan=gen_data(x_train,y_train,1)foriinrange(100):data,label=next(gan)data=np.array(data*255.,dtype='uint8').reshape(224,224,3)image=Image.fromarray(data)
label=label.reshape(224,224).astype('int32')color_image=np.array(corlor)[label.ravel()]\.reshape(224,224,3).astype('uint8')label=Image.fromarray(color_image)img=cv2.addWeighted(data,1,color_image,0.5,0)cv2.imshow('s',img)cv2.waitKey(0)10.2數(shù)據(jù)集介紹及處理運(yùn)行結(jié)果如圖所示??梢园l(fā)現(xiàn),這些數(shù)據(jù)的標(biāo)注都比較粗糙,并沒有過多地追求細(xì)節(jié),而是用一個(gè)橢圓框住了缺陷內(nèi)容,但這不影響后續(xù)的訓(xùn)練。數(shù)據(jù)與標(biāo)簽匹配10.3主干網(wǎng)絡(luò)搭建與訓(xùn)練接著,新建一個(gè)model.py文件,寫入如下代碼,建立一個(gè)U-Net模型結(jié)構(gòu)。01OPTION建立一個(gè)U-Net模型結(jié)構(gòu)importtensorflow.kerasaskfromtensorflow.keras.layersimport*defu_net(inpt):#基礎(chǔ)卷積結(jié)構(gòu):Conv+BN+ReLUdefconv(x,filters,kernel=3,strides=1,padding='same'):x=Conv2D(filters,kernel_size=kernel,strides=strides,padding=padding)(x)x=BatchNormalization()(x)x=Activation('relu')(x)returnx10.3主干網(wǎng)絡(luò)搭建與訓(xùn)練inpt=k.Input(inpt)x=conv(inpt,64)x=conv(x,64)x1=x#第一層特征向量x=MaxPool2D()(x)#128x=conv(x,128)x=conv(x,128)x2=x#第二層特征向量x=MaxPool2D()(x)#64x=conv(x,256)x=conv(x,256)x3=x#第三層特征向量x=MaxPool2D()(x)#32x=conv(x,512)x=conv(x,512)x4=x#第四層特征向量x=MaxPool2D()(x)#16x=conv(x,1024)x=conv(x,1024)#上采樣,并與第四層特征向量融合x=UpSampling2D()(x)#32x=concatenate([x,x4])x=conv(x,512)x=conv(x,512)#與第三層特征向量融合x=UpSampling2D()(x)#64x=concatenate([x,x3])x=conv(x,256)x=conv(x,256)#與第二層特征向量融合x=UpSampling2D()(x)#128x=concatenate([x,x2])10.3主干網(wǎng)絡(luò)搭建與訓(xùn)練x=conv(x,128)x=conv(x,128)#與第一層特征向量融合x=UpSampling2D()(x)x=concatenate([x,x1])x=conv(x,64)x=conv(x,64)#通道縮減成類別個(gè)數(shù),這里是二分類,并且使用Sigmoid進(jìn)行分類x=Conv2D(1,kernel_size=(1,1),strides=1,padding='same')(x)x=Activation('sigmoid')(x)model=k.models.Model(inpt,x)model.summary()returnmodel10.4模型訓(xùn)練結(jié)果測(cè)試訓(xùn)練完成之后,可以使用如下代碼進(jìn)行測(cè)試。importtensorflowastfimportnumpyasnpfromFCN.Mobile_UNet.load_dataimportreadline,gen_dataimportcv2#不同類別對(duì)應(yīng)的顏色corlor=np.array([(0,0,0),(0,255,0)])#加載模型model=tf.keras.models.load_model(r'mb_unet.h5')x_tests,_=readline('test.txt')forimage_pathinx_tests:#數(shù)據(jù)處理img=cv2.imread(image_path)img=cv2.resize(img,(224,224))image=img.copy()img=img.reshape(-1,224,224,3)/255.p=model.predict(img)#將預(yù)測(cè)的數(shù)據(jù)進(jìn)行分類p[p>0.5]=1p[p<0.5]=0
p=p.reshape(224,224).astype('uint8')color_image=np.array(corlor)[p.ravel()]\.reshape(224,224,3).astype('uint8')img=cv2.addWeighted(image,1,color_image,0.5,0)cv2.imshow('s',img)cv2.waitKey(0)10.4模型訓(xùn)練結(jié)果測(cè)試測(cè)試程序運(yùn)行結(jié)果如圖所示。測(cè)試程序運(yùn)行結(jié)果效果較差的情況是因?yàn)閳D片數(shù)據(jù)僅有941張,而訓(xùn)練類別卻有10個(gè),平均下來(lái)每個(gè)類別的圖片不到95張,數(shù)據(jù)相對(duì)來(lái)說是缺乏的。因此需要增加數(shù)據(jù)量10.4模型訓(xùn)練結(jié)果測(cè)試
數(shù)據(jù)增強(qiáng)的方式有很多種,在本書的第5章已經(jīng)有比較詳細(xì)的介紹。這里引入隨機(jī)數(shù),對(duì)圖片進(jìn)行隨機(jī)縮放、翻轉(zhuǎn)和顏色空間變換這3種數(shù)據(jù)增強(qiáng)。將get_data函數(shù)修改為get_random_data函數(shù),并寫入如下代碼。#獲得a~b的隨機(jī)數(shù)defrand(a=0,b=1):returnnp.random.rand()*(b-a)+adefget_random_data(x,y,size,jitter=.3,hue=.1,sat=1.5,val=1.5):data=Image.open(x)label=Image.open(y)h,w=size,size#對(duì)圖片進(jìn)行隨機(jī)縮放new_ar=w/h*rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)scale=rand(.25,2)ifnew_ar<1:nh=int(scale*h)nw=int(nh*new_ar)else:nw=int(scale*w)nh=int(nw/new_ar)data=data.resize((nw,nh),Image.BICUBIC)label=label.resize((nw,nh))10.4模型訓(xùn)練結(jié)果測(cè)試#隨機(jī)坐標(biāo)dx=int(rand(0,w-nw))dy=int(rand(0,h-nh))#創(chuàng)建一張新的圖片,并把縮放后的圖片放到新圖片的隨機(jī)坐標(biāo)中new_data=Image.new('RGB',(w,h),(128,128,128))new_label=Image.new('RGB',(w,h),(0,0,0))new_data.paste(data,(dx,dy))new_label.paste(label,(dx,dy))data=new_datalabel=new_label
#圖片翻轉(zhuǎn)flip=rand()<.5ifflip:data.transpose(Image.FLIP_LEFT_RIGHT)label.transpose(Image.FLIP_LEFT_RIGHT)
#HSV顏色空間變換hue=rand(-hue,hue)sat=rand(1,sat)ifrand()<.5else1/rand(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金屬材涂層機(jī)組操作工操作技能能力考核試卷含答案
- 水工建構(gòu)筑物維護(hù)檢修工安全生產(chǎn)知識(shí)評(píng)優(yōu)考核試卷含答案
- 鋼琴及鍵盤樂器制作工崗前安全文化考核試卷含答案
- 顏料合成工崗前道德考核試卷含答案
- 海信冰箱培訓(xùn)課件
- 冷藏專業(yè)知識(shí)培訓(xùn)課件
- 酒店客房服務(wù)規(guī)范與禮儀制度
- 車站設(shè)備維修保養(yǎng)制度
- 采購(gòu)物資質(zhì)量管理與追溯制度
- 桃花庵歌課件
- ESG理論與實(shí)務(wù) 課件 第一章 ESG概述
- 2025-2030共享醫(yī)療檢測(cè)設(shè)備行業(yè)基層醫(yī)療機(jī)構(gòu)合作模式分析報(bào)告
- 食堂餐廳維修項(xiàng)目方案(3篇)
- 醫(yī)用手術(shù)器械講解
- 冰芯氣泡古大氣重建-洞察及研究
- DB37∕T 5031-2015 SMC玻璃鋼檢查井應(yīng)用技術(shù)規(guī)程
- 旅行社計(jì)調(diào)職業(yè)技能模擬試卷含答案
- 口腔腫瘤手術(shù)配合方案
- 新疆金川礦業(yè)有限公司堆浸場(chǎng)擴(kuò)建技改項(xiàng)目環(huán)評(píng)報(bào)告
- 2025至2030年中國(guó)武漢餐飲行業(yè)市場(chǎng)現(xiàn)狀調(diào)查及發(fā)展趨向研判報(bào)告
- JG/T 155-2014電動(dòng)平開、推拉圍墻大門
評(píng)論
0/150
提交評(píng)論