用2263份证件照图片样本测试how-old.net的人脸识别

2024-02-13 15:20

本文主要是介绍用2263份证件照图片样本测试how-old.net的人脸识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一年也就是这个时候微软根据自己的人脸识别API推出了一个识别照片中人脸年龄和性别的网站——http://how-old.net,小伙伴们各种玩耍,一年后的今天突发“奇想”地想测试一下这个网站的识别情况。正好手里有3万多份标识有身份证信息、性别及照片拍摄时间的证件照(别问我从哪儿弄的,这玩意儿你懂的)。今天就写了个脚本来测试一下。测试识别的目标有两个:

  • 性别
  • 年龄

提交数据获得识别结果

寻找接口

首先,查看一下how-old.net的提交接口。

673170-20160430222838160-2022945159.png

用Chrome查看一下网络请求的情况

673170-20160430222857175-1731473933.png

查看一下前三个请求的数据情况:

第一个:

673170-20160430222923816-1378440576.png

第二个:

673170-20160430223054441-630154549.png

第三个:

673170-20160430223131253-1784419294.png
673170-20160430223145035-481638308.png

很奇怪有没有,第一个是一个bolb地址,第二个是图片的base64编码后的字符,第三个倒像是真正的请求,可查看请求中,尽然找不到对应图片的参数。再查看一下第三个请求的响应:

673170-20160430223321097-989707362.png

嗯,一个添加转移符号的json数据,我们想要的识别结果确实在里面。这就确定这个请求就是我们需要的请求接口,现在的问题是怎样上传图片数据呢?

我们不妨从头看一下这三个请求。第一个中的bolb地址和第二个请求中的base64数据是怎么个情况呢?在Stack Overflow上查找到了下面的信息:

673170-20160430223358191-1588168776.png

简单来说就是,在二进制数据以流式方式提交的时候,有这样一个模式:生成一个bolb地址做本机数据访问 -> 访问具体的信息是是base64编码的的文件 -> 对指定接口以流式上传数据。也就是说前两个请求时发生在本机的,是对本地资源的访问,第三个请求才是真正的请求,只不过数据是前两个“本机请求”生成的流式数据。

上传数据获得识别结果

这样我们就得到了我们需要的访问接口及数据提交方式:

  • 接口:
  • 提交方式:POST流式提交

我们可以在上面第三个请求图中查看到请求参数及header,cookies等信息。使用requests库能很容易做到数据流式提交,针对此接口请求代码如下:

    #访问主页获得cookiet = requests.get("http://how-old.net",timeout=60)_cookies = t.cookiest.close()#构建请求头headers = {"Content-Type": "application/octet-stream","Referer": "http://how-old.net/","User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"}info = None#POST方式流式提交(pic_name是图片地址)with open(pic_name, 'rb') as f:r = requests.post("http://how-old.net/Home/Analyze?isTest=False&source=&version=how-old.net",data=f,headers=headers,cookies=_cookies,timeout=10)info = r.content

将返回的识别数据存储在info中,其样式像下面这样:

"{\"AnalyticsEvent\":\"[\\r\\n  {\\r\\n    \\\"face\\\": {\\r\\n      \\\"age\\\": 16.0,\\r\\n      \\\"gender\\\": \\\"Male\\\"\\r\\n    },\\r\\n    \\\"event_datetime\\\": \\\"2016-04-30T11:39:30.4786437Z\\\",\\r\\n    \\\"user_id\\\": \\\"ab85e356-6638-41e7-a46f-be54c1f94f97\\\",\\r\\n    \\\"session_id\\\": \\\"ba5ec8e4-65e0-481d-b034-970494680bca\\\",\\r\\n    \\\"submission_method\\\": \\\"Upload\\\",\\r\\n    \\\"user_agent\\\": \\\"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\\\",\\r\\n    \\\"location\\\": {\\r\\n      \\\"latitude\\\": 35.71,\\r\\n      \\\"longitude\\\": 115.23\\r\\n    },\\r\\n    \\\"location_city\\\": {\\r\\n      \\\"latitude\\\": 35.7,\\r\\n      \\\"longitude\\\": 115.2\\r\\n    },\\r\\n    \\\"is_mobile_device\\\": false,\\r\\n    \\\"browser_type\\\": \\\"Chrome\\\",\\r\\n    \\\"platform\\\": \\\"Windows\\\",\\r\\n    \\\"mobile_device_model\\\": \\\"Unknown\\\"\\r\\n  }\\r\\n]\",\"Faces\":[{\"faceId\":null,\"faceRectangle\":{\"top\":29,\"left\":49,\"width\":51,\"height\":51},\"attributes\":{\"gender\":\"Male\",\"age\":16.0}}]}"

正想我们在Chrome中观测到的返回数据一样,这样通过Python提交图片并获得识别数据就成功了。

但是这样的数据我们很难使用,因为里面数据很多且有很多的转义,所以先把\r``\n``\这样的数据清洗掉,并选取其中最后面的一部分,获得下面的结构数据:

{"Faces": [{"faceId": null,"faceRectangle": {"top": 29,"left": 49,"width": 51,"height": 51},"attributes": {"gender": "Male","age": 16}}]
}

faceId是图片中识别出的脸的标号,faceRectangle是将脸部框前来的矩形左上坐标及宽高,attributes中是识别出的性别和年龄。由于证件照都是标准的一个人,网站基本都能识别出来,所以只考虑一张图片对应的一个attributes。将照片对应的信息存在一个persons列表中,样式如下:

persons = [{"num":num,"real_age":real_age,"real_gender":real_gender,"rec_age":rec_age,"rec_gender":rec_gender}]

识别结果统计

性别识别

性别识别统计很容易,直接比对一张照片对应的实际性别和识别:

toatal = len(persons)
right = 0
wrong_fm = 0
wrong_mf = 0
for person in persons:if person["real_gender"] == person["rec_gender"]:right += 1elif person["real_gender"] == "Female":wrong_fm += 1else:wrong_mf +=1

最终的结果是:

673170-20160430223441378-2137434643.png

年龄识别

年龄的识别统计采用一个字典记录,其结构是识别{某年龄差:识别为该年龄差的个数}:

age_rec = {}
for person in persons:tmp = person["rec_age"] - person["real_age"]try:age_rec[tmp] += 1except:passfinally:age_rec[tmp] = 1

最终的统计结果是:

673170-20160430223539128-1409513452.png

结语

本实践统计了HOW-OLD对两千多份图片样本的识别结果,性别识别正确率很高,而年龄识别错误范围较大,且识别结果偏大的居多。我甚至觉得,这东西可以用来检测摄影师的拍照技术,识别结果越小,人物摄影技术越好:)(开个玩笑)。整个实践最麻烦的地方是找接口及上传数据的方法,最费时间的是上传数据获得结果这个过程(受网络IO的限制,用家里的小破wifi,使用多线程也没多大用,而且线程一多,就会掉线:()。

这篇关于用2263份证件照图片样本测试how-old.net的人脸识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705886

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-