美文网首页基于OSX系统的眼动追踪
基于Xcode10的Seetaface人脸检测

基于Xcode10的Seetaface人脸检测

作者: 宇宙巨炮 | 来源:发表于2019-04-03 00:24 被阅读0次

未经本人授权,禁止转载


1. 简介

毕业设计需要用到人脸检测,本人对此并不了解,导师推荐了几个近几年比较新的算法,决定先来试试这个山世光老师的Seetaface,那么废话不多说,我们一起开始吧。


2. 准备

2.1 下载Seetaface引擎

继Seetaface之后,山世光团队公布了Seetaface2。这里使用Seetaface,贴出Github Seetaface

2.2 其他工具

OpenCV 2.4.13.1
CMake 3.7.2
推荐使用homebrew进行安装,如果不会的话请自行百度(百度有很多详细教程,这里就不介绍啦)。


3. 生成动态链接库

这里借鉴了seutwom_J的简书,在此表示衷心的感谢。

正式开始吧,Seetaface总共包含FaceDetection、FaceAlignment、FaceIdentification三个模块,简单的可以理解为这三个模块循序渐进的实现了人脸检测。第一个FaceDetection模块给出的示例是检测人脸,第二个FaceAlignment模块给出的示例是检测五官,第三个FaceIdentification模块给出的示例是人脸相似度检测。此次只用到了前两个模块,以后有机会会尝试使用第三个模块。

3.1 FaceDetection

在终端进入FaceDetection目录下,依次执行每行命令:

mkdir build
cd build
cmake ..
make

执行完make后得到如下结果:

在终端继续执行命令:

./facedet_test ../data/0_1_1.jpg ../model/seeta_fd_frontal_v1.0.bin

执行完后得出如下结果:

测试结果表示FaceDetection模块的动态链接库已经编译成功了。

3.2 FaceAlignment

在终端进入FaceAlignment目录下,依次执行每行命令:

mkdir build
cd build

将FaceDetection中的/include/face_detection.h和/build/libseeta_facedet_lib.dylib和/model/seeta_fd_frontal_v1.0.bin拷贝到/FaceAlignment/build文件夹下。如下:

修改FaceAlignment目录中的CMakeLists.txt的第一行为:

cmake_minimum_required(VERSION 3.0)

修改FaceAlignment中的/src/test/face_alignmen_test.cpp文件,将第47、48、54行的路径修改为"../data/"、"../model/"、"../build/seeta_fd_frontal_v1.0.bin",如下:

在终端继续依次执行每行命令:

cmake ..
make

执行完make后得到如下结果:

在终端继续执行命令:

./fa_test

在FaceAlignment中的/build目录下生成了图片文件"result.jpg"如下:

测试结果表示FaceAlignment模块的动态链接库已经编译成功了,至此为止我们需要的东西都已经准备就绪,赶紧正式开始使用Seetaface吧。


4. 配置Xcode环境

  • 创建新项目,选择Command line Tool,语言选择C++
  • 配置OpenCV
    找到你的OpenCV文件夹,如果你是使用homebrew下载的,那么路径应该是/usr/local/Cellar/opencv@2/2.4.13.7_2,如下:

将lib文件夹内的所有文件拖入项目设置General中的Linked Frameworks and LibraLibraries中:

在Build Settings中添加环境变量(根据自己的路径):

注意在Build Settings中修改一下Documentation Comments,忽略掉第三方注释:

OpenCV配置完毕。

  • 配置Seetaface
    将/FaceAlignment/build目录中的两个.dylib文件拖入项目设置General中的Linked Frameworks and LibraLibraries中,并修改Required为Optional:

关键的一步,同时将这两个.dylib文件拷贝到项目文件夹Products中:

在Build Settings中添加环境变量(根据自己的路径):

最后一步,将/FaceDetection/model/seeta_fd_frontal_v1.0.bin和/FaceAlignment/model/seeta_fa_v1.1.bin两个训练模型放入项目文件夹中:

至此为止所有训练模型配置完毕,环境变量配置完毕,动态链接库添加完毕。


5. 示例代码测试

直接拷贝以下代码到main.cpp中,一定注意设置好路径。

#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>

#include "face_detection.h"
#include "face_alignment.h"

int main()
{
    // Initialize face detection model
    seeta::FaceDetection detector("seeta_fd_frontal_v1.0.bin");//相对路径
    detector.SetMinFaceSize(40);
    detector.SetScoreThresh(2.f);
    detector.SetImagePyramidScaleFactor(0.8f);
    detector.SetWindowStep(4, 4);
    
    // Initialize face alignment model
    seeta::FaceAlignment point_detector("seeta_fa_v1.1.bin");//相对路径
    
    //load image
    IplImage *img_grayscale = NULL;
    img_grayscale = cvLoadImage("image_0001.png", 0);//相对路径
    if (img_grayscale == NULL)
    {
        return 0;
    }
    
    IplImage *img_color = cvLoadImage("image_0001.png", 1);//相对路径
    int pts_num = 5;
    int im_width = img_grayscale->width;
    int im_height = img_grayscale->height;
    unsigned char* data = new unsigned char[im_width * im_height];
    unsigned char* data_ptr = data;
    unsigned char* image_data_ptr = (unsigned char*)img_grayscale->imageData;
    int h = 0;
    for (h = 0; h < im_height; h++) {
        memcpy(data_ptr, image_data_ptr, im_width);
        data_ptr += im_width;
        image_data_ptr += img_grayscale->widthStep;
    }
    
    seeta::ImageData image_data;
    image_data.data = data;
    image_data.width = im_width;
    image_data.height = im_height;
    image_data.num_channels = 1;
    
    // Detect faces
    std::vector<seeta::FaceInfo> faces = detector.Detect(image_data);
    int32_t face_num = static_cast<int32_t>(faces.size());
    
    if (face_num == 0)
    {
        delete[]data;
        cvReleaseImage(&img_grayscale);
        cvReleaseImage(&img_color);
        return 0;
    }
    
    // Detect 5 facial landmarks
    seeta::FacialLandmark points[5];
    point_detector.PointDetectLandmarks(image_data, faces[0], points);
    
    // Visualize the results
    cvRectangle(img_color, cvPoint(faces[0].bbox.x, faces[0].bbox.y), cvPoint(faces[0].bbox.x + faces[0].bbox.width - 1, faces[0].bbox.y + faces[0].bbox.height - 1), CV_RGB(255, 0, 0));
    for (int i = 0; i<pts_num; i++)
    {
        cvCircle(img_color, cvPoint(points[i].x, points[i].y), 2, CV_RGB(0, 255, 0), CV_FILLED);
    }
    cvSaveImage("result.jpg", img_color);
    
    // Release memory
    cvReleaseImage(&img_color);
    cvReleaseImage(&img_grayscale);
    delete[]data;
    return 0;
}

最后得到结果如下:

后续就可以参照Seetaface给出的示例代码进行自己的开发了。


最后希望大家能关注一下,点个喜欢,后续一定会有更多高质量的干货,感谢不尽!

相关文章

网友评论

    本文标题:基于Xcode10的Seetaface人脸检测

    本文链接:https://www.haomeiwen.com/subject/zsygbqtx.html