笔者在 SAP 成都研究院工作十五余年,也曾参加过一些基于 SAP Business Technology Platform(中文名称为 SAP 业务技术平台,以下简称 SAP BTP) 的 AI 服务的项目开发和原型验证。本文将这些关于 AI 的项目经验分享出来,希望社区内的 AI 专家不吝赐教。
SAP BTP 将智能企业应用程序与数据库和数据管理、分析、集成和扩展功能整合到一个平台中,适用于云环境和混合环境,包括数百个用于 SAP 和第三方应用程序的预构建集成。其中之一便是 SAP AI Business Services.
这个项目的背景如下:开发一个 Java 程序,用户可以上传一张图片,该 Java 程序调用 SAP AI API,后者会使用预先训练好的机器学习模型,对该图片进行识别,给用户返回一个文本格式的响应信息,告诉用户识别结果。
下面是具体的实现步骤。
访问 https://api.sap.com, 点击 API :
选择 SAP Leonardo Machine Learning - Functional Services:
Functional Services 类别里选择图像识别 AI 服务,即 Product Image Classification API:
该 API 模型是由 SAP 基于大约 5 万张 Icecat 图片训练而成,能区分 29 种不同的产品类别,这些类别具体可以在官方文档上查询到,比如电脑显示器,数码相机,外部存储设备,键盘,液晶电视,手机充电器,笔记本和其他外设等等等。
可以打开图像识别 API 的技术规范页面,包含 API Model Schema 介绍,即调用 API 后,返回的响应结构里包含的字段名称以及数据类型。
该界面还嵌入了一个小型的 API 调用控制台,可以直接在控制台里选择上传一个本地图形文件,点击 Try it out 按钮来体验 API 的效果。
用下图这张图片进行测试:
在控制台里看到请求处理成功,API 判断出来该图片有 97% 的可能性是一台 notebook.
API 测试通过之后,下一步是在 Java 程序里进行消费。在 API 控制台的右上角有一个按钮 Download SDK,点击之后将 SDK 下载到本地,可以看到该 SDK 是一个基于Gradle 的 Java 项目。因此我们需要下载 Maven 和 Gradle 并完成环境变量配置。
Java 开发环境就绪后,使用 Eclipse 的 import 功能,将 SDK 导入到 Eclipse 里。导入完成后如下图所示:红色区域是 AI Service SDK 自带的代码,蓝色区域是笔者手动创建的代码,用于调用 API 并打印结果。
编辑根目录下的 pom.xml, 将如下依赖关系维护进去:
com.sap.apibhub.sdk, 版本号 1.0.0
在项目根目录下执行 Maven 命令 mvn install, 确保项目成功构建。至此,可以开始编写 Java 代码使用SAP AI SDK 来调用 AI API 了。
SDK 封装了底层 HTTP 请求的发送和响应的解析等细节,使用起来非常简捷。第 15 行的 inferenceSyncPost 函数,接收一个本地 File 对象,然后向 SAP AI Service Endpoint 发送 HTTP 请求。
第 8 行的 API key,可以从 API 控制台获得:
执行 Java 应用,在 Eclipse 控制台打印出的输出, AI Service 判断这张图片有 97% 的可能性是一个 notbook:
登录 SAP 云平台,打开 WebIDE:
因为是在浏览器环境里使用 JavaScript 调用远端的 AI API,为了避免跨域问题,需要在云平台里创建一个Destination,作用和 ABAP Netweaver 事务码 SM59 里创建的 Destination 类似,所有的 HTTP Request 和 Response 都经由该 Destination.
属性如上图所示,url 维护为对应的 sandbox 环境:https://sandbox.api.sap.com/ml
记下这个 Destination 的名称 sapui5ml-api, 因为稍后的 Web 应用的 JavaScript 代码里需要使用。
维护额外的属性 WebIDEnabled 为 true,这样该 Destination 才能在 WebIDE 应用环境中被使用。点击 Check Connection 确保看到绿灯,表明 SAP 云平台 Destination 同 AI Service Endpoint 的连接处于可用状态。
打开 WebIDE 里 Web 应用工程里的 settings.json 文件,将之前从 API 控制台里拷贝的 API Key 粘贴到此处:
在项目根目录下的 neo-app.json 文件里,把类型为 destination 的 target 对象的名称,维护成之前在 SAP 云平台里创建的 Destination 相同的名称 sapui5ml-api:
运行这个 Web 应用,能看到如下界面:
针对这个 Web 应用做一些简单的测试,将下面这张图片,上传到 Web 应用去:
SAP AI API,识别出这张图片有 74.7% 的可能性是一台笔记本电脑,13.8% 的可能性是键盘,11.3% 的可能性是Tablets.
点击 Web 应用的按钮 View JSON,能看到 AI 服务返回的技术明细。
如果用户通过前文描述的 Java 应用或者 Web 应用上传的图片类别,并不被 SAP AI 服务事先训练好的模型所支持,我们可以自行对 AI 服务的机器学习模型进行重新训练。
假设我们期望 Product Image Classfication 机器学习模型能够识别各式各样的花。首先得准备大量不同类型的花的图片。Tensorflow 官网上,已经体贴地给想尝试重新训练 AI 模型的学习者们,提供了一个做练习用的压缩包,里面包含了大量各式花的图片:
http://download.tensorflow.org/example_images/flower_photos.tgz
用于重新训练 AI 模型的数据集,必须符合下图所示的层级结构,即 training, validation 和 test 三个文件夹下面,分别包含以产品类别命名的子文件夹,且数据规模之比为 8:1:1.
SAP 云平台 service key 里包含了一个IMAGE_RETRAIN_API_URL,可以用来获取重新训练 AI 模型需要上传数据集的在线存储 url:
向这个 url 发送一个 HTTP Get 请求,得到在线存储的url:
把这个 url 粘贴到浏览器里,输入 Postman 里返回的 accessKey 和 secretKey 登录,就能以 Web 的方式访问这个在线存储了:
下一步是把本地的训练文件,上传到这个部署在 AWS 的在线存储上去。
首先用命令行 mc config host 定义一个名为 sapjerrys3 的远程站点,将上一步从 Postman 获得的 AWS 在线存储 url,accessKey 和 secret 绑定到这个站点上:
然后使用命令行上传文件:
mc.exe cp -r C:\Code\MachineLearningStudy\flowersjerry sapjerrys3\data
大概十几分钟后,文件上传完毕:
此时可以从浏览器端,看到 AWS 在线存储上传完毕的训练文件。
重新训练的数据集就绪之后,下一步就可以通过后台作业的方式,提交一个模型重新训练请求了。使用 Postman 发送一个HTTP Post 请求,启动模型重新训练的后台作业。
使用命令行查询后台作业状态,待其状态变为 SUCCEEDED, 说明模型训练已经结束了。
模型重新训练完毕后,对其进行消费,url 格式为:
使用一张向日葵图片:
将其作为 HTTP Post 的参数,发送给重新训练完毕的模型 flowerjerrymodel,得到的结果显示,AI Service 认为这张图片有大约 87% 的可能性是一棵向日葵(Sunflower)。
最后,我们来看一个 AI 服务在企业智能服务(Intelligent Serbice Scenario)场景中的具体应用。
一位维修工程师接受客户的维修请求,上门维修某设备,发现该设备某零件损坏了。假设这位技师由于种种原因,没能根据经验识别出该零件的型号。此时技师掏出手机,给零件拍摄一张图片,通过手机上安装的 SAP 智能服务解决方案(比如本文之前描述的 Java 程序和 Web 应用),通过 AI API,自动识别出零件的准确型号,返回给维修工程师。
SAP 云平台 AI 服务,接收到维修工程师上传的图片后,将该图片的特征向量提取出来,通过平台上基于海量数据集训练好的模型,识别出准确型号。
特征向量的提取,从数学上说,即通过某种算法,把输入图片的二进制流,转换成一个向量(一维矩阵)的过程。
以下图梯形和圆形为例,我们把图形均匀地分成 9 个区域,在图形中心观察每个区域内图形单元的梯度方向,就可以实现降维,把二维图像以一个一维矩阵来表示。
对于基于 SAP AI 服务开发应用程序的编程人员来说,无需了解图片特征向量提取的具体算法,只需通过 Restful API 调用的方式,把待提取特征向量的图片推送给 AI Service Endpoint,就能得到特征向量输出。
通过如下 url 进入 SAP AI Service 中有关图片特征向量提取服务的测试控制台和帮助文档:
https://api.sap.com/api/img_feature_extraction_api/resource
从控制台上传一张本地图片,点击 Execute 按钮:
得到了输出的特征向量:
有了特征向量后,我们再回到正在讨论的企业智能服务场景。我们利用 SAP AI 服务的另一个和图片处理相关的人工智能服务:图片相似度评分(Inference Service for Similarity Scoring)。
这个 图片相似度评分 AI API 的输入需要两个压缩包。第一个压缩包内文件内容是一系列特征向量,来自维修工程师上传的图片文件。第二个压缩包里存放的是型号为 A,B,C... 等零件图片的特征向量。
如上图所示,为简单起见,第二个压缩包我只存放了两个文件,分别存放的是零件型号 A 和型号 B 的特征向量。
使用 Postman 调用 API,传入这两个压缩包:
得到的结果表明,维修工程师上传的图片和型号 A 的相似系数几乎接近 1,那么显然,该图片代表型号 A。
当然,除了直接上传包含了图片特征向量的压缩文件之外,将这些文件包含的特征向量内容以 JSON 字符串的方式作为输入,调用 API 也是一种通用的方式,JSON 字符串的格式在 SAP 官网里有详细说明,这里不再赘述。
希望本文介绍的这些 SAP AI API 的使用场景对大家有所帮助,感谢阅读。