ども、ソリューションアーキテクトのtakiponeこと大瀧です。
カメラで捉えた画像から人間や物体を検出し、様々な情報と連携させる…カメラの画像解析は、AI技術の主要なユースケースとして様々な場面で利用されていますね。
カメラ側で画像解析を行うエッジコンピューティング構成もありますが、解析するための処理能力がカメラに求められます。カメラデバイスが非力な場合や、時間帯単位で特定の物体カウントといった応答時間の要件が厳しくない場合は、カメラで撮影したストリーミング動画をクラウドに送り、クラウドでその動画データを解析するのが手軽です。
本記事ではAWSのAIサービスとカメラデバイス、そしてそれらを便利につなげるSORACOMサービスを組み合わせた画像解析システムの構成パターンをご紹介します。
AWSの構成
AWSで画像解析を行うサービスは、アルゴリズムを含めてまるっと出来合いを利用するAmazon Rekognitionと、学習/推論といった機械学習のプロセスをマネージドサービスとして扱えるAmazon SageMakerがあります。
いずれのサービスを利用する場合でもカメラの動画データを順次送る必要があり、そのためのビデオストリームを提供するマネージドサービス、Amazon Kinesis Video Streams(以下KVS)を組み合わせることができます。構成図にすると以下のようになります(KVSとSageMakerの連携にはKIT(Kinesis Video Streams Inference Template)が必要なので追記しています)。
KVSの入力であるビデオストリームにストリーム動画を送り込めばいいわけですね。
カメラデバイスの構成と課題
動画撮影ができる市販のカメラデバイスの動画をKVSのビデオストリームに送るための構成を2つ挙げ、それぞれについての課題と解決策を示します。
- Webカメラ
- ネットワークカメラ
1. Webカメラの構成
WebカメラはコンピュータとUSB接続して使う、様々なものが手に入ります。常設するのであればIntel NUCやRaspberry Piなど小型のコンピュータ(SBC: Single Board Computer)にWebカメラを接続して、Webカメラが撮影した動画をSBCでエンコード、クラウドに送信する構成が挙げられます。
送信する動画データをKVSのビデオストリームの形式に合わせるためには、SBCにKVSプロデューサーライブラリをインストールし、KVS APIにアクセスするためのAWS APIキーをセットする必要があります。プロデューサーライブラリのビルドには手間がかかり、カメラを多数配置する際にそれぞれのAPIキーを管理・運用するコストもかさみます。
SORACOM FunnelのKVSアダプターを利用すると、SBCではプロデューサーライブラリとAPIキーが不要になり、SORACOM IoT SIMから3G/LTE回線経由でKVSへの動画送信が可能になります。
簡単に解説します。SORACOM Funnelは、どのSIMからの通信かを判別する仕組みを持つためSIMに対応するAWS APIキーをあてがい、SIMからの動画データをKVSの形式に変換しつつ、APIキーを含めてKVSに送信します。こうすることでSBCにはKVSプロデューサーライブラリのインストールが不要(FunnelにはH.264形式の動画ストリームをTCPで送信すればOK)になり、かつAWS APIキーをSORACOMで一元管理できるわけです。
FunnelのKVSアダプターは現在Limited Previewサービスになっています。ご利用にはこちらのフォームからご申請ください。
2. ネットワークカメラの構成
ネットワークカメラはカメラにセットしたSDカードに保存するほか、RTSPやMotion JPEG over HTTPなどサーバー機能を内蔵し、クライアントに動画データを配信できるものがあります。KVSのビデオストリームはRTSPなどには対応していないため、ネットワークカメラのクライアントとなるコンピューターを用意して動画データを取得、KVSプロデューサーライブラリでKVSに送信する構成が考えられます。従来ハードディスクなどに録画するエンコーダーといった専用機器の代わりに自前でエンコーダーを用意するイメージです。エンコーダーはエンコード処理などのためにコンピューターリソースが必要ですし、カメラの台数分用意するとなると、導入と維持のコストがかさみます。
そんな課題を解決する構成として、エンコーダーをAmazon EC2やAWS Fargateで実行し、カメラデバイスとAWSをSORACOM CanalとSORACOM Gateによるセルラー閉域で接続するクラウドエンコーダー構成をオススメします。
ネットワークカメラの多くはLANでの接続が前提で、クライアントの認証機能や動画データの暗号化機能を持っていない場合が多いです。ネットワークカメラにグローバルIPアドレスが設定される構成では、動画が意図せずインターネットに公開されてしまうリスクもありますね。セルラー閉域構成であればネットワークカメラにはプライベートIPアドレスが設定されるのでインターネットからの接続を防ぎ、かつ離れた場所に点在するカメラデバイスにEC2やコンテナから安全にアクセスすることが出来ます。LTE機能を持たないネットワークカメラであれば、LTE機能を持つルーター機器を有線LANやWi-Fiで接続し組み合わせても良いでしょう(ルーターでLTEインターフェース宛のRTSP接続をカメラにフォワードする、ポートフォワードの設定が必要です)。
EC2はCPUやメモリ、GPUの組み合わせであるインスタンスタイプを選択できるため、カメラの台数増に合わせてあとからEC2を増やしたりインスタンスタイプを変えたりと柔軟な構成が可能です。また、KVSに接続するためのAPIキーはIAMロールという仕組みで動的に取得できるため、APIキーを管理する必要がない点もメリットとして挙げられます。
さらに、DockerコンテナであればAWS Fargateによってインスタンスの管理が不要でコンテナを用いた柔軟なソフトウェア構成が可能です(EC2と同様にIAMロールを利用できます)。
動画アップロードに適したSORACOMの料金プラン
いずれの構成でも、カメラからは動画データが順次クラウドに送信されるため、アップロードのデータ通信量は大きくなりがちです。SORACOM Airのデータアップロード向け料金プランであるPlan-DUは基本料金込みでアップロード10GBが月額1,200円とリーズナブルに利用できるため、今回のカメラとクラウドの連携にはうってつけです。
検証してみました
それぞれのカメラの疑似的な構成を、手持ちの機材で試してみました。
検証例1. WebカメラとSBCでFunnel KVSを利用
- Webカメラ: Logicool HD Webcam C615n
- SBC: Raspberry Pi 3B+
- OS: Raspbian Buster
- ストリーミングソフトウェア: GStreamer 1.14.4
今回はストリーミングのソフトウェアとしてGstreamerを利用しました。KVSに送信するkvssink
の代わりにtcpclientsink
を利用するのがポイントですが、それ以外は一般的なH.264のストリーミング配信と特に変わりません。
$ gst-launch-1.0 -v v4l2src do-timestamp=TRUE ! videoconvert ! video/x-raw,format=I420,width=640,height=480,framerate=15/1 ! omxh264enc ! tcpclientsink host=<Funnel KVSのエンドポイント> port=<Funnel KVSのポート番号> sync=false
検証例2. ネットワークカメラとクラウドエンコーダをSORACOM Gateで利用
- ネットワークカメラ: iPad(第6世代) Wi-Fi + Cellular
- ストリーミングアプリ: Live-Reporter
- クラウドエンコーダー: EC2
- インスタンスタイプ: i3.large
- OS: Ubuntu 18.04
- Dockerコンテナイメージ: 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-amazon-linux
ネットワークカメラは手頃なものが手元になかったので、LTEも使えるiPadのセルラーモデルでRTSPサーバーアプリのLive-Reporterを実行しました。
エンコーダーはEC2インスタンスで以下の手順をベースに、DockerコンテナでGstreamerを実行しました。
Docker コンテナで GStreamer エレメントを実行します – Amazon Kinesis Video Streams
今回はEC2に割り当てたIAMロールでKVSにアクセスしたかったのですがGStreamerプラグインから直接IAMロールの認証情報を取得する方法が見つけられなかったので、以下のコマンドで事前にIAMロールの認証情報を取得し、環境変数でGstreamerに渡す形で試しました。Fargateで同じことをするのであれば、コンテナ実行時にシェルスクリプトで一連の動作を自動化することになると思います。
$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
# アクセスキー、シークレットアクセスキー、セッショントークンをコピーしておく
GStreamerとプラグインを含むDockerコンテナを実行、シェルを開いてプラグインを使えるようにするための環境変数を設定します。
$ sudo docker run -it 546150905175.dkr.ecr.us-west-2.amazonaws.com/kinesis-video-producer-sdk-cpp-amazon-linux /bin/bash
# export LD_LIBRARY_PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib:$LD_LIBRARY_PATH
# export PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/bin:$PATH
# export GST_PLUGIN_PATH=/opt/awssdk/amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/downloads/local/lib:$GST_PLUGIN_PATH
IAMロールの認証情報をセットしつつ、Gstreamerを実行してiPadのRTSPサーバーにセルラー閉域経由でアクセス、取得した動画データをKVSに送信します。
# AWS_ACCESS_KEY_ID=<アクセスキー> AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー> AWS_SESSION_TOKEN="<セッショントークン>" \
gst-launch-1.0 rtspsrc location="rtsp://<SORACOM IoT SIMのプライベートIP>:554" short-header=TRUE ! rtph264depay ! h264parse ! kvssink stream-name=<KVSのビデオストリーム名>
まとめ
カメラデバイスとクラウドのAIサービスを組み合わせて画像解析を行う際の便利な構成をご紹介しました。趣味のIoTシステムで使うもよし、ビジネスとしてカメラデバイスの新たなソリューションサービスとして組み込むもよし、ぜひ活用してみてください。SORACCOMの各サービスについてお気づきの点があれば、フィードバックもいただけると嬉しいです。SNSやイベントなどで意見をお寄せください。