郭慢, 钱松荣
(复旦大学 信息科学与工程学院, 上海 200433)
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库。它提供了丰富的视觉处理算法,并且因为部分程序用C语言编写而大幅提升了执行速度。目前主要由12大功能模块组成,包括核心功能模块opencv_core、高层用户交互模块opencv_highgui(图像与视频IO)、新贡献的模块opencv_contrib(提供人脸识别类FaceRecognizer)等。应用领域有人机互动、物体识别(包含人脸识别)、图像分割、动作跟踪、机器人、运动分析、机器视觉、结构分析、汽车安全驾驶等。
人脸识别目前研究比较火热,很多产品已经问世,例如刷脸支付(支付宝等软件)、视频监控(在公安系统中用于追查犯人)、考勤机(用于公司考勤)、消费机(在食堂中用于刷脸吃饭)、利用人脸识别办电话卡(获取人脸信息和身份证信息,进行匹配)。
但是目前大多数的人脸识别研究和应用都是利用生物特征实现对人脸身份的甄别和确认,起到身份证的作用。 而且前提是获取人脸信息,需要使用者主动提供个人信息,开展起来不太方便。
在电子屏广告投放方面,目前的问题是投放的广告到底是吸引观众还是一种视觉污染,所以研究广告受众习惯是我的一个研究方向。人工智能为广告投放提供了一种新的解决办法。本文具体阐述了实现智能广告的系统框架,即在投放广告的同时,利用人脸检测技术获取广告受众人脸信息,然后对人脸信息进行人脸识别(包括性别识别、年龄识别、人脸匹配),将所有信息入库,然后上传到远端服务器,进行数据分析,根据分析结果反馈给最初投放广告主机,针对受众,投放受众感兴趣的广告。其中使用了目前比较流行和成熟的技术,包括人脸识别、机器学习、数据分析等。
智能广告系统在整体架构上分为多个功能模块,主要包括广告投放模块、人脸采集模块、人脸相关信息处理模块、数据入库以及上传模块、数据分析处理和展示模块。系统框架图如图1所示。
图1 智能广告系统框架图
广告投放模块,部署在连接电子屏的主机上,包括播放广告以及记录广告主题和广告时间等功能。数据入库以及上传模块,将反映观看者的人脸相关信息和观看广告的信息的数据一起写入本地数据库,同时上传到远端服务器的数据库中,该模块也部署在连接电子屏的主机上。这里观看的广告信息主要包括广告主题类型,广告内容等信息。
接下来会单独阐述部分模块的功能与实现,主要是人脸识别和数据分析。
人脸采集模块,主要部件是摄像头,部署在连接电子屏的主机上,包括打开摄像头和从视频流中获取人脸图像并保存在该主机上等功能。
目前实验研究使用笔记本电脑自带的摄像头。获取人脸图像,主要通过人脸检测技术,用到opencv自带的Haar分类器算法。
Haar特征值反映了图像的灰度变化情况。又称矩形特征,只对一些简单的图形结构敏感。实验中检测准确率在85%以上,考虑到程序启动和开启摄像头时的不稳定性,平均达到90%以上,基本满足要求。检测算法用到opencv自带的函数,使用Haar分类器模型,代码如下:
//加载Haar分类器模型
faceCascade.load(faceCascadeFilename);
//设置检测相关参数,如每次检测时返回最大的人脸,运行检测函数
faceCascade.detectMultiScale(dectImg, faces, searchScaleFactor,
minNeighbors, flags, minFeatureSize);
而计算检测准确率的方法为调整摄像头下的人脸状态(不同人的人脸,正面人脸、侧面人脸等),统计一定时间内获取的图像数和检测的人脸数,检测正确数量,考虑人脸没有检测出来和把其他物体检测为人脸两种情况。
按数字保存检测出的人脸灰度图像以及MFC窗口实现人脸检测的结果,如图2所示:
图2 人脸检测部分结果
人脸相关信息处理模块,这是该系统最核心的一个模块。将前面获取的人脸图像信息进行识别处理,获取其人脸id(识别人的身份的唯一电子证明,类似于身份证号),性别信息,年龄信息,该模块也部署在连接电子屏的主机上。
这里会有一个人脸库的创建,开始时人脸库为空。随着人脸采集模块采集到人脸数据后,人脸库中会加入不同的人脸图像,经过人脸识别后,如果图像为新图像,则会被加入人脸库,打上新的标签(包括id标签和性别标签),否则不做处理。
实验中id识别准确率较低,主要原因是光照影响。算法用到了opencv的训练以及机器学习的预测算法。当然基本理论依然是特征脸PCA算法,求取特征脸的权重的欧氏距离,求取为式(1)。
(1)
其中,Ω为人脸图像的灰度值归一化后的列向量的平均值,Ωk为第k个人脸图像的灰度值归一化后的列向量,ε为两个列向量的欧氏距离,反映了图像的相似性程度。
实验中性别识别的准确率很高,达到99%以上。算法用到了opencv的训练以及机器学习的预测算法,相比前面id识别的准确率,性别识别的准确率较高的主要原因是标签只有两个(男或女),所以人脸库的数据量也是机器学习成功的关键因素。
实验中年龄识别,使用了目前比较成熟的EyeKey生物识别云服务平台,误差在3到5岁以内,由于我只需要统计年龄段范围,所以基本满足要求。实现方法为:在平台官网上申请app_id和app_key,调用其Http接口,返回年龄信息。如图3所示。
使用PCA算法遇到的问题是欧氏距离的阈值不好确定,数据量较少时,容易进行分类,但数据量较多时欧氏距离差别不太大,而且计算量成倍增加。机器学习不用考虑具体的特征向量,而是给每一个样本图像贴上标签,实现训练模型,代码如下:
图3 EyeKey生物识别云服务平台的年龄性别等信息识别demo
//根据人脸特征和标签进行训练
model->train(images, labels);
最后根据训练模型预测人脸特征,代码如下。
//预测人脸标签,获取最接近的人脸库中人脸
predictedLabel = model->predict(face);
大致流程图如图4所示。
图4 机器学习训练和预测流程图
随着人脸库中数据增多,训练样本数量随之增多,训练的人脸标签模型更加稳定,可靠性高,而且不用多次训练,即运行时间总体较短。
数据分析处理展示模块,根据广告分类,确认受众的性别分布、年龄分布等,然后使用图表形式直观地展示出来。利用大数据的知识,对人群的观看广告的习惯进行分析,从中找出某种规律,根据规律确定播放广告的规则。给一天内观看不同种类广告的性别分布,如图5所示。
图5 不同种类广告的性别分布图
从性别角度看,女性看广告的数量多于男性,可以得出相应的结论:女性相比男性更喜欢看广告。从广告种类看,人们更喜欢看产品广告和品牌广告。当然,这只是两种情况,还有从时间上,从位置上可以进行一定的分析,从而实现广告投放的高效,而不是广告没有人看,浪费资源。
目前人工智能中的智能广告在快速发展,我们从生物特征方面获取用户信息进而分析用户习惯的角度考虑智能广告的实现。整个系统总体上包含3个部分:数据采集,数据传输,数据处理与展示。生物特征方面选择了人脸,以及包含的性别和年龄信息,实现了数据的采集和部分处理功能。但是数据传输方面,即数据上传到远端服务器,没有足够的条件,所以在一台主机上实现,忽略了这一个模块,但是如果需要投入生产,则需要远端服务器。接下来的工作是将数据入库,并且进行分析,搭建一个数据分析平台,综合考虑各种因素,使系统具有可用性。另外算法优化也是我下一步的工作。