入社半年の新卒が、Ruby on RailsでOPTiM AI Camera Web APIの混雑状況取得を試してみた

はじめに

はじめまして。AI・IoT サービス開発部所属、21 卒の岩丸です。 普段はOPTiM AI Cameraというサービスのフロントエンドを担当しており、Vue.js + TypeScript と格闘しています。最近ハマっている技術はAndroidのJetpack Composeです。


今回は「入社半年の新卒である私が、配属されたチームの公開 API(OPTiM AI Camera Web API)をRuby on Railsで試してみた」という内容となっております。 配属チームの理解をより深めることが出来たら嬉しいと思い試してみました。

目次

OPTiM AI Cameraとは

OPTiM AI Cameraとは、既設の監視カメラを活用し、クラウドで画像解析を行う AI画像解析サービスです。画像解析のための専用ハードウェア導入が不要なため、手軽にご利用いただけます。

「OPTiM AI Camera」を利用することで、人数カウントや混雑状況可視化など、デジタルマーケティングや感染症対策を支援いたします。 OPTiM AI Cameraの詳細についてはWeb サイトをご覧ください。

f:id:optim-tech:20211104145710p:plain f:id:optim-tech:20211104145712p:plain

OPTiM AI Camera Web APIとは

OPTiM AI Camera Web APIとは、OPTiM AI Cameraで取得した既設監視カメラの取得情報を、APIを介してアプリケーションやシステムに提供するサービスです。

OPTiM AI Camera Web APIを利用することで、連携先のアプリケーションやシステムでは、「OPTiM AI Camera」の検知人数や混雑状況可視化画像を、任意の形式で表示することが可能になります。


2021.11 現在、API利用ライセンスの無償トライアル提供を実施中です。こちらも合わせてご覧ください。

f:id:optim-tech:20211104145704p:plain

OPTiM AI Camera Web APIを利用するまでの流れ

OPTiM AI Camera Web APIの利用イメージは以下の図の通りです。

f:id:optim-tech:20211104145702p:plain

OPTiM AI Camera Web APIを利用するためには大きく3STEPが必要となります。

  1. AI CameraのDevelper登録を行う
  2. アクセストークンの取得する
  3. AI Camera Web APIをコールする

STEP1:AI CameraのDeveloper登録を行う

OPTiM AI Camera Web APIを利用するためにはDeveloper登録が必要となります。Developer登録は弊社側で行いますので、こちらのお問い合わせ窓口よりご連絡ください。

また、AI Camera Web APIはAI Camera用設置済みカメラから情報を取得するため、実際にカメラを設置する必要があります。 カメラの導入についてもお問い合わせ窓口より合わせてご確認ください。

STEP2:アクセストークンを取得する

AI Camera Web APIの各種APIを利用するためには、アクセストークンを取得する必要があります。 アクセストークンはOPTiMが提供するOPTiM Cloud IoT OSのIDM機能を用いて取得することが可能です。


OPTiM Cloud IoT OSのIDM機能を用いて取得したアクセストークンを、OPTiM AI Camera Web APIアクセス時のリクエストヘッダにAuthorization: Bearer {アクセストークン}として付与してください。 OPTiM Cloud IoT OSのレスポンス詳細については公式リファレンスを参照ください。

developer-portal.optim.cloud

STEP3: AI Camera Web APIをコールし、カメラの最新混雑情報を取得する

実際にAI Camera Web APIのAPIをコールしてみます。 Ruby on RailsのAPIモードを用いてAI Camera Web APIをラップしたAPIの実装を行い、どんな結果が返ってくるのかを調査してみました。 今回はAPI連携機能 1 つであるカメラの最新混雑情報取得の取得を行いました。

今回使用した環境は以下の通りです。

・ Ruby: 3.0.2
・ Ruby on Rails: 6.1.4.1


実験を実施するためには以下の情報が必要となります。STEP1において弊社より取得済みであることを事前にご確認ください。

項目 説明
クライアントID・クライアントシークレットキー Cloud IoT OSのアクセストークン取得時に使用
企業ID Developer登録した企業ID
カメラAPIキー カメラ映像を取得する対象カメラのAPIキー

Ruby on Rails(API モード)からAI Camera Web APIをコールする

メインとなるコントローラーの実装を行います。今回実装したcameras_controller.rbでは、指定した特定カメラの最新混雑情報を取得し、取得情報をjson形式で返すようなAPIとなっております。

# コントローラーの作成
$ bundle exec rails g controller api::v1::cameras index


下記では便宜上corporation_idクライアントIDなどをコントローラー内に記述しておりますが、お手元で試す場合は.env./config/environments/development.rb等に記述してご使用ください。 また、下記にはAPIコール時のエラー処理が含まれていないことも合わせてご留意ください。

# /app/controllers/api/v1/cameras_controller.rb

module Api
  module V1
    class CamerasController < ApplicationController
      def index
        client = HTTPClient.new

        # 対象カメラを保有している企業のID (AICamera情報)
        corporation_id = '<企業ID (AICamera)>'
        # 対象カメラのAPIキー (AICamera情報)
        camera_api_key = '<カメラAPIキー (AICamera)>'

        # OPTiM Cloud IoT OSよりアクセストークンを取得する
        # 参照: https://developer-portal.optim.cloud/md/api_v2/authz-client/#token-request
        cios_response = client.post(
          'https://auth.optim.cloud/connect/token',
          body: {
            client_id: '<クライアントID>',
            client_secret: '<クライアントシークレットキー>',
            grant_type: 'client_credentials',
            scope: 'group.read corporation.read corporation.group.read corporation.user.read'
          }
        )

        # OPTiM AI Camera Web APIより最新混雑状況を取得する
        # 参照: https://developer-docs.camera-lite.ai.optim.cloud/#operation/getCongestionLatest
        request_url = "https://api.camera-lite.ai.optim.cloud/v1/corporation/#{corporation_id}/camera/#{camera_api_key}/congestion/latest"
        response = client.get(
          request_url,
          header: {
            Authorization: "Bearer #{JSON.parse(cios_response.body)['access_token']}"
          }
        )

        #  レスポンス結果を確認する
        puts "response: #{JSON.parse(response.body)}"
        render json: JSON.parse(response.body)
      end
    end
  end
end

実際の動作

先ほど実装したAPIが正しい挙動を行うのかcurlを用いて試してみます。

$ curl http://localhost:3000/api/v1/cameras/index

実際に返ってきた情報は以下の通りです。APIリファレンスに記載がある通り、混雑可視化画像や検知人数がレスポンスで返ってきています。

{
  "camera_api_key": "781ab9fab1cd7b7bc063902a7bec9f22c2180c15e7a8c96a195e40cd3397f840",
  "analyzed_at": "20211029T044606Z",
  "congestion_baseline": [],
  "count": 0,
  "url": "https://images.example.com/path/to/result.jpg",
  "expires_at": "20211029T045700Z"
}


OPTiM AI Camera Web APIの使い方をもっと詳しく知りたい方向けにサンプルを公開しております。こちらも合わせてご覧ください。

github.com

おわりに

今回は配属されたAI CameraチームのAI Camera Web APIをRuby on Railsよりコールしてみました。普段はフロントエンドの実装を行っていますが、より配属チームのことを深く知ることができました。

自チームのみならず、OPTiMには優秀なエンジニアが多く在籍していますので、新卒として今後も多くのことを学び吸収していきたいと思っております。 そんなOPTiMでは共に開発を行うエンジニアを随時募集しております。少しでもご興味のある方はこちらをどうぞご覧ください。

www.optim.co.jp