移动端的人脸检测及去重算法实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010872301/article/details/82463962

       由于移动嵌入式设备本身硬件的性能的限制,在运行上需要优化检测、去重等算法,保证APP运行流畅。影响人脸检测运行速度因素主要在输入图片大小,神经网络模型选择和训练模型的数据量等。

      人脸检测中使用caffe2来训练SSD模型,SSD网络分为两大部分,前半部分采用VGG16的结构去提取特征图谱(feature map),后半部分采用特征金字塔结构,在所级联的6层卷积网络上分别生成多个候选框,同时进行位置回归和物体分类任务,最后再利用非极大值抑制进行输出(Non-Maximum Suppression)。生成模型caffe.model和deploy.prototxt文件后,我们再将caffe2下SSD网络模型转换为NCNN模型。有时caffe训练的模型版本过低不能转换为NCNN模型,可以利用caffe自带的工具将旧版的caffe模型转换为新版的caffe模型后,再将新版本的模型转换为NCNN模型。在Ubuntu上运行ncnn的可执行文件caffe2ncnn,生成NCNN模型需要的param 与bin 文件。最后发布模型时对模型参数进行加密,运行ncnn提供的ncnn2mem可执行文件将param和bin文件进行二进制加密。对于处理器cortex-A7-600MHZ上运行每秒30帧的1080P图片1-10个人脸检测时间在50至300ms。

       检测到人脸后通过OpenCV图像处理算法对人脸图片去重,对于不同的应用场景使用不同的去重算法:

1、Traditional Feature,采用传统图像特征(颜色直方图calcHist()和LBP直方图特征)进行比对去重。判断两张人脸的这几个相似度,同时满足大于等于阈值的话,算法认为两张人脸为同一人的从而进行去重。函数中可以设置参数hist_thres, lbp_thres, hog_thres, total_thres,hist_thres表示直方图相似度阈值,LBP相似度阈值,HOG阈值(当前未加入,设为-1)和总的阈值(大于等于前三个之和,设为-1的不统计)。 默认阈值分别为0.85, 0.8, -1, 1.7,大概能去除50%的重复人脸,误去重比较低,可以根据实际情况微调阈值。

2、Motion Match,基于运动匹配的快速去重算法,主要针对静态目标的去重,尤其是去除静态误检。通过帧差法判断前后两帧对应目标区域的像素值差异,如果小于差异阈值则认为这些像素在前后两帧的目标区域没有运动,否则认为有运动,如果运动的像素占帧目标区域全部像素的比例大于差异比率的话,则认为前后两帧对应目标运动了,不做去重。函数中可以设置参数diff_thres, diff_ratio表示像素差异阈值和差异比率。默认阈值分别为25, 0.1,主要去除静态重复目标,可以根据实际情况微调阈值。

3、Big Face Track,基于跟踪的去重算法,主要针对多人流量监控,根据跟踪的ID序列进行去重。当前采用检测置信度作为人脸的质量分数,通过跟踪算法获得每个检测到人脸的ID信息,当前基于匹配的跟踪算法要求检测的频率至少是4fps/s,对于30fps的视频流的话track_freq要设置为不大于30/4=7,表示的是每几帧做一次关键帧检测用于跟踪算法;默认的去重算法在每个新的人脸ID出现的时候上传此人脸,中间通过跟踪序列如果质量分高于之前的则进行更新,在某个人脸ID消失的时候判断人脸序列是否有更新,如果有则上传更新人脸。函数中可以设置参数track_freq, dedup_freq, keep_freq,分别表示跟踪频率,去重频率和保留频率。 dedup_freq则表示可以设置每个人脸ID每出现几次就上传一次,默认为0表示不做手动设置(当前还没启用此项功能);keep_freq用来缓存去重队列中保留的人脸ID序列对应的视频帧,如果超过这个值则进行清理工作(此处后续需要改进,有可能会出现MMZ空间不够的情况),根据系统资源做相应配置。默认值分别为5, 5, 10,去重效果依赖于检测算法和跟踪算法,可以根据实际情况微调阈值。

猜你喜欢

转载自blog.csdn.net/u010872301/article/details/82463962