Heim > Backend-Entwicklung > PHP-Tutorial > Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

藏色散人
Freigeben: 2023-04-04 16:46:02
Original
8128 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich die detaillierten Methoden zur Gesichtserkennung und -erkennung des Systems vorgestellt. Das System basiert auf der Umgebung python2.7.10/opencv2/tensorflow1.7.0 und implementiert die Funktionen zum Lesen von Videos von der Kamera und zum Erkennen von Gesichtern. und Erkennung von Gesichtern, d. h. Implementierung eines Gesichtserkennungs-Anmeldesystems basierend auf mtcnn/facenet/tensorflow.

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

Da die Modelldatei zu groß ist, kann Git sie nicht hochladen. Der gesamte Quellcode des Projekts wird auf Baidu Cloud Disk abgelegt

Adresse: https://pan.baidu.com/s/1TaalpwQwPTqlCIfXInS_LA

Gesichtserkennung ist ein Hotspot im Bereich der Computer-Vision-Forschung. Derzeit haben in Laborumgebungen viele Gesichtserkennungen die Genauigkeit der manuellen Erkennung eingeholt (übertroffen) (Genauigkeitsrate: 0,9427 ~ 0,9920), wie z. B. face++, DeepID3, FaceNet usw. (Einzelheiten finden Sie unter: Gesicht Erkennungstechnologie basierend auf Deep-Learning-Review).

Aufgrund verschiedener Faktoren wie Licht, Winkel, Gesichtsausdruck, Alter usw. kann die Gesichtserkennungstechnologie jedoch im wirklichen Leben nicht weit verbreitet eingesetzt werden. Dieser Artikel basiert auf der Python/OpenCV/Tensorflow-Umgebung und verwendet FaceNet (LFW: 0,9963), um ein Echtzeit-Gesichtserkennungs- und -erkennungssystem zu erstellen und die Schwierigkeiten von Gesichtserkennungssystemen in realen Anwendungen zu untersuchen.

Der Hauptinhalt unten lautet wie folgt:

1. Öffnen Sie die Kamera mit dem Video-Tag htm5, um Avatare zu sammeln, und verwenden Sie die Komponente jquery.faceDeaction zur groben Erkennung Gesichter

2. Laden Sie das Gesichtsbild auf den Server hoch, verwenden Sie mtcnn, um das Gesicht zu erkennen

3. Verwenden Sie die affine Transformation von opencv, um das Gesicht auszurichten, und speichern Sie das ausgerichtete Gesicht

4. Verwenden Sie das vorab trainierte Facenet, das die erkannten Gesichter in 512-dimensionale Merkmale einbettet

5 >Gesichtssammlung

Mit dem HTML5-Video-Tag ist es sehr praktisch, Videobilder von der Kamera zu lesen. Der folgende Code implementiert das Lesen der Videobilder von der Kamera, nachdem faceDection das Gesicht erkennt Erfassen Sie Bilder und laden Sie sie auf den Server hoch. Fügen Sie das Video zur HTML-Datei hinzu.

<div class="booth">
    <video id="video" width="400" height="300" muted class="abs" ></video>
    <canvas id="canvas" width="400" height="300"></canvas>
  </div>
Nach dem Login kopieren
Öffnen Sie die Webcam.

var video = document.getElementById(&#39;video&#39;),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();
});
Nach dem Login kopieren

Personen Wenn Sie ein Gesicht haben, machen Sie einen Screenshot und konvertieren Sie das Bild zum einfachen Hochladen in das Base64-Format

$(&#39;#canvas&#39;).faceDetection()
Nach dem Login kopieren

Laden Sie das Bild im Base64-Format auf den Server hoch

context.drawImage(video, 0, 0, video.width, video.height);
var base64 = canvas.toDataURL(&#39;images/png&#39;);
Nach dem Login kopieren

Der Bildserver akzeptiert den Code und implementiert es in der PHP-Sprache

//上传人脸图片
function upload(base64) {
  $.ajax({
      "type":"POST",
      "url":"/upload.php",
      "data":{&#39;img&#39;:base64},
      &#39;dataType&#39;:&#39;json&#39;,
      beforeSend:function(){},
      success:function(result){
          console.log(result)
          img_path = result.data.file_path
      }
  });
}
Nach dem Login kopieren

Gesichtserkennung

Es gibt viele Gesichtserkennungsmethoden, wie z. B. den Face-Haar-Feature-Classifier und die dlib-Gesichtserkennung Methode, die mit opencv geliefert wird. Die Gesichtserkennungsmethode von opencv ist einfach und schnell. Das Problem besteht darin, dass der Gesichtserkennungseffekt nicht gut ist. Mit dieser Methode können Gesichter erkannt werden, die frontal/vertikal/mit guter Beleuchtung stehen, während Gesichter, die seitwärts/schief/mit schlechter Beleuchtung stehen, nicht erkannt werden können. Daher ist diese Methode nicht für den Feldeinsatz geeignet. Bei der dlib-Gesichtserkennungsmethode ist der Effekt besser als bei der opencv-Methode, aber die Erkennungsstärke ist auch schwierig, die Standards für Feldanwendungen zu erfüllen. In diesem Artikel verwenden wir das mtcnn-Gesichtserkennungssystem (mtcnn: Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Neural Networks) basierend auf Deep-Learning-Methoden.

Die mtcnn-Gesichtserkennungsmethode ist robuster gegenüber Änderungen des Lichts, des Winkels und des Gesichtsausdrucks in der natürlichen Umgebung, und der Gesichtserkennungseffekt ist gleichzeitig besser, der Speicherverbrauch ist nicht groß und real -Zeit-Gesichtserkennung kann erreicht werden.

Der in diesem Artikel verwendete mtcnn basiert auf der Implementierung von Python und Tensorflow (der Code stammt von Davidsandberg und der Caffe-Implementierungscode finden Sie unter: kpzhang93)

function base64_image_content($base64_image_content,$path){
    //匹配出图片的格式
    if (preg_match(&#39;/^(data:\s*image\/(\w+);base64,)/&#39;, $base64_image_content, $result)){
        $type = $result[2];
        $new_file = $path."/";
        if(!file_exists($new_file)){
            //检查是否有该文件夹,如果没有就创建,并给予最高权限
            mkdir($new_file, 0700,true);
        }
        $new_file = $new_file.time().".{$type}";
        if (file_put_contents($new_file, base64_decode(str_replace($result[1], &#39;&#39;, $base64_image_content)))){
            return $new_file;
        }else{
            return false;
        }
    }else{
        return false;
    }
}
Nach dem Login kopieren

Für spezifischen Code , siehe fcce_detect.py

Gesichtsausrichtung

Manchmal können die von uns erfassten Gesichter und Avatare schief sein, um die Qualität zu verbessern Für die Erkennung müssen wir die Gesichter auf die gleiche Standardposition korrigieren. Diese Position wird von uns definiert. Gehen Sie davon aus, dass der von uns festgelegte Standarderkennungsavatar wie folgt aussieht: Stellen Sie sicher, dass die Koordinaten der drei Punkte von Augen und Nase a (10,30) b (20,30) c (15,45) sind. Spezifische Einstellungen finden Sie im Konfigurationselement des Ausrichtungsblocks in der Datei config.ini Verwenden Sie die affine Transformation von opencv, um die affine Transformationsmatrix auszurichten und zu erhalten

model= os.path.abspath(face_comm.get_conf(&#39;mtcnn&#39;,&#39;model&#39;))
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个关键点
            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}
Nach dem Login kopieren
Affine Transformation:

dst_point=【a,b,c】
tranform = cv2.getAffineTransform(source_point, dst_point)
Nach dem Login kopieren

Spezifischen Code finden Sie in der Datei face_alignment.py

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

Features generieren

Nach der Ausrichtung wird der Avatar in das vorab trainierte Facenet eingefügt, um das erkannte Gesicht einzubetten, es in 512-dimensionale Features einzubetten und es zu speichern die LMDB-Datei in der Form (id, vector)

img_new = cv2.warpAffine(img, tranform, imagesize)
Nach dem Login kopieren

Den spezifischen Code finden Sie unter face_encoder py

Gesichtsmerkmalsindex:

人脸识别的时候不能对每一个人脸都进行比较,太慢了,相同的人得到的特征索引都是比较类似,可以采用KNN分类算法去识别,这里采用是更高效annoy算法对人脸特征创建索引,annoy索引算法的有个假设就是,每个人脸特征可以看做是在高维空间的一个点,如果两个很接近(相识),任何超平面 都无法把他们分开,也就是说如果空间的点很接近,用超平面去分隔,相似的点一定会分在同一个平面空间(具体参看:https://github.com/spotify/annoy)

#人脸特征先存储在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)
Nach dem Login kopieren

具体代码可参看face_annoy.py

人脸识别

经过上面三个步骤后,得到人脸特征,在索引中查询最近几个点并就按欧式距离,如果距离小于0.6(更据实际情况设置的阈值)则认为是同一个人,然后根据id在数据库查找到对应人的信息即可

#根据人脸特征找到相似的
def query_vector(self,face_vector):
    n=int(face_comm.get_conf(&#39;annoy&#39;,&#39;num_nn_nearst&#39;))
    return self.annoy.get_nns_by_vector(face_vector,n,include_distances=True)
Nach dem Login kopieren

具体代码可参看face_annoy.py

安装部署

系统采用有两个模块组成:

  • face_web:提供用户注册登录,人脸采集,php语言实现

  • face_server: 提供人脸检测,裁剪,对齐,识别功能,python语言实现

模块间采用socket方式通信通信格式为: length+content

face_server相关的配置在config.ini文件中

1.使用镜像

  • face_serverdocker镜像: shareclz/python2.7.10-face-image

  • face_web镜像: skiychan/nginx-php7

假设项目路径为/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
Nach dem Login kopieren

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/
Nach dem Login kopieren

最终效果:

face_server加载mtcnn模型和facenet模型后等待人脸请求 

5 (1).png

未注册识别失败 

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

人脸注册 

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

注册后登录成功 

Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet

感谢PHP中文网热心网友的投稿,其GitHub地址为:https://github.com/chenlinzhong/face-login

Das obige ist der detaillierte Inhalt vonImplementierung eines Face-Login-Systems basierend auf mtcnn und facenet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage