(1)クラウド9のホームページを開き(https://aws.amazon.com/jp/cloud9)コンソールにサインインをクリックします
(2)サインインします
(3)サービスを検索するに「cloud9」と入力し、cloud9のコンソールを開きます
(4)IDEエディタを開きます
(5)Railsプロジェクトをデータベースなしで作成します(オプション -O(大文字オー))
rails new testApi -O
(6)プロジェクトが追加されたことを確認します
(7)コントローラーとビューを作成します
cd testApi
rails g controller test_api index
(8)コントローラを修正します(test_api_controller.rb)
【修正前】
class TestApiController < ApplicationController
def index
end
end
【修正後】
require 'json'
require 'net/https'
require "uri"
class TestApiController < ApplicationController
def index
data={feature: [10, 20, 5, 1]}
uri = URI.parse("http://syslink-ai-api.herokuapp.com/predict")
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req.set_content_type("application/json")
req.body = data.to_json
res = http.request(req)
p res.code
if res.code == "200"
res_data = JSON.parse(res.body)
p res_data["prediction"]
end
end
end
(9)Railsサーバーを起動します
rails s
(10)メニューのPreview Running Aplicationを選択します
(11)右下にブラウザが表示されるので、拡大ボタンをクリックし、画面を表示します
(12)表示された画面のurlの最後に「/test_api/index」を追加してクリックします
(13)うまくいかない場合には、ブラウザのurlを以下の通り修正します(?以降を削除)
【修正前】
https://31154717056d432488f1b23e72cb41aa.vfs.cloud9.us-east-2.amazonaws.com/?_c9_id=livepreview0&_c9_host=https://us-east-2.console.aws.amazon.com/test_api/index
【修正後】
https://31154717056d432488f1b23e72cb41aa.vfs.cloud9.us-east-2.amazonaws.com/test_api/index
(14)以下の画面が表示されればOKです
(15)結果はコンソールに表示するようコーディングしたので、確認します
"200" → レスポンスのhttpリターンコード(200:正常終了) [2] → 機械学習での結果(アヤメの分類 入力:[10, 20, 5, 1] 結果の分類:2)
API側のソース(Herokuに配備しています)
from joblib import dump, load
import flask
import numpy as np
# initialize our Flask application and pre-trained model
app = flask.Flask(__name__)
model = None
def load_model():
global model
print(" * Loading pre-trained model ...")
model = load("sample-model.pkl")
print(' * Loading end')
@app.route('/')
def index():
return 'Hello World!'
@app.route("/predict", methods=["POST"])
def predict():
model = load("sample-model.pkl")
response = {
"success": False,
"Content-Type": "application/json"
}
# ensure an feature was properly uploaded to our endpoint
if flask.request.method == "POST":
if flask.request.get_json().get("feature"):
# read feature from json
feature = flask.request.get_json().get("feature")
# preprocess for classification
# list -> np.ndarray
feature = np.array(feature).reshape((1, -1))
# classify the input feature
response["prediction"] = model.predict(feature).tolist()
# indicate that the request was a success
response["success"] = True
# return the data dictionary as a JSON response
return flask.jsonify(response)
if __name__ == "__main__":
load_model()
print(" * Flask starting server...")
app.run(host='0.0.0.0', port='8000')
(16)結果を画面に表示するように修正します
コントローラからビューへは、インスタンス変数(@xxx)で渡します。
【コントローラの修正(test_api_controller.rb)】
require 'json'
require 'net/https'
require "uri"
class TestApiController < ApplicationController
def index
data={feature: [10, 20, 5, 1]}
uri = URI.parse("http://syslink-ai-api.herokuapp.com/predict")
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req.set_content_type("application/json")
req.body = data.to_json
res = http.request(req)
p res.code
if res.code == "200"
res_data = JSON.parse(res.body)
p res_data["prediction"]
# この行を追加します
@prediction = res_data["prediction"]
end
end
end
【ビューの修正(test_api/index.html.erb)】
<h1>機械学習の分析結果</h1>
<p>分類:<%= @prediction %></p>
修正後の画面が以下の通り表示されればOKです