




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Python程序設計
第十一章應用案例本章知識點導圖安裝deepfacefromdeepfaceimportDeepFacedeepface是一個Python輕量級人臉識別和人臉屬性分析(年齡、性別、情感和種族)的框架,提供非常簡單的接口就可以實現各種人臉識別算法的應用。安裝方式:pipinstalldeepface-i
/simple導入的庫名。
人臉特征識別
DeepFace這個庫總體而言識別效果還行,但是離工程應用還是有一定的距離。下面將從六個方面來看DeepFace這個庫。
1.人臉驗證DeepFace.verify()DeepFace.verify()可用于驗證兩幅圖像是否為同一個人,調用函數格式如下。verify(img1_path,img2_path=‘’,
model_name='VGG-Face’,
distance_metric='cosine’,
model=None,
enforce_detection=True,
detector_backend='opencv’,
align=True,
prog_bar=True,
normalization='base')參數說明:
model:構建deepface模型。每次調用verify函數都會重新建立人臉識別模型??梢赃x擇傳遞預構建的人臉識別模型。如DeepFace.build_model('VGG-Face')構建模型。enforce_detection:如果在圖像中檢測不到任何人臉,則驗證函數將返回異常。將此設置為False將不會出現此異常。detector_backend:人臉識別算法后端,可能需要retinaface,mtcnn,opencv,ssd,dlib支持。align:是否人臉對齊。prog_bar:啟用或禁用進度條。normalization:人臉歸一化的方式。img1_path:傳遞的圖像路徑、numpy數組(BGR)或based64編碼圖像。model_name:模型名,支持VGG-Face,Facenet,OpenFace,DeepFace,DeepID,Dlib,ArcFace,Ensemble等。distance_metric:度量標準,支持cosine,euclidean,euclidean_l2等。返回結果:如果img1_path輸入的是一張人臉圖片,則返回一個字典;如果輸入的是列表,則返回一個字典列表。返回具體參數如下:verified:是否同一個人。distance:人臉距離,越小越相似。max_threshold_to_verify:判斷為同一個人的閾值。model:所用模型。similarity_metric:相似性度量標準。detector_backend:表示用于檢測人臉的后端工具。threshold:表示在進行人臉驗證時使用的閾值。閾值通常用于確定兩張人臉圖像是否足夠相似以被認為是同一個人。
例如,輸入兩張照片,看看是不是同一個人:In[1]:fromdeepfaceimportDeepFacemodels_name=["VGG-Face","Facenet","Facenet512","OpenFace","DeepFace","DeepID","ArcFace","Dlib","SFace",'Ensemble']
result=DeepFace.verify(img1_path="d:/img/bb/bb1.png",img2_path="d:/img/gg/gg1.png",model_name=models_name[2])#這里選的是Facenet512模型#展示結果,判斷兩人是否為同一個人print(result)輸出結果如下:Out[1]:{'verified':False,'distance':0.5844550501834723,'threshold':0.3,'model':'Facenet512','detector_backend':'opencv','similarity_metric':'cosine','facial_areas':{'img1':{'x':75,'y':201,'w':611,'h':611},'img2':{'x':90,'y':180,'w':362,'h':362}},'time':7.19}注意:DeepFace庫對中文路徑比較敏感,容易報錯,最好使用全英文路徑。
2.人臉識別DeepFace.find()DeepFace.find()可用于從數據集中檢索與當前人臉相似的圖片。函數調用格式為:
find(img_path,db_path,
model_name='VGG-Face’,
distance_metric='cosine’,
model=None,
enforce_detection=True,
detector_backend='opencv’,
align=True,
prog_bar=True,
normalization='base’,
silent=False)其中的參數同verify()函數,多了人臉檢索庫路徑。db_path:檢索庫路徑。silent:是否靜默顯示數據。返回結果:
一個包含相似圖像的pandasdataframe數據框,包括圖像路徑和距離值,相似距離越小越相似。例如從文件夾ww中選出與給定的gg2.png相似的照片,圖片如下所示。
In[2]:result=DeepFace.find(img_path=r"d:\img\gg\gg2.png",db_path="d:/img/ww",model_name=models_name[2])print(result)
Findingrepresentations:100%|██████████|4/4[00:08<00:00,2.04s/it]Representationsstoredind:/img/ww/representations_facenet512.pklfile.Pleasedeletethisfilewhenyouaddnewidentitiesinyourdatabase.findfunctionlasts8.392402410507202seconds[identitysource_xsource_ysource_wsource_hFacenet512_cosine0d:/img/ww/gg.png401053023021.110223e-161d:/img/ww/2.png401053023021.452245e-01]結果給出顯示,從ww中挑出與gg2.png大概相似的有gg.png和2.png,相似距離值分別為1.110223e-16和1.452245e-01。其實這里gg2.png和gg.png是同一張,只是文件名不一樣,所以距離值較小。但是判斷gg2.png和2.png這兩張相似還是勉強的,畢竟根本不是同一個人。DeepFace.find()第一次執行會提取各個圖像的特征,并在ww文件夾中保存了一個pkl文件,以供下次直接調用,節省了比對的計算時間。3.人臉屬性分析DeepFace.analyze()DeepFace.analyze()函數用于分析圖片中人臉的面部屬性,包括年齡,性別,面部表情(包括憤怒、恐懼、正常、悲傷、厭惡、快樂和驚訝等),種族(包括亞洲人、白人、中東人、印度人、拉丁裔和黑人等)。函數調用格式如下:analyze(img_path,
actions=['emotion','age','gender','race'],
models=None,
enforce_detection=True,
detector_backend='opencv’,
prog_bar=True)其中參數同verify()函數,主要多了屬性設置actions。
actions:識別屬性,包括age,gender,emotion,race等。返回結果:如果img_path輸入一張人臉則返回一個字典,如果輸入列表則返回一個字典列表。返回具體參數如下:
region:人臉坐標,格式為:wywh。
age:年齡。
gender:性別。
dominant_emotion:主導情緒,也就是情緒識別結果。
emotion:各個情緒度量值,值越大表示越傾向。
dominant_race:種族結果。
race:各個種族度量值。例如判斷照片dd1.png的屬性。具體圖片見圖所示。
In[3]:result=DeepFace.analyze(img_path="d:/img/dd/dd1.png",actions=['emotion','emotion','age','gender','race'])
...:print(result)
age_model_weights.h5willbedownloaded...Downloading...From:/serengil/deepface_models/releases/download/v1.0/age_model_weights.h5To:C:\Users\yubg\.deepface\weights\age_model_weights.h5100%|██████████|539M/539M[01:07<00:00,7.99MB/s]gender_model_weights.h5willbedownloaded...Downloading...From:/serengil/deepface_models/releases/download/v1.0/gender_model_weights.h5To:C:\Users\yubg\.deepface\weights\gender_model_weights.h5100%|██████████|537M/537M[00:47<00:00,11.2MB/s]race_model_single_batch.h5willbedownloaded...Downloading...From:/serengil/deepface_models/releases/download/v1.0/race_model_single_batch.h5To:C:\Users\yubg\.deepface\weights\race_model_single_batch.h5100%|██████████|537M/537M[00:49<00:00,10.8MB/s]Action:race:100%|██████████|5/5[00:00<00:00,6.06it/s][{'emotion':{'angry':1.5361418093107204e-05,'disgust':7.33691604107474e-12,'fear':74.31256175041199,'happy':0.018923623429145664,'sad':0.005050586332799867,'surprise':1.607646460399792e-06,'neutral':25.66344439983368},'dominant_emotion':'fear','region':{'x':171,'y':343,'w':858,'h':858},'age':32,'gender':{'Woman':46.9680517911911,'Man':53.03194522857666},'dominant_gender':'Man','race':{'asian':81.37743473052979,'indian':1.923646591603756,'black':0.5071595311164856,'white':10.520566999912262,'middleeastern':1.126598846167326,'latinohispanic':4.544603079557419},'dominant_race':'asian'}]結果給出的比較詳細,甚至給出了各種情況的概率,給出的屬性除了年齡外基本上還是比較準確的,'dominant_emotion':'fear','age':32,'dominant_gender':'Man','dominant_race':'asian'。第一次運行該代碼時需要下載較大的表情、年齡、人種等數據,需要網速順暢,否則容易中斷。4.人臉檢測DeepFace.extract_faces()DeepFace.extract_faces()函數用于檢測人臉,如果圖像中有多個人臉只會返回其中的一個,調用函數格式為:
extract_faces(img_path,
target_size=(224,224),
detector_backend='opencv’,
enforce_detection=True,
align=False)參數同verify(),主要多了可以設置返回圖像尺寸的參數target_size,輸出返回一張RGB的numpy數組圖像。In[4]:fromPILimportImage,ImageDraw
...:importnumpyasnp...:result=DeepFace.extract_faces(img_path=r"d:\img\hy.png",#hy.png見圖11-3
...:detector_backend='opencv',
...:enforce_detection=True,
...:align=False)
...:print(result)
...:im=result[0]["face"]
...:im=Image.fromarray((im*255).astype(np.uint8))#轉換數據類型
...:im.show()[{'face':array([[[0.90588236,0.8980392,0.7372549],[0.9019608,0.89411765,0.7411765],[0.90588236,0.89411765,0.7921569],...,[0.7137255,0.5882353,0.53333336],[0.7019608,0.5803922,0.52156866],[0.70980394,0.58431375,0.5294118]],...,...,#此處由于數據篇幅較大,省略部分數據...,[0.6039216,0.4392157,0.30980393],[0.60784316,0.4392157,0.30980393],[0.6156863,0.44313726,0.31764707]]],dtype=float32),'facial_area':{'x':597,'y':186,'w':369,'h':369},'confidence':6.516651885875035}]合影時僅顯示其中的一張頭像,輸出結果見圖11-45.人臉特征提取DeepFace.represent()該函數用于將面部圖像表示為特征向量,函數調用格式為:represent(img_path,
model_name='VGG-Face’,
model=None,
enforce_detection=True,
detector_backend='opencv’,
align=True,
normalization='base')其中的參數同verify()。輸出返回圖像特征多維向量,特征向量的維度根據模型而變化。In[5]:result=DeepFace.represent(img_path="d:/img/hy.png",model_name=models_name[2])
...:print("特征維度為:{}".format(len(result)))特征維度為:13網絡爬蟲(獲取NCBI文章)
獲取NCBI主頁()上soybean相關文獻的PMID號,并將這些PMID號和所對應的文章標題做成二元元組存儲在列表中。
抓取網頁為了完成將PMID號和所對應的文章標題做成二元元組存儲在列表中,需要分兩步完成:獲取網頁內容提取所需要的內容(標題和PMID號)這里分別寫了兩個函數get_html_text()和title_pmid()來實現上面兩步操作。第一個函數get_html_text(url),爬取NCBI主頁上soybean相關的文獻,其網址為/pubmed/?term=soybean,將獲取到的頁面內容全部原封不動地保存在當前路徑下的data_html.txt文件中,同時輸出整個網頁文本內容在屏幕上。為了防止頻繁抓取網頁時被封IP(反爬蟲),需要在函數體內加一個header參數來偽裝瀏覽器。
第二個函數title_pmid(htmltext)的參數是第一個函數get_html_text(url)獲取到的全部網頁原內容htmltext,其功能就是從htmltext中獲取文章標題和對應的PMID號.importrequests,re
#抓取網頁defget_html_text(url='/pubmed/?term=soybean'):'''
從給定的url中獲取其網頁內容并保存在data_html.txt中
輸出為獲取的網頁內容htmltext文本'''header={'User-Agent':'Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:46.0)Gecko/20100101Firefox/46.0','Content-Type':'application/x-www-form-urlencoded','Connection':'Keep-Alive','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'}#header目的是為了防止被封IP#url='/pubmed/?term=soybean'try:r=requests.get(url,timeout=30,headers=header)#如果狀態不是200,引發HTTPError異常r.raise_for_status()r.encoding=r.apparent_encoding#與encoding的區別說明在文后r.encoding="utf-8"#保存獲取到的頁面內容f0=open('data_html.txt','w',encoding='utf-8')#打開并自動創建txt文件f0.write(r.text)f0.close()returnr.textexcept:return"產生異常"
htmltext=get_html_text('/pubmed/?term=soybean')
將獲取到的內容保存在data_html.txt文件中,其中就包含有所需要的PMID號和所對應的文章標題,如圖所示。
r=requests.get()獲取內容后,r.encoding表示從httpheader中提取響應內容編碼,而r.apparent_encoding表示從內容中分析出的響應內容編碼。encoding是從http中的header中的charset字段中提取的編碼方式,若header中沒有charset字段則默認為ISO-8859-1編碼模式,則無法解析中文,會出現亂碼。apparent_encoding會從網頁的內容中分析網頁編碼的方式,所以apparent_encoding比encoding更加準確。當網頁出現亂碼時可以把apparent_encoding的編碼格式賦值給encoding。如果網頁編碼方式是ISO-8895-1,那么用r.text查看的是亂碼。r.encoding只是分析網頁的頭部,猜測編碼方式,而r.apparent_encoding則是實實在在根據網頁內容分析編碼方式。所以,在爬蟲程序中,經常使用r.encoding=r.apparent_encoding,來直接獲取網頁的編碼。提取標題與PMID號
所需要的PMID號和文章的標題均已包含在data_html.txt中。如何能夠找到所需要的這兩個內容,這就需要從原網頁中去發現。利用瀏覽器上的“開發人員工具”模式,對網頁進行跟蹤查找,如圖,網頁中的A、B區域分別對應著代碼區的A’和B’,從中可以找到對應的title和PMID號。通過對比發現它們都在“<aclass="docsum-title"href=”代碼行中,所以需要將所有以“<aclass="docsum-title"href=”開頭的代碼行全部提取出來,這需要使用到正則表達式來提取.deftitle_pmid(htmltext):'''
從獲取的htmltext中獲取PMID號和對應的文章標題
輸出為列表,一個元素為一條記錄'''#正則表達式找出需要的部分。#通過查看,需要的數據是以“class="docsum-title"”開頭,以“</a>”結尾pattern='class="docsum-title"(.*?)</a>'data1=re.findall(pattern,htmltext,re.S)#找到返回的是listprint(len(data1))print(data1)
#提取標題和PMIDdata_title_pmid=[]#接收標題和PMID號構成的元組對pat_1='href="/(.*?)/"\n'#匹配PMID號pat_2='>\n\n(.*?).\n\n'#匹配標題foriindata1:pmid=re.findall(pat_1,i)title_=re.findall(pat_2,i)print(title_)title=re.sub('<b>Soybean</b>|<b>soybean</b>',"Soybean",title_[0])#剔除掉<b>和</b>data_title_pmid.append((title,pmid[0]))#將處理好的標題和PMID元組對做成的列表保存在data_content.txt文件中f1=open('data_content.txt','w',encoding='utf-8')f1.write(str(data_title_pmid))f1.close()returndata_title_pmid
title_pmid(htmltext)上面的代碼通過正則表達式提取了PMID和標題,并且將處理好的標題和PMID元組對做成列表保存在data_content.txt文件中。
說明:若想獲取有翻頁的網頁所有內容,我們就要打開第二頁,查看第二頁的網址,如本例網站中的第二頁網址為/?term=soybean&page=2,第三頁網址為/?term=soybean&page=3,通過對比發現如下規律:第一頁:/?term=soybean第二頁:/?term=soybean&page=2第三頁:/?term=soybean&page=3……其實第一頁也可以改為:/?term=soybean&page=1所以對于有翻頁的網址其實變化的就是網址最后的數字,所以可以用for循環來提取每一頁的內容即可。查找基因序列目標是將桌面上的fna文件讀取其內容做成字典,字典鍵名為序列的名稱,鍵值為序列。fna文件可以用記事本打開,其內容如圖所示。文本內容包含了較多的基因序列,現在就將他們全部做成基因序列字典,便于查詢和使用。實現代碼如下:In[1]:defread_gen(path):
...:'''
...:讀取基因文件,含完整的路徑
...:讀取的是fna格式的文本文件
...:輸出的是已經讀取的基因名稱和編碼構成的字典
...:'''
...:
...:#讀取文件:完整的文件名和路徑
...:a_a=open(path)
...:originaltext=a_a.read()
...:a_a.close()
...:
...:#將原始文件中的基因序列進行切割做成字典
...:c=originaltext.split('>')
...:print('本次共讀取了',len(c),'個基因序列。',"已經做成了字典變量diction")
...:c.remove('')
...:
...:diction={}
...:foriinc:
...:k=i.split('\n')
...:if''ink:
...:k.remove('')
...:content=''.join(k[1:])
...:name=k[0]
...:dic={name:content}
...:diction.update(dic)
...:returndictionIn[2]:path=r'c:\Users\yubg\Desktop\GCF_000321185.1_ASM32118v1_genomic.fna'...:diction=read_gen(path)
本次共讀取了121個基因序列。已經做成了字典變量diction
In[3]:dictionOut[3]:{'NZ_CAPG01000120.1Bacillussp.AP8,wholegenomeshotgunsequence':'TAACATAAGAAAAAGACGACCTTTCAAAATGAAGAATCGCCCCCTAATAGTTTAAGTCTATGTATTCATAAACTATATCTTCTTATGCAACAATAGCAGTTATCCAAAAACAAAGCGCTGTAAGTATAGCCATAGGTGTCATCACCCACTTTTCCTTTCTACTATTAGAAAAGCCATTCATAATCGCATTGAGTGTGAGGTATGACGCAAATAAAAAACAAATTCCTCTTGTAGTGCCAATTGAGAATAAATTAGGAATTACCTTGGCAGTCTGCAATATTATTATGATGGCAAATAGCTGAATAAATACAGAAAAGCCACAAGCAACTCTCATTCTTATAGGCATTACGTTGTACTTACCACCCATAGCGAATTCTCCATAGGGGAAACCTAAAGCAAGTAAAGTATATAAGATCGCAACTAATAAAAATGAGACACTTCCAATTAACGCTATTATCATCTAACTATCCCCCTACAAAGTAATATGGTATCTCTATCTACATTTAATTATCTTCTCTCTTTATTCTTATTGCACCTAGTATTCGTTCATTACAAATAAATCCGTCTTGCACTAAACT','NZ_CAPG01000119.1Bacillussp.AP8,wholegenomeshotgunsequence':'ATGTCTCTTTGTTTACTTTATCAGCCTTTCCAACCTCTAAAGAAGTTTTGGAAGCTGGTGTAGAGACCCTATCTATGAAGATTAACGAACTATGTAAGAGCCGATCTGAGAAATGGGCCCGTGATCAAGCAGCTAAGCTAATGAAAGCAGCTCATCAAAATCCATTTCAGCAGACCTTATACCATAGTCACCTGATTAGTTTAGAGATGCTTATTAACATTCTTCTTGAATACAAAAAGCATCTATCCAAACTGGAAGAAGAGATAGATGCCTTAGCGAAAAATATAGAAGAATATAAGATTATCCAATCCATTCCTGGTA…由于篇幅較長,此處僅展示前兩個基因序列。為了方便查找,可按照名稱找出基因組序列編碼,編寫gen_name_search(diction,name)函數代碼如下。In[4]:defgen_name_search(diction,name):
...:'''
...:給出序列名稱搜索序列編碼
...:'''
...:keys=diction.keys()
...:
...:foriinkeys:
...:ifnameini:
...:print(i,":",diction[i])
...:returndiction[i]In[5]:st=gen_name_search(diction,"NZ_CAPG01000107.1")NZ_CAPG01000107.1Bacillussp.AP8,wholegenomeshotgunsequence:TGGTATGTCAACACTAAACTGGACAAAAATTATAAGGTCTGTTGCTTGAATTCCACAGGTGTTAAATAGCCCAGTGTTCCGTGAATTCGAATATTGTTGAACCAATGAACATAATCATCAAGTTCAAGAGCGAGCTGTTCAAGTGAAGAGAAGTGCGCTCCGTTAGCGAATTCTGTTTTAAATACCTTAAATGTCGCTTCAGCCACGGCATTATCATAAGGGCATCCTTTCATGCTCAGTGATCGCTGGATACCAAATGCTTCAAGAGCCTCTGAAATTAGTTTATTATCAAACTCTTTTCCTCGGTCTGTATGAAACATTTTGACATTATTTAAATTCGCCTGGATGCTCGCAATCGCTTGATACACAAGCTCTGCCGTTTTGTTTACGCCTGTACTATGACCGATGATTTCACGATTGAAAAGGTCGACAAATAGGCATACATAGTGCCATTTTTTTCCGACACGGACGTATGTTAAATCGCTTACAATAACCGCTAATTGTTCATCCTGCTTGAATTGACGCTGTAGTTCATTTTTTACTGGCGCTTCGTTACAACTGGATTTATGTGGCTTAAATTGAGCCACCGTATAGTTTGACAC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CANA 001-2020電子商務數權評價標準
- 在線刷java面試題及答案
- 丹陽小學面試題及答案
- 創新求變面試題及答案
- 印章使用借用管理制度
- T/CAEPI 31-2021旋轉式沸石吸附濃縮裝置技術要求
- 《春天來了》教學設計
- 木材機械出售轉讓協議書
- 大型公司資產轉讓協議書
- 拎包入住合同解除協議書
- 2024年中石油招聘考試真題
- 企業環保與健康安全管理體系的構建與實施
- 《抽水蓄能電站樞紐布置格局比選專題報告編制規程 》征求意見稿
- 廣東省深圳市2025年高三年級第二次調研考試數學試題(含答案)
- 山東省山東名??荚嚶撁?025年高三4月高考模擬考試物理試卷+答案
- 供應商維保管理制度
- 行政事業單位內部控制信息系統建設實施方案
- 山東棗莊科技職業學院棗莊工程技師學院招聘考試真題2024
- 小學網球教學教案網球
- 露天礦安全警示教育
- 制造業質量控制計劃
評論
0/150
提交評論