# FindFaceInVideo
人脸识别的小 demo,通过待识别的人脸图像在视频影像中找人。
随着深度学习和卷积神经网络的发展,人脸识别的技术已经很成熟了,有很多基于人脸识别的应用和产品已经进入了大众的生活,比如 iPhone X 的 Face ID,人脸打卡,地铁站火车站的人脸刷票,人脸支付等等。还有一类应用就是通过人脸识别的技术找人,百度已经在使用该技术帮助寻找失踪儿童了,甚至有机场和车站可以通过人脸识别寻找可疑人员。相信人脸识别未来的应用场景会越来越多,越来越深入大家的生活。 本文讨论通过人脸识别在视频中找人的实现方法。
先上效果图:
![](https://www.writebug.com/myres/static/uploads/2022/1/2/ee569eaecc99abae7d2555133ab9c771.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/2/351871d303522aa6a07373da36557cf6.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/1/2/060348f991290c373422a3973e9f5499.writebug)
思路是这样的,目的是要在给定图片或者视频中找人,核心要解决的就是两件事,一个是人脸的识别,一个是人脸特征的比较。相似度越高,那么就意味着人找到了。
## 0、环境搭建
需要安装:opencv2,caffe,Python2.7
## 1、人脸识别
人脸识别实现的选择,我本想使用卷积神经网络训练出人脸识别的模型,输出人脸的位置,但是发现训练的效果不理想,只好换方案了。
最终我使用了 SeetaFaceEngine 的实现方案,原项目地址:[https://github.com/seetaface/SeetaFaceEngine](https://link.zhihu.com/?target=https%3A//github.com/seetaface/SeetaFaceEngine)。只使用其中的 FaceDetection 和 FaceAlignment,并对 FaceAlignment/src/test/face_alignment_test.cpp 做了修改。
实际上这一步是最重要的,人脸识别模型识别率越高,找人的效果越好,需要花费时间反复调优模型。资源所限,还有我的训练集的限制,这里放弃自己训练的模型,改用 SeetaFaceEngine 实现,实际效果上还是堪用的。
核心代码逻辑:FaceDetection 负责人脸位置的识别,FaceAlignment 进行人脸对齐(仿射变换),将对齐后的人脸图片保存,作为后续人脸特征比较时使用。
核心代码:
```cpp
seeta::FaceDetection detector("seeta_fd_frontal_v1.0.bin");
bool procFaceImage(string fullpath, string path, string filename, string ext, string dst_path, string in_size)
{
// 人脸识别模型初始化
detector.SetMinFaceSize(40);
detector.SetScoreThresh(2.f);
detector.SetImagePyramidScaleFactor(0.8f);
detector.SetWindowStep(4, 4);
// 人脸对齐模型初始化
seeta::FaceAlignment point_detector((MODEL_DIR + "seeta_fa_v1.1.bin").c_str());
//加载参数传入的图像,灰度图,用于人脸识别
IplImage *img_grayscale = NULL;
img_grayscale = cvLoadImage(/*(DATA_DIR + "image_0001.jpg")*/fullpath.c_str(), 0);
if (img_grayscale == NULL)
{
printf("%s\n", fullpath.c_str());
printf("[0]img_grayscale == NULL\n");
return false;
}
//缩小尺寸过大的图像,如果图像像素太大的话,会影响识别效果。
IplImage *outImg = NULL;
while(img_grayscale->width > 1024 + 1024 || img_grayscale->height > 768 + 512 ){
outImg = cvCreateImage(cvSize(img_grayscale->width / 2, img_grayscale->height / 2),
img_grayscale->depth,
img_grayscale->nChannels);
cvPyrDown(img_grayscale, outImg);
img_grayscale = outImg;
}
//调用FaceDetection做人脸识别,支持一张图多个人脸
printf("detectFace now!\n");
seeta::ImageData image_data;
std::vector<seeta::FaceInfo> faces = detectFace(img_grayscale, &image_data);
if (faces.size() == (0)) {
printf("[1]detectFace error!\n");
return false;
}
printf("face number = %d\n",faces.size());
printf("PointDetectLandmarks now!\n");
//准备好要保存的位置和文件名
string result_path = (/*path*/dst_path + "/" + filename + "_result." + ext);
// Detect 5 facial landmarks
seeta::FacialLandmark points[5];
//又一次加载参数传入的图像,彩色图,大图缩减
{
IplImage *img_color = cvLoadImage(/*(DATA_DIR + "image_0001.jpg")*/fullpath.c_str(), 1);
while(img_color->width > 1024 + 1024 || img_color->height > 768 + 512 ){
outImg = cvCreateImage(cvSize(img_color->width / 2, img_color->height / 2),
img_color->depth,
img_color->nChannels);
cvPyrDown(img_color, outImg);
img_color = outImg;
}
//将找到的人脸位置在彩色图上画出矩形框,保存图片,图片名称类似于:IMG_3001_result.JPG
for(int idx = 0;idx < faces.size(); idx++){
cvRectangle(img_color, cvPoint(faces[idx].bbox.x, faces[idx].bbox.y), cvPoint(faces[idx].bbox.x + faces[idx].bbox.width - 1, faces[idx].bbox.y + faces[idx].bbox.height - 1), CV_RGB(255, 0, 0));
}
cvSaveImage(result_path.c_str(), img_color);
//printf("Show result image\n");
//cvShowImage("result", img_color);
}
//主循环,开始处理每一张脸
for(int idx = 0;idx < faces.size(); idx++){
printf("Proc No.%d\n", idx);
//对每张脸找出landmarks(保存到points)
point_detector.PointDetectLandmarks(image_data, faces[idx], points);
IplImage *img_color = cvLoadImage(/*(DATA_DIR + "image_0001.jpg")*/fullpath.c_str(), 1);
int pts_num = 5;
cv::Mat img = cv::cvarrToMat(img_color);
//仿射变换,根据眼睛坐标进行人脸对齐。利用landmarks算出要旋转的角度,对彩色图做旋转(人脸对齐),然后将旋转后的landmarks坐标保存到points中
//后面要抠图,把人脸保存下来
Mat retImg = getwarpAffineImg(img, points);
Mat dstResizeImg;
IplImage* dstimg_tmp = NULL;
int resize_num = 0;
IplImage qImg = IplImage(retImg);
char ch_idx[3] ={0};
sprintf(ch_idx, "%d", idx);
char ch_size[5] = {0};
sprintf(ch_size, "%d", atoi(in_size.c_str()));
//把旋转后的图片创建灰度图,下面要做一次人脸识别,用来抠图将人脸保存下来
//这里的代码各种图片格式转换,确实很绕:P
IplImage *dst_gray = cvCreateImage(cvGetSize(&qImg), qImg.depth, 1);//
cvCvtColor(&qImg, dst_gray, CV_BGR2GRAY);//
seeta::ImageData image_data_inner;
//对旋转后的图片做人脸识别
std::vector<seeta::FaceInfo> faces_inner = detectFace(dst_gray, &image_data_inner);
if (faces_inner.size() == (0)) {
printf("[2]detectFace error!\n");
return false;
}
char ch_x1[5] = {0};
char ch_y1[5] = {0};
char ch_x2[5] = {0};
char ch_y2[5] = {0};
//idx下标是主循环中的下标,这里默认对旋转后图片人脸识别出的人脸顺序,跟主循环识别出的人脸顺序是一致的
//因为两次人脸识别输入的图像不是同一个,一个是原图像,一个是旋转后的,可能会有不一致的情况,不过目前还没出现过
//所以暂时就默认这样做了,偷个懒~~~~
sprintf(ch_x1, "%d", faces_inner[idx].bbox.x);
sprintf(ch_y1, "%d", faces_inner[idx].bbox.y);
sprintf(ch_x2, "%d", faces_inner[idx].bbox.x + faces_inner[idx].bbox.width);
sprintf(ch_y2, "%d", faces_inner[idx].bbox.y + faces_inner[idx].bbox.height);
string save_path = (/*path*/dst_path + "/" + filename + "_crop_" + ch_size + "_" + ch_idx + "_" + ch_x1 + "_" + ch_y1 + "_" + ch_x2 + "_" + ch_y2 +"." + ext);
try{
//根据这张脸的BBox位置设置ROI,下面要开始抠图了
cvSetImageROI(&qImg, cvRect(faces_inner[idx].bbox.x, faces_inner[idx].bbox.y, faces_inner[idx].bbox.width, faces_in
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于opencv caffe的待识别的人脸图像在视频影像中找人 人脸识别实现的选择,我本想使用卷积神经网络训练出人脸识别的模型,输出人脸的位置,但是发现训练的效果不理想,只好换方案了。 最终我使用了 SeetaFaceEngine 的实现方案,只使用其中的 FaceDetection 和 FaceAlignment,并对 FaceAlignment/src/test/face_alignment_test.cpp 做了修改。 实际上这一步是最重要的,人脸识别模型识别率越高,找人的效果越好,需要花费时间反复调优模型。资源所限,还有我的训练集的限制,这里放弃自己训练的模型,改用 SeetaFaceEngine 实现,实际效果上还是堪用的。 核心代码逻辑:FaceDetection 负责人脸位置的识别,FaceAlignment 进行人脸对齐(仿射变换),将对齐后的人脸图片保存,作为后续人脸特征比较时使用。 核心代码:
资源推荐
资源详情
资源评论
收起资源包目录
基于opencv caffe的待识别的人脸图像在视频影像中找人 代码 毕业设计 (123个子文件)
chengshd_1.avi 21.31MB
tongtong_1.avi 20.96MB
chengshd_2.avi 5.25MB
test.avi 456KB
.DS_Store 18KB
.DS_Store 10KB
.DS_Store 6KB
.DS_Store 6KB
.gitignore 1KB
IMG_3751.JPG 5.04MB
IMG_3747.JPG 4.76MB
IMG_3750.JPG 4.57MB
IMG_3746.JPG 4.47MB
IMG_3748.JPG 4.3MB
IMG_3749.JPG 4.03MB
IMG_3663.JPG 2.19MB
IMG_3664.JPG 2.15MB
IMG_3331.JPG 1.65MB
IMG_3423.JPG 1.6MB
IMG_3224.JPG 1.52MB
1571.JPG 1.47MB
IMG_3665.JPG 1.2MB
IMG_3634.JPG 1.04MB
IMG_3638.JPG 995KB
qingyansi.jpg 661KB
qingyansi.jpg 661KB
IMG_3751-2.jpg 543KB
IMG_3747-2.jpg 539KB
IMG_3750-2.jpg 525KB
IMG_3746-2.jpg 513KB
IMG_3748-2.jpg 502KB
1571_modify.JPG 501KB
IMG_3749-2.jpg 476KB
IMG_3588_result.JPG 276KB
IMG_3664_modify_2.jpg 246KB
IMG_3664_modify.jpg 246KB
quanjiafu.jpg 245KB
IMG_3588.JPG 227KB
me100day_modify.jpg 221KB
IMG_3030_modify_2.jpg 213KB
IMG_3030_modify.jpg 213KB
IMG_3001_result.JPG 210KB
IMG_0468_modify_2.jpg 194KB
IMG_0468_modify_right.JPG 192KB
IMG_0468_modify.jpg 192KB
IMG_0468_modify000.JPG 191KB
IMG_0468.JPG 171KB
IMG_0468.JPG 171KB
IMG_3167_modify_2.jpg 170KB
IMG_3167_modify.jpg 170KB
IMG_3167_result.JPG 157KB
IMG_3030.JPG 110KB
IMG_3179.JPG 107KB
194_modify.jpg 106KB
194.jpg 105KB
94_modify.jpg 105KB
1_modify.jpg 104KB
IMG_3001.JPG 104KB
94.jpg 101KB
104_modify.jpg 90KB
104.jpg 89KB
2_modify.jpg 87KB
qingyansi_modify.jpg 85KB
qingyansi_result.jpg 82KB
qingyansi_result.jpg 82KB
92_modify.jpg 80KB
IMG_3167.JPG 79KB
92.jpg 79KB
1.jpg 77KB
116_modify.jpg 76KB
116.jpg 74KB
84_modify.jpg 73KB
84.jpg 71KB
81_modify.jpg 69KB
81.jpg 68KB
203_modify.jpg 66KB
203.jpg 64KB
2.jpg 59KB
tmp.jpg 46KB
frame_tmp.jpg 43KB
frame_tmp_result.jpg 40KB
IMG_3588_crop_224_0_145_460_652_967.JPG 19KB
IMG_3001_crop_224_0.JPG 12KB
frame_tmp_crop_224_0_114_142_173_201.jpg 8KB
IMG_3167_crop_224_1_354_457_485_588.JPG 8KB
IMG_3167_crop_224_0_530_734_648_852.JPG 7KB
frame_tmp_crop_224_0_118_142_169_193.jpg 7KB
frame_tmp_crop_224_0_117_139_168_190.jpg 7KB
frame_tmp_crop_224_0_116_144_166_194.jpg 7KB
frame_tmp_crop_224_0_121_142_169_190.jpg 7KB
frame_tmp_crop_224_0_118_138_169_189.jpg 7KB
LICENSE 1KB
README.md 34KB
IMG_3224.MOV 3.32MB
IMG_3664.MOV 3.19MB
IMG_3425.MOV 3.17MB
IMG_3663.MOV 2.89MB
IMG_3635.MOV 2.88MB
IMG_3171.mp4 3.81MB
IMG_3170.mp4 2.95MB
共 123 条
- 1
- 2
资源评论
- m0_716119932023-06-08资源和描述一致,质量不错,解决了我的问题,感谢资源主。
- 2301_774852082023-04-14这个资源对我启发很大,受益匪浅,学到了很多,谢谢分享~
甜辣uu
- 粉丝: 8386
- 资源: 1103
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SSCMS登录模块需要的JS文件
- JSP网络购物中心毕业设计(源代码+论文).rar
- 白盒测试报告.docx
- 基于LM5117芯片评估开发板硬件参考设计(原理图+PCB)+中英文数据手册资料.zip
- 照片批量重命名软件(文件批量修改图片文件名)
- app.apk
- 人工智能(AI)是计算机科学的一个分支,旨在开发和应用能够模拟、延伸和扩展人类智能的理论、方法和技术,包括机器人、语言识别、图像
- 嵌入式与物联网开发是当今信息技术领域的两大重要分支,它们相互交织,共同推动着智能化时代的进步 嵌入式开发主要关注在嵌入式操作
- 网络安全,这一看似高深莫测的领域,实则与我们每个人的生活息息相关
- 毕业设计基于深度学习的视觉问答系统源码+文档说明+答辩PPT.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功