Amazon Web Services ブログ

Amazon SageMaker で Detectron2 を使って物体検出する

この記事は、こちらの AWS blog を翻訳したものです。

深層学習は、さまざまな分野で機械学習(ML)を実装する際の最重要課題となっています。ニューラルネットワークの柔軟性の高さを背景に、コンピュータビジョン(CV)の物体検出タスクなどではニューラルネットワークが人間よりも優れた性能を発揮することが可能になってきました。

CVタスクの1つである物体検出は、医療、小売、農業など様々な分野で応用されています。たとえば小売業では、店舗の棚の画像からSKU(Stock Keeping Unit)を検出して、購買者の傾向を分析したり、商品の再入荷時期を特定したりしたいと考えています。物体検出モデルは、このような多様なユースケースを実現し、店舗内のオペレーションを自動化することができます。

この記事では、Facebook AI Research(FAIR)が公開した物体検出・セグメンテーションフレームワークであるDetectron2と、Amazon SageMaker への実装について説明し、小売業向けの高密度な物体検出タスクを解決します。また、関連するサンプルノートブックもご紹介しますので、そちらを実行することでこの記事でご紹介するすべての機能を試すことができます。詳細については、GitHubリポジトリ をご覧ください。

このソリューションで使用するツールセット

このソリューションを実現するために、Detectron2、PyTorch、SageMaker、そして公開されている SKU-110K データセットを使用します。

Detectron2

Detectron2は、maskrcnn-benchmark から始まった Detectron を全面的に書き直したものです。このプラットフォームは現在 PyTorch で実装されています。新しいモジュラーデザインにより、Detectron2は柔軟性と拡張性に富み、単一または複数のGPUサーバでの高速な学習を実現しています。Detectron2には、DensePosepanoptic feature pyramid networks、そして FAIR が開発した先駆的な Mask R-CNN モデルファミリーのバリエーション多数を含む、最先端の物体検出アルゴリズムの高品質な実装が含まれています。拡張しやすく設計されており、コード全体をフォークすることなく、最先端の研究プロジェクトを簡単に実装することができます。

PyTorch

PyTorch は、オープンソースの深層学習フレームワークであり、MLモデルの開発と実運用への展開を容易にします。PyTorch の TorchScript を使うことで、開発者は、簡単な開発のためにすぐに計算を実行する eager modeと、本番環境での効率的な実装のために計算グラフを作成する graph mode をシームレスに切り替えることができます。また、PyTorch は、分散学習、Python への深い統合、ツールやライブラリの豊富なエコシステムを提供しており、研究者やエンジニアに人気があります。

優れたツールエコシステムの例としては TorchServe がありますが、PyTorch のために最近リリースされたモデル・サービング・フレームワークで、カスタムコードを書くことなく、学習したモデルを大規模に展開することができます。TorchServe は、AWS がFacebook と共同で構築・保守しており、PyTorch オープンソースプロジェクトの一部として提供されています。詳細は、TorchServeの GitHub repo Model Server for PyTorch Documentation をご覧ください。

Amazon SageMaker

SageMaker は、すべての開発者とデータサイエンティストに向けた、MLモデルの構築、学習、およびデプロイメントを迅速に行う機能を提供するフルマネージドサービスです。SageMaker は、ML プロセスの各ステップから重たい作業を取り除き、高品質なモデルの開発を容易にします。

データセット

今回のユースケースでは、Goldman らの論文「Precise Detection in Densely Packed Scenes」(Proceedings of 2019 conference on Computer Vision and Patter Recognition)で紹介されている SKU-110データセット を使用します。このデータセットには、世界中の店舗の棚の画像 11,762枚が含まれています。研究者たちはこのデータセットを使って、密集度の高いシーンでの物体検出アルゴリズムをテストしています。ここでいう密集度とは、画像1枚あたりのオブジェクトの数のことです。1画像あたりの平均アイテム数は147.4個で、COCOデータセットの19倍にもなります。さらに、画像には複数の同じオブジェクトがグループ化されており、分離するのは困難です。このデータセットには、SKU のバウンディングボックスのアノテーションが含まれています。バウンディングボックスのラベルはアイテムの有無を示すだけなので、商品のカテゴリーは区別されていません。

Detectron2 の紹介

Detectron2 は、最先端の物体検出アルゴリズムを実装した FAIR の次世代ソフトウェアシステムです。これは前バージョンのDetectron を全面的に書き直したもので、 maskrcnn-benchmarkに由来しています。以下のスクリーンショットは Detectron2リポジトリのハイレベルな構造の一例であり、この記事の後半で設定ファイルやネットワークアーキテクチャを調べる際に役立つでしょう。

コンピュータビジョンと深層学習アーキテクチャの一般的なレイアウトについては、「A Survey of the Recent Architectures of Deep Convolutional Neural Networks」をご参照ください。

また、Detectron2を初めてご利用になる方は、Detectron2の豊富な機能について 公式ドキュメント をご参照ください。この記事の残りの部分では、コンピュータビジョン特有の基礎的な理論については触れずに、Detectron2による物体検出をSageMakerに導入する際の実装の詳細にのみ焦点を当てています。

SageMakerのロールの更新

カスタムの学習用とサービング用コンテナを構築するには、SageMakerのAWS Identity and Access Management (IAM)ロールに追加のAmazon Elastic Container Registry (Amazon ECR)パーミッションをアタッチする必要があります。AWSが用意したポリシー(AmazonEC2ContainerRegistryPowerUserなど)を使用するか、独自のカスタムポリシーを作成することができます。詳細については、「Amazon SageMakerとIAMの連携方法」をご参照ください。

データセットの更新

Detectron2 には、データの読み込みと視覚化のためのユーティリティーが用意されています。しかし、Detectron2 のデータユーティリティを使用するためには、カスタムデータセットを登録する必要があります。これは GitHub repo にある catalog.py ファイルの中の関数register_datasetを使うことで可能です。この関数は学習セット、検証セット、テストセットをイテレーションします。各イテレーションはaws_file_modeをコールします。この関数は、画像を含むフォルダへのパスと、アノテーションを含む拡張マニフェストファイルへのパスを指定して、アノテーションのリストを返します。拡張マニフェストファイルは、Amazon SageMaker Ground Truth Bounding Box ジョブの出力形式です。この記事でご紹介したコードは、Ground Truth を使って独自に物体検出のラベリングを行った結果にもご利用いただけます。

SKU-110K データセットを準備して、学習、検証、テスト画像を専用フォルダに入れ、アノテーションを拡張マニフェストファイル形式にします。まず、必要なパッケージをインポートし、S3バケットを定義して、SageMaker のセッションを設定します。

from pathlib import Path
from urllib import request
import tarfile
from typing import Sequence, Mapping, Optional
from tqdm import tqdm
from datetime import datetime
import tempfile
import json

import pandas as pd
import numpy as np
import boto3
import sagemaker

bucket = "my-bucket" # TODO: replace with your bucker
prefix_data = "detectron2/data"
prefix_model = "detectron2/training_artefacts"
prefix_code = "detectron2/model"
prefix_predictions = "detectron2/predictions"
local_folder = "cache"

sm_session = sagemaker.Session(default_bucket=bucket)
role = sagemaker.get_execution_role()

続いて、データセットをダウンロードします。

sku_dataset = ("SKU110K_fixed", "http://trax-geometry.s3.amazonaws.com/cvpr_challenge/SKU110K_fixed.tar.gz")

if not (Path(local_folder) / sku_dataset[0]).exists():
    compressed_file = tarfile.open(fileobj=request.urlopen(sku_dataset[1]), mode="r|gz")
    compressed_file.extractall(path=local_folder)
else:
    print(f"Using the data in `{local_folder}` folder")
path_images = Path(local_folder) / sku_dataset[0] / "images"
assert path_images.exists(), f"{path_images} not found"

prefix_to_channel = {
    "train": "training",
    "val": "validation",
    "test": "test",
}
for channel_name in prefix_to_channel.values():
    if not (path_images.parent / channel_name).exists():
        (path_images.parent / channel_name).mkdir()

for path_img in path_images.iterdir():
    for prefix in prefix_to_channel:
        if path_img.name.startswith(prefix):
            path_img.replace(path_images.parent / prefix_to_channel[prefix] / path_img.name)

次に、SageMaker Python SDK のユーティリティを使って、画像ファイルを Amazon Simple Storage Service (Amazon S3) にアップロードします。

channel_to_s3_imgs = {}

for channel_name in prefix_to_channel.values():
    inputs = sm_session.upload_data(
        path=str(path_images.parent / channel_name),
        bucket=bucket,
        key_prefix=f"{prefix_data}/{channel_name}"
    )
    print(f"{channel_name} images uploaded to {inputs}")
    channel_to_s3_imgs[channel_name] = inputs

SKU-110k のアノテーションは CSV ファイルとして保存されています。以下の関数でアノテーションデータを JSON に変換します。詳細は GitHub repo のコードをご参照ください。

def create_annotation_channel(
    channel_id: str, path_to_annotation: Path, bucket_name: str, data_prefix: str,
    img_annotation_to_ignore: Optional[Sequence[str]] = None
) -> Sequence[Mapping]:
    r"""Change format from original to augmented manifest files

    Parameters
    ----------
    channel_id : str
        name of the channel, i.e. training, validation or test
    path_to_annotation : Path
        path to annotation file
    bucket_name : str
        bucket where the data are uploaded
    data_prefix : str
        bucket prefix
    img_annotation_to_ignore : Optional[Sequence[str]]
        annotation from these images are ignore because the corresponding images are corrupted, default to None

    Returns
    -------
    Sequence[Mapping]
        List of json lines, each lines contains the annotations for a single. This recreates the
        format of augmented manifest files that are generated by Amazon SageMaker GroundTruth
        labeling jobs
    """
    …

channel_to_annotation_path = {
    "training": Path(local_folder) / sku_dataset[0] / "annotations" / "annotations_train.csv",
    "validation": Path(local_folder) / sku_dataset[0] / "annotations" / "annotations_val.csv",
    "test": Path(local_folder) / sku_dataset[0] / "annotations" / "annotations_test.csv",
}
channel_to_annotation = {}

for channel in channel_to_annotation_path:
    annotations = create_annotation_channel(
        channel,
        channel_to_annotation_path[channel],
        bucket,
        prefix_data,
        CORRUPTED_IMAGES[channel]
    )
    print(f"Number of {channel} annotations: {len(annotations)}")
    channel_to_annotation[channel] = annotations

最後に、マニフェストファイルを Amazon S3 にアップロードします。

def upload_annotations(p_annotations, p_channel: str):
    rsc_bucket = boto3.resource("s3").Bucket(bucket)
    
    json_lines = [json.dumps(elem) for elem in p_annotations]
    to_write = "\n".join(json_lines)

    with tempfile.NamedTemporaryFile(mode="w") as fid:
        fid.write(to_write)
        rsc_bucket.upload_file(fid.name, f"{prefix_data}/annotations/{p_channel}.manifest")

for channel_id, annotations in channel_to_annotation.items():
    upload_annotations(annotations, channel_id)

データセットの可視化

Detectron2 はデータセットを検査するためのツールセットを提供します。データセットの入力画像とその ground truth bounding box を可視化することができます。まず、Detectron2 のカタログにデータセットを追加します。

import random
from typing import Sequence, Mapping
import cv2
from matplotlib import pyplot as plt
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.utils.visualizer import Visualizer
# custom code
from datasets.catalog import register_dataset, DataSetMeta

ds_name = "sku110k"
metadata = DataSetMeta(name=ds_name, classes=["SKU",])
channel_to_ds = {"test": ("data/test/", "data/test.manifest")}
register_dataset(
    metadata=metadata, label_name="sku", channel_to_dataset=channel_to_ds,
)

以下のコードで、アノテーション情報を画像に重畳表示します。

dataset_samples: Sequence[Mapping] = DatasetCatalog.get(f"{ds_name}_test")
sample = random.choice(dataset_samples)
fname = sample["file_name"]
print(fname)
img = cv2.imread(fname)
visualizer = Visualizer(
    img[:, :, ::-1], metadata=MetadataCatalog.get(f"{ds_name}_test"), scale=1.0
)
out = visualizer.draw_dataset_dict(sample)

plt.imshow(out.get_image())
plt.axis("off")
plt.tight_layout()
plt.show()

以下の画像は、テスト画像の ground truth bounding box の一例です。

Detectron2 の分散学習

SageMaker で Docker コンテナを使用して Detectron2 モデルを学習することができます。この記事では、SageMaker 学習用クラスタ上の複数のノードと GPU デバイスで、より多くのイテレーションを行う Detectron2 の分散学習ジョブを実行する方法を説明します。

プロセスには以下のステップがあります。

  1. 分散環境で学習タスクを実行・チューニングすることができる学習スクリプトを作成
  2. 学習用のランタイムとスクリプトを設定したカスタム Docker コンテナを作成
  3. 学習用コンテナをビルドし、Amazon ECR にプッシュ
  4. SageMaker Python SDK で学習ジョブを初期化

分散クラスタ用の学習スクリプトの準備

sku-100kフォルダ には、Detectron2 のカスタムモデルを学習するためのソースコードが入っています。スクリプト training.py は学習プロセスのエントリーポイントです。スクリプトの以下のセクションの詳細は以下のとおりです。

  • __main__ guard – SageMaker Python SDK は、学習が開始すると main guard 内のコードを実行します。train 関数はスクリプトの引数で呼び出されます。
  • _parse_args() – この関数は、コマンドラインや SageMaker の環境からの引数を解析します。例えば、Faster-RCNN と RetinaNet のうち、どのモデルを学習するかを選択することができます。SageMaker の環境変数では、入力チャンネルの位置やモデルのアーティファクトの保存先が定義されています。GPU の数とホストの数は、学習クラスタの特性を定義します。
  • train() – Detectron2 の起動ユーティリティを使用して、複数のノードで学習を開始します。
  • _train_impl() -これは実際の学習スクリプトで、すべてのプロセスと GPU デバイス上で実行されます。この関数は以下のステップを実行します。
    • Detectron2 のカタログにカスタムデータセットを登録
    • 学習用の設定ノードを作成
    • 学習データセットを、選択した物体検出アーキテクチャに合わせて変換
    • 学習の成果物を保存し、現在のノードがプライマリの場合はテストセットで評価を実行

学習用コンテナの準備

Detectron2 の学習用ランタイム環境に合わせて、カスタムコンテナをビルドします。ベースイメージとしては、最新の SageMaker PyTorch コンテナを使用し、さらに Detectron2 の要件に合わせて拡張します。まず、パブリックな Amazon ECR(ベースの PyTorch イメージをプルするため)とアカウントレジストリ(カスタムコンテナをプッシュするため)にアクセスできることを確認する必要があります。以下のサンプルコードでは、カスタムコンテナをビルドしてプッシュする前に、両方のレジストリにログインする方法を示しています。

# loging to Sagemaker ECR with Deep Learning Containers
!aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin 763104351884.dkr.ecr.us-east-2.amazonaws.com
# loging to your private ECR
!aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin <YOUR-ACCOUNT-ID>.dkr.ecr.us-east-2.amazonaws.com

Amazon ECR での認証に成功したら、学習用のDockerイメージをビルドできます。Dockerfile では以下の処理が実行されます。

  1. ベースコンテナを定義
  2. Detectron2 に必要な依存関係をインストール
  3. 学習スクリプトとユーティリティをコンテナにコピー
  4. ソースから Detectron2 をビルド

カスタム学習コンテナのビルドとプッシュ

ローカルの学習コンテナをビルドし、アカウントレジストリにプッシュするためのシンプルな bash スクリプトを提供します。必要に応じて、異なるイメージ名、タグ、Dockerfile を指定することができます。以下のコードは、Dockerfile の短いスニペットです。

# Build an image of Detectron2 that can do distributing training on Amazon Sagemaker  using Sagemaker PyTorch container as base image
# from https://github.com/aws/sagemaker-pytorch-container
ARG REGION=us-east-1

FROM 763104351884.dkr.ecr.${REGION}.amazonaws.com/pytorch-training:1.6.0-gpu-py36-cu101-ubuntu16.04


############# Detectron2 pre-built binaries Pytorch default install ############
RUN pip install --upgrade torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html

############# Detectron2 section ##############
RUN pip install \ 
   --no-cache-dir pycocotools~=2.0.0 \
   --no-cache-dir detectron2 -f  https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.6/index.html

ENV FORCE_CUDA="1"
# Build D2 only for Volta architecture - V100 chips (ml.p3 AWS instances)
ENV TORCH_CUDA_ARCH_LIST="Volta" 

# Set a fixed model cache directory. Detectron2 requirement
ENV FVCORE_CACHE="/tmp"

############# SageMaker section ##############

COPY container_training/sku-110k /opt/ml/code
WORKDIR /opt/ml/code

ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code
ENV SAGEMAKER_PROGRAM training.py

WORKDIR /

# Starts PyTorch distributed framework
ENTRYPOINT ["bash", "-m", "start_with_right_hostname.sh"]

学習ジョブのスケジュール

これで、分散学習ジョブのスケジューリングの準備が整いました。まず、一般的なインポートと設定を行う必要がありますが、詳細はサンプルノートブックをご参照ください。次に、学習中に追跡したいメトリクスを指定することが重要です。このためには、各メトリクスに適した正規表現を含む JSON ファイルを作成します。次のコード例をご覧ください。

metrics = [
    {"Name": "training:loss", "Regex": "total_loss: ([0-9\\.]+)",},
    {"Name": "training:loss_cls", "Regex": "loss_cls: ([0-9\\.]+)",},
    {"Name": "training:loss_box_reg", "Regex": "loss_box_reg: ([0-9\\.]+)",},
    {"Name": "training:loss_rpn_cls", "Regex": "loss_rpn_cls: ([0-9\\.]+)",},
    {"Name": "training:loss_rpn_loc", "Regex": "loss_rpn_loc: ([0-9\\.]+)",},
    {"Name": "validation:loss", "Regex": "total_val_loss: ([0-9\\.]+)",},
    {"Name": "validation:loss_cls", "Regex": "val_loss_cls: ([0-9\\.]+)",},
    {"Name": "validation:loss_box_reg", "Regex": "val_loss_box_reg: ([0-9\\.]+)",},
    {"Name": "validation:loss_rpn_cls", "Regex": "val_loss_rpn_cls: ([0-9\\.]+)",},
    {"Name": "validation:loss_rpn_loc", "Regex": "val_loss_rpn_loc: ([0-9\\.]+)",},
]

最後に、fit 関数を実行して分散学習ジョブを開始するために estimator を作成します。

training_instance = "ml.p3.8xlarge"
od_algorithm = "faster_rcnn" # choose one in ("faster_rcnn", "retinanet")

d2_estimator = Estimator(
    image_uri=training_image_uri,
    role=role,
    sagemaker_session=training_session,
    instance_count=1,
    instance_type=training_instance,
    hyperparameters=training_job_hp,
    metric_definitions=metrics,
    output_path=f"s3://{bucket}/{prefix_model}",
    base_job_name=f"detectron2-{od_algorithm.replace('_', '-')}",
)

d2_estimator.fit(
    {
        "training": training_channel,
        "validation": validation_channel,
        "test": test_channel,
        "annotation": annotation_channel,
    },
    wait=training_instance == "local",
)

学習ジョブのパフォーマンスのベンチマーク

この一連の手順により、コードを1行も変更することなく、必要に応じて学習のパフォーマンスをスケールすることができます。学習インスタンスとクラスターのサイズを選ぶだけです。Detectron2 は起動ユーティリティを使用して学習クラスタのサイズに自動的に適応します。次の表は、3,000回の反復処理を行うジョブの学習実行時間を秒単位で比較したものです。

Faster-RCNN (seconds) RetinaNet (seconds)
ml.p3.2xlarge – 1 node 2,685 2,636
ml.p3.8xlarge – 1 node 774 742
ml.p3.16xlarge – 1 node 439 400
ml.p3.16xlarge – 2 nodes 338 311

Faster-RCN と RetinaNet の両方で、GPU の総数に応じて学習時間が短縮されました。GPU が 1つのインスタンスから、GPU が 4つと 8つのインスタンスに変えたときの分散効率は、それぞれ約85%と75%です。

学習したモデルを推論エンドポイントにデプロイ

学習したモデルをリモートでデプロイするには、カスタムサービングコンテナの準備、ビルド、プッシュを行い、このカスタムコンテナを SageMaker SDK でデプロイしてサービングを行う必要があります。

カスタムサービングコンテナのビルドとプッシュ

ベースイメージとして SageMaker 推論コンテナを使用します。このイメージには、PyTorch モデルをホストするための PyTorch モデルサーバがあらかじめインストールされているので、追加の設定やインストールは必要ありません。コンテナをプッシュしたりビルドしたりするための Docker ファイルやシェルスクリプトの詳細については、GitHub リポジトリをご参照ください。

この記事では、VoltaTuringのチップアーキテクチャ用に Detectron2 をビルドします。Voltaアーキテクチャは、P3インスタンスタイプで SageMaker のバッチ変換を実行するために使用されます。リアルタイム予測が必要な場合は、価格と性能の最適なバランスを提供するG4インスタンスタイプを使用する必要があります。Amazon Elastic Compute Cloud(Amazon EC2)の G4インスタンス は、最新世代の NVIDIA T4 GPU、AWS カスタムの Intel Cascade Lake CPU、最大 100 Gbps のネットワークスループット、最大 1.8TBのローカル NVMe ストレージを提供し、CUDA や CuDNN などの GPU ライブラリに直接アクセスできます。

テストデータセットを使ってバッチ変換を実行

SageMaker Python SDK では、画像のバッチに対して推論を実行する簡単な方法を提供しています。以下のコードを実行することで、SKU-110K テストセットの推論結果を得ることができます。

model = PyTorchModel(
    name = "d2-sku110k-model",
    model_data=training_job_artifact,
    role=role,
    sagemaker_session = sm_session,
    entry_point="predict_sku110k.py",
    source_dir="container_serving",
    image_uri=serve_image_uri,
    framework_version="1.6.0",
    code_location=f"s3://{bucket}/{prefix_code}",
)
transformer = model.transformer(
    instance_count=1,
    instance_type="ml.p3.2xlarge", # "ml.p2.xlarge"
    output_path=inference_output,
    max_payload=16
)
transformer.transform(
    data=test_channel,
    data_type="S3Prefix",
    content_type="application/x-image",
    wait=False,
) 

バッチ変換では、推論結果を S3バケットに保存します。推論結果を ground truth と比較することで、学習したモデルを評価することができます。pycocotoolsライブラリを使って、公式の competition が物体検出アルゴリズムの評価に使う指標を計算します。SKU-110k データセットを発表した著者は、論文「Precise Detection in Densely Packed Scenes」(Goldman et al.)において、以下の3つの指標を考慮しています。

  • 0.5:0.95 Intersection over Union (IoU)における平均精度 (AP)
  • IoU が 75%のときの AP,すなわち,AP75
  • 0.5:0.95 の IoU での平均リコール (AR)

COCOデータセットにおける物体検出モデルの性能を特徴づける指標の全リストについては,COCOのウェブサイト をご参照ください。次の表は、Detectron2 を用いて SageMaker で得られた結果と論文の結果を比較したものです。

    AP AP75 AR
From paper by Goldman et al. RetinaNet 0.46 0.39 0.53
Faster-RCNN 0.04 0.01 0.05
Custom Method 0.49 0.56 0.55
Detectron2 on Amazon SageMaker RetinaNet 0.47 0.54 0.55
Faster-RCNN 0.49 0.53 0.55

SageMaker のハイパーパラメータチューニングジョブを用いて、物体検出モデルのハイパーパラメータを最適化しています。Faster-RCNN は、Goldman らが提案した、密集したシーンでの物体検出に特化したモデルと比較して、AP と AR の面で同じ性能を持っています。SageMaker で学習した Faster-RCNN は、AP75 で 3ポイント低くなっています。しかし、ビジネスのユースケースによっては、これは許容範囲と言えるかもしれません。また、このソリューションの利点は、Detecron2 のモジュールを利用するのみでよく、そのほかの実装の必要がないことです。これにより、Detectron2 を使用して、密集したシーンのような困難な状況下で、最先端のソリューションに匹敵する物体検出モデルを SageMaker を使って大規模に学習できることが証明されました。

まとめ

この記事では、SageMaker プラットフォームに Detectron2 を導入した際に可能なことをほんの少しだけご紹介しました。この入門的な記事が皆様のお役に立てば幸いです。また、皆様がこの新しいツールを使って AWS上で何を構築するかを楽しみにしています。


About the Authors

Vadim Dabravolski is Sr. AI/ML Architect at AWS. Areas of interest include distributed computations and data engineering, computer vision, and NLP algorithms. When not at work, he is catching up on his reading list (anything around business, technology, politics, and culture) and jogging in NYC boroughs.

 
 
Paolo Irrera is a Data Scientist at the Amazon Machine Learning Solutions Lab where he helps customers address business problems with ML and cloud capabilities. He holds a PhD in Computer Vision from Telecom ParisTech, Paris.