前文我们尝试写了一个完整的人脸验证过程,从创建一个组,一个人,到为人提供照片,并训练AI,直至最后提供一张照片让 AI 利用 Face API 判断是不是这个特定的人。

    另一个经常会用到的人脸识别,是在一张照片中查找认识的人。Facebook什么的挺早就能够识别照片中的人并可以让你给他们打上标签。其实,利用Face API做类似的事情也一点不复杂。不信我们用代码来看看。

    为了说明在一张合影中 AI 能够找到并识别特定人,我用了去年峰会中国MVP及MVP Lead梁迪和微软CEO萨蒂亚·纳德拉(Satya Nadella)、微软全球资深副总裁沈向洋、微软全球资深副总裁潘正磊的合影来做代码范例,也算是扯虎皮做大旗吧哈哈哈。

n

     首先,使用前文示例代码中用到的Detect方法来识别照片中的人脸。

image

    说实话,我有点担心。这张照片里的人好多啊,AI 能够都识别出来么?

image

    呼啦啦返回了46个faceId,我趴在照片上一顿数,还真的是一个不落都识别出来了,厉害厉害!

    在这里我遇到了一个问题。如前文介绍的,Detect方法识别出来的人脸会以JSON形式返回,而两层及两层以上的数据结构在转成Python的数据时,不再是dict,而是list。多层的数据意味着多层的list对象。上一次因为数据简单,直接使用了List的下标来定位数据。这一次就要老老实实遍历进行处理了。因此,for语句和list.append()就学会使用了。

    由这个问题引发的另外一个问题是,生成的List需要提供给下一步Face的Identify方法作为输入。按照API文档的说明,输入应该形如:

image

     在“faceIds”这里,应该输入所有经由Detect识别出的人脸的ID。所以我把上一步获得的List转换成了JSON格式然后拼装这个请求的body。结果……报错了……冷静地print出来list和body,跟文档进行比较,原来多了对’’’号……

image

     原来拼装这个JSON的时候,使用List对象facesId就可以了。使用json的dumps()把List转成json,我多此一举了。那为什么又报Error:0呢?仔细看文档,用于Identify方法的人脸数量,应该1到10之间。我们输入给AI的Face ID大大超过了这个数量,所以……报错了……那该怎么办呢?我可以分批处理,也可以裁剪照片。因为后续还要试试找不到人怎么办,所以我对照片进行了不同的裁剪。

     返回的json格式形如:

image

    如果没有对应到人,faceId对应的“condidates”就会显示为[],即空。而对应到人的faceId对应会有识别出的人的personId和相识度评分confidence。看来要把这个结果滤出来做点操作还是有点小复杂啊,一样,使用for语句逐个下标处理List。

image

    使用两层List的下标读取,就能够成功拆分从Face API返回的json数据了。我记得人脸识别的Verify方法里,判断是否本人的参考值为0.5,因此在这里如果系统返回相识度评分大于0.5,我就继续从Face ID再去识别具体的人是谁。

image

    果然,Face API从合影照片中认出了我~那么如果我不在照片里呢?

image

    Face API确实没有发现通过training认识的人~

    细心的你发现了吧,两次照片检测的Face ID怎么全部不一样?还记得前文我们说过的吗?Detect生成的Face ID是临时的,会在24小时之后清除,所以每次获得的ID都不同,即使是同一张脸。而关联到人的脸,其Face ID就是持久的,可以在需要的时候使用。

    这么牛的合影,难道只识别我自己吗?当然不,我们要试试 AI 能不能识别多个人~

    立刻上网为这三位大神各自找了三张照片。找的过程中发现,潘女士原来早在2010年就参加过MVP的Open Day,难怪上次MVP Round Table的时候觉得那么熟悉,看我这糟糕的记性…

image

    赶紧在上次创建的person group里再创建了三个person,每人传输了上图的三张照片。

image

    再次运行代码,这一次,AI 在合影中就识别出了四个人了,厉害厉害~

image

    利用Azure Cognitive Services中的Face API,哪怕没有任何深入的 AI 知识,哪怕没有熟练的编程技巧,只需要简单的几十行代码,就能够实现有趣的人脸识别。