人脸识别之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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dlib模型人脸特征检测原理及demo
- 下一篇: Ubuntu18.04安装Dlib-19