前言
SeetfaFace6是2020年初开放出来的。因为其效率要比Seetaface2更高,尤其是regonition这块(v2的模型size大概有100MB,而v6提供了light模型,只有4.5MB)。 所以在跑通seetaface2代码后,紧接着开始研究运行v6的代码。
模块
Seetaface6的代码不如v2的紧凑,在github上提供的是独立且零散模块,需要一个个单独去编译,而不像v2那样可以在vs里面一把就全部可以把库以及example编译和运行。 其基本模块如下图所示。
编译注意事项
跟v2编译流程不同的是,在正式编译人脸检测(FaceBoxes),关键点(Landmarker)以及识别(FaceRecognized6)之前,需要先编译三个基础模块:
OpenRoleZoo: 常用操作函数的集合
TenniS: 模型前向推理框架
SeetaAuthorize:模型解密库
这三个项目都没有第三方库的依赖,所以在cmake后再双击其sln(记得以管理员权限打开visual studio)就可以成功编译和install 。注意,如果cmake时没有指定install路径,那么其缺省路径就是:C:\Program Files (x86)/
人脸检测库的编译
上面说过, FaceBoxes项目对应的功能就是人脸检测。 但是在其cmake时会遇到下面这个错误:
明明我前面已经compile和install过SeetaAuthorize模块,但是这里还是找不到该模块的cmake文件。 后来经过分析,才发现其对应的安装路径下面为
该cmake文件表明,对于SeetaAuthorize模块而言,install完后本来就是没有那两个cmake文件的。所以我们要做的是在FaceDetector目录下的CMakeLists.txt注释掉find_package那行代码,如下所示。
这样,FaceBoxes的cmake就可以通过,如下所示:
cmake成功后,就可以开始编译sln项目了,当然编译前还要记得把前面三个基础模块的include目录,lib库路径 以及lib名字都输入到该项目属性框对应的位置以保证编译成功。
编译成功后,最好跑下examle代码来证明前面的工作是对的。 注意,FaceBoxes自带的example代码有问题,里面所带的模型“.../FaceBox/torch-faceboxes/model.json”以及测试图片都找不到。 所以需要自己找一段测试代码如下所示来验证前面的编译的库是可以正确被调用和运行的。 当然在编译example代码成可执行文件时,需要把opencv库和头文件添加进来。
seeta::ModelSetting FD_model("D:/workseetaface/SeetaFace6-master/models/sf3.0_models/face_detector.csta", device, id);
seeta::FaceDetector FD(FD_model);
FD.set(seeta::FaceDetector::PROPERTY_MIN_FACE_SIZE, 80);
// Open default USB camera
cv::VideoCapture capture;
capture.open(0);
cv::Mat frame;
while (capture.isOpened())
{
capture >> frame;
if (frame.empty()) continue;
cv::resize(frame, frame, cv::Size(320, 240));
SeetaImageData simg;
simg.height = frame.rows;
simg.width = frame.cols;
simg.channels = frame.channels();
simg.data = frame.data;
auto face_infos = FD.detect(simg);
for (int i = 0; i < face_infos.size; ++i)
{
int64_t target_index = -1;
float max_sim = 0;
auto &face = face_infos.data[i];
// similarity greater than threshold, means recognized
/*if (max_sim > threshold)
{
cv::putText(frame, vec_name_2_feat[target_index].first, cv::Point(face.pos.x, face.pos.y - 5), CV_FONT_HERSHEY_COMPLEX, 1, CV_RGB(0, 0, 255));
}*/
}
cv::imshow("Frame", frame);
auto key = cv::waitKey(20);
if (key == 27)
{
break;
}
}