07-人脸识别-人脸矫正

人脸矫正有几个问题。

1.歪头:

2.侧脸:

3.半边脸:缺失另外半边脸,要寻找其他的解决方案。

大多数情况下,截取到的人脸是包含歪头和侧脸的现象的。这两个问题,可以同时通过仿射变换来矫正。

但是要注意,侧脸,是缺少一部分脸部信息的。

人脸矫正,对歪头的正确度提高有帮助,对侧脸就一般了。

思路:

1.之前步骤已经在每张人脸上找到5个特征;

2.测量 正面脸 的五点对应坐标 pts_dst(这是测量出来的,重要的是5点的位置相对关系);

3.每张脸的5个点坐标 pts_src,其中的鼻子坐标要设置成和2中鼻子坐标相同,其他坐标点按比例换算;

4.这两组左边,估计矫正的单应性矩阵(就是仿射变换矩阵,歪脸 to 正脸的变换矩阵);

5.然后对人脸做仿射变换,得到矫正后的图。

代码:

import tensorflow as tf
import numpy as np
import cv2
import detect_face
import matplotlib.pyplot as plt
import math
from scipy import misc

img = misc.imread(‘001.jpg‘)

sess = tf.Session()
pnet, rnet, onet = detect_face.create_mtcnn(sess, None)

# pnet, rnet, onet are 3 funtions

minsize = 20
threshold = [0.6, 0.7, 0.7]
factor = 0.709
df_result, df_points_result = detect_face.detect_face(img, minsize, pnet, rnet, onet, threshold, factor)

# df_points_result is faceNumber X 10
# need transpose to 10 X faceNumber
df_points_result = np.transpose(df_points_result)

vec_vec_points = []
for subPoints in df_points_result:
    # subPoints: [x1,x2,x3,x4,x5,y1,y2,y3,y4,y5]
    # image axis, so convert nose to (48,48)
    # Points of small faces are too close to compute correct Homography Matrix.
    # So, scale points.
    deltaX = 48-subPoints[2]
    deltaY = 48-subPoints[7]
    vec_vec_points.append([[subPoints[0]+deltaX, subPoints[5]+deltaY],
                           [subPoints[1]+deltaX, subPoints[6]+deltaY],
                           [subPoints[2]+deltaX, subPoints[7]+deltaY],
                           [subPoints[3]+deltaX, subPoints[8]+deltaY],
                           [subPoints[4]+deltaX, subPoints[9]+deltaY]])

n_face = df_result.shape[0]
print(‘detected face number: {}‘.format(n_face))
print(df_result)

plt.figure(‘faces‘)
i = 0
plt_nrow = n_face / 5
plt_nrow = plt_nrow + int(n_face != plt_nrow * 5)
plt_ncol = 5
crop_face = []
crop_face_adjust = []
size_img = (96,96)
pts_dst = np.array([[29.0,24.0],[67.0,24.0],[48.0,48.0],[28.0,62.0],[68.0,62.0]]) # measure
for subfaceRec in df_result:
    i = i + 1
    subfaceRec = subfaceRec.astype(int)
    img_a_face = img[subfaceRec[1]:subfaceRec[3], subfaceRec[0]:subfaceRec[2]]
    crop_face.append(img_a_face)

    # adjust image
    pts_src = np.array(vec_vec_points[i-1])
    H, _ = cv2.findHomography(pts_src, pts_dst)
    img_a_face_adjust = cv2.warpPerspective(img_a_face, H, (img_a_face.shape[1]+30, img_a_face.shape[0]+30))
    crop_face_adjust.append(img_a_face_adjust)

    # resize image
    img_a_face = cv2.resize(img_a_face, size_img, interpolation=cv2.INTER_CUBIC)

    # display and show
    print(‘plt_nrow:{}, plt_ncol:{}, i:{}‘.format(plt_nrow, plt_ncol, i))
    plt.subplot(plt_nrow, plt_ncol, i)
    plt.imshow(img_a_face)

    cv2.rectangle(img, (subfaceRec[0], subfaceRec[1]), (subfaceRec[2], subfaceRec[3]), (0, 255, 0), 2)

# show face adjust
i = 0
plt.figure(‘faces_adjust‘)
for sub_img_ad in crop_face_adjust:
    timg = cv2.resize(sub_img_ad, size_img, interpolation=cv2.INTER_CUBIC)
    i = i+1
    plt.subplot(plt_nrow, plt_ncol, i)
    plt.imshow(timg)

# draw points
plt.figure(‘img‘)
for subPoints in df_points_result:
    # subPoints: [x1,x2,x3,x4,x5,y1,y2,y3,y4,y5]
    cv2.circle(img, (subPoints[0], subPoints[5]), 2, (255, 0, 0), -1) # Red left eye
    cv2.circle(img, (subPoints[1], subPoints[6]), 2, (0, 0, 255), -1) # Blue right eye
    cv2.circle(img, (subPoints[2], subPoints[7]), 2, (0, 255, 0), -1) # Green nose
    cv2.circle(img, (subPoints[3], subPoints[8]), 2, (255, 255, 0), -1) # yellow left mouse
    cv2.circle(img, (subPoints[4], subPoints[9]), 2, (0, 255, 255), -1) # cyan right mouse

plt.imshow(img)
plt.show()

sess.close()

  

结果:

问题:

效果不是很理想,或许只使用旋转矩阵,效果更好吧。

毕竟侧脸情况,要考虑其他更有效的算法。

值得一提的是,FaceNet对于输入的人脸,没有矫正的要求。

原文地址:https://www.cnblogs.com/alexYuin/p/8870028.html

时间: 2024-11-09 02:45:02

07-人脸识别-人脸矫正的相关文章

《刷脸背后:人脸检测 人脸识别 人脸检索 》PDF 学习下载

发现一本系统讲解人脸识别一系列技术的好书,叫做<刷脸背后:人脸检测 人脸识别 人脸检索>,这里给大家分享一下,共同学习. 本书高清PDF版下载链接:<刷脸背后:人脸检测 人脸识别 人脸检索 >高清带标签可复制PDF 1 内容介绍: 人脸识别是当今热门的研发方向,在安防.金融.旅游等领域具有十分广泛的应用.本书全面.系统地介绍“刷脸”背后的技术,包括人脸检测.人脸识别.人脸检索相关的算法原理和实现技术.本书中讲解的算法具有高度的可操作性和实用性.通过学习本书,研究人员.工程师能够在3

OpenCV — 人脸识别

前段时间弄过一下人脸识别相关的东西,记录一下 撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/54409627本文来自 [jscese]的博客! 概念 FaceDetect 人脸检测 在一张图像中判断是否存在人脸并找出人脸所在的位置 FaceRecognize 人脸识别 在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸 特征值 以某种特定规则对输入源进行处理得到具有唯一

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

微软认知服务开发实践(3) - 人脸识别

前言 人们对人脸识别的研究已经有很长一段时间,起初局限于获取基础的人脸信息,随着机器学习领域的发展,人脸识别的应用更加广泛,已经可以被用于人脸搜索.人脸鉴权等相关应用.本文将针对微软认知服务中提供的人脸识别API的调用方法进行一些初步的讲解. Face API Face API中提供了3方面功能: 人脸检测 人脸分组 人脸识别(搜索) 首先是人脸检测,主要是指传统概念上的人脸识别功能,识别图片中的人的面孔,给出人脸出现的坐标区域,并根据识别出来的人脸分析出一些基本的信息(例如年龄). 其次是人脸

[译]Kubernetes 分布式应用部署和人脸识别 app 实例

原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出自:掘金翻译计划 好的,伙计,让我们静下心来.下面将会是一个漫长但充满希望和有趣的旅程. 我将使用 Kubernetes 部署分布式应用程序.我试图创建一个类似于真实世界 app 的应用程序.显然,由于时间和精力有限,我不得不忽略一些细节部分. 我的重点将放在 Kubernetes 和应用部署上.

转译《opencv4nodejs人脸识别》

在本文中,我将向你展示如何使用face-recognition.js执行可靠的人脸检测和识别 . 我曾经试图找一个能够精确识别人脸的Node.js库,但是没有找到,因此,我决定自己搞一个!  这个npm包基于dlib实现,因为我发现dlib的识别精度很高. dlib库使用深度学习方法,并附带一些预训练的模型,这些预置的模型,在LFW人脸识别基准测试上可以达到惊人的准确度:99.38% . 为什么要搞这个东西? 最近我一直在尝试使用Node.js来构建一个人脸识别应用程序,以便从<生活大爆炸>剧

C# 10分钟完成百度人脸识别——入门篇

嗨咯,小编在此祝大家新年快乐财多多! 今天我们来盘一盘人脸注册.人脸识别等相关操作,这是一个简单入门教程. 话不多说,我们进入主题: 完成人脸识别所需的步骤: 注册百度账号api,创建自己的应用: 创建vs控制台应用程序,引入动态链接库: 编写代码调试,效果图查看: 总结. 1.注册百度账号api,创建自己的应用 注册地址: https://login.bce.baidu.com/ 注册登录之后,在"产品服务" 菜单下找到人脸识别 ,如下图: 点击去创建自己的应用名称,其实最主要的就是

创客版人脸识别迎宾套件

开发者基于神目pcDuino9 AI视觉边缘计算套件,进行算法和软件的开发,自行开发出一套智能人脸识别迎宾系统,并打通了系统和神目弼马温管理平台的连接,对数据进行多样化分类管理应用.一站式计算机视觉开发一个套件,即可轻松解决计算机视觉算法.软件.硬件的开发,加速人工智能产品落地(神目AI开放平台现免费开放人脸识别/人脸检测SDK,开发者也可自行进行其他计算机视觉算法开发)硬件产品详细资料pcDuino 9s wiki:http://linksprite.com/wiki/index.php?ti

Android 用虹软SDK做人脸识别

人脸识别第三方sdk比较多,但是大多都是收费的或者限制次数什么的,虹软的效果还不错,全免费也不需要联网 V1.2版本使用和快速集成:https://www.jianshu.com/p/8dee89ec4a24(Android集成虹软人脸.人证对比,活体检测) 虹软官网https://ai.arcsoft.com.cn/ 官网下载sdk,还要引入一个依赖,用来转换把bitmap以一定的格式转为byte[]的 api 'com.guo.android_extend:android-extend:1.

Android 人脸识别源码APP后台接口设计

Android softboy人脸识别源码APP后台接口设计,这个是最近开发的一个人脸识别人脸系统框架,系统内容比较复杂.这里简化了主要的接口与数据,然后结合 softboy人脸识别app,就可以体验极速的人脸识别考勤体验. 这个离线app支持上传考勤记录,下载人脸数据进行离线人脸识别和活体检测,有限规避相片打卡视频欺骗等. 这个APP的下载体验地址https://pan.baidu.com/s/1i5oXoJ7 接下来看一下接口功能设计,还原提意见哦.慢慢的福利,正在做的朋友可以直接下载参考.