【学术】厉害了我的哥,国外技术大咖仿造了谷歌的Arts &Culture,找到古代的“你”
当我激动的室友第一次向我展示肖像搜索功能时,我对结果感到很惊讶(也觉得有点受侮辱)。对于那些不熟悉它的人来说,谷歌Arts & Culture的这一功能让你可以在谷歌的数字化艺术收藏中找到与你提交的自拍相似的艺术品。
在我看来,这是非常了不起的一件作品:
17世纪的翻版的我
多亏了大量的开源工具和库,在一个下午的时间内,可以创建一些奇妙又具有一定功能的东西。
初步计划
首先,找一些面部识别服务器。Kairos提供了一个免费的API,一旦在该API中输入图像的url,它就会提供一连串的信息:
- Kairos地址:https://www.kairos.com/
通用输入图像
Returned JSON data (some image info removed for length){"images":
[{"faces":
[{"attributes":
{"age":40,
"asian":0.00539,
"black":0.00032,
"gender":{
"femaleConfidence":0.00002
"maleConfidence":0.99998,
"type":"M"},
"glasses":"None",
"hispanic":0.04204,
"lips":"Apart",
"other":0.01249,
"white":0.93976}
}]
}]
}
Kairos还允许将被标记的图像加入到数据库中,当未标记的图像被传递给API时,它将返回数据库中最相似的图像的标签。
虽然这是为了识别已经注册过的人,但它可以执行艺术识别任务(当它的相似性阈值设置得足够低时)。
为了找到合适的图片,我仔细研究了我试图模仿的服务(谷歌Arts & Culture),从谷歌Arts & Culture网站获得艺术品的url。如果我花了4个多小时的时间来做这件事,我可能会花时间给每件艺术品贴上一个独特的id,这个id与数据库中的图像、艺术品名称和艺术家联系在一起,以提供一个全面和轻松的用户体验。但我并没有这样做。
所以每个作品的标签都是简单的url,所以用户可以被重定向到与他们自拍匹配的艺术作品。
from flask import Flask, redirect
#Some function here, get a suitable image url as label
return redirect(label)
服务器和托管
Flask提供了一个简单的选项,可以在使用python处理图像IO和进程的同时为用户提供一个网页。我不想在托管上花太长时间,我只是在本地运行这个站点。
Kairos需要一个公共图像url作为它的输入,所以要让我的站点在本地网络Ngrok之外显示,为我的本地主机提供一个安全通道。
下一个挑战是处理用户输入和API响应,同时继续为用户提供站点服务。为了处理异步事件,线程库可用于分离两个进程。
最后,是时候给网站提供朋友和家人的自拍照了,还有一些更普通的照片,结果如下所示:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mybatis源码学习(四)拦截器与插件原理
- SpringBoot如何使用注解装配Bean
- Spring Boot 如何快速实现定时任务
- Django 实现文件上传下载API
- 【原创】Spring Boot 如何手写stater
- 【原创】Spring Boot 过滤器、监听器、拦截器的使用
- 关于useState的一切
- 关于useEffect的一切
- (25)Bash数值运算与运算符
- (27)正则表达式
- (28)字符截取命令cut、printf
- (29)字符截取命令awk
- RTSP协议视频平台EasyNVR流媒体服务器音频播放完毕后,视频为什么也会卡住?
- Redis | Redis 有序集合相关命令
- TypeScript 4.0正式发布!现在是开始使用它的最佳时机