株式会社オムニサイエンス
IBM i ビジネス事業部二部
田中 昌宏 氏
連携の概要
IoTデバイスとしてRaspberry Pi(ラズベリーパイ)にカメラモジュールを接続して、動体検知により撮影された顔画像に対して、IBM i 上で稼働するNode-REDを介して、顔認証AIサービスが提供しているAPIを利用して顔認証を行います。
処理の流れは以下のようになります。【図1】
- aspberry Pi(ラズベリーパイ)に接続したカメラとmotionというカメラアプリを用いて、動作検知されたタイミングで撮影して画像をディレクトリに保管します
- 保管した画像をIBM i 上で稼働するNode-RED に対して、cURLコマンド使ってPOST送信します
- IBM i 上のNode-RED は受信した画像データを元に顔検知APIと顔比較APIを呼び出します
- 顔検知APIは画像から顔データを抜き出し、顔比較APIは抜き出された顔データを蓄積された顔サンプルデータと比較し、一致する(確率が高い)顔データの情報を返します
- APIより取得した顔データを元に、DB2 for i 上の人物マスターより、名前を取得します
- 人物マスターより取得した名前をレスポンスとして返します
- レスポンス(認証結果と名前)を受け取って、画面に「ようこそ!○○さん!」を表示します
【図1】
それでは、Raspberry Pi側、IBM i (Node-RED)側の実装、顔認証AIサービスの活用のそれぞれのポイントを解説していきます。
Raspberry Pi(ラズベリーパイ)を使って手軽にIoT
Raspberry Pi(ラズベリーパイ)は2012年に発売されたGPIO(汎用入出力)を備えたLinuxベースで稼働する超小型PCで、もともとは子供の教育用に開発されましたが、昨今のIoT隆盛に伴いその可能性を大きく広げるツールとして注目されています。
カメラや温度センサーといった電子部品を接続して、それらを制御し活用するアプリケーションを簡単に作成でき、非常に安価に手に入れることもあり今回検証用のIoTデバイスとして採用しました。
今回の検証ではRaspberry Piに小型カメラを接続して、動体検知して撮影された画像をIBM i上のNode-REDに送信しています。
動体検知→撮影→送信までの流れは「Motion」というオープンソースの動画モニタアプリケーションを使用しました。動体検知と聞くと非常に複雑な仕組みを作らなければならないかと思いましたが、「Motion」というアプリをつかうことで、ノンプログラミングで簡単に実現できます。
Motionの設定ファイル(motion.conf)に監視オプションを指定して、アプリを起動するだけで、動体検知監視が開始され、検知の都度画像を指定ディレクトリに保存して、サーバーへの送信処理を自動で呼び出すことができます。
以下が設定ファイル(motion.conf)に記載した主な内容です。
threshold 1500 ※動体検知の閾値 ※ピクセル数を指定 on_picture_save sh /home/pi/send.sh %f ※画像保存時の起動スクリプトを指定
画像の送信は「cURL」(カール)で行いました。
「cURL」はさまざまなプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供するプロジェクトで、コマンドラインやプログラムから多種多様なHTTPリクエストをcURL共通の記述で実装することができます。
今回はシェルからcURLコマンドを実行して、IBM i上のNode-RED に対して保存された画像をPOST送信しています。
実際のコマンドは以下のようなものになります。
#bin/bash
#curl -X POST -F upfile=@$1 http://xxx.xxx.xxx.xxx/fileget
今回は単純に画像を送信するだけの処理なので、コマンドベースでの実としましたが、当然PythonやPHPなどの処理もRaspberry Piで実行できるので、IoTデバイスからの情報やAPIからのレスポンス情報をいかようにも扱うことができます。
IBM i上のNode-REDで既存資産と多種多様なサービス、IoTデバイスを組み合わせる
Node-REDは、Node.js環境で動作するAPIやオンラインサービス、デバイスなどの機能を繋げてアプリケーションを作成していくプラットフォームです。ブラウザでフローチャートのようにノードを繋げて必要なコーディングを施すだけで、簡単に作成していくことができます。
IBM i 上のNode.jsについて、バージョン6までは5733-OPSでサポートされていましたが、それ以降のバージョンは、yumで導入する必要があります。今回はNode.jsのバージョン8をyumで導入して、その上にNode-REDをnpm(Node.jsのパッケージ管理ツール)でインストールしました。
今回の検証では以下のようなノードを作成し、繋げて実装しています。【図2】
【図2】
それぞれのノードの役割を解説していきます。
① → [http in]ノードで「/fileget」という任意のURLを指定し、POST形式でリクエストを受け取ります。Node-REDではノード間の情報のやり取りをmsgオブジェクトを介して行います。payloadプロパティにデータを保持し、次のノードに渡します
② → [fanction]ノードでアップロードされた画像からバイナリーデータのみを抽出して、msg.payloadに格納します
③ → [fanction]ノードで「DetectAPI(顔検知)」へのリクエストパラメータの整形を行います
④ → [http request]ノードで「DetectAPI(顔検知)」へのリクエストを実行し、レスポンス(検知された顔データ)を取得します
⑤ → [fanction]ノードで「CompareAPI(顔比較)」へのリクエストパラメータ(④で取得した顔データ含む)の整形を行います
⑥ → [http request]ノードで「CompareAPI(顔比較)」へのリクエストを実行し、レスポンス(比較結果と一致確率の高い人物ID)を取得します
⑦ → [fanction]ノードで比較結果が80%以上であれば、人物IDから人物名を取得するSQLを整形します
⑧ → [DB2 for i]ノードでDB2 for iに接続し、SQLを実行して人物名を取得します
⑨ → [http response]ノードでリクエスト元に対してレスポンス(人物名)を返します
IBM i 上のNode-REDでは、DB2 for i アクセス専用のノードも準備されており、データベース・CL/RPG等のプログラムと様々なAPIやオンラインサービス・IoTデバイスを繋げてアプリケーションを作成していくことができます。
顔認証AIサービスの利用
顔認証はご存じの通り生体認証の一種で、顔によって個人を認識し、認証を行うシステムのことです。あらかじめサーバーに保存されている個人の顔のデータと、認証中の顔のデジタル画像とを照合し、認証が行われます。この際、特徴となるポイントやそのポイント間の距離を計測することで、サーバーに保存されているデータと認証中の人物が同一人物であるかを認識しています。最近ではカメラに写る角度の違いや細かい点が補正されて、認証の精度はかなり向上されてきています。 今回の検証では、インターネット上で提供されている顔認証AIサービスを利用しました。 同サービスでは所定数のリクエスト内であれば以下のAPIを無料で利用することができました。
- 顔検知API – 画像から顔データを切り出し、提供する
- 顔比較API – 事前に用意していた顔データのカタログと比較し、一致する(と思われる)顔データの情報と一致確率を提供する
実際にこのサービスではAPIの実行結果として以下のような情報をJSON形式で取得できます。
1. 顔検知API
{ "faces": [ { "face_rectangle": { ※元の画像から切り取られた顔画像の座標 }, "landmark": { ※目、鼻、口など顔パーツの詳細な位置座標 }, "attributes": { ※API内で判断された性別、年齢や目の色などの特徴等の情報 } "face_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", ※切り取られた顔のトークン } ], "image_id": "face1", ※切り取られた顔画像のID "face_num": 1 ※認識された顔の識別№ }
2. 顔比較API
{ "faces": [ { "face_token": " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " ※比較元の顔トークン } ], "results": [ { "confidence": 92.033, ※同一人物である確率 "user_id": "", "face_token": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" ※比較先の顔トークン }, { "confidence": 67.023, …
検証を振り返って
今回の検証で一番難しかったのは、Raspberry Pi上の「Motion」でのカメラ制御の部分でした。カメラの性能による影響が大きいと思いますが、動体検知の為の最適なオプションや閾値設定がなかなか見つけられず苦労しました。こういったIoTを実現するにはデバイスの性能や機能が運用に耐えれるか、ということが非常に重要な要素だと痛感しました。
実際業務において運用していくアプリケーションを構築するには、もっと考慮しなければならない点はありますが、こういったIoTデバイスやAPIサービスを取り入れて、かつ既存のデータベースやプログラム資産を活用できる環境がIBM i 上に整っていることは素晴らしいことだと思います。
また、「cURL」など様々な環境で実装簡素化の為に利用できる仕組みを多く知っておくことで、実装の難易度・ボリュームがかなり違ってきます。日頃からこういった技術知識・スキルを逃さないようにする努力も必要だと改めて感じました。
顔認証AIサービスは無料ながらもかなり精度の高いものだと感じました。APIエコノミー隆盛の時代を迎え、今後もAIをはじめとした様々なサービスが競争展開されいくと思いますが、それらと既存のIBM i 上の資産を繋げて簡単にアプリケーションを構築できるNode-REDはこれから使いどころの多い非常に有用なツールだと言えます。
Open Source協議会 – IBM i 技術分科会では、毎年度テーマを決めて技術研鑽の活動を行っています。昨年度は「IBM i 上のNode-REDとIoT、AIとの連携」というテーマで技術検証を行ってきました。
流行の「IoT」、「AI」をIBM i 上でオープンソースを使ってどのように実践していくか。業務で使える1つの明確な手法というわけではありませんが、「可能性を広げる」そんな取り組みが出来ればという想いから今回検証した内容について、概要から実装のポイントなどをご紹介していきます。