人臉識別 檢索專案記錄

2021-10-02 22:55:49 字數 4280 閱讀 8848

趁空閒時間,記錄一下做過的乙個實驗室專案,主要分為4個部分:1)語音轉文字;2)人臉識別;3)行人識別;4)檢索。本人負責人臉識別和檢索模組及整體專案的融合,在此介紹一下自己所做的兩個模組。

使用faiss索引庫構對提取到的人臉特徵加入索引構建特徵資料庫

使用flask框架實現前後端的互動傳輸

1. 人臉識別演算法

專案中嘗試了opencv、dlib、mtcnn+facenet的演算法,最後選定了mtcnn+facenet演算法,優勢是在小臉和側臉方面檢測更優。

mtcnn【輸入:幀;輸出:檢測到的人臉框、置信分數、5個關鍵點位置】

facenet【輸入:160x160大小的人臉(按mtcnn檢測到的人臉框裁剪,根據關鍵點進行人臉對齊,再resize成160x160大小);

輸出:人臉特徵(128維)】

1.1 mtcnn演算法

參考:mtcnn詳解

mtcnn網路主要分為4個階段:影象金字塔、pnet、rnet、onet

影象金字塔:

輸入一張,將resize到500,然後按照factor = 0.709依次縮小裁剪至大小為12,將所有儲存

pnet:

針對每一張,依次輸入pnet,輸出很多個粗略的候選框(每個框有位置資訊還有置信分數),將每個的候選框合併,然後進行nms演算法,得到一些粗略的proposal

rnet:

將pnet得到的proposal裁剪並resize成24x24大小,輸入rnet,然後進行nms,得到較準確的rois(位置和分數)【rnet的nms閾值設定為0.3,只剩下少了的rois了】

onet:

將rnet得到的較準rois裁剪並resize成48x48大小,輸入onet,然後進行nms,得到最終的rois,即rectangles。

【len(rectangles) 的個數為檢測到的人臉數,len(rectangles[0])為15,4:框的位置座標,1:置信分數,10:5個關鍵點的座標】

1.2 facenet演算法

根據mtcnn的輸出結果,在原上進行裁剪人臉,並進行人臉對齊矯正,隨後使用facenet演算法的backbone對裁剪後的人臉進行特徵提取(128維),其網路模型就是inceptionresnetv1,比較容易,這裡就不詳細講了

facenet的triple loss:facenet介紹

【注,常見的對齊方法:通過雙眼座標進行旋正、通過矩陣運算求解仿射矩陣進行旋正】

2. faiss

使用faiss索引庫對提取到的人臉特徵加入索引構建資料庫

**實現(faiss快速入門)

def

index_build

(self, indexfilename)

:"""

將特徵構建索引庫

:param indedxfilename: 索引所儲存的位置

:return:

"""if self.featuretype ==

"face"

: d =

128if self.featuretype ==

"person"

: d =

256file

=open

(self.featurepath)

json_data = json.load(

file

) features =

if d ==

128:

# 表示讀入的為人臉特徵

for i in

range

(len

(json_data)):

['feature'])

index = faiss.indexflatl2(d)

if d ==

256:

# 表示讀入的為行人特徵,儲存格式與人臉不同,遂用兩段**分別處理

for person in json_data[0]

.keys():

0][person]

['feature'])

index = faiss.indexflatip(d)

features = np.asarray(features)

.astype(np.float32)

index.add(features)

faiss.write_index(index, indexfilename)

faiss構建資料庫的優點(參考)

3. flask

使用flask進行前後端的互動功能

**實現(入門教程很多,就不貼了…)

#伺服器端

"""傳輸模組

"""'/register'

, methods=

['post'])

defregister()

: all_video_inf =

res = json.loads(request.data)if(

'key words'

in res.keys())

and(res[

'key words']!=

''):print

('輸入關鍵字成功'

) wordinformation = information(

"word"

, res[

'key words'])

video_time_words = wordinformation.word_search(

)#檢索關鍵字

'result'])

if('face'

in res.keys())

and(res[

'face']!=

''):print

('輸入人臉成功'

) faceinformation = information(

"face"

, res[

'face'])

video_time_face = faceinformation.face_search_in_many_videos(facefeature2indexpath, facefeature2timelistpath)

#檢索人臉

'result'])

if('person'

in res.keys())

and(res[

'person']!=

''):print

('輸入人體成功'

) personinformation = information(

"person"

, res[

'person'])

video_time_person = personinformation.person_search_in_many_videos(personfeature2indexpath, personfeature2timelistpath)

#檢索行人

'result'])

else

:return

str(

'status:error'

)#合併重複的檢索結果

alloftime = time(all_video_inf)

result = alloftime.merge(

)return

str(result)

#客戶端

import requests

import cv2

import json

import numpy as np

#輸入查詢資料(文字、人臉、行人)

# requests傳送資料給伺服器端並接收返回資料

response = requests.post(

"", data=json.dumps(inquire_data)

)output =

eval

(response.text)

print

(output)

另,有對這個專案感興趣的或者想要**的小夥伴可以留下郵箱~

人臉識別 人臉庫

1.mit 影象集 美國,麻省理工學院 包括 16 人,每個人有不同光照 不同尺寸 不同角度的 27 張 2.feret 影象集 美 方 此影象集包含大量的人臉影象,並且每幅圖中均只有乙個人臉。該集中,同乙個人的 有不同表情,光照,姿態和年齡的變化。3.umist 影象集 英國,曼切斯特大學 20 ...

人臉識別之人臉檢測

人臉識別分為人臉檢測 人臉預處理 蒐集和學習人臉以及人臉識別四個部分,此部分將人臉檢測。本文基於opencv進行的。在opencv中常用的人臉檢測器有基於lbp的特徵檢測 基於haar的特徵檢測,兩者的區別 前者比後者快好幾倍且不需要許可協議,但很多haar檢測器需要許可協議。基於haar的臉部檢測...

人臉識別API 人臉比對

api協議說明 路徑 輸入引數 字段型別 描述seq可選 string 會話序號 非必填 imga string 資料 base64編碼 原始建議小於3m,格式限定為jpg bmp png三種格式 imgb string 資料 base64編碼 原始建議小於3m,格式限定為jpg bmp png三種...