seetaface,是中科院计算机所山世光老师所带领的团队开发出来的人脸识别库,开源免费可用,据说识别率可达97.1%,实测下来,识别率确实是蛮高的,比opencv自带的人脸识别功能强多了。

在此,感谢开源的分享精神,可以让我们这些软件开发工程师们站在巨人的肩膀上,做一些解决实际问题的项目。同时,避免了大量重复造轮子的工作。

本文主要记录了花费5天的时间,基于seetaface,开发一个小型的人脸识别登录系统。并提供代码下载。

seetaface分为FaceDetection(人脸检测)、FaceAlignment(人脸对齐)、FaceIdentification(人脸识别)三个模块,三个模块相互独立,综合利用起来即可实现最终的人脸识别功能。

1、FaceDetection

const char* img_path = "2.jpg";
  seeta::FaceDetection detector("seeta_fd_frontal_v1.0.bin");//seeta_fd_frontal_v1.0.bin 文件是作者已经训练好并提供的
  //设置人脸检测的参数
  detector.SetMinFaceSize(40);
  detector.SetScoreThresh(2.f);
  detector.SetImagePyramidScaleFactor(0.8f);
  detector.SetWindowStep(4, 4);

  cv::Mat img = cv::imread(img_path, cv::IMREAD_UNCHANGED);
  cv::Mat img_gray;

  if (img.channels() != 1)
    cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY);
  else
    img_gray = img;

  seeta::ImageData img_data;
  img_data.data = img_gray.data;//注意这里必须是单通道的图像
  img_data.width = img_gray.cols;
  img_data.height = img_gray.rows;
  img_data.num_channels = 1;

  long t0 = cv::getTickCount();
  std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);//人脸检测的主要函数
  long t1 = cv::getTickCount();
  double secs = (t1 - t0)/cv::getTickFrequency();

  cout << "Detections takes " << secs << " seconds " << endl;
#ifdef USE_OPENMP
  cout << "OpenMP is used." << endl;
#else
  cout << "OpenMP is not used. " << endl;
#endif

#ifdef USE_SSE
  cout << "SSE is used." << endl;
#else
  cout << "SSE is not used." << endl;
#endif

  cout << "Image size (wxh): " << img_data.width << "x" 
      << img_data.height << endl;

  cv::Rect face_rect;
  int32_t num_face = static_cast<int32_t>(faces.size());

  for (int32_t i = 0; i < num_face; i++) //提取找到的人脸区域
  {
    face_rect.x = faces[i].bbox.x;
    face_rect.y = faces[i].bbox.y;
    face_rect.width = faces[i].bbox.width;
    face_rect.height = faces[i].bbox.height;

    cv::rectangle(img, face_rect, CV_RGB(0, 0, 255), 4, 8, 0);
  }

  cv::namedWindow("Test", cv::WINDOW_AUTOSIZE);
  cv::imshow("Test", img);
  cv::waitKey(0);
  cv::destroyAllWindows();
运行效果如下图所示:



2、FaceAlignment

运行效果如下图所示



3、FaceIdentification

其主要为计算两张图片中人脸的相似度。输入为两张图片,经过前面人脸检测,人脸对齐,得到人脸的特征,输出为人脸相似度。

作者提供的人脸相似度试验,同一张照片,其相似度可为1。

博主以自己不同环境下拍摄的照片做实验,可得到如下图所示的结果。可以发现,几乎都在0.6分以上。


然后又对比了博主与另外一个人不同环境下的脸,结果如下图所示,可以发现相似度都在0.5以下



那么,博主得到了这样的结论:相似度在0.7分以下,为不同的人脸,0.7分以上为同一个人的脸,有了这个结论,就可以用seetaface来开发一个小型的人脸识别登录系统了。

其他注意事项:

1、下载了别人的代码和工程,特别想要直接可以跑起来,最头疼的是各种报错,请参考我的博文 包含目录、库目录等注意事项

2、提供修改后的和部分注释的seetaface下载,分为三部分 人脸检测 人脸对齐 人脸识别

3、如果不想调试作者的源代码,想要跟opencv一样直接使用,仅需要lib dll include即可,点击下载


最终,基于seetaface的人脸识别demo开发出来了,可以添加人脸,删除人脸,识别人脸,点击下载 。因为上传文件大小的限制,把seeaface所需的三个bin文件放到了百度云盘,链接:http://pan.baidu.com/s/1qYGW84c 密码:in6o 下载后,将其放到model文件夹中即可运行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐