大家好,今天来跟大家介绍一下如何使用 opencp 上去部署人脸检测的这样一个程序啊。呃,人脸检测呢,其实有很多深度学习的模型,还有框架啊,甚至 opencp 自带的这个像这个叉面文件的这种人脸检测的这种模型啊, 嗯,都非常多啊,网上也看到也都很多啊,那么今天跟大家介绍一下,主要是这个,呃, open cb 的这个官方的提供的这个开飞模型啊,啊,他的模型使用的是开飞 ssd 模型去进行训练的啊, 嗯,本质上就是一个 s s d 的这样的一个深度学的框架去呃,做的这个检测,那我们使用的环境是 v s 二零一九,大家看到我们这个是 v s 二零一九,然后我们是点亮的 workformok, 是四点七二啊,嗯,我们的模型呢其实就是官方的模型, 所以我们这边呢给大家看一下我们这个模型,我们这个模型呢就是这个,就这个啊,就是这个叫 rise 十,什么这种啊?就这个啊,这个就官方的模型都有啊,好,我们今天跟大家去看一下 啊,这个,呃模型呢已经被我们封号成类了,所以这个使用呢非常简单啊,还有这个啊,这个我们啊,这个,这个是前段时间我们把它弄混乱了啊,导致了这个啊,如果说我们的这个原码也会爆这个错误啊,就是大家要注意一下,我们这个地方呢,已经提供了这个 啊修复啊,已经提供了这个新版本去修复它,我们把它移除掉,我们选用这个, 选用我们这个,我们这个四点一点二的版本去做这个引用就可以了啊,我们的这个 项目呢,你肯定是没问题的,没问题的。呃,这个第二文件呢,我们已经跟大家提供在我这个 csd 呃, csding book 上面去了,大家可以免费下,我们提供的是零积分啊,可以随便去下, 大家看到这个就是我们提供的这个免费的,免费的免积分的去下,大家随便去下一下就行了。 呃,然后呢,我们,呃主要是跟大家演示一下啊,首先,呃我们我们封装类非常简单啊,首先我们构建一个这个 face detector 啊,然后呢我们直接就去 做这个 inference, 还有这个做得到一个结果。然后呢还是跟我们以前的这个呃封装的这个差不多啊,就是得到一个结果,然后把结果和图像来对上去,把这个结果挂到图上去就可以了啊,这个就是我们整个的一个封装的一个,非常简单啊,非常简洁。 然后呢我们就随便就选一张图片跟大家演示一下就可以了啊,这大家看这个就检测出来了,当然这个就是,呃,这个,这个看一下,这个还不是挂,呃,我提供的,我们在原版会提供这个,这个这个图片,大家可以都试一试吧, 这个这个大家可以看到这个地方就剪得出来啊,他这个剪的效果还是比较好的,他这个,呃,因为他这个毕竟使用的是这个 s s d 的一个框架学做训练。这个 k f s s d 的话,以前啊,这个呃在公司做项目啊,我也用过啊, k f s s d 确实也是非常不错的一个深度学习框架, 虽然说呃后面被 ulo 取代了,但是他这个检测效果是不容置疑的啊,你只要数据就够多啊,肯定是不容置疑的。 好,这个就是我们整个的演示程序了,我们的这个依赖呢也很少,就是用 oppo cv shop 去使用的,所以呢我们没有用其他的依赖。好,我们欢迎大家收看啊,这个主要是它到此结束。
粉丝434获赞4619

我是陶美,今天继续我们 open cv 学习,那今天啊,我们主要来讲一个案例,也就是人脸识别,那今天的人脸识别呢?我们主要是基于这个 face 的肯定神来实现的啊,它的原理呢也是非常简单,我们先看一下它的这个效果是怎样的 啊?我呢下载了三张这个图片,分别是三个不同的人物啊,经过我们这个人脸识别系统的时候,他前两个呢都能够正常的识别,那么最后一个呢?他发现啊, 哎,这个人我不认识,就啊 no, 不认识,为什么他不认识呢?因为我们这个数据啊,他没有这个人,所以呢当他检测到一个新的人脸的时候, 他就会给你显示, oh, no, 就是我不认识。如果这个数据库里面他有,比如说有这个刘德华这个图片,他识别到之后他就会,他就会告诉你刘德, ok, 那这个就是我们今天要实现的一个小的人脸识别的一个小的案例。那我们再继续看一下今天啊我们要 用到的哪些方法,因为我们是用这个 face recognition 这个酷来实现它里面呢,首先是有这样一个方法叫 face distance, 这个主要是用来计算两个人脸之间的这个距离,这个距离,因为我们在之前的上一节视频当中也讲过,我们会把人脸的关键点进行一个编码,也就是编编,编码成一百二十八为, 他会计算这两个,一百二十八为这个项链他们之间的一个距离,来判断是否为统一个人。 ok, 那么第二个方法叫做 face locations, 这个方法呢,它主要是用来查找一张图片当中有几张人脸,没事,你给了他一张图片, 里面有三张人脸,他,那么最后他会,他会给你返回什么呢?返回一个列表,这个列表里面有三个数组,每个数组呢都是这个人脸的一个位置,也就是 location 啊。第三个方法叫做 landmarks, landmarks 呢,主要是检索人脸的一个关键点,因为我们在前几页视频当中讲过人脸的关键点呢,他我们目前学到的有六十八个关键点和五个关键点, 一般来说呢,我们会用六十八个关键点,因为他更能够刻画出一个人的一个脸部的一个一个形状, ok。 然后第四一个方法叫做 face includings, 这个方法主要是进行编码的,就是说我把你这个上面找到的这个关键点呢,编码乘一个一百二十八位,我们就是通过这个方法来实现的。那最后一个方法是叫做 这个方法,其实呢他主要是用来比较的,这是我比较你给我的这两个人脸,他们是否是同一个人,如果是,我就给你返回一个 q, 如果不是,我就给你返回一个 force, ok, 然后这边这个叫 tolerance。 零点六,什么意思啊? 我在比较的时候呢,我会设定一个预值,就说如果你小于零点六,那我就说你们两个人这个相似度比比较比较可靠,如果我计算出来这个结果大于零点六,那我就说你们两个人完全是不是同一个人, 他这个就是一个计算的一个过程。那这里啊,我给大家提供了一个 api 的一个文档,叫 face recony 一声的 api 的文档啊,各位朋友可以去看一下,我在这里,这里呢也可以,待会当我们写完整个代码之后,我也会呢,带着大家去看一下它底层 api 的一个实现。 ok, 那接下来 那我们就是开始我们今天的这个项目,首先啊我们还需要打开我们这个拍券,也就是集成开发工具,然后呢打开,打,然后呢打开我们这个啊,项目工程 face reconnation, 对吧?那在这里呢,我们要重新命名一个,呃,拍成 package, 一个一个包,比如说我们今天是人脸识别,对吧? face recognition, 然后呢我们用的是 face recognition, 我们就用这个叫 f r g 吧,对吧? face f r g 来表示,呃,就这样, 然后回车,在这里呢我们要新建一个文件,也就拍摄文件用,主要用来实现我们这个功能的,也就人脸识别这个功能。在这里呢,我们就说 face 吧, f r f s 这样写,行,可以随便写 face r g 啊,回车,然后接下来因为我们要实现 这个人脸识别吗?那我里面是不是要有一些数据啊?这个数据就是用来对比的吗?那我在这里呢,我要放两张图片进去,在这里我先 review, 找到这个文件夹,然后呢双击打开它,在这里啊,我要放放进去两张图片, 这个呢是我刚才从网上下载了两张图片,一个呢是郭富城的这个图片一,一张呢是刘德华的这个图片 啊,一共是两张图片,因为我们毕竟是一个小的案例吗?主要是给大家看一下效果到底是怎么实现的。 ok, 我们现在呢在这个小的这个项目里面,项目里面放了两张图片了, 第一章,第二章,对吧?那接下来我们就来开始写代码实现这个功能,我们稍微捋一下,你怎么去实现这样一个人脸识别呢?那是不是跟过去一样? 我们是不是要加载库?我们这边写一下你要加载库这第一步吧,那第二步你要干嘛?那你是不是,呃,要加载我们的图片,因为我这边提供了两个素材,对吧?我们待会要先我们第一步呢,我们肯定要去。 呃,实现就说把他们的人脸给他找出来,同时给他这个人脸呢进行一个 encoling, 也就是给他进行一个编码,包括他的关键点我们都要找出来,然后呢进行一个编码,那这个图片也是一样的,首先我们要在这张图片当中找出这个人脸在哪里, 然后呢给他这个绘制或说找到他的关键点,也就是他脸部的六十八个关键点,我们全部给他找到。最后呢我们给他进一个编码。呃,流程是这样的,我们这边首先是加载图片吧,或者加载素材都可以。然后这第二步,那第三步我们要干嘛?因为我们这个 open cv 呢, 他默认的这个通道是 b g 二,我们这边必须要给他转换成 r g b, ok, b g 二,我们要进行一下转换,转换成什么呢?转 转啊? rgb, 对吧?这第三步我们要转换一下图片的一个通道格式或顺序。那第四步我们要干嘛?我们这边这样写也行, 就说因为我们这边加载图片之后嘛,这第三步是这样的。第四步,我们是不是要去对这个加载的图片进行一个人脸检测,就像我们刚才讲的,你要给我检测人脸,对不对?所以第四步呢?就是检测 人脸, ok, 第四步,那第五步我们要干嘛呢?人脸检测到了,那我是不是要进行一个编码了,对吧?就说我要给这些人脸给他进行一个编码,就一百二十八位的一个编码,那我这里可以这样写,比如说人脸特 编码,对吧?我可以这样写吧。那么第六步干嘛呢?就说我们编码之后,我是不是要把这两张数图片当做一个数据库啊?当做一个数据库,为什么呢?因为我待会通过我的这个摄像头打开之后呢,我会和我的这个数据来进行比较对比,就说 我检测检测到的这个人脸,他是不是我这个数据库里面存放的这两张人脸?如果不是我就给你说一个叫做啊? no, 我不认识你, 如果是的话,那我就给你说说,他对应的这个名字就是刘德华,这个名字就是郭富城,对吧?就这里呢?第六步,也就是说我要把它放在一起组合成一个数据库,把 所有人脸放在一起当做数据库使用,对吧?这个数据库的作用啊,就是说当我通过 摄像头来识别人脸的时候,我要和这个数据会里面所有的人去比较,一一比较。如果我发现有一个非常相似这两招人脸,那我就判断这是同一个人,我再给你说出一个名称,比如说刘德华,对吧?就这么简单。那第七步要干嘛呢?我们是不是要打开我们的摄像头了?所以我们这边可以这样写,打开摄像头,要打开摄像头了, 读取视频流,对吧?你说打开摄像头读取视频流, ok, 这第七步,那第八步我们干嘛呢?那我们是不是把我们摄像头读取到的每一针,也就每一张图片 转换成一个啊?这个 rgb 格式啊,所以我们这边还是要再做一个转换, b g 二,对吧?转 rgb, 对吧?这第八步,那么第九步我们要干嘛呢?那么是不是我们也要对这个摄像头啊,这个读取到的每一张图片进行一个人脸的 检测,对吧?我们摄像头开就一直打开着,那么他会读取到每一针,我就对每一针进行一个人脸的一个检测,所以我这边呢,肯定是还是跟上面一样进行一个人脸检测, 这第九步,那么第十步我们要干嘛呢?那是不是还是和这里一样,我们要进行一个人脸的一个特征编码,对吧?这我们这边还是一样的,人脸 特征编码是第十步。那第十一步呢?那我们这边进行人脸特征编码之后,那首先啊,你看一下我们这边数据库是不是已经准备好了,然后这里呢,我们又发现了一个新的人脸,也给他进行了编码,那是不是我要进行比较了?我要把这个新的特征编码和语言,这个原来的这个, 这个数据库数据里面的所有的这个特征,这个人脸特征进行一个比较,如果发现相似或相等,我就 判断是同一个人。所以这里呢,肯定是说与数据库中的所有人脸 进行什么进行匹匹配吧,对吧?我我要和他进行一个匹配吧,那第十二步是什么呢?第十二步就是说我在匹配的时候, 我是不是要通过一个循环,因为我这个人脸啊?因为我这边才两张图片,对吧?非常少,这是才两张。那如果我这个数据会有一百万张图片,那你这里是不是还是要通过一个循环去一个一个的去匹配?所以我们这边肯定会写一个循环的。那么之后呢?我们会进行一个匹配, 比如说我这边进行开始进行匹配了,对吧?进行匹配,然后呢?第十三步,干嘛?那我这边进行匹配的时候,你怎么去匹配呢?我是不是要计算你两张图片这个编码的距离啊?刚才 我们就一直在讲,就说我们把所有图片进行一个人脸特征编码之后,他们也就说有各自的一个特征了,那怎么去来判断他们是否相似为同一个人呢?那我这里肯定是要去计算他们之间的一个距离, 这个计算距离啊,我在上一节视频当当中讲过,讲过了那个通过欧式距离去进行一个比较,如果这一块不太了解啊,可以看一下上一期的一个视频计算距离,对吧?对,第十三步。那么计算距离之后, 接下来我们要干嘛?我们是不是要做一个判断?就是说我要判断你这个距离到底是近还是远?如果发现很近,也就是说你匹配了,那我就给你说出一个名字吗?如果我发现你们两个人之间的距离很远,那我就说你们不是同一个人,对吧?所以我这边肯定是要做一个判断的,对吧?肯定会做一个判断, 如果匹配,那么就输出或者获取这个名称吧,对吧?名字,因为我每张图片都对应了名字的,我待会会给他复一个名字,比如说郭富城、刘德华,对吧?我都会给他复一个名字的, ok, 那继续, 这是第十四,那第十五干嘛呢?第十五,我们是不是当我们如果匹配之后了获取到名字了,我们是不是要在这张图片上画出一个矩形框,对吧?把它一个矩形框画出来, 就把他这个人脸给他框住,是不是?那同时呢,我们要在这个他这个下方,这边我会画一个长方形, 显示这个人的名称,就显示在这个矩形框的下方,所以我这边肯定是显示吧,对吧?所以显示呢,肯定是说绘制人脸的矩形框,对吧?绘制 人年举行框,这第十五步,那第十六步干嘛呢?那你是不是也要写上他对应的一个名称,对吧?绘制或说啊,显示吧,对应 人脸的名字,对吧?这你肯定要显示吗?不然你只是把一个人脸框给他框出来了,你下面也没写名字,这肯定,这肯定是不行的。那第十八部是干嘛呢?那最后是不是我们要把整个图片给他显示出来,整个效果给他显示出来,对吧?显示整个效果, 对吧?就这么简单。然后最后呢,我们说要关闭啊,关闭所有所有的资源,关闭所有资源,我们要释放所有资源,对吧?这第十八步,一共就十八步。先我这边呢把一些很小的一些这种操作也给他进行了细化。像我们在写代码的时候啊,你就像那个建房 房子呀,就一块砖一块砖的往里面去垒就可以了,这样呢也比较清晰,我们就接下来呢,就写一下代码吧。首先我们是加入库,一步一步来,是不是你要导入库啊? input, 对吧? input 什么库?是不是 cv 库?还要导入什么库?是不是导入我们的 nan pie, 对吧?我们这个也会用到的, 还需要导入我们很重要的一个库,叫 face recognition, 这个库你必须给我导入进来,因为我们要调用它的方法,刚才 ppt 里面我们着重强调了这几个方法,我们待会儿都会用到。 ok, 我们接下来呢,我们首先是加载图片,比如说我这边留吧,对吧?就是刘德华对应的图片吧, i am ready 的 读取这个图片,这叫刘,对吧?然后呢,我还有读取谁的?这个是郭富城的,对吧?我这边读取郭富城的图片,这边郭, 对吧?点接 bg, ok, 然后呢,这个图片我读取之后,我是不是第三步进行一个 bg 二转二 gb 啊?因为欧本思维默认是 bg 二 bg 二的这种格式或顺序,所以我这边还需要给他做一个通道的一个转换,很简单, 直接是这样,前面的高和宽不变,把后面的通道就颠,呃,颠倒一下顺序就可以了啊,颠倒顺序直接用这种这种写法就可以了,前面两个不变啊,一个负一嘛,这个就是我们列表的一种用法,对吧?所以我们这边一个,然后接下来是国嘛,郭富城的郭, 然后是通道给他做一个颠倒,这样就可以了。 ok, 这样的我们就把 b g 二转换成了 rgb, 那接下来一步呢?是不是我们要检测人脸了,对吧?我们这个图片你你输给了他,他也不知道人脸 在哪里,所以我需要对他进行一个人脸的检测,看看人脸到底在什么方位。所以我这边呢,肯定是有个叫给他一个变量叫六流 face, 对吧?通过我们的 face recognition 调用里面这个方法,通过 face, 然后呢他会提示你的叫 locations, 这个方法呢,主要是用来检测人脸在哪里的,你看他里面,他这里就提示你输入哪些参数了,对吧?他默认用的是 hog 这个算法来进行一个人脸的检测,当然 他还有一个,呃,还有个还有一种选择,就是用 cnn, 也就是通过我们的神经网络卷机神经网络来进行一个人脸检测。他为什么默认用耗子呢? 因为号码它的速度比较快一点,虽然它的精度不高,但是它速度比较快,如果你把这里的默认改成了 cnn, 它的速度就比较慢,速度比较慢啊,如果你的机器啊,你的电脑的性能比较 包,我建议你算用成 c n n, 他的这个精度比较高,我们这边呢就全部选择默认的了啊,这样速度就比较快一点。然后我们这边首先把这个图片你要给他扔进去,对吧? 我们的图片是不是我这边这样写一下,因为我们转换成 rgb 了吗?所以我这边给他做一个标记, rgb, 对吧? 我们就把这个留的这张转换后的 rgb 图片给他扔进去,这样呢,他就能够自动去检测这个人脸了。看看你这个图片里面有几张人脸,他都他都会给你检测出来,最后给你返回他的位置。 ok, 接下来呢,我们就检测一下郭富城的人脸郭, 然后呢 face, 然后再用,再调用这个方法 locations 就可以了,然后是锅而击毙,这样呢,他就会把图片里面所有人脸,这个图片里面所有人脸都会检测出来,这个也会检测出来。人脸检测出来之后, 我们是不是要对他进行一个啊特征的编码了,也就是编码成一个一百二十八位的特征项链,所以我们这边呢,还是调用这个叫 reconnesse 方法,然后调一个叫 face including 这个方法 includings, 他就会给你去做一个编码的一个工作。首先呢,你要把他图片放进来,留 rgb, 对吧?同时呢,你还需要把刚才检测到的人脸的数据给他放进来。为什么?因为你这个留 face, 我们现在这个图片他只有一个人脸在里面,那如果我们这个图片里面有很多张人脸,那你这边 得到的这个留 face 是不是它是一个数组里面有多张人脸的一个坐标,所以你这边呢要把它给它传进来,因为我们现在看到的它这个是一张人脸,但是呢,如果这图片里有多张人脸,多张人脸怎么办呢?所以你这个肯定要传进来,对吧?它这个留 face 可能是一张 人脸,有可能是有多个人脸在里面,然后呢,这样他就可以进行一个人脸的编码,对每一个人脸他都会进行一个一百二十八位的一个特征的一个一个编码。 ok, 那接下来呢,我们看一下锅 那说,呃,锅的一个 recognition re 锅,哎, sorry, 应该是 face reconnession, 我们对他已经一个编码,然后把锅的这个图片先给他传进来 说 rgb 的图片,然后把锅刚才在图片上检测到的这个人脸给他传进来,对吧?没有问题吧?然后给他复 把它,首先啊,付给一个变量,为什么呢?因为我这个减编码之后啊,他会,他会得到什么呢?他会得到很多张人脸的编码,所以我这边一定要给他复制一个变量的,比如说留,对吧? including, 当然我可以加 including, 因为我们我,我们现在知道他这个图片上就一张人脸,所以我这里呢,我就这样去命名了,但这样命名其实不太好,因为你这个刘嘛,刘德华,你这个太,对吧,你就已经知道结果了嘛。但是我们今天主要是演示嘛,我们就先这样写, ok, 然后呢,这这样呢,我们就拿到了每张图片上每个人脸的一个编码,我们全部就拿到了, ok, 那接下来我们就把他们放在一起啊,当做一个数据库去使用,怎么放呢?啊?太简单了。首先是我们,比如说我这边这样写,叫做 incoling spa, 因为是所有的嘛,我都放在一起了,比如第一个是留的 incoling 放,放里面, 然后锅的 encoding 放里面,就是这样就可以放在一起了。然后呢,我要给他们一个命名,就 names 把,就给这两张图片进行命名,因为我们一旦进行人脸识别,我要给他显示个名 称的,所以我这边呢,比如说刘德华,对吧?郭,你要用字符串,郭富城,对吧?这样就可以了,两两张图片,然后呢两个人,两个人点吧,两个人我就给他两个名称,如果你这里有很多姓名的话,你这边可以再放很多姓名都可以, 这个这样呢,我们就组合成了一个,一个数据库,一个数据库,这个是编码,这个是名称。接下来呢,我们就打开摄像头,你看我们这个每一步是非常清晰的,我建议各位朋友写代码呢,也可以这样去写,你先用中文去描述,然后你再写代码,就像那个 啊,建房子一样,你先把骨架搭起来,然后再往里面填这个砖头。然后首先呢,我们打开我们的摄像头,是不是因为我们的 cv, 然后是 v 六 capture, 对吧? ok, 打开摄像头,然后呢,我们 是不是你要判断一下我们这个摄像头他是否正常的打开了,如果没有,那我就要报错,我就要给你一个错误, io arrow 这个错误,比如说 camera row arrow, 对吧?我就会告诉你摄像头错了,你的摄像头设备有问题。 ok, 这样就可以了。那接下来呢,我们是不是要通过一个外循环去不断的读取我们这个摄像头啊?直播间,所以我这里用一个外循环, 然后这边写法很固定啊,然后是 cap, 然后 read, 对吧?这样我就能够读取到每一针了吧,也就是每一张图片这个 frame, 也就是每一张图片 读取号。读取到之后,我是不是要和上面一样进行一个呃, rgb 到 b 教的一个转换,所以我这里呢,直接给他进行一个转换,怎么转啊?是不是跟刚才的一模一样?今天是 frem 吧, fram, 对吧?然后呢?哎,然后是,呃, frem, rgb 吧,还是跟上面写法一模一样吧,这样我们就知道这个 frem 是不是已经转换,转换之后的了, 我们这边还是一样高和宽不变,把它的通道顺序变一下就可以了,这样我们就把它通道给转换好了。那接下来我们是不是和上面一样进行一个人脸检测了吧?就第九步进行人脸的检测, 检测是不是用这个方法,这个 location 一样吧,对吧?所以我们这边还是用这个 location 来进行一个人脸的检测,是不是 fast recognition, 然后呢 location 看一下啊,是 face locations, 这样呢他就会检测你这个图片上的人脸到底有几张人脸在上面。 friend rgb, 然后给他啊,把这个 返回的结果呢复制给一个变量,比如我这边就叫做 faces locations, 据说可能他有好几张人脸的一个图片,这个好几张人脸的这个数据啊,我都给他赋予了这个变量,对吧? 那接下来我们要干嘛?那么我这个人也检测到了,我是不是要给他进行一个编码,跟上面这个步骤是一模一样的,我要对他进行编码,怎么编码?是不是用这个 face recognition 里面有个叫 face includings 啊? 他这个方法都给你写好了,待会我们会看一下他底层的实线是怎样实现的。这里呢,首先我们需要把这个 fram rgb, 你要给他这个原始图片给他,然后呢你还要把这个刚刚找到的这个啊, face faces, faces locations, 刚刚给我们找到的所有的人脸的数据,你要给他,我们给他往里面一放就可以了。最后呢,他会给 给我们返回一个数组,就是一个一个列表,这个列表里面是所有人脸特征的一个编码,所有人脸的一个人脸特征的一个编码,下面这里呢也给他一个命名叫 faces, 对吧? accordance, 这样就可以了,我们就拿到了他的所有的这个人脸特征的一个编码了,全部拿到了,那么接下来是是做什么呢?你是不是要 与我们的这个数据库啊进行一个对比了,就说我通过摄像头识别到的检索到的人脸,我要和我们这边的数据库里面进行对比, 看看到底是不是刘德华还是郭富城,还是说你是其他人,对吧?我这边呢就要进行一个对比,对比你肯定要用一个负负循环嘛,因为我们数据库里面有可能有很多人,我们现在才两个人, 那你如果有一百万一一百万张图片怎么办呢?所以我们这边要用一个负循环做一个对比,对吧?这个对比呢,我们可以这样写,比如说,嗯,我能, 我可以把这个 locations 和 including 可以把它们放在一起,我们可以这样写啊,首先是啊,我先写,写完之后我再跟你讲,为什么我这么写 top, 然后是什么是 right, 然后是 bottom, 然后是什么是 left, 然后呢,这边是一个 locations, 一个 face including, 我先这样写,你还不知道我为什么这么写,对吧?啊? in zip, 然后是我们的 face is locations, 然后是 face is includings, okay, 这样就可以了,我为什么这么写啊?首先我用这个 z 盘数,就是将我的这个刚刚检测到的人脸数据和这个 includings 每个人脸对应的这个 includings 放在一起。这个 zip 函数呢,就是一个粘合函数,把他们组合起 起来,组合在一起,然后我通过一个,通过一个负循环呢,不断的去读取他们里面的每一对数据,我通过一个负循环都是不是在读取啊?那么这个 location 我刚才讲过了,他返回的是什么?返回的是坐标,对不对?就是你的,你的,你,你的这个四个坐标,所以这边呢,给他返回了 top, right, bottom, left 四个点的坐标,我都给他,我都全部给他拿到了, ok, 全部给他拿到了,然后这个 face including 呢?其实就是我们拿到的这个里面每一张人脸的一个特征编码,一一个一百二十八位的一个特征编码, ok, 这个就是负循环的一个作用,就是循通过循环拿到他们相对应的坐标和编码,就这么简单。那接下来我们要干嘛?是不是你拿到了这个编码之后,我需要进行一个匹配啦,对吧?我需要进行匹配,匹配怎么匹配呢? 很简单,我这里,哎,我把这个这个备注放到里面去,接下来就是进行一个匹配,匹配啊,我们也是有一个方法的,叫做 face 啊, recognition, 对吧?然后呢? face 里面有个叫做,看一下啊,叫做 compare, compare faces, 就我们可以用通过这个方法来进行一个比较,或者说通过一个 啊,通过这个方法来进行匹配。它里面你看你要传进去两个编码,一个是已知数,已知的人脸的编码,你要给我传进来,说白了就我们这个数据库吧,刚刚准备的还有一个呢,就是你摄像头检测到的这个 人脸的一个编码,这两个编码你要给我传过来,然后这个是一个默认值,也就是零点零点六一个预值,你不用管他,这个你不用管他,我们找一下刚才这个数据库的编码,叫做 mcolins, 这个你给他拷贝过来,然后呢,我们 通过循环读取到的每一个人脸的编码,你要给我考过来,这啥意思啊?就是说我把我检测的这个第一个人脸和我已知数据库里面所有的人脸进行对比,我看看你们两个人之间是否相似,我会计算出一个,就就是进行匹配嘛, 我会判断你们之间是否相似,会得到一个距离,你这边肯定会给我返回一个距离的,这个就是进行一个距离的一个计算。 ok, 那么,呃,我拿到啊,这边应该是一个匹配, sorry, 不是距离,距离是在下面计算,我们这边应该是因为这边是一个距离,对吧?我们在第十三步,我们会进行距离计算, 这边呢,你会拿这个匹配,他会进行判断,比如说这两个人是否相似,如果相似我就给你一个 choo, 不相似我,我就给你一个 force, 所以这边是一个匹配,叫 matchs, m, a, d, c, h。 我们这样写啊,然后接下来我们才是计算距离, 计算距离也很简单,通过我们的 face, 那肯定是里面有个叫做啊,看一下在哪里叫做 face distance, 对吧?通过这个,通过这个方法,它是计算距离的,而这个是用来进行比较的,所以我们这里呢,可以进行一个距距离的计算,也很简单,直接是 in call things, 然后呢 face including, 这样就可以了,这样就可以了,我们现在呢就可以通过这个方法来计算他们的距离,最后我们就拿到了这个距离,比如说叫做 distance is, 我们现在就拿到了啊,这个人脸和数数据库里面所有人脸进行这个计算之后的这个距离,所以这边呢也是一个列表,他有很多距离的,对吧?因为我这个数据库我现在才两张人脸,如果我有很多张人脸,那么他这个 返回的结果呢?就是有很多很多的这个数据,也就是距离嘛在里面这是一个列表, ok, 那这个距离我们就计算好了,那接下来我们要干嘛?我们是不是要做一个判断,就说我们也就是第十四步,我们要做一个判断, 就说如果匹配我们就获取到他的名字,这个判断怎么判断呢?也很简单,直接是用我们的这个易腐语句,易腐语句我这里啊,我要先将用个内内幕来做一个,就说如果我们这摄像头读取到的这个人脸 不在数据户当中,我就给你返回一个叫 oh no, 我不认识这个人,结果这边呢先给他定一个啊,这个字串的一个一个变调名,就是叫 name oh no。 然后接下来我会做一个匹配,用一个一辅一句来判断,比如说我会说 f matches, 这个里面呢,我会用的就是我们这个叫做呃 呃,距离,那么你在这里写呢?为什么我要用距离啊?其实我们你看我这个图片和数据库里面所有的人呢,做了一个距离的计算,对吧?那么这里呢,其实我会拿到一个,我想拿到一个最小的,什么意思啊?比如说 我摄像头检测到一个人脸了,对吧?我和这里的两张人脸作为一个对比,他最后给我出出来的数据,比如说和他比较相似,那么和他比如说不相似,那么他的距离就比较短,就比较小, 那么这个纸呢?和他的距离就比较大,对不对?那我就想拿到这个最小的一个距离,就说最相似的那个距离,那么这里呢?我就可以这样写,可是我想拿到一个最相似的距离或最小的距离,他又叫 mp, 里面有个叫二哥,对吧?好,二哥 mix, 二哥 mi, 对吧?拿到一个最小距 距离,通过这个方法呢,这个呢?派这个方法呢?他就可以拿到一堆数据当中所有距离当中一个最小的,说白了我就挑那个和我最相似的那个人脸的一个距离,这样我就拿到了,对吧?拿到之后我这里就可以做判断了,我会把这个最相似的距离拿过来。这个匹配,哎, 你是否和我是就你我拿到的这个人呢?或这个距离是否在我这个数据库里面存在?如果存在呢?我就说,哎,匹配上了,如果不存在,那我就说没有匹配上,结果这边呢?可以这样写, 对吧?就说如果他能够匹配上,能够匹配上,那你就去我这个数据库里面嘛,在这里在这个内幕词里面找对应的名称就可以了,对应的名字,对吧?就这里呢?如果你匹配上了,我就这边给你返回相对应的名称。 ak, ak, 其实这个这个二嘎,他的结果呢?他不是一长串的什么什么距离,那个很小,数点特别长,不是他返回的,可能就是一些什么零,对吧?什么一二正下标,就这个返回的他不是具体的数值,而是他对应的下标 啊,所以这个我这边如果这样写,各位不太明白,我就可以这样写, index 就下标的意思吗?我可以这样写,这样呢,可能大家理解起来就比较简单一点,就是 他最后返回的是一些下标,你知道吧?所以我通过这个 max 呢,就可以去找他那个对应的下标,对吧?去找他那个下标,如果他在我们这个呃赢这个数据库里面,那我就给我就说你已经匹配匹配上了,所以呢,我就可以把你这个下标拿过来,去 找他对应的这个 name, ok, 就是在这个 names 里面去找对应的这个 names, 可以,最好可以这样写,因为如果我不嫌 index 呢?很多朋友可能以为就是,哎,你这个距离那么长的数字,对吧?怎么匹配的?其实它返回的是一些下标, ok, 这样我们就能够匹配上了。 那接下来呢,匹配上之后我们要干嘛?我们是不是你要绘制这个人脸的矩形框了,对吧?我把这个备注拿拿过来, 然后绘制。人家举行过,怎么绘制啊?是不是用我们的 rectangle, 对吧? record tango, 首先是我们的 fram, 对吧?然后呢是不是你要坐标给他一个坐标?一共是两个坐标吧,对吧?我们这样先写一下, 然后呢我会这样写边框,举行的边框给他一个颜色粗细,对吧?里面的坐标,第一个坐标就是第一个点的坐标嘛?这个点的坐标很好写哦。首先是一个类 吗?然后呢是一个套,对吧?这个我们在前面的几期视频当中也给大家讲过,我这里就不再重复了。为什么这么去写?因为你一个矩形啊,你一张一拖,对吧?他这里有一个点,然后呢?然后他对角线也有一个点,这样我们就能画出一个矩形, 画出个矩形框,所以这个就是第一个点的一个坐标,那这个呢?就是一个对角线的一个坐标。 ok, 这样我们就能够把一个矩形框给他画出来, ok, 举行框我们已经画出来,那接下来你是不是还要把下面就那个,我要,因为我要显示对应的一个名字嘛,所以那个我也要画一个小的举行框,对不对?因为我要在这个举行框下面显示名称,结果呢?还想再画一个小的举行框, 那怎么画?是不是还是用 rectangle 来画,对吧? recotangle, 然后呢?是 frame, 然后这里的坐标呢?一定要注意这里的坐标,我先不写坐标,然后呢, 我先这样,不然大家可能容易弄混,然后这里还是有一个有零点二五五, 然后呢?有时候宽度还是三八,比如说,因为,呃,我还是给各位看一下 ppt 照,一定要看一下的,不然不容易了解。你看我上面一个这种绿色的一个框,把人家框住了,对吧?然后在下面,下面也就说我想显示人的一个名字在这里,对吧?那你这边是不是 往下就是,呃,他的的第一个点,就是这这个点的坐标和他的横横坐标,呃,和他的这个横坐标是相似的,重坐标是,对吧?呃,重坐标是相似的,横坐标是不同横坐。呃,看一下,哦, 横坐标相同,重坐标是不同的,对吧?第一个点就这个点,他的横坐标是相同,重坐标是不同,对吧?因为重坐标低, 是在这边是零零吗?那你这边的动作标肯定不是零零了,对吧?那这里呢,也是一样的,这里和他的众坐标,众坐标是一致的,但红坐标又不同,所以我们这边可以这样去计算,这个就主要是一个计算的一个 计算的一个过程,比如我们这边可以说他的横坐标相同,对吧?第一个点的横坐标相同,动作标不同,那我就这样写吧, ot 点三十,比如说,因为我是显示在各位朋友,再看一下,我是显示在他下方,对不对?下方,所以呢,我用这个 bottom, 其实这边不用减加也行,我用加吧啊,当然我们待会可以看一下效果, 加一下就行了,因为剪的话这个效果感觉有点丑。然后这边呢,继续一个 right, 这样 bottom, 我们具体待会会看一下效果,来调整他这个坐标的一个位置,我们可以调整的,因为 这边呢,我也是感觉应该是这样的,我们待会可以试一下。啊,这样呢,我们就把这个名称的矩形框给他绘绘制出来。名字的矩形框绘制出来了,那接下来我们要干嘛?你是不是要在这个矩形框里面写上他的名字呀?对吧?所以我们这边可以这样写, 显示啊,啊,显示吧名字,我们把这个改成时期显示名字, ok, 然后呢,我们实现一下,怎么显示啊?是不是我们 cv 库里面叫做 put text 这个功能,对不对?然后呢,是我们的 fram 这个图片,原始图片,然后是我们的要显示的名字,这个名字呢,我在这里已经给大家注视了, 如果他不认识就显示,哦, no, 不认识,如果认识他就会去这个 name 里面根据下标去检索 检索,如果是第一个就是刘德华,第二就郭富城,他会一一对应的去检索,然后这边呢就会显示,然后呢给他一个坐标,比如说这样写吧, let 也是左边的,对吧?这我给大家加个十吧, 这个比较好理解。坐标,这个比较好写,这个显示你只需要,呃,加三十吧,加三十,对,然后呢这个跟这个和上面的要一致,就这个这两我们先一致的看一下,加三十,然后呢我们这个 bottom 减三十,我们这样试一下,然后看一下效果,然后我们的字体,字体是不是之前讲过啊?你不用去记,用这个 complex, 默认的 complex, 然后是一,然后呢是我们的啊,字体颜色,我们就这样写, ok, 然后呢字体的一个大小粗细, ok, 这样就可以了,这样就可以了,我们继续这样,我们就把字体给他写上去了,对吧?写上去之后我们是不是要看一下整体的一个显示效果啊?整体的显示效果,呃,这个很简单,直接是用我们的这个 c v m 秀就可以了, 比如说我们这边叫 face recognition, 对吧?然后呢把这个 flip 给它显示出来就可以了,这边应该是十八了,对吧?我们这边写一下,改成十八, 显示整体效果,这样就可以了,看有没有问题,哎,不对,那这个应该出来,不能在负循环里面,不然会爆错,这样就可以了。那接下来我们是不是要做一个判断,就说如果你这边按下了这个 esc 键,或者说 q 键, q 键,那么我就退出,如果你按下了这个 q 键,我就退出,只用一个 f 一句,然后呢用个 y k, 这个我们在之前讲了很多遍了,我就不去讲这个 功能了,他很固定你,如果你按下了 q 键,我就退出,整个这个循环也就关闭啊,就把整个程序都给他终止了。最后呢,我们会关闭所有的资源。二十 说关闭所有的资源,怎么关闭呢?是不是我们有个叫 cap, 对吧?哎,我看一下是不是在 这边有个叫 cup, 对吧? frake 应该是我们的 cup 点 release release, 然后呢? 然后是什么?是我们的 cv, destroy or windows, 没问题吧?我们会释放所有的资源,对吧?然后我们看一下有没有问题, 没问题,看一下。我担心这个坐标显示的时候可能会有点乱,因为这个坐标你需要算一下的他那个位置,不过影响不大。我们先看一下有没有问题,我们先运行一下,看一下效果。 哎,好像有问题哦好像有问题哦。在这里他说 list index out of range 超出了界限,在四十八号,在这里我们看一下是哪里的问题 啊?二个,对吧? indexes, 然后我们这边用了一个 f matches, 对吧?匹配,我们进一个匹配,然后呢,如果如果他匹配上了,我们就找到他对应这个 names, 对吧?看一下哪里的问题 哦,错呢?你看到他这里说超出了这个范围,其实啊,这里是没有问题的。错,是错在哪里呢?我们这边啊漏写了一个,一漏写了一步,就是在这里漏写了一个东西,在这里出错了, 就我们这边必须要加上他的一个坐标,不一个啊?这个零为什么呢?要提取一下呢?因为我们这边呢,你会发现我们这边是一个人脸,对吧?那么我刚才讲过了,如果这张图 边上有多张人脸的话,那么你这边他肯定就说你这个返回,如果我不写零的话,他返回的是一长串的这个这个 encoding, 就所有的编码,比如说三张人脸,那么他这边拿到的 就是三张人脸的一个特征变吧。那今那我们这边是一个数据库,我们知道他只有一张人脸,所以说我们就只只取第一个人脸的一个数据,所以我们这边必须要加上零, 这个他的作用就是说我们提取里面第一个人脸的一个特征编码,第一个人脸特征编码,我们比如我们这个图片他就一张人脸,对吧?那么我这边计算出来之后,你一定要把它提取一下,就加上这个零, 他就提取他的这个第一个特征编码,如果你这边不加上的话,他就会报错,而且报错呢还很奇怪,他还报错在这里,这里根本就没有超出他的界限和 范围,所以呢我们这个写代码呢,他有时候我们一旦一不小心啊这个就报错,而报错之后你会花很多时间去找这种小问题,这种小问题有时候你很难去一下子找到的,就是,所以我们这个一定要注意,一定要注意,那我们在运行下看看 有没有问题,如果有问题我们就再找问题,我们运行一下让一下, 哎,现在是没有问题,对吧?只是呢他有点卡, 他只是有点卡而已,我们先退出。 呃,有点卡,主要是第一个呢卡可能和我们这个算法有问题吧。还有一个呢, 就是我们这边这个视频,可能这个框窗,这个窗口太大了,我把这边稍微调小一点。怎么调?我在这里稍微调小一点,比如 friend, 对吧?然后点 recise, 我把它呃,把它 recise 一下就行了。应该是这样 re recise, 然后呢?我们的 frame, 然后原图我把它调小成一半吧,就把窗口缩小为一半,这样一半大小,这样会快一点。可能会,我们这样试一下,我们再运行一下,看一下 把窗口调小一点,这样可能会速度快一点,哎,这样就可以了,对吧?你看这样它的速度会比较快一点,只是我们这个字体它显示到上方去了,我们要把这个 这个这个位置要调一下,不然那个字体在上方,对吧?我们再推出再改一下字体,再改一下这个坐标,这个坐标我们这个坐标要改一下,我看一下他往上跑了,往上跑了,就字体在这里,他往上跑了,我们只要改这里就可以了。把这几个改一下。 怎么改呢?他这个应该是不对的,这个应该是因为他往上跑了,往上跑了,我们这边肯定要减十,减十,然后左边左边加十吧, 试一下看下效果怎么样就行了。然后这边不是加,应该是减往下跑,往上跑了,这样我们再再运行,看下效果是怎样的。我们再运行一下这个,这是一个坐标的调整,如果你发现这个坐标他跑的就是 有点偏了,你可以调整一下。哎,这样就这样就可以了,你把坐标调整之后啊,他这个大小这样就可以了,对吧? 你看他现在有时候识别,是啊, no, 无法识别,然后有时候又能识别出刘德华,对吧?把我识别错误了,对,他,因为为什么他会识别错?主要就是我们这边的 数据库的素材太少了,就两张图片,所以呢,他的特征是太有限了。那么接下来呢,我们有另一门课程,就是深度学习,也就轻松学这个拍 touch, 也就深度学习的一个框架。那这是我们新的一门课程。接下来呢,我会通过卷机神经网络来给大家讲一些这种人脸识别的一些项目,它的精度包括速度啊,比这个要快的多。我们这个是算法比较传统,用的是 他集成了一个算法,比较传统,然后呢也比较慢,当然也和我的机器有关,因为我是笔记本,所以他跑起来速度就比较慢,如果你的这个设备比较高级高配, 那可能速度就比较快点。好了,那今天我们这个任务呢,就就先讲到这里,应该刚才出现一个问题啊,主要就是我们这边 要把它提取,第一个我们这个没有提取,所以他就会报错,他会报错这种小问题,其实有时候你你很难发现的,要去找一下。 ok, 那今天任务呢,我们主要是这样的,已经实现好了,那这个代码,包括整个项目的代码我都会分享在我这个云盘里面, 各位朋友可以在视频下方去找一下这个链接啊,可以找到所有的这个项目,包括代码、 ppt、 k。 那我们再稍微看一下这几个方法吧,这是我们今天调用的几个方 方法,像 distance, locations and the marks, 关键点对吧? includings, 然后比较人脸。然后呢,这边有个 ipa 的文档,改进去的朋友呢,可以去看一下,去看一下他这个官方文档。 ok, 那今天我们任务呢,先到这里,如果啊,你有任何疑问呢,可以在视频下方给我留言,那么我将及时啊进行一个回复。那欢迎各位朋友呢,继续学习后续的课程,拜拜。

这是一个五官配准程序,然后特别流畅,然后用的是爱三的低压版。注意 cpu 使用率啊。对,爱五的。


接下来让我们看一下这个前台部分,前台使用到人脸识别部分的,呃,是怎么实现的?首先一个 fast 框架启动,你的 fast 项目启动之后呢?然后进入你的网页里 啊,进到首页中他会有一些签到信息录入管理,说实话这些主要看这个签到部分,签到部分就是涉及到你的人脸识别,就是用 open vc 去去打开你的摄像头 进行一个签到,比如现在点签到,因为刚才在训练的时候就已经录入信息了,我们直接签到 可以看到有一个 能识别到信息之后,他会直接展示出你的各种信息,如果识别的不是特别准的话,你可以重新识别, 嗯,这个就是,然后下面会显示你近五次的一个签到记录,它实现的过程就是在你 在你的这个页面中,就是当你点击这个签到的过程中,点击它之后,它会进行一个 os 的一个操作,就是用系统去调用一个 命令行,就是模拟命令行的操作,打开你的 face dict 目录,然后去运行你的 recognition, 进行这个之后,他会自动就是之前说过的去打开摄像头采集人脸,最后存储信息,存储信息的时候他会把你的识别结果也存进去, 所以在这你直接去读你的识别结果,读完识别结结果之后,然后这是读取你的用户表信息,然后把用户表信息去返回给前端进进行一个显示,然后就达成了这样的效果。 这是这个是和你的人脸识别使用部分相结合的一个前台,当然还有一个信息录入,信息录入的话它会它同样的道理,它使用的是你的 get face, 就是去采集你的人脸, 然后去进行这个 cat face, 这样就实现了一个人脸嘟嘟的效果 啊,这个就是你整个人脸识别的系统,从人脸识别到我们前台的交互过程。

实时精确的获取前景人物对象是计算机世界任务中非常重要的技术之一。比如说在虚拟背景、增强现实和电影制作等应用场景中大量应用可以看到不管背景和光线如何的变化,获取效果都非常的棒。大妈已经开园,详情见主页店铺。

这个怎么样啊?瓜保熟吗?我开水果摊的,能卖给你生瓜蛋了。 your baby just touch your baby just touch。