一、项目简介
本项目利用百度AI的人脸识别技术,基于VS2022中的winform平台开发实现人脸检测、人脸比对、人脸登录的应用程序。
二、技术栈
项目所包括的技术栈可以归纳如下:
C#语言:用于后端开发和相关逻辑编写
ASP.NET:用于构建Web应用程序的框架
Entity Framework:用于数据库管理和操作的ORM(对象关系映射)工具
SQL Server:Microsoft的关系型数据库管理系统
HTML、CSS、JavaScript:用于前端开发和用户界面设计
ASP.NET Web API:用于创建可供外部系统或设备访问的API接口
图像处理库:如OpenCV或Emgu CV,用于图像处理和人脸识别
网络连接:HTTP/HTTPS协议、TCP/IP协议等网络通信技术
文件处理:文件上传、下载、存储等相关技术
三、百度AI注册使用
1、百度AI注册
进入百度AI开放平台,选择人脸识别云服务进行注册。
2、创建应用、组别
3、创建人脸识别库,并导入照片。
四、界面设计
控件:button、textbox、lable、panel、videosourceplayer
界面如下:
五、代码实现
1、声明API密钥
在创建的应用中将对应的APP_ID、API_KEY、SECERT_KEY输入。API_KEY、SECERT_KEY是两个私有字符串变量,被用来存储从BaiduAI开放平台获得的API密钥和秘密密钥。
private string APP_ID = "";
private string API_KEY = "";
private string SECRET_KEY = "";
2、图片转化
public string ConvertImageToBase64(Image file)
{
using (MemoryStream memoryStream = new MemoryStream())
{
file.Save(memoryStream, file.RawFormat);
byte[] imageBytes = memoryStream.ToArray();
return Convert.ToBase64String(imageBytes);
}
}
3、读入图片
public string ReadImg(string img)
{
return Convert.ToBase64String(File.ReadAllBytes(img));
}
4、摄像头连接
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();
}
摄像头连接成功
5、人脸检测
首先接受并处理图像数据,然后调用百度人脸检测API,并返回检测结果,再解析并显示人脸检测结果,提取出人脸的位置、年龄、模糊程度等信息,并在用户界面上显示这些信息。
部分代码如下:
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].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);
}
}
}
6、人脸对比
人脸对比功能允许用户上传两张图像,或者选择已存储的模板图像与实时捕获的图像进行比对。
系统会将这两张图像中的人脸进行特征提取,并计算它们之间的相似度,并对人脸质量进行评测。
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);
}
}
选择图片进行比对:
7、人脸登录
通过获取连接摄像头,识别当前图像并与在百度AI人脸库中存入的所有人脸图片对比,如果相似度高于某个阈值则,返回这个人脸的名字,即登录成功。这里就不做详细展示了。
六、总结体会
本次实现了一个百度AI人脸识别项目。该项目主要实现了以下功能:
(1)人脸检测:此功能使用百度AI平台的人脸检测API,通过用户上传的图像或摄像头实时捕获的视频帧,检测并标记出图像中的人脸。人脸检测能够确定图像中人脸的位置、大小以及数量,并返回人脸的矩形框坐标。
(2)人脸比对:人脸比对功能允许用户上传两张图像,或者选择已存储的模板图像与实时捕获的图像进行比对。百度AI平台的人脸比对API提供了高精度的人脸特征比对服务,能够判断两张图像中的人脸是否属于同一人,并对人脸质量进行评测。
(3)人脸登录:人脸登录功能允许用户通过人脸识别进行登录操作,而无需输入密码或进行其他形式的身份验证。
在百度AI人脸识别这个项目中,网络连接是一个比较难的点,解决难点问题能帮助开发人员有效地应对复杂的实际应用需求,提升开发人员的项目实践能力,进一步加强专业技能能力。