![人工智能基礎(chǔ)與應用-第8章-計算機視覺處理_第1頁](http://file4.renrendoc.com/view14/M0A/1A/12/wKhkGWca9X-Af8ElAAEcsbY1C0U663.jpg)
![人工智能基礎(chǔ)與應用-第8章-計算機視覺處理_第2頁](http://file4.renrendoc.com/view14/M0A/1A/12/wKhkGWca9X-Af8ElAAEcsbY1C0U6632.jpg)
![人工智能基礎(chǔ)與應用-第8章-計算機視覺處理_第3頁](http://file4.renrendoc.com/view14/M0A/1A/12/wKhkGWca9X-Af8ElAAEcsbY1C0U6633.jpg)
![人工智能基礎(chǔ)與應用-第8章-計算機視覺處理_第4頁](http://file4.renrendoc.com/view14/M0A/1A/12/wKhkGWca9X-Af8ElAAEcsbY1C0U6634.jpg)
![人工智能基礎(chǔ)與應用-第8章-計算機視覺處理_第5頁](http://file4.renrendoc.com/view14/M0A/1A/12/wKhkGWca9X-Af8ElAAEcsbY1C0U6635.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
人工智能基礎(chǔ)與應用(微課版)工業(yè)和信息化精品系列教材——人工智能技術(shù)第8章計算機視覺處理重點AKEY知識計算機視覺開發(fā)介紹手寫數(shù)字識別人臉識別手寫數(shù)字識別計算機視覺開發(fā)介紹人臉識別8.1計算機視覺開發(fā)介紹計算機視覺是一個跨學科的領(lǐng)域,涉及的部分學科如圖8-1所示。圖8-1計算機視覺涉及的部分學科8.1計算機視覺開發(fā)介紹計算機視覺是深度學習最先取得突破性成就的領(lǐng)域。2012年,在ILSVRC大賽上,基于卷積神經(jīng)網(wǎng)絡(luò)的AlexNet模型獲得了當年圖像分類的冠軍。歷年ILSVRC比賽冠軍模型錯誤率如圖8-2所示。圖8-2歷年ILSVRC比賽冠軍模型錯誤率8.1計算機視覺開發(fā)介紹在圖像分類問題中,圖像上只有單一類別,將很多帶有標記的數(shù)據(jù)集進行訓練之后,可以對新的、未知的、具有單一類別的圖像進行預測,類似于教小孩子看圖識物,這種方法是數(shù)據(jù)驅(qū)動的方法,也是圖像分類最常用的方法。1.圖像分類進行目標檢測的圖像中并不一定只有單一類別的物體。在處理這類問題時,需要在數(shù)據(jù)上針對各個對象畫出邊界框和標簽,訓練完成后可以對新的圖像進行預測,目標檢測如圖8-4所示,方框可以圈出貓的位置。2.目標檢測8.1計算機視覺開發(fā)介紹語義分割與目標檢測不同,語義分割需要對每個像素進行語義上的理解,由于需要對每個像素屬于圖像上的哪個部分做出分類,所以每個像素都擁有標簽,語義分割如圖8-5所示。3.語義分割計算機視覺比較突出的應用領(lǐng)域如下。醫(yī)學圖像檢驗:從圖像數(shù)據(jù)中提取信息以診斷患者患病類別;工業(yè)領(lǐng)域:在該領(lǐng)域,計算機視覺有時被稱為機器視覺,如產(chǎn)品質(zhì)量把控,機器視覺也大量運用于農(nóng)業(yè)上,以去除不良幼苗或除蟲;安防、娛樂領(lǐng)域:傳統(tǒng)機器學習的方法運用于人臉識別時并不能很好地滿足精度要求,并且同一個人在不同光照、姿態(tài)下的特征會有差異,在深度學習運用于計算機視覺后,算法能夠提升識別準確率;光學字符識別:將計算機無法理解的圖像形式轉(zhuǎn)換成計算機可以理解的文本格式;自動駕駛:可以在馬路上無人駕駛汽車,還可以進行自動泊車等操作。手寫數(shù)字識別計算機視覺開發(fā)介紹人臉識別8.2.1項目介紹本項目采用卷積神經(jīng)網(wǎng)絡(luò),為了保證整個項目的完整性,在訓練過程中不僅要顯示損失或者準確率,而且在訓練完成后需要保存得到的模型,然后調(diào)用攝像頭來實時預測新的圖像,新圖像可以是數(shù)據(jù)集中的,也可以是自己手寫的。通過實現(xiàn)整個過程,將OpenCV、神經(jīng)網(wǎng)絡(luò)以及TensorFlow結(jié)合起來學習,項目流程圖如圖8-6所示。圖8-6項目流程圖8.2.1項目介紹本節(jié)訓練過程依然使用該網(wǎng)絡(luò),并且在最后訓練出模型,模型文件以變量的形式存儲參數(shù),該變量需要在代碼中初始化。在訓練過程中,將更新的參數(shù)存儲到變量中,使用tf.train.Saver()對象將所有的變量添加到Graph中。保存模型的函數(shù)為:save_path=saver.save(sess,model_path)如果每隔一定的迭代步數(shù)就保存一次模型,就把迭代步數(shù)作為參數(shù)傳進去:save_path=saver.save(sess,model_path,global_step=step,write_meta_graph=False)在模型保存之后,調(diào)用該模型可以完成新數(shù)據(jù)的分類預測,模型在保存后會生成4個文件,TensorFlow模型如圖所示。8.2.2圖像獲取以及預處理【例8-1】在mnist_predict目錄下新建文件,命名為read_pic.py,使用OpenCV讀取新圖像,并進行預處理,在PyCharm中編寫如下代碼。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")運行以上代碼,在read_pic()函數(shù)中可讀取與read_pic.py同級目錄下的pic.png圖像文件并且顯示出來。pic.png圖像文件如圖8-8所示,這是手寫的一些數(shù)字,關(guān)掉顯示框之后,調(diào)用color_input()函數(shù),并將讀取的圖像傳遞進去。在color_input()函數(shù)中,完成RGB彩色圖像向二值化圖像的轉(zhuǎn)換,并將轉(zhuǎn)換后的二值化圖像顯示出來,轉(zhuǎn)換后的二值化圖像如圖8-9所示。圖8-8pic.png圖像文件圖8-9轉(zhuǎn)換后的二值化圖像8.2.2圖像獲取以及預處理【例8-2】在mnist_predict目錄下新建文件,命名為camera.py,使用攝像頭拍攝圖像,處理為二值化圖并顯示,在PyCharm中編寫以下代碼。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圖像識別【例8-3】在mnist_predict目錄下新建文件,命名為predict_pic.py,識別圖像。1.從圖像文件中讀取并識別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')#模型恢復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圖像識別#將圖像進行縮放
im=cv2.resize(img_threshold,(28,28),interpolation=cv2.INTER_CUBIC)x_img=np.reshape(im,[-1,784])#識別
output=sess.run(y_conv2,feed_dict={input_x:x_img})result=np.argmax(output)print("識別結(jié)果為:{}".format(result))8.2.3圖像識別【例8-4】在目錄下新建文件,命名為predict_camera.py,完成識別。首先導入需要的類,包括OpenCV、NumPy和TensorFlow。2.從攝像頭實時識別importosimportcv2importsysimporttimeimportnumpyasnpimporttensorflowastfos.environ['TF_CPP_MIN_LOG_LEVEL']='2'接下來需要封裝一個函數(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圖像識別然后恢復模型。實例化一個saver,并使用saver.restore()函數(shù)恢復模型,將得到的變量返回。#恢復模型并實例化saverdefrestore_model():sess=tf.Session()saver=tf.train.import_meta_graph('model_data/model.meta')#使用saver.restore()函數(shù)模型恢復
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接下來構(gòu)建預測函數(shù),將變量和二值化圖像傳入,將圖像進行縮放,調(diào)用sess.run()函數(shù)實現(xiàn)預測,并將結(jié)果返回。#圖像預測defmnist_predict(sess,input_x,y_conv2,img_thre):#將圖像進行縮放
im=cv2.resize(img_thre,(28,28),interpolation=cv2.INTER_CUBIC)x_img=np.reshape(im,[-1,784])#識別
output=sess.run(y_conv2,feed_dict={input_x:x_img})result=np.argmax(output)returnresult最后在主函數(shù)中調(diào)用攝像頭,調(diào)用模型恢復函數(shù),使用cv2.putText()函數(shù)在顯示的界面上顯示識別結(jié)果、幀Q數(shù)等提示。8.2.3圖像識別if__name__=='__main__':#使用默認字體
font=cv2.FONT_HERSHEY_SIMPLEX#使用攝像頭
cap=cv2.VideoCapture(0)#初始化用于計算fps的變量
fps="FPS:??"start_time=time.time()counter=0#調(diào)用模型恢復函數(shù)
sess,input_x,y_conv2=restore_model()#循環(huán)顯示識別結(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é)果顯示使用代碼畫一個方形框,可以使結(jié)果更加直觀。將攝像頭對準手寫的數(shù)字,將數(shù)字放在框里,調(diào)用識別函數(shù)完成識別,并將幀數(shù)FPS顯示在方形框左上角,將結(jié)果顯示在方形框右下角,識別結(jié)果如圖8-12所示。手寫數(shù)字識別計算機視覺開發(fā)介紹人臉識別8.3.1項目介紹本項目使用讀取圖像以及調(diào)用攝像頭兩種方式完成圖像中人臉檢測、人臉關(guān)鍵點檢測、人臉對比、人臉搜索與人臉識別。本項目基于face_recognition項目開發(fā)。face_recognition項目的人臉識別是基于C++開源庫dlib中的深度學習模型實現(xiàn)的,用LFW(LabeledFacesintheWildHome)人臉數(shù)據(jù)集進行測試時,準確率可達到99.38%。在項目開始之前需要安裝face_recognition第三方庫:Python版本需要在Python3.3及以上或者Python2.7上安裝;在Mac、Linux或者Windows上安裝時,首先需要安裝dlib,然后在交互界面輸入“pip3installface_recognition”命令安裝項目源碼,或者直接在GitHub網(wǎng)站下載項目源碼。8.3.2人臉的數(shù)據(jù)集介紹人臉數(shù)據(jù)集很多,本書介紹LFW(LabeledFacesintheWildHome)數(shù)據(jù)集。由美國馬薩諸塞州立大學阿默斯特分校計算機視覺實驗室整理完成的,主要用來研究非受限情況下的人臉識別問題。在LFW數(shù)據(jù)集中,由于多姿態(tài)、光照、表情、年齡、遮擋等因素的影響,即使是同一人的照片差別也很大。該數(shù)據(jù)集包含5746個人的13233張照片,其中1680個人擁有多張照片,每張照片的大小為250像素×250像素。下載LFW數(shù)據(jù)集,解壓后的目錄如圖所示。LFW數(shù)據(jù)集文件夾按名字命名,人臉照片在每個名字的文件夾下,人臉照片命名方式為“名字_xx.jpg”,如Aaron_Eckhart_0001.jpg。8.3.3人臉識別流程01OPTION02OPTION03OPTION04OPTION人臉圖像采集及檢測人臉識別首先需要采集人臉圖像,可以通過讀取圖像或者通過攝像頭直接采集來完成。人臉圖像預處理預處理可以盡量避免環(huán)境條件限制和隨機干擾,提高特征提取準確率。人臉圖像特征提取人臉圖像特征提取也稱為人臉表征,它是對人臉進行特征建模的過程,可以將圖像信息數(shù)字化,根據(jù)人臉器官的形狀描述以及它們之間的距離特性來獲得有助于人臉分類的特征數(shù)據(jù)。匹配與識別匹配是將所提取的人臉圖像的特征數(shù)據(jù)與數(shù)據(jù)庫中存儲的特征模板進行搜索匹配8.3.4人臉識別方案1.怎么找到人臉人臉識別的第一步是找到人臉,即人臉檢測,在一張照片或一個視頻幀中,首先要知道是否存在人臉以及人臉的位置。找到人臉之后需要提取整體圖像特征,提取特征的方法有方向梯度直方圖(HistogramofOrientedGradient,HOG)、局部二值(LocalBinaryPattern,LBP)以及Haar-like。8.3.4人臉識別方案2.簡單的面部識別分類根據(jù)之前的步驟將臉部從圖像中分離,如果直接將兩張照片進行對比,當兩者中人臉的角度、位置不同時,接下來的網(wǎng)絡(luò)或者算法在做分類時準確率降低,所以通常需要先對臉部圖像進行預處理。預處理方法是瓦希德?卡澤米(VahidKazemi)和約瑟芬?沙利文(JosephineSullivan)提出的面部特征點估計,該方法的主要思路是找到面部中普遍存在的68個特征點,包括下巴、每只眼睛的外部輪廓、每條眉毛的內(nèi)部輪廓等,然后基于這些特征點的位置對圖像進行仿射變換等操作,讓人臉盡量居中。臉部居中之后可以進行識別,最簡單的方法是將要識別的人臉與數(shù)據(jù)庫被標注的人臉進行比較,看是否相似。最后一步就是人臉識別,有了前面的鋪墊,這一步就很簡單了。得到需要識別的人臉并將其編碼之后,使用分類算法就可以完成識別,如KNN。需要注意的是,這里的KNN并不是對比兩張照片的像素距離,而是對比編碼后的128個參數(shù)值的距離。8.3.5人臉識別應用1.人臉檢測【例8-5】在face_predict下新建face-find.py文件,讀取照片并將檢測后的人臉標注出來。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ù)列#相對更準確#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人臉識別應用2.人臉關(guān)鍵點檢測【例8-6】在face_predict下新建face-feature.py文件,讀取照片并標記特征點。#加載被比較的圖像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:#打印此圖像中每個面部特征的位置
#查找圖像中所有面部特征的列表
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ù)類型必須是int32pts=np.array(face_landmarks[facial_feature],32)pts=pts.reshape((-1,1,2))#圖像,點集,是否閉合,顏色,線條粗細cv2.polylines(frame,[pts],False,(0,0,0),2)#顯示得到人臉后的圖像frame=frame[:,:,::-1]cv2.imshow("image",frame)cv2.waitKey(0)8.3.5人臉識別應用3.人臉對比【例8-7】在face_predict下新建face-compare.py,完成人臉對比。#人臉比較:將兩張人臉圖像進行對比#將兩者之間的相似值進行打印#閾值為0.6,閾值越小,條件越苛刻importcv2importface_recognition#加載被比較的圖像source_image=face_recognition.load_image_file("Face_database/hyz/hyz.png")#加載測試圖像compare_image=face_recognition.load_image_file("Face_database/hyz/hyz_near.png")#獲取人臉位置并做單人臉容錯處理source_locations=face_recognition.face_locations(source_image)iflen(source_locations)!=1:print("注意:圖像一只能有一張人臉哦!")exit(0)#獲取人臉位置并做單人臉容錯處理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人臉識別應用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時,測試圖像是否與已知圖像{}匹配!".format("是"ifface_distanceselse"不是"))4.人臉搜索【例8-8】在face_predict下新建face-seek.py,完成人臉搜索。#查找人臉:查找圖像中的人臉并標記出來importosimportface_recognitionfile_name=[]known_faces=[]#加載文件中的人臉庫圖像image_dir="Face_database/hyz/"8.3.5人臉識別應用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:#如果訓練圖像中沒有人(或人太多),請?zhí)^圖像
print("{}這張圖像不適合訓練:{}。".format(image_dir+filename,"因為它上面沒找到人臉"iflen(face_bounding_boxes)<1else"因為它不止一張人臉"))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人臉識別應用5.人臉識別【例8-9】在face_predict下新建face-knn-train.py,使用KNN實現(xiàn)人臉庫的訓練。#訓練K近鄰分類器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):"""
訓練K近鄰分類器進行人臉識別
paramtrain_dir:包含每個已知人員的子目錄及人員名稱的目錄
parammodel_save_path:(可選)將模型保存在磁盤上的路徑
paramn_neighbors:(可選)在分類中稱重的鄰居數(shù)。如果未指定,則自動選擇
paramknn_algo:(可選)支持knn.default的底層數(shù)據(jù)結(jié)構(gòu)是ball_treeparamverbose:訓練時是否根據(jù)圖像數(shù)量取n_neighbors的值
return:返回在給定數(shù)據(jù)上訓練的KNN分類器
"""X=[]y=[]8.3.5人臉識別應用#循環(huán)遍歷訓練集中的每個人forclass_dirinos.listdir(train_dir):#如果train_dir/class_dir不是一個目錄,就繼續(xù)ifnotos.path.isdir(os.path.join(train_dir,class_dir)):continue#循環(huá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:#如果訓練圖像中沒有人(或人太多),請?zhí)^圖像
ifverbose:print("{}這張圖像不適合訓練:{}。".format(img_path,"因為它上面沒找到人臉"iflen(face_bounding_boxes)<1else"因為它不止一張人臉"))else:#將當前圖像的面部編碼添加到訓練集
X.append(face_recognition.face_encodings(image,known_face_locations=face_bounding_boxes)[0])y.append(class_dir)#確定KNN分類器中用于加權(quán)的近鄰
ifn_neighborsisNone:n_neighbors=int(round(math.sqrt(len(X))))#面部編碼長度開平方后四舍五入取整數(shù)
ifverbose:print("自動選擇n_neighbors:",n_neighbors)#創(chuàng)建并訓練KNN分類器
knn_clf=neighbors.KNeighborsClassifier(n_neighbors=n_neighbors,algorithm=knn_algo,weights='distance')knn_clf.fit(X,y)8.3.5人臉識別應用#保存訓練后的KNN分類器
ifmodel_save_pathisnotNone:withopen(model_save_path,'wb')asf:pickle.dump(knn_clf,f)returnknn_clfif__name__=="__main__":#訓練的KNN分類,并將其保存到磁盤
print("訓練KNN分類器...")classifier=train("Face_database",model_save_path="trained_knn_model.clf",n_neighbors=1)print("訓練完成!")5.人臉識別在face_predict下新建face-knn-predict.py文件,實現(xiàn)人臉識別。#攝像頭測試K近鄰分類器importosimportcv2importos.pathimportpickleimportface_recognitionALLOWED_EXTENSIONS={'png','jpg','jpeg'}defpredict(X_img,knn_clf=None,model_path=None,distance_threshold=0.6):8.3.5人臉識別應用"""
使用訓練后的KNN分類器識別給定圖像中的面部
paramX_img:要識別的圖像
paramknn_clf:(可選)一個KNN分類器對象。如果未指定,則必須指定model_save_pathparammodel_path:(可選)pickleKNN分類器的路徑。如果未指定,則model_save_path必須為knn_clfparamdistance_threshold:(可選)面部分類的距離閾值。它越大,機會就越大,就會將一個不知名的人誤分類為已知人員圖像中已識別面部的名稱和面部位置列表:[(名稱,邊界框),...]。對于未被識別人員的面孔,將返回“未知”的名稱
"""ifknn_clfisNoneandmodel_pathisNone:raiseException("必須提供KNN分類器knn_clf或model_path")
#加載訓練后的KNN模型(如果傳入了一個)
ifknn_clfisNone:withopen(model_path,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代簡約風格與科技公司辦公環(huán)境的融合
- 現(xiàn)代物流技術(shù)與醫(yī)療物資保障體系
- 溝通技巧在教育工作中的創(chuàng)新應用
- 環(huán)保技術(shù)在現(xiàn)代城市建設(shè)中的應用
- 物流信息技術(shù)在商業(yè)領(lǐng)域的應用
- Unit 3 Where did you go?PartB (說課稿)-2023-2024學年人教PEP版英語六年級下冊
- 2《燭之武退秦師》說課稿-2024-2025學年高一語文下學期同步說課稿(統(tǒng)編版必修下冊)
- 2024新教材高中地理 第四章 區(qū)域發(fā)展戰(zhàn)略 第二節(jié) 我國區(qū)域發(fā)展戰(zhàn)略說課稿 湘教版必修第二冊
- Unit3 Amazing animals(說課稿)-2024-2025學年人教PEP版(2024)英語三年級上冊001
- 2024年高中化學 第三章 晶體結(jié)構(gòu)與性質(zhì) 章末整合說課稿 新人教版選修3
- 2025-2030年中國清真食品行業(yè)運行狀況及投資發(fā)展前景預測報告
- 廣東省茂名市電白區(qū)2024-2025學年七年級上學期期末質(zhì)量監(jiān)測生物學試卷(含答案)
- 《教育強國建設(shè)規(guī)劃綱要(2024-2035年)》全文
- 山東省濱州市2024-2025學年高二上學期期末地理試題( 含答案)
- 2025年河南洛陽市孟津區(qū)引進研究生學歷人才50人歷年高頻重點提升(共500題)附帶答案詳解
- 2025年度軍人軍事秘密保護保密協(xié)議與信息安全風險評估合同3篇
- 蛋雞生產(chǎn)飼養(yǎng)養(yǎng)殖培訓課件
- 數(shù)字化轉(zhuǎn)型中的職業(yè)能力重構(gòu)
- 運用PDCA降低住院患者跌倒-墜床發(fā)生率
- 臨床提高膿毒性休克患者1h集束化措施落實率PDCA品管圈
- 小學生品德發(fā)展水平指標評價體系(小學)
評論
0/150
提交評論