最近写了不少多维表格和自动化工作流的教程和文章,今天突发奇想到能不能用多维表格做一个人脸识别的小功能。起因是朋友聊到说,他们公司搞活动拍了几百张照片,然后她需要在里面找出来某领导的照片,只能一个一个找。
我心想自己又何尝不是,平时看电影想知道里面的演员是谁,也不知道如何做。
比如这样,你知道她是谁吗?

其实办法有很多,但作为经常搞多维表格和自动化工作流的人来说,就不免想用这些工具来试试看。虽然麻烦,但也算有点乐趣。
所以今天就介绍下,如何用多维表格+n8n工作流+百度人脸识别,做一个自己的人脸识别小应用。
比如我们上面的照片上传到多维表格里,就可以自动识别到她是谁。

实现流程
如果我们要用手头上的工具来实现的话,首先要考虑整个的实现流程
大概的逻辑是:在多维表格上传照片 —定时触发工作流 — 获取照片链接 — 调用百度人脸识别API — 获取识别结果 — 将结果同步到多维表格
接下来我们详细说说配置方法。
配置方法
(一)准备工作
工具:n8n+多维表格+百度云人脸识别(都是免费或基础版够用)
n8n和多维表格就不说了
这里说下百度云人脸识别的准备工作
我们需要注册人脸识别的服务
①访问百度AI开放平台https://ai.baidu.com/并注册
②进入控制台,创建应用,选择”人脸识别”服务
③记录 API Key 和 Secret Key
④最后我们就需要创建人脸库了
它这个结构是人脸库 – 用户组 – 用户 ,然后在用户底下去上传照片。

比如我建了001和002两个用户,分别在里面去上传他们各自的照片。
这个很重要,因为我们去识别人脸,首先一定要有一个库,你上传的照片,是去这个库里进行对比,找出最匹配的人返回给你。
所以我们要把这个库维护好。
比如这样:

我们还可以再多找找,丰富丰富人脸库,比如这样。

准备工作做完后,我们说下接下来的配置方法和步骤。
(一) 新建多维表格
我们希望把照片上传到多维表格里,然后把识别结果也展示在多维表格中。
所以我们要先创建一个表格。
表格不用太复杂,配置一个附件字段,然后给一个识别分数和对应的用户id字段即可。
比如这样,先简单一点。

第一行就是我识别出来的结果,照片就是我上传到多维表格的照片,userid是识别到百度人脸库里匹配的用户组的id,score就是匹配的分数。
用大白话说就是,我上传的这个照片,应该就是001这个人,相似度有79.28%。
(二)创建n8n流程
这一步,主要是对我们在多维表格上传的图片,通过百度人脸识别API去进行识别,最后把识别结果返回到多维表格里。
这里我想了一下,最好的方式其实是我把照片上传到表格,然后点一个按钮或什么动作,自动触发工作流来获取。
但是在这里我没有找到这种触发的办法,所以就试着用n8n定时跑流程来运行吧。
大概的逻辑就是:定时触发工作流 — 找到多维表格中识别结果为空的行 — 循环这些空行 — 获取照片字段信息,得到照片链接 — 下载照片 — 将照片转为base64格式 — 调用百度1:N搜索API — 获取识别结果 — 将结果同步到多维表格 –结束
1、获取多维表格记录

首先我们要获取到多维表格的记录,使用查询记录的接口。
在查询前,先获取飞书token
获取token的方式之前讲过不少次,这次就不细说了。
接着我们调用查询记录接口(官方接口文档:https://open.feishu.cn/document/docs/bitable-v1/app-table-record/search)

这里的几个配置字段说明下:
①Method:post
②URL:https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records/search 注意把:app_token和:table_id换成表格的token和id值
③header
- Authorization:Bearer {{ $json.tenant_access_token }} 也就是我们上个节点获取的token值。
- Content-Type:application/json; charset=utf-8
④body:选择json格式
{
"view_id": "vewnTTowMW",
"field_names": [
"识别结果" ,
"照片"
],
"sort": [
{
"field_name": "识别结果",
"desc": true
}
],
"filter": {
"conjunction": "and",
"conditions": [
{
"field_name": "识别结果",
"operator": "isEmpty",
"value": [
]
}
]
},
"automatic_fields": false
}
简单来说这个意思就是获取到表格vewnTTowMW这个视图下识别结果为空的记录里的识别结果和照片两个字段的值。
通过这个节点,我们就获取到了表格里的url字段值。

(就是它了)
2、循环
因为可能有多个行,所以我们加一个循环节点,每个行依次去识别照片

3、获取字段
这个步骤的目的,是为了把图片链接和record_id这两个字段提取出来给后面用


4、下载图片
这个步骤,就是根据图片链接,用http节点,把图片下载下来。
这个下载不是下载到电脑里,你可以理解为是下到你的服务器里。

URL就是我们上个节点的url字段。
header里注意把飞书的token值加上
最后的Response这里说明下,要选择file的格式

5、图片转为base64格式
我们给到人脸识别的图片,一定是要转成base64的格式才行。
所以,这个步骤,我们用一个code节点,用个简单的脚本进行转化

// 简化版 - 直接从binary读取并转换
const imageBinary = items[0].binary.imageFile;
// 转换为base64
const base64Image = imageBinary.data;
// 如果已经是data URL格式,去掉前缀
let finalBase64 = base64Image;
if (base64Image.startsWith('data:')) {
finalBase64 = base64Image.split(',')[1];
}
return [{
json: {
...items[0].json,
base64Image: finalBase64,
imageInfo: {
fileName: imageBinary.fileName,
mimeType: imageBinary.mimeType,
fileSize: imageBinary.fileSize
}
}
}];
6、调用百度人脸识别API
好了,终于到关键的步骤了。
我们要去进行人脸识别了。
这一步也需要两个节点:获取token和调用识别接口(类似之前飞书多维表格的对接)

(1)获取token
①Method:post
②URL:https://aip.baidubce.com/oauth/2.0/token
③Query Parameters
- grant_type:client_credentials
- client_id:申请的应用的id值
- client_secret:申请的应用的secret值
④header
Content-Type:application/x-www-form-urlencoded
(2)调用人脸1:N搜索接口(https://cloud.baidu.com/doc/FACE/s/Gk37c1uzc)
①Method:post
②URL:https://aip.baidubce.com/rest/2.0/face/v3/search
③Query Parameters
- access_token:上个节点获取到的token值
④Header
Content-Type:application/json
⑤body
josn格式
{
"image": "{{ $node['图片转Base64'].json['base64Image'] }}",
"image_type": "BASE64",
"group_id_list": "1",
"quality_control": "NORMAL",
"liveness_control": "NORMAL",
"max_user_num": 5,
"max_face_num": 10
}

运行,红框里就是输出的结果
人脸识别接口用我们上传的照片,在人脸库里进行查找,同时输出了和库里照片的匹配值。值越大就说明越相似。
7、获取结果并同步到多维表格
好了,我们需要把结果中,score最大的值拿到并同步到多维表格里
首先我们先把值提取出来
这里用一个code节点
主要就是把id值和score拿到

const apiResult = items[0].json;
// 检查API是否成功
if (apiResult.error_code !== 0) {
throw new Error(`百度API错误: ${apiResult.error_msg}`);
}
// 获取用户列表
const userList = apiResult.result.user_list;
if (!userList || userList.length === 0) {
// 没有匹配结果
return [{
json: {
topUserId: "未识别",
topScore: 0,
topSimilarity: "0%",
hasMatch: false,
matchCount: 0
}
}];
}
// 找到score最高的用户
const topUser = userList.reduce((max, user) =>
user.score > max.score ? user : max
);
return [{
json: {
topUserId: topUser.user_id,
topScore: topUser.score,
topSimilarity: `${topUser.score.toFixed(2)}%`,
groupId: topUser.group_id,
hasMatch: true,
matchCount: userList.length,
faceToken: apiResult.result.face_token
}
}];
接着我们就调用多维表格的更新记录接口(https://open.feishu.cn/document/server-docs/docs/bitable-v1/app-table-record/update),把userid和score同步回多维表格

运行后,你就会获取到图片的匹配值和对应的id值了。

一开始我们说了,在人脸库建了001和002两个用户,虽然都对应着人,但是只看id也不知道是谁
我上传个照片,识别完,说这是001,那和没识别也没啥区别。
所以我们就在多维表格再建一个信息表,把id值和真实姓名维护上。

然后在表单查找引用字段自动匹配就好。
我们还可以在表里加上AI字段, 当匹配到人脸时,除了展示人名,还可以把这个人的基础信息都用AI进行总结。
但是…好吧,似乎豆包帮你18禁了,并不能输出你需要的内容。

好了,讲到这,你就可以完成全流程的跑通了。
虽然最后做完,我发现看起来好像没什么卵用,很多搜索引擎其实可以通过人脸直接搜他的相关资料。
不过,如果是需要维护自己公司或者内部团队的人脸库呢?
所以,其实这个需求还可以再拓展一下。
举个简单的例子,比如我们在公司经常会拍一些活动照片,有时候照片非常多,但你还需要在里面找到有XXX姓名的照片,这就非常费时费力了。
这种场景下,我们就可以考虑用简单的自动化来提效。
比如我们只需把照片拖进云盘,然后自动触发人脸识别动作流,最后在多维表格生成带人脸标签的照片库。你只需要搜XXX姓名,就能看到所有包含他的照片。
这么看来 ,多维表格+自动化工作流+AI,其实大大降低了我们实现需求的成本,也提高了实现的效率。


评论区已关闭。