> # ♻️ 资源
> **大小:** 46.8KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010922**](https://www.yuque.com/sxbn/ks/100010922)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87484801**](https://download.csdn.net/download/s1t16/87484801)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 人脸识别
## 算法简介
我们的算法可以分成两个部分,识别人脸位置和确定人脸分类。这两个部分可以看成:
1.检测出人脸之间相似性。
2.检测出人脸之间不同性。
由于这两项工作截然相反,所以我们使用了两个网络来分别完成这两项工作。
## 人脸检测
### 简述
我们的人脸检测网络采用了和Faster RCNN类似的策略,但我们在ROI Polling上进行了创新,兼顾了小目标检测和大目标检测,为此,我们还使用了改进后的RESNET101_V2的网络,使我们的网络对于小目标更加敏感。在增加了少量的运算单元后,我们的网络可以识别24*24像素下的人脸(甚至于更低!)。我们调整了网络结构,并没有采用传统的卷积网络(提取特征)+全连接层(分类)的结构,而是采用了全卷积结构,这让我们的识别网络的速度远远高于传统的神经网络识别方法,识别精度也高于传统的算子和特征值人脸识别算法。
### 数据集介绍
采用的数据集为FDDB数据集,该数据集图像+注释有600M左右。
图像有各种大小和形状,主要集中在(300600)*(300600)的像素上。
注:我们的训练网络不在乎训练图像的大小形状(只要长宽大于192就好)。
其注释内容为图像中的人脸椭圆框:
```
[ra, rb, Θ, cx, cy, s]
ra,rb:半长轴、半短轴
cx, cy:椭圆中心点坐标
Θ:长轴与水平轴夹角(头往左偏Θ为正,头往右偏Θ为负)
s:置信度得分
```
通过坐标变换后我们可以得到矩形框:
```
w = 2*max([abs(ra*math.sin(theta)),abs(rb*math.cos(theta))])
h = 2*max([abs(ra*math.cos(theta)),abs(rb*math.sin(theta))])
rect = [cx-w/2,cy-h/2,w,h]
即:
rect = [x,y,w,h](x,y为左上角坐标)
```
我们以图为单位,从图中抽取128个anchors,这128个anchors包括该图中的全部正例和随机的负例。最后使用我们进行坐标变换的矩形框进行Bounding Box回归。
### 算法介绍
#### 流程图
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716964634367-a9db0cfd-be19-4a11-ba6a-85cd15b3923b.png#averageHue=%23e9ded8&from=url&id=BUnTO&originHeight=648&originWidth=1152&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
```
img = tf.constant(img,shape = (1,h,w,mod),dtype = tf.float32) # 图像原始数据
# 使用无pool1&pool5的RESNET 101
net, endpoints = my_resnet(img,global_pool = False,num_classes=None,is_training=True,reuse = tf.compat.v1.AUTO_REUSE) # net's w&h = original_img's w&h / 8
```
我们进行模型搭建和使用的平台为windows10-python3.6.2-tensorflow-gpu。
首先,我们的图像(img_batch = [batch_size,h,w,mod],batch_size为图像的数量,h为图像高度,w为图像宽度,mod为图像通道数,这里我们处理的均为RGB三色彩图,所以我们的通道数均为3)通过我们改进版的RESNET101_V2网络,传统的RESNET101_V2的网络结构如下:
![](https://cdn.nlark.com/yuque/0/2024/png/2469055/1716964634450-68d47e43-d7a6-4674-83a9-5b2defcac9f1.png#averageHue=%23a7a4a1&from=url&id=QqJ3H&originHeight=7303&originWidth=2728&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
而我们的网络去掉了pool1和pool5层,使网络放缩系数从32下降到了8。这使我们的网络对于小目标更加的敏感。通过了该网络后,我们得到了卷积后的信息图:img_batch_conv = [batch_size,h/8,w/8,2048]
```
weights = {
'down':tf.compat.v1.get_variable(name = 'w_down',shape = [1,1,2048,1024]),# 降采样
'feature':tf.compat.v1.get_variable(name = 'w_feature',shape = [1,1,1024,K*K*2])
}
biases = {
'down':tf.compat.v1.get_variable(name = 'b_down',shape = [1024,]), # 降采样
'feature':tf.compat.v1.get_variable(name = 'b_feature',shape = [K*K*2,])
}
```
img_batch_conv首先通过一个shape = [1,1,2048,1024]的卷积算子,该算子的作用是进一步的特征提取和降采样。我们采用多步特征提取的策略是由于在RCNN[1]一文中,作者提出在VOC2012测试集下,三层的特征识别网络比一层特征识别网络的正确率要高。
通过该算子我们得到了一个[batch_size,h/8,w/8,1024]结构的数据,将该数据通过一个[1,1,1024,K*K*C]的算子得到特征图feature_map。feature_map的概念在Faster RCNN[2]的文章内提出,提取特征图的算子的K*K代表着每一块feature_map有K*K个bin,而C代表着识别物体的类别+1(背景),这里我们的K取3,C取2(只有两个分类:人脸和背景)。
```
with tf.compat.v1.variable_scope('RPN', reuse=tf.compat.v1.AUTO_REUSE):
weights = {
'rpn_1':tf.compat.v1.get_variable(name = 'w_rpn_1_1',shape = [3,3,1024,1]), # 高:宽 1:1的卷积
'rpn_2':tf.compat.v1.get_variable(name = 'w_rpn_1_2',shape = [3,6,1024,1]), # 高:宽 1:2的卷积
'rpn_3':tf.compat.v1.get_variable(name = 'w_rpn_2_1',shape = [6,3,1024,1]), # 高:宽 2:1的卷积
'rpn_4':tf.compat.v1.get_variable(name = 'w_rpn_2_2',shape = [6,6,1024,1]),
'rpn_5':tf.compat.v1.get_variable(name = 'w_rpn_2_4',shape = [6,12,1024,1]),
'rpn_6':tf.compat.v1.get_variable(name = 'w_rpn_4_2',shape = [12,6,1024,1]),
'rpn_7':tf.compat.v1.get_variable(name = 'w_rpn_4_4',shape = [12,12,1024,1]),
'rpn_8':tf.compat.v1.get_variable(name = 'w_rpn_4_8',shape = [12,24,1024,1]),
'rpn_9':tf.compat.v1.get_variable(name = 'w_rpn_8_4',shape = [24,12,1024,1])
}
biases = {
'rpn_1':tf.compat.v1.get_variable(name = 'b_rpn_1_1',shape = [1,]),
'rpn_2':tf.compat.v1.get_variable(name = 'b_rpn_1_2',shape = [1,]),
'rpn_3':tf.compat.v1.get_variable(name = 'b_rpn_2_1',shape = [1,]),
'rpn_4':tf.compat.v1.get_variable(name = 'b_rpn_2_2',shape = [1,]),
'rpn_5':tf.compat.v1.get_variable(name = 'b_rpn_2_4',shape = [1,]),
'rpn_6':tf.compat.v1.get_variable(name = 'b_rpn_4_2',shape = [1,]),
'rpn_7':tf.compat.v1.get_variable(name = 'b_rpn_4_4',shape = [1,]),
'rpn_8':tf.compat.v1.get_variable(name = 'b_rpn_4_8',shape = [1,]),
'rpn_9':tf.compat.v1.get_variable(name = 'b_rpn_8_4',shape = [1,])
}
```
我们将得到的feature_map = [batch_size,h/8,w/8,K*K*C]使用三种不同形状,三种不同大小,一共九种不同形状或大小的卷积核对我们的网络进行卷积,得到了9种不同形状或大小的archors中是否存在人脸的概率。这里我们虽然沿用了Faster RCNN[2]中anchor的概念,但我们并没有使用ROI Pooling而是只使用了ROI。因为Tensorflow采用的是流图计算,增加ROI Pooling反而会让每个anchor独立计算,大大增加了我们的计算量,而且不同大小的anchor进行Pooling后均会生成K*K形状的数据,不方便我们的网络对于不同大小的anchor进行不同状态的识别。而且由于我们只用分成背景和人脸两个类别,所以即使不进行ROI Pooling,我们网络所需的运算单元�
神仙别闹
- 粉丝: 3858
- 资源: 7472
最新资源
- 离线安装包 Adobe Flash Player 32.0.0.156 for Linux 64-bit PPAPI
- 黑客与渗透测试编程之道.zip
- SpringBoot资料包
- java毕设项目:基于Springboot+vue+mysql开发的校园志愿者管理系统【含源码+数据库+环境配置和运行指导视频+系统讲解视频】
- 基于深度学习的图像超分辨率重建技术研究与开发
- PyTorch环境配置指南:基于Anaconda平台的技术步骤
- 饕餮工具包,目的是询问集成后渗透的相关技术.zip
- 数据压缩与哈夫曼树构建详解及应用案例
- 集成渗透测试基本工具以及漏洞利用.zip
- C#家校亲情管理系统源码 教务系统源码数据库 SQL2008源码类型 WebForm
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈