コンピュータビジョンを使用して、仮想境界を介して危険な領域から人々を保護します

ソースノード: 807925

企業がより多くの自律型ロボットやその他の重機を職場に歓迎するにつれて、私たちは機器が人間のチームメートの周りで安全に動作できるようにする必要があります。 この投稿では、コンピュータビジョンと仮想境界を構築する方法を紹介します。 AWS ディープレンズ、開発者が機械学習(ML)を学習するために設計されたAWSディープラーニング対応のビデオカメラ。 この投稿の機械学習手法を使用すると、制限区域の仮想境界を構築して、機器を自動的にシャットダウンしたり、人間が近づいたときにアラートを鳴らしたりできます。

このプロジェクトでは、カスタムオブジェクト検出モデルを次のようにトレーニングします。 アマゾンセージメーカー モデルをAWSDeepLensデバイスにデプロイします。 オブジェクト検出は、画像を入力として受け取り、画像内のオブジェクトとその位置を識別するMLアルゴリズムです。 仮想境界ソリューションに加えて、特定のオブジェクトが画像内のどこにあるかを検出したり、棚のアイテムを数えたり、画像内の目的のオブジェクトのインスタンスの数を数えたりする必要がある場合は、この投稿で学習した手法を適用できます。小売店の棚に。

ソリューションの概要

このチュートリアルには、次の手順が含まれます。

  1. MLアルゴリズムにフィードするデータセットを準備します。
  2. AmazonSageMakerでモデルをトレーニングします。
  3. カスタム制限ゾーンを使用してモデルをテストします。
  4. ソリューションをAWSDeepLensにデプロイします。

また、このソリューションを適用できる他の実際のユースケースについても説明します。

次の図は、ソリューションのアーキテクチャを示しています。

前提条件

このウォークスルーを完了するには、次の前提条件が必要です。

MLアルゴリズムにフィードするデータセットを準備します

この投稿では、オブジェクト検出モデルと呼ばれるMLアルゴリズムを使用して、人がカスタム制限ゾーンにいるかどうかを検出するソリューションを構築します。 公開されているものを使用します 歩行者検出データセット 2,000以上の画像があるKaggleで利用できます。 このデータセットには、人間と人間のようなオブジェクト(マネキンなど)のラベルが含まれているため、トレーニングされたモデルは、実際の人間と段ボールの小道具や彫像をより正確に区別できます。

たとえば、次の画像は、検出された建設作業員の例であり、カスタム制限ゾーン(赤い輪郭)にいるかどうかを示しています。

モデルのトレーニングを開始するには、 最初にS3バケットを作成します トレーニングデータとモデル出力を保存します。 AWS DeepLensプロジェクトの場合、S3バケット名はプレフィックスで始まる必要があります deeplens-。 このデータを使用して、MLモデルを迅速に構築、トレーニング、デプロイする機能を提供するフルマネージドサービスであるSageMakerでモデルをトレーニングします。

AmazonSageMakerでモデルをトレーニングする

モデルをトレーニングするための開発環境として、SageMakerJupyterノートブックを使用します。 Jupyter Notebookは、ライブコード、方程式、視覚化、およびナラティブテキストを含むドキュメントを作成および共有できるオープンソースのWebアプリケーションです。 この投稿のために、私たちは提供します Train_Object_Detection_People_DeepLens.ipynb、あなたが従うための完全なノートブック。

カスタムオブジェクト検出モデルを作成するには、グラフィックプロセッシングユニット(GPU)対応のトレーニングジョブインスタンスを使用する必要があります。 GPUは、ニューラルネットワークのトレーニングに必要な計算の並列化に優れています。 ノートブック自体は単一のml.t2.mediumインスタンスですが、トレーニングジョブは特にml.p2.xlargeインスタンスを使用します。 GPU対応のトレーニングジョブインスタンスにアクセスするには、次のことを行う必要があります サービス制限の引き上げのリクエストを送信する AWSサポートセンターへ。

制限の引き上げを受け取ったら、次の手順を実行してSageMakerノートブックインスタンスを作成します。

  1. SageMakerコンソールで、 ノートブックインスタンス.
  2. 選択する ノートブックインスタンスを作成.
  3. ノートブックインスタンス名、ノートブックインスタンスの名前を入力します。
  4. インスタンスタイプ、選択する t2.medium。

これは、ノートブックインスタンスがサポートする最も安価なインスタンスタイプであり、このチュートリアルには十分です。

  1. IAMの役割、選択する 新しい役割を作成する.

これを確認してください AWS IDおよびアクセス管理 (IAM)ロールは、以前に作成したS3バケットにアクセスできます(プレフィックス deeplens-).

  1. 選択する ノートブックインスタンスを作成。 ノートブックインスタンスの起動には数分かかる場合があります。
  1. ノートブックインスタンスページのステータスがInServiceに変わったら、 Jupyterを開く 新しく作成したJupyterノートブックインスタンスを起動します。
  2. 選択する アップロード アップロードする Train_Object_Detection_people_DeepLens.ipynb 以前にダウンロードしたファイル。

  1. ノートブックを開き、最後まで実行します。
  2. カーネルの設定について尋ねられた場合は、 conda_mxnet_p36.

Jupyterノートブックには、テキストセルとコードセルが混在しています。 コードを実行するには、セルを選択してを押します Shiftキー+ Enterキー。 セルの実行中は、セルの横にアスタリスクが表示されます。 セルが完成すると、元のセルの下に出力番号と新しい出力セルが表示されます。

  1. パブリックS3バケットからローカルSageMakerインスタンスにデータセットをダウンロードし、データを解凍します。 これは、ノートブックのコードに従うことで実行できます。
     !aws s3 cp s3://deeplens-public/samples/pedestriansafety/humandetection_data.zip . !rm -rf humandetection/ !unzip humandetection_data.zip -d humandetection 

  2. データセットをフォーマットに変換します(記録IO)SageMakerアルゴリズムにフィードできます:
     !python $mxnet_path/tools/im2rec.py --pass-through --pack-label $DATA_PATH/train_mask.lst $DATA_PATH/ !python $mxnet_path/tools/im2rec.py --pass-through --pack-label $DATA_PATH/val_mask.lst $DATA_PATH/ 

  3. RecordIOファイルをAmazonS3に転送し直します。

すべてのデータ準備が完了したので、オブジェクト検出器をトレーニングする準備が整いました。

オブジェクト検出アルゴリズムにはさまざまな種類があります。 この投稿では、 シングルショットマルチボックス検出アルゴリズム(SSD)。 SSDアルゴリズムは、速度と精度のバランスが取れているため、AWSDeepLensなどのエッジデバイスでの実行に最適です。

トレーニングジョブの一部として、トレーニング動作の構成に役立つハイパーパラメータのオプションが多数あります(エポック数、学習率、オプティマイザタイプ、ミニバッチサイズなど)。 ハイパーパラメータを使用すると、モデルのトレーニング速度と精度を調整できます。 ハイパーパラメータの詳細については、を参照してください。 物体検出アルゴリズム.

  1. ハイパーパラメータとデータチャネルを設定します。 次のハイパーパラメータの定義例の使用を検討してください。
     od_model = sagemaker.estimator.Estimator(training_image, role, train_instance_count=1, train_instance_type='ml.p2.xlarge', train_volume_size = 50, train_max_run = 360000, input_mode= 'File', output_path=s3_output_location, sagemaker_session=sess) od_model.set_hyperparameters(base_network='resnet-50', use_pretrained_model=1, num_classes=2, mini_batch_size=32, epochs=100, learning_rate=0.003, lr_scheduler_step='3,6', lr_scheduler_factor=0.1, optimizer='sgd', momentum=0.9, weight_decay=0.0005, overlap_threshold=0.5, nms_threshold=0.45, image_shape=300, num_training_samples=n_train_samples) 

ノートブックには、事前に選択されたデフォルトのハイパーパラメータがいくつかあります。 歩行者検出では、モデルを100エポックトレーニングします。 このトレーニングステップは、2つのml.p2.xlargeインスタンスを使用して約XNUMX時間かかります。 ハイパーパラメータのさまざまな組み合わせを試してみるか、パフォーマンスを向上させるためにさらにエポックをトレーニングすることができます。 最新の価格については、を参照してください。 Amazon SageMakerの価格.

  1. XNUMX行のコードでトレーニングジョブを開始し、SageMakerコンソールで時間の経過とともに精度を監視できます。
    od_model.fit(inputs=data_channels, logs=True) 

トレーニングの仕組みの詳細については、を参照してください。 トレーニングジョブの作成。 データのサイズによっては、プロビジョニングとデータのダウンロードに時間がかかります。 したがって、トレーニングジョブのデータログの取得を開始するまでに数分かかる場合があります。

メトリック平均平均精度(mAP)を使用してトレーニングジョブの進行状況を監視できます。これにより、オブジェクトを分類し、正しい境界ボックスを検出するモデルの機能の品質を監視できます。 データログは、データセットの実行ごとに、XNUMXつのエポックに対してXNUMX回、他の損失の中でも特に検証データのmAPを出力します。 このメトリックは、クラスとその周囲の正確なバウンディングボックスを正確に検出する際のアルゴリズムのパフォーマンスの品質のプロキシです。

ジョブが終了すると、トレーニング済みのモデルファイルは、前に指定したS3バケットとフォルダーにあります。 s3_output_location:

s3_output_location = 's3://{}/{}/output'.format(BUCKET, PREFIX)

この投稿では、10番目のエポックと100番目のエポックの完了時に設定された検証の結果を示します。 10番目のエポックの終わりには、検証mAPが約0.027であるのに対し、100番目のエポックは約0.42でした。

より良い検出結果を達成するために、SageMakerに組み込まれている機能を使用してハイパーパラメータを調整することができます。 自動モデルチューニング より多くのエポックのためにモデルをトレーニングします。 通常、精度の向上が見られなくなったら、トレーニングを停止します。

カスタム制限ゾーンを使用したテストモデル

トレーニング済みモデルをAWSDeepLensにデプロイする前に、SageMakerでホストされているエンドポイントを使用してクラウドでテストできます。 SageMakerエンドポイントは、RESTAPIを介してリアルタイムの推論を行うことができるフルマネージドサービスです。 SageMakerを使用すると、新しいエンドポイントをすばやくデプロイしてモデルをテストできるため、モデルのトレーニングに使用されたローカルインスタンスでモデルをホストする必要がありません。 これにより、トレーニング中にアルゴリズムが認識しなかった画像のモデルから予測(または推論)を行うことができます。

トレーニングに使用したのと同じインスタンスタイプでホストする必要はありません。 トレーニングは、ホスティングが通常必要としない、異なる一連のコンピューティング要件とメモリ要件を必要とする、長時間のコンピューティング負荷の高いジョブです。 モデルをホストする任意のタイプのインスタンスを選択できます。 この場合、トレーニングするml.p3.2xlargeインスタンスを選択しましたが、より安価なCPUインスタンスml.m4.xlargeでモデルをホストすることを選択しました。 次のコードスニペットは、エンドポイントの展開を示しています。

object_detector = od_model.deploy(initial_instance_count = 1, instance_type = 'ml.m4.xlarge') 

カスタム制限ゾーン(関心領域)での検出

出力の形式は、[class_index、confidence_score、xmin、ymin、xmax、ymax]として表すことができます。 信頼度の低い予測は、誤検知または誤検知の可能性が高いことが多いため、信頼度の低い予測は破棄する必要があります。 次のコードを使用して、人物のバウンディングボックスが制限ゾーンと重なっているかどうかを検出できます。

def inRestrictedSection(ImShape = None, R1 = None, restricted_region = None, kclass = None, score = None, threshold = None): statement = 'Person Not Detected in Restricted Zone' if (kclass == 1) and (score > threshold): Im1 = np.zeros((ImShape[0],ImShape[1],3), np.int32) cv2.fillPoly(Im1, [R1], 255) Im2 = np.zeros((ImShape[0],ImShape[1],3), np.int32) if restricted_region is None: restricted_region = np.array([[0,ImShape[0]],[ImShape[1],ImShape[0]],[ImShape[1],0], [0,0]], np.int32) cv2.fillPoly(Im2, [restricted_region], 255) Im = Im1 * Im2 if np.sum(np.greater(Im, 0))>0: statement = 'Person Detected in Restricted Zone' else: statement = statement return statement 

デフォルトでは、フレーム全体が人間の存在について評価されます。 ただし、人の存在がリスクが高いと見なされる関心領域を簡単に指定できます。 カスタム制限ゾーンを追加する場合は、[X軸、Y軸]で表される領域の頂点の座標を追加してポリゴンを作成します。 座標は時計回りまたは反時計回りに入力する必要があります。 次のコードを参照してください。

restricted_region = None #restricted_region = np.array([[0,200],[100,200],[100,0], [10,10]], np.int32) 

次のサンプルコードは、制限区域内で識別される歩行者を示しています。

file_name = 'humandetection/test_images/t1_image.jpg' img = cv2.imread(file_name) img =cv2.cvtColor(img,cv2.COLOR_BGR2RGB) thresh = 0.2 height = img.shape[0] width = img.shape[1] colors = dict() with open(file_name, 'rb') as image: f = image.read() b = bytearray(f) ne = open('n.txt','wb') ne.write(b) results = object_detector.predict(b, initial_args={'ContentType': 'image/jpeg'}) detections = json.loads(results) object_categories = ['no-person', 'person'] for det in detections['prediction']: (klass, score, x0, y0, x1, y1) = det if score < thresh: continue cls_id = int(klass) prob = score if cls_id not in colors: colors[cls_id] = (random.random(), random.random(), random.random()) xmin = int(x0 * width) ymin = int(y0 * height) xmax = int(x1 * width) ymax = int(y1 * height) R1 = np.array([[xmin,ymin],[xmax,ymin],[xmax,ymax], [xmin,ymax]], np.int32) cv2.polylines(img,[R1],True, (255,255,0), thickness = 5) cv2.polylines(img,[restricted_region],True, (255,0,0), thickness = 5) plt.imshow(img) print(inRestrictedSection(img.shape,R1 = R1, restricted_region= restricted_region, kclass = cls_id, score = prob, threshold=0.2)) 

次の画像は、結果を示しています。

ソリューションをAWSDeepLensにデプロイします

デプロイするモデルをAWSDeepLensに変換します

SageMakerでトレーニングされたSSDモデルをAWSDeepLensにデプロイするときは、最初に実行する必要があります デプロイ.py モデルアーティファクトをデプロイ可能なモデルに変換するには:

!rm -rf incubator-mxnet !git clone -b v1.7.x https://github.com/apache/incubator-mxnet MODEL_PATH = od_model.model_data TARGET_PATH ='s3://'+BUCKET+'/'+PREFIX+'/patched/' !rm -rf tmp && mkdir tmp rm -rf tmp && mkdir tmp !aws s3 cp $MODEL_PATH tmp !tar -xzvf tmp/model.tar.gz -C tmp !mv tmp/model_algo_1-0000.params tmp/ssd_resnet50_300-0000.params !mv tmp/model_algo_1-symbol.json tmp/ssd_resnet50_300-symbol.json !python incubator-mxnet/example/ssd/deploy.py --network resnet50 --data-shape 300 --num-class 2 --prefix tmp/ssd_ !tar -cvzf ./patched_model.tar.gz -C tmp ./deploy_ssd_resnet50_300-0000.params ./deploy_ssd_resnet50_300-symbol.json ./hyperparams.json !aws s3 cp patched_model.tar.gz $TARGET_PATH

モデルをAWS DeepLensにインポートする

AWS DeepLensデバイスでモデルを実行するには、AWSDeepLensプロジェクトを作成する必要があります。 モデルをAWSDeepLensにインポートすることから始めます。

  1. AWS DeepLensコンソールの、 リソース、選択する Models.
  2. 選択する モデルをインポート.

  1. ソースのインポート選択 外部でトレーニングされたモデル.
  2. のAmazonS3の場所を入力します パッチを当てたモデル 上記の手順でdeploy.pyを実行して保存したもの。
  3. モデルフレームワーク、選択する MXNet.
  4. 選択する モデルをインポート.

推論関数を作成する

推論関数は、各カメラフレームをモデルにフィードして予測を取得し、推論結果の使用に関するカスタムビジネスロジックを実行します。 あなたが使う AWSラムダ AWSDeepLensにデプロイする関数を作成します。 この関数は、AWSDeepLensデバイスでローカルに推論を実行します。

まず、AWSDeepLensにデプロイするLambda関数を作成する必要があります。

  1. ダウンロード 推論ラムダ関数.
  2. Lambdaコンソールで、 機能.
  3. 選択する 関数を作成する.
  4. 選択 最初から作成者.
  5. 関数名、名前を入力します。
  6. ランタイム、選択する Pythonの3.7.
  7. 実行ロールを選択または作成します、選択する 既存の役割を使用する.
  8. 選択する service-role / AWSDeepLensLambdaRole.
  9. 選択する 関数を作成する.

  1. 関数の詳細ページで、 メニュー、選択 .zipファイルをアップロードする.

  1. アップロード 推論ラムダ 以前にダウンロードしたファイル。
  2. 選択する Save 入力したコードを保存します。
  3. ソフトウェア設定ページで、下図のように メニュー、選択 新しいバージョンを公開.

関数を公開すると、AWS DeepLensコンソールで使用できるようになり、カスタムプロジェクトに追加できるようになります。

  1. バージョン番号を入力して選択します パブリッシュ.

推論機能を理解する

このセクションでは、推論関数のいくつかの重要な部分について説明します。 まず、XNUMXつの特定のファイルに注意を払う必要があります。

  • ラベル.txt –ニューラルネットワーク(整数)から人間が読めるラベル(文字列)への出力のマッピングが含まれています
  • ラムダ関数.py –すべてのカメラフレームで予測を生成し、結果を送り返すために呼び出される関数のコードが含まれています

lambda_function.pyでは、最初にモデルをロードして最適化します。 GPUを備えたクラウド仮想マシンと比較して、AWSDeepLensのコンピューティング能力は低くなっています。 AWS DeepLensは、Intel OpenVinoモデルオプティマイザーを使用して、SageMakerでトレーニングされたモデルをハードウェアで実行するように最適化します。 次のコードは、モデルを最適化してローカルで実行します。

client.publish(topic=iot_topic, payload='Optimizing model...') ret, model_path = mo.optimize('deploy_ssd_resnet50_300', INPUT_W, INPUT_H) # Load the model onto the GPU. client.publish(topic=iot_topic, payload='Loading model...') model = awscam.Model(model_path, {'GPU': 1}) 

次に、カメラからの画像に対してフレームごとにモデルを実行します。 次のコードを参照してください。

while True: # Get a frame from the video stream ret, frame = awscam.getLastFrame() if not ret: raise Exception('Failed to get frame from the stream') # Resize frame to the same size as the training set. frame_resize = cv2.resize(frame, (INPUT_H, INPUT_W)) # Run the images through the inference engine and parse the results using # the parser API, note it is possible to get the output of doInference # and do the parsing manually, but since it is a ssd model, # a simple API is provided. parsed_inference_results = model.parseResult(model_type, model.doInference(frame_resize)) 

最後に、テキスト予測の結果をクラウドに送り返します。 クラウドでテキストの結果を表示することは、モデルが正しく機能していることを確認するための便利な方法です。 各AWSDeepLensデバイスには、推論結果を受信するために自動的に作成された専用のiot_topicがあります。 次のコードを参照してください。

# Send results to the cloud client.publish(topic=iot_topic, payload=json.dumps(cloud_output)) 

カスタムAWS DeepLensプロジェクトを作成する

新しいAWSDeepLensプロジェクトを作成するには、次の手順を実行します。

  1. AWS DeepLensコンソールでは、 プロジェクト ページ、選択 プロジェクトを作成する.
  2. プロジェクトの種類選択 新しい空のプロジェクトを作成する.
  3. 選択する Next.

  1. あなたのプロジェクトに名前をつける yourname-pedestrian-detector-.
  2. 選択する モデルを追加.
  3. 作成したモデルを選択します。
  4. 選択する 機能を追加.
  5. 以前に作成したLambda関数を名前で検索します。
  6. 選択する プロジェクトを作成する.
  7. ソフトウェア設定ページで、下図のように プロジェクト ページで、デプロイするプロジェクトを選択します。
  8. 選んだ デバイスに展開.
  9. 対象デバイス、デバイスを選択します。
  10. 選択する レビュー.
  11. 設定を確認して、 配備します.

AWS DeepLensが接続されているネットワークの速度によっては、デプロイが完了するまでに最大10分かかる場合があります。 デプロイが完了すると、ページに「おめでとうございます。モデルはAWS DeepLensでローカルに実行されています!」というメッセージが表示された緑色のバナーが表示されます。

テキスト出力を表示するには、デバイスの詳細ページを下にスクロールして、 プロジェクト出力 セクション。 セクションの指示に従ってトピックをコピーし、 AWS IoTコア トピックをサブスクライブするためのコンソール。 次のスクリーンショットのような結果が表示されます。

ビデオストリームまたはテキスト出力を表示するための詳細な手順については、を参照してください。 AWSDeepLensからの結果の表示.

実際の使用例

AWS DeepLensで実行されているモデルからの予測ができたので、それらの予測をアラートとインサイトに変換しましょう。 このようなプロジェクトの最も一般的な用途には、次のものがあります。

  • 建設現場がより多くの安全標識を必要とする場所を特定できるように、特定の日に何人の人が制限区域に入ったかを理解する。 これは、結果を収集し、それらを使用してダッシュボードを作成することで実行できます。 アマゾンクイックサイト。 QuickSightを使用してダッシュボードを作成する方法の詳細については、を参照してください。 AWS DeepLensとGluonCVを使用して在宅勤務の姿勢トラッカーを構築する.
  • AWS DeepLensからの出力を収集し、誰かが制限されたゾーンに足を踏み入れたときにアラートを鳴らすようにRaspberryPiを設定します。 AWSDeepLensデバイスをRaspberryPiデバイスに接続する方法の詳細については、を参照してください。 AWS DeepLensを使用してごみ選別機を構築する.

まとめ

この投稿では、オブジェクト検出モデルをトレーニングしてAWS DeepLensにデプロイし、制限されたゾーンに入る人を検出する方法を学びました。 このチュートリアルをリファレンスとして使用して、AWSDeepLensで独自のカスタムオブジェクト検出プロジェクトをトレーニングおよびデプロイできます。

このチュートリアルおよびAWS DeepLensを使用したその他のチュートリアル、サンプル、プロジェクトのアイデアの詳細なウォークスルーについては、 AWS DeepLensレシピ.


著者について

ヤシュシャー はAmazonML Solutions Labのデータサイエンティストであり、ヘルスケアから製造、小売まで、さまざまな機械学習のユースケースに取り組んでいます。 彼はヒューマンファクターと統計の正式なバックグラウンドを持っており、以前はAmazon SCOTチームの一員であり、効率的な在庫管理で3Pセラーをガイドする製品を設計していました。

プー・グエン AWSPanoramaのプロダクトマネージャーです。 彼は、あらゆるスキルレベルの開発者に機械学習の簡単で実践的な紹介を提供する製品を構築しています。

ソース:https://aws.amazon.com/blogs/machine-learning/protecting-people-through-virtual-boundaries-computer-vision/

タイムスタンプ:

より多くの AWS機械学習ブログ