成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

cnn卷積神經(jīng)網(wǎng)絡(luò)打造人臉登錄系統(tǒng)

KavenFan / 2543人閱讀

摘要:本文基于環(huán)境,采用為基礎(chǔ)來構(gòu)建實(shí)時(shí)人臉檢測與識別系統(tǒng),探索人臉識別系統(tǒng)在現(xiàn)實(shí)應(yīng)用中的難點(diǎn)。對于人臉檢測方法,效果好于的方法,但是檢測力度也難以達(dá)到現(xiàn)場應(yīng)用標(biāo)準(zhǔn)。本文中,我們采用了基于深度學(xué)習(xí)方法的人臉檢測系統(tǒng)。

git地址:https://github.com/chenlinzho...

本文主要介紹了系統(tǒng)涉及的人臉檢測與識別的詳細(xì)方法,該系統(tǒng)基于python2.7.10/opencv2/tensorflow1.7.0環(huán)境,實(shí)現(xiàn)了從攝像頭讀取視頻,檢測人臉,識別人臉的功能
由于模型文件過大,git無法上傳,整個(gè)項(xiàng)目放在百度云盤,地址:https://pan.baidu.com/s/1Taal...

人臉識別是計(jì)算機(jī)視覺研究領(lǐng)域的一個(gè)熱點(diǎn)。目前,在實(shí)驗(yàn)室環(huán)境下,許多人臉識別已經(jīng)趕上(超過)人工識別精度(準(zhǔn)確率:0.9427~0.9920),比如face++,DeepID3,F(xiàn)aceNet等(詳情可以參考:基于深度學(xué)習(xí)的人臉識別技術(shù)綜述)。但是,由于光線,角度,表情,年齡等多種因素,導(dǎo)致人臉識別技術(shù)無法在現(xiàn)實(shí)生活中廣泛應(yīng)用。本文基于python/opencv/tensorflow環(huán)境,采用FaceNet(LFW:0.9963 )為基礎(chǔ)來構(gòu)建實(shí)時(shí)人臉檢測與識別系統(tǒng),探索人臉識別系統(tǒng)在現(xiàn)實(shí)應(yīng)用中的難點(diǎn)。下文主要內(nèi)容如下 :

利用htm5 video標(biāo)簽打開攝像頭采集頭像并使用jquery.faceDeaction組件來粗略檢測人臉

將人臉圖像上傳到服務(wù)器,采用mtcnn檢測人臉

利用opencv的仿射變換對人臉進(jìn)行對齊,保存對齊后的人臉

采用預(yù)訓(xùn)練的facenet對檢測的人臉進(jìn)行embedding,embedding成512維度的特征;

對人臉embedding特征創(chuàng)建高效的annoy索引進(jìn)行人臉檢測

人臉采集

采用html5 video標(biāo)簽可以很方便的實(shí)現(xiàn)從攝像頭讀取視頻幀,下文代碼實(shí)現(xiàn)了從攝像頭讀取視頻幀,faceDection識別人臉后截取圖像上傳到服務(wù)器功能
在html文件中添加video,canvas標(biāo)簽

打開網(wǎng)絡(luò)攝像頭

var video = document.getElementById("video"),
var vendorUrl = window.URL || window.webkitURL;
//媒體對象
navigator.getMedia = navigator.getUserMedia || navagator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
navigator.getMedia({video: true, //使用攝像頭對象audio: false  //不適用音頻}, function(strem){
    video.src = vendorUrl.createObjectURL(strem);
    video.play();
});

利用jquery的facetDection組件檢測人臉

$("#canvas").faceDetection()

檢測出人連臉的話截圖,并把圖片轉(zhuǎn)換為base64的格式,方便上傳

context.drawImage(video, 0, 0, video.width, video.height);
var base64 = canvas.toDataURL("images/png");

將base64格式的圖片上傳到服務(wù)器

//上傳人臉圖片
function upload(base64) {
  $.ajax({
      "type":"POST",
      "url":"/upload.php",
      "data":{"img":base64},
      "dataType":"json",
      beforeSend:function(){},
      success:function(result){
          console.log(result)
          img_path = result.data.file_path
      }
  });
}

圖片服務(wù)器接受代碼,php語言實(shí)現(xiàn)

function base64_image_content($base64_image_content,$path){
    //匹配出圖片的格式
    if (preg_match("/^(data:s*image/(w+);base64,)/", $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/";
        if(!file_exists($new_file)){
            //檢查是否有該文件夾,如果沒有就創(chuàng)建,并給予最高權(quán)限
            mkdir($new_file, 0700,true);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], "", $base64_image_content)))){
            return $new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }
}
人臉檢測

人臉檢測方法有許多,比如opencv自帶的人臉Haar特征分類器和dlib人臉檢測方法等。
對于opencv的人臉檢測方法,有點(diǎn)是簡單,快速;存在的問題是人臉檢測效果不好。正面/垂直/光線較好的人臉,該方法可以檢測出來,而側(cè)面/歪斜/光線不好的人臉,無法檢測。因此,該方法不適合現(xiàn)場應(yīng)用。對于dlib人臉檢測方法 ,效果好于opencv的方法,但是檢測力度也難以達(dá)到現(xiàn)場應(yīng)用標(biāo)準(zhǔn)。
本文中,我們采用了基于深度學(xué)習(xí)方法的mtcnn人臉檢測系統(tǒng)(mtcnn:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks)。mtcnn人臉檢測方法對自然環(huán)境中光線,角度和人臉表情變化更具有魯棒性,人臉檢測效果更好;同時(shí),內(nèi)存消耗不大,可以實(shí)現(xiàn)實(shí)時(shí)人臉檢測。本文中采用mtcnn是基于python和tensorflow的實(shí)現(xiàn)(代碼來自于davidsandberg,caffe實(shí)現(xiàn)代碼參見:kpzhang93)

model= os.path.abspath(face_comm.get_conf("mtcnn","model"))
class Detect:
    def __init__(self):
        self.detector = MtcnnDetector(model_folder=model, ctx=mx.cpu(0), num_worker=4, accurate_landmark=False)
    def detect_face(self,image):
        img = cv2.imread(image)
        results =self.detector.detect_face(img)
        boxes=[]
        key_points = []
        if results is not None:  
            #box框
            boxes=results[0]
            #人臉5個(gè)關(guān)鍵點(diǎn)
            points = results[1]
            for i in results[0]:
                faceKeyPoint = []
                for p in points:
                    for i in range(5):
                        faceKeyPoint.append([p[i], p[i + 5]])
                key_points.append(faceKeyPoint)
        return {"boxes":boxes,"face_key_point":key_points}

具體代碼參考fcce_detect.py

人臉對齊

有時(shí)候我們截取的人臉了頭像可能是歪的,為了提升檢測的質(zhì)量,需要把人臉校正到同一個(gè)標(biāo)準(zhǔn)位置,這個(gè)位置是我們定義的,假設(shè)我們設(shè)定的標(biāo)準(zhǔn)檢測頭像是這樣的

假設(shè)眼睛,鼻子三個(gè)點(diǎn)的坐標(biāo)分別是a(10,30) b(20,30) c(15,45),具體設(shè)置可參看config.ini文件alignment塊配置項(xiàng)

采用opencv仿射變換進(jìn)行對齊,獲取仿射變換矩陣

dst_point=【a,b,c】
tranform = cv2.getAffineTransform(source_point, dst_point)

仿射變換:

img_new = cv2.warpAffine(img, tranform, imagesize)

具體代碼參考face_alignment.py文件

產(chǎn)生特征

對齊得到后的頭像,放入采用預(yù)訓(xùn)練的facenet對檢測的人臉進(jìn)行embedding,embedding成512維度的特征,以(id,vector)的形式保存在lmdb文件中

 facenet.load_model(facenet_model_checkpoint)
 images_placeholder = tf.get_default_graph().get_tensor_by_name("input:0")
 embeddings = tf.get_default_graph().get_tensor_by_name("embeddings:0")
 phase_train_placeholder = tf.get_default_graph().get_tensor_by_name("phase_train:0")

 face=self.dectection.find_faces(image)
 prewhiten_face = facenet.prewhiten(face.image)
 # Run forward pass to calculate embeddings
 feed_dict = {images_placeholder: [prewhiten_face], phase_train_placeholder: False}
 return self.sess.run(embeddings, feed_dict=feed_dict)[0]

具體代碼可參看face_encoder.py

人臉特征索引:

人臉識別的時(shí)候不能對每一個(gè)人臉都進(jìn)行比較,太慢了,相同的人得到的特征索引都是比較類似,可以采用KNN分類算法去識別,這里采用是更高效annoy算法對人臉特征創(chuàng)建索引,annoy索引算法的有個(gè)假設(shè)就是,每個(gè)人臉特征可以看做是在高維空間的一個(gè)點(diǎn),如果兩個(gè)很接近(相識),任何超平面
都無法把他們分開,也就是說如果空間的點(diǎn)很接近,用超平面去分隔,相似的點(diǎn)一定會(huì)分在同一個(gè)平面空間(具體參看:https://github.com/spotify/annoy)

#人臉特征先存儲(chǔ)在lmdb文件中格式(id,vector),所以這里從lmdb文件中加載
lmdb_file = self.lmdb_file
if os.path.isdir(lmdb_file):
    evn = lmdb.open(lmdb_file)
    wfp = evn.begin()
    annoy = AnnoyIndex(self.f)
    for key, value in wfp.cursor():
        key = int(key)
        value = face_comm.str_to_embed(value)
        annoy.add_item(key,value)

    annoy.build(self.num_trees)
    annoy.save(self.annoy_index_path)

具體代碼可參看face_annoy.py

人臉識別

經(jīng)過上面三個(gè)步驟后,得到人臉特征,在索引中查詢最近幾個(gè)點(diǎn)并就按歐式距離,如果距離小于0.6(更據(jù)實(shí)際情況設(shè)置的閾值)則認(rèn)為是同一個(gè)人,然后根據(jù)id在數(shù)據(jù)庫查找到對應(yīng)人的信息即可

#根據(jù)人臉特征找到相似的
def query_vector(self,face_vector):
    n=int(face_comm.get_conf("annoy","num_nn_nearst"))
    return self.annoy.get_nns_by_vector(face_vector,n,include_distances=True)

具體代碼可參看face_annoy.py

安裝部署

系統(tǒng)采用有兩個(gè)模塊組成:

face_web:提供用戶注冊登錄,人臉采集,php語言實(shí)現(xiàn)

face_server: 提供人臉檢測,裁剪,對齊,識別功能,python語言實(shí)現(xiàn)

模塊間采用socket方式通信通信格式為: length+content

face_server相關(guān)的配置在config.ini文件中

1.使用鏡像

face_serverdocker鏡像: shareclz/python2.7.10-face-image

face_web鏡像: skiychan/nginx-php7

假設(shè)項(xiàng)目路徑為/data1/face-login

2.安裝face_server容器

docker run -it --name=face_server --net=host  -v /data1:/data1  shareclz/python2.7.10-face-image /bin/bash
cd /data1/face-login
python face_server.py

3.安裝face_web容器

docker run -it --name=face_web --net=host  -v /data1:/data1  skiychan/nginx-php7 /bin/bash
cd /data1/face-login;
php -S 0.0.0.0:9988 -t ./web/ 

最終效果:

face_server加載mtcnn模型和facenet模型后等待人臉請求

未注冊識別失敗

人臉注冊

注冊后登錄成功

參考

https://zhuanlan.zhihu.com/p/...

https://github.com/spotify/annoy

https://blog.csdn.net/just_so...

https://blog.csdn.net/oTengYu...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42873.html

相關(guān)文章

  • cnn卷積神經(jīng)網(wǎng)絡(luò)打造人臉登錄系統(tǒng)

    摘要:本文基于環(huán)境,采用為基礎(chǔ)來構(gòu)建實(shí)時(shí)人臉檢測與識別系統(tǒng),探索人臉識別系統(tǒng)在現(xiàn)實(shí)應(yīng)用中的難點(diǎn)。對于人臉檢測方法,效果好于的方法,但是檢測力度也難以達(dá)到現(xiàn)場應(yīng)用標(biāo)準(zhǔn)。本文中,我們采用了基于深度學(xué)習(xí)方法的人臉檢測系統(tǒng)。 git地址:https://github.com/chenlinzho... 本文主要介紹了系統(tǒng)涉及的人臉檢測與識別的詳細(xì)方法,該系統(tǒng)基于python2.7.10/opencv...

    jackwang 評論0 收藏0
  • 極驗(yàn)驗(yàn)證:淺析深度學(xué)習(xí)模型與應(yīng)用

    摘要:一時(shí)之間,深度學(xué)習(xí)備受追捧。百度等等公司紛紛開始大量的投入深度學(xué)習(xí)的應(yīng)用研究。極驗(yàn)驗(yàn)證就是將深度學(xué)習(xí)應(yīng)用于網(wǎng)絡(luò)安全防御,通過深度學(xué)習(xí)建模學(xué)習(xí)人類與機(jī)器的行為特征,來區(qū)別人與機(jī)器,防止惡意程序?qū)W(wǎng)站進(jìn)行垃圾注冊,撞庫登錄等。 2006年Geoffery ?Hinton提出了深度學(xué)習(xí)(多層神經(jīng)網(wǎng)絡(luò)),并在2012年的ImageNet競賽中有非凡的表現(xiàn),以15.3%的Top-5錯(cuò)誤率奪魁,比利用傳...

    王巖威 評論0 收藏0
  • 比人眼更精準(zhǔn),詳解云識客雙目活體檢測技術(shù)

    摘要:雙活體,依然是前最可靠的防攻擊段之。詳解云識客活體檢測技術(shù)以下,我們分析一種多重人臉區(qū)域共享的深度學(xué)習(xí)算法。光流法輔助單目活體判斷最后,針對單目活體,云識客也采用光流法輔助活體判斷的校驗(yàn)機(jī)制。 以下這張照?,是真?實(shí)拍還是對著照?翻拍的? showImg(https://segmentfault.com/img/bVbuoHD); 如果告訴你,這張照?,是對著照?翻拍的照?,你會(huì)不會(huì)驚...

    whidy 評論0 收藏0
  • 從RCNN到SSD,這應(yīng)該是最全的一份目標(biāo)檢測算法盤點(diǎn)

    摘要:基于候選區(qū)域的目標(biāo)檢測器滑動(dòng)窗口檢測器自從獲得挑戰(zhàn)賽冠軍后,用進(jìn)行分類成為主流。一種用于目標(biāo)檢測的暴力方法是從左到右從上到下滑動(dòng)窗口,利用分類識別目標(biāo)。這些錨點(diǎn)是精心挑選的,因此它們是多樣的,且覆蓋具有不同比例和寬高比的現(xiàn)實(shí)目標(biāo)。 目標(biāo)檢測是很多計(jì)算機(jī)視覺任務(wù)的基礎(chǔ),不論我們需要實(shí)現(xiàn)圖像與文字的交互還是需要識別精細(xì)類別,它都提供了可靠的信息。本文對目標(biāo)檢測進(jìn)行了整體回顧,第一部分從RCNN...

    jayzou 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<