使用Java程序消费SAP Leonardo的机器学习API

Posted JerryWangSAP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Java程序消费SAP Leonardo的机器学习API相关的知识,希望对你有一定的参考价值。

以sap leonardo作为关键字在微信上搜索,能搜到不少文章。但是我浏览了一下,好像没有发现有从具体编程角度上来介绍的。所以我就贡献一篇。

技术分享图片

需求

开发一个Java程序,用户可以指定一张图片,该Java程序调用SAP Leonardo上训练好的机器学习API,该API会识别该图片,给用户返回一个文本信息,告诉用户识别结果。

  1. 访问https://api.sap.com, 点击API:

技术分享图片
SAP Leonardo Machine Learning - Functional Services
技术分享图片

点击Product Image Classification API:

技术分享图片

会看到如下界面。该界面包含了这个API的Model Schema介绍,即您调用API之后,返回的响应结构里包含哪些字段,以及对应的类型(对象或者数组)。界面里包含了一个小型的API调用控制台,您可以直接控制台里选择一个本地图形文件,然后点击Try it out按钮来体验一下API的效果。

技术分享图片

例如我使用了下面这张图片进行测试:
技术分享图片
在控制台里看到请求处理成功,API判断出来该图片有97%的可能性是一台notebook。

技术分享图片
下面我们需要使用Java程序来调用API。

  1. 前一步骤的API控制台的右上角有一个按钮Download SDK,点击之后将SDK下载到本地:

技术分享图片
可以看到该SDK是一个基于Gradle的Java项目。您需要下载Maven和Gradle并完成环境变量的配置,这些配置非常基础,在网上有大量资料,这里不再重复。
完成配置后,使用Eclipse的import功能,将SDK导入到Eclipse里。

技术分享图片

导入完成后如图。红色区域是SDK自带的代码,蓝色区域是Jerry自己手动创建的代码,用于调用API并打印结果。

技术分享图片

双击根目录下的pom.xml, 将如下依赖关系维护进去:
技术分享图片

技术分享图片
在项目根目录下执行Maven命令 mvn install, 确保项目成功build。至此,您可以开始编写Java代码使用SAP提供的JDK来调用该机器学习API了。

技术分享图片

  1. 使用下图的Java代码调用SDK去消费API。SDK封装了底层HTTP请求的发送和响应的解析等细节,使用起来非常简捷。

技术分享图片

为简单起见,上图13行我将本地图片文件的绝对地址硬编码进去。上图第八行硬编码的API key来自API控制台:

技术分享图片

至此,大功告成,运行程序。。。。。。什么情况?
技术分享图片

错误分析

仔细看过错误消息,很快Jerry就发现了问题出在哪里。上图蓝色下划线就暗示了错误根源。SAP SDK使用了Google发布的一个开源Java库Gson,将API返回的响应反序列化成Java对象。有了Gson,应用程序开发人员无需重复造轮子,只需要定义一些Java类,作为容器存储Gson反序列化的执行结果即可。

我们再回到API控制台,API响应结构里request字段的类型声明为string。

技术分享图片

然而通过测试发现,request字段的内容实际是一个Json对象:
技术分享图片

从http://api.sap.com下载的SDK里的代码,Gson容器类Response.java里声明的request字段类型为String,而非对象,因此Gson会抛异常:Expected a string but was BEGIN_OBJECT at line 31 column 15 path $.request
技术分享图片
知道了问题根源,改起来就容易了。新建一个Gson容器类Request.java, 然后按照控制台里观察到的request字段的结构,为Request.java维护对应的成员变量。
例如tenantName在API响应结构里是一个String,因此在Java类里的类型是String;files在API响应结构里是一个数组,因此在Java类里的类型为List

技术分享图片
调整完毕之后再次执行,能看到期望的输出结果:通过SDK调用API并打印结果。

技术分享图片
如果您不愿意自己手动修改,可以直接从我的github下载修改之后的代码,只需要用您自己的API key替换掉代码中硬编码的key即可。

https://github.com/i042416/ProductImageMLService

更多Leonardo精彩,尽在https://api.sap.com!

技术分享图片

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

技术分享图片

技术分享图片

















以上是关于使用Java程序消费SAP Leonardo的机器学习API的主要内容,如果未能解决你的问题,请参考以下文章

部署在SAP Cloud Platform CloudFoundry环境的应用如何消费SAP Leonardo机器学习API

使用SAP Cloud Platform Leonardo机器学习提取图片的特征向量

使用SAP Cloud Platform Leonardo机器学习的测试控制台

如何给SAP云平台的账号分配Leonardo机器学习服务的实例

GeneXus for SAP的最新动态

使用 ABAP 代码消费 SAP Cloud for Customer 系统的 OData 服务