HaaS智能门禁等应用场景需要用到双目视觉,让门禁系统可以拒绝打印图片,手机屏幕,面具,3D头套等非活体攻击。
这里先从计算机双目视觉的设计出发,看看出现过的不同的变种,以及用来解决的问题。
计算机的双目视觉一开始的设计就是对称双目视觉,模拟自然界中生物的双目视觉来得到只有双目才能实现的立体视觉能力,比如获取目标的深度信息。
自然界中草食动物一般是两只眼睛长在脸两边,两只眼睛的视野几乎能覆盖360°,为了能够看到四面八方的捕猎者。模拟草食动物的视野的就是全景相机。
肉食动物的眼睛一般是长在脸的前面,为了能够确定猎物空间位置用于捕猎。模拟肉食动物的视野的就是3D相机。
随后计算机的双目视觉派生出了非对称双目视觉的设计,包括广角+长焦,彩色+黑白,彩色+红外等等。
广角+长焦相机是现今手机上很常见的组合,通过裁切来实现模拟变焦。
彩色+黑白相机是华为手机曾经使用过的设计,用高像素的黑白相机提供亮度信息,低像素的彩色相机提供颜色信息,理论上由于人眼对亮度敏感度大于颜色敏感度,这样可以在有限的成本下实现比较好的画质。
彩色+红外相机则是在普通相机的基础上增加了夜视和活体检测的功能。由于人体无时无刻不在向外散发红外线,所以红外相机可以不利来光线检测到人体,以及通过红外线来判断彩色摄像头拍摄到的图像是来自一个真人,还是一张图片,或者手机屏幕。
双目计算机视觉拟合算法是用来解决什么问题的。
在各种不同的双目视觉场景下,都希望知道两个摄像头的视场角的空间关系,来进行双目视觉的计算。
比如,在彩色摄像头的一个区域发现了一张人脸,那么要知道这个人脸所在的区域,对应到红外摄像头上,是那一块区域,我们才能去进行活体计算。
也就是说,需要可靠的双目视觉视场角匹配算法,产品才能最终落地。
红色和蓝色的方锥分别是左右两个摄像头的取景范围
那么在这样的情况下,在某景深下,同一个物件在两个摄像头中的成像就是这样的映射关系:
(即使在理想情况下,同一个物件不同景深下的两个摄像头的映射关系也不一样)
由于生产工艺所限,两个摄像头在间距,垂直高度,上下角度,左右角度上都会出现一些偏差,并且每台设备的偏差都不一样。
(为了表现偏差的影响,下图中画的比较夸张)
那么在考虑到生产工艺之后,在某景深下,同一个物件在两个摄像头中的成像就是这样的映射关系:
在单个摄像头的成像上大概是这个样子:
光学畸变分为径向畸变和切向畸变,如果想要用数学方法来拟合极其困难。
本文就不加以展开,参考论坛上其他文章。
在上图的空间关系的基础上,考虑到两个摄像头不同的区域的光学畸变的影响也不同,建立空间映射关系就变的非常复杂。
由于光学畸变导致空间数学建模变的非常复杂,而实际应用场景往往对一定距离范围内(比如0.5米-1.5米)的摄像头的视场角中心(中心25%)区域比较关心,可以采用多项式拟合的方式来建立在某个特定的距离下从摄像头A到摄像头B的映射关系,这样能保证中心区域相当精准,而边缘区域的误差也在可以接受的范围内。
在足够的采样点的情况下,更高次的多项式能够更精准的拟合结果。但是实际我们采用了3次多项式,因为在不使用高精度数学库的情况float型的精度也就只能保证3次多项式的结果足够精准了。
比如3次多项式拟合摄像头A当中点(Xa, Ya)到摄像头B当中点(Xb, Yb)的函数如下:
Xb = Xa^3 * P3 + Xa^2 * P2 + Xa * P1 + P0
Yb = Ya^3 * Q3 + Ya^2 * Q2 + Ya * Q1 + Q0
而其中P3~P0,Q3~Q0就是拟合过程中需要计算出的参数。
将一张棋盘格图纸放在两个摄像头都能完整拍摄到的地方,且尽量铺满图像。
如下图左边为红外摄像头的图像,右边为彩色摄像头的图像。
然后找到两边棋盘格的17*31个内顶点(opencv有现成的函数findChessboardCorners()),这样就找到了摄像头A的527个位置点以及他们分别映射到摄像头B的位置点。
然后通过最小二乘法或者其他多项式拟合算法分别对X轴和Y轴计算,算出P3~P0,Q3~Q0这8个拟合参数。
本文就不加以展开,参考论坛其他文章。
对摄像头A的图像的每个位置点,应用拟合函数,生成在摄像头B的图像中的对应位置点。
下图是在摄像头B的图像基础上画上了计算结果来验证拟合参数。
红圈是摄像头A的图像中的某个位置点
蓝圈是根据摄像头A的图像中的该位置点拟合出来的摄像头B中的对应位置点的估算位置
红圈和蓝圈用红线相连
绿圈是摄像头B中的对应位置点的实际位置
结果可见,在固定距离下,拟合的效果还是相当精确,差异都是像素级别。对于人脸识别等场景做人脸匹配,已经完全足够了。
多项式拟合是在固定距离拟合的,那么一旦目标离开估计距离较远就会产生比较大的偏差。
如果想要降低距离产生的误差,可以在多个距离标定多套参数,然后根据距离插值。
比如当前目标距离是0.75米,那么把0.5m的拟合参数算出来的结果和1.0m的拟合参数算出来的结果取平均值即可。
但这由引出了一个问题,如何知道双目系统中某个目标的距离,方法一般有:
激光测距等硬件,非常精准,但是需要额外的硬件成本
根据标的物在两个摄像头视场角的相对位置估算距离,这个方案精确度一半,且对算力要求比较高
对于人脸识别等特殊场景,只要是成年人,不论男女胖瘦,人的五官所占区域都差不多大小(胖人的脸大但五官并不大),可以使用五官的尺寸来估算人脸的距离,这个方案精确度较低,且识别目标仅限成年人,但几乎没有额外成本。
工程学的一种思想就是,没有最好的方案,只有最合适的方案。在开发成本,运行成本,维护成本,偏差范围这几个因素之前,达到一个局部最优解。