目录
一、概述
1.1 系统设计背景和意义
人脸识别技术利用百度AI(百度人工智能)的先进算法和机器学习模型,能够高效地识别和分析图像或视频中的人脸。这种技术不仅限于简单的人脸检测和定位,它还包括复杂的特征提取和身份分类过程。在实际应用中,百度AI的人脸识别技术广泛应用于安防领域(如门禁系统、视频监控)、金融领域(身份验证)、零售和广告(个性化推荐)、医疗保健(病人管理)、以及教育和娱乐等多个领域。这些应用不仅提升了安全性和效率,还改善了用户体验,例如通过个性化服务和广告推送提高了商业环境下的交互体验。
因此,这些技术不仅仅是技术进步的象征,更是社会发展和安全保障的重要支柱之一。本程序通过调用百度的人脸识别相关的云服务算法,进行开发和搭建,最终实现“人脸注册”和“人脸识别欢迎语提示”等功能。
1.2 所用技术
本程序的最终实现形式为Windows桌面程序,本程序主要采用微软的Winform模式进行开发,编程语言为C#。开发所使用的IDE为Visual Studio,辅助工具为Postman、son格式转换工具、Base64编码工具等。
除此之外,本程序还用到了异步技术、Base64编码技术、Json相关技术、Http传输技术等。其中,异步技术用于实时监测摄像头中出现的图像,Base64编码技术用于对图像进行编码、Json相关技术用于对数据进行统一格式处理、Http传输相关技术用于本程序与百度云服务进行通信。
1.3 运行环境
软件:Windows10 操作系统。
网络:设备连接外网。
二、具体操作概述
2.1 通过百度AI平台获得相关权限
前期注册步骤就省略了哈,直接来到人脸识别的控制台界面
2.1.1 获取接口服务
依照操作指引,在免费尝鲜中领取我们要使用的人脸识别接口
2.1.2 创建应用,并记录下相关数据
紧接着,来到创建应用,我们根据我们的需求以个人名义创建相应的应用
(同时要注意记录下这里的API Key,AppID,和Secret Key这在后序调用API的过程中至关重要)
2.1.3 配置相关文件
进入到调用服务界面中的API官方文档界面,直接按照他的方法,在C#中安装依赖包Baidu.AI即可
跟据上述方法在VS2022中找到相应的依赖包,下载即可
在此过程中还有几个在调用过程中需要的依赖包一并下载
2.1.4 进行人脸库用户的输入
回到我们创建的应用中,创建相应的用户组,并在里面添加想要进行识别的用户图片
至此前期的准备工作已经大概完成了,接下来就可以进行到编码阶段了
2.2 页面设计&代码编写
2.2.1 Winform窗体设计
对于本系统,我们可以大概分为三个功能区,人脸识别信息,人脸比对,比对结果信息,如下图
2.2.2 导入相关API信息
通过前期的API信息的记录将其导入到代码中,实现对API的初步调用
private string APP_ID = "相应的APPID";
private string API_KEY = "相应的API_KEY";
private string SECRET_KEY = "相应的SECRET_KEY";
private Face client = null;
private bool IsStart = false;
private FaceLocation location = null;
private FilterInfoCollection videoDevices = null;
private VideoCaptureDevice videoSource;
2.2.3 功能函数
图片信息类型转化
public string ConvertImageToBase64(Image file)
{
using (MemoryStream memoryStream = new MemoryStream())
{
file.Save(memoryStream, file.RawFormat);
byte[] imageBytes = memoryStream.ToArray();
return Convert.ToBase64String(imageBytes);
}
}
读入照片
public string ReadImg(string img)
{
return Convert.ToBase64String(File.ReadAllBytes(img));
}
public string ReadImg(string img)
{
return Convert.ToBase64String(File.ReadAllBytes(img));
}
连接并打开摄像头
private void CameraConn()
{
if (comboBox1.Items.Count<=0)
{
MessageBox.Show("请插入视频设备");
return;
}
videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);
videoSource.DesiredFrameRate = 1;
videoSourcePlayer1.VideoSource = videoSource;
videoSourcePlayer1.Start();
}
2.2.4 核心代码——提取人脸信息
这段代码是一个用于人脸检测和分析的方法 Detect
。方法接受一个 image
参数,首先检查其是否非空且为 Bitmap
类型的对象。使用 client.Detect
方法调用百度AI的人脸检测服务,传入图像的 Base64 编码字符串 image1
和类型 imageType
,同时传递可选参数 options
。将返回的 JSON 格式结果反序列化为 FaceDetectInfo
对象 detect
。检查 detect
对象及其属性,包括检测到的人脸数 result_num
,以及每个人脸的具体信息。根据返回的人脸信息,对每张检测到的人脸进行质量评估,包括模糊度、完整度、光线质量、遮挡情况等。根据不同的质量指标和阈值,生成对应的诊断信息,存入 StringBuilder
对象 sb
。最终输出诊断结果或异常信息。
public void Detect(object image)
{
if (image!=null && image is Bitmap)
{
try
{
Bitmap img = (Bitmap)image;
var imgByte = Bitmap2Byte(img);
Image im =img ;
string image1 = ConvertImageToBase64(im);
string imageType = "BASE64";
if (imgByte != null)
{
// 如果有可选参数
var options = new Dictionary<string, object>{
{"max_face_num", 2},
{"face_fields", "age,qualities,beauty"}
};
var result = client.Detect(image1, imageType,options);
FaceDetectInfo detect = JsonHelper.DeserializeObject<FaceDetectInfo>(result.ToString());
if (detect!=null && detect.result_num>0)
{
ageText.Text = detect.result[0].age.TryToString();
this.location = detect.result[0].location;
StringBuilder sb = new StringBuilder();
if (detect.result[0].qualities != null)
{
if (detect.result[0].qualities.blur >= 0.7)
{
sb.AppendLine("人脸过于模糊");
}
if (detect.result[0].qualities.completeness >= 0.4)
{
sb.AppendLine("人脸不完整");
}
if (detect.result[0].qualities.illumination <= 40)
{
sb.AppendLine("灯光光线质量不好");
}
if (detect.result[0].qualities.occlusion!=null)
{
if (detect.result[0].qualities.occlusion.left_cheek>=0.8)
{
sb.AppendLine("左脸颊不清晰");
}
if (detect.result[0].qualities.occlusion.left_eye >= 0.6)
{
sb.AppendLine("左眼不清晰");
}
if (detect.result[0].qualities.occlusion.mouth >= 0.7)
{
sb.AppendLine("嘴巴不清晰");
}
if (detect.result[0].qualities.occlusion.nose >= 0.7)
{
sb.AppendLine("鼻子不清晰");
}
if (detect.result[0].qualities.occlusion.right_cheek >= 0.8)
{
sb.AppendLine("右脸颊不清晰");
}
if (detect.result[0].qualities.occlusion.right_eye >= 0.6)
{
sb.AppendLine("右眼不清晰");
}
if (detect.result[0].qualities.occlusion.chin >= 0.6)
{
sb.AppendLine("下巴不清晰");
}
if (detect.result[0].pitch>=20)
{
sb.AppendLine("俯视角度太大");
}
if (detect.result[0].roll>=20)
{
sb.AppendLine("脸部应该放正");
}
if (detect.result[0].yaw>=20)
{
sb.AppendLine("脸部应该放正点");
}
}
}
if (detect.result[0].location.height<=100 || detect.result[0].location.height<=100)
{
sb.AppendLine("人脸部分过小");
}
textBox4.Text = sb.ToString();
if (textBox4.Text.IsNull())
{
textBox4.Text = "OK";
}
}
}
}
catch (Exception ex)
{
ClassLoger.Error("Form1.image", ex);
}
}
}
这里我们上传布拉德皮特的照片,看下他的面部数据吧
最终系统给他的评分是93.86,也算是真实情况了
2.2.5 核心代码——人脸比对
private void button2_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox2.Text) || string.IsNullOrEmpty(textBox3.Text))
{
MessageBox.Show("请选择要对比的人脸图片");
return;
}
try
{
string path1 = textBox2.Text;
string path2 = textBox3.Text;
var faces = new JArray
{
new JObject
{
{"image", ReadImg(path1)},
{"image_type", "BASE64"},
{"face_type", "LIVE"},
{"quality_control", "LOW"},
{"liveness_control", "NONE"},
},
new JObject
{
{"image", ReadImg(path2)},
{"image_type", "BASE64"},
{"face_type", "LIVE"},
{"quality_control", "LOW"},
{"liveness_control", "NONE"},
}
};
// 带参数调用人脸比对
var result = client.Match(faces);
textBox1.Text = result.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
此时我们选择两张照片进行对比,我选择了本人的照片和布拉德皮特的照片进行对比,结果如下
不能说是一模一样,只能说是毫无关系,得分score为4,相似度只有不到百分之五啊
三、总结与展望
最终通过程序,我们实现了对百度AI人脸识别应用的调用,并且,通过下载相关的依赖包,将我们想要进行识别和对比的图片输入到程序中,并且调用API,对图片进行分析,主要实现了图片中人物头像数据相关信息的读取,以及对两张照片相似度的对比,并以本人和皮特的例子进行证明现在的人脸识别功能还是非常厉害的
无论如何,仍会有更厉害的模型和想法产生,一起加油吧