MTCNN数据制作 - 1
-
多任务 = 分类任务 + 回归任务
模型增加任务,其实就是增加输出 -
级联即减少了 数据量,又增加了 模型的精度
-
级联可以让网络变得越快 越好
单独来看这三个网络,它们的效果不会好,因为网络太浅了
但,当前任务是比较复杂
因为:
人脸的特征比较相似
人脸所处环境比较复杂 -
训练的时候,P.R.O三个网络单独训练
测试的时候是P+R+O=3+4+5=12层,把3个小模型串起来使用
训练的时候网络很浅
使用的时候是组装到一起用,可以用来找到人脸的位置
MTCNN如何保证精度和速度? (面试题)
级联 训练的时候把模型拆开,使用的时候把模型组装到一起
(理解:组装到一起,精度保证了,因为组装到一起,相当于12层的网络了)
怎么保证速度?
逐级在做筛选,逐级 减少数据 (理解:数据量减少了,速度就提高了)
训练时P R O分开训练 (理解:这样训练的时候,也比较快了,训练个3层 4层 5层网络很快)
使用的时候,把3个小模型串起来,当成一个大模型来使用
PRO三个网络都可以看成 一个 单目标检测模型
P网络做的事,是检测一个12 * 12的图片上面有没有人脸和人脸的位置
R网络做的事,是检测一个24 * 24的图片上面有没有人脸和人脸的位害
O网络做的事,是检测一个48 * 48的图片上面有没有人脸和人脸的位置
MTCNN 最慢 的地方是 图像金字塔
(理解:所以要 提高 MTCNN的 检测效率,就是在 优化 图像金字塔,怎么优化?可以优化 缩放比例,以及结束条件)
因为:
图像金字塔 缩放多少次,p网络 就要检测多少次
p网络排除了大量的数据
MTCNN的 优势
1.使用的时候 每个网络 排除了 大量无用 的数据,提高了 速度
2.通过 级联思想 更好的训练
MTCNN数据 分为 正样本 负样本 部分样本
- 两个任务
- 分类任务 (包含 人脸的图片 和 不包含 人脸的图片) 正样本和负样本
- 回归任务 (正样本,部分样本)
MTCNN数据制作 - 2
数据集用 celeba
CelebA是CelebFacesAttribute的缩写,意即名人人脸属性数据集,其包含10177个名人身份的
202.599张人脸图片,每张图片都做好了特征标记,包含人脸bbox标注框,5个人脸特征点坐标以
及40个属性标记,CelebA由香港中文大学开放提供,广泛用于人脸相关的计算机视觉训练任务。
可用于人脸质性标识训练,人脸检训训练以及landmark标记笔,官方网址:arae-scale
CelebFaces Attributes(CelebA)Dataset
数据集问题:欧美人脸
所以拍点自拍,并标注
拍照要求:
上午、下午、中午、晚上
正脸、稍微测点脸
标注人脸的标准
从眉毛到下巴
celeba数据集的问题:
框太大了,我们只需要 眉毛到下巴的区域
test5.py
import cv2
"""
celeba 数据集的问题:
框太大了,我们只需要 眉毛到下巴的区域
"""
img=cv2.imread("notes/1-correct_face_box/img_celeba/000001.jpg")
cv2.rectangle(img,(95,71),(95+226,71+313),(0,0,255),2)
cv2.imshow("src",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
正样本 已经有了,我们标的标签,就是正样本
如何得到 负样本 和 部分样本?
给定一个位置随机,大小随机 的 正方形 与 标签 求 IOU,在 原有的数据 上面
进行 数据增样
iou值分类:
数据集:Wider face 和 CelebA
0-0.3:非人脸 (负样本)
0.65-1.00:人脸 (正样本)
0.4-0.65:Part人脸 (部分样本)
0.3-0.4:地标
训练样本的比例,负样本:正样本:part样本:地标=3:1:1:2
为什么负样本要比正样本多很多?
图片上面 人脸的地方 要比 非人脸的地方 小很多
负样本 一定要比 正样本 多
再制作点 正样本
完全随机,可能生成的数据 大部分都是 负样本 和 部分样本
在红框的中心点 在 随机的方向 移动 随机的距离 得到蓝框
随机的边长:蓝色的框的边长 控制在 红框的边长 的 0.8倍和1.25倍 之间
(理解:位置随机,大小随机 --> 位置 以 标签框中心点的方向随机 , 大小 以 标签框边长 的 倍数范围内 随机)
蓝框是训练时,我们输入 到模型里面的部分
蓝框 我们叫做 建议框
MTCNN数据制作 - 3
坐标如何归一化?
偏移量 : 相对坐标,0 到 1 之间,实际 输出的坐标 和 输入图片 的 相对位置
offx1 =(x1-x1)/w (黄色打钩点的x1的偏移量,即标签坐标点的偏移量)
offy1 = (y1-y1)/w
把 偏移量 当做 标签
注意:我们 输入到模型 里面的 不是原图,而是我们 扣出来的 正方形区域 , 输入到模型的是 蓝框,输出 是 红框
但是,做数据的时候,红框 是 标签,蓝框 是 随机扣出来 的,有可能 红框 比 蓝框 大
红框 的坐标 在 蓝框 外面,做出的 标签 有可能 为 负值,-1 到 1 之间
输入 到模型 的区域 是 蓝框的区域
红框x1的坐标:
x1 = offx1 * w + x1
模型 可以 反推 出来 红框,找到 输入的区域 的之外的 两个点
因为 红框可以 通过 公式 反算 出来
之前为了 防止丢脸,我们给的 步长 比较小,速度比较慢
在有些情况下,我们做 单人脸识别,在 人脸切分 的过程中,有可能 只切了一部分 人脸
根据 这一部分人脸,我们可以 把完整的人脸 找出来,这样模型就有一个 预测的能力
哪怕 蓝框不准,我们还是能进行 预测
如果直接把 坐标 作为 标签,只能检测到 蓝框之内 信息
p网络 又比较 小,哪怕 步长很小 ,得到 框也是不准确的
我们在 做数据 的时候,要考虑怎么让 模型 能预测 到 蓝框之外 的 坐标点
给 半张人脸,怎么能推算出 整个人脸 的坐标
p网络传了 一部分人脸 给 R网络
R网络 可以 把 整个人脸 的坐标 给 推算 出来
R网络 和 O网络 能够 校准p网络 的不准确
要对扣出来的蓝框的区域 做 等比例缩放?
抠出来的蓝框区域 尺寸不匹配
因为输入到模型里的是
12 * 12
24 * 24
48 * 48
为什么 偏移量 不需要 resize
标签不是坐标,是相对位置
是一个比值
MTCNN训练模型
负样本里面 一定不能有人脸,如果有,就删了
正样本中一定要有人脸
部分样本可以有脸,也可以有部分人脸
人脸(红框区域)