前言
前期我们做了一个小程序,实现集体照片的自动分发。简单来说就是用户上传一张集体照,凡是出现在集体照中的人都能自动关联到此张照片,有点类似 QQ 和 FB 之前的标记用户,但是整个过程是自动的,无需人为分发,问题就出现在自动上。
一、第一版算法
首先如果自动的话就涉及到照片比对技术,如果自己技术实力雄厚(比如你是吴恩达)可以从底层神经网络开始写起,或者使用开源的人脸识别框架,我使用了百度和腾讯的人脸识别接口,用着还可以,基本是免费的(需求不高的时候)。
每位用户首先上传一张自己的大头照,主要是为了去匹配集体照,某位用户上传一张照片,就将此集体照与所有的用户大头照逐一比对,凡是能匹配成功的关联之。
看似非常简单的功能,其实里面存在一个巨大的坑,如果用户量上千万或者上亿的时候,用户每上传一张集体照就要进行亿次的比对,这根本不可能实时,所以我们刚开始的时候考虑每天定时去比对一次,比如在晚上 12 点,所有当天上传的集体照去逐一比对,问题看似能够解决,但是没有了实时性,非常影响用户体验。我苦思冥想了几天后终于找到了一个实时的解决方案。
二、实时比对
对问题进行分析,解决方案就来了,只要我能够优化比对程序,将亿次的比对实现实时操作,问题即可解决。然而我不是吴恩达,换作吴恩达可能也没办法,我们真的做不到亿次比对实时操作。
似乎陷入了僵局,然而我们来换一个角度思考此问题,我们为何不将亿次的比对减少到可以实时的量级?
那么,如何降低比对次数呢?解决方案如下:
-
用户上传大头照的时候对此用户在我们的数据库中进行标记,即每个用户都有一个唯一的 faceid,并将此 faceid 和大头照存到百度或者腾讯的人脸库中;
-
上传集体照的时候,将集体照按照人脸进行切割,逐一的去百度或者腾讯的人脸库进行比对,如果能够匹配上,则能取到此人的 faceid,用此 faceid 即能查到所关联的用户,于是即可实现照片的自动分发。
三、结论
简单的两步即解决了实时比对的问题,有的时候换一个角度去思考问题,问题便迎刃而解!