智能人脸抓拍系统
IFCS Intelligent Face Capture System(智能人脸抓拍系统),本方案是基于CPU实现的,如需更好的性能,需要参考本方案思想改造成GPU的版本。 背景 智能摄像头(抓拍机)将人脸检测功能集成到网络摄像头内部,价格昂贵,智能检测功能与硬件高度集成,不利于后续功能扩展。 大量已有普通网络摄头没有被充分利用 目标 1.构建一种更通用的AI+视频监控的解决方案 2.充分利用现有资源,给普通网络摄像头赋能 建设方案(单节点模式) 在只有数十个摄像头的场景(个人认为30个以下),应用单节点方案就能解决问题。在摄像头更多的场景,应用集群模式是一种更好的解决方案。 架构设计 线程模式 A. 一个线程(生产者)轮询所有的监控摄像头,以固定的频率读取摄像头的实时数据; B. 将这些实时数据放入摄像头对应的分片中(Partition,同步阻塞队列); C. 每个分片都有一个线程(消费者)去消费该分片里面的数据。 因为人脸检查、人脸比对都是CPU密集型操作,每个线程消费一个分片和一个线程消费所有分片效果差不多,通过后面的实验数据也可以证明这一点,即使是多线程 ,响应时间基本也是线性增长的,并不能体现多线程的优势,因为单个人脸检查任务CPU占用率就接近80%。 建设方案(集群模式) 人脸检测&人脸去重 由于,检测对象可能长时间处在视频监控范围之内,因此,该时间段的视频帧充斥着大量重复检测对象。对所有重复对象都去做后续的1:N人脸识别显然不合理,因此需要合理的去重设计。 不同的人脸检测算法,其识别率、资源占用率不尽相同。但总的来说,人脸检测是一种CPU密集型操作,本课题原型采用自OpenCV封装的哈尔级联人脸检测算法。经测试,该算法检测单帧耗时300ms左右,CPU占用率接近80%。 A. 利用openCV人脸检测算法,找出帧里面包含的所有人脸,并保存至临时缓存。(为方便比对,缓存中存放的是经特征提取后的特征值) B. 将第一步的人脸逐一和缓存中的人脸比对,缓存中没有的人脸则保存下来发往下一步业务逻辑 C. 用第一步得到的人脸替换缓存中的人脸 去重原理-1: 去重原理-2: 去重原理-3: 去重原理-4: 性能测试(单节点模式) 实验结果表明,一个消费者(线程)任务耗时300ms、CPU占用率达到80%,随着消费者数目增多,任务耗时延长,CPU占用率进一步增高;当消费者(线程)任务达到8个时,平均任务完成耗时为2000ms,CPU占用率高达95%以上。(英特尔 Core i7-8550U @ 1.80GHz 四核 ,核心数: 4 / 线程数: 8) 抓拍机以海康威视的产品举例,其价格在2000元左右,IFCS节点服务器为一台价格4800元的个人电脑,普通网络摄像头在200元左右。从数据中可以得知,当监控数量等于3时,本方案能节省10%的成本,并且响应时间和抓拍机基本一致;当监控数量等于6时,本方案能节省50%的成本,并且最长响应时间不足2秒;随着监控点数量越多,节省的成本越多,相应的响应时间越长。 环境配置(集群模式) linux Zookeeper配置 Kafka配置 Hadoop配置 windows Zookeeper配置 (https://www.jianshu.com/p/f7037105db46) Kafka配置(https://www.jianshu.com/p/64d25dcf8300) Hadoop配置: 下载Haddop 修改hadoop-x.x.x/etc/hadoop/hadoop-env.cmd中的JAVA_HOME (路径不能空格) 展望 增加GPU图像处理单元,提升图像处理效率,以便单个IFCS节点能负载更多的摄像机。 转载自:https://github.com/xuzhijvn/ifcs