Raspberry PiとSORACOM AirとGoogle Cloud Vision APIで不正駐車を監視する

この記事は、ソラコムSoftware Design誌巻頭特集記念リレーブログ 5月1日分です。

この記事では、スパークルラボでPoCを行った、Raspberry Pi, SORACOM Air, Google Cloud Vision APIを使った簡易な不正駐車を監視するシステムを紹介します。


不正駐車監視システムの動作概要

このシステムは、普段は自動車が停まっていない場所を監視カメラで監視します。

・ このシステムは、駐車場の出入り口など、普段は自動車が停まっていない場所を監視カメラで監視します。
・ Raspberry PiとWebカメラを監視カメラとして使います。
・ この記事では不正駐車を、この監視カメラで撮影している場所に自動車が停まっている事と定義します。

Raspberry Piで行う処理は、この図のようになります。

Raspberry Piで行う処理の概要

このシステムは、不正駐車の検出とユーザー通知をWebサーバーで行います。

  • Raspberry Piで一定時間毎に写真を取り、その画像をWebサーバーにアップロードします。
  • 画像のアップロードは、SORACOM Airによりインターネットを経由して行います。SORACOM Airは、IoT 向けのデータ通信SIM “Air SIM” を提供するサービスです。
  • 不正駐車の有無は、アップロードされた画像に自動車が写っているかどうかで判定します。
  • 自動車が写っているかどうかは、Google Cloud Vision APIを使って判定します。Google Cloud Vision APIはGoogleの画像認識APIで、画像内のさまざまな物体を簡単に検知出来ます。
  • 不正駐車を検出したら、ユーザーにメールで通知します。

WebサーバーはAWS API GatewayとAWS Lambdaで作成します。
アップロードされた画像に対するWebサーバーでの処理は、この図の矢印に沿って行います。

Raspberry Piからアップロードされた画像に対するWebサーバーの処理の概要

不正駐車監視システムの作り方

以降は不正駐車を監視するシステムを作る手順を説明します。

目次
1. ハードウェアの準備
1.1. Webカメラについて
1.2. データ通信端末とSIMについて
1.3. その他
2. Raspberry Piの設定
2.1. Raspbianのインストール
2.2. SORACOM Airの設定
2.2.1. SORACOM Airの自動接続設定
2.3. Webカメラ監視サービスの設定
2.3.1. 必要なパッケージソフトウェアのインストール
2.3.2. Webカメラ監視サービスの登録
3. Webサーバーの設定
3.1. Google Cloud Vision APIのAPIキーの取得
3.2. AWS SNSに通知用メールアドレスを登録する
3.3. AWS S3に画像保存用バケットを作成する
3.4. AWS DynamoDBに不正駐車検出用のテーブルを作成する
3.5. AWS IAMで不正駐車検出用のロールを作成する
3.6. AWS Lambdaに不正駐車検出処理を登録する
3.7. AWS API GatewayによるWebサーバーの公開

  1. ハードウェアの準備

以下のハードウェアが必要です。

  • Raspberry Pi 3
  • SDカード: 8GB以上
  • USBのWebカメラ
  • USBデータ通信端末
  • SORACOM Air SIM

1.1. Webカメラについて

今回の記事の動作確認では、WebカメラにELECOM UCAM-DLV300を使いましたが、他のWebカメラでも動作すると思います。

1.2. データ通信端末とSIMについて

この記事では、富士ソフトFS01BUとSoftware-Design-2016年5月号付録のSIMを使いません。
代わりにdocomoデータ通信端末L-05Aを使いました。こちらの方が中古で安かったらです。

他のデータ通信端末でも動作すると思います。
記事の内容は適宜読み替えて下さい。

1.3. その他

その他、以下のような物があれば屋外で使用する際に便利です。

  • バッテリー: cheero Canvas
  • Raspberry Piケース

これらのハードウェアを接続すると、Raspberry Piは以下のような状態になります。

2. Raspberry Piの設定

2.1. Raspbianのインストール

raspberrypi.orgのインストールガイドに従ってRaspbianをインストールして下さい。

2.2. SORACOM Airの設定

富士ソフトFS01BUとSoftware-Design-2016年5月号付録のSIMをお使いの方は、
Software-Design-2016年5月号等を参考にしてSORACOM Airの設定をして下さい。

この2.2項ではL-05Aを使った場合について説明します。
他の通信端末をお使いの場合には、適宜読み替えて設定して下さい。

2.2.1. SORACOM Airの自動接続設定

Raspberry Pi起動時に自動的にSORACOM Airでインターネットと接続出来るようにします。

今回使用したL-05Aでは、Raspberry Pi B+ と L-05A で SORACOM Air(nano SIM)を試してみたを参考にさせて頂き、設定しました。

まずRaspberry Pi B+ と L-05A で SORACOM Air(nano SIM)を試してみたを参考に、SORACOM Airでインターネットと接続して下さい。

次に、以下の2つのファイルをpiユーザーのホームディレクトリにコピーして下さい。

  • soracom.sh
#!/bin/sh
eject /dev/sr0
pon soracom
while [ ! -e /sys/class/net/ppp0 ]
do
sleep 1
done
pidof pppd > /var/run/soracom.pid
  • soracom.service
[Unit]
Description=ppp daemon with soracom air.
Requires=network.target
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/soracom.sh
ExecStop=/usr/bin/poff soracom
Restart=always
Type=forking
PIDFile=/var/run/soracom.pid
[Install]
WantedBy=multi-user.target

次にpiユーザーで、以下のコマンド実行して下さい。

cd
sudo cp soracom.sh /usr/local/bin
sudo chmod +x /usr/local/bin/soracom.sh
sudo cp soracom.service /etc/systemd/system
sudo systemctl enable soracom

以上で、raspbian起動後自動的にSORACOM Airでの通信が出来るようになります。

2.3. Webカメラ監視サービスの設定

Webカメラで定期的に画像を取得し、画像をアップロードする処理をサービスとしてsystemdに登録します。
Raspbianはテキストログインになるよう設定しておいて下さい。

2.3.1. 必要なパッケージソフトウェアのインストール

以下のコマンドを実行して、webカメラを操作するコマンドをインストールして下さい。


sudo apt-get update
sudo apt-get install fswebcam

2.3.2. Webカメラ監視サービスの登録

画像の取得とアップロードの定期的な実行はsystemdで行います。
この項では、Webカメラ監視サービスを作成、登録し、サービスを定期的に実行させる手順について説明します。

以下の3つのファイルをpiユーザーのホームディレクトリにコピーして下さい。

  • capture_and_upload.sh

画像の取得とアップロードを行うスクリプトです。

#!/bin/sh
URL=’https://***********'
IMSI=’1234567890'
IMG=’/tmp/image.jpg’
# Webカメラで画像を取る
fswebcam -r 640x480 — jpeg 30 -D 1 -S 35 — no-banner ${IMG}
# 画像を${URL}にPOSTする
echo ‘{“b64str”: “’`base64 ${IMG}`’”}’ | \
curl -X POST -H “Content-Type: application/json” -H “X-SORACOM-IMSI:${IMSI}” -H “X-SORACOM-TIMESTAMP:1234” -d @- ${URL}
  • webcam-monitoring.service

capture_and_upload.shを1回実行するだけのユニットです。

[Unit]
Description=take a pic by web cam and upload it
After=soracom.service
Requires=soracom.service
[Service]
ExecStart=/usr/local/bin/capture_and_upload.sh
Type=simple
  • webcam-monitoring.timer
     webcam-monitoring.serviceを10秒毎に呼び出すユニットです。
[Unit]
Description=web cam monitoring service
After=soracom.service
Requires=soracom.service
[Timer]
OnUnitActiveSec=10sec
[Install]
WantedBy=timers.target

次にpiユーザーで、以下のコマンド実行して下さい。

cd
sudo cp capture_and_upload.sh /usr/local/bin
sudo chmod +x /usr/local/bin/capture_and_upload.sh
sudo cp webcam-monitoring.service /etc/systemd/system
sudo cp webcam-monitoring.timer /etc/systemd/system
sudo systemctl enable webcam-monitoring

これで、webcam-monitoring.serviceとwebcam-monitoring.timerがsystemdに登録されました。
2.2.1.項で設定したsoracom.serviceが実行中であれば、Webカメラによる監視サービスが実行されるようになります。

3. Webサーバーの設定

3.1. Google Cloud Vision APIのAPIキーの取得

Google Cloud Vision APIを使うためには、APIキーが必要です。Authenticating to a Cloud API Serviceを参考にして、browser API keyを取得して下さい。

3.2. AWS SNSに通知用メールアドレスを登録する

(1) AWS SNSのコンソールを開いて下さい。

(2) “Create actions”の”Create Topic”リンクを押下して、”Create new topic”ウィンドウが表示される事を確認して下さい。

(3) Topic name, Diplay nameに”soracom_demo”と入力し、”Create new topic”ウィンドウ右下のCreate topicボタンを押下して下さい。

(4) “Topics Details”画面に遷移した事を確認して下さい。

(5) “Create Subscription”ボタンを押下して、”Create Subscription”ウィンドウが表示される事を確認して下さい。

(6) ProtocolにEmailを選択して下さい。

(7) Endpointに不正駐車検出の通知を受ける為のメールアドレスを入力して下さい。

(8) “Create Subscription”ボタンを押下して下さい。

(9) “Topics Details”画面に遷移した事を確認して下さい。

以上でメールアドレスの登録は完了です。
表示されているTopic ARNを控えておいて下さい。AWS LambdaでこのTopic ARNを使います。

3.3. AWS S3に画像保存用バケットを作成する

(1) AWS S3のコンソールを開いてください。

(2) 画面左上の”バケットを作成”ボタンを押下し、”バケットの作成”ウィンドウが表示される事を確認して下さい。

(3) バケット名に任意の名前を入力して下さい。

(4) リージョンにTokyoを指定して下さい。

(5) ウィンドウ右下の”作成”ボタンを押下して下さい。

以上でバケットの作成は完了です。
作成したバケット名は控えておいて下さい。AWS Lambdaでこのバケット名を使います。

3.4. AWS DynamoDBに不正駐車検出用のテーブルを作成する

(1) AWS DynamoDBのコンソールを開いて下さい。

(2) DynamoDBのコンソールで、”テーブルの作成”ボタンを押下して下さい。

(3) “DynamoDB テーブルの作成”画面に遷移した事を確認して下さい。

(4) “DynamoDB テーブルの作成”画面で、テーブル名に”soracom_demo”を入力して下さい。

(5) “DynamoDB テーブルの作成”画面で、プライマリキーに”imsi”を入力し、文字列を選択して下さい。

(6) 画面右下の”作成”ボタンを押下して下さい。

以上でテーブルの作成は完了です。
作成したテーブル名は控えておいて下さい。AWS Lambdaでこのテーブル名を使います。

3.5. AWS IAMで不正駐車検出用のロールを作成する

(1) AWS IAMのコンソールを開いて下さい。

(2) 画面左中央付近の”ロール”を押下して下さい。

(3) 画面右が遷移するのを確認し、”新しいロールの作成”ボタンを押下して下さい。

(4) “手順 1: ロール名の設定”画面に遷移するのを確認し、ロール名にsoracom_demoを入力して、画面右下の”次のステップ”ボタンを押下して下さい。

(5) “手順 2: ロールタイプの選択”画面に遷移するのを確認し、”AWSサービスロール”で、AWS Lambdaの右にある”選択”ボタンを押下して下さい。

(6) “手順 4: ポリシーのアタッチ”画面に遷移するのを確認し、以下の4つのポリシーに対して、各行の1列目にあるチェックボタンを押下し、チェックを入れて下さい。

  • AmazonS3FullAccess
  • AmazonDynamoDBFullAccess
  • AWSLambdaBasicExecutionRole
  • AmazonSNSFullAccess

(7) “手順 4: ポリシーのアタッチ”画面右下にある”次のステップ”ボタンを押下して下さい。

(8) “手順 5: 確認”画面に遷移する事を確認し、画面右下の”ロールの作成”ボタンを押下して下さい。

以上でロールの作成は完了です。
AWS Lambdaでこのロールを使います。

3.6. AWS Lambdaに不正駐車検出処理を登録する

(1) AWS Lambdaのコンソールを開いて下さい。

(2) “Create a Lambda function”ボタンを押下して下さい。

(3) “Step 1: Select blueprint”画面に遷移した事を確認し、画面右下の”Skip”ボタンを押下して下さい。

(4) “Step 2: Configure function”画面に遷移した事を確認し、画面中の3つの項目に以下の内容を入力して下さい。

  • Name: “soracom_demo”
  • Description: “soracom demo”
  • Runtime: python2.7

(5) “Step 2: Configure function”画面の”Lambda function code”で、Code entry typeラジオボタンが”Edit code inline”を選択している事を確認して下さい。

(6) “Step 2: Configure function”画面の”Lambda function code”で、大きなテキストボックスに次のコードを入力して下さい。

(7) “Step 2: Configure function”画面”Lambda function code”の大きなテキストボックスに入力したコード中のGCV_KEY変数の内容を、3.1.項で取得したbrowser APIキーに変更して下さい。

(8) “Step 2: Configure function”画面”Lambda function code”の大きなテキストボックスに入力したコード中のTOPIC_ARN変数の内容を、3.2.項で取得したTopic ARNに変更して下さい。

(9) “Step 2: Configure function”画面”Lambda function code”の大きなテキストボックスに入力したコード中のBUCKET_NAME変数の内容を、3.3.項で取得したバケット名に変更して下さい。

(10) “Step 2: Configure function”画面”Lambda function code”の大きなテキストボックスに入力したコード中のDYNAMO_TABLE変数の内容を、3.4.項で取得したDynamoDBのテーブル名に変更して下さい。

(11) “Step 2: Configure function”画面”Lambda function handler and role”で、Handlerテキストボックスに”lambda_function.lambda_handler”と入力して下さい。

(12) “Step 2: Configure function”画面”Lambda function handler and role”で、Roleに3.5.項で作成したsoracom_demoを指定して下さい。

(13) “Step 2: Configure function”画面右下の”Next”ボタンを押下して下さい。

(14) “Step 3: Review”画面に遷移した事を確認し、画面右下の”Create function”ボタンを押下して下さい。

以上でAWS Lambdaへの不正駐車検出処理の登録が完了しました。

3.7. AWS API GatewayによるWebサーバーの公開

(1) AWS API Gatewayのコンソールを開いて下さい。

(2) “APIの作成”ボタンを押下し、画面が遷移する事を確認して下さい。

(3) 画面の”New API”ラジオボタンが選択されている事を確認して下さい。

(4) “API名”テキストボックスに”soracom_demo”と入力し、画面右の”APIの作成”ボタンを押下して、画面が遷移する事を確認して下さい。

(5) “Actions”セレクトボックスを押下して一覧を表示させ、”Create Method”を押下して下さい。

(6) 新しく表示されたセレクトボックスを押下して一覧を表示させ、”POST”を押下し、このセレクトボックスの右側にチェックマークアイコンが表示される事を確認して下さい。

(7) (6)で表示されたチェックマークアイコンを押下し、画面が遷移する事を確認して下さい。

(8) “Lambda関数”ラジオボタンを押下し、”Lambda関数”を選択して下さい。

(9) “Lambdaリージョン”セレクトボックスから、”ap-northeast-1"を選択して下さい。

(10) “Lambda関数”テキストボックスに”soracom_demo”と入力し、画面右の”保存”ボタンを押下して下さい。

(11) “Lambda統合”ウィンドウがポップアップされる事を確認し、”OK”ボタンを押下して下さい。

(12) “Lambda 関数に権限を追加する”ウィンドウがポップアップされる事を確認し、”OK”ボタンを押下して画面が遷移する事を確認して下さい。

(13) “メソッドリクエスト”のリンクを押下し、画面が遷移する事を確認して下さい。

(14) “HTTPリクエストヘッダー”文字列の左にある三角形のボタンを押下し、”⊕ ヘッダーの追加”が現れる事を確認して下さい。

(15) “⊕ ヘッダーの追加”リンクを押下すると現れるテキストボックスに”X-SORACOM-IMSI”と入力し、そのテキストボックスのある行の右にあるチェックマークアイコンを押下して下さい。

(16) “⊕ ヘッダーの追加”リンクを押下すると現れるテキストボックスに”X-SORACOM-TIMESTAMP”と入力し、そのテキストボックスのある行の右にあるチェックマークアイコンを押下して下さい。

(17) “メソッドの実行”リンクを押下して、画面が遷移する事を確認して下さい。

(18) “統合リクエスト”リンクを押下して、画面が遷移する事を確認して下さい。

(19) “ マッピングテンプレート”文字列の左にある三角形のボタンを押下し、”⊕ マッピングテンプレートの追加”リンクが現れる事を確認して下さい。

(20) “⊕ マッピングテンプレートの追加”リンクを押下し、”Content-Type”テーブルにあるテキストボックスに”application/json”と入力し、テキストボックスの右にあるチェックマークアイコンを押下して下さい。

(21) “⊕ マッピングテンプレートの追加”リンクの右に大きいテキストボックスが現れる事を確認し、以下の文字列を入力してから、画面右下の”Save”ボタンを押下して下さい。

{
“imsi”:”$input.params(‘X-SORACOM-IMSI’)”,
“timestamp”:$input.params(‘X-SORACOM-TIMESTAMP’),
“b64str”:$input.json(‘$.b64str’)
}

(22) “メソッドの実行”リンクを押下して、画面が遷移する事を確認して下さい。

(23) “Actions”セレクトボックスを押下して一覧を表示させ、”APIのデプロイ”を押下して下さい。

(24) “APIのデプロイ”ウィンドウが表示される事を確認し、”デプロイされるステージ”セレクトボックスから”[New Stage]”を選択して下さい。

(25) “ステージ名”テキストボックスに”prod”と入力してから、ウィンドウの右下にある”デプロイ”ボタンを押下して下さい。

(26) 画面が遷移して、”URLの呼び出し”文字列の右にURLが表示されている事を確認したら、そのURLを控えて下さい。

(27) 2.3.2.項で作成したcapture_and_upload.shのURL変数に(26)で控えたURLを入力して下さい。

以上でWebサーバーの公開が完了しました。

Raspberry Piに電源を入れ、不正駐車の監視を実行して下さい。
不正駐車があった場合に、登録済みのメールアドレスに不正駐車検出のメールが届く事を確認して下さい。