人脸识别引擎SeetaFaceEngine中Alignment模块使用的测试代码

人脸识别引擎SeetaFaceEngine中Alignment模块用于检测人脸关键点,包括5个点,两个眼的中心、鼻尖、两个嘴角,以下是测试代码:

int test_alignment()
{
	std::vector<std::string> images{ "1.jpg", "2.jpg", "3.jpg", "4.jpeg", "5.jpeg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg",
		"11.jpeg", "12.jpg", "13.jpeg", "14.jpg", "15.jpeg", "16.jpg", "17.jpg", "18.jpg", "19.jpg", "20.jpg" };
	std::vector<int> count_faces{ 1, 2, 6, 0, 1, 1, 1, 2, 1, 1,
		1, 1, 1, 1, 1, 1, 1, 0, 8, 2 };

	const std::string path_images{ "E:/GitCode/Face_Test/testdata/" };

	seeta::FaceDetection detector("E:/GitCode/Face_Test/src/SeetaFaceEngine/FaceDetection/model/seeta_fd_frontal_v1.0.bin");

	detector.SetMinFaceSize(20);
	detector.SetMaxFaceSize(200);
	detector.SetScoreThresh(2.f);
	detector.SetImagePyramidScaleFactor(0.8f);
	detector.SetWindowStep(4, 4);

	seeta::FaceAlignment point_detector("E:/GitCode/Face_Test/src/SeetaFaceEngine/FaceAlignment/model/seeta_fa_v1.1.bin");

	for (auto name : images) {
		fprintf(stderr, "start detect image: %s\n", name.c_str());

		cv::Mat src_ = cv::imread(path_images + name, 1);
		if (src_.empty()) {
			fprintf(stderr, "read image error: %s\n", name.c_str());
			continue;
		}

		cv::Mat src;
		cv::cvtColor(src_, src, CV_BGR2GRAY);

		seeta::ImageData img_data;
		img_data.data = src.data;
		img_data.width = src.cols;
		img_data.height = src.rows;
		img_data.num_channels = 1;

		std::vector<seeta::FaceInfo> faces = detector.Detect(img_data);

		for (auto face : faces) {
			// Detect 5 facial landmarks: two eye centers, nose tip and two mouth corners
			seeta::FacialLandmark points[5];
			point_detector.PointDetectLandmarks(img_data, face, points);

			cv::rectangle(src_, cv::Rect(face.bbox.x, face.bbox.y,
				face.bbox.width, face.bbox.height), cv::Scalar(0, 255, 0), 2);

			for (auto point : points) {
				cv::circle(src_, cv::Point(point.x, point.y), 2, cv::Scalar(0, 0, 255), 2);
			}
		}

		std::string save_result = path_images + "_" + name;
		cv::imwrite(save_result, src_);
	}

	int width = 200;
	int height = 200;
	cv::Mat dst(height * 5, width * 4, CV_8UC3);
	for (int i = 0; i < images.size(); i++) {
		std::string input_image = path_images + "_" + images[i];
		cv::Mat src = cv::imread(input_image, 1);
		if (src.empty()) {
			fprintf(stderr, "read image error: %s\n", images[i].c_str());
			return -1;
		}

		cv::resize(src, src, cv::Size(width, height), 0, 0, 4);
		int x = (i * width) % (width * 4);
		int y = (i / 4) * height;
		cv::Mat part = dst(cv::Rect(x, y, width, height));
		src.copyTo(part);
	}
	std::string output_image = path_images + "result.png";
	cv::imwrite(output_image, dst);

	return 0;
}
从网上找了20张图像,用于测试此模块,测试结果如下:


GitHubhttps://github.com/fengbingchun/Face_Test

Insightface是一个基于MXNet的深度学习框架,专门用于人脸识别和人脸分析任务。下面是使用Insightface进行人脸识别的步骤: 1. 安装Insightface包:可以使用pip install insightface来安装。 2. 准备人脸数据集:需要准备一个包含人脸图像和对应标签的数据集,可以使用自己的数据集或者使用公开数据集。 3. 加载预训练模型:Insightface提供了多个预训练模型,可以根据自己的需求选择相应的模型进行加载。 4. 进行人脸检测和对齐:使用Insightface提供的人脸检测和对齐函数,将输入图像的人脸进行检测和对齐,生成对齐后的人脸图像。 5. 提取人脸特征:使用预训练模型提取对齐后的人脸图像的特征向量。 6. 进行人脸识别:将提取的特征向量与已知的人脸特征向量进行比对,计算相似度,从而进行人脸识别。 7. 输出识别结果:根据相似度大小,可以得出最终的识别结果,输出对应的标签或者人名。 可以使用以下代码实现基本的人脸识别功能: ``` import cv2 import numpy as np import insightface # 加载预训练模型 model = insightface.model_zoo.get_model('arcface_r100_v1') # 加载数据集 dataset = insightface.utils.face_dataset.load_facebank('./data') # 创建人脸检测器和对齐器 detector = insightface.model_zoo.get_model('retinaface_r50_v1') alignment = insightface.model_zoo.get_model('arcface_r100_v1') # 加载测试图像 img = cv2.imread('./test.jpg') # 进行人脸检测和对齐 faces = detector.detect(img) aligned = [] for face in faces: bbox, landmarks = face aligned_face = alignment.align(img, bbox, landmarks) aligned.append(aligned_face) # 提取特征向量 features = [] for face in aligned: feature = model.get_embedding(face) features.append(feature) # 进行人脸识别 similarities = [] for feature in features: similarity = [] for db_feature in dataset['feature']: score = np.dot(feature, db_feature) / (np.linalg.norm(feature) * np.linalg.norm(db_feature)) similarity.append(score) similarities.append(similarity) # 输出识别结果 for i, similarity in enumerate(similarities): max_index = np.argmax(similarity) max_score = similarity[max_index] if max_score > 0.8: print('Person %d: %s' % (i, dataset['name'][max_index])) else: print('Person %d: Unknown' % i) ``` 需要注意的是,以上代码仅为基本的人脸识别流程,并没有考虑实际应用可能遇到的各种问题,如光照、姿态、遮挡等。在实际应用需要根据具体需求进行相应的优化和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值