Amazon Web Services ブログ

エッジデバイス上のAWS IoT Greengrassへ顔認識モデルをインストールする方法

皆様は、リモートデバイスの通信と制御のためにAWS IoT CoreAWS IoT Greengrassを使用する方法をすでに知っているかもしれません。 AWS IoT Greengrassの機械学習(ML)推論を使用すると、送信遅延なしにローカルデバイスで機械学習モデルを実行できます。 このブログ記事では、Raspberry PiでAWS IoT Greengrass ML推論を使用して自宅の監視のためにローカルの顔認識を実行する方法を紹介します。

Raspberry Piのカメラの制御装置として、Alexa Voice Serviceに接続されているAmazon Echo Dotを使用すると、ドアの外にいる人の写真を撮ることができ、その写真を使用して顔の検出と比較を実行できます。 Raspberry Piに展開された事前学習済みのMLモデルを使用したローカルデータセット 比較結果はドアロックや他のスマートデバイスでも使用できますが、これらの使用例はこの記事では扱いません。

前提条件

Raspberry PiデバイスにAWS IoT Greengrass Coreをインストールします。 IoT Greengrass GroupとCoreを作成してください。 手順については、AWS IoT Greengrass開発者ガイドのAWS IoT Greengrass入門を参照してください。 GroupとCoreはデプロイメントで使用されます。

この記事では、事前学習済みの顔検出モデルを使用し、TensorFlowでトレーニングしてから、AWS IoT Greengrassを使用してRaspberry Piにデプロイします。 同じモデルを使用することも、Amazon SageMakerを使用して自分のモデルをトレーニングすることもできます。 Amazon SageMakerを使用してモデルを準備する方法については、 Amazon SageMaker開発者ガイドのはじめにを参照してください。

本手順で依存のある以下をインストールしてください。

  • OpenCV 3.3
  • TensorFlow
  • Numpy
  • Scipy
  • Scikit-learn
  • Dlib
  • 画像処理ライブラリ

画像処理のライブラリは以下のコマンドでインストールできます

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev pkg-config graphicsmagick

OpenCV 3.3は以下のコマンドになります

git clone https://github.com/Itseez/opencv.git
git clone https://github.com/Itseez/opencv_contrib.git
cd opencv
git checkout 3.1.0
cd ../opencv_contrib/
git checkout 3.1.0
cd ..
cd opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
make -j4
sudo make install
sudo ldconfig

本投稿ではTensorFlowを用いた学習を行っています、Raspberry Piへのインストール方法は以下となります

# Install Wheel
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.0.1/tensorflow-1.0.1-cp34-cp34m-linux_armv7l.whl
sudo pip install tensorflow-1.0.1-cp34-cp34m-linux_armv7l.whl
sudo pip install mock
#Install Pip3
sudo apt install libatlas-base-dev
pip install tensorflow

Numpy、Scipy、Scikit-learnは以下のコマンドとなります

pip install numpy scipy scikit-learn

Dlibは以下のコマンドとなります

#Modify your swapfile
sudo nano /etc/dphys-swapfile
スワップサイズ、バーチャルメモリの変更
change CONF_SWAPSIZE = 100 to CONF_SWAPSIZE=1024
change virtual memory from 100M to 1G

sudo /etc/init.d/dphys-swapfile restart

sudo raspi-config
#ブートオプションを以下に変更
1)Boot Options => Desktop / CLI => Console Autologin
2)Advanced Options => Memory Split => change GPU to 16

#Doanload your Dlib
download Dlib to your device : http://dlib.net/
sudo python setup.py install

機械学習モデルとLambda関数

このGitHubからMLモデルを2つに見つけることができます

  • Face Detection Model
    |—-haarcascade_frontalface_default.xml
  • Face Recognition Model
    |—–train_faces.model-500.data-00000-of-00001
    |—–train_faces.model-500.index
    |—–train_faces.model-500.meta
    |—–checkpoint

また本投稿で利用しているLambda関数についての注意もあります

AWS IoT Greengrass上で動作するLambda関数

#open camera
cam = cv2.VideoCapture(0)
while True:
# capture an image from video stream
_, img = cam.read()
# convert RBG image to grayscale image
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# detect face
dets = detector(gray_image, 1)
if not len(dets):
    # detect face failed
    key = cv2.waitKey(30) & 0xff
    if key == 27:
        sys.exit(0)
    # start recognition
    for i, d in enumerate(dets):
        x1 = d.top() if d.top() > 0 else 0
        y1 = d.bottom() if d.bottom() > 0 else 0
        x2 = d.left() if d.left() > 0 else 0
        y2 = d.right() if d.right() > 0 else 0
        face = img[x1:y1, x2:y2]
        face = cv2.resize(face, (size, size))
        # compare image with dataset and compose JSON format message
        record_data = {}
        record_data['result'] = is_my_face(face)
        prepared_record_data = json.dumps(record_data)
        # send MQTT message to “record/webcam” topic
        client.publish(topic = 'record/webcam', payload = prepared_record_data)
        break;

AlexaのトリガとなるLambda関数

def get_welcome_response():
# public a message to IoT core
client.publish(
    topic='listening/record',
    payload="Hi",
    qos=1
)
# return message of this Alexa Skill
session_attributes = {}
card_title = "Welcome"
speech_output = "Sure. I will check the camera now."
# If the user either does not reply to the welcome message or says something
# that is not understood, they will be prompted again with this text.
reprompt_text = "Sure. I will check the camera now."
should_end_session = True
return build_response(session_attributes, 
                      build_speechlet_response(card_title, speech_output, reprompt_text, should_end_session)
)

始め方

本投稿で説明したアーキテクチャーを示します。 認識用のAWS Lambda関数を作成するために使用される顔認識モデルとデータセットは、Amazon S3バケットにアップロードされています。 AWS IoT Greengrassは必要なファイルをRaspberry Piと同期します。 Echo Dotがトリガーとして実行されます。 Echo Dotが「Alexa、open Monitor」などのコマンドをリッスンすると、Alexaのスキルを呼び出してAWS IoT Coreにメッセージを送信します。 AWS IoT Coreは、Raspberry PiローカルストレージにデプロイされているLambda認識機能を呼び出します。Lambda機能がゲストのIDを認識すると、ドアが開きます。

Raspberry Piに配置するリソースを準備しましょう。

まず、Raspberry Piカメラからフレームをキャプチャし、それをJPGファイルに変換してから分析のためにローカルMLモデルを呼び出すAWS Lambda関数を作成します。 AWS Lambda関数は、分析結果をJSON形式でAWS IoT Coreに送信します。

AWS Lambdaコンソールで、Create Functionを選択し、Author from scratchを選択します。 AWS Lambda関数にgreengrassFaceRecognizationのような名前を付けます。 ランタイムにはPython 2.7を選択してください。 このLambda機能はエッジデバイスに展開されるため、Raspberry Piの機能に影響を与えずに任意のRoleを選択できます。

Code areaで、ZIPファイルをアップロードするオプションを選択してから、GitHubからこのLambda関数用に提供されているZIPパッケージをアップロードします。 アクションから、新しいバージョンを公開します。 AWS IoT Greengrassは、Lambdaエイリアスのバージョンとして$ LATESTをサポートしていません。そのため、Lambda関数には必ずバージョン番号(バージョン1など)を割り当ててください。

Lambda関数が実行されると、顔認識のためにローカルのMLモデルを呼び出します。 以下の値を使用してGreengrassコンソールのLambda関数を設定/構成します。

Attribute:属性 Configuration:設定値
Memory Limit 96
Timeout 8
Lambda Lifecycle Make this function long-lived and keep it running indefinitely
Read access to /sys directory Enable
Input payload data type JSON

Lambda関数はRaspberry Pi上のいくつかのローカルデバイスを呼び出す必要があります。 これらのデバイスをAWS IoT Greengrassリソースに追加してください。

AWS IoTコアコンソールで、AWS IoT Greengrassを選択します。 Groupsを選択し、次にGreengrassグループを選択します(たとえば、greengrassFaceReco)
左側のナビゲーションペインで、Resourcesを選択します。 Localタブで、local resourceを選択します

 

この記事の例ではRaspberry Piカメラを使用しているので、Greengrassグループに2つのデバイスを追加します。

  • videoCoreSharedMemory
  • videoCoreInterface

以下のようにフィールドに入力します。

これらの設定が終わると以下のような状態になっていると思います

あなたのMLモデルをこのGreengrassグループに追加してください。 左側のナビゲーションペインで、Resource、Machine Learning、Add machine learning resourceの順に選択します。

この例では、モデルはS3バケットに格納されています。 Amazon SageMakerを使用してモデルをトレーニングする場合は、モデルソースとしてAmazon SageMakerを選択してください。 ローカルパスは、モデルを保存するエッジデバイス上のディレクトリです。 このパスを慎重に設定してください。 この設定を間違えると、あなたのモデルはエッジデバイスで使用できません。 あなたのモデルがGreengrassグループに追加されたのを確認することができます:

Amazon DynamoDBへの保存やAmazon EMRでの結果分析の処理のためにローカルでの分析結果をAWS IoT Cloudに送信できるようにサブスクリプションを作成します。 Raspberry Piに別のローカルデバイスが接続されている場合は、分析結果に基づいてAWS IoT Greengrassコアを使用してAWS Lambdaを通じてそれを制御できます。 この例では、結果はMQTTメッセージを介してAWS IoTクラウドに送信されます。

これでGreengrassグループをデプロイできます。 Actionsから、Deployを選択します。 展開時間はモデルのサイズによって異なります。 展開が完了すると、結果がコンソールに表示されます

 

これで、Raspberry Pi はPiカメラで撮影した顔写真を認識できるはずです。Echo Dotを使用して、Piカメラを音声制御し画像を取得します。

MQTTメッセージを介してAWS IoT Greengrassローカル顔検出Lambda関数をトリガーするための別のLambda関数を作成します。トリガーLambda関数は、AWS IoT Coreを介してGreengrassコアにMQTTメッセージを送信します。 AWS IoT Greengrassは、ローカルの顔検出Lambda関数を通じてこのメッセージを処理してから写真分析をトリガーします。このLambdaコードGitHub上のPython 2.7に基づいています。このLambda関数のARNをメモします。あなたがAlexaのスキルを設定するとき、あなたはそれを使うでしょう。

Amazon開発者ポータルを開きます。 Alexaを選択し、Your Alexa Consoleを選択し、スキルを選択してから、スキルの作成を選択します。独自のAlexaスキルを作成する方法については、Alexa Skills Kitを使用してスキルを構築するを参照してください。

最後に、Echo Dotを使用してRaspberry Piに音声制御メッセージを送信し、ローカルの顔認識プロセスを開始して、スマートホーム監視システムを構築します。結果はMQTTメッセージを通じてAWS IoTクラウドに送り返されます。

総論

この記事の例を使用することで、AWS IoT Greengrassを使用してRaspberry Piデバイス上に小型の家庭用監視システムを構築できます。その後、他のMLモデルをトレーニングし、それらをAWS IoT Greengrassデバイスにデプロイすることでさらに詳しく調べることができます。

 

原文はこちら
翻訳はSA 小梁川が担当しました