日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

人脸识别之insightface开源代码使用:训练、验证、测试(4)

發布時間:2025/3/21 pytorch 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 人脸识别之insightface开源代码使用:训练、验证、测试(4) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通過前面的幾個小節,我們已經實現了模型的訓練以及閾值的選取。此時利用我們已經訓練好的模型和手上的閾值,我們已經能夠做到1:1這樣的驗證了。所要做的就是拿兩張圖片,相同人或者不同人,然后送入網絡中,網絡會提取出來兩個人的512維特征向量作為表征。然后計算兩個向量之間的歐氏距離,如果該歐氏距離大于閾值,則判定為不同人;如果小于閾值,那么判定為同一個人。

但是要做到人臉識別,我們還需要最后一步:構建人臉特征庫。

人臉特征庫怎么建

這部分內容在arcface源碼中并沒有提供,但是在FaceNet的開源代碼中(https://github.com/davidsandberg/facenet) ,在"contributed"文件夾中提供了一定的思路。


在real_time_face_recognition文件中,作者判定某人是不是在庫里的過程如下:
首先在60行生成一個人臉識別器,然后從camera讀入一個圖片,然后在72行進行識別。
所以源頭是face.Recognition()這個人臉識別器。通過查看face.py代碼,我們可以看到:


這里的Recognition類中,使用Detection()、Encoder()、Identifier()三個類分別實例化了人臉檢測器,編碼器和識別器。
在該文件中給出了上面三個函數的實現,人臉檢測器使用的是mtcnn進行人臉檢測,返回的是當前圖像中的人臉經過校準之后的bbox,編碼器中,是對bbox中框出的人臉進行前向推測,獲得了人臉的特征表示。然后將特征送入Identifier中:


可以看到,identifier類首先利用pickle.load()函數在初始化中導入了一個classifier_model,返回的是model和class_names,然后再進行類別的判定。所以這里的重點就是,這個classifier_model是個啥?
在該文件的第46行給出了:


這下明白了,這里面放的就是人臉特征。那么這個特征是怎么來的呢?答案在"export_embeddings.py"中。


在這個文件的說明部分,我們可以很明白的看出,該文件是要制作一個embeddings.npy,一個labels.npy和label_strings.npy文件。
具體在main函數總有這段代碼:


可以看到,其將輸入數據進行了提取特征的操作,然后將特征放入一個大的numpy中emb_array,并且也把label轉化為numpy(123行),然后將結果寫入.npy文件,也就是125-128行在做的事情。

建立人臉特征庫
依據這個思路,我們大致明白了,我們要做的一個人臉特征庫,就是兩個文件,分別是存儲特征的feature.npy和一個存儲label的label.npy。

要構建人臉特征庫,首先得有人臉圖片。
這里我們其實有兩種做法:

利用我們之前訓練的樣本,每個人取出其中的>10張圖像,這部分圖像要包含同一個人不同角度和姿態、光照下的照片,每張圖片生成一個特征向量,把這些特征向量都保存成庫中的特征。
同樣取>10張的照片,將這些照片計算完特征向量之后,進行平均,只保存最終的一個特征向量。
這兩種方法按理說都可以,方法一注重的各個特征之間的區分度,相當于建立一個完備的集合。方法二注重消除特征差異帶來的不一致,采用平均向量來表示。個人感覺前者會好點,畢竟沒有對后者進行試驗。

總而言之,我們現在需要對每個人取假設20張圖像,那么四個人一共80張。還和從前一樣,放到四個文件夾中,每個文件夾為一類。
然后就可以使用類似的方法,將每一類的每個人的人臉特征提取出來,保存為一個大的矩陣,作為一個人的特征,一共做四次,就生成了一個4 ×\times× 20 ×\times× 512 大小的numpy。4表示4個人,20表示每個人20個特征,512表示每個特征有512個維度。

代碼如下:


至此,我們就生成了人臉特征庫。

人臉識別
終于到了最后一步,進行1:N的人臉識別

這部分其實就比較簡單了,做法就是,首先加載我們的人臉庫,然后送入圖像,計算該圖像的特征,然后將特征與人臉庫中的特征進行歐氏距離的計算,如果這個距離在閾值范圍之內,則看其與哪個人的距離最近,然后選擇距離最近的那個人作為判定結果;如果距離大于閾值,則判定該人不再庫中,直接拒識就好了。

代碼如下:


實際使用的時候還是有點差異。我這里設置了閾值為1.15和15。1.15好理解,就是我們算出來的閾值,但是這個15是什么意思呢?
假設庫中的某個人有20個特征,那么如果輸入圖像計算出來的特征與這20個特征之中的15個距離小于閾值才能判定為該人。只有這兩個條件都滿足,才能判定為該庫中的人。因為實際中,我們不可能有所有人的臉,那么只有使用不同的限制條件來判定,才能在一定程度上保證準確率。開個玩笑,比如將張震岳扔進去,極有可能其與詹姆斯的閾值小于1.15,但是不可能與詹姆斯的15個以上的特征都相似。所以可以通過第二個條件判定,進行拒絕。
當然,如果你說假如確實出現都相似的情況了,那豈不是識別失敗了?對,就是失敗了。這只是一個demo,并不是一個解決方案 。關于人臉識別還有很多知識內容,需要投入很多精力去研究,此文僅僅是一個探索案例。

花了一段時間完成這幾篇博客,主要是對自己做的內容的一個總結,并且也為很多想入門的提供一個簡單的demo,詳細細節還需要深入研究探索。
?

總結

以上是生活随笔為你收集整理的人脸识别之insightface开源代码使用:训练、验证、测试(4)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。