基于yolo的人脸检测与人脸对齐(代码片段)

阳光玻璃杯 阳光玻璃杯     2023-02-14     339

关键词:

前言

YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,yolo将对象定位作为回归问题求解,在one-stage中实现对象定位与识别,其最大的特点就是快!快!快!

既然yolo本来就是通过回归的方法对对象定位,并与此同时对对象进行分类。那我们很容易想到yolo在做对象定位的同时可以对对象的特征点进行回归,最常见的用例是人脸检测与人脸对齐同步完成

将人脸检测和人脸对齐同步完成,mtcnn已经做了类型的事情:

由图可见,mtcnn使用了三个卷积神经网络实现了人脸检测和人脸对齐,而使用yolo,我们将只用一个卷积神经网络同时实现人脸检测和人脸对齐:

我们将去掉yolo的分类逻辑,加入回归特征点的逻辑。

为了更好的回归,我们需要将基于图像左上角的坐标转变为基于矩形框中心的坐标。

tx = (pred_x - centet_x)*2/w

ty = (pred_y - centet_y)*2/h

tx,ty为最后的基于预测框中心的坐标

centet_x,centet_y为预测框的中心坐标

w,h为预测狂的宽和高。

pred_x,pred_y为神经网络输出的预测坐标。

经过如上处理,tx,ty应该在[-1,1]区间才行,所以,我们需要对输出进行限制。只需要让输出通过tanh激活函数即可。

pred_x = tanh(out_x)

pred_y = tanh(out_y)

out_x,out_y为为神经网络输出的未经激活的坐标。

代码如下:

static float delta_face_landmars(box fbox, float *truth, float *pred, float *delta, int index, int w, int h, int stride, float scale)

    int i;
    float diff = 0;
    float data[10];
    five_point(truth,data);
    for(i=0;i<5;++i)
        float tx = 2*(data[i*2] - fbox.x)/fbox.w;
        float ty = 2*(data[i*2+1] - fbox.y)/fbox.h;
        //printf("tx=%f,ty=%f,box: %f,%f,%f,%f,truth: %f,%f\\n",tx,ty,fbox.x,fbox.y,fbox.w,fbox.h,truth[i*2],truth[i*2+1]);
        delta[index + (i*2)*stride] = scale*(tx - pred[index + (i*2)*stride]);
        delta[index + (i*2+1)*stride] = scale*(ty - pred[index + (i*2+1)*stride]);
        diff += 0.5*delta[index + (i*2)*stride]*delta[index + (i*2)*stride] + 0.5*delta[index + (i*2+1)*stride]*delta[index + (i*2+1)*stride];
    
    return diff;

有了以上的准备,我们可以开始训练我们的神经网络了。

模型选择

但是yolov2太过于庞大,我的电脑根本跑不了,yolo tiny可以跑,但是我并没有选择,yolo tiny模型,而是选择了vgg16中的13个卷积层做特征提取:

三个全连接层使用1*1的卷继融合为n*(4+1+10)个channel,n为每个cell预测几个矩形框。

最终的模型如下:

layer     filters    size              input                output
    0 conv     64  3 x 3 / 1   224 x 224 x   3   ->   224 x 224 x  64  0.173 BFLOPs
    1 conv     64  3 x 3 / 1   224 x 224 x  64   ->   224 x 224 x  64  3.699 BFLOPs
    2 max          2 x 2 / 2   224 x 224 x  64   ->   112 x 112 x  64
    3 conv    128  3 x 3 / 1   112 x 112 x  64   ->   112 x 112 x 128  1.850 BFLOPs
    4 conv    128  3 x 3 / 1   112 x 112 x 128   ->   112 x 112 x 128  3.699 BFLOPs
    5 max          2 x 2 / 2   112 x 112 x 128   ->    56 x  56 x 128
    6 conv    256  3 x 3 / 1    56 x  56 x 128   ->    56 x  56 x 256  1.850 BFLOPs
    7 conv    256  3 x 3 / 1    56 x  56 x 256   ->    56 x  56 x 256  3.699 BFLOPs
    8 conv    256  3 x 3 / 1    56 x  56 x 256   ->    56 x  56 x 256  3.699 BFLOPs
    9 max          2 x 2 / 2    56 x  56 x 256   ->    28 x  28 x 256
   10 conv    512  3 x 3 / 1    28 x  28 x 256   ->    28 x  28 x 512  1.850 BFLOPs
   11 conv    512  3 x 3 / 1    28 x  28 x 512   ->    28 x  28 x 512  3.699 BFLOPs
   12 conv    512  3 x 3 / 1    28 x  28 x 512   ->    28 x  28 x 512  3.699 BFLOPs
   13 max          2 x 2 / 2    28 x  28 x 512   ->    14 x  14 x 512
   14 conv    512  3 x 3 / 1    14 x  14 x 512   ->    14 x  14 x 512  0.925 BFLOPs
   15 conv    512  3 x 3 / 1    14 x  14 x 512   ->    14 x  14 x 512  0.925 BFLOPs
   16 conv    512  3 x 3 / 1    14 x  14 x 512   ->    14 x  14 x 512  0.925 BFLOPs
   17 max          2 x 2 / 2    14 x  14 x 512   ->     7 x   7 x 512
   18 conv     15  1 x 1 / 1     7 x   7 x 512   ->     7 x   7 x  15  0.001 BFLOPs
   19 face_aliment

数据集的选取

我使用的是helen数据集,训练集共有2000副图片,每张图片标注了一个人脸。测试集共有330副图片。

官方实例:

helen数据集中,每个人脸标注了了68个点。一开始我也是壮志雄心,想在检测的同时回归68个特征点,可是结果是非常失败的。loss根本不收敛。为此,我从68个点中挑选了5个特征点,分别是左眼、右眼、鼻尖、左嘴角、右嘴角。

训练

我的笔记本带的显卡参数如下:

1050 max-q显卡,训练了超过8个小时......

可能模型还是训练不是很充分,人脸检测的效果非常好,但是人脸对齐的效果一般。

以下数据都来自helen的test set。

也有一些是非常失败的,比如:

源码解析

我fork了darknet的源码,并通过修改源码实现了以上实验。源码地址:

https://github.com/sunnythree/darknet

训练:

./darknet face_aliment train cfg/face_aliment.cfg 

测试:

./darknet face_aliment test cfg/face_aliment.cfg model/face_aliment.weights

 

opencv基于残差网络实现人脸检测(代码片段)

OpenCV基于残差网络实现人脸检测OpenCV3.3版本第一次把深度神经网络(DNN)模块引入到正式发布版本中,最新的OpenCV3.4中DNN模块发布了两个必杀技,一个支持FasterR-CNN的对象检测,比SSD与YOLO这些模型有更好的检测精度与小对象检测能... 查看详情

Python中的人脸对齐与DNN人脸检测器

】Python中的人脸对齐与DNN人脸检测器【英文标题】:FacealignmentinPythonwithDNNfacedetector【发布时间】:2020-12-1508:34:36【问题描述】:我正在尝试在python中进行人脸对齐代码。我正在关注此article,但在本文中使用了人脸检测dlib。以下... 查看详情

图像处理——基于机器视觉技术的人脸在线识别系统设计(代码片段)

  基于机器视觉技术的人脸在线识别系统设计  本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理、数据收集和预处理、人脸... 查看详情

人脸检测实战终极:使用opencv和python进行人脸对齐(代码片段)

...进行人脸对齐的结果。实现面部矫正器面部对齐算法本身基于MasteringOpenCVwithPracticalComputerVisionProjects(Baggio,2012)的第8章,如果您有C++背景或兴趣,我 查看详情

mtcnn人脸识别(代码片段)

最近看了一些人脸识别的综述及几篇经典论文。这里简单记录下MTCNN论文及Tensorflow的复现过程。感觉人脸检测属于目标检测下的一个方向,不过由通用目标检测改为人脸检测,即多分类改为2分类,且为小目标检测。而且人脸检... 查看详情

基于matlab的人脸检测,人眼检测(代码片段)

素材人脸检测clearallclcimg=imread('2.png');detector=vision.CascadeObjectDetector;release(detector);detector.ClassificationModel='FrontalFaceCART';%检测双眼bboxes=detector(img);Ey 查看详情

基于python的人脸互换系统设计与实现(代码片段)

数据可视化FinalProject目录数据可视化FinalProject1项目介绍11.1.人脸互换(faceswap)21.2人脸融合(facemorph)21.3本征脸(eigenface)2算法结构与处理过程22.1人脸变换22.1.1人脸关键点检测22.1.2计算凸包32.1.3德劳内&#x... 查看详情

mtcnn实时人脸检测网络详解与opencv+tensorflow代码演示(代码片段)

MTCNN模型概述多任务卷积神经网络(MTCNN)实现人脸检测与对齐是在一个网络里实现了人脸检测与五点标定的模型,主要是通过CNN模型级联实现了多任务学习网络。整个模型分为三个阶段,第一阶段通过一个浅层的CNN网络快速产生一... 查看详情

基于opencv的人脸识别自助商店(源码&部署视频)(代码片段)

...人脸并截取。并输入编号和余额。2.视频演示[项目分享]基于OpenCV的人脸识别自助商店(源码&部署视频)_哔哩哔哩_bilibili3.效果展示4.第三方包的安装opencv的安装,输入:pipinstallopencv-python。注:numpy与OpenC... 查看详情

人脸检测和对齐算法mtcnn(代码片段)

1.概述人脸识别在实际的生活中有着广泛的应用,得益于深度学习的发展,使得人脸识别的准确率得到大幅度提升。然而,为了做好人脸识别,第一步需要做的是对人脸检测,主要是通过对图片分析,定位... 查看详情

人脸检测和对齐算法mtcnn(代码片段)

1.概述人脸识别在实际的生活中有着广泛的应用,得益于深度学习的发展,使得人脸识别的准确率得到大幅度提升。然而,为了做好人脸识别,第一步需要做的是对人脸检测,主要是通过对图片分析,定位... 查看详情

人脸识别基于mctnn人脸检测(pytorch)(代码片段)

参考:FaceDetector/detect_step_by_step.ipynbatmaster·faciallab/FaceDetector·GitHub中文翻译:从零开始搭建人脸识别系统(一)MTCNN-知乎1、网络结构mtcnn算法人脸检测过程分为三个独立的stage,每一个stage对应一个卷积网络... 查看详情

人工智能之基于face_recognition的人脸检测与识别(代码片段)

...趣,今天抽时间研究一下,其实没那么复杂。我基本上是基于https://github.com/ageitgey/face_recognition上的资料和源码做一些尝试和试验。首先,需要配置我们的python环境,我悬着的python27(比较稳定),具体过程不多说了。然后,需要安... 查看详情

opencv+openvino实现人脸landmarks实时检测(代码片段)

...块之后,OpenCV对DNN模块支持最好的表现之一就是开始支持基于深度学习人脸检测,OpenCV本身提供了两个模型分别是基于Caffe与Tensorflow的,Caffe版本的模型是半精度16位的,tensorflow版本的模型是8位量化的。同时OpenCV通过与OpenVINOIE... 查看详情

opencv调用手机摄像头与人脸检测(代码片段)

...、参考文献一、OpenCV机器视觉环境搭建1.OpenCV下载本文是基于Windows上Anaconda的OpenCV,在下载OpenCV前需要通过Anconda安装pyth 查看详情

计算机视觉项目-人脸识别与检测(代码片段)

😊😊😊欢迎来到本博客😊😊😊本次博客内容将继续讲解关于OpenCV的相关知识🎉作者简介:⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉深度学习&... 查看详情

使用tensorrt对人脸检测网络mtcnn进行加速(代码片段)

...于训练人脸比对算法,是使用官方版本的MTCNN,该版本是基于Caffe的Matlab接口的,跑起来很慢,差不多要一秒钟一张图片,处理完几万张图片一天就过去了,好在效果不错。训练完人脸特征提取的网络以后,想要部署整个人脸比... 查看详情

[译]人脸检测与人脸识别简介(代码片段)

From: http://www.shervinemami.co.cc/faceRecognition.htmlTranslatedby11“人脸识别”是一个在计算机视觉和生物特征识别领域十分活跃的话题。这个主题已经被给力地研究了25年,并且最终在安全、机器人学、人机交互、数码摄像机、游戏和... 查看详情