版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
人工智能基礎(chǔ)與應(yīng)用(微課版)工業(yè)和信息化精品系列教材——人工智能技術(shù)第8章計(jì)算機(jī)視覺(jué)處理重點(diǎn)AKEY知識(shí)計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹手寫(xiě)數(shù)字識(shí)別人臉識(shí)別手寫(xiě)數(shù)字識(shí)別計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹人臉識(shí)別8.1計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹計(jì)算機(jī)視覺(jué)是一個(gè)跨學(xué)科的領(lǐng)域,涉及的部分學(xué)科如圖8-1所示。圖8-1計(jì)算機(jī)視覺(jué)涉及的部分學(xué)科8.1計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹計(jì)算機(jī)視覺(jué)是深度學(xué)習(xí)最先取得突破性成就的領(lǐng)域。2012年,在ILSVRC大賽上,基于卷積神經(jīng)網(wǎng)絡(luò)的AlexNet模型獲得了當(dāng)年圖像分類(lèi)的冠軍。歷年ILSVRC比賽冠軍模型錯(cuò)誤率如圖8-2所示。圖8-2歷年ILSVRC比賽冠軍模型錯(cuò)誤率8.1計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹在圖像分類(lèi)問(wèn)題中,圖像上只有單一類(lèi)別,將很多帶有標(biāo)記的數(shù)據(jù)集進(jìn)行訓(xùn)練之后,可以對(duì)新的、未知的、具有單一類(lèi)別的圖像進(jìn)行預(yù)測(cè),類(lèi)似于教小孩子看圖識(shí)物,這種方法是數(shù)據(jù)驅(qū)動(dòng)的方法,也是圖像分類(lèi)最常用的方法。1.圖像分類(lèi)進(jìn)行目標(biāo)檢測(cè)的圖像中并不一定只有單一類(lèi)別的物體。在處理這類(lèi)問(wèn)題時(shí),需要在數(shù)據(jù)上針對(duì)各個(gè)對(duì)象畫(huà)出邊界框和標(biāo)簽,訓(xùn)練完成后可以對(duì)新的圖像進(jìn)行預(yù)測(cè),目標(biāo)檢測(cè)如圖8-4所示,方框可以圈出貓的位置。2.目標(biāo)檢測(cè)8.1計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹語(yǔ)義分割與目標(biāo)檢測(cè)不同,語(yǔ)義分割需要對(duì)每個(gè)像素進(jìn)行語(yǔ)義上的理解,由于需要對(duì)每個(gè)像素屬于圖像上的哪個(gè)部分做出分類(lèi),所以每個(gè)像素都擁有標(biāo)簽,語(yǔ)義分割如圖8-5所示。3.語(yǔ)義分割計(jì)算機(jī)視覺(jué)比較突出的應(yīng)用領(lǐng)域如下。醫(yī)學(xué)圖像檢驗(yàn):從圖像數(shù)據(jù)中提取信息以診斷患者患病類(lèi)別;工業(yè)領(lǐng)域:在該領(lǐng)域,計(jì)算機(jī)視覺(jué)有時(shí)被稱為機(jī)器視覺(jué),如產(chǎn)品質(zhì)量把控,機(jī)器視覺(jué)也大量運(yùn)用于農(nóng)業(yè)上,以去除不良幼苗或除蟲(chóng);安防、娛樂(lè)領(lǐng)域:傳統(tǒng)機(jī)器學(xué)習(xí)的方法運(yùn)用于人臉識(shí)別時(shí)并不能很好地滿足精度要求,并且同一個(gè)人在不同光照、姿態(tài)下的特征會(huì)有差異,在深度學(xué)習(xí)運(yùn)用于計(jì)算機(jī)視覺(jué)后,算法能夠提升識(shí)別準(zhǔn)確率;光學(xué)字符識(shí)別:將計(jì)算機(jī)無(wú)法理解的圖像形式轉(zhuǎn)換成計(jì)算機(jī)可以理解的文本格式;自動(dòng)駕駛:可以在馬路上無(wú)人駕駛汽車(chē),還可以進(jìn)行自動(dòng)泊車(chē)等操作。手寫(xiě)數(shù)字識(shí)別計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹人臉識(shí)別8.2.1項(xiàng)目介紹本項(xiàng)目采用卷積神經(jīng)網(wǎng)絡(luò),為了保證整個(gè)項(xiàng)目的完整性,在訓(xùn)練過(guò)程中不僅要顯示損失或者準(zhǔn)確率,而且在訓(xùn)練完成后需要保存得到的模型,然后調(diào)用攝像頭來(lái)實(shí)時(shí)預(yù)測(cè)新的圖像,新圖像可以是數(shù)據(jù)集中的,也可以是自己手寫(xiě)的。通過(guò)實(shí)現(xiàn)整個(gè)過(guò)程,將OpenCV、神經(jīng)網(wǎng)絡(luò)以及TensorFlow結(jié)合起來(lái)學(xué)習(xí),項(xiàng)目流程圖如圖8-6所示。圖8-6項(xiàng)目流程圖8.2.1項(xiàng)目介紹本節(jié)訓(xùn)練過(guò)程依然使用該網(wǎng)絡(luò),并且在最后訓(xùn)練出模型,模型文件以變量的形式存儲(chǔ)參數(shù),該變量需要在代碼中初始化。在訓(xùn)練過(guò)程中,將更新的參數(shù)存儲(chǔ)到變量中,使用tf.train.Saver()對(duì)象將所有的變量添加到Graph中。保存模型的函數(shù)為:save_path=saver.save(sess,model_path)如果每隔一定的迭代步數(shù)就保存一次模型,就把迭代步數(shù)作為參數(shù)傳進(jìn)去:save_path=saver.save(sess,model_path,global_step=step,write_meta_graph=False)在模型保存之后,調(diào)用該模型可以完成新數(shù)據(jù)的分類(lèi)預(yù)測(cè),模型在保存后會(huì)生成4個(gè)文件,TensorFlow模型如圖所示。8.2.2圖像獲取以及預(yù)處理【例8-1】在mnist_predict目錄下新建文件,命名為read_pic.py,使用OpenCV讀取新圖像,并進(jìn)行預(yù)處理,在PyCharm中編寫(xiě)如下代碼。1.從圖像文件中讀取并處理importosimportcv2os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#將輸入的彩色圖像轉(zhuǎn)換為二值化圖defcolor_input(endimg):img_gray=cv2.cvtColor(endimg,cv2.COLOR_BGR2GRAY)#灰度化轉(zhuǎn)換ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)returnimg_thresholddefread_pic(path):img=cv2.imread(path,cv2.IMREAD_COLOR)
#讀取圖像并顯示cv2.imshow('img',img)cv2.waitKey(0)img_threshold=color_input(img)cv2.imshow('img_threshold',img_threshold)cv2.waitKey(0)if__name__=='__main__':read_pic("pic.png")運(yùn)行以上代碼,在read_pic()函數(shù)中可讀取與read_pic.py同級(jí)目錄下的pic.png圖像文件并且顯示出來(lái)。pic.png圖像文件如圖8-8所示,這是手寫(xiě)的一些數(shù)字,關(guān)掉顯示框之后,調(diào)用color_input()函數(shù),并將讀取的圖像傳遞進(jìn)去。在color_input()函數(shù)中,完成RGB彩色圖像向二值化圖像的轉(zhuǎn)換,并將轉(zhuǎn)換后的二值化圖像顯示出來(lái),轉(zhuǎn)換后的二值化圖像如圖8-9所示。圖8-8pic.png圖像文件圖8-9轉(zhuǎn)換后的二值化圖像8.2.2圖像獲取以及預(yù)處理【例8-2】在mnist_predict目錄下新建文件,命名為camera.py,使用攝像頭拍攝圖像,處理為二值化圖并顯示,在PyCharm中編寫(xiě)以下代碼。2.從攝像頭獲取圖像importcv2defstart():cap=cv2.VideoCapture(0)#使用攝像頭while(True):ret,frame=cap.read()#讀取一幀的圖像img_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#灰度化ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)cv2.imshow('img_threshold',img_threshold)key=cv2.waitKey(30)&0xffifkey==27:sys.exit(0)cap.release()#釋放攝像頭
cv2.destroyAllWindows()if__name__=='__main__':start()start()函數(shù)可調(diào)用攝像頭,捕捉并顯示視頻幀。8.2.3圖像識(shí)別【例8-3】在mnist_predict目錄下新建文件,命名為predict_pic.py,識(shí)別圖像。1.從圖像文件中讀取并識(shí)別importosimportcv2importnumpyasnpimporttensorflowastfos.environ['TF_CPP_MIN_LOG_LEVEL']='2'#將輸入的彩色圖像轉(zhuǎn)換為二值化圖defcolor_input(endimg):img_gray=cv2.cvtColor(endimg,cv2.COLOR_BGR2GRAY)#灰度化
ret,img_threshold=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)returnimg_threshold#讀取圖像并顯示defread_pic(path):img=cv2.imread(path,cv2.IMREAD_COLOR)cv2.imshow('img',img)cv2.waitKey(0)img_threshold=color_input(img)cv2.imshow('img_threshold',img_threshold)cv2.waitKey(0)returnimg_thresholdif__name__=='__main__':withtf.Session()assess:saver=tf.train.import_meta_graph('model_data/model.meta')saver.restore(sess,'model_data/model')#模型恢復(fù)graph=tf.get_default_graph()input_x=sess.graph.get_tensor_by_name("Mul:0")#獲取變量y_conv2=sess.graph.get_tensor_by_name("final_result:0")#讀取圖像img_threshold=read_pic("nine.png")8.2.3圖像識(shí)別#將圖像進(jìn)行縮放
im=cv2.resize(img_threshold,(28,28),interpolation=cv2.INTER_CUBIC)x_img=np.reshape(im,[-1,784])#識(shí)別
output=sess.run(y_conv2,feed_dict={input_x:x_img})result=np.argmax(output)print("識(shí)別結(jié)果為:{}".format(result))8.2.3圖像識(shí)別【例8-4】在目錄下新建文件,命名為predict_camera.py,完成識(shí)別。首先導(dǎo)入需要的類(lèi),包括OpenCV、NumPy和TensorFlow。2.從攝像頭實(shí)時(shí)識(shí)別importosimportcv2importsysimporttimeimportnumpyasnpimporttensorflowastfos.environ['TF_CPP_MIN_LOG_LEVEL']='2'接下來(lái)需要封裝一個(gè)函數(shù),作用是將輸入的RGB圖像轉(zhuǎn)換為二值化圖像,并將轉(zhuǎn)換后的二值化圖像返回。#將輸入的彩色圖像轉(zhuǎn)換為二值化圖defcolor_input(endimg):img_gray=cv2.cvtColor(endimg,cv2.COLOR_BGR2GRAY)ret,img_threshold=cv2.threshold(img_gray,127,255, cv2.THRESH_BINARY_INV)returnimg_threshold8.2.3圖像識(shí)別然后恢復(fù)模型。實(shí)例化一個(gè)saver,并使用saver.restore()函數(shù)恢復(fù)模型,將得到的變量返回。#恢復(fù)模型并實(shí)例化saverdefrestore_model():sess=tf.Session()saver=tf.train.import_meta_graph('model_data/model.meta')#使用saver.restore()函數(shù)模型恢復(fù)
saver.restore(sess,'model_data/model')#獲取變量
input_x=sess.graph.get_tensor_by_name("Mul:0")y_conv2=sess.graph.get_tensor_by_name("final_result:0")returnsess,input_x,y_conv2接下來(lái)構(gòu)建預(yù)測(cè)函數(shù),將變量和二值化圖像傳入,將圖像進(jìn)行縮放,調(diào)用sess.run()函數(shù)實(shí)現(xiàn)預(yù)測(cè),并將結(jié)果返回。#圖像預(yù)測(cè)defmnist_predict(sess,input_x,y_conv2,img_thre):#將圖像進(jìn)行縮放
im=cv2.resize(img_thre,(28,28),interpolation=cv2.INTER_CUBIC)x_img=np.reshape(im,[-1,784])#識(shí)別
output=sess.run(y_conv2,feed_dict={input_x:x_img})result=np.argmax(output)returnresult最后在主函數(shù)中調(diào)用攝像頭,調(diào)用模型恢復(fù)函數(shù),使用cv2.putText()函數(shù)在顯示的界面上顯示識(shí)別結(jié)果、幀Q數(shù)等提示。8.2.3圖像識(shí)別if__name__=='__main__':#使用默認(rèn)字體
font=cv2.FONT_HERSHEY_SIMPLEX#使用攝像頭
cap=cv2.VideoCapture(0)#初始化用于計(jì)算fps的變量
fps="FPS:??"start_time=time.time()counter=0#調(diào)用模型恢復(fù)函數(shù)
sess,input_x,y_conv2=restore_model()#循環(huán)顯示識(shí)別結(jié)果圖像
while(True):#讀取一幀的圖像
ret,frame=cap.read()cv2.rectangle(frame,(180,100),(460,380),(0,255,0),2)frame=cv2.putText(frame,'Please',(0,40),font,1.2,(0,255,255),2)frame=cv2.putText(frame,'Putthenumberinthebox:',(0,80),font,1.2,(0,255,255),2)endimg=frame[100:380,180:460]endimg_threshold=color_input(endimg)result=mnist_predict(sess,input_x,y_conv2,endimg_threshold)counter+=1if(time.time()-start_time)>1:print("FPS:",counter/(time.time()-start_time))counter=0start_time=time.time()cv2.putText(frame,"%d"%result,(460,380),font,3,(0,0,255),2)cv2.putText(frame,fps,(50,120),font,0.8,(0,0,255),2)cv2.imshow('NumberRecognition',frame)key=cv2.waitKey(30)&0xffifkey==27:sys.exit(0)sess.close()#釋放攝像頭cap.release()cv2.destroyAllWindows()8.2.4結(jié)果顯示使用代碼畫(huà)一個(gè)方形框,可以使結(jié)果更加直觀。將攝像頭對(duì)準(zhǔn)手寫(xiě)的數(shù)字,將數(shù)字放在框里,調(diào)用識(shí)別函數(shù)完成識(shí)別,并將幀數(shù)FPS顯示在方形框左上角,將結(jié)果顯示在方形框右下角,識(shí)別結(jié)果如圖8-12所示。手寫(xiě)數(shù)字識(shí)別計(jì)算機(jī)視覺(jué)開(kāi)發(fā)介紹人臉識(shí)別8.3.1項(xiàng)目介紹本項(xiàng)目使用讀取圖像以及調(diào)用攝像頭兩種方式完成圖像中人臉檢測(cè)、人臉關(guān)鍵點(diǎn)檢測(cè)、人臉對(duì)比、人臉?biāo)阉髋c人臉識(shí)別。本項(xiàng)目基于face_recognition項(xiàng)目開(kāi)發(fā)。face_recognition項(xiàng)目的人臉識(shí)別是基于C++開(kāi)源庫(kù)dlib中的深度學(xué)習(xí)模型實(shí)現(xiàn)的,用LFW(LabeledFacesintheWildHome)人臉數(shù)據(jù)集進(jìn)行測(cè)試時(shí),準(zhǔn)確率可達(dá)到99.38%。在項(xiàng)目開(kāi)始之前需要安裝face_recognition第三方庫(kù):Python版本需要在Python3.3及以上或者Python2.7上安裝;在Mac、Linux或者Windows上安裝時(shí),首先需要安裝dlib,然后在交互界面輸入“pip3installface_recognition”命令安裝項(xiàng)目源碼,或者直接在GitHub網(wǎng)站下載項(xiàng)目源碼。8.3.2人臉的數(shù)據(jù)集介紹人臉數(shù)據(jù)集很多,本書(shū)介紹LFW(LabeledFacesintheWildHome)數(shù)據(jù)集。由美國(guó)馬薩諸塞州立大學(xué)阿默斯特分校計(jì)算機(jī)視覺(jué)實(shí)驗(yàn)室整理完成的,主要用來(lái)研究非受限情況下的人臉識(shí)別問(wèn)題。在LFW數(shù)據(jù)集中,由于多姿態(tài)、光照、表情、年齡、遮擋等因素的影響,即使是同一人的照片差別也很大。該數(shù)據(jù)集包含5746個(gè)人的13233張照片,其中1680個(gè)人擁有多張照片,每張照片的大小為250像素×250像素。下載LFW數(shù)據(jù)集,解壓后的目錄如圖所示。LFW數(shù)據(jù)集文件夾按名字命名,人臉照片在每個(gè)名字的文件夾下,人臉照片命名方式為“名字_xx.jpg”,如Aaron_Eckhart_0001.jpg。8.3.3人臉識(shí)別流程01OPTION02OPTION03OPTION04OPTION人臉圖像采集及檢測(cè)人臉識(shí)別首先需要采集人臉圖像,可以通過(guò)讀取圖像或者通過(guò)攝像頭直接采集來(lái)完成。人臉圖像預(yù)處理預(yù)處理可以盡量避免環(huán)境條件限制和隨機(jī)干擾,提高特征提取準(zhǔn)確率。人臉圖像特征提取人臉圖像特征提取也稱為人臉表征,它是對(duì)人臉進(jìn)行特征建模的過(guò)程,可以將圖像信息數(shù)字化,根據(jù)人臉器官的形狀描述以及它們之間的距離特性來(lái)獲得有助于人臉?lè)诸?lèi)的特征數(shù)據(jù)。匹配與識(shí)別匹配是將所提取的人臉圖像的特征數(shù)據(jù)與數(shù)據(jù)庫(kù)中存儲(chǔ)的特征模板進(jìn)行搜索匹配8.3.4人臉識(shí)別方案1.怎么找到人臉人臉識(shí)別的第一步是找到人臉,即人臉檢測(cè),在一張照片或一個(gè)視頻幀中,首先要知道是否存在人臉以及人臉的位置。找到人臉之后需要提取整體圖像特征,提取特征的方法有方向梯度直方圖(HistogramofOrientedGradient,HOG)、局部二值(LocalBinaryPattern,LBP)以及Haar-like。8.3.4人臉識(shí)別方案2.簡(jiǎn)單的面部識(shí)別分類(lèi)根據(jù)之前的步驟將臉部從圖像中分離,如果直接將兩張照片進(jìn)行對(duì)比,當(dāng)兩者中人臉的角度、位置不同時(shí),接下來(lái)的網(wǎng)絡(luò)或者算法在做分類(lèi)時(shí)準(zhǔn)確率降低,所以通常需要先對(duì)臉部圖像進(jìn)行預(yù)處理。預(yù)處理方法是瓦希德?卡澤米(VahidKazemi)和約瑟芬?沙利文(JosephineSullivan)提出的面部特征點(diǎn)估計(jì),該方法的主要思路是找到面部中普遍存在的68個(gè)特征點(diǎn),包括下巴、每只眼睛的外部輪廓、每條眉毛的內(nèi)部輪廓等,然后基于這些特征點(diǎn)的位置對(duì)圖像進(jìn)行仿射變換等操作,讓人臉盡量居中。臉部居中之后可以進(jìn)行識(shí)別,最簡(jiǎn)單的方法是將要識(shí)別的人臉與數(shù)據(jù)庫(kù)被標(biāo)注的人臉進(jìn)行比較,看是否相似。最后一步就是人臉識(shí)別,有了前面的鋪墊,這一步就很簡(jiǎn)單了。得到需要識(shí)別的人臉并將其編碼之后,使用分類(lèi)算法就可以完成識(shí)別,如KNN。需要注意的是,這里的KNN并不是對(duì)比兩張照片的像素距離,而是對(duì)比編碼后的128個(gè)參數(shù)值的距離。8.3.5人臉識(shí)別應(yīng)用1.人臉檢測(cè)【例8-5】在face_predict下新建face-find.py文件,讀取照片并將檢測(cè)后的人臉標(biāo)注出來(lái)。importcv2importface_recognition#加載被比較的圖像frame=face_recognition.load_image_file("Face_database/hyz/hyz.png")#使用CPU獲得人臉邊界框的數(shù)列face_locations=face_recognition.face_locations(frame)#使用CNN并利用GPU/CUDA加速獲得人臉邊界框的數(shù)列#相對(duì)更準(zhǔn)確#face_locations=face_recognition.face_locations(frame,number_of_times_to_upsample=0,model="cnn")print("該張圖像中有{}張人臉。".format(len(face_locations)))#圈出人臉邊界框for(top,right,bottom,left)inface_locations:cv2.rectangle(frame,(left,top),(right,bottom),(0,255,0),2)#顯示得到人臉后的圖像frame=frame[:,:,::-1]cv2.imshow("image",frame)cv2.waitKey(0)8.3.5人臉識(shí)別應(yīng)用2.人臉關(guān)鍵點(diǎn)檢測(cè)【例8-6】在face_predict下新建face-feature.py文件,讀取照片并標(biāo)記特征點(diǎn)。#加載被比較的圖像frame=face_recognition.load_image_file("Face_database/hyz/hyz.png")#查找圖像中的所有面部特征face_landmarks_list=face_recognition.face_landmarks(frame,face_locations=None,model='large')#查找圖像中的鼻子、左眼、右眼面部特征#face_landmarks_list=face_recognition.face_landmarks(frame,face_locations=None,model='small')print("該張圖像中有{}張人臉。".format(len(face_landmarks_list)))forface_landmarksinface_landmarks_list:#打印此圖像中每個(gè)面部特征的位置
#查找圖像中所有面部特征的列表
facial_features=['chin','left_eyebrow','right_eyebrow','nose_bridge','nose_tip','left_eye','right_eye','top_lip','bottom_lip'
]#查找圖像中鼻子、左眼、右眼面部特征的列表#facial_features=[#'nose_tip',#'left_eye',#'right_eye',#]#在圖像中描繪出人臉特征forfacial_featureinfacial_features:#數(shù)據(jù)類(lèi)型必須是int32pts=np.array(face_landmarks[facial_feature],32)pts=pts.reshape((-1,1,2))#圖像,點(diǎn)集,是否閉合,顏色,線條粗細(xì)cv2.polylines(frame,[pts],False,(0,0,0),2)#顯示得到人臉后的圖像frame=frame[:,:,::-1]cv2.imshow("image",frame)cv2.waitKey(0)8.3.5人臉識(shí)別應(yīng)用3.人臉對(duì)比【例8-7】在face_predict下新建face-compare.py,完成人臉對(duì)比。#人臉比較:將兩張人臉圖像進(jìn)行對(duì)比#將兩者之間的相似值進(jìn)行打印#閾值為0.6,閾值越小,條件越苛刻importcv2importface_recognition#加載被比較的圖像source_image=face_recognition.load_image_file("Face_database/hyz/hyz.png")#加載測(cè)試圖像compare_image=face_recognition.load_image_file("Face_database/hyz/hyz_near.png")#獲取人臉位置并做單人臉容錯(cuò)處理source_locations=face_recognition.face_locations(source_image)iflen(source_locations)!=1:print("注意:圖像一只能有一張人臉哦!")exit(0)#獲取人臉位置并做單人臉容錯(cuò)處理compare_locations=face_recognition.face_locations(compare_image)iflen(compare_locations)!=1:print("注意:圖像二只能有一張人臉哦!")exit(0)#繪制圖像一的人臉for(top,right,bottom,left)insource_locations:print(top,right,bottom,left)cv2.rectangle(source_image,(left,top),(right,bottom),(0,255,0),2)#繪制圖像二的人臉for(top,right,bottom,left)incompare_locations:print(top,right,bottom,left)cv2.rectangle(compare_image,(left,top),(right,bottom),(0,255,0),2)#獲取圖像一的面部編碼source_face_encoding=face_recognition.face_encodings(source_image)[0]source_encodings=[source_face_encoding,]#獲取圖像二的面部編碼compare_face_encoding=
face_recognition.face_encodings(compare_image)[0]#顯示兩張得到人臉后的圖像source_image=source_image[:,:,::-1]cv2.imshow("image",source_image)cv2.waitKey(0)compare_image=compare_image[:,:,::-1]8.3.5人臉識(shí)別應(yīng)用cv2.imshow("image",compare_image)cv2.waitKey(0)#查看面部一與面部二的比較結(jié)果,閾值為0.6,閾值越小越苛刻face_distances=face_pare_faces(source_encodings,compare_face_encoding,0.6)#輸出結(jié)果print("正常閾值為0.6時(shí),測(cè)試圖像是否與已知圖像{}匹配!".format("是"ifface_distanceselse"不是"))4.人臉?biāo)阉鳌纠?-8】在face_predict下新建face-seek.py,完成人臉?biāo)阉鳌?查找人臉:查找圖像中的人臉并標(biāo)記出來(lái)importosimportface_recognitionfile_name=[]known_faces=[]#加載文件中的人臉庫(kù)圖像image_dir="Face_database/hyz/"8.3.5人臉識(shí)別應(yīng)用forparent,dirnames,filenamesinos.walk(image_dir):forfilenameinfilenames:#print(filename)#加載圖像
frame=face_recognition.load_image_file(image_dir+filename)face_bounding_boxes=face_recognition.face_locations(frame)iflen(face_bounding_boxes)!=1:#如果訓(xùn)練圖像中沒(méi)有人(或人太多),請(qǐng)?zhí)^(guò)圖像
print("{}這張圖像不適合訓(xùn)練:{}。".format(image_dir+filename,"因?yàn)樗厦鏇](méi)找到人臉"iflen(face_bounding_boxes)<1else"因?yàn)樗恢挂粡埲四?))else:#encodingframe_face_encoding=face_recognition.face_encodings(frame)[0]#加到列表里
known_faces.append(frame_face_encoding)file_name.append(filename)#加載未知圖像frame=face_recognition.load_image_file("unknown/unknown1.png")#encodingframe_face_encoding=face_recognition.face_encodings(frame)[0]#比較獲得結(jié)果results=face_pare_faces(known_faces,frame_face_encoding)print(results)8.3.5人臉識(shí)別應(yīng)用5.人臉識(shí)別【例8-9】在face_predict下新建face-knn-train.py,使用KNN實(shí)現(xiàn)人臉庫(kù)的訓(xùn)練。#訓(xùn)練K近鄰分類(lèi)器importmathfromsklearnimportneighborsimportosimportos.pathimportpickleimportface_recognitionfromface_recognition.face_recognition_cliimportimage_files_in_folderdeftrain(train_dir,model_save_path=None,n_neighbors=None,knn_algo='ball_tree',verbose=False):"""
訓(xùn)練K近鄰分類(lèi)器進(jìn)行人臉識(shí)別
paramtrain_dir:包含每個(gè)已知人員的子目錄及人員名稱的目錄
parammodel_save_path:(可選)將模型保存在磁盤(pán)上的路徑
paramn_neighbors:(可選)在分類(lèi)中稱重的鄰居數(shù)。如果未指定,則自動(dòng)選擇
paramknn_algo:(可選)支持knn.default的底層數(shù)據(jù)結(jié)構(gòu)是ball_treeparamverbose:訓(xùn)練時(shí)是否根據(jù)圖像數(shù)量取n_neighbors的值
return:返回在給定數(shù)據(jù)上訓(xùn)練的KNN分類(lèi)器
"""X=[]y=[]8.3.5人臉識(shí)別應(yīng)用#循環(huán)遍歷訓(xùn)練集中的每個(gè)人forclass_dirinos.listdir(train_dir):#如果train_dir/class_dir不是一個(gè)目錄,就繼續(xù)ifnotos.path.isdir(os.path.join(train_dir,class_dir)):continue#循環(huán)瀏覽當(dāng)前人員的每個(gè)訓(xùn)練圖像forimg_pathinimage_files_in_folder(os.path.join(train_dir,class_dir)):image=face_recognition.load_image_file(img_path)face_bounding_boxes=face_recognition.face_locations(image)iflen(face_bounding_boxes)!=1:#如果訓(xùn)練圖像中沒(méi)有人(或人太多),請(qǐng)?zhí)^(guò)圖像
ifverbose:print("{}這張圖像不適合訓(xùn)練:{}。".format(img_path,"因?yàn)樗厦鏇](méi)找到人臉"iflen(face_bounding_boxes)<1else"因?yàn)樗恢挂粡埲四?))else:#將當(dāng)前圖像的面部編碼添加到訓(xùn)練集
X.append(face_recognition.face_encodings(image,known_face_locations=face_bounding_boxes)[0])y.append(class_dir)#確定KNN分類(lèi)器中用于加權(quán)的近鄰
ifn_neighborsisNone:n_neighbors=int(round(math.sqrt(len(X))))#面部編碼長(zhǎng)度開(kāi)平方后四舍五入取整數(shù)
ifverbose:print("自動(dòng)選擇n_neighbors:",n_neighbors)#創(chuàng)建并訓(xùn)練KNN分類(lèi)器
knn_clf=neighbors.KNeighborsClassifier(n_neighbors=n_neighbors,algorithm=knn_algo,weights='distance')knn_clf.fit(X,y)8.3.5人臉識(shí)別應(yīng)用#保存訓(xùn)練后的KNN分類(lèi)器
ifmodel_save_pathisnotNone:withopen(model_save_path,'wb')asf:pickle.dump(knn_clf,f)returnknn_clfif__name__=="__main__":#訓(xùn)練的KNN分類(lèi),并將其保存到磁盤(pán)
print("訓(xùn)練KNN分類(lèi)器...")classifier=train("Face_database",model_save_path="trained_knn_model.clf",n_neighbors=1)print("訓(xùn)練完成!")5.人臉識(shí)別在face_predict下新建face-knn-predict.py文件,實(shí)現(xiàn)人臉識(shí)別。#攝像頭測(cè)試K近鄰分類(lèi)器importosimportcv2importos.pathimportpickleimportface_recognitionALLOWED_EXTENSIONS={'png','jpg','jpeg'}defpredict(X_img,knn_clf=None,model_path=None,distance_threshold=0.6):8.3.5人臉識(shí)別應(yīng)用"""
使用訓(xùn)練后的KNN分類(lèi)器識(shí)別給定圖像中的面部
paramX_img:要識(shí)別的圖像
paramknn_clf:(可選)一個(gè)KNN分類(lèi)器對(duì)象。如果未指定,則必須指定model_save_pathparammodel_path:(可選)pickleKNN分類(lèi)器的路徑。如果未指定,則model_save_path必須為knn_clfparamdistance_threshold:(可選)面部分類(lèi)的距離閾值。它越大,機(jī)會(huì)就越大,就會(huì)將一個(gè)不知名的人誤分類(lèi)為已知人員圖像中已識(shí)別面部的名稱和面部位置列表:[(名稱,邊界框),...]。對(duì)于未被識(shí)別人員的面孔,將返回“未知”的名稱
"""ifknn_clfisNoneandmodel_pathisNone:raiseException("必須提供KNN分類(lèi)器knn_clf或model_path")
#加載訓(xùn)練后的KNN模型(如果傳入了一個(gè))
ifknn_clfisNone:withopen(model_path,
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年測(cè)溫儀表市場(chǎng)調(diào)研報(bào)告
- 2025年核二級(jí)氣動(dòng)薄膜截止閥項(xiàng)目投資可行性研究分析報(bào)告
- 2024-2030年中國(guó)數(shù)字化閱讀行業(yè)市場(chǎng)全景監(jiān)測(cè)及投資前景展望報(bào)告
- 2020-2025年中國(guó)煙用香精香料行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢報(bào)告
- 2024-2030年中國(guó)原油管道運(yùn)輸行業(yè)市場(chǎng)調(diào)查研究及投資前景展望報(bào)告
- 2025年太陽(yáng)能電池用多晶硅、非晶硅項(xiàng)目評(píng)估報(bào)告
- 2024-2030年中國(guó)抗瘧藥行業(yè)市場(chǎng)深度分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2019-2025年中國(guó)化纖長(zhǎng)絲行業(yè)市場(chǎng)調(diào)研分析及投資前景預(yù)測(cè)報(bào)告
- 飛機(jī)裝配課程設(shè)計(jì)裝
- 2025年中國(guó)提花地墊行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2024版?zhèn)€人私有房屋購(gòu)買(mǎi)合同
- 2025年山東光明電力服務(wù)公司招聘筆試參考題庫(kù)含答案解析
- 2024爆炸物運(yùn)輸安全保障協(xié)議版B版
- 《神經(jīng)發(fā)展障礙 兒童社交溝通障礙康復(fù)規(guī)范》
- 2025年中建六局二級(jí)子企業(yè)總經(jīng)理崗位公開(kāi)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年5月江蘇省事業(yè)單位招聘考試【綜合知識(shí)與能力素質(zhì)】真題及答案解析(管理類(lèi)和其他類(lèi))
- 注漿工安全技術(shù)措施
- 《食品與食品》課件
- 2024年世界職業(yè)院校技能大賽“食品安全與質(zhì)量檢測(cè)組”參考試題庫(kù)(含答案)
- 讀書(shū)分享會(huì)《白夜行》
- 2023上海高考英語(yǔ)詞匯手冊(cè)單詞背誦默寫(xiě)表格(復(fù)習(xí)必背)
評(píng)論
0/150
提交評(píng)論