如何检测手机是否支持facedetectionlistenerface 人脸识别别

这篇文章主要就介绍两种前端的人脸识别框架(和)
Tracking.js是使用js封装的一个框架,使用起来需要自己配置许多的东西,略显复杂
JqueryFaceDetection是使用jquery封装的框架,只留下一个接口,比较方便
如何下载js文件我就不说了,可以直接百度
Tracking.js
Tracking.js需要先引入tracking-min.js,然后根据你的需求在选择性的引入eye-min.js,face-min.js,mouth-min.js。
tracking.ObjectTracker()接受数组参数将你想要标记的对象分类(比如脸部整体、眼睛、鼻子、嘴巴等)。
setStepSize()规定用来标记的方框的步长。
我们把要标记的对象和track事件进行绑定,一旦我们要标记的对象完成初始化,就会触发track事件。
数据(Data)保存在对象数组列表中,其中的值是每一个标记对象的长、宽以及x、y坐标。
window.onload = function () {
var img = document.getElementById('img');
var tracker = new tracking.ObjectTracker(['face']); // Based on parameter it will return an array.
tracker.setStepSize(1.7);
tracking.track('#img', tracker);
tracker.on('track', function (event) {
if (event.data.length === 0) {
alert("无人脸")
event.data.forEach(function (rect) {
console.log(event)
console.log(rect)
draw(rect.x, rect.y, rect.width, rect.height);
alert("有人脸")
function draw(x, y, w, h) {
var rect = document.createElement('div');
document.querySelector('.imgContainer').appendChild(rect);
rect.classList.add('rect');
rect.style.width = w + 'px';
rect.style.height = h + 'px';
rect.style.left = (img.offsetLeft + x) + 'px';
rect.style.top = (img.offsetTop + y) + 'px';
JqueryFaceDetection
JqueryFaceDetection是使用jquery封装的,所以需要引入jquery,接着再引入jquery.facedetection.js就可以了。总的来说,引入的文件比较少。
$(function () {
$('#img').faceDetection({
complete: function (faces) {
if (faces.length == 0) { //说明没有检测到人脸
alert("无人脸")
for (var i in faces) {
draw(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
error: function (code, message) {
alert("complete回调函数出错")
以上是js部分的代码。
接着只需要在你的页面中加一张图片即可
&img id="img" src="assets/PositiveFace/1.jpg"/&
Tracking.Js
其实还有一张我的自拍照(识别不出来),我就不上传了。总的来说,我不推荐这个框架。
JqueryFaceDetection
看起来识别率似乎是比Tracking.js低一些,但是至少猩猩的脸是识别不出来的,而且强光图和半张脸的阴暗图识别不出来应该是可以接受的。推荐使用
阅读(...) 评论()Android API教程:人脸检测(Face Detect)
发表于 01:19|
来源Developer|
作者Chunyen Liu
摘要:通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是 android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。
通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是&&& android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。本教程来自,向大家介绍了这些API,同时提供教程中实例。
图片来源:
所谓人脸检测就是指从一副图片或者一帧视频中标定出所有人脸的位置和尺寸。人脸检测是人脸识别系统中的一个重要环节,也可以独立应用于视频监控。在数字媒体日益普及的今天,利用人脸检测技术还可以帮助我们从海量图片数据中快速筛选出包含人脸的图片。
在目前的数码相机中,人脸检测可以用来完成自动对焦,即&脸部对焦&。&脸部对焦&是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。via
构建一个人脸检测的Android Activity
你可以构建一个通用的Android Activity,我们扩展了基类ImageView,成为MyImageView,而我们需要进行检测的包含人脸的位图文件必须是565格式,API才能正常工作。被检测出来的人脸需要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。
最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。代码如下:
public&class&TutorialOnFaceDetect1&extends&Activity&{&&private&MyImageView&mIV;&&private&Bitmap&mFaceB&&private&int&mFaceWidth&=&200;&&private&int&mFaceHeight&=&200;&&private&static&final&int&MAX_FACES&=&1;&&private&static&String&TAG&=&&TutorialOnFaceDetect&;&&@Override&public&void&onCreate(Bundle&savedInstanceState)&{&super.onCreate(savedInstanceState);&&mIV&=&new&MyImageView(this);&setContentView(mIV,&new&LayoutParams(LayoutParams.WRAP_CONTENT,&LayoutParams.WRAP_CONTENT));&&&Bitmap&b&=&BitmapFactory.decodeResource(getResources(),&R.drawable.face3);&mFaceBitmap&=&b.copy(Bitmap.Config.RGB_565,&true);&b.recycle();&&mFaceWidth&=&mFaceBitmap.getWidth();&mFaceHeight&=&mFaceBitmap.getHeight();&mIV.setImageBitmap(mFaceBitmap);&&&&mIV.invalidate();&}&&public&void&setFace()&{&FaceDetector&&FaceDetector.Face&[]&faces&=&new&FaceDetector.Face[MAX_FACES];&PointF&midpoint&=&new&PointF();&int&[]&fpx&=&null;&int&[]&fpy&=&null;&int&count&=&0;&&try&{&fd&=&new&FaceDetector(mFaceWidth,&mFaceHeight,&MAX_FACES);&count&=&fd.findFaces(mFaceBitmap,&faces);&}&catch&(Exception&e)&{&Log.e(TAG,&&setFace():&&&+&e.toString());&return;&}&&&if&(count&&&0)&{&fpx&=&new&int[count];&fpy&=&new&int[count];&&for&(int&i&=&0;&i&&&&i++)&{&try&{&faces[i].getMidPoint(midpoint);&&fpx[i]&=&(int)midpoint.x;&fpy[i]&=&(int)midpoint.y;&}&catch&(Exception&e)&{&Log.e(TAG,&&setFace():&face&&&+&i&+&&:&&&+&e.toString());&}&}&}&&mIV.setDisplayPoints(fpx,&fpy,&count,&0);&}&}&
接下来的代码中,我们在MyImageView中添加setDisplayPoints() ,用来在被检测出的人脸上标记渲染。图1展示了一个标记在被检测处的人脸上处于中心位置。
&public&void&setDisplayPoints(int&[]&xx,&int&[]&yy,&int&total,&int&style)&{&&mDisplayStyle&=&&&mPX&=&null;&&mPY&=&null;&&if&(xx&!=&null&&&&yy&!=&null&&&&total&&&0)&{&mPX&=&new&int[total];&mPY&=&new&int[total];&&for&(int&i&=&0;&i&&&&i++)&{&mPX[i]&=&xx[i];&mPY[i]&=&yy[i];&}&}&}&
图1:单一人脸检测
多人脸检测
通过FaceDetector可以设定检测到人脸数目的上限。比如设置最多只检测10张脸:
private&static&final&int&MAX_FACES&=&10;&
图2展示检测到多张人脸的情况。
图2:多人人脸检测
定位眼睛中心位置
Android人脸检测返回其他有用的信息,例同时会返回如eyesDistance,pose,以及confidence。我们可以通过eyesDistance来定位眼睛的中心位置。
下面的代码中,我们将setFace()放在doLengthyCalc()中。同时图3展示了定位眼睛中心位置的效果。
public&class&TutorialOnFaceDetect&extends&Activity&{&&private&MyImageView&mIV;&&private&Bitmap&mFaceB&&private&int&mFaceWidth&=&200;&&private&int&mFaceHeight&=&200;&&private&static&final&int&MAX_FACES&=&10;&&private&static&String&TAG&=&&TutorialOnFaceDetect&;&private&static&boolean&DEBUG&=&false;&&protected&static&final&int&GUIUPDATE_SETFACE&=&999;&protected&Handler&mHandler&=&new&Handler(){&&public&void&handleMessage(Message&msg)&{&mIV.invalidate();&&super.handleMessage(msg);&}&};&&@Override&public&void&onCreate(Bundle&savedInstanceState)&{&super.onCreate(savedInstanceState);&&mIV&=&new&MyImageView(this);&setContentView(mIV,&new&LayoutParams(LayoutParams.WRAP_CONTENT,&LayoutParams.WRAP_CONTENT));&&&Bitmap&b&=&BitmapFactory.decodeResource(getResources(),&R.drawable.face3);&mFaceBitmap&=&b.copy(Bitmap.Config.RGB_565,&true);&b.recycle();&&mFaceWidth&=&mFaceBitmap.getWidth();&mFaceHeight&=&mFaceBitmap.getHeight();&mIV.setImageBitmap(mFaceBitmap);&mIV.invalidate();&&&doLengthyCalc();&}&&public&void&setFace()&{&FaceDetector&&FaceDetector.Face&[]&faces&=&new&FaceDetector.Face[MAX_FACES];&PointF&eyescenter&=&new&PointF();&float&eyesdist&=&0.0f;&int&[]&fpx&=&null;&int&[]&fpy&=&null;&int&count&=&0;&&try&{&fd&=&new&FaceDetector(mFaceWidth,&mFaceHeight,&MAX_FACES);&count&=&fd.findFaces(mFaceBitmap,&faces);&}&catch&(Exception&e)&{&Log.e(TAG,&&setFace():&&&+&e.toString());&return;&}&&&if&(count&&&0)&{&fpx&=&new&int[count&*&2];&fpy&=&new&int[count&*&2];&&for&(int&i&=&0;&i&&&&i++)&{&try&{&faces[i].getMidPoint(eyescenter);&eyesdist&=&faces[i].eyesDistance();&&&fpx[2&*&i]&=&(int)(eyescenter.x&-&eyesdist&/&2);&fpy[2&*&i]&=&(int)eyescenter.y;&&&fpx[2&*&i&+&1]&=&(int)(eyescenter.x&+&eyesdist&/&2);&fpy[2&*&i&+&1]&=&(int)eyescenter.y;&&if&(DEBUG)&{&Log.e(TAG,&&setFace():&face&&&+&i&+&&:&confidence&=&&&+&faces[i].confidence()&+&&,&eyes&distance&=&&&+&faces[i].eyesDistance()&+&&,&pose&=&(&+&faces[i].pose(FaceDetector.Face.EULER_X)&+&&,&&+&faces[i].pose(FaceDetector.Face.EULER_Y)&+&&,&&+&faces[i].pose(FaceDetector.Face.EULER_Z)&+&&)&&+&&,&eyes&midpoint&=&(&&+&eyescenter.x&+&&,&&+&eyescenter.y&+&)&);&}&}&catch&(Exception&e)&{&Log.e(TAG,&&setFace():&face&&&+&i&+&&:&&&+&e.toString());&}&}&}&&mIV.setDisplayPoints(fpx,&fpy,&count&*&2,&1);&}&&private&void&doLengthyCalc()&{&Thread&t&=&new&Thread()&{&Message&m&=&new&Message();&&public&void&run()&{&try&{&setFace();&m.what&=&TutorialOnFaceDetect.GUIUPDATE_SETFACE;&TutorialOnFaceDetect.this.mHandler.sendMessage(m);&}&catch&(Exception&e)&{&Log.e(TAG,&&doLengthyCalc():&&&+&e.toString());&}&}&};&&t.start();&}&}&
图3:定位眼睛中心位置
色彩 vs. 灰度
通常来讲,人脸检测成功取决于搜索人脸高对比度区域,实际效果来看色彩和灰度的差距不会太远。不过很多学者仍在致力于证明色彩比灰度更靠谱。经过在对示例图片的验证,发现Android APIs返回的结果非常接近,似乎APIs意图忽略掉不同颜色通道的因素。请看图4(BTW,独自一人在阴暗环境下请谨慎观看):
图4:灰度人脸检测看起来会稍微有点恐怖
通过本次教程,我们介绍了简单的Android人脸检测APIs,并通过实例进行了演示。以上的软件包均可在,方便大家将其import到Eclipse中。最后提供一些有益的忠告:
很多应用对人脸检测其实都有着潜在的重要需求,例如去红眼、计算人头数、自动对焦人脸、添加人脸特效等等。
这个世界上存在有非常多的人脸数据库,有意者请。
在实时的人脸检测过程中,Android的表现的会有一点点差强人意。
文章及图片来源:
推荐阅读相关主题:
网友评论有(0)
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章实时人脸检测&(Real-Time&Face&Detection)
&最近需要用到人脸检测,于是找了篇引用广泛的论文实现了一下:Robust Real-Time
Face Detection。实现的过程主要有三个步骤:人脸数据准备,算法实现,算法调试。
人脸数据集的准备:网上有很多免费的和付费的。比如这里有个介绍了一些常用的人脸数据库。我这里只是人脸检测(不是人脸识别),只要有人脸就可以了,所以我下载了几个数据集,然后把它们混在一起用(后面也因此产生了一些问题)。
算法大意很简单:可以把它看作是一个二分类的问题。给定一张图片后,程序会用一个矩形框扫描整张图片,然后每次判断当前矩形框是不是人脸。
&方法的核心在于扫描框的分类。这里采用了AdaBoost的学习方法。AdaBoost的思想是,把一些简单的弱分类器组合起来得到一个强大的分类器。学习过程中,每个弱分类器会根据数据学到一个权重,一般由它的分类误差来确定,误差越小,权重越大。数据也有权重,根据每次弱分类器的分类结果来定,比如当前分错的数据权重需要增加。
因为AdaBoost由很多弱分类器构成,理论上弱分类器越多,分类能力越强,但是计算量也更大。由于实时性的要求,这里采用了分层的思想:训练出多层的AdaBoost分类器,层次靠前的分类器包含的弱分类器数量少一些。这是一个树结构。每层的AdaBoost分类器会过滤掉非人脸数据,只有完全通过的数据才会判定为人脸。
大致步骤理解起来很容易,实现过程中也会遇到很多参数需要调节,下面就我遇到的一些问题做一些讨论:
首先是数据集的准备。人脸数据好说,非人脸数据怎么准备呢?可以找一些有人脸的图片作为训练集,目的是使得分类器在这些训练集中的误判率(false
rate)最小。穷举出所有的扫描框会扫到的子图片不太现实,因为这样数据量实在是太大了。我这里先随机采样一些图片,然后用这些图片作为非人脸数据,学习出一个分类器,然后再用这个分类器去测试训练集,把误判的数据收集起来,和前面的非人脸数据混合起来,再训练。训练过程中我发现,第一次随机采样的数据很好分类,很快就能训练出一个分类器,越到后面,数据越不好分,训练的时间也越久。原文说他们第一次的分类器采用了两个弱分类器就能过滤掉50%的非人脸数据,其实这句话是没有意义的,并不能说明它的分类器好,只能说明它的数据集比较弱。
数据噪音问题:在训练的过程中,数据刚开始还比较容易分类,前面几层AdaBoost能过滤掉大半部分的非人脸数据,但是到了后面,每层AdaBoost能过滤掉的非人脸数据就很少了(因为每层AdaBoost分类器要保证人脸分对的几率在99.9%以上)。后来我查看了数据,发现人脸数据集中有一些非人脸数据,并且非人脸数据集中有一些人脸。这就是数据噪音。可以考虑先过滤掉噪音再进行训练。其实在多层次的AdaBoost训练过程中,每层过滤出来的人脸数据差不多就是质量不好的,里面也会包含噪音。训练到最后很难过滤掉的非人脸数据,也往往包含了大量的噪音数据。可以通过多次的快速训练(调节参数使其训练速度加快),来过滤掉这些噪音数据。
每一层AdaBoost的弱分类器数量:理论上弱分类器的数量可以根据检测率和误判率来确定,但是这样确定出来的数量往往偏小。虽然这样分类速度会很快,由于这里每一个弱分类器就代表了一个Haar
Feature,Feature过少的话,即使训练集上误差很小,测试的时候,分类能力也很弱。这里可以人为的制定一些策略,比如某层的弱分类器数量有个下限之类的,来权衡速度与分类能力。
理想的情况下,一个人脸只响应一个扫描框。但是实际情况是,人脸附近可能会响应几个扫描框。这就需要合并这些扫描框。合并的策略也是很多的,简单的可以通过重叠率来合并,也可以通过聚类方法合并。但是要考虑到速度问题,我采用了重叠率的计算来合并,简单快速。
训练过程中,最好能可视化一些中间结果。一来可以检测代码实现是否有Bug,二来也可以通过这些中间结果,来帮助自己更好的理解这个算法的过程。比如每层过滤掉的人脸和非人脸数据,每层AdaBoost选择了哪些Feature,每层AdaBoost的误判率是多少等等。其中特别是Feature的选择,不同的训练集,选择出来的Feature是不一样的。如果训练集里的人脸对齐的比较好,那么Haar
Feature的矩形块会比较大,如果人脸对齐不好或者颜色差异大,那么Haar
Feature的矩形框会比较的窄小。仔细想想,好像确实是这样。
Feature的选择:穷举出所有可能的Feature,计算量和存储量会比较大,可以考虑均匀采样出可接受的数量的Feature。采样也可以加入一些随机性。采样也会影响弱分类器数量的选择,因为采样的缘故,可能某些好的Feature没有采样到,那么在增加弱分类器数量之前可以考虑尝试多次采样不同的Feature来训练。训练过程中我发现,多次尝试不同的采样结果确实是有帮助的。另外Haar
Feature的矩形框不能太小,不然在计算多分辨率的时候,Feature值误差会比较大。
训练过程中,我觉得数据和Feature的选择是很重要的。这里用的Haar
Feature,很简单,同样分类能力也是受限的,比如人脸的姿态,光照影响。要提升分类能力,一方面可以在数据上做文章,可以建立更多类型的数据集,比如正面人脸集,侧面人脸集,各种不同光照下的数据集。这么做局限性很大。另一方面可以设计出更好的Feature,或者是学习出更好的Feature(Feature
Learning)。
最后,这个算法实现的源代码在/liguocn/MagicLib里的RealTimeFaceDetection.h/.cpp里面。&
下面贴上一个结果:
人脸检测做好后,可以利用这个检测器,生成更多的人脸数据。我在网上下载了很多图片,特别是一些集体照,然后把这些人脸检测出来,再均匀缩放到128*128大小。这样就可以得到了一些人脸数据,下面是一个文件小截图:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 facevisa人脸识别技术 的文章

 

随机推荐