Pytorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 課件 第11、12章 基于深度學(xué)習(xí)的人臉二維碼識(shí)別;污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)_第1頁(yè)
Pytorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 課件 第11、12章 基于深度學(xué)習(xí)的人臉二維碼識(shí)別;污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)_第2頁(yè)
Pytorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 課件 第11、12章 基于深度學(xué)習(xí)的人臉二維碼識(shí)別;污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)_第3頁(yè)
Pytorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 課件 第11、12章 基于深度學(xué)習(xí)的人臉二維碼識(shí)別;污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)_第4頁(yè)
Pytorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí) 課件 第11、12章 基于深度學(xué)習(xí)的人臉二維碼識(shí)別;污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

PyTorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí)實(shí)戰(zhàn)基于深度學(xué)習(xí)的人臉

二維碼識(shí)別第十一章目錄02QR編譯碼QRcodecompilation01應(yīng)用背景Background05集成應(yīng)用開發(fā)Visualsearchengine06案例小結(jié)CaseSummary03人臉壓縮Facialcompression04CNN分類識(shí)別CNNclassificationrecognition應(yīng)用背景Background30111.1應(yīng)用背景4隨著人工智能領(lǐng)域的不斷進(jìn)步,以人臉識(shí)別為核心的生物識(shí)別技術(shù)已廣泛被應(yīng)用于各種便利生活的場(chǎng)景,如面部支付系統(tǒng)、人臉門禁系統(tǒng)和面部識(shí)別通行等。二維碼,作為一種流行的信息編碼方式,因其高可靠性、大信息量和快速識(shí)別特性,在多種場(chǎng)景下得到廣泛應(yīng)用,成為現(xiàn)代人生活的一部分。將人臉圖像與二維碼結(jié)合,通過(guò)將處理后的人臉生物信息嵌入二維碼中,并利用專用工具進(jìn)行解碼和重構(gòu),可以建立一個(gè)獨(dú)特的人臉二維碼驗(yàn)證系統(tǒng)。本章將探討基本的人臉識(shí)別技術(shù),選擇標(biāo)準(zhǔn)人臉數(shù)據(jù)集進(jìn)行特征降維和Base64編碼轉(zhuǎn)換,從而生成加密字符串。這些字符串隨后被用來(lái)生成二維碼圖像,并建立一個(gè)雙向的操作流程,支持從人臉到二維碼的轉(zhuǎn)換以及反向解碼過(guò)程。通過(guò)使用典型的CNN模型對(duì)重建的人臉圖像進(jìn)行識(shí)別,最終實(shí)現(xiàn)一個(gè)基于深度學(xué)習(xí)的人臉二維碼識(shí)別系統(tǒng)。4QR編譯碼QRcodecompilation502

11.2QR編譯碼6QR碼(QuickResponseCode)的全稱為“快速響應(yīng)矩陣碼”,最早由日本Denso公司于1994年為追蹤汽車零件而開發(fā)的一種矩陣式二維碼,其結(jié)構(gòu)說(shuō)明如圖11-1所示。QR

碼是最常用的二維碼編碼方式,具有制作成本低和存儲(chǔ)容量大的特點(diǎn),可方便的進(jìn)行多種類型的信息存儲(chǔ)和提取,應(yīng)用場(chǎng)景非常廣泛。本案例不過(guò)多地介紹QR碼的原理,重點(diǎn)敘述如何利用二維碼編譯工具qrcode與pyzbar進(jìn)行集成應(yīng)用。6qrcode與pyzbar是經(jīng)典的條碼/二維碼處理類庫(kù),可用于解析多種格式的條形碼、二維碼,能夠方便地對(duì)QR碼進(jìn)行編譯處理。大家可以通過(guò)pipinstallqrcodepyzbar命令,對(duì)兩個(gè)庫(kù)進(jìn)行安裝。QR編碼的主要實(shí)現(xiàn)方式對(duì)輸入的字符串進(jìn)行編碼,調(diào)用qrcode的編碼接口生成二維碼圖像,這里需要參考工具包的數(shù)據(jù)格式進(jìn)行統(tǒng)一的參數(shù)傳遞,步驟如下。

11.2.1QR編碼77設(shè)置二維碼圖片的寬度和高度,初始化待編碼的字符串,這里以常見(jiàn)的漢字、英文、數(shù)字構(gòu)成字符串組合,代碼如下:2初始化接口#設(shè)置寬度和高度qr_height=400qr_width=400#設(shè)置字符串內(nèi)容text='劉衍琦,ComputerVision'1參數(shù)設(shè)置#初始化接口qr=qrcode.QRCode()進(jìn)行相關(guān)的接口初始化,代碼如下:

11.2.1QR編碼88設(shè)置編碼的字符,調(diào)用編碼接口進(jìn)行圖像生成,代碼如下:4圖像轉(zhuǎn)換#添加字符串qr.add_data(text)#產(chǎn)生二維碼qr.make(fit=True)#產(chǎn)生圖像img=qr.make_image(fill_color='black',back_color='white')3QR編碼#轉(zhuǎn)換為圖像數(shù)組img=np.array(img,dtype='uint8')*255#改變圖像大小img=cv2.resize(img,(qr_width,qr_height))#保存圖像cv2.imwrite('qrcode.jpg',img)#顯示圖像cv2.imshow('qrcode',img)cv2.waitKey()將PIL格式的圖像轉(zhuǎn)化為OpencCV格式的圖像,代碼如下:

11.2.1QR編碼9經(jīng)過(guò)以上處理,可得到編碼后的二維碼圖像矩陣,將其保存為demo.jpg,具體如圖所示。9得到了所設(shè)置字符串的二維碼圖像,可以用微信等工具的二維碼掃描服務(wù)進(jìn)行驗(yàn)證,查看識(shí)別效果。如圖11-3所示,通過(guò)微信掃描自定義生成的二維碼圖像進(jìn)行解碼得到了相匹配的字符串內(nèi)容,這也表明了二維碼編碼過(guò)程的有效性。

11.2.2QR譯碼1010代碼如下:2圖像解碼#讀取圖像image=Image.open('qrcode.jpg')1讀取圖像#圖像解碼result=pyzbar.decode(image)[0]text=result.data.decode("utf-8")代碼如下:QR譯碼的主要實(shí)現(xiàn)方式對(duì)輸入的二維碼圖像進(jìn)行讀取,調(diào)用pyzbar的解碼接口獲取字符串內(nèi)容,這里需要參考工具包的數(shù)據(jù)格式進(jìn)行統(tǒng)一的參數(shù)傳遞,步驟如下:

11.2.3內(nèi)容加密11通過(guò)設(shè)置的明文字符串進(jìn)行編碼得到的二維碼圖像,采用普通的二維碼掃描工具即可容易地獲得明文信息,這也容易出現(xiàn)信息泄露的情況。為此,選擇經(jīng)典的Base64加解密進(jìn)行內(nèi)容轉(zhuǎn)碼來(lái)提高安全性,即對(duì)字符串經(jīng)Base64加密后再進(jìn)行QR編碼,同理對(duì)圖像QR譯碼后再進(jìn)行Base64解密來(lái)得到明文字符串,代碼如下:11因此,將字符串的QR編譯碼加入base64編解碼過(guò)程,可得到統(tǒng)一的加解密處理,具體過(guò)程如圖所示。#base64加密text=base64.b64encode(text.encode('utf-8'))#base64解密text_b64=base64.b64decode(text).decode('utf-8')

11.2.3內(nèi)容加密1212代碼如下:2二維碼內(nèi)容提取defmk_qr(text,b64=True):ifb64:#base64加密

text=base64.b64encode(text.encode('utf-8'))#初始化接口

qr=qrcode.QRCode()#添加字符串

qr.add_data(text)#產(chǎn)生二維碼

qr.make(fit=True)#產(chǎn)生圖像

img=qr.make_image(fill_color='black',back_color='white')returnimg1二維碼生成defread_qr(image:Image,b64=True):#圖像解碼

result=pyzbar.decode(np.array(image,dtype='uint8')*255)[0]text=result.data.decode("utf-8")text_b64=''ifb64:#base64解密

text_b64=base64.b64decode(text).decode('utf-8')returntext,text_b64代碼如下:二維碼生成、二維碼內(nèi)容提取的流程,為方便調(diào)用可將二者封裝為子函數(shù),具體內(nèi)容如下。人臉壓縮Facialcompression130311.3.1人臉建庫(kù)1414ORL(OlivettiResearchLaboratory,ORL)人臉數(shù)據(jù)庫(kù)是一個(gè)著名的人臉識(shí)別數(shù)據(jù)集,它起源于英國(guó)劍橋的Olivetti實(shí)驗(yàn)室。該數(shù)據(jù)庫(kù)含有40個(gè)不同人物的人臉數(shù)據(jù),每個(gè)人物由10張正面人臉照片組成,總共包含400張圖片。這些人臉圖片的分辨率為92×112像素,并在拍攝時(shí)間、光照等方面有細(xì)微的變化,而同一人物的各張照片中可能會(huì)呈現(xiàn)出不同的表情、光照條件和面部角度。ORL人臉數(shù)據(jù)庫(kù)由于其典型性,已經(jīng)成為進(jìn)行人臉識(shí)別研究的常用標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)。參考ORL來(lái)制作數(shù)據(jù)集,其詳細(xì)結(jié)構(gòu)如圖所示。數(shù)據(jù)庫(kù)共包含40個(gè)子文件夾,每個(gè)文件夾以類別標(biāo)簽命名,且均為灰度人臉圖像。11.3.2人臉降維1515主成分分析(PrincipalComponentAnalysis,PCA)是一種廣泛使用的數(shù)據(jù)簡(jiǎn)化和特征萃取技術(shù)?;贙arhunen-Loeve變換或Hotelling變換,PCA通過(guò)計(jì)算數(shù)據(jù)集的最優(yōu)正交基,實(shí)現(xiàn)了降維,同時(shí)最小化了原始數(shù)據(jù)和降維后數(shù)據(jù)之間的均方誤差。此過(guò)程創(chuàng)建了一個(gè)新的坐標(biāo)系統(tǒng),減少了數(shù)據(jù)各個(gè)組成部分之間的相關(guān)性,并且可以去除較少包含信息的成分,以達(dá)到減少特征空間維度的目的。應(yīng)用于多個(gè)領(lǐng)域,如數(shù)據(jù)壓縮和降噪,PCA以其簡(jiǎn)便和高效的優(yōu)點(diǎn),成為數(shù)據(jù)處理的重要工具。在處理人臉數(shù)據(jù)降維的場(chǎng)景中,PCA的核心步驟包括:首先加載人臉數(shù)據(jù)集,將其轉(zhuǎn)化為數(shù)值矩陣形式;接著計(jì)算平均臉并建立協(xié)方差矩陣;最終提取特征向量以形成特征臉空間。

11.3.2人臉降維1616圖像的讀取可以通過(guò)遍歷各個(gè)文件夾完成,只選取特定比例的圖像進(jìn)行后續(xù)處理,下面是實(shí)現(xiàn)此步驟的關(guān)鍵代碼,代碼如下:data_dir=Path(data_dir)#遍歷所有圖片all_data=[]forpindata_dir.glob("**/*.BMP"): image=cv2.imread(str(p),cv2.IMREAD_GRAYSCALE) #拉平圖像

image_flatten=np.reshape(image,-1)

#歸一化

max_value=image_flatten.max() min_value=image_flatten.min() image_flatten=(image_flatten-min_value)/(max_value-min_value)

all_data.append(image_flatten)

all_data=np.array(all_data)01加載人臉數(shù)據(jù)集以形成數(shù)值矩陣

11.3.2人臉降維1717圖像的讀取可以通過(guò)遍歷各個(gè)文件夾完成,只選取特定比例的圖像進(jìn)行后續(xù)處理,下面是實(shí)現(xiàn)此步驟的關(guān)鍵代碼,代碼如下:02計(jì)算平均臉,構(gòu)建協(xié)方差矩陣

#計(jì)算平均臉

mean_face=np.mean(all_data,0) #利用廣播機(jī)制每一種圖像減去平均臉

all_data2=all_data-mean_face #可視化圖像

cv2.imshow('mean_face',mean_face.reshape(112,92).astype('uint8')) cv2.waitKey()經(jīng)過(guò)這些步驟的處理后,可以得到1×10304維的平均臉向量和400×400維的協(xié)方差矩陣。為了進(jìn)一步觀察平均臉的特點(diǎn),可以將其重構(gòu)為112×92維度的圖像矩陣,可視化顯示效果如圖所示。

11.3.2人臉降維1818針對(duì)協(xié)方差矩陣可計(jì)算其特征值和特征向量,通過(guò)選擇要保留的特征向量維度來(lái)生成特征臉子空間,將其用于原始人臉數(shù)據(jù)的降維處理,代碼如下:02提取特征向量,獲得特征臉空間#計(jì)算協(xié)方差矩陣cov_matrix=all_data2.dot(all_data2.T)#保留k維k=round(people_num*sample_num*0.7)ds,v=np.linalg.eig(cov_matrix)#按照設(shè)置的范圍計(jì)算特征臉空間face_space=all_data2.T.dot(v[:,:k]).dot(np.diag(ds[0:k]**(-1/2)))#人臉降維data_pca=all_data2.dot(face_space)經(jīng)過(guò)這些步驟的處理后,可以得到10304×280維的特征臉子空間V,以及400×280維的人臉特征,達(dá)到人臉圖像的降維目標(biāo)。此外,為了進(jìn)一步觀察特征臉空間的特點(diǎn),可以將其重構(gòu)為112×92維的圖像矩陣,進(jìn)行可視化顯示,代碼如下:foriinrange(1,20+1): plt.subplot(5,4,i) plt.imshow(face_space[:,i-1].reshape(112,92),cmap='gray') plt.axis('off')plt.show()

11.3.3人臉重構(gòu)1919通過(guò)PCA進(jìn)行人臉降維后可將原始112×92維的圖像,轉(zhuǎn)換為1×280維的向量,達(dá)到降維壓縮的目標(biāo)。同理,基于特征臉空間進(jìn)行逆操作也可以將1×280的向量還原為人臉圖像,達(dá)到人臉重構(gòu)的目標(biāo)。下面以庫(kù)內(nèi)的某樣本圖像為例進(jìn)行降維和重構(gòu)的說(shuō)明,人臉降維壓縮代碼如下:#拉平圖像image_flatten=np.reshape(image,-1)#歸一化max_value=image_flatten.max()min_value=image_flatten.min()image_flatten=(image_flatten-min_value)/(max_value-min_value)#減去平均臉b=image_flatten-mean_face#投影到特征臉空間image_vector=b.dot(face_space)#保留1位小數(shù)image_vector=np.round(image_vector*10)/1011.3.3人臉重構(gòu)2020如上隨機(jī)選擇某樣本圖,按照降維過(guò)程將其投影到特征臉空間,得到1×280維的特征向量,將其繪制曲線如圖所示。

11.3.3人臉重構(gòu)2121下面按照逆操作對(duì)降維后的向量進(jìn)行還原,并將其按照?qǐng)D像矩陣的維度進(jìn)行重構(gòu)得到圖像,代碼如下:#人臉重構(gòu)temp=face_space[:,:len(image_pac)].dot(image_pac.T)temp=temp+mean_face#重構(gòu)圖像矩陣image=Image.fromarray((temp*255).astype('uint8').reshape(112,92))選擇人臉數(shù)據(jù)庫(kù)中的一個(gè)樣本,通過(guò)逆向操作,可以得到重構(gòu)后的人臉圖像,如圖所示。將1×280維的特征向量經(jīng)特征臉、平均臉進(jìn)行重構(gòu)可得到圖像結(jié)果,這也說(shuō)明了人臉降維和重構(gòu)過(guò)程的有效性。11.3.3人臉重構(gòu)2222代碼如下:defimage_dimensionality_reduction(image:np.ndarray,mean_face,face_space):#拉平圖像

image_flatten=np.reshape(image,-1)#歸一化

max_value=image_flatten.max()min_value=image_flatten.min()image_flatten=(image_flatten-min_value)/(max_value-min_value)#減去平均臉

b=image_flatten-mean_face#投影到特征臉空間

image_vector=b.dot(face_space)#保留1位小數(shù)

image_vector=np.round(image_vector*10)/10returnimage_vector1人臉降維函數(shù)綜合上面的處理過(guò)程,可以將人臉圖像降維壓縮和重構(gòu)過(guò)程封裝為函數(shù),通過(guò)調(diào)用已保存的模型文件進(jìn)行降維和重構(gòu)處理,具體如下所示。11.3.3人臉重構(gòu)2323代碼如下:defimage_rebuild(image_pac:np.ndarray,mean_face,face_space):#人臉還原

temp=face_space[:,:len(image_pac)].dot(image_pac.T)temp=temp+mean_face#重構(gòu)圖像矩陣

image=Image.fromarray((temp*255).astype('uint8').reshape(112,92))returnimage2人臉重構(gòu)函數(shù)如上分別定義了函數(shù)image_dimensionality_reduction進(jìn)行人臉圖像降維,子函數(shù)image_rebuild進(jìn)行人臉圖像重構(gòu),方便進(jìn)行圖像的壓縮和還原。

11.3.4人臉轉(zhuǎn)碼2424人臉經(jīng)降維壓縮后可轉(zhuǎn)換為固定長(zhǎng)度的一維向量,可考慮將其傳入前面設(shè)置的二維碼編碼函數(shù)獲取二維碼圖像,達(dá)到人臉轉(zhuǎn)碼效果。#讀取一張圖片image=cv2.imread('images/01.BMP',cv2.IMREAD_GRAYSCALE)#圖像降維image_vector=image_dimensionality_reduction(image,mean_face,face_space)#將向量轉(zhuǎn)換為字符串text=vector2str(image_vector)01讀取人臉圖像,降維壓縮

11.3.4人臉轉(zhuǎn)碼2525#生成二維碼qr_im=mk_qr(text,True)qr_im.show()02對(duì)降維向量得到的字符串進(jìn)行二維碼編碼如上對(duì)上一步轉(zhuǎn)換得到的字符串進(jìn)行Base64加密及QR編碼,得到的二維碼圖像如圖所示。

11.3.4人臉轉(zhuǎn)碼2626#二維碼解碼text,text64=read_qr(qr_im,True)image_vector=str2vector(text)03對(duì)二維碼圖像進(jìn)行解碼,將其轉(zhuǎn)換為數(shù)值向量04對(duì)得到的數(shù)值向量進(jìn)行人臉重構(gòu)#圖像重建image=image_rebuild(image_vector,mean_face,face_space)#顯示重建結(jié)果plt.imshow(image,cmap='gray')plt.axis('off')plt.show()CNN分類識(shí)別CNNclassificationrecognition270411.4CNN分類識(shí)別2828代碼如下:#獲取數(shù)據(jù)集train_data,val_data,cls2idx=split_data()#設(shè)置訓(xùn)練參數(shù)epochs=100device='cuda'iftorch.cuda.is_available()else'cpu'lr=1e-3wd=1e-5batch_size=32num_workers=0#設(shè)置數(shù)據(jù)集和迭代器train_set=DataSet(train_data,cls2idx,transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),]))val_set=DataSet(val_data,cls2idx,transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),]))train_loader=DataLoader(train_set,batch_size=batch_size, shuffle=True,num_workers=num_workers)val_loader=DataLoader(val_set,batch_size=batch_size,shuffle=True,num_workers=num_workers)1數(shù)據(jù)集讀取11.4CNN分類識(shí)別2929設(shè)置數(shù)據(jù)集的類別數(shù)目,并進(jìn)行網(wǎng)絡(luò)編輯得到遷移后的網(wǎng)絡(luò)模型,代碼如下:#獲取數(shù)據(jù)集train_data,val_data,cls2idx=split_data()#設(shè)置訓(xùn)練參數(shù)epochs=100device='cuda'iftorch.cuda.is_available()else'cpu'lr=1e-3wd=1e-5batch_size=32num_workers=0#設(shè)置數(shù)據(jù)集和迭代器train_set=DataSet(train_data,cls2idx,transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),]))val_set=DataSet(val_data,cls2idx,transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),]))train_loader=DataLoader(train_set,batch_size=batch_size, shuffle=True,num_workers=num_workers)val_loader=DataLoader(val_set,batch_size=batch_size,shuffle=True,num_workers=num_workers)2模型定義11.4CNN分類識(shí)別3030設(shè)置損失函數(shù)與優(yōu)化器,執(zhí)行模型訓(xùn)練,代碼如下:#損失函數(shù)criterion=nn.CrossEntropyLoss().to(device)#優(yōu)化器optimizer=optim.SGD(model.parameters(),lr=lr,weight_decay=wd)#評(píng)估指標(biāo)metrics=[]#開始迭代訓(xùn)練forepochinrange(1,epochs+1): train_loss,train_acc=train_one_epoch() val_loss,val_acc=val_one_epoch() Wmetrics.append((train_loss,train_acc,val_loss,val_acc))3模型訓(xùn)練11.4CNN分類識(shí)別3131將訓(xùn)練好的模型進(jìn)行存儲(chǔ),代碼如下:torch.save(model.state_dict(),'model.pth')4模型存儲(chǔ)將訓(xùn)練后的模型存儲(chǔ)到本地文件,方便模型調(diào)用。訓(xùn)練模型完成后,可以得到訓(xùn)練過(guò)程的準(zhǔn)確率與損失曲線11.4CNN分類識(shí)別3232設(shè)置損失函數(shù)與優(yōu)化器,執(zhí)行模型訓(xùn)練,代碼如下:#轉(zhuǎn)換圖像格式image=image.convert('RGB')#對(duì)數(shù)據(jù)進(jìn)行預(yù)處理t=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)),])image=t(image)#擴(kuò)展數(shù)據(jù)維度image=torch.unsqueeze(image,0)#模型預(yù)測(cè)pred=cnn_model(image)#獲取概率最大索引idx=int(torch.argmax(pred))#獲取類別c=cls[idx]4模型存儲(chǔ)11.4CNN分類識(shí)別3333如上處理過(guò)程對(duì)待測(cè)圖像進(jìn)行CNN識(shí)別,得到對(duì)應(yīng)的類別為“s24”,可將其對(duì)應(yīng)到數(shù)據(jù)集,結(jié)果如下所示4模型存儲(chǔ)雖然降維后的圖像存在一定的模糊現(xiàn)象,但通過(guò)CNN模型進(jìn)行識(shí)別依然能得到正確的識(shí)別結(jié)果,這樣表明了CNN模型的有效性。集成應(yīng)用開發(fā)Visualsearchengine340511.5集成應(yīng)用開發(fā)3535下面在人臉數(shù)據(jù)庫(kù)中選擇不同的圖像進(jìn)行實(shí)驗(yàn),演示處理效果如圖所示。如圖展示,可以通過(guò)對(duì)待測(cè)人臉圖像執(zhí)行降維和編碼過(guò)程以生成對(duì)應(yīng)的二維碼圖像。解碼這些二維碼圖像后,所得到的信息呈現(xiàn)為Base64字符串序列,這一步驟有效地遮蔽了原始數(shù)據(jù)。通過(guò)對(duì)這些二維碼進(jìn)行解碼并重建人臉,可以獲得模糊的重構(gòu)人臉圖像。接下來(lái),利用CNN分類模型,可以準(zhǔn)確地確定人臉的類別,并展示對(duì)應(yīng)的分類圖像。在這一過(guò)程中,使用了傳統(tǒng)的PCA方法來(lái)壓縮和重建人臉圖像,并采用了基本的Base64編碼方法進(jìn)行數(shù)據(jù)的加密與解密。讀者可以考慮采用其他技術(shù)如壓縮感知、神經(jīng)網(wǎng)絡(luò)的自編碼器或稀疏重建來(lái)優(yōu)化過(guò)程,并可以嘗試應(yīng)用其他可逆加密技術(shù)以增強(qiáng)信息傳輸?shù)陌踩?。案例小結(jié)CaseSummary360611.6案例小結(jié)37二維碼因其傳輸便利性和大容量存儲(chǔ)特性,非常適用于處理各種數(shù)據(jù)格式。人臉圖像因其私密性,尤其在面部識(shí)別應(yīng)用中,信息安全顯得尤為重要。因此,結(jié)合二維碼的編解碼、數(shù)據(jù)加密解密以及人臉圖像的壓縮重建技術(shù),形成了一條完整的將人臉圖像進(jìn)行壓縮并加密的處理流程,并通過(guò)二維碼形式進(jìn)行信息傳輸與自定義解碼和人臉重建。這個(gè)流程中的每一個(gè)環(huán)節(jié)都可以更新改進(jìn),例如,在圖像壓縮重建方面可以探索壓縮感知、自編碼器神經(jīng)網(wǎng)絡(luò)和稀疏重建等技術(shù),在數(shù)據(jù)加密解密方面可以考慮使用AES、DES和RSA等更安全的可逆加密方法,從而擴(kuò)展應(yīng)用的可能性和安全性。37感謝觀看!PyTorch計(jì)算機(jī)視覺(jué)與深度學(xué)習(xí)實(shí)戰(zhàn)污損遮擋號(hào)牌識(shí)別與

違法行為檢測(cè)第十二章目錄02理論基礎(chǔ)theoreticalbasis01應(yīng)用背景Background05本章小結(jié)Summaryofthischapter03功能設(shè)計(jì)functionaldesign04功能實(shí)現(xiàn)functionalrealization應(yīng)用背景Background410112.1應(yīng)用背景42隨著交通道路的建設(shè),汽車產(chǎn)業(yè)也進(jìn)入快速發(fā)展的時(shí)期,然而機(jī)動(dòng)車數(shù)量的逐年增加給城市道路交通的發(fā)展帶來(lái)了巨大的壓力,進(jìn)而引發(fā)城市道路擁堵、交通事故等一系列問(wèn)題。發(fā)生交通事故的數(shù)量呈現(xiàn)逐年上升的趨勢(shì),每年因交通事故導(dǎo)致的死亡人數(shù)約占意外死亡人數(shù)的30%,其中機(jī)動(dòng)車發(fā)生交通事故的數(shù)量約占全年發(fā)生交通事故數(shù)量的80%,非機(jī)動(dòng)車造成的交通事故的數(shù)量則遠(yuǎn)低于機(jī)動(dòng)車造成的交通事故的數(shù)量。由此可見(jiàn),真正減少交通事故發(fā)生的舉措在于機(jī)動(dòng)車的治理,在交通管理方面,除了對(duì)非機(jī)動(dòng)車的治理外,更要加強(qiáng)對(duì)機(jī)動(dòng)車的管理措施。本章通過(guò)講述項(xiàng)目的實(shí)際需求介紹如何對(duì)圖像進(jìn)行標(biāo)注和處理,以及了解YOLOv8算法和OCR算法的原理和網(wǎng)絡(luò)結(jié)構(gòu),并將兩個(gè)算法進(jìn)行結(jié)合,從而實(shí)現(xiàn)目標(biāo)的檢測(cè)和分類。4理論基礎(chǔ)theoreticalbasis430212.2.1算法模型的選擇與解釋4462.OCR算法考慮到樣本中號(hào)牌的種類不同會(huì)造成長(zhǎng)度也不相同的情況,除此之外,遮擋和污損也會(huì)造成文本長(zhǎng)度不同的情況,因此,OCR算法需要能完成不定長(zhǎng)序列的號(hào)牌字符識(shí)別。在識(shí)別過(guò)程中,算法會(huì)針對(duì)每一個(gè)識(shí)別到的字符給出相應(yīng)的置信度,并以此作為依據(jù)判斷號(hào)牌上污損的程度,所以除了要求識(shí)別出號(hào)牌上的文本之外,還需要識(shí)別出每個(gè)字符。1.目標(biāo)檢測(cè)算法將采用相機(jī)拍攝的圖像作為訓(xùn)練算法的數(shù)據(jù)集,圖像中包含各種復(fù)雜環(huán)境下的不同卡口的車輛,使用目標(biāo)檢測(cè)算法不僅能完成對(duì)圖像中號(hào)牌的定位,也可以完成目標(biāo)的分類。在速度和準(zhǔn)確率的雙重考慮下,選用端到端YOLO系列中的YOLOv8算法為識(shí)別污損遮擋號(hào)牌的目標(biāo)檢測(cè)算法。12.2.2污損遮擋號(hào)牌定位算法45YOLO(YouOnlyLookOnce,YOLO),是JosephRedmon和AliFarhadi等人于2015年提出的基于單個(gè)神經(jīng)網(wǎng)絡(luò)的目標(biāo)檢測(cè)系統(tǒng)。YOLOv8是Ultralytics公司最新推出的YOLO系列目標(biāo)檢測(cè)算法,可以用于圖像分類、物體檢測(cè)和實(shí)例分割等任務(wù)。與之前的YOLO系列算法相比,具有更高的準(zhǔn)確率、更小的參數(shù)規(guī)模與更快的速度。YOLOv8模型與以往YOLO模型的對(duì)比如圖所示。7

12.2.2污損遮擋號(hào)牌定位算法468加載YOLOv8模型,并對(duì)其網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行分析,代碼如下:#加載yolo模型yolo=YOLO('runs/pose/train2/weights/best.pt',task='pose')#導(dǎo)出為onnx格式y(tǒng)olo.export(format='onnx')#查看網(wǎng)絡(luò)結(jié)構(gòu)netron.start('runs/pose/train2/weights/best.onnx')

12.2.2污損遮擋號(hào)牌定位算法479YOLOv8部分結(jié)構(gòu)圖如圖所示。YOLOv8模型結(jié)構(gòu)非常復(fù)雜,在這里僅截取顯示網(wǎng)絡(luò)的輸出部分的結(jié)構(gòu)圖,并顯示模型的輸入輸出屬性等。YOLOv8提供了關(guān)鍵點(diǎn)檢測(cè)模型,這為大家提供了一種高效而準(zhǔn)確的方法??梢酝ㄟ^(guò)關(guān)鍵點(diǎn)模型,對(duì)車牌的四個(gè)角進(jìn)行關(guān)鍵點(diǎn)檢測(cè),隨后通過(guò)仿射變換,對(duì)車牌圖像進(jìn)行校正。這允許大家對(duì)車牌進(jìn)行透視修正,消除圖像中的透視畸變,從而使車牌區(qū)域呈現(xiàn)出標(biāo)準(zhǔn)的矩形形狀。對(duì)后續(xù)的字符識(shí)別非常重要,因?yàn)樗梢蕴峁┮粋€(gè)標(biāo)準(zhǔn)化的圖像輸入,從而使識(shí)別算法更加穩(wěn)健和準(zhǔn)確。

12.2.2污損遮擋號(hào)牌定位算法4810對(duì)圖像進(jìn)行仿射變換,代碼如下:#轉(zhuǎn)換矩陣dst=np.array([ [0,0], [maxWidth-1,0], [maxWidth-1,maxHeight-1], [0,maxHeight-1]],dtype="float32")#獲取仿射變換矩陣M=cv2.getPerspectiveTransform(rect,dst)#對(duì)圖像進(jìn)行仿射變換warped=cv2.warpPerspective(image,M,(maxWidth,maxHeight))#將關(guān)鍵點(diǎn)轉(zhuǎn)換為numpy格式rect=np.array(points,dtype="float32")#獲取四個(gè)關(guān)鍵點(diǎn)(tl,tr,br,bl)=rect#計(jì)算變換后的圖像寬度widthA=np.sqrt(((br[0]-bl[0])**2)+((br[1]-bl[1])**2))widthB=np.sqrt(((tr[0]-tl[0])**2)+((tr[1]-tl[1])**2))maxWidth=max(int(widthA),int(widthB))#計(jì)算變換后的圖像高度heightA=np.sqrt(((tr[0]-br[0])**2)+((tr[1]-br[1])**2))heightB=np.sqrt(((tl[0]-bl[0])**2)+((tl[1]-bl[1])**2))maxHeight=max(int(heightA),int(heightB))

12.2.3號(hào)牌號(hào)碼識(shí)別算法4911LPRNet是一種用于車牌識(shí)別(LicensePlateRecognition,LPR)的深度學(xué)習(xí)模型。LPRNet的主優(yōu)點(diǎn)如下:它是一個(gè)高質(zhì)量車牌識(shí)別的實(shí)時(shí)框架;它不使用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNNs);它足夠輕量級(jí),可以在各種平臺(tái)上運(yùn)行,包括嵌入式設(shè)備。該論文詳細(xì)介紹了LPRNet的架構(gòu)、訓(xùn)練過(guò)程和實(shí)驗(yàn)結(jié)果。主要發(fā)現(xiàn)包括LPRNet在處理具有挑戰(zhàn)性的情況方面的穩(wěn)健性,如透視和相機(jī)依賴性畸變、惡劣的光照條件和視角變化等。總的來(lái)說(shuō),LPRNet為準(zhǔn)確和高效的車牌識(shí)別提供了一種有前景的解決方案。為了更加直觀的了LPRNet模型,可以分析LPRNet的網(wǎng)絡(luò)結(jié)構(gòu),代碼如下:#獲取lprnet模型lpr_model=build_lprnet(8,False,69)#分析模型analyze_network(lpr_model,(1,3,24,94))

12.2.3號(hào)牌號(hào)碼識(shí)別算法5012LPRNet結(jié)構(gòu)圖如圖所示。功能設(shè)計(jì)functionaldesign510312.3.1構(gòu)建車輛號(hào)牌數(shù)據(jù)集5214監(jiān)督學(xué)習(xí)模型的訓(xùn)練需要每個(gè)樣本都含有標(biāo)記。YOLOv8算法屬于全監(jiān)督學(xué)習(xí)的一種,除了要標(biāo)記圖像的類別外,還需要對(duì)目標(biāo)的位置信息進(jìn)行回歸分析。YOLOv8算法需要將含有標(biāo)記號(hào)牌的位置和類別信息的標(biāo)簽轉(zhuǎn)換為txt文本格式。除了轉(zhuǎn)換格式外,對(duì)數(shù)據(jù)集進(jìn)行采樣使用1000張圖像進(jìn)行訓(xùn)練和評(píng)估,把數(shù)據(jù)集按照8:2的比例分為訓(xùn)練集和驗(yàn)證集,其中訓(xùn)練集用于模型訓(xùn)練,驗(yàn)證集用于模型的性能測(cè)試。車輛號(hào)牌數(shù)據(jù)集圖像如圖所示:12.3.1構(gòu)建車輛號(hào)牌數(shù)據(jù)集53151建立存放數(shù)據(jù)的文件夾建立存放數(shù)據(jù)的文件夾,包括圖像文件夾與標(biāo)簽文件夾。YOLOv8數(shù)據(jù)集組織格式如下:dataset#數(shù)據(jù)集根目錄----images#圖像存放目錄--------train#訓(xùn)練集圖像存放目錄--------val#驗(yàn)證集圖像存放目錄----labels#標(biāo)簽存放目錄--------train#訓(xùn)練集標(biāo)簽存放目錄--------val#驗(yàn)證集標(biāo)簽存放目錄其中,圖像與標(biāo)簽的文件名相同,但文件后綴名不同。常用的圖像格式有jpg、jpeg、png等,標(biāo)簽格式則為txt格式。對(duì)于常規(guī)的目標(biāo)檢測(cè)任務(wù),標(biāo)簽的格式為:類別中心點(diǎn)x坐標(biāo)中心點(diǎn)y坐標(biāo)寬高對(duì)于關(guān)鍵點(diǎn)檢測(cè)任務(wù),標(biāo)簽格式為:類別關(guān)鍵點(diǎn)1x坐標(biāo)關(guān)鍵點(diǎn)1y坐標(biāo)關(guān)鍵點(diǎn)2x坐標(biāo)關(guān)鍵點(diǎn)2y坐標(biāo)……完成YOLOv8數(shù)據(jù)集處理后,還要對(duì)OCR數(shù)據(jù)集進(jìn)行處理。通過(guò)標(biāo)簽中提供的關(guān)鍵點(diǎn),使用仿射變換,將YOLOv8數(shù)據(jù)集中的車輛號(hào)牌圖像進(jìn)行裁剪和校正,以車牌號(hào)的正確文本標(biāo)簽作為文件名。并劃分為訓(xùn)練集與驗(yàn)證集。得到的數(shù)據(jù)如圖12-6所示:OCR數(shù)據(jù)集格式如下:

dataset ----train ----val

由于OCR數(shù)據(jù)集以文件名為標(biāo)簽,因此無(wú)須再單獨(dú)建立文件夾存放標(biāo)簽。

12.3.1構(gòu)建車輛號(hào)牌數(shù)據(jù)集5416#數(shù)據(jù)集根目錄的絕對(duì)路徑path:D:/Projects/Python/book/污損遮擋號(hào)牌識(shí)別與違法行為檢測(cè)/data/dataset#datasetrootdir#訓(xùn)練集圖像路徑(相對(duì)于數(shù)據(jù)集根目錄)train:images/train#驗(yàn)證集圖像路徑(相對(duì)于數(shù)據(jù)集根目錄)val:images/val#測(cè)試集圖像路徑(可選)test:#關(guān)鍵點(diǎn)信息kpt_shape:[4,2]#關(guān)鍵點(diǎn)形狀表示有四個(gè)點(diǎn),每個(gè)點(diǎn)由xy兩個(gè)數(shù)組成flip_idx:[0,1,2,3]#關(guān)鍵點(diǎn)索引#類別信息names:#檢測(cè)的類別為車牌0:license在完成數(shù)據(jù)集的創(chuàng)建后,要修改數(shù)據(jù)集的配置文件才可以被程序讀取。新建一個(gè)data.yaml文件用來(lái)配置數(shù)據(jù)集,data.yaml文件內(nèi)容如下:2創(chuàng)建改數(shù)據(jù)集配置文件

12.3.2權(quán)重文件的適配與編輯5517#類別數(shù)量nc:1#numberofclasses#關(guān)鍵點(diǎn)形狀kpt_shape:[4,2]#對(duì)不同的模型使用不同的因子控制模型大小scales:#[depth,width,max_channels]n:[0.33,0.25,1024]s:[0.33,0.50,1024]m:[0.67,0.75,768]l:[1.00,1.00,512]x:[1.00,1.25,512]#YOLOv8.0nbackbonebackbone:#[from,repeats,module,args]-[-1,1,Conv,[64,3,2]]#0-P1/2-[-1,1,Conv,[128,3,2]]#1-P2/4-[-1,3,C2f,[128,True]]-[-1,1,Conv,[256,3,2]]#3-P3/8-[-1,6,C2f,[256,True]]-[-1,1,Conv,[512,3,2]]#5-P4/16-[-1,6,C2f,[512,True]]首先下載YOLOv8n.pt預(yù)訓(xùn)練權(quán)重,將其存放至與程序相同的目錄下。YOLOv8n.pt文件為YOLOv8n模型在COCO數(shù)據(jù)集上的預(yù)訓(xùn)練權(quán)重。接下來(lái)對(duì)YOLOv8模型的配置文件,按照數(shù)據(jù)集的情況進(jìn)行修改。YOLOv8模型配置文件修改如下:-[-1,1,Conv,[1024,3,2]]#7-P5/32-[-1,1,Conv,[512,3,2]]#5-P4/16-[-1,6,C2f,[512,True]]-[-1,1,Conv,[1024,3,2]]#7-P5/32-[-1,3,C2f,[1024,True]]-[-1,1,SPPF,[1024,5]]#9#YOLOv8.0nheadhead:-[-1,1,nn.Upsample,[None,2,'nearest']]-[[-1,6],1,Concat,[1]]#catbackboneP4-[-1,3,C2f,[512]]#12-[-1,1,nn.Upsample,[None,2,'nearest']]-[[-1,4],1,Concat,[1]]#catbackboneP3-[-1,3,C2f,[256]]#15(P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,12],1,Concat,[1]]#catheadP4-[-1,3,C2f,[512]]#18(P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,9],1,Concat,[1]]#catheadP5-[-1,3,C2f,[1024]]#21(P5/32-large)-[[15,18,21],1,Pose,[nc,kpt_shape]]#Pose(P3,P4,P5)

12.3.2權(quán)重文件的適配與編輯5618#加載預(yù)訓(xùn)練權(quán)重weights_dict=torch.load(args.pretrained_model)#遍歷模型的參數(shù),并檢查每個(gè)參數(shù)是否在權(quán)重字典中存在forname,paramind_parameters():ifnameinweights_dictandweights_dict[name].shape==param.shape:#如果參數(shù)在權(quán)重字典中存在,則加載相應(yīng)的權(quán)重param.data.copy_(weights_dict[name])print("loadpretrainedmodelsuccessful!")通過(guò)使用YOLO.load()函數(shù),模型能夠自動(dòng)匹配相同的權(quán)重,并將其加載至模型中,進(jìn)行進(jìn)一步的訓(xùn)練。對(duì)于LPRNet,同樣通過(guò)GitHub下載其預(yù)訓(xùn)練權(quán)重。但由于類別數(shù)量存在些許差異,模型無(wú)法自動(dòng)加載預(yù)訓(xùn)練權(quán)重,需要通過(guò)程序?qū)ふ颐峙c形狀相同的權(quán)重,并將其加載至待訓(xùn)練的模型中。代碼如下:12.3.3模型參數(shù)的配置與調(diào)整5719fromultralyticsimportYOLO#代碼要在main函數(shù)下運(yùn)行否則會(huì)報(bào)錯(cuò)if__name__=='__main__':#定義YOLO模型并加載預(yù)訓(xùn)練權(quán)重

yolo=YOLO('yolov8n-pose.yaml',task='pose').load('yolov8n.pt')#訓(xùn)練yolo模型

yolo.train(data='data.yaml',epochs=50,batch=3)YOLOv8代碼對(duì)模型的訓(xùn)練過(guò)程實(shí)現(xiàn)了完整的封裝,僅需幾行代碼即可完成YOLOv8模型的訓(xùn)練、評(píng)估與預(yù)測(cè)。YOLOv8模型的訓(xùn)練代碼如下:

12.3.3模型參數(shù)的配置與調(diào)整5820parser=argparse.ArgumentParser(description='parameterstotrainnet')parser.add_argument('--max_epoch',default=50,help='epochtotrainthenetwork')parser.add_argument('--img_size',default=[94,24],help='theimagesize')parser.add_argument('--train_img_dirs',default=r"data\data\train",help='thetrainimagespath')parser.add_argument('--test_img_dirs',default=r"data\data\val",help='thetestimagespath')parser.add_argument('--dropout_rate',default=0.5,help='dropoutrate.')parser.add_argument('--learning_rate',default=0.001,help='basevalueoflearningrate.')parser.add_argument('--lpr_max_len',default=8,help='licenseplatenumbermaxlength.')parser.add_argument('--train_batch_size',default=64,help='trainingbatchsize.')parser.add_argument('--test_batch_size'

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論