趁空閒時間,記錄一下做過的乙個實驗室專案,主要分為4個部分:1)語音轉文字;2)人臉識別;3)行人識別;4)檢索。本人負責人臉識別和檢索模組及整體專案的融合,在此介紹一下自己所做的兩個模組。
使用faiss索引庫構對提取到的人臉特徵加入索引構建特徵資料庫
使用flask框架實現前後端的互動傳輸
1. 人臉識別演算法
專案中嘗試了opencv、dlib、mtcnn+facenet的演算法,最後選定了mtcnn+facenet演算法,優勢是在小臉和側臉方面檢測更優。
mtcnn【輸入:幀;輸出:檢測到的人臉框、置信分數、5個關鍵點位置】1.1 mtcnn演算法facenet【輸入:160x160大小的人臉(按mtcnn檢測到的人臉框裁剪,根據關鍵點進行人臉對齊,再resize成160x160大小);
輸出:人臉特徵(128維)】
參考:mtcnn詳解
mtcnn網路主要分為4個階段:影象金字塔、pnet、rnet、onet
影象金字塔:
輸入一張,將resize到500,然後按照factor = 0.709依次縮小裁剪至大小為12,將所有儲存pnet:
針對每一張,依次輸入pnet,輸出很多個粗略的候選框(每個框有位置資訊還有置信分數),將每個的候選框合併,然後進行nms演算法,得到一些粗略的proposalrnet:
將pnet得到的proposal裁剪並resize成24x24大小,輸入rnet,然後進行nms,得到較準確的rois(位置和分數)【rnet的nms閾值設定為0.3,只剩下少了的rois了】onet:
將rnet得到的較準rois裁剪並resize成48x48大小,輸入onet,然後進行nms,得到最終的rois,即rectangles。1.2 facenet演算法【len(rectangles) 的個數為檢測到的人臉數,len(rectangles[0])為15,4:框的位置座標,1:置信分數,10:5個關鍵點的座標】
根據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三種...