Heim >Backend-Entwicklung >PHP-Tutorial >Implementierung eines Face-Login-Systems basierend auf mtcnn und facenet
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.
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>
Öffnen Sie die Webcam.
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(); });
Personen Wenn Sie ein Gesicht haben, machen Sie einen Screenshot und konvertieren Sie das Bild zum einfachen Hochladen in das Base64-Format
$('#canvas').faceDetection()
Laden Sie das Bild im Base64-Format auf den Server hoch
context.drawImage(video, 0, 0, video.width, video.height); var base64 = canvas.toDataURL('images/png');
Der Bildserver akzeptiert den Code und implementiert es in der PHP-Sprache
//上传人脸图片 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 } }); }
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('/^(data:\s*image\/(\w+);base64,)/', $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], '', $base64_image_content)))){ return $new_file; }else{ return false; } }else{ return false; } }
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('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个关键点
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}
Affine Transformation:
dst_point=【a,b,c】 tranform = cv2.getAffineTransform(source_point, dst_point)
Spezifischen Code finden Sie in der Datei face_alignment.py
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)Den spezifischen Code finden Sie unter face_encoder pyGesichtsmerkmalsindex:
人脸识别的时候不能对每一个人脸都进行比较,太慢了,相同的人得到的特征索引都是比较类似,可以采用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)
具体代码可参看face_annoy.py
人脸识别
经过上面三个步骤后,得到人脸特征,在索引中查询最近几个点并就按欧式距离,如果距离小于0.6(更据实际情况设置的阈值)则认为是同一个人,然后根据id在数据库查找到对应人的信息即可
#根据人脸特征找到相似的 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
安装部署
系统采用有两个模块组成:
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
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模型后等待人脸请求
未注册识别失败
人脸注册
注册后登录成功
感谢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!