使用 Amazon Rekognition DetectFaces 与 AWS SDK for JavaScript 估算人像年龄
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载Amazon Rekognition 让开发者无需机器学习专业知识即可在应用中快速接入图像与视频分析能力本文以 aws-doc-sdk-examples 仓库中的estimate-age-example为核心讲解如何基于 AWS SDK for JavaScript v2并对比 v3 版本调用DetectFacesAPI完成对照片中多张人脸的年龄区间估算并在浏览器中展示结果。读完本文你将掌握从 CloudFormation 部署、Cognito 匿名身份认证配置到前端页面图片读取、字节转换与 API 调用的完整可运行链路。示例概览Age Estimator 的构成该示例位于仓库javascript/example_code/rekognition/estimate-age-example/src/目录由两个核心文件组成estimate-age.html页面骨架提供文件选择控件、结果显示区域并加载 AWS SDK for JavaScript v2 及 Cognito 相关脚本estimate-age.js业务逻辑负责图片读取、字节转换、调用 RekognitionDetectFacesAPI 并渲染年龄区间表格。整个示例的运行流程为用户在页面选择本地图片 → 前端读取图片并通过 Cognito Identity 完成匿名登录获得临时凭证 → 将图片以原始字节形式传给 RekognitionDetectFaces→ 返回每张人脸的AgeRange低龄/高龄区间→ 前端以表格形式渲染输出。前置准备通过 CloudFormation 部署认证资源示例的浏览器端代码需要 AWS 临时凭证才能调用 Rekognition仓库通过 CloudFormation 栈由 CDK 生成预先搭建 Cognito 身份池与 IAM 角色。部署完成后需要从资源清单中提取关键 ID。运行步骤如下对应原 README 的操作指引打开 AWS CloudFormation 控制台选择该示例对应的栈进入Resources资源标签页复制CognitoDefaultUnauthenticatedRole的Physical ID物理 ID在 estimate-age.html 文件中将IDENTITY_POOL_ID替换为上一步复制的 Physical ID同样在该文件中将REGION替换为你部署栈所使用的 AWS 区域例如us-east-1在浏览器中打开estimate-age.html按页面提示选择图片即可看到年龄估算结果。需要注意原 README 中步骤 2 表述为复制 CognitoDefaultUnauthenticatedRole 的 Physical ID但结合源码中IdentityPoolId: IDENTITY_POOL_ID的使用方式实际填入的应是 Cognito 身份池Identity Pool的 ID。从源码视角看该变量用于 AnonLog() 函数 中构造AWS.CognitoIdentityCredentials因此身份池 ID 才是正确取值README 的表述在实践时应以身份池 ID 为准。认证链路Cognito 匿名身份凭证的获取浏览器端直接调用 AWS API 无法使用普通 IAM 访问密钥示例采用 Cognito Identity 的匿名身份unauthenticated identity方案。在 estimate-age.html 中AnonLog()函数完成了这一过程// Provides anonymous log on to AWS services. function AnonLog() { // Configure the credentials provider to use your identity pool. AWS.config.region REGION; // Region AWS.config.credentials new AWS.CognitoIdentityCredentials({ IdentityPoolId: IDENTITY_POOL_ID, }); // Make the call to obtain credentials. AWS.config.credentials.get(function () { // Credentials will be available when this function is called. var accessKeyId AWS.config.credentials.accessKeyId; var secretAccessKey AWS.config.credentials.secretAccessKey; var sessionToken AWS.config.credentials.sessionToken; }); }关键点AWS.CognitoIdentityCredentials接受IdentityPoolId作为参数.get()方法发起异步请求获取临时凭证Access Key、Secret Key 与 Session Token页面头部通过三个script标签加载了 SDK 依赖aws-cognito-sdk.min.js、amazon-cognito-identity.min.js以及https://sdk.amazonaws.com/js/aws-sdk-2.16.0.min.jsv2 浏览器版 AWS SDK。这些脚本需按源码所示顺序引入否则AWS.CognitoIdentityCredentials将不可用。权限底座CloudFormation 栈中的 IAM 与身份池配置v2 示例的运行依赖的认证资源与仓库中 v3 版本 setup.yaml 描述的 CloudFormation/CDK 模板结构一致该模板完整刻画了认证授权链路ExampleIdentityPoolAWS::Cognito::IdentityPool设置AllowUnauthenticatedIdentities: true允许匿名身份访问CognitoDefaultUnauthenticatedRoleAWS::IAM::Role信任主体为cognito-identity.amazonaws.com并通过ForAnyValue:StringLike条件限定身份为unauthenticated匿名CognitoDefaultUnauthenticatedRoleDefaultPolicyAWS::IAM::Policy除mobileanalytics:PutEvents、cognito-sync:*外关键授权是rekognition:DetectFacesResource 为*——这是浏览器端能调用 DetectFaces 的权限根源DefaultValidAWS::Cognito::IdentityPoolRoleAttachment将匿名身份与上述角色绑定Outputs.Identitypoolid输出身份池 ID方便提取。模板中的rekognitionvideoanalyzerrole316A744F角色信任rekognition.amazonaws.com同样被创建供后续视频分析类扩展使用。从该模板可以推断整个示例遵循身份池授予匿名身份 → 匿名身份映射受限 IAM 角色 → 角色仅授权 DetectFaces 单个动作的最小权限设计。图片处理从 DataURL 到 ArrayBuffer 字节流RekognitionDetectFaces的Image.Bytes参数要求传入图片的原始字节blob而非 Base64 字符串。浏览器端的 FileReader 读取到的e.target.result是 DataURL 形式因此 estimate-age.js 中的ProcessImage()需要先解 Base64再转成ArrayBufferfunction ProcessImage() { AnonLog(); var control document.getElementById(fileToUpload); var file control.files[0]; // Load base64 encoded image for display. var reader new FileReader(); reader.onload (function (theFile) { return function (e) { //Call Rekognition AWS.region REGION; var rekognition new AWS.Rekognition(); var params { Image: { Bytes: e.target.result, }, Attributes: [ALL], }; rekognition.detectFaces(params, function (err, data) { ... }); }; })(file); reader.readAsArrayBuffer(file); }注意 v2 版本两种实现存在细微差异estimate-age.js 使用reader.readAsArrayBuffer(file)直接读取二进制并把e.target.result直接作为Image.Bytesestimate-age.html 中的ProcessImage()则使用reader.readAsDataURL(file)再经atob()解码并手工填充Uint8Array构造ArrayBuffervar length image.length; imageBytes new ArrayBuffer(length); var ua new Uint8Array(imageBytes); for (var i 0; i length; i) { ua[i] image.charCodeAt(i); } //Call Rekognition DetectFaces(imageBytes);该函数还包含图片格式校验先尝试按 JPEG 解析data:image/jpeg;base64,前缀失败则尝试 PNG两者均失败时弹出提示 Not an image file Rekognition can process 并中止调用。核心调用DetectFaces 与年龄区间解析无论哪种读取方式最终都会进入DetectFaces调用。请求参数结构如下参数说明Image.Bytes图片原始字节流ArrayBuffer或 Blob用于本地文件分析场景Attributes设置为[ALL]要求返回包括AgeRange、情绪、姿态等全部人脸属性若只需要年龄可省略该字段DetectFaces的响应中FaceDetails数组对应图片中的每一张人脸每项包含AgeRange.Low与AgeRange.High估算的年龄下限与上限。前端据此构建表格并写入#opResult元素rekognition.detectFaces(params, function (err, data) { if (err) console.log(err, err.stack); // an error occurred else { var table tabletrthLow/ththHigh/th/tr; // show each face and build out estimated age table for (var i 0; i data.FaceDetails.length; i) { table trtd data.FaceDetails[i].AgeRange.Low /tdtd data.FaceDetails[i].AgeRange.High /td/tr; } table /table; document.getElementById(opResult).innerHTML table; } });回调风格是 AWS SDK for JavaScript v2 的典型用法err与data同时传入出错时记录err.stack成功时遍历人脸。页面上 estimate-age.html 通过文件选择框的change事件触发ProcessImage()input typefile namefileToUpload idfileToUpload acceptimage/* p idopResult/pacceptimage/*限制只能选择图片文件#opResult则用于承载最终渲染出的 Low/High 年龄表格。进阶参考v3 版本的对应实现仓库还提供了基于 AWS SDK for JavaScript v3 的同名示例javascriptv3/example_code/rekognition/estimate-age-example/src/可作为迁移与对比参考estimate-age.jsv3以import { DetectFacesCommand } from aws-sdk/client-rekognition替代 v2 的全局AWS.Rekognition()调用方式变为rekognitionClient.send(new DetectFacesCommand(params))并采用async/await与try/catch取代回调rekognitionClient.jsv3通过fromCognitoIdentityPool与CognitoIdentityClient构造带匿名凭证的RekognitionClient等价于 v2 中AnonLog()AWS.config.credentials的组合estimate-age.htmlv3页面显著简化SDK 依赖改由main.js打包产物引入setup.yamlv3即前文分析的 CloudFormation/CDK 模板v2 与 v3 示例共享同一套认证资源设计。常见问题与排查建议403 / AccessDenied 错误多为身份池 ID 与区域配置不正确或 IAM 策略未包含rekognition:DetectFaces。可在 CloudFormation 模板的CognitoDefaultUnauthenticatedRoleDefaultPolicy中核对授权Not an image file Rekognition can process所选文件不是 JPEG/PNG或 DataURL 前缀格式与解析逻辑不匹配空表格或FaceDetails为空图片中未检测到人脸。可确认Attributes: [ALL]已传入因为年龄估算依赖该属性凭证过期匿名身份临时凭证有效期有限若长时间停留在页面可重新调用AnonLog()刷新凭证。总结本示例以最小化的前端实现串联起 Rekognition 图像分析的关键链路CloudFormation 提供权限底座、Cognito 匿名身份解决浏览器端凭证问题、FileReader 完成本地图片字节化、DetectFaces返回年龄区间。无论采用 v2 回调风格还是 v3async/await风格核心思路一致——理解Image.Bytes的字节要求与Attributes: [ALL]对AgeRange的影响是复用该方案到其他图片分析场景如情绪、姿态检测的关键。原始文档及两个版本的完整源码均可分别在 javascript/example_code/rekognition/estimate-age-example/src/README.md 与 javascriptv3/example_code/rekognition/estimate-age-example/src/ 目录中继续深入查看。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for C 调用 Amazon Rekognition从 Hello World 到图像标签检测实战使用 AWS SDK for C 调用 Amazon Rekognition从 Hello World 到图像标签检测实战 Amazon Rekognit示例工程教程后端使用 AWS SDK for .NET 调用 Amazon Rekognition图片与人脸分析完整实战指南基于 aws-doc-sdk-examples使用 AWS SDK for .NET 调用 Amazon Rekognition图片与人脸分析完整实战指南基于 aws doc sdk examples示例工程教程后端Real-ESRGAN终极指南让模糊图像瞬间清晰的AI魔法Real ESRGAN终极指南让模糊图像瞬间清晰的AI魔法 你是否曾经为那些模糊不清的老照片、低分辨率的网络图片或者压缩严重的动漫截图而烦恼现在这一切问题人工智能深度学习计算机视觉图像处理上一篇Omi Windows 与 macOS 功能对齐实战基于 4 个 Git Worktree 的并行执行计划深度解析下一篇GreptimeDB 表压缩Table Compaction设计解析从 LSM 分层到时间窗口合并策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Claude Code 接入 DeepSeek V4 API:本地 CLI 与远程服务器配置全流程

Claude Code 接入 DeepSeek V4 API:本地 CLI 与远程服务器配置全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 10:18:07 阅读更多 →
四类专业Editor工具的技术本质与选型指南

四类专业Editor工具的技术本质与选型指南

1. 项目概述:为什么“Editor”这个词在技术圈里总让人摸不着头脑?“Editor”这个词,表面看就是“编辑器”,但放在实际工作场景里,它根本不是个统一概念——它更像一个功能标签,贴在哪类工具上,就…

2026/9/25 10:17:07 阅读更多 →
联邦大模型:数据不出域下的大模型协同训练与合规落地

联邦大模型:数据不出域下的大模型协同训练与合规落地

1. 为什么“联邦大模型”不是技术噱头,而是数据合规的刚性出口最近三个月,我帮三家医疗科技公司、两家金融风控团队和一个省级政务数据平台做过大模型落地咨询。几乎每一场需求沟通,都会卡在同一个问题上:“你们的模型能不能不碰原…

2026/9/25 10:17:07 阅读更多 →

最新新闻

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

从免费CRM到独立部署:小团队搭建私人CRM网站全记录

上个月我终于把客户资料从微信聊天记录、Excel表格和记事本里统一搬了出来,全部塞进了一套自己部署的CRM系统里。项目代号DeskcommCRM,听起来像个大厂产品,其实是我基于开源组件和一台轻量云服务器搭起来的私人客户关系管理网站。到今天跑了1…

2026/9/25 12:52:24 阅读更多 →
逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现

逐行精读Tftpd64的tftpd_thread.c:TFTP状态机、OACK选项协商与重传策略完整实现 【免费下载链接】tftpd64 The working repository of the famous TFTP server. 项目地址: https://gitcode.com/gh_mirrors/tf/tftpd64 Tftpd64 是 Windows 平台上最著名的 TFT…

2026/9/25 12:52:24 阅读更多 →
Large Language Models for Summarizing Czech Historical Documents and Beyond

Large Language Models for Summarizing Czech Historical Documents and Beyond

文章主要内容与创新点总结 一、主要内容 本文聚焦捷克语文本摘要任务,尤其是历史文献摘要这一研究缺口,展开了系统性研究,具体内容如下: 研究背景:文本摘要旨在精简文本同时保留核心信息,当前该领域研究多集中于英语等资源丰富语言,而捷克语(尤其是历史捷克语)因语言…

2026/9/25 12:52:24 阅读更多 →
Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

Windows 8.1原版镜像下载与校验:MSDN正式版、SHA1验证及UEFI/GPT安装指南

隔三差五就有人来问我:网上那些 Windows 8.1 纯净版、完美优化版、一键装机版,到底能不能用?我的回答一直没变——如果你需要的是一个稳定的 Windows 8.1 镜像下载,就老老实实找微软官方原版,尤其是带 MSDN 正式版字样…

2026/9/25 12:52:24 阅读更多 →
自建CRM系统全攻略:从LNMP架构到数据安全运维

自建CRM系统全攻略:从LNMP架构到数据安全运维

先说个背景。去年团队规模从三个人扩到十来个人的时候,我们做的第一件事不是换办公室,而是认真解决客户信息管理的问题。之前客户资料全躺在个人微信、Excel 表格和邮箱里,每个人记法还不一样,有人记在备注里,有人单独建了个文档&…

2026/9/25 12:52:24 阅读更多 →
开放式代码评审实践:让每一行代码都被认真读过

开放式代码评审实践:让每一行代码都被认真读过

1. 开放式代码评审:让每一行代码都被认真读过先聊个场景。你花了几个小时写了一个功能,提交了合并请求,两天后评审人才姗姗来迟,留下一句“LGTM”就合入了。你心里清楚,这份代码里有几处设计瑕疵,有些边界条…

2026/9/25 12:51:23 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →