精华内容
下载资源
问答
  • Facenet

    2019-11-21 11:58:39
    Facenet

    Facenet


    • -Model(pytorch版本

    《FaceNet:A Unified Embedding for Face Recognition and Clustering 》
    —Facenet:一种人脸识别与聚类的统一嵌入表示
    作者:Florian Schroff,Dmitry Kalenichenko
    单位:Google
    发表会议及时间:CVPR 2015

    人脸识别与传统的深度图像识别区别还是挺大的

    补充:其主要方法和损失函数依旧是业界的主流方案

    补充:人脸识别模型排行榜:(其实在facenet的准确度就是99.6,哈哈,其后的很多网络,一直升到了99.8几)
    在这里插入图片描述

    一 论文导读


    • 人脸识别的主要任务

    在这里插入图片描述
    人脸识别问题可分开集和闭集(开闭集的区别就是你识别的人脸是否固定,闭集就是分类问题,开集就只用分类的思想是不行的)

    人脸识别的主要难度就是对于开集如何识别


    • 人脸识别方法的演进:
      趋势:手工设计特征 —》 深度学习特征表示

    在这里插入图片描述


    人脸识别的挑战:

    在这里插入图片描述


    • 深度学习又称表示学习

    在这里插入图片描述
    把人脸映射到向量
    下图是最普通的欧式距离
    在这里插入图片描述

    在这里插入图片描述


    在这里插入图片描述

    2007?8-LFW:这个数据集掀起了深度学习人脸识别的序幕

    2014-CASIA:第一个为现代深度学习人脸识别提供了海量样本

    目前:MS-celeb-1M 和 Megaface是主要的人脸识别使用训练数据集、验证的是左侧的CALFW等


    在这里插入图片描述


    • 深度学习两种主流方法:

    在这里插入图片描述
    facenet属于左侧


    • 损失函数

    在这里插入图片描述


    • 模型排行榜

    在这里插入图片描述


    二 论文精读

    Facene提出了两个主要问题:

    在这里插入图片描述

    三 代码实现

    只是部分代码:

    train.py

    import torch
    import numpy as np
    
    
    def fit(train_loader, val_loader, model, loss_fn, optimizer, scheduler, n_epochs, cuda, log_interval, metrics=[],
            start_epoch=0):
        """
        Loaders, model, loss function and metrics should work together for a given task,
        i.e. The model should be able to process data output of loaders,
        loss function should process target output of loaders and outputs from the model
    
        Examples: Classification: batch loader, classification model, NLL loss, accuracy metric
        Siamese network: Siamese loader, siamese model, contrastive loss
        Online triplet learning: batch loader, embedding model, online triplet loss
        """
        for epoch in range(0, start_epoch):
            scheduler.step()
    
        for epoch in range(start_epoch, n_epochs):
            scheduler.step()
    
            # Train stage
            train_loss, metrics = train_epoch(train_loader, model, loss_fn, optimizer, cuda, log_interval, metrics)
    
            message = 'Epoch: {}/{}. Train set: Average loss: {:.4f}'.format(epoch + 1, n_epochs, train_loss)
            for metric in metrics:
                message += '\t{}: {}'.format(metric.name(), metric.value())
    
            val_loss, metrics = test_epoch(val_loader, model, loss_fn, cuda, metrics)
            val_loss /= len(val_loader)
    
            message += '\nEpoch: {}/{}. Validation set: Average loss: {:.4f}'.format(epoch + 1, n_epochs, val_loss)
                
            for metric in metrics:
                message += '\t{}: {}'.format(metric.name(), metric.value())
    
            print(message)
    
    
    def train_epoch(train_loader, model, loss_fn, optimizer, cuda, log_interval, metrics):
        for metric in metrics:
            metric.reset()
    
        model.train()
        losses = []
        total_loss = 0
    
        for batch_idx, (data, target) in enumerate(train_loader):
            target = target if len(target) > 0 else None
            if not type(data) in (tuple, list):
                data = (data,)
            if cuda:
                data = tuple(d.cuda() for d in data)
                if target is not None:
                    target = target.cuda()
    
    
            optimizer.zero_grad()
            outputs = model(*data)
    
            if type(outputs) not in (tuple, list):
                outputs = (outputs,)
    
            loss_inputs = outputs
            if target is not None:
                target = (target,)
                loss_inputs += target
    
            loss_outputs = loss_fn(*loss_inputs)
            loss = loss_outputs[0] if type(loss_outputs) in (tuple, list) else loss_outputs
            losses.append(loss.item())
            total_loss += loss.item()
            loss.backward()
            optimizer.step()
    
            for metric in metrics:
                metric(outputs, target, loss_outputs)
    
            if batch_idx % log_interval == 0:
                message = 'Train: [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                    batch_idx * len(data[0]), len(train_loader.dataset),
                    100. * batch_idx / len(train_loader), np.mean(losses))
                for metric in metrics:
                    message += '\t{}: {}'.format(metric.name(), metric.value())
    
                print(message)
                losses = []
    
        total_loss /= (batch_idx + 1)
        return total_loss, metrics
    
    
    def test_epoch(val_loader, model, loss_fn, cuda, metrics):
        with torch.no_grad():
            for metric in metrics:
                metric.reset()
            model.eval()
            val_loss = 0
            for batch_idx, (data, target) in enumerate(val_loader):
                target = target if len(target) > 0 else None
                if not type(data) in (tuple, list):
                    data = (data,)
                if cuda:
                    data = tuple(d.cuda() for d in data)
                    if target is not None:
                        target = target.cuda()
    
                outputs = model(*data)
    
                if type(outputs) not in (tuple, list):
                    outputs = (outputs,)
                loss_inputs = outputs
                if target is not None:
                    target = (target,)
                    loss_inputs += target
    
                loss_outputs = loss_fn(*loss_inputs)
                loss = loss_outputs[0] if type(loss_outputs) in (tuple, list) else loss_outputs
                val_loss += loss.item()
    
                for metric in metrics:
                    metric(outputs, target, loss_outputs)
    
        return val_loss, metrics
    
    

    networks.py

    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class EmbeddingNet(nn.Module):
        def __init__(self):
            super(EmbeddingNet, self).__init__()
            self.convnet = nn.Sequential(nn.Conv2d(1, 32, 5), nn.PReLU(),
                                         nn.MaxPool2d(2, stride=2),
                                         nn.Conv2d(32, 64, 5), nn.PReLU(),
                                         nn.MaxPool2d(2, stride=2))
    
            self.fc = nn.Sequential(nn.Linear(64 * 4 * 4, 256),
                                    nn.PReLU(),
                                    nn.Linear(256, 256),
                                    nn.PReLU(),
                                    nn.Linear(256, 2)
                                    )
    
        def forward(self, x):
            output = self.convnet(x)
            output = output.view(output.size()[0], -1)
            output = self.fc(output)
            return output
    
        def get_embedding(self, x):
            return self.forward(x)
    
    
    class EmbeddingNetL2(EmbeddingNet):
        def __init__(self):
            super(EmbeddingNetL2, self).__init__()
    
        def forward(self, x):
            output = super(EmbeddingNetL2, self).forward(x)
            output /= output.pow(2).sum(1, keepdim=True).sqrt()
            return output
    
        def get_embedding(self, x):
            return self.forward(x)
    
    
    class ClassificationNet(nn.Module):
        def __init__(self, embedding_net, n_classes):
            super(ClassificationNet, self).__init__()
            self.embedding_net = embedding_net
            self.n_classes = n_classes
            self.nonlinear = nn.PReLU()
            self.fc1 = nn.Linear(2, n_classes)
    
        def forward(self, x):
            output = self.embedding_net(x)
            output = self.nonlinear(output)
            scores = F.log_softmax(self.fc1(output), dim=-1)
            return scores
    
        def get_embedding(self, x):
            return self.nonlinear(self.embedding_net(x))
    
    
    class SiameseNet(nn.Module):
        def __init__(self, embedding_net):
            super(SiameseNet, self).__init__()
            self.embedding_net = embedding_net
    
        def forward(self, x1, x2):
            output1 = self.embedding_net(x1)
            output2 = self.embedding_net(x2)
            return output1, output2
    
        def get_embedding(self, x):
            return self.embedding_net(x)
    
    
    class TripletNet(nn.Module):
        def __init__(self, embedding_net):
            super(TripletNet, self).__init__()
            self.embedding_net = embedding_net
    
        def forward(self, x1, x2, x3):
            output1 = self.embedding_net(x1)
            output2 = self.embedding_net(x2)
            output3 = self.embedding_net(x3)
            return output1, output2, output3
    
        def get_embedding(self, x):
            return self.embedding_net(x)
    

    四 问题思索

    展开全文
  • FaceNet

    2020-06-13 13:53:14
    近期研究的课题是孪生网络,看到了FaceNet采用了孪生网络,研究的同时顺带把人脸识别FaceNet实现下,做了个简单的人脸识别项目:包含人员登记、人员签到以及FaceNet模型训练、评估、测试、模型导出、数据制作。...

    近期研究的课题是孪生网络,看到了FaceNet采用了孪生网络,研究的同时顺带把人脸识别FaceNet实现下,做了个简单的人脸识别项目:包含人员登记、人员签到以及FaceNet模型训练、评估、测试、模型导出、数据制作。

    项目通过MTCNN人脸检测模型,从照片中提取人脸图像; 把人脸图像输入到FaceNet,计算Embedding的特征向量; 采用annoy进行人脸匹配,比较特征向量间的欧式距离; 项目利用谷歌浏览器调用电脑摄像头进行人脸采集与识别业务。

    每次识别时间约240ms(MAC only cpu)

    项目地址:https://github.com/MrZhousf/tf_facenet
    依赖

        tensorflow1.8
        python2.7
        flask
        flask_sqlalchemy
        annoy

    FaceNet源码

    https://github.com/davidsandberg/facenet
    官方预训练模型VGGFace2下载

    https://download.csdn.net/download/zsf442553199/10952495
    LFW评估测试数据下载

    http://vis-www.cs.umass.edu/lfw/lfw.tgz
    亚洲人脸数据库_CASIA-FaceV5

    原上传者地址:https://download.csdn.net/download/weixin_42179317/10405384

    若无csdn积分可以直接用百度云盘下载:

    https://pan.baidu.com/s/1WS4nooNQgmQHR6EpmrW6dw  密码: sc8b
    项目运行步骤

        修改项目配置文件config_development.yml
        运行app.py
        人脸采集页面:http://127.0.0.1:8090/user/sign_in
        人脸识别页面:http://127.0.0.1:8090/user/sign_up

    相关截图

    以周杰伦为例,此处仅用于学习与研究,莫怪。

        人脸采集页面(谷歌浏览器打开)

        人脸识别页面(谷歌浏览器打开)

    FaceNet

    train目录下为FaceNet训练业务,训练采用train_tripletloss.py

        训练:train.py
        评估:eval.py
        导出模型:export.py
        比较:compare.py
        可视化:show_train.py
        MTCNN人脸检测与对齐:align_data.py
        制作评估数据(类似lfw的pairs.txt):create_eval_data.py

    可以下载亚洲人脸数据库_CASIA-FaceV5,共500个中国人,每个人5张照片,总共2500张。用create_eval_data.py制作亚洲人脸评估数据集,这样就可以在训练亚洲人脸业务时进行有效的评估了。

    训练配置文件:train_facenet.py

    我针对亚洲人脸数据库_CASIA-FaceV5数据集进行了基于官方预训练VGGFace2模型进行预训练,训练机器配置为:

    系统:ubuntu 16.04LTS

    内存:16GB

    CPU:Intel Core I7-6800K x12

    GPU:GeForce GTX 1080Ti

    训练参数train_tripletloss.py:

    image_size=160, embedding_size=512, batch_size=90, max_nrof_epochs=10, epoch_size=500.

    训练时间约45小时

    训练得到模型 20190218-164145.pb

    模型下载地址:https://download.csdn.net/download/zsf442553199/10965981

    同样采用LFW数据集进行评估,准确率为68.467%:

    而官方预训练VGGFace2模型评估准确率为98.5%:

    比较下发现针对亚洲人训练后准确率不升反降,不用担心,因为我们用了LFW来评估亚洲人,准确率肯定会下降的,毕竟亚洲人和欧美人长相还是有区别的。

    为了验证我们训练的成果是有效的,我们做下以下测试:分别用以上两个模型对同一个亚洲人进行测试看得到的欧式空间距离,如果我们训练的模型的欧式空间距离比官方的模型要小,说明我们的训练是有效的。

    运行train目录下的compare.py:

    找了两张本人不同时期的照片进行测试

    测试我们训练的模型,距离为0.6545:

    测试官方预训练模型,距离为0.737:

    很明显,我们训练的成果还是不错的。接下来,我们可以搜集大量的亚洲人脸数据进行训练,让我们的模型准确率提升到99%应该不是很难的事情。要注意的是训练和评估的数据都要用亚洲人脸数据。
    https://blog.csdn.net/zsf442553199/article/details/87634075

    展开全文
  • facenet

    2020-03-14 15:39:06
    mtcnn+FaceNet 安装requirements.txt依赖 pip install -r requirements.txt 下载预训练模型: facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的,不过需要去谷歌网盘下载,这里给...

    mtcnn+FaceNet

    本篇文章也可以看我的博客

    安装requirements.txt依赖

    pip install -r requirements.txt
    

    下载预训练模型:

    facenet提供了两个预训练模型,分别是基于CASIA-WebFace和MS-Celeb-1M人脸库训练的,不过需要去谷歌网盘下载,这里给其中一个模型的百度网盘的链接:
    链接: 预训练模型百度网盘地址 提取码: zs6u
    复制这段内容后打开百度网盘手机App,操作更方便哦
    下载完成后,把预训练模型的文件夹拷贝在刚才的文件夹里。用pycharm打开这个工程文件如图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KxPCkYCf-1584171391948)(C:\Users\xiahuadong\Pictures\截图\37.png)]
    data文件夹也可以创建到其他盘:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vh9HyaRw-1584171391949)(C:\Users\xiahuadong\Pictures\截图\43.png)]

    运行人脸比对程序(compare.py)。

    facenet可以直接比对两个人脸经过它的网络映射之后的欧氏距离。
    -1、在compare.py所在目录下放入要比对的文件1.png和2.png。
    -2、运行compare.py文件,但是会报错如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txv1RfQS-1584171391950)(C:\Users\xiahuadong\Pictures\截图\38.png)]
    这是因为这个程序需要输入参数,在上方的工具栏里选择Run>EditConfigurations ,在Parameters中配置参数:20170512-110547 1.png 2.png。再次运行程序
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ck9t6I9E-1584171391950)(C:\Users\xiahuadong\Pictures\截图\39.png)]
    可以看到,程序会算出这两个图片的差值矩阵
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgGRCiNm-1584171391950)(C:\Users\xiahuadong\Pictures\截图\40.png)]

    图片预处理——运行人脸对齐程序(align\align_dataset_mtcnn.py)。

    我们可以下载LFW数据集用来测试这个程序,也为后边的训练函数做好数据准备。
    下载链接:http://vis-www.cs.umass.edu/lfw/。下载后解压在data文件夹中。
    或者:链接: 预训练模型百度网盘地址 提取码: fzjp
    复制这段内容后打开百度网盘手机App,操作更方便哦
    因为程序中神经网络使用的是谷歌的“inception resnet v1”网络模型,这个模型的输入时160160的图像,而我们下载的LFW数据集是250250限像素的图像,所以需要进行图片的预处理。
    在运行时需要输入的参数:
    input_dir:输入图像的文件夹(C:\Users\xiahuadong\Pictures\dataset\FaceNetData\lfw)
    output_dir:输出图像的文件夹(C:\Users\xiahuadong\Pictures\dataset\FaceNetData\lfw_160)
    指定裁剪后图片的大小:–image_size 160 --margin 32 --random_order(如果不指定,默认的裁剪结果是182*182像素的)
    比如我的是:C:\Users\xiahuadong\Pictures\dataset\FaceNetData\lfw C:\Users\xiahuadong\Pictures\dataset\FaceNetData\lfw_160 --image_size 160 --margin 32 --random_order
    如果在pycharm中运行,按照同样的方法配置以上参数如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foNPnqhn-1584171391950)(C:\Users\xiahuadong\Pictures\截图\41.png)]

    运行训练程序:(train_tripletloss.py)

    前边已经下载并处理好了LFW的数据集,现在,可以进行训练了。
    运行之前,要在train_tripletloss.py中把加载数据的路径改成自己的数据集所在路径,如下图:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-StW9lFHQ-1584171391950)(C:\Users\xiahuadong\Pictures\截图\42.png)]
    注:train_tripletloss.py和train_softmax.py的区别:这是作者对论文做出的一个延伸,除了使用facenet里提到的train_tripletloss三元组损失函数来训练,还实现了用softmax的训练方法来训练。当然,在样本量很小的情况下,用softmax训练会更容易收敛。但是,当训练集中包含大量的不同个体(超过10万)时,最后一层的softmax输出数量就会变得非常大,但是使用train_tripletloss的训练仍然可以正常工作。

    程序主要函数介绍

    align/ :用于人脸检测与人脸对齐的神经网络
    facenet :用于人脸映射的神经网络
    util/plot_learning_curves.m:这是用来在训练softmax模型的时候用matlab显示训练过程的程序
    二、facenet/contributed/相关函数:
    1、基于mtcnn与facenet的人脸聚类
    代码:facenet/contributed/cluster.py(facenet/contributed/clustering.py实现了相似的功能,只是没有mtcnn进行检测这一步)
    主要功能:
    ① 使用mtcnn进行人脸检测并对齐与裁剪
    ② 对裁剪的人脸使用facenet进行embedding
    ③ 对embedding的特征向量使用欧式距离进行聚类
    2、基于mtcnn与facenet的人脸识别(输入单张图片判断这人是谁)
    代码:facenet/contributed/predict.py
    主要功能:
    ① 使用mtcnn进行人脸检测并对齐与裁剪
    ② 对裁剪的人脸使用facenet进行embedding
    ③ 执行predict.py进行人脸识别(需要训练好的svm模型)
    3、以numpy数组的形式输出人脸聚类和图像标签
    代码:facenet/contributed/export_embeddings.py
    主要功能:
    ① 需要对数据进行对齐与裁剪做为输入数据
    ② 输出embeddings.npy;labels.npy;label_strings.npy

    展开全文
  • FACENET

    2019-06-25 22:42:04
    facenet代码运行 1 将代码复制到如下路径 2 设置环境变量 3 解决ModuleNotFoundError: No module named 'align.detect_face'的报错 解决办法:将alian文件夹更名为my_align,并将相应的代码进行修改。 ...

    facenet代码运行

    1 将代码复制到如下路径

     

    2 设置环境变量

     

    3 解决ModuleNotFoundError: No module named 'align.detect_face'的报错

    解决办法将alian文件夹更名为my_align,并将相应的代码进行修改。

     

    4 运行align_dataset_mtcnn.py

     

    5 运行compare.py

    同一人的两张人脸图片:

    不同人的两张人脸图片:

     

    6 运行validate_on_lfw.py

     

    7 运行train_tripletloss.py

     

    ========================================================

     

    1 效果图

     

     

    2 facenet

     

     

    相关博客:

    https://blog.csdn.net/zsf442553199/article/details/87634075#commentsedit

    https://blog.csdn.net/u013044310/article/details/79556099

    https://blog.csdn.net/Peter_Luoz/article/details/89213489

    展开全文
  • 文章地址:史上最全的FaceNet源码使用方法和讲解(一)(附预训练模型下载)转载请注明出处。 前提条件:已安装并配置好Tensorflow的运行环境。 第一步:准备facenet程序: 一、下载FaceNet源码。 下载地址:...
  • FaceNet--Google的人脸识别

    万次阅读 多人点赞 2015-06-29 21:39:22
    贡献出FaceNet再刷LFW上人脸验证的效果新高 FaceNet与其他的深度学习方法在人脸上的应用不同,并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式...
  • facenet模型

    2019-02-11 11:54:05
    facenet模型、预训练模型; github:https://github.com/davidsandberg/facenet
  • faceNet论文

    2018-05-29 19:05:31
    google的论文,faceNet,有第三方实现:https://github.com/davidsandberg/facenet
  • facenet源码

    2018-10-09 10:55:48
    facenet源码,解压后使用加载工程即可使用。
  • 利用MTCNN和facenet实现人脸检测和人脸识别

    万次阅读 多人点赞 2018-12-09 14:29:07
    利用MTCNN和facenet实现人脸检测和人脸识别 人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用mtcnn和faceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单,先利用mtcnn的...
  • tf_facenet facenet人脸检测与识别项目 说明 近期研究的学位论文是恢复生网络,看到了FaceNet采用了重组生网络,研究的同时顺带把人脸识别FaceNet实现下,并做了一个简单的人脸识别项目:包含人员登记,人员签到...
  • 史上最全的FaceNet源码使用方法和讲解(二) 这是对:史上最全的FaceNet源码使用方法和讲解(附预训练模型下载)的一个补充。 对模型进行测试: 用到的函数:validate_on_lfw.py 在pycharm中配置的参数...
  • facenet.zip

    2021-04-09 09:34:34
    FaceNet其实就是一个通用人脸识别系统:采用深度卷积神经网络(CNN)学习将图像映射到欧式空间。空间距离直接和图片相似度相关:同一个人的不同图像在空间距离很小,不同人的图像在空间中有较大的距离,可以用于人脸...
  • facenet.pth

    2020-06-10 09:55:08
    facenet 模型用于体态识别技术,识别人体的姿势和动做,可以识别多个人的动作和姿势 ,使用的数据集是面部识别
  • FaceNet使用

    千次阅读 2018-05-16 12:39:52
    第一步:准备facenet程序:一、下载FaceNet源码。下载地址:facenet源码二、精简代码。作者在代码里实现了很多功能,但是对于初学者来说,很多代码是没有必要的,反倒找不到学习这个程序的入口。建议先精简一下代码...
  • "FaceNet: A Unified Embedding for Face Recognition and Clustering". The project also uses ideas from the paper "Deep Face Recognition" from the Visual Geometry Group at Oxford. Compatibility The code...
  • model facenet模型

    2018-12-05 14:21:26
    网络模型,已经过训练,精度达到大于99%,facenet模型
  • 安装facenet

    千次阅读 2018-05-29 09:44:08
    Google研究人员在2015年发布了一篇关于人脸识别的论文:FaceNet: A Unified Embedding for Face Recognition and Clustering,然后OpenFace是首个应用谷歌FaceNet深度神经网络进行面部识别的开源项目,地址openface...
  • facenet人脸识别

    2018-09-21 09:40:37
    基于tesorfow, facenet, 这是完整项目,运行mytest1.py,可实现人脸识别

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,371
精华内容 548
关键字:

facenet