CE50-10Aデータ管理機能とCloud Storageの連携

# 本記事の内容

本記事では、日立制御エッジコンピュータCE50-10Aを活用して、現場に設置した監視カメラ映像をGoogle Cloud Platform(GCP)のCloud Storage上にアップロードする方法を紹介します。
監視カメラの映像は常に発生し続けるデータですので、一定時間ごとに区切ってファイルに保存する必要がありますが、CE50-10Aのデータ入力機能を用いることで簡単＆拡張性高く実現できることを示します。

# CE50-10Aとは

CE50-10Aは、工場や発電所のような産業・インフラ業界におけるAI活用を念頭に、日立が2021年に販売開始したエッジ製品です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186837/b70383b7-9910-3470-8b9e-dee5aa777cbf.png)
引用元：https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html

CE50-10Aは、AIアプリケーションの開発／運用を効率よく・確実に行えるようにする４つの機能を提供しています。

* データ入力機能
  様々なカメラから映像を取得し、解像度やフレームレートを調整してファイル出力します。
* データ管理機能
  データ入力機能が出力したファイルを管理する機能です。
* 推論実行機能
  OpenVINOを用いて推論処理を行います。
* 推論開発機能
  Jupyter Notebookを用いて、推論処理を開発することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186837/1341cbfc-5317-eb17-ad6b-7fdd3c178cf0.png)
引用元：[CE50-10Aユーザーズ・ガイド](https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html)


各機能はDockerコンテナとして実装されています。
これらの機能を活用してAIアプリケーションを実装することで、疎結合で拡張性の高いマイクロサービス・アーキテクチャで実装することが出来ます。
例えば、オンライン動作中にAI推論機能をアップグレードする、といったことが可能です。

# Cloud Storageへのアップロードの実現方法

前置きが長くなりました。
まとめますと、
「CE50-10Aでは、データ入力機能がカメラ映像をファイルに変換するため、生成されたファイルをアップロードだけすればOK」
ということです。

アップロードを実現するコンテナの構成を以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186837/d1eb7610-45f5-5842-680a-5afe727f7f8e.png)


処理の流れは以下のようになります。
1. データ入力機能は、ボリューム(input_volume)にファイルを出力し、データ管理機能にファイル名を記録します。
1. データ管理機能は、ボリューム(storage_volume)にファイルを移動します。
1. アップロード処理は、データ管理機能から未アップロードのファイル名を取得してファイルをアップロードします。  
アップロードが成功したら、データ管理機能にアップロード完了を通知します。

コンテナの設定はdocker-composeを使用します。
ファイルを受け渡すボリュームにtmpfsを用いることで性能向上と搭載ディスクの劣化防止を行います。

```yaml:docker-compose.yaml
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ファイルで行います。
ここで解像度やフレームレートを変更することも可能です。
設定項目の詳細は[ユーザーズ・ガイド](https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/dl_files/ce50-10a_cc-5-0179.pdf)を参照してください。

```json:data_input.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コマンドが実行できるよう承認しておく必要があります。


```bash:upload.sh
#!/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公式のイメージをベースにしています。

```Dockerfile:Dockerfile
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のバケットにファイルがアップロードされます。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2186837/9a8d2e66-f883-bcab-a981-d64cafcad069.png">

# まとめ

CE50-10Aのデータ入力機能・データ管理機能を用いて、監視カメラが取得した動画をGCPのCloud Storageにアップロードする手順を紹介しました。

CE50-10Aについての詳しい情報は以下のサイトをご覧ください。
https://www.hitachi.co.jp/products/it/control_sys/platform/cs_edge/index.html

# 免責・商標類
	
* 本記事に記載した手順は、その動作や結果を保証するものではありません。
* 製品の改良により、予告なく記載されている仕様が変更になる場合があります。
* 本記事に記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。