大牛教你使用dlib中的深度残差网络(ResNet)实现实时人脸识别

opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别,不过本文的目的不是构建深度残差网络,而是利用已经训练好的模型进行实时人脸识别,实时性要求一秒钟达到10帧以上的速率,并且保证不错的精度。opencv和dlib都是非常好用的计算机视觉库,特别是dlib,前面文章提到了其内部封装了一些比较新的深度学习方法,使用这些算法可以实现很多应用,比如人脸检测、车辆检测、目标追踪、语义分割等等。由于这两个库相应的都包含了C++和Python的版本,而Python的配置和相对使用起来更加简单,因此这篇文章主要通过Python来实现。

先上测试的识别效果,第一张识别吴恩达和Bengio,后者我没有打标签所以识别的是“other”;另外一张gif 是识别梁朝伟、刘德华和一个女主持的过程,本地库中没有存储女主持的图片。

                                                     

             

 

因为博客园不方便上传本地视频,所以用的gif显示效果图,源视频要比gif清楚,640X480像素大小,总的来说效果识别的效果还不错。

一、准备

(1)需要安装opencv和dlib的Python库,之前的一篇文章提到了怎样安装:http://www.cnblogs.com/supersayajin/p/8446685.html;如果你有GPU并且开启了加速,那么实现的人脸识别程序速度非常快,可以满足实时性,以我运行的结果来看,检测+识别640X480像素的视频流一秒钟大约十几帧;如果你没有GPU那么速度就会很慢了,而且在检测阶段不能使用卷积神经网络的方法了,否则检测一帧数据可能需要几秒甚至几十秒:)

(2)需要一个和PC连接的摄像头;在本文中使用的是串口的摄像头,笔记本电脑集成的摄像头就是串口的,opencv中提供了直接获取串口摄像头的接口,非常方便使用;如果是网口的摄像头那么就要看摄像头提供方,比如大华、海康他们的摄像头可能会提供官方的SDK,如果有接口那是最好;或者,如果摄像头支持RTSP协议,opencv也可以通过RTSP协议获取摄像头的数据;否则可能就要写一套socket通信来实现数据传输,这个不在本文范围之内,默认使用的是串口的摄像头。

二、策略

人脸识别分为人脸检测和识别两个阶段,人脸检测会找到人脸区域的矩形窗口,识别则通过ResNet返回人脸特征向量,并进行匹配。

(1)人脸检测阶段。人脸检测算法需要用大小位置不同的窗口在图像中进行滑动,然后判断窗口中是否存在人脸。在深度学习之前的主流方法是特征提取+集成学习分类器,比如以前火热的haar特征+adaboost级联分类器,opencv中实现的人脸检测方法就采用了这种,不过实验结果来看,这种检测方法效果很不好,经常误检测人脸,或者检测不到真实的人脸;dlib中使用的是HOG(histogram of oriented gradient)+ 回归树的方法,使用dlib训练好的模型进行检测效果要好很多。dlib也使用了卷积神经网络来进行人脸检测,效果好于HOG的集成学习方法,不过需要使用GPU加速,不然程序会卡爆了,一张图片可能几秒甚至几十秒。

(2)识别阶段。识别也就是我们常说的“分类”,摄像头采集到这个人脸时,让机器判断是张三还是其他人。分类分为两个部分:

  • 特征向量抽取。本文用到的是dlib中已经训练好的ResNet模型的接口,此接口会返回一个128维的人脸特征向量。
  • 6
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值