本記事の内容
本記事では、日立制御エッジコンピュータCE50-10Aを活用して、現場に設置した監視カメラ映像をGoogle Cloud Platform(GCP)のCloud Storage上にアップロードする方法を紹介します。
監視カメラの映像は常に発生し続けるデータですので、一定時間ごとに区切ってファイルに保存する必要がありますが、CE50-10Aのデータ入力機能を用いることで簡単&拡張性高く実現できることを示します。
CE50-10Aとは
CE50-10Aは、工場や発電所のような産業・インフラ業界におけるAI活用を念頭に、日立が2021年に販売開始したエッジ製品です。
引用元:https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html
CE50-10Aは、AIアプリケーションの開発/運用を効率よく・確実に行えるようにする4つの機能を提供しています。
- データ入力機能
様々なカメラから映像を取得し、解像度やフレームレートを調整してファイル出力します。 - データ管理機能
データ入力機能が出力したファイルを管理する機能です。 - 推論実行機能
OpenVINOを用いて推論処理を行います。 - 推論開発機能
Jupyter Notebookを用いて、推論処理を開発することが出来ます。
各機能はDockerコンテナとして実装されています。
これらの機能を活用してAIアプリケーションを実装することで、疎結合で拡張性の高いマイクロサービス・アーキテクチャで実装することが出来ます。
例えば、オンライン動作中にAI推論機能をアップグレードする、といったことが可能です。
Cloud Storageへのアップロードの実現方法
前置きが長くなりました。
まとめますと、
「CE50-10Aでは、データ入力機能がカメラ映像をファイルに変換するため、生成されたファイルをアップロードだけすればOK」
ということです。
処理の流れは以下のようになります。
- データ入力機能は、ボリューム(input_volume)にファイルを出力し、データ管理機能にファイル名を記録します。
- データ管理機能は、ボリューム(storage_volume)にファイルを移動します。
- アップロード処理は、データ管理機能から未アップロードのファイル名を取得してファイルをアップロードします。
アップロードが成功したら、データ管理機能にアップロード完了を通知します。
コンテナの設定はdocker-composeを使用します。
ファイルを受け渡すボリュームにtmpfsを用いることで性能向上と搭載ディスクの劣化防止を行います。
version: '3'
services:
data_input:
image: ctrl_edge_ai/data_input:1.0
network_mode: host
volumes:
- ./data_input.json:/config/data_input.json
- input_volume:/input
depends_on:
- data_manager
devices:
- "/dev/dri:/dev/dri"
data_manager:
image: ctrl_edge_ai/data_manager:1.0
network_mode: host
volumes:
- input_volume:/input
- storage_volume:/storage
upload_file:
build: .
network_mode: host
environment:
- BUCKET_NAME=xxxxxxxxxx
volumes:
- ${HOME}/.config:/root/.config
- storage_volume:/storage
depends_on:
- data_manager
volumes:
input_volume:
driver: local
driver_opts:
type: tmpfs
device: tmpfs
o: "size=512m"
storage_volume:
driver: local
driver_opts:
type: tmpfs
device: tmpfs
o: "size=1536m"
データ入力機能の設定はjsonファイルで行います。
ここで解像度やフレームレートを変更することも可能です。
設定項目の詳細はユーザーズ・ガイドを参照してください。
{
"camera":{
"name":"camera_no1",
"type":"ip",
"connect":{
"rtsp_url":"rtsp://id:password@192.168.10.205:11712/ipcam_h264.sdp",
"latency":2000
},
"video":{
"width": 1920,
"height": 1080,
"fps": 30,
"codec": "H264"
}
},
"output":{
"type":"video",
"output_dir":"/input",
"duration":5,
"video":{
"width": 1920,
"height": 1080,
"fps": 30,
"codec": "H264"
},
"api_url":"http://127.0.0.1:13579"
}
}
さて、肝心のアップロード処理です。
データ管理機能はREST APIで操作できますので、どんな言語でも簡単に実装出来ます。今回はシンプルにシェルスクリプトだけで実装してみました。
なお、事前にGoogle Cloud CLIコマンドが実行できるよう承認しておく必要があります。
#!/bin/bash
while true
do
sleep 1
record="$(curl -q http://127.0.0.1:13579/v1/files 2>/dev/null)"
file_id=$(echo "${record}" | jq -r .[0].file_id)
file_path=$(echo "${record}" | jq -r .[0].file_path)
[[ -e ${file_path} ]] || continue
echo "Uploading... ${file_path} -> ${BUCKET_NAME}"
gsutil cp ${file_path} gs://${BUCKET_NAME} && curl -q -X PUT -H 'Content-Type: application/json' -d '{"status":"completed"}' http://127.0.0.1:13579/v1/files/${file_id}
done
アップロード用コンテナは、Google Cloud公式のイメージをベースにしています。
FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:411.0.0
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update \
&& apt-get install -y jq \
&& apt-get clean -y
COPY upload.sh /root/upload.sh
CMD [ "bash", "/root/upload.sh" ]
docker-compose upすると、以下のようにCloud Storageのバケットにファイルがアップロードされます。
まとめ
CE50-10Aのデータ入力機能・データ管理機能を用いて、監視カメラが取得した動画をGCPのCloud Storageにアップロードする手順を紹介しました。
CE50-10Aについての詳しい情報は以下のサイトをご覧ください。
https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html
免責・商標類
- 本記事に記載した手順は、その動作や結果を保証するものではありません。
- 製品の改良により、予告なく記載されている仕様が変更になる場合があります。
- 本記事に記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。