发明内容
本发明的目的在于提供一种人脸检测方法及系统,以解决在单机单路CPU主机上基于adaboost算法的人脸检测技术实时性差的问题。
为实现上述目的,本发明的技术方案提供了一种人脸检测方法,包括:
步骤S1:拷贝分类器模型和背景图到GPU的内存,所述分类器模型中包含滑动检测窗尺寸、滑动步长、强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、强分类器中每个弱分类器的叶子结点得分、强分类器阈值;
步骤S2:利用所述分类器模型以及对所述GPU分配的K个线程计算K个滑动检测窗在所述背景图的位置以及每一个所述滑动检测窗所在位置的子图的人脸置信度,并将人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度输出到CPU的内存,其中,所述K个线程中第n个线程计算的滑动检测窗在所述背景图的位置为(xn,yn),n=1,2,...,K;
xn=[n/([(width-winSize)/winStep]+1)];
yn=n/([(height-winSize)/winStep]+1)*winStep;
其中,winSize为所述滑动检测窗尺寸,winStep为所述滑动步长,width为所述背景图的分辨率宽度值,height为所述背景图的分辨率高度值,[]为向下取整;
步骤S3:利用所述CPU根据所述人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度在所述背景图中定位人脸区域。
进一步地,通过对所述GPU分配M个任务处理块,每个所述任务处理块分配L个线程,从而对所述GPU分配所述K个线程,其中,M的值为所述GPU中麦克斯韦流多处理器数量的12倍。
进一步地,L的值为所述GPU中一个麦克斯韦流多处理器中的流处理器数量。
进一步地,在所述步骤S3中,所述CPU采用非极大值抑制算法在所述背景图中定位人脸区域。
为实现上述目的,本发明的技术方案还提供了一种人脸检测系统,包括:
拷贝模块,用于拷贝分类器模型和背景图到GPU的内存,所述分类器模型中包含滑动检测窗尺寸、滑动步长、强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、强分类器中每个弱分类器的叶子结点得分、强分类器阈值;
处理模块,用于利用所述分类器模型以及对所述GPU分配的K个线程计算K个滑动检测窗在所述背景图的位置以及每一个所述滑动检测窗所在位置的子图的人脸置信度,并将人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度输出到CPU的内存,其中,所述K个线程中第n个线程计算的滑动检测窗在所述背景图的位置为(xn,yn),n=1,2,...,K;
xn=[n/([(width-winSize)/winStep]+1)];
yn=n/([(height-winSize)/winStep]+1)*winStep;
其中,winSize为所述滑动检测窗尺寸,winStep为所述滑动步长,width为所述背景图的分辨率宽度值,height为所述背景图的分辨率高度值,[]为向下取整;
定位模块,用于利用所述CPU根据所述人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度在所述背景图中定位人脸区域。
进一步地,通过对所述GPU分配M个任务处理块,每个所述任务处理块分配L个线程,从而对所述GPU分配所述K个线程,其中,M的值为所述GPU中麦克斯韦流多处理器数量的12倍。
进一步地,L的值为所述GPU中一个麦克斯韦流多处理器中的流处理器数量。
进一步地,所述CPU采用非极大值抑制算法在所述背景图中定位人脸区域。
本发明提供的人脸检测方法,不但可以解决传统人脸检测算法速度较慢,占用大量计算资源的问题,有效提高人脸检测速度,进而满足实时性要求,还可以解决传统人脸检测算法对光照敏感的问题,能够有效提升人脸识别的效率,使得使用单张GPU同时实时处理(25fps以上)16路以上的1080P视频流成为可能。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
参见图1,图1是本发明实施方式提供的一种人脸检测方法的流程图,该方法包括:
步骤S1:拷贝分类器模型和背景图到GPU(图形处理器)的内存,所述分类器模型中包含滑动检测窗尺寸、滑动步长、强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、强分类器中每个弱分类器的叶子结点得分、强分类器阈值;
步骤S2:利用所述分类器模型以及对所述GPU分配的K个线程计算K个滑动检测窗在所述背景图的位置以及每一个所述滑动检测窗所在位置的子图的人脸置信度(即可能是人脸的置信度,用于指示该区域是人脸图像的概率),并将人脸置信度大于等于所述强分类器阈值的子图的位置(即子图对应的滑动检测窗在背景图的位置)及人脸置信度输出到CPU的内存,其中,所述K个线程中第n个线程计算的滑动检测窗在所述背景图的位置为(xn,yn),n=1,2,...,K;
xn=[n/([(width-winSize)/winStep]+1)];
yn=n/([(height-winSize)/winStep]+1)*winStep;
其中,winSize为所述滑动检测窗尺寸,winStep为所述滑动步长,width为所述背景图的分辨率宽度值,height为所述背景图的分辨率高度值,[]为向下取整;
例如,通过对所述GPU分配M个任务处理块,每个所述任务处理块分配L个线程,从而对所述GPU分配所述K个线程(即K=M×L),其中,M的值为所述GPU中麦克斯韦流多处理器数量的12倍,L的值为所述GPU中一个麦克斯韦流多处理器中的流处理器数量。
步骤S3:利用所述CPU根据所述人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度在所述背景图中定位人脸区域,例如,所述CPU可以采用非极大值抑制算法在所述背景图中定位人脸区域。
目前基于Paul Viola和Michael Jones提出的AdaBoost算法,首先需以不同大小滑动窗(Slide Window)在背景图上滑动,得到背景图中不同区域的子图,再对该子图提取某种特征(如HAAR,LBP或者HoG等特征),通过特征判断该子图对应的原图区域是否为目标,由于一般背景图中子图的数量是上百万级别的,因此巨大的计算量导致cpu计算资源开销巨大,并且在一般装置上检测速度难以达到实时性的要求,另外,一般的子图特征提取对光照情况相当敏感,本发明提供的人脸检测方法,一方面通过修改子图特征为pixel wise特征,去掉积分图等不利于并行化的操作,整体算法粗粒化拆分,保证逻辑并行完备性,另一面修改sliding window扫描的线性实现逻辑,拆分为GPU支持的并行逻辑,可以解决在单机单路cpu主机上基于adaboost算法的人脸检测技术实时性差,以及对光照条件敏感的问题;
具体地,本发明实施方式提供的人脸检测方法可以包括以下步骤:
步骤A:从视频流中提取图像,获取背景图,并建立分类器模型,其中,分类器模型中包含滑动检测窗尺寸参数、滑动步长、强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、强分类器中每个弱分类器的叶子结点得分、强分类器阈值等,拷贝分类器模型和背景图到GPU(图形处理器)的内存上;
步骤B:分配GPU(图形处理器)任务处理块和块内线程数,优选地,任务处理块的数量为GPU中麦克斯韦流多处理器数量的12倍,块内线程数为GPU中一个麦克斯韦流多处理器中的流处理器数量,以英伟达gtx960m显卡为例,其拥有640个sp(流处理器),128个sp组成一个smm(麦克斯韦流多处理器),也即5个smm,测试发现,分配60个任务处理块,也即12倍于smm个数,每个任务处理块分配128个线程时,也即相等于smm内线程数时,检测速度最快;
步骤C:对于每一个线程,读取分类器模型的滑动检测窗尺寸参数和滑动步长,分别计算当前线程中滑动检测窗在背景图上的位置,以width×height分辨率背景图为例,当读取的滑动检测窗尺寸为winSize,滑动步长为winStep时,当前线程n计算得到的滑动检测窗在背景图的位置坐标为:
x=[n/([(width-winSize)/winStep]+1)];
y=n/([(height-winSize)/winStep]+1)*winStep;
其中,[]为向下取整;
步骤D:读取分类器模型的其他参数,分别在当前滑动检测窗所在位置的子图上提取特征值,进入决策树判断,输出人脸置信度(即可能是人脸的置信度,用于指示该区域是人脸图像的概率)及此滑动检测窗所在位置(即可能的人脸区域),此时读取的分类器模型参数包括强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、叶子结点得分、强分类器阈值等;
其中,人脸置信度即决策树叶子结点得分,若此时得分低于强分类器阈值,则判断为非人脸,位置输出为-1,以便汇总统计;
步骤E:汇总可能的人脸区域及人脸置信度(即汇总人脸置信度大于等于强分类器阈值的子图的位置及人脸置信度),输出到主机内存(即CPU的内存);
步骤F:通过CPU使用非极大值抑制算法得到最可能是人脸的区域,实现在背景图中定位人脸区域。
本发明实施方式提供的人脸检测方法,不但可以解决传统人脸检测算法速度较慢,占用大量计算资源的问题,有效提高人脸检测速度,进而满足实时性要求,还可以解决传统人脸检测算法对光照敏感的问题,能够有效提升人脸识别的效率,使得使用单张GPU同时实时处理(25fps以上)16路以上的1080P视频流成为可能。
此外,本发明实施方式还提供了一种人脸检测系统,包括:
拷贝模块,用于拷贝分类器模型和背景图到GPU的内存,所述分类器模型中包含滑动检测窗尺寸、滑动步长、强分类器个数、用于分类的特征总个数、强分类器中每个弱分类器需要的特征值位置、强分类器中每个弱分类器的分支分割点、强分类器中每个弱分类器的叶子结点得分、强分类器阈值;
处理模块,用于利用所述分类器模型以及对所述GPU分配的K个线程计算K个滑动检测窗在所述背景图的位置以及每一个所述滑动检测窗所在位置的子图的人脸置信度,并将人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度输出到CPU的内存,其中,所述K个线程中第n个线程计算的滑动检测窗在所述背景图的位置为(xn,yn),n=1,2,...,K;
xn=[n/([(width-winSize)/winStep]+1)];
yn=n/([(height-winSize)/winStep]+1)*winStep;
其中,winSize为所述滑动检测窗尺寸,winStep为所述滑动步长,width为所述背景图的分辨率宽度值,height为所述背景图的分辨率高度值,[]为向下取整;
定位模块,用于利用所述CPU根据所述人脸置信度大于等于所述强分类器阈值的子图的位置及人脸置信度在所述背景图中定位人脸区域。
其中,在本发明实施方式中,通过对所述GPU分配M个任务处理块,每个所述任务处理块分配L个线程,从而对所述GPU分配所述K个线程,其中,M的值为所述GPU中麦克斯韦流多处理器数量的12倍。
其中,在本发明实施方式中,L的值为所述GPU中一个麦克斯韦流多处理器中的流处理器数量。
其中,在本发明实施方式中,所述CPU采用非极大值抑制算法在所述背景图中定位人脸区域。
虽然,上文中已经用一般性说明及具体实施例对本发明作了详尽的描述,但在本发明基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本发明精神的基础上所做的这些修改或改进,均属于本发明要求保护的范围。