项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究

前言

时间易逝!转眼间又大三了,最近都在忙于项目、比赛和学习,很少去管理一下自己的博客了,请大家谅解一下。这次呢,我准备把以前学习的人脸识别算法心得写出一篇记录来。
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第1张图片

正文

首先呢,我想给大家推荐两种人脸识别神经网络结构——Siamese network、FaceNet。
对于什么是Siamese network,这里点击查看Siamese network;而对于什么是FaceNet,则可以点击这里。不过,在这里我希望大家能够学会多看论文,毕竟是搞算法研究的,学会怎么样看论文很重要。
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第2张图片
看到这里,我想有人问,为什么不用传统的神经网络结构呢,既简单又方便。答案是:训练时确实是既简单又方便,但应用起来又准确又不方便。
假设你的模型训练时分类是5个人,但突然间你的组长叫你要识别分类六个人,而你的模型又训练好了。怎么办?
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第3张图片
还能怎么办,重新训练呗。
你知道吗,我们搞算法的最难的就是缺乏数据了。假设我这里有10个人,但每个人只有10张图片,先不考虑训练时的数据增强,总的数据只有100个。这时候怎么办,搭建一个小的神经网络模型,又学习不到什么,搭建一个深点的神经网络又可能会过拟合。怎么办,没法了,来个PCA降维法,对人脸数据进行降维操作,最后使用欧式距离分类。但是结果肯定不好。因此呢,上面两种是较为好的选择,在这里我就不多言描述上面这两种人脸识别算法的思路了。
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第4张图片
选择好了以后,剩下来的就是数据方面了,我想这是很头痛的事情。不过在这里的话我觉得还是从简单的数据开始吧。我相信大家都去网上找了数据集,遗憾的是大都数都需要注册邮箱才能获取数据吧。不用的有些数据又太垃圾了,还得自己去人脸检测,剪裁出适宜的人脸来。这里呢我推荐几个黑白图像数据集给大家先练练手。
数据集一这个数据挺好的,目前我用过的最好的亚洲人脸数据(这个本来我有网盘的链接的,不过被我好像删了,大家想要的话,可以找我解决办法);
数据集二,这是我在一些官网上下载的数据OCR,大家可以先拿去玩玩。不过我还在网上发现了一个毕竟有趣的数据生成网站数据库三如果有兴趣的话可以去学习一下这种技术GAN。关于GAN的或许你也可以学习一下我的另一篇博客
既然有了数据了,那么接下来干嘛尼!答案是:数据预处理啊。有些数据是本身比较脏的,需要我们去“清洗”。首先是对图像进行滤波去噪——中值滤波、细节滤波等。然后呢,因为我们的图像是灰白图像,可能会存在关照强度不一样的影响,那么就需要进行非线性转换了。为了能够让训练比较困难、以及数据大小过小的问题,我们需要对数据进行剪裁、翻转,emm,如果是Pytorch框架的对应的是transform不懂的话点击这里,接着就去喂养给神经网络了。最后效果肯定比一般的神经网络好得多。
这里呢,给个搭建Siamese Network例子

class SiameseNetwork(nn.Module):
     def __init__(self):
         super(SiameseNetwork, self).__init__()
         self.cnn1 = nn.Sequential(
             nn.ReflectionPad2d(1),
             nn.Conv2d(1, 4, kernel_size=3),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(4),
             nn.Dropout2d(p=.2),
             
             nn.ReflectionPad2d(1),
             nn.Conv2d(4, 8, kernel_size=3),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(8),
             nn.Dropout2d(p=.2),
 
             nn.ReflectionPad2d(1),
             nn.Conv2d(8, 8, kernel_size=3),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(8),
             nn.Dropout2d(p=.2),
         )

         self.cnn2 = nn.Sequential(
             nn.Conv2d(8, 16, kernel_size=5),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(16),
             nn.Dropout2d(p=.2),
             
             nn.Conv2d(16, 32, kernel_size=3),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(32),
             nn.Dropout2d(p=.2),
 
             nn.Conv2d(32, 32, kernel_size=1),
             nn.ReLU(inplace=True),
             nn.BatchNorm2d(32),
             nn.Dropout2d(p=.2),
         ) 

         self.fc1 = nn.Sequential(
             nn.Linear(32*94*94, 1500),
             nn.ReLU(inplace=True),
 
             nn.Linear(1500, 500),
             nn.ReLU(inplace=True),
 
             nn.Linear(500, 128)
         )
 
     def forward_once(self, x):
         output = self.cnn1(x)
         output = self.cnn2(2)
         output = output.view(output.size()[0], -1)
         output = self.fc1(output)
         return output
 
     def forward(self, input1, input2):
         output1 = self.forward_once(input1)
         output2 = self.forward_once(input2)
         return output1, output2

损失函数设计:

class ContrastiveLoss(torch.nn.Module):

     def __init__(self, margin=2.0):
         super(ContrastiveLoss, self).__init__()
         self.margin = margin
 
     def forward(self, output1, output2, label):
         euclidean_distance = F.pairwise_distance(output1, output2)
         loss_contrastive = torch.mean((1-label) * torch.pow(euclidean_distance, 2)  
                                       (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2))
 
         return loss_contrastive

其实呢,这个损失函数设计得也不太好,训练时容易过优,还有就是一定要对数据进行预处理,和将类内数据差异化增大,类间数据差距减小,这样训练出来的模型能相比没有的情况下识别准确度能提升百分之五。
加载数据的话,实在不会的话,可以留言。
下面给出我训练后的神经网络模型的结果:
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第5张图片
上面这张图片代表的是相同人脸欧氏距离误差大小,不同人脸对比为下图所示:
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第6张图片
理论上图像数据噪音少,对比度准确率还是挺高的,这里我把判断是否为同一人脸的欧氏距离阈值设定为0.9,大于它则不是,小于或等于它则是
emm,说了有点简陋,我想大家很难根据我的思路实现吧,主要是本人最近正准备写一篇关于人脸复杂条件下的识别算法研究的论文,所以就不详细地写了。不过呢,我再推荐一下一个代码实现的链接,算是对大家的帮助了
FaceNet

先说到这里了,以后我还会讲解一下怎么样设计人脸识别网络和改进损失函数。记得留个哦
项目前期准备(2)——基于Pytorch的人脸识别神经网络系统研究_第7张图片

你可能感兴趣的:(神经网络,深度学习,pytorch)