




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PyTorch計(jì)算機(jī)視覺與深度學(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)用于各種便利生活的場景,如面部支付系統(tǒng)、人臉門禁系統(tǒng)和面部識(shí)別通行等。二維碼,作為一種流行的信息編碼方式,因其高可靠性、大信息量和快速識(shí)別特性,在多種場景下得到廣泛應(yīng)用,成為現(xiàn)代人生活的一部分。將人臉圖像與二維碼結(jié)合,通過將處理后的人臉生物信息嵌入二維碼中,并利用專用工具進(jìn)行解碼和重構(gòu),可以建立一個(gè)獨(dú)特的人臉二維碼驗(yàn)證系統(tǒng)。本章將探討基本的人臉識(shí)別技術(shù),選擇標(biāo)準(zhǔn)人臉數(shù)據(jù)集進(jìn)行特征降維和Base64編碼轉(zhuǎn)換,從而生成加密字符串。這些字符串隨后被用來生成二維碼圖像,并建立一個(gè)雙向的操作流程,支持從人臉到二維碼的轉(zhuǎn)換以及反向解碼過程。通過使用典型的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)說明如圖11-1所示。QR
碼是最常用的二維碼編碼方式,具有制作成本低和存儲(chǔ)容量大的特點(diǎn),可方便的進(jìn)行多種類型的信息存儲(chǔ)和提取,應(yīng)用場景非常廣泛。本案例不過多地介紹QR碼的原理,重點(diǎn)敘述如何利用二維碼編譯工具qrcode與pyzbar進(jìn)行集成應(yīng)用。6qrcode與pyzbar是經(jīng)典的條碼/二維碼處理類庫,可用于解析多種格式的條形碼、二維碼,能夠方便地對(duì)QR碼進(jìn)行編譯處理。大家可以通過pipinstallqrcodepyzbar命令,對(duì)兩個(gè)庫進(jìn)行安裝。QR編碼的主要實(shí)現(xiàn)方式對(duì)輸入的字符串進(jìn)行編碼,調(diào)用qrcode的編碼接口生成二維碼圖像,這里需要參考工具包的數(shù)據(jù)格式進(jìn)行統(tǒng)一的參數(shù)傳遞,步驟如下。
11.2.1QR編碼77設(shè)置二維碼圖片的寬度和高度,初始化待編碼的字符串,這里以常見的漢字、英文、數(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)過以上處理,可得到編碼后的二維碼圖像矩陣,將其保存為demo.jpg,具體如圖所示。9得到了所設(shè)置字符串的二維碼圖像,可以用微信等工具的二維碼掃描服務(wù)進(jìn)行驗(yàn)證,查看識(shí)別效果。如圖11-3所示,通過微信掃描自定義生成的二維碼圖像進(jìn)行解碼得到了相匹配的字符串內(nèi)容,這也表明了二維碼編碼過程的有效性。
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通過設(shè)置的明文字符串進(jìn)行編碼得到的二維碼圖像,采用普通的二維碼掃描工具即可容易地獲得明文信息,這也容易出現(xiàn)信息泄露的情況。為此,選擇經(jīng)典的Base64加解密進(jìn)行內(nèi)容轉(zhuǎn)碼來提高安全性,即對(duì)字符串經(jīng)Base64加密后再進(jìn)行QR編碼,同理對(duì)圖像QR譯碼后再進(jìn)行Base64解密來得到明文字符串,代碼如下:11因此,將字符串的QR編譯碼加入base64編解碼過程,可得到統(tǒng)一的加解密處理,具體過程如圖所示。#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人臉建庫1414ORL(OlivettiResearchLaboratory,ORL)人臉數(shù)據(jù)庫是一個(gè)著名的人臉識(shí)別數(shù)據(jù)集,它起源于英國劍橋的Olivetti實(shí)驗(yàn)室。該數(shù)據(jù)庫含有40個(gè)不同人物的人臉數(shù)據(jù),每個(gè)人物由10張正面人臉照片組成,總共包含400張圖片。這些人臉圖片的分辨率為92×112像素,并在拍攝時(shí)間、光照等方面有細(xì)微的變化,而同一人物的各張照片中可能會(huì)呈現(xiàn)出不同的表情、光照條件和面部角度。ORL人臉數(shù)據(jù)庫由于其典型性,已經(jīng)成為進(jìn)行人臉識(shí)別研究的常用標(biāo)準(zhǔn)數(shù)據(jù)庫。參考ORL來制作數(shù)據(jù)集,其詳細(xì)結(jié)構(gòu)如圖所示。數(shù)據(jù)庫共包含40個(gè)子文件夾,每個(gè)文件夾以類別標(biāo)簽命名,且均為灰度人臉圖像。11.3.2人臉降維1515主成分分析(PrincipalComponentAnalysis,PCA)是一種廣泛使用的數(shù)據(jù)簡化和特征萃取技術(shù)?;贙arhunen-Loeve變換或Hotelling變換,PCA通過計(jì)算數(shù)據(jù)集的最優(yōu)正交基,實(shí)現(xiàn)了降維,同時(shí)最小化了原始數(shù)據(jù)和降維后數(shù)據(jù)之間的均方誤差。此過程創(chuàng)建了一個(gè)新的坐標(biāo)系統(tǒng),減少了數(shù)據(jù)各個(gè)組成部分之間的相關(guān)性,并且可以去除較少包含信息的成分,以達(dá)到減少特征空間維度的目的。應(yīng)用于多個(gè)領(lǐng)域,如數(shù)據(jù)壓縮和降噪,PCA以其簡便和高效的優(yōu)點(diǎn),成為數(shù)據(jù)處理的重要工具。在處理人臉數(shù)據(jù)降維的場景中,PCA的核心步驟包括:首先加載人臉數(shù)據(jù)集,將其轉(zhuǎn)化為數(shù)值矩陣形式;接著計(jì)算平均臉并建立協(xié)方差矩陣;最終提取特征向量以形成特征臉空間。
11.3.2人臉降維1616圖像的讀取可以通過遍歷各個(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圖像的讀取可以通過遍歷各個(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)過這些步驟的處理后,可以得到1×10304維的平均臉向量和400×400維的協(xié)方差矩陣。為了進(jìn)一步觀察平均臉的特點(diǎn),可以將其重構(gòu)為112×92維度的圖像矩陣,可視化顯示效果如圖所示。
11.3.2人臉降維1818針對(duì)協(xié)方差矩陣可計(jì)算其特征值和特征向量,通過選擇要保留的特征向量維度來生成特征臉子空間,將其用于原始人臉數(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)過這些步驟的處理后,可以得到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通過PCA進(jìn)行人臉降維后可將原始112×92維的圖像,轉(zhuǎn)換為1×280維的向量,達(dá)到降維壓縮的目標(biāo)。同理,基于特征臉空間進(jìn)行逆操作也可以將1×280的向量還原為人臉圖像,達(dá)到人臉重構(gòu)的目標(biāo)。下面以庫內(nèi)的某樣本圖像為例進(jìn)行降維和重構(gòu)的說明,人臉降維壓縮代碼如下:#拉平圖像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ī)選擇某樣本圖,按照降維過程將其投影到特征臉空間,得到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ù)庫中的一個(gè)樣本,通過逆向操作,可以得到重構(gòu)后的人臉圖像,如圖所示。將1×280維的特征向量經(jīng)特征臉、平均臉進(jìn)行重構(gòu)可得到圖像結(jié)果,這也說明了人臉降維和重構(gòu)過程的有效性。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ù)綜合上面的處理過程,可以將人臉圖像降維壓縮和重構(gòu)過程封裝為函數(shù),通過調(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)換為固定長度的一維向量,可考慮將其傳入前面設(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)練過程的準(zhǔn)確率與損失曲線11.4CNN分類識(shí)別3232設(shè)置損失函數(shù)與優(yōu)化器,執(zhí)行模型訓(xùn)練,代碼如下:#轉(zhuǎn)換圖像格式image=image.co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024學(xué)年南通市啟東七年級(jí)語文上學(xué)期期中考試卷附答案解析
- 客服員工工作總結(jié)匯編15篇
- 陜西省咸陽市禮泉縣2024-2025學(xué)年八年級(jí)下學(xué)期期末考試英語試題(含答案無聽力原文及音頻)
- 湖南省衡陽市耒陽市2024-2025學(xué)年七年級(jí)下學(xué)期數(shù)學(xué)期末考試卷(無答案)
- 綠色能源市場前瞻分析
- 廣州市房屋租賃合同(15篇)
- 軟件外包行業(yè)市場競爭分析
- 漢字人課件教學(xué)課件
- 漢中消防知識(shí)培訓(xùn)課件
- 混凝土澆筑后的空洞與氣泡檢測方案
- 2025年匹克球裁判試題及答案
- 智慧校園建設(shè)“十五五”發(fā)展規(guī)劃
- 環(huán)境、社會(huì)與公司治理(ESG)
- 學(xué)校食堂食材配送服務(wù)方案(肉類、糧油米面、蔬菜水果類)(技術(shù)標(biāo))
- 物理學(xué)與人類文明(緒論)課件
- 《圓的周長》說課ppt
- 2023年臨滄市市級(jí)單位遴選(選調(diào))考試題庫及答案
- 2017版小學(xué)科學(xué)課程標(biāo)準(zhǔn)思維導(dǎo)圖
- 第十一章-異常分娩-1產(chǎn)力異常
- 建設(shè)工程質(zhì)量檢測見證取樣員手冊(cè)
- 公司介紹-校園招聘-北汽
評(píng)論
0/150
提交評(píng)論