☰
SAP ABAP 集成 Amazon Rekognition:AWS SDK for SAP ABAP 图像与视频分析操作实战
2026/10/5 10:14:58 网站建设 项目流程
  • 示例工程
  • 教程
  • 后端

【免费下载链接】aws-doc-sdk-examples

Welcome 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-doc-sdk-examples 仓库中的sap-abap/services/rek模块为主体,系统讲解如何通过 AWS SDK for SAP ABAP 在 SAP 系统中调用 Amazon Rekognition,实现人脸集合管理、人脸检索比对、标签/文本/名人识别等 15 项核心图像分析能力。读完本文,你将掌握 Rekognition 在 SAP ABAP 中的完整调用链路、每个 API 的参数与异常处理模式,以及配套 ABAP 单元测试的写法。

概述:在 SAP 世界里解锁云上图像智能

Amazon Rekognition 是一项托管式图像与视频分析服务,能够快速为应用程序添加目标检测、人脸识别、文字提取、名人识别与内容安全审查能力。本仓库在 sap-abap/services/rek 目录下提供了一个独立的 SAP ABAP 示例包Package for Rekognition,演示如何用 AWS SDK for SAP ABAP 驱动这些能力。

核心载体是一个全局 ABAP 类/awsex/cl_rek_actions(描述为 "Rekognition Code Example"),它把 Rekognition 的 15 个常用 API 封装为可直接调用的方法,并配套一份基于 ABAP 单元测试框架的测试类ltc_awsex_cl_rek_actions。整个示例遵循「会话创建 → 服务工厂获取客户端 → 调用 API → 捕获 AWS 异常」的统一模式,非常适合 SAP 开发者在 ABAP 环境中快速上手云图像服务。

从源码结构看,示例的实现方式可以概括为:通过/aws1/cl_rt_session_aws=>create( )建立 AWS 会话,通过/aws1/cl_rek_factory=>create( lo_session )获取 Rekognition 客户端,然后把图片以S3Object + Image包装对象的形式传给 API——这与 Rekognition 官方 API 的请求模型保持一致。

运行前提与费用须知

根据 sap-abap/README.md,运行本示例前需要满足:

  • 拥有 AWS 账户,并按 AWS SDK for SAP ABAP 配置全局设置 配置默认凭证与默认 Region;
  • 在 SAP 系统(如 SE24 面向对象编辑器)中导入并激活sap-abap/services/rek包下的对象(abapGit 序列化格式,含package.devc.xml、类源文件、测试源文件)。

同时需注意(原文 ⚠ Important 部分的要点):

  • 运行本代码可能产生 AWS 费用,运行测试同样可能产生费用;
  • 建议按最小权限原则授权,仅授予完成任务所需的最低权限;
  • 示例代码未在所有 AWS Region 逐一验证,请确认目标服务在所选 Region 可用;
  • 仓库中的单元测试被标记为DANGEROUS,会真实创建与删除 AWS 资源,只应在合适的测试 AWS 账户中运行。

核心实现类与 15 个操作总览

/awsex/cl_rek_actions的全部代码位于 sap-abap/services/rek/#awsex#cl_rek_actions.clas.abap,类定义(第 1–153 行)声明了 15 个 PUBLIC 方法,按业务功能可划分为四组:

分组方法源码片段行号
集合管理create_collection/delete_collection/describe_collection/list_collectionsL166 / L186 / L206 / L383
人脸索引与搜索index_faces/list_faces/search_faces/search_faces_by_image/delete_facesL228 / L267 / L331 / L292 / L358
人脸检测与比对detect_faces/compare_facesL405 / L444
内容理解与合规detect_labels/detect_moderation_labels/detect_text/recognize_celebritiesL497 / L532 / L566 / L600

所有方法均以RAISING /aws1/cx_rt_generic声明,即 AWS SDK for SAP ABAP 的通用运行时异常会被抛给调用方;方法内部则针对具体业务场景捕获更精确的 Rekognition 异常(如cx_rekresourcenotfoundex、cx_rekinvalids3objectex、cx_rekinvalidparameterex、cx_rekresrcalrdyexistsex),并通过MESSAGE ... TYPE 'E'或TYPE 'I'向 ABAP 调用环境反馈执行结果。

统一调用骨架:会话、工厂与 Profile

每个方法都遵循相同的初始化三段式,以create_collection(源码 L160-L177)为例:

CONSTANTS cv_pfl TYPE /aws1/rt_profile_id VALUE 'ZCODE_DEMO'. DATA(lo_session) = /aws1/cl_rt_session_aws=>create( cv_pfl ). DATA(lo_rek) = /aws1/cl_rek_factory=>create( lo_session ). TRY. oo_result = lo_rek->createcollection( iv_collectionid = iv_collection_id ). MESSAGE 'Collection created successfully.' TYPE 'I'. CATCH /aws1/cx_rekresrcalrdyexistsex. MESSAGE 'Collection already exists.' TYPE 'E'. CATCH /aws1/cx_rekinvalidparameterex. MESSAGE 'Invalid parameter value.' TYPE 'E'. ENDTRY.

这里有几个值得注意的实现事实:

  • Profile 标识:所有方法都硬编码ZCODE_DEMO作为rt_profile_id,即本仓库示例约定使用名为ZCODE_DEMO的 AWS 配置 Profile 来承载凭证与 Region 设置。你在实际项目里应替换为自己的 Profile 名称。
  • 会话与服务客户端:/aws1/cl_rt_session_aws=>create( )负责建立与 AWS 的连接会话,/aws1/cl_rek_factory=>create( )负责创建 Rekognition 服务的接口客户端(接口为/aws1/if_rek),测试类中也以同样方式实例化 S3 客户端/aws1/if_s3(见 测试类 L85-L88)。
  • 响应对象:多数方法通过EXPORTING oo_result返回类型化的响应类(如cl_rekcreatecollresponse、cl_rekdetectlabelsrsp),方法内部会调用get_*访问器读取结果字段,例如get_facecount( )、get_facerecords( )、get_labels( )。

图片的传入方式:S3Object 与 Image 包装对象

Rekognition 的绝大多数图像分析 API 都要求通过Image参数指定待分析图片,而Image可以引用 S3 对象或传入图片字节。本示例统一采用S3 对象引用方式,形成固定的两段式构造模式(见 index_faces L228-L257):

" Create S3 object reference for the image DATA(lo_s3object) = NEW /aws1/cl_reks3object( iv_bucket = iv_s3_bucket iv_name = iv_s3_key ). " Create image object DATA(lo_image) = NEW /aws1/cl_rekimage( io_s3object = lo_s3object ). oo_result = lo_rek->indexfaces( iv_collectionid = iv_collection_id io_image = lo_image iv_externalimageid = iv_external_id iv_maxfaces = iv_max_faces ).

由此可以推断出实践前提:调用前需要先把待分析图片上传到 S3,并把 Bucket 名称与对象 Key 作为方法的输入参数传入。相关参数类型在类定义中都有明确约束(例如iv_s3_bucket TYPE /aws1/reks3bucket、iv_s3_key TYPE /aws1/reks3objectname)。测试类正是先借助/awsex/cl_utils工具类创建带随机后缀的测试桶,再把一张 10×10 灰度 JPEG 以putobject上传(见 测试类 class_setup L100-L216)。

人脸集合管理:创建、删除、描述与列出

Rekognition 的人脸集合(Collection)是存储人脸向量的容器,是人脸检索功能的前提。本示例提供四个管理操作。

创建集合create_collection:入参为iv_collection_id TYPE /aws1/rekcollectionid,返回cl_rekcreatecollresponse。已存在时捕获cx_rekresrcalrdyexistsex并提示 "Collection already exists.",参数非法时捕获cx_rekinvalidparameterex。

删除集合delete_collection:入参同为集合 ID。若集合不存在,捕获cx_rekresourcenotfoundex并提示 "Collection not found."。

描述集合describe_collection:返回cl_rekdescrcollresponse,源码通过get_facecount( )读取已索引人脸数并拼装消息:

oo_result = lo_rek->describecollection( iv_collectionid = iv_collection_id ). DATA(lv_face_count) = oo_result->get_facecount( ). DATA(lv_msg) = |Collection described: { lv_face_count } face(s) indexed.|. MESSAGE lv_msg TYPE 'I'.

列出集合list_collections:入参iv_max_results TYPE /aws1/rekpagesize(测试中传入 100),通过get_collectionids( )获取集合 ID 列表并输出数量。

从测试实现看,集合创建后并非立即可用,测试类专门实现了wait_for_collection_ready轮询逻辑(最多 30 次、每次等待 2 秒,通过describeCollection是否抛出cx_rekresourcenotfoundex判断就绪状态),这一点在编写生产代码时同样值得借鉴——创建集合后应等待其进入 ACTIVE 状态再执行 IndexFaces。

人脸索引与检索:IndexFaces、ListFaces、SearchFaces、DeleteFaces

这一组方法构成了完整的人脸识别闭环:

  • index_faces:把 S3 图片中的人脸录入指定集合,入参包括iv_collection_id、S3 位置、iv_external_id TYPE /aws1/rekexternalimageid(外部标识,用于业务关联)和iv_max_faces TYPE /aws1/rekmaxfacestoindex。通过get_facerecords( )统计成功索引的人脸数。
  • list_faces:列出集合内已索引的人脸,入参iv_max_results TYPE /aws1/rekpagesize,通过get_faces( )读取人脸列表。
  • search_faces:以已索引人脸的FaceId(类型/aws1/rekfaceid)为查询条件在集合内检索相似人脸,支持iv_threshold TYPE /aws1/rt_float_as_string(相似度阈值,测试中取'80')与iv_max_faces TYPE /aws1/rekmaxfaces。
  • search_faces_by_image:直接以一张 S3 图片为查询条件检索集合,参数除 S3 位置外同样是阈值与最大返回数,通过get_facematches( )获取匹配列表。
  • delete_faces:按 FaceId 列表删除集合中的人脸,入参it_face_ids TYPE /aws1/cl_rekfaceidlist_w=>tt_faceidlist(需用包装类cl_rekfaceidlist_w构造),通过get_deletedfaces( )返回实际删除的 FaceId 列表。

测试类展示了完整的测试编排(L632-L931):先用index_faces建立测试人脸并保存FaceId到类级变量av_indexed_face_id,等待索引传播后依次执行list_faces、search_faces_by_image、search_faces、delete_faces。其中delete_faces测试还断言「已删除人脸列表不为空」,体现了对返回数据结构的校验。需要说明的是,由于测试用的 10×10 灰度 JPEG 不含真实人脸,部分测试捕获cx_rekinvimageformatex后以提示信息优雅跳过,重点仍在于验证 SDK 调用链路的正确性。

人脸检测与比对:DetectFaces、CompareFaces

  • detect_faces:检测图片中所有人脸及其属性。实现细节值得关注——它把 Attributes 参数显式设为'ALL',以请求返回年龄、情绪、姿态、眼镜等全部人脸属性:
DATA(lt_attributes) = VALUE /aws1/cl_rekattributes_w=>tt_attributes( ). DATA(lo_attr_wrapper) = NEW /aws1/cl_rekattributes_w( iv_value = 'ALL' ). INSERT lo_attr_wrapper INTO TABLE lt_attributes. oo_result = lo_rek->detectfaces( io_image = lo_image it_attributes = lt_attributes ).

结果通过get_facedetails( )读取。

  • compare_faces:比较两张图片中的人脸是否为同一人。入参包含源图与目标图的 S3 位置,以及iv_similarity TYPE /aws1/rt_float_as_string(相似度阈值,测试传'80')。实现会分别构造 source 与 target 两个cl_rekimage对象,然后调用comparefaces。结果读取get_facematches( )与get_unmatchedfaces( ),并在消息中同时输出匹配与不匹配的人脸数量:
oo_result = lo_rek->comparefaces( io_sourceimage = lo_source_image io_targetimage = lo_target_image iv_similaritythreshold = iv_similarity ). DATA(lv_message) = |Face comparison completed: | && |{ lv_matched_count } matched face(s), | && |{ lv_unmatched_count } unmatched face(s).|. MESSAGE lv_message TYPE 'I'.

典型的落地场景包括身份核验、门禁通行、证件比对等。

内容理解与合规审核:Labels、Moderation、Text、Celebrities

这四个方法全部只接收 S3 图片位置,输出不同类型的识别结果:

  • detect_labels:识别图片中的对象与场景标签(如人、车、风景),入参iv_max_labels TYPE /aws1/rekuinteger(测试传 10),结果经get_labels( )读取。
  • detect_moderation_labels:检测不适宜内容标签(成人内容、暴力等),常用于 UGC 内容安全审核,结果经get_moderationlabels( )读取。
  • detect_text:从图片中提取文本,结果经get_textdetections( )读取,可用于车牌识别、票据 OCR 等场景。
  • recognize_celebrities:识别图片中的名人面孔,结果经get_celebrityfaces( )读取。

以上方法都复用相同的异常处理策略:S3 对象非法时捕获cx_rekinvalids3objectex,参数非法时捕获cx_rekinvalidparameterex。这四类能力可以组合出不少实用业务:媒体库自动打标、社区内容合规过滤、单据影像数字化、媒体资产名人检索等。

单元测试与资源生命周期管理

测试类定义于 sap-abap/services/rek/#awsex#cl_rek_actions.clas.testclasses.abap,声明为FOR TESTING DURATION SHORT RISK LEVEL DANGEROUS,与 类定义 XML 中的WITH_UNIT_TESTS标志对应。测试覆盖了除delete_collection外的全部 15 个方法(delete_collection使用专门的av_collection_id_for_delete集合)。

class_setup阶段的资源准备逻辑尤为值得学习(L76-L221):

  1. 通过/awsex/cl_utils=>get_random_string( )生成随机后缀,构造全局唯一的集合 ID(sap-abap-rek-{uuid})与测试桶名(sap-abap-rek-{uuid}),避免并发测试互相干扰;
  2. 调用工具类/awsex/cl_utils=>create_bucket( )创建 S3 桶——该工具类实现(见 sap-abap/util/#awsex#cl_utils.clas.abap)会根据会话 Region 决定是否携带CreateBucketConfiguration约束:在us-east-1不得指定约束,其他 Region 则以当前 Region 作为约束;
  3. 为桶与集合打上convert_test=true标签,便于成本归属与资源清理;
  4. 上传两张内置 10×10 灰度 JPEG(以 XSTRING 十六进制拼装)到测试桶;
  5. 对两个集合执行「最多 30 次、每 2 秒一次」的就绪轮询。

class_teardown则负责反向清理:删除 S3 对象、调用/awsex/cl_utils=>cleanup_bucket( )清空并删除桶(该工具方法先listobjectsv2枚举对象,再用deleteobjects批量删除,最后deletebucket),最后删除两个测试集合。测试断言上使用了cl_abap_unit_assert=>assert_bound、assert_equals、assert_not_initial、assert_true等标准 ABAP 单测断言。

如何运行示例与测试

根据 sap-abap/README.md 的说明:

  • 每个示例都包含一个或多个可在SE24(类构建器)中执行的对象,先进入对应服务目录查看该服务的 README(即本文对应的 sap-abap/services/rek/README.md);
  • 运行测试前请确认处于合适的测试 AWS 账户,因为DANGEROUS级别的测试会真实创建并删除 AWS 资源,且可能产生费用;
  • 测试的运行说明同样以 sap-abap/README.md 为准。

延伸阅读

  • Amazon Rekognition Developer Guide:服务能力与场景总览;
  • Amazon Rekognition API Reference:各 API 的完整参数定义;
  • SDK for SAP ABAP Amazon Rekognition reference:本文示例所用 SAP ABAP 客户端的类与方法参考;
  • 仓库中其他 AWS SDK for SAP ABAP 服务示例位于 sap-abap/services,可与本文对照学习统一的会话与工厂模式。

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0

  • 示例工程
  • 教程
  • 后端

【免费下载链接】aws-doc-sdk-examples

Welcome 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
点击查看免费下载
上一篇:PCL2启动器Java配置终极指南:5分钟解决Forge安装难题
下一篇:如何利用Scan2CAD实现三维扫描到CAD模型的智能转换:完整指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询