导读:今天聊OpenCV,我想从人脸识别讲起。

作者:木羊同学

来源:华章计算机(hzbook_jsj)

这几年人脸识别技术在国内发展飞速,给生活带了很多便利,这个大家应该都有体会。早几年进高铁站还比较麻烦,要先排长队,得让检票口的工作人员一个一个查看证件然后“啪”地戳章,才能进站。

很多人应该都和我一样想过一个问题,那为什么不多设几个口呢?我还专门问了朋友,朋友说都知道排长队体验不太好,不过多开一个口,就要多雇几个人,不但要一直开工资,还要有保险等各类配套的保障类支出,用人成本很高,所以二者只能相互取平衡。

现在呢?现在好多了,刷脸进站,看一眼镜头就完事,非常快捷。更重要的是,架设一台人脸识别的闸机的成本,比雇人便宜多了,所以现在进站几乎就不怎么需要排队。好,故事说到这里,才正要开始。

刷脸进站还是前几年的新鲜事,大家应该都还记得第一次刷脸进站的情形,就我来说,整个进站流程和以前习惯的完全不同。那时刷脸技术还刚刚兴起,翻车新闻时有传出,我对刷脸技术半信半疑,总觉得会出点什么小意外,所以后来顺利过机之后感觉非常奇妙,觉得人脸识别这个技术实在是太棒了。

当时我对人脸识别的了解还很初浅,翻过一些论文,费了九牛二虎之力才跑通一个模型。

人脸识别的原理展开能写一篇文章,不过要点有几个,首先你得从图像中框出人脸。一说人脸识别,可能你脑中会很自然的浮现出拿证件照比对想象场景,但回想一下刷脸进高铁站就知道,并不需要你额外提交一张标准的一寸照片,而是直接使用闸机上摄像头的实时画面的截图。

这有什么不同呢?脸部占比就不同,而且脸的朝向角度、站的位置远近,甚至个人高矮都会导致最终拍摄的图像质量产生差异。因此,人脸识别的第一步,是识别人脸,光这一步就足够难倒不少英雄汉。

后面的识别过程就更不用说,需要兼顾准确性和效率,识别不准当然不行,但为了准,识别太久,让大家排着长队等也是不行的,难以兼顾。所以,我当时的另一个感觉是觉得可惜,人脸识别能做好多事,但技术门槛很高,推广不太容易。

高潮来了。前段时间我偶然看到一份大学本科生的课程作业,注意,是课程作业,还不是毕业设计。这个课程作业要求做一个什么呢?人脸识别门禁系统,简单来说就是刷脸开门。

我当时都惊呆了,现在都玩得这么高端的吗?这本科生的课程作业居然就要做一套人脸识别门禁系统,那毕业设计岂不是要实现一套无人驾驶系统才跟得上节奏?!

我赶紧追问,才知道现在要做这么一套人脸识别门禁系统,远比我想象中的要简单很多,市面上已经有很多成熟的套件,只要像拼积木一样拼搭一下就完成了。主要用到的东西有两样,一样是树莓派,另一样就是我们本篇的主角——OpenCV

OpenCV用来完成人脸识别,剩下的“硬活”交给树莓派完成。树莓派大家应该听过,很有名的嵌入式开发板,不过本篇重点不是它,大家感兴趣再另写一篇细聊,这里先和大家报告一个有趣的发现。

树莓派虽然称为无限可能的极客玩具,但本身只是一块光板,需要搭配其他模块才能“无限可能”。所以,树莓派的卖家通常会提供包含各种功能模块的套餐,譬如搭配小车、摄像头之类的,其中有一种很热门的套餐,就是树莓派+OpenCV。你去淘宝搜树莓派,会出来很多树莓派+OpenCV的结果,个别店家还“贴心”提示可以帮忙“辅导”课程作业。

说了这么久,这个OpenCV究竟是做什么的?

当然,看完了上文,大家应该至少清楚OpenCV是可以用来做人脸识别的,但如果认为OpenCV只能做人脸识别,那就太大材小用了,人脸识别只是OpenCV传统艺能的一小部分。

看名字就知道,OpenCV是一个开源的计算机视觉库,Open不必说了,CV是Computer Vision,也就是计算机视觉的首字母缩写,深度学习业界专门有一类热门的研究方向,就是计算机视觉方向,譬如纽约大学的深度学习大牛Yann LeCun,还有斯坦福大学的华裔女教授李飞飞,都是在做计算机视觉方向的研究。

如果你上Arxiv看论文应该也知道,机器学习、深度学习有一个很热门的大类就是CV。

不过,“计算机视觉”这几个字咋一看好像都懂,仔细一想还是不知道究竟做啥,难不成是研究摄像头,不,科幻一点,是研究电子眼的?感觉离日常生活有点远,容易让人两眼发懵。其实,计算机视觉不高深,研究的就是咱们闲下来爱刷的那些玩意,图像和视频。

如果学过视频技术的同学,应该会了解得更深,知道图像和视频从技术角度来看是一回事。一段视频按时间轴拉开来,其实就是很多张的图像,我们常说的视频“帧”,其实就是一张图像的意思。所以,当前计算机视觉最核心研究对象,就是图像处理。

明白了这个,就可以接着介绍OpenCV了。OpenCV可以说是当前计算机视觉界里最当红的那只炸子鸡,几乎可以说只要你要做计算机视觉,你就一定会用到OpenCV。

目前深度学习很火,用深度学习做图像处理的非常多,这里面当然大量使用了OpenCV,譬如说之前GAN刚出来的时候,大家都很爱拿它来生成卡通人脸头像,那去哪里弄训练数据呢,通常就是用OpenCV在各种动漫截图里面切。

要特别说的是,OpenCV很早就在计算机视觉界广泛应用,历史远比深度学习要长得多,长达十余年。早在前深度学习时代,人们就已经在研究和使用OpenCV来完成各种工作,江湖地位是早就定好了的。

应该不难想见,OpenCV会是一个庞大复杂的开源库,根据《OpenCV深度学习应用与性能优化实践》介绍,主要的代码库有三个,核心库OpenCV core,新增功能(我的理解一般是指尚未测试成熟的新添加特性)库opencv_contrib,以及提供周边支持,譬如用于测试和示例的各种脚本的opencv_extra。

平时最常用到的是核心库OpenCV core,里面也细分了十余类各种图像、视频处理功能,譬如提供对图像的线性和非线性滤波、缩放等几何变换的图像处理模块、专门用于处理视频的,提供运动检测、对象追踪等功能的视频模块、用于目标检测的Obejdetect、用于视频存取和编解码的Video I/O等等。

除了这些功能性的模块外,还有许多支持模块,譬如现在都爱用GPU加速,OpenCV也同样提供了相应GPU模块。

应该说,在计算机视觉领域你能想到的功能,差不多都能在OpenCV里面找到。在深度学习崛起以后,计算机视觉的版图也极大地发生了改变,一些曾经热门的工具没落了,但OpenCV及时拥抱了时代的变化,反而Great Again了。

我们知道,对于深度学习来说,图像处理可谓是龙兴之地,而OpenCV非常重视深度学习,专门设置了一个深度学习模块,名字就叫OpenCV DNN。该模块在OpenCV的1.3版中首次出现在新增功能库opencv_contrib中,随后在3.3版移入核心库OpenCV core,正式作为OpenCV的扛把子之一。

接下来就要聊聊最难回答的那个问题:为什么要选择OpenCV?这不是抬杠,在深度学习,特别是在深度学习的计算机视觉方面,是个非常好的问题。现在深度学习很热,而深度学习已经有几个很热的框架,最热的应该属工业界最爱的TensorFlow,和学术界最爱的Pytorch,这两个框架轮番刷屏,选择OpenCV有什么额外的优势呢?

《OpenCV深度学习应用与性能优化实践》总结了四个特点:轻量、最少的外部依赖、方便集成和通用性。抄书没意思,我说下我的理解吧,OpenCV和TensorFlow、Pytorch这些框架不同,它不是用来“实现”模型的,而是用来“使用”模型的。

什么意思呢?简单来说,深度学习模型如果是从零开始,是有一套比较繁复的流程的,首先需要搭建模块,然后是训练模型,最后才能使用模型。这一套流程完整做下来,不但需要很强的理论基础和动手能力,还需要具备相当可观的资源,这就是为什么我此前觉得人脸识别技术不太容易推广。

那OpenCV怎么做呢?

OpenCV只做最后一步,使用模型,也就是《OpenCV深度学习应用与性能优化实践》书中所说的“OpenCV深度学习模块只提供网络推理功能”。

业界很推崇开箱即用,我想,OpenCV这种应该算是开箱即用最理想的样子,一个看似复杂的功能,譬如人脸识别,调用函数直接就能返回想要的结果,不需要任何中间流程赚差价。这就是为什么前面所说的人脸识别门禁系统,难度系数会被降到学期作业的程度。

《OpenCV深度学习应用与性能优化实践》的第8章用一章内容介绍了如何用OpenCV实现支付级人脸识别项目,这首先是一个人脸识别项目,那“支付级”是什么意思呢?就是再上一层,加一个活体检测,用大白话来说,就是支付级人脸识别不但要确保图像上这张脸是你,也即书中所说的“人脸身份验证”,还要确保这张图像是活人实拍,而不是从照片或者视频中抠出来的,用术语说就是“活体检测”。

听起来就感觉很复杂对不对,翻翻书里的代码,总共没几行,如果再刨去对各种预处理和结果显示操作,人脸身份验证的核心代码也就十行不到,活体检测的核心代码更少了,干脆只有三行。

没有多余的废话,是不是开箱即用理想中的样子?不过,这里面并没什么黑科技,要使用深度学习技术,背后的流程都是大体一样的,岁月静好,那都是因为有别人负重前行。OpenCV使用的模型当然也是需要经过训练,不过是通过外部训练,训练好了OpenCV直接拿过来使用。

当然,不是有了训练好的模型就万事大吉,现在深度学习的模型规模越来越大,结构越来越复杂,涉及了大量复杂运算,除此之外,还涉及并行计算等工程问题。

因此,如何对模型进行优化加速,在一定条件的算力下如何使得模型效率最大化,始终是深度学习在应用实践方面最关心的话题之一。这也是OpenCV的擅长领域,OpenCV提供了多类优化加速方法,包括GPU加速和CPU加速,其中又涉及Vulkan、OpenCL、Halide等工具库。

此外,上面所介绍的模型导入过程也有一些技术细节,譬如外部模型如何通过OpenCV内部的数据对象表示,需要对OpenCV有更深入的了解才能很好地使用。

推荐阅读《OpenCV深度学习应用与性能优化实践》,这本书由直接参与OpenCV开源项目的作者撰写,不但实战性很强,而且一些OpenCV的内部技术细节也能讲得很清楚,特别是对于OpenCV深度学习如何优化加速的问题,用了本书一多半的篇幅展开撰写,大量的细节背后,能够读出作者具有的丰富从业(踩坑)经验,很有参考价值。

关于作者:莫凡,网名木羊同学。娱乐向机器学习解说选手,《机器学习算法的数学解析与Python实现》作者,前沿技术发展观潮者,擅长高冷技术的“白菜化”解说,微信公众号“睡前机器学习”,个人知乎号“木羊”。

延伸阅读《OpenCV深度学习应用与性能优化实践》

推荐语:Intel与阿里巴巴高级图形图像专家联合撰写!深入解析OpenCV DNN 模块、基于GPU/CPU的加速实现、性能优化技巧与可视化工具,以及人脸活体检测等应用,涵盖Intel推理引擎加速等鲜见一手深度信息。知名专家傅文庆、邹复好、Vadim Pisarevsky、周强(CV君)联袂推荐!

划重点????

干货直达????

更多精彩????

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 读书 | 书单 | 硬核 | 干货 讲明白 | 神操作

大数据 | 云计算 | 数据库 | Python | 可视化

AI | 人工智能 | 机器学习 | 深度学习 | NLP

5G | 中台 | 用户画像 1024 | 数学 | 算法 数字孪生

据统计,99%的大咖都完成了这个神操作

????

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐