人脸检测的三种提速尝试
2016-12-29 17:13
309 查看
之前写过一篇博客测试出Dlib自带的人脸检测模块速率很慢,在博客里有提及更换其他人脸检测模块或者对其进行速率优化。
惯例先放最好的结果,可以看出来已经可以优化到10ms而不怎么掉帧了……
回到之前的不优化的效果:载入模型先不谈,人脸检测需要花费100ms左右,特征点定位只需要3.5ms,故而为了提高帧率,人脸检测模块的更换或者优化是很有必要的。
模块非常简单,导入模型,识别……//这里的模型放在Opencv的etc目录下。
这段代码在实验室这种光照不是非常均匀的场景下真的真的名副其实的非常差………………
大概效果就是下面这样:
//这种情况下也尝试过其他几个Opencv自带的人脸检测模型,效果都非常差,有兴趣的童鞋可以用上面那张图片再试试(毕竟脸还在)
下载地址:https://github.com/ShiqiYu/libfacedetection
有空再来写一篇配置的博客(欢迎督促我),总体和Opencv类似,dll和lib对了就能正常跑了,融入到之前Dlib人脸检测的程序中发现,人脸检测的时间大约为20ms,较之于之前的
和Dlib的detector相比,准确率几乎一致(正负六十度左右)
核心代码:
核心代码:
这里将长宽缩放成原来的四分之一时可以发现一帧图只需要4ms……
效率比之前有所降低(但肯定有无穷多的办法弥补),大概掉帧20%左右,三倍的时候10%,两倍基本没区别。
尝试差不多就先这么多啦,之后有想法会继续补充。
祝图像处理愉快~
惯例先放最好的结果,可以看出来已经可以优化到10ms而不怎么掉帧了……
回到之前的不优化的效果:载入模型先不谈,人脸检测需要花费100ms左右,特征点定位只需要3.5ms,故而为了提高帧率,人脸检测模块的更换或者优化是很有必要的。
1.Opencv人脸检测
首先试下传闻中效果很差但速率很快的Opencv人脸检测模块:模块非常简单,导入模型,识别……//这里的模型放在Opencv的etc目录下。
#include "opencv2\opencv.hpp" #include <iostream> using namespace std; using namespace cv; int main() { string xmlPath = "C:\\opencv_310\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml"; CascadeClassifier ccf; cv::VideoCapture cap(0); ccf.load(xmlPath); while (waitKey(30) != 27) { Mat img; cap >> img; vector<Rect> faces; Mat gray; cvtColor(img, gray, CV_BGR2GRAY); equalizeHist(gray, gray); ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(10, 10), Size(100, 100)); //检测人脸 for (vector<Rect>::const_iterator iter = faces.begin(); iter != faces.end(); iter++) { rectangle(img, *iter, Scalar(0, 0, 255), 2, 8); //画出脸部矩形 } imshow("faces", img); } }
这段代码在实验室这种光照不是非常均匀的场景下真的真的名副其实的非常差………………
大概效果就是下面这样:
//这种情况下也尝试过其他几个Opencv自带的人脸检测模型,效果都非常差,有兴趣的童鞋可以用上面那张图片再试试(毕竟脸还在)
2.于仕琪 人脸检测
总体效果还不错,有四种模型,可以根据具体任务以及测试进行……下载地址:https://github.com/ShiqiYu/libfacedetection
有空再来写一篇配置的博客(欢迎督促我),总体和Opencv类似,dll和lib对了就能正常跑了,融入到之前Dlib人脸检测的程序中发现,人脸检测的时间大约为20ms,较之于之前的
和Dlib的detector相比,准确率几乎一致(正负六十度左右)
核心代码:
cv::Mat gray; cvtColor(temp, gray, CV_BGR2GRAY); int * pResults = NULL; unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE); pResults = facedetect_frontal(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step, 1.2f, 2, 48); printf("%d faces detected.\n", (pResults ? *pResults : 0)); for (int i = 0; i < (pResults ? *pResults : 0); i++) { short * p = ((short*)(pResults + 1)) + 6 * i; int x = p[0]; int y = p[1]; int w = p[2]; int h = p[3]; int neighbors = p[4]; printf("face_rect=[%d, %d, %d, %d], neighbors=%d\n", x, y, w, h, neighbors); }
3.图片缩放(以Dlib为例)
通过图片的缩放,能极大程度降低人脸检测所需的时间核心代码:
cv::Mat temp2; cv::resize(temp, temp2,cv::Size(640/倍数,480/倍数)); 时间.开始(); cv_image<bgr_pixel> cimg2(temp2); std::vector<rectangle> faces = detector(cimg2); for (unsigned long i = 0; i < faces.size(); ++i) { faces[i].set_top(faces[i].top()*倍数); faces[i].set_bottom(faces[i].bottom() * 倍数); faces[i].set_left(faces[i].left()*倍数); faces[i].set_right(faces[i].right()*倍数); } 时间.结束();
这里将长宽缩放成原来的四分之一时可以发现一帧图只需要4ms……
效率比之前有所降低(但肯定有无穷多的办法弥补),大概掉帧20%左右,三倍的时候10%,两倍基本没区别。
尝试差不多就先这么多啦,之后有想法会继续补充。
祝图像处理愉快~
相关文章推荐
- openCV——人脸检测资料汇总(附录)用PhotoShop尝试旋转图片
- 利用OpenCV的Haar特征目标检测方法进行人脸识别的尝试(一)
- 大家是否有办法提高haarObjectDetect的速度?在人脸检测方面,我尝试用肤色检测缩小范围
- 关于人脸检测与识别的API、库和软件
- opencv实现人脸眼睛的检测
- Adaboost 人脸检测
- 复杂背景彩色人脸检测
- cvpr读书笔记[1]:VJ人脸检测框架。Viola-Jones Objects detection framwork
- 人脸检测及识别python实现系列(3)——为模型训练准备人脸数据
- 基于opencv3的人脸检测
- 用ORL人脸数据库和opencv的facererc_demo.cpp做人脸检测
- LBPH+Adaboost人脸检测、识别
- Win10+vs2013+opencv建立简单的人脸检测工程
- 三种网络流量检测方法说明和配置
- 开源的部分人脸检测库
- 人脸特征点检测(Facial landmark detection)
- opencv 人脸检测例程
- 人脸特征,检测与识别
- 人脸器官检测
- AdaBoost人脸检测原理