使用Java程式消費SAP Leonardo的機器學習API

dicksonjyl560101發表於2018-08-11

以sap leonardo作為關鍵字在微信上搜尋,能搜到不少文章。但是我瀏覽了一下,好像沒有發現有從具體程式設計角度上來介紹的。所以我就貢獻一篇。

使用Java程式消費SAP Leonardo的機器學習API

需求

開發一個Java程式,使用者可以指定一張圖片,該Java程式呼叫SAP Leonardo上訓練好的機器學習API,該API會識別該圖片,給使用者返回一個文字資訊,告訴使用者識別結果。

  1. 訪問https://api.sap.com, 點選API:
使用Java程式消費SAP Leonardo的機器學習API

SAP Leonardo Machine Learning - Functional Services


使用Java程式消費SAP Leonardo的機器學習API

點選Product Image Classification API:

使用Java程式消費SAP Leonardo的機器學習API

會看到如下介面。該介面包含了這個API的Model Schema介紹,即您呼叫API之後,返回的響應結構裡包含哪些欄位,以及對應的型別(物件或者陣列)。介面裡包含了一個小型的API呼叫控制檯,您可以直接控制檯裡選擇一個本地圖形檔案,然後點選Try it out按鈕來體驗一下API的效果。

使用Java程式消費SAP Leonardo的機器學習API

例如我使用了下面這張圖片進行測試:


使用Java程式消費SAP Leonardo的機器學習API

在控制檯裡看到請求處理成功,API判斷出來該圖片有97%的可能性是一臺notebook。

使用Java程式消費SAP Leonardo的機器學習API

下面我們需要使用Java程式來呼叫API。

  1. 前一步驟的API控制檯的右上角有一個按鈕Download SDK,點選之後將SDK下載到本地:
使用Java程式消費SAP Leonardo的機器學習API

可以看到該SDK是一個基於Gradle的Java專案。您需要下載Maven和Gradle並完成環境變數的配置,這些配置非常基礎,在網上有大量資料,這裡不再重複。
完成配置後,使用Eclipse的import功能,將SDK匯入到Eclipse裡。

使用Java程式消費SAP Leonardo的機器學習API

匯入完成後如圖。紅色區域是SDK自帶的程式碼,藍色區域是Jerry自己手動建立的程式碼,用於呼叫API並列印結果。

使用Java程式消費SAP Leonardo的機器學習API

雙擊根目錄下的pom.xml, 將如下依賴關係維護進去:


使用Java程式消費SAP Leonardo的機器學習API
使用Java程式消費SAP Leonardo的機器學習API

在專案根目錄下執行Maven命令 mvn install, 確保專案成功build。至此,您可以開始編寫Java程式碼使用SAP提供的JDK來呼叫該機器學習API了。

使用Java程式消費SAP Leonardo的機器學習API
  1. 使用下圖的Java程式碼呼叫SDK去消費API。SDK封裝了底層HTTP請求的傳送和響應的解析等細節,使用起來非常簡捷。
使用Java程式消費SAP Leonardo的機器學習API

為簡單起見,上圖13行我將本地圖片檔案的絕對地址硬編碼進去。上圖第八行硬編碼的API key來自API控制檯:

使用Java程式消費SAP Leonardo的機器學習API

至此,大功告成,執行程式。。。。。。什麼情況?


使用Java程式消費SAP Leonardo的機器學習API

錯誤分析

仔細看過錯誤訊息,很快Jerry就發現了問題出在哪裡。上圖藍色下劃線就暗示了錯誤根源。SAP SDK使用了Google釋出的一個開源Java庫Gson,將API返回的響應反序列化成Java物件。有了Gson,應用程式開發人員無需重複造輪子,只需要定義一些Java類,作為容器儲存Gson反序列化的執行結果即可。

我們再回到API控制檯,API響應結構裡request欄位的型別宣告為string。

使用Java程式消費SAP Leonardo的機器學習API

然而通過測試發現,request欄位的內容實際是一個Json物件:


使用Java程式消費SAP Leonardo的機器學習API

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

使用Java程式消費SAP Leonardo的機器學習API

知道了問題根源,改起來就容易了。新建一個Gson容器類Request.java, 然後按照控制檯裡觀察到的request欄位的結構,為Request.java維護對應的成員變數。
例如tenantName在API響應結構裡是一個String,因此在Java類裡的型別是String;files在API響應結構裡是一個陣列,因此在Java類裡的型別為List<String>。


使用Java程式消費SAP Leonardo的機器學習API

調整完畢之後再次執行,能看到期望的輸出結果:通過SDK呼叫API並列印結果。

使用Java程式消費SAP Leonardo的機器學習API

如果您不願意自己手動修改,可以直接從我的github下載修改之後的程式碼,只需要用您自己的API key替換掉程式碼中硬編碼的key即可。

https://github.com/i042416/ProductImageMLService

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

使用Java程式消費SAP Leonardo的機器學習API

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:

使用Java程式消費SAP Leonardo的機器學習API
使用Java程式消費SAP Leonardo的機器學習API

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2154590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章