Dlib+OpenCV深度学习人脸识别

目录(?)[+]

  1. DlibOpenCV深度学习人脸识别
  2. 前言
  3. 人脸数据库导入
  4. 人脸检测
  5. 人脸识别
  6. 异常处理

Dlib+OpenCV深度学习人脸识别

  1. 前言

人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观。现在虽然有一些商业应用如员工人脸识别管理系统、海关身份验证系统、甚至是银行人脸识别功能,但是我们可以仔细想想员工人脸识别管理,海关身份证系统的应用场景对身份的验证功能其实并没有商家吹嘘的那么重要,打个比方说员工上班的时候刷脸如果失败了会怎样,是不是重新识别一下,如果还是误识别,或是识别不出,是不是就干脆刷卡或是其他方式登记上班,然后骂一句他娘的,本人那么帅居然没识别出来!那银行柜员机上人脸识别系统呢,你看它敢不敢让你连密码也不输直接刷脸转账,是不是关掉了人脸识别、指纹识别机器还可以正常运作。所以说真实环境中在各种光照因素、年龄因素、网红因素(化妆)、甚至是作弊因素等各种因素条件下的识别率有多少只有产品厂家自己知道,我相信每个厂家针对这些情况都有做优化,比如外围硬件的辅助,针对特定场景的各种约束等等,通过各个厂家自己在各个方面对系统的优化,是可以提升自身产品的综合体验的。

前面扯远了,本文的目的是实现一个人脸识别的最简单实际应用,即用摄像头捕捉动态人脸,然后和已经存储在数据库中的128D人脸特征进行比较识别出相应的人脸信息(名字等)。工程是基于VS2015+简单的MFC对话框实现的,代码存放在:http://git.oschina.net/wjiang/face_recognition

在这个系统中我预先存储了下面几位明星的正面头像的128D人脸特征,当然你可以存储和导入更多的人脸。

然后经过人脸检测、人脸图像处理,和人脸识别等步骤识别出相应的人脸信息,识别效果如下(怕大家被丑到所以用了明星的图片,没有用真实的人脸 – 没有做活体检测):

当然这只是一个简单的应用,真正用到生产的系统,还需运用活体检测等技术,防止运用照片或是手机视频等方式欺骗过人脸识别系统,安全级别要求更高的应用领域例如支付、转账等系统活体检测可能仍不够安全,这时还可以通过人脸识别+验证密码等方式加强安全性能。

  1. 人脸数据库导入

人脸数据导入,也就是说我在系统启动之初,需要导入我的人脸数据库,也就是前面的那些明星的正面照。装载的开始阶段,因为要检测静态人脸图片的人脸部位,首先需要用dlib的人脸检测器,用get_frontal_face_detector()获得。然后需要将68点人脸标记模型导入shape_predictor sp,目的就是要对其人脸到一个标准的姿势,接着就是装载DNN模型。然后取每张人脸照片的特征,并将特征和姓名等相关的信息放入FACE_DESC结构中,最后将每张人脸信息结构放入face_desc_vec容器中,这里我只装载了9个明星的人脸信息。

[cpp] view plain copy print?

  1. int FACE_RECOGNITION::load_db_faces(void)
  2. {
  3. intrc = -1;
  4. longhFile = 0;
  5. struct_finddata_tfileinfo;
  6. frontal_face_detectordetector =get_frontal_face_detector();
  7. // We will also use a face landmarking model to align faces to a standard pose: (see face_landmark_detection_ex.cpp for an introduction)
  8. deserialize("shape_predictor_68_face_landmarks.dat") >>sp;
  9. // And finally we load the DNN responsible for face recognition.
  10. deserialize("dlib_face_recognition_resnet_model_v1.dat") >>net;
  11. if ((hFile =_findfirst(".\\faces\\*.jpg", &fileinfo)) != -1)
  12. {
  13. do
  14. {
  15. if ((fileinfo.attrib &_A_ARCH))
  16. {
  17. if (strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
  18. {
  19. if (!strcmp(strstr(fileinfo.name,".") + 1 , "jpg"))
  20. {
  21. cout <<"This file is an image file!" <<fileinfo.name <<endl;
  22. matrix<rgb_pixel>img;
  23. charpath[260];
  24. sprintf_s(path,".\\faces\\%s",fileinfo.name);
  25. load_image(img,path);
  26. image_windowwin(img);
  27. for (autoface :detector(img))
  28. {
  29. autoshape =sp(img,face);
  30. matrix<rgb_pixel>face_chip;
  31. extract_image_chip(img,get_face_chip_details(shape, 150, 0.25),face_chip);
  32. //Record the all this face‘s information
  33. FACE_DESCsigle_face;
  34. sigle_face.face_chip =face_chip;
  35. sigle_face.name =fileinfo.name;
  36. std::vector<matrix<rgb_pixel>>face_chip_vec;
  37. std::vector<matrix<float, 0, 1>>face_all;
  38. face_chip_vec.push_back(move(face_chip));
  39. //Asks the DNN to convert each face image in faces into a 128D vector
  40. face_all =net(face_chip_vec);
  41. //Get the feature of this person
  42. std::vector<matrix<float, 0, 1>>::iteratoriter_begin = face_all.begin(),
  43. iter_end =face_all.end();
  44. if (face_all.size() > 1)break;
  45. sigle_face.face_feature = *iter_begin;
  46. //all the person description into vector
  47. face_desc_vec.push_back(sigle_face);
  48. win.add_overlay(face);
  49. }
  50. }
  51. else
  52. {
  53. cout <<"This file is not image file!" <<fileinfo.name <<endl;
  54. }
  55. }
  56. }
  57. else
  58. {
  59. //files.push_back(p.assign(path).append("\\").append(fileinfo.name));
  60. }
  61. } while (_findnext(hFile, &fileinfo) == 0);
  62. _findclose(hFile);
  63. }
  64. returnrc;
  65. }
int FACE_RECOGNITION::load_db_faces(void)
{
    intrc = -1;
    longhFile = 0;
    struct_finddata_tfileinfo;

    frontal_face_detectordetector =get_frontal_face_detector();
    // We will also use a face landmarking model to align faces to a standard pose: (see face_landmark_detection_ex.cpp for an introduction)
    deserialize("shape_predictor_68_face_landmarks.dat") >>sp;

    // And finally we load the DNN responsible for face recognition.
    deserialize("dlib_face_recognition_resnet_model_v1.dat") >>net;

    if ((hFile =_findfirst(".\\faces\\*.jpg", &fileinfo)) != -1)
    {
        do
        {
            if ((fileinfo.attrib &_A_ARCH))
            {
                if (strcmp(fileinfo.name,".") != 0 && strcmp(fileinfo.name,"..") != 0)
                {
                    if (!strcmp(strstr(fileinfo.name,".") + 1 , "jpg"))
                    {
                        cout <<"This file is an image file!" <<fileinfo.name <<endl;
                        matrix<rgb_pixel>img;
                        charpath[260];
                        sprintf_s(path,".\\faces\\%s",fileinfo.name);
                        load_image(img,path);
                        image_windowwin(img);

                        for (autoface :detector(img))
                        {
                            autoshape =sp(img,face);
                            matrix<rgb_pixel>face_chip;
                            extract_image_chip(img,get_face_chip_details(shape, 150, 0.25),face_chip);
                            //Record the all this face‘s information
                            FACE_DESCsigle_face;
                            sigle_face.face_chip =face_chip;
                            sigle_face.name =fileinfo.name;

                            std::vector<matrix<rgb_pixel>>face_chip_vec;
                            std::vector<matrix<float, 0, 1>>face_all;

                            face_chip_vec.push_back(move(face_chip));
                            //Asks the DNN to convert each face image in faces into a 128D vector
                            face_all =net(face_chip_vec);

                            //Get the feature of this person
                            std::vector<matrix<float, 0, 1>>::iteratoriter_begin = face_all.begin(),
                                iter_end =face_all.end();
                            if (face_all.size() > 1)break;
                            sigle_face.face_feature = *iter_begin;

                            //all the person description into vector
                            face_desc_vec.push_back(sigle_face);

                            win.add_overlay(face);
                        }
                    }
                    else
                    {
                        cout <<"This file is not image file!" <<fileinfo.name <<endl;
                    }
                }
            }
            else
            {
                //files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
    returnrc;
}
  1. 人脸检测

人脸检测在人脸识别的应用系统中我认为是至关重要的一环,因为人脸检测的好坏直接影响最终的识别率,如果在人脸检测阶段能做到尽量好的话,系统的识别率会有一个比较大的提升。下面的是人脸检测的具体代码实现(很简陋莫怪),尝试了用Dlib人脸检测,OpenCV人脸检测,还有于仕琪的libfacedetection,比较发现于仕琪的libfacedetection是做人脸检测最好的一个,速度快,并且检测图像效果也很好。

[cpp] view plain copy print?

  1. intcapture_face(Matframe,Mat&out)
  2. {
  3. Matgray;
  4. Matface;
  5. intrc = -1;
  6. if (frame.empty() || !frame.data)return -1;
  7. cvtColor(frame,gray,CV_BGR2GRAY);
  8. int *pResults =NULL;
  9. unsignedchar *pBuffer = (unsignedchar *)malloc(DETECT_BUFFER_SIZE);
  10. if (!pBuffer)
  11. {
  12. fprintf(stderr,"Can not alloc buffer.\n");
  13. return -1;
  14. }
  15. //pResults = facedetect_frontal_tmp((unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, gray.step,
  16. //    1.2f, 5, 24);
  17. pResults =facedetect_multiview_reinforce(pBuffer, (unsignedchar*)(gray.ptr(0)),gray.cols,gray.rows, (int)gray.step,
  18. 1.2f, 2, 48, 0, 1);
  19. //printf("%d faces detected.\n", (pResults ? *pResults : 0));//重复运行
  20. //print the detection results
  21. if (pResults !=NULL)
  22. {
  23. for (inti = 0;i < (pResults ? *pResults : 0);i++)
  24. {
  25. short *p = ((short*)(pResults + 1)) + 6 *i;
  26. intx =p[0];
  27. inty =p[1];
  28. intw =p[2];
  29. inth =p[3];
  30. intneighbors =p[4];
  31. Rect_<float>face_rect =Rect_<float>(x,y,w, h);
  32. face =frame(face_rect);
  33. printf("face_rect=[%d, %d, %d, %d], neighbors=%d\n",x,y, w,h,neighbors);
  34. Pointleft(x,y);
  35. Pointright(x +w,y + h);
  36. cv::rectangle(frame,left,right, Scalar(230, 255, 0), 4);
  37. }
  38. //imshow("frame", frame);
  39. if (face.empty() || !face.data)
  40. {
  41. face_detect_count = 0;
  42. return -1;
  43. }
  44. if (face_detect_count++ > 30)
  45. {
  46. imshow("face",face);
  47. out =face.clone();
  48. return 0;
  49. }
  50. }
  51. else
  52. {
  53. //face is moving, and reset the detect count
  54. face_detect_count = 0;
  55. }
  56. returnrc;
  57. }
intcapture_face(Matframe,Mat&out)
{
    Matgray;
    Matface;
    intrc = -1;

    if (frame.empty() || !frame.data)return -1;

    cvtColor(frame,gray,CV_BGR2GRAY);
    int *pResults =NULL;

    unsignedchar *pBuffer = (unsignedchar *)malloc(DETECT_BUFFER_SIZE);
    if (!pBuffer)
    {
        fprintf(stderr,"Can not alloc buffer.\n");
        return -1;
    }
    //pResults = facedetect_frontal_tmp((unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, gray.step,
    //    1.2f, 5, 24);
    pResults =facedetect_multiview_reinforce(pBuffer, (unsignedchar*)(gray.ptr(0)),gray.cols,gray.rows, (int)gray.step,
        1.2f, 2, 48, 0, 1);

    //printf("%d faces detected.\n", (pResults ? *pResults : 0));//重复运行
                                                            //print the detection results
    if (pResults !=NULL)
    {
        for (inti = 0;i < (pResults ? *pResults : 0);i++)
        {
            short *p = ((short*)(pResults + 1)) + 6 *i;
            intx =p[0];
            inty =p[1];
            intw =p[2];
            inth =p[3];
            intneighbors =p[4];

            Rect_<float>face_rect =Rect_<float>(x,y,w, h);
            face =frame(face_rect);

            printf("face_rect=[%d, %d, %d, %d], neighbors=%d\n",x,y, w,h,neighbors);
            Pointleft(x,y);
            Pointright(x +w,y + h);
            cv::rectangle(frame,left,right, Scalar(230, 255, 0), 4);
        }
        //imshow("frame", frame);
        if (face.empty() || !face.data)
        {
            face_detect_count = 0;
            return -1;
        }
        if (face_detect_count++ > 30)
        {
            imshow("face",face);
            out =face.clone();
            return 0;
        }
    }
    else
    {
        //face is moving, and reset the detect count
        face_detect_count = 0;
    }

    returnrc;
}
  1. 人脸识别

通过人脸检测函数capture_face()经过处理之后临时保存在工程目录下的cap.jpg,用get_face_chip_details()函数将检测到的目标图片标准化为150*150像素大小,并对人脸进行旋转居中,用extract_image_chip()取得图像的一个拷贝,然后将其存储到自己的图片face_chip中,把的到face_chip放入vect_faces容器中,传送给深度神经网络net,得到捕捉到人脸图片的128D向量特征最后在事先导入的人脸数据库中遍历与此特征最相近的人脸即可识别出相应的人脸信息。

这种模式的应用,也就是我们所说的1:N应用,1对N是比较考验系统运算能力的,举个例子,现在支付宝账户应该已经是上亿级别的用户,如果你在就餐的时候选择使用支付宝人脸支付,也许在半个小时内服务器也没有找你的脸,这下就悲催,当然在真实应用场景可能是还需要你输入你的名字,这下可能就快多了,毕竟全国可能和你重名的也就了不的几千上万个吧,一搜索,人脸识别再一验证即可。

前面的这些还没有考虑安全的因素,比如说双胞胎啊,化妆啊(网红的年代啊),还有年龄的因素,环境的因素还包括光照、角度等导致的误识别或是识别不出,识别不出的情况还好,如果是误识别对于支付等对于安全性要求极其严苛的应用来说简直就是灾难。所以人脸识别还有很大的局限性 – 额,好像扯远了。

[cpp] view plain copy print?

  1. matrix<rgb_pixel> face_cap;
  2. //save the capture in the project directory
  3. load_image(face_cap, ".\\cap.jpg");
  4. //Display the raw image on the screen
  5. image_window win1(face_cap);
  6. frontal_face_detector detector = get_frontal_face_detector();
  7. std::vector<matrix<rgb_pixel>> vect_faces;
  8. for (auto face : detector(face_cap))
  9. {
  10. auto shape = face_recognize.sp(face_cap, face);
  11. matrix<rgb_pixel> face_chip;
  12. extract_image_chip(face_cap, get_face_chip_details(shape, 150, 0.25), face_chip);
  13. vect_faces.push_back(move(face_chip));
  14. win1.add_overlay(face);
  15. }
  16. if (vect_faces.size() != 1)
  17. {
  18. cout <<"Capture face error! face number "<< vect_faces.size()  << endl;
  19. cap.release();
  20. goto CAPTURE;
  21. }
  22. //Use DNN and get the capture face‘s feature with 128D vector
  23. std::vector<matrix<float, 0, 1>> face_cap_desc = face_recognize.net(vect_faces);
  24. //Browse the face feature from the database, and find the match one
  25. std::pair<double,std::string> candidate_face;
  26. std::vector<double> len_vec;
  27. std::vector<std::pair<double, std::string>> candi_face_vec;
  28. candi_face_vec.reserve(256);
  29. for (size_t i = 0; i < face_recognize.face_desc_vec.size(); ++i)
  30. {
  31. auto len = length(face_cap_desc[0] - face_recognize.face_desc_vec[i].face_feature);
  32. if (len < 0.45)
  33. {
  34. len_vec.push_back(len);
  35. candidate_face.first = len;
  36. candidate_face.second = face_recognize.face_desc_vec[i].name.c_str();
  37. candi_face_vec.push_back(candidate_face);
  38. ifdef _FACE_RECOGNIZE_DEBUG
  39. char buffer[256] = {0};
  40. sprintf_s(buffer, "Candidate face %s Euclid length %f",
  41. face_recognize.face_desc_vec[i].name.c_str(),
  42. len);
  43. MessageBox(CString(buffer), NULL, MB_YESNO);
  44. endif
  45. }
  46. else
  47. {
  48. cout << "This face from database is not match the capture face, continue!" << endl;
  49. }
  50. }
  51. //Find the most similar face
  52. if (len_vec.size() != 0)
  53. {
  54. shellSort(len_vec);
  55. int i(0);
  56. for (i = 0; i != len_vec.size(); i++)
  57. {
  58. if (len_vec[0] == candi_face_vec[i].first)
  59. break;
  60. }
  61. char buffer[256] = { 0 };
  62. sprintf_s(buffer, "The face is %s -- Euclid length %f",
  63. candi_face_vec[i].second.c_str(), candi_face_vec[i].first);
  64. if (MessageBox(CString(buffer), NULL, MB_YESNO) == IDNO)
  65. {
  66. face_record();
  67. }
  68. }
  69. else
  70. {
  71. if (MessageBox(CString("Not the similar face been found"), NULL, MB_YESNO) == IDYES)
  72. {
  73. face_record();
  74. }
  75. }
  76. face_detect_count = 0;
  77. frame.release();
  78. face.release();
	matrix<rgb_pixel> face_cap;
	//save the capture in the project directory
	load_image(face_cap, ".\\cap.jpg");

	//Display the raw image on the screen
	image_window win1(face_cap);

	frontal_face_detector detector = get_frontal_face_detector();
	std::vector<matrix<rgb_pixel>> vect_faces;

	for (auto face : detector(face_cap))
	{
		auto shape = face_recognize.sp(face_cap, face);
		matrix<rgb_pixel> face_chip;
		extract_image_chip(face_cap, get_face_chip_details(shape, 150, 0.25), face_chip);
		vect_faces.push_back(move(face_chip));
		win1.add_overlay(face);
	}

	if (vect_faces.size() != 1)
	{
		cout <<"Capture face error! face number "<< vect_faces.size()  << endl;
		cap.release();
		goto CAPTURE;
	}

	//Use DNN and get the capture face‘s feature with 128D vector
	std::vector<matrix<float, 0, 1>> face_cap_desc = face_recognize.net(vect_faces);
	//Browse the face feature from the database, and find the match one
	std::pair<double,std::string> candidate_face;
	std::vector<double> len_vec;

	std::vector<std::pair<double, std::string>> candi_face_vec;
	candi_face_vec.reserve(256);

	for (size_t i = 0; i < face_recognize.face_desc_vec.size(); ++i)
	{
		auto len = length(face_cap_desc[0] - face_recognize.face_desc_vec[i].face_feature);
	    if (len < 0.45)
		{
			len_vec.push_back(len);
			candidate_face.first = len;
			candidate_face.second = face_recognize.face_desc_vec[i].name.c_str();
			candi_face_vec.push_back(candidate_face);

#ifdef _FACE_RECOGNIZE_DEBUG
			char buffer[256] = {0};
			sprintf_s(buffer, "Candidate face %s Euclid length %f",
				face_recognize.face_desc_vec[i].name.c_str(),
				len);
			MessageBox(CString(buffer), NULL, MB_YESNO);
#endif
		}
		else
		{
			cout << "This face from database is not match the capture face, continue!" << endl;
		}
	}

	//Find the most similar face
	if (len_vec.size() != 0)
	{
		shellSort(len_vec);

		int i(0);
		for (i = 0; i != len_vec.size(); i++)
		{
			if (len_vec[0] == candi_face_vec[i].first)
				break;
		}

		char buffer[256] = { 0 };
		sprintf_s(buffer, "The face is %s -- Euclid length %f",
			candi_face_vec[i].second.c_str(), candi_face_vec[i].first);
		if (MessageBox(CString(buffer), NULL, MB_YESNO) == IDNO)
		{
			face_record();
		}
	}
	else
	{
		if (MessageBox(CString("Not the similar face been found"), NULL, MB_YESNO) == IDYES)
		{
			face_record();
		}
	}	

	face_detect_count = 0;
	frame.release();
	face.release();	
  1. 异常处理

当人脸或是物体快速的在摄像头前活动时,会导致系统异常抛出,异常提示如下:

对于这个问题,我们可以先用C++捕获异常的工具,try和catch工具来捕获异常:

[cpp] view plain copy print?

  1. Mat frame;
  2. Mat face;
  3. VideoCapture cap(0);
  4. if (!cap.isOpened()) {
  5. AfxMessageBox(_T("Please check your USB camera‘s interface num."));
  6. }
  7. try
  8. {
  9. while (1)
  10. {
  11. check_close(cap);
  12. cap >> frame;
  13. if (!frame.empty())
  14. {
  15. if (capture_face(frame, face) == 0)
  16. {
  17. //convert to IplImage format and then save with .jpg format
  18. IplImage face_Img;
  19. face_Img = IplImage(face);
  20. //save the capture face to the project directory
  21. cvSaveImage("./cap.jpg", &face_Img);
  22. break;
  23. }
  24. imshow("view", frame);
  25. }
  26. int c = waitKey(10);
  27. if ((char)c == ‘c‘) { break; }
  28. }
  29. }
  30. catch (exception& e)
  31. {
  32. cout << "\nexception thrown!" << endl;
  33. cout << e.what() << endl;
  34. ifdef _CAPTURE_DEBUG
  35. MessageBox(CString(e.what()), NULL, MB_YESNO);
  36. endif
  37. goto CAPTURE;
  38. }
	Mat frame;
	Mat face;
	VideoCapture cap(0);
	if (!cap.isOpened()) {
		AfxMessageBox(_T("Please check your USB camera‘s interface num."));
	}

	try
	{
		while (1)
		{
			check_close(cap);
			cap >> frame;
			if (!frame.empty())
			{
				if (capture_face(frame, face) == 0)
				{
					//convert to IplImage format and then save with .jpg format
					IplImage face_Img;
					face_Img = IplImage(face);
					//save the capture face to the project directory
					cvSaveImage("./cap.jpg", &face_Img);
					break;
				}
				imshow("view", frame);
			}

			int c = waitKey(10);
			if ((char)c == ‘c‘) { break; }
		}
	}
	catch (exception& e)
	{
		cout << "\nexception thrown!" << endl;
		cout << e.what() << endl;
#ifdef _CAPTURE_DEBUG
		MessageBox(CString(e.what()), NULL, MB_YESNO);
#endif
		goto CAPTURE;
	}

在catch中将捕获到的异常信息打印出来:

可以看到,可能是由于摄像头捕获响应速率跟不上的原因,在cap >>frame;的时候得到的frame出现了格式错误,如上图的对话框所示error(-215) 0 < roi.x,也就是说opencv感兴趣区域的x坐标出现了一个负数,而这显然必须是要非负数的地方出现了一个负数的输入,导致OpenCV异常抛出。

没关系我们我们不理会这个异常的frame输入就可以,在异常抛出的catch屏蔽掉对话框的显示,我们即可流畅的采集图像。不理会这个错误的帧输入也就是说直接丢弃这一帧。

时间: 2024-12-05 05:40:51

Dlib+OpenCV深度学习人脸识别的相关文章

深度学习人脸识别实验---VGG模型

特别说明:本次实验步骤大部分来源于http://blog.csdn.net/wjmishuai/article/details/50658670 1.caffe环境配置 主要参考:<深度学习 21天实战Caffe> 2.VGG人脸识别模型资料(提供论文和以及训练完的人脸模型) http://www.robots.ox.ac.uk/~vgg/software/vgg_face/ 3.LMDB数据集的获取 数据集划分 #保存图片的路径 PATH=/media/img echo "star

win10+anaconda+cuda配置dlib,使用GPU对dlib的深度学习算法进行加速(以人脸检测为例)

在计算机视觉和机器学习方向有一个特别好用但是比较低调的库,也就是dlib,与opencv相比其包含了很多最新的算法,尤其是深度学习方面的,因此很有必要学习一下.恰好最近换了一台笔记本,内含一块GTX1060的显卡,可以用来更快地跑深度学习算法.以前用公司HP的工作站配置过dlib,GPU是Quadro K420,用dlib自带的人脸识别算法(ResNet)测试过,相比较1060的速度确实要快上很多.dlib.cuda和cudnn的版本经常会更新,每次重新配置环境会遇到一些问题,在这里记下来吧.

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进

深度学习文字识别

Blog:https://blog.csdn.net/implok/article/details/95041472 步骤: 文字识别是AI的一个重要应用场景,文字识别过程一般由图像输入.预处理.文本检测.文本识别.结果输出等环节组成. 分类:文字识别可根据待识别的文字特点采用不同的识别方法,一般分为定长文字.不定长文字两大类别. 定长文字(例如手写数字识别.验证码),由于字符数量固定,采用的网络结构相对简单,识别也比较容易: 不定长文字(例如印刷文字.广告牌文字等),由于字符数量是不固定的,因

opencv 利用Haar 人脸识别

#include <opencv2/opencv.hpp> #include <cstdio> #include <cstdlib> #include <iostream> #include <Windows.h> using namespace std; int main() { // 加载Haar特征检测分类器 // haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径 const

OpenCV图像处理以及人脸识别

OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import cv2 as cv original = cv.imread('../machine_learning_date/forest.jpg') cv.imshow('Original', original) 显示图片某个颜色通道的图像 blue = np.zeros_like(original) bl

AI人工智能之基于OpenCV+face_recognition实现人脸识别

因近期公司项目需求,需要从监控视频里识别出人脸信息.OpenCV非常庞大,其中官方提供的人脸模型分类器也可以满足基本的人脸识别,当然我们也可以训练自己的人脸模型数据,但是从精确度和专业程度上讲OpenCV所提供的人脸识别要弱于face_recognition,所以我们采取OpenCV处理视频流.face_recognition来识别人脸. 为什么选择Python? 博主本身是Java工程师,在公司主要通过Java语言进行开发,起初我们尝试过通过Java+OpenCV的方式来实现,但是效果并不是很

使用 OpenCV 与 Face++ 人脸识别

今天看到一篇文章<使用 OpenCV 与 Face++ 实现人脸解锁>,感觉挺好玩,就照着作者的讲解,写了一下.详细内容还请看原作者文章. 1 # *^_^* coding:utf-8 *^_^* 2 from __future__ import print_function 3 4 __author__ = 'stone' 5 __date__ = '16-4-13' 6 7 """ 8 http://www.cnblogs.com/asmer-stone/p/

利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077.html 使用OpenCV 调用摄像头 import face_recognition import cv2 video_capture = cv2.VideoCapture(0) # VideoCapture打开摄像头,0为笔记本内置摄像头,1为外USB摄像头,或写入视频路径 mayun_img