Реализация системы авторизации по распознаванию лиц на базе mtcnn/facenet/tensorflow

TensorFlow

гит-адрес:GitHub.com/Чэнь Линьчжун, ох ты...

В этой статье в основном представлены подробные методы обнаружения и распознавания лиц, задействованные в системе.На основе среды python2.7.10/opencv2/tensorflow1.7.0 система реализует функции чтения видео с камеры, обнаружения лиц и распознавания лиц. Поскольку файл модели слишком велик, git не может загрузить его, весь проект помещается на облачный диск Baidu по адресу:disk.baidu.com/is/1ta alp wq для…

Распознавание лиц — горячая точка в области исследований компьютерного зрения. В настоящее время в лабораторных условиях многие средства распознавания лиц догнали (превзошли) точность ручного распознавания (показатель точности: 0,9427~0,9920), например, face++, DeepID3, FaceNet и т. д. (подробности см.: Технология распознавания лиц на основе обзора глубокого обучения). Однако из-за различных факторов, таких как освещение, ракурс, выражение лица, возраст и т. д., технология распознавания лиц не может быть широко использована в реальной жизни. В этой статье, основанной на среде python/opencv/tensorflow, используется FaceNet (LFW: 0,9963) для создания системы обнаружения и распознавания лиц в реальном времени, а также исследуются трудности систем распознавания лиц в реальных приложениях. Следующее основное содержание заключается в следующем:

  1. Используйте тег видео htm5, чтобы открыть камеру для захвата аватара, и используйте компонент jquery.faceDeaction для грубого определения лица.
  2. Загрузите изображение лица на сервер и используйте mtcnn для обнаружения лица.
  3. Используйте аффинное преобразование opencv, чтобы выровнять лицо и сохранить выровненное лицо.
  4. Используйте предварительно обученный Facenet для встраивания обнаруженного лица и встраивания его в 512-мерные объекты;
  5. Создайте эффективный раздражающий индекс для функций встраивания лиц для распознавания лиц.

коллекция лиц

С помощью тега html5 video можно легко реализовать функцию чтения видеокадров с камеры.Следующий код реализует функцию чтения видеокадров с камеры, и faceDection распознает лицо, а затем захватывает изображение и загружает его на сервер. Добавить видео, тег холста в html-файл

<div class="booth">
    <video id="video" width="400" height="300" muted class="abs" ></video>
    <canvas id="canvas" width="400" height="300"></canvas>
  </div>

Включите веб-камеру

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();
});

Используйте компонент facetDection jquery для обнаружения лиц

$('#canvas').faceDetection()

Сделайте снимок экрана, если лицо обнаружено, и преобразуйте изображение в формат base64 для удобной загрузки.

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

Загрузить изображение в формате base64 на сервер

//上传人脸图片
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
      }
  });
}

Сервер изображений принимает код, реализованный на языке php.

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;
    }
}

Распознавание лиц

Существует множество методов обнаружения лиц, таких как классификатор признаков лица Хаара, который поставляется с opencv, и метод обнаружения лиц dlib. Для метода обнаружения лиц в opencv это немного просто и быстро; проблема в том, что эффект обнаружения лиц не очень хорош. Лица с хорошим фронтальным/вертикальным/светлым освещением могут быть обнаружены этим методом, в то время как лица с боковым/перекошенным/плохим освещением не могут быть обнаружены. Поэтому этот метод не подходит для полевого применения. Для метода обнаружения лиц dlib эффект лучше, чем у метода opencv, но сила обнаружения также не соответствует стандартам полевых приложений. В этой статье мы принимаем систему обнаружения лиц mtcnn (mtcnn: совместное обнаружение и выравнивание лиц с использованием многозадачных каскадных сверточных нейронных сетей), основанную на методе глубокого обучения. Метод обнаружения лица mtcnn более устойчив к изменениям освещения, угла и выражения лица в естественной среде, а эффект обнаружения лица лучше; в то же время потребление памяти невелико, и обнаружение лица в реальном времени может быть осуществленный. mtcnn, используемый в этой статье, основан на реализации python и tensorflow (код исходит от davidsandberg, код реализации caffe см.: 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个关键点
            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.

выравнивание лица

Иногда перехватываемое нами лицо может быть криво.Для повышения качества детектирования нам необходимо скорректировать лицо до такого же стандартного положения.Это положение определяется нами.Предположим,стандартная головка детектирования,которую мы установили,такая

在这里插入图片描述

Предположим, что координаты трех точек глаз и носа равны a(10,30) b(20,30) c(15,45).Для конкретных настроек обратитесь к элементу конфигурации блока выравнивания файла config.ini.

Используйте аффинное преобразование opencv для выравнивания и получите матрицу аффинного преобразования

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

Аффинное преобразование:

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

Конкретный код см. в файле face_alignment.py.

генерировать функции

Выровняйте полученный аватар, поместите его в предварительно обученный фейснет для встраивания обнаруженного лица, встройте его в 512-мерный признак и сохраните в файле lmdb в виде (id, вектор).

 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.

Индекс характеристик лица:

При распознавании лиц невозможно сравнить каждое лицо, оно слишком медленное, индексы признаков, полученные одним и тем же человеком, относительно схожи, и для идентификации можно использовать алгоритм классификации KNN, вот более эффективный алгоритм раздражения для лица. Для создания индекса предположение алгоритма раздражающего индексирования состоит в том, что каждую функцию лица можно рассматривать как точку в многомерном пространстве.Если они очень близки (знакомы), любая гиперплоскость Они не могут быть разделены, то есть если точки в пространстве очень близки и разделены гиперплоскостью, то подобные точки обязательно будут разделены в одно и то же плоское пространство (см.:GitHub.com/ — это речь/кнопка…

#人脸特征先存储在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.

Формат связи сокета между модулями: длина+контент.

Конфигурация, связанная с face_server, находится в файле config.ini.

1. Используйте зеркалирование

  • образ face_serverdocker: shareclz/python2.7.10-face-image
  • зеркало face_web: skychan/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

在这里插入图片描述

Незарегистрированное распознавание не удалось

在这里插入图片描述

регистрация лица

在这里插入图片描述

Войти успешно после регистрации

在这里插入图片描述

Ссылаться на

zhuanlan.zhihu.com/p/25025596

GitHub.com/ — это речь/кнопка…

blog.CSDN.net/just_sort/Ах…

blog.CSDN.net/o ten GY UE/AR…