{ "cells": [ { "cell_type": "markdown", "id": "9a7406f2-a46a-40ef-91df-58d8e5e4a270", "metadata": {}, "source": [ "# Amazon Rekognition API Sample codes - Part1\n", "Amazon Rekognition Blackbelt Part 1 基本編 でご紹介したAPIを試すノートブックです。" ] }, { "cell_type": "markdown", "id": "f98a2bac-690d-4181-816b-02f2daf1714f", "metadata": {}, "source": [ "## 事前準備\n", "### 必要なライブラリのインポート" ] }, { "cell_type": "code", "execution_count": null, "id": "2abf5f06-366b-49e3-9b31-5857f896a692", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "!pip install -U pip\n", "!pip install -U boto3\n", "!pip install -U awscli\n", "!pip install -U IPython" ] }, { "cell_type": "code", "execution_count": null, "id": "66d5e94a-99db-439e-9abf-8fb23f733bed", "metadata": { "tags": [] }, "outputs": [], "source": [ "# AWS SDK for Python のインポート\n", "import boto3\n", "# 使用するライブラリのインポート\n", "from IPython.display import display, Image, Video, HTML\n", "import sys, json" ] }, { "cell_type": "code", "execution_count": null, "id": "4898a8db-ef2c-4504-9428-16cd2de34e30", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Client APIの設定\n", "rekognition = boto3.client('rekognition')\n", "s3 = boto3.client('s3')" ] }, { "cell_type": "code", "execution_count": null, "id": "44931d1f-d89e-4f9c-a4e9-c2b7a989b6e7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "502c744f-7fe5-4188-ba89-10776d94288b", "metadata": {}, "source": [ "# Amazon Rekognition Image " ] }, { "cell_type": "markdown", "id": "2dab03ba-9368-4bb9-9048-5be4cf0f382d", "metadata": {}, "source": [ "このサンプルノートブックでは、予め用意したAmazon S3バケット内の画像データを使用します。" ] }, { "cell_type": "code", "execution_count": null, "id": "0550524f-cd68-44ba-a1b4-c190d7e1c2e2", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"" ] }, { "cell_type": "markdown", "id": "33094a50-fc14-493c-b400-1a6ab37c4fab", "metadata": {}, "source": [ "※ ご自身で用意した画像でAPIを試したい場合は、以下の2つのセルを実行してください。\n", "セルの実行にはアップロード先となるS3バケットを指定する必要があります。Amazon S3バケットを新たに作成するか、既存のS3バケットのバケット名を指定してください。" ] }, { "cell_type": "code", "execution_count": null, "id": "46b110c0-8e81-4c1a-9d60-29c6bf530bbf", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Amazon S3バケットを指定してください\n", "# 作成方法:https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html\n", "bucket = \"<アップロード先となるバケット名を入力>\"\n", "\n", "# Amazon SageMakerをお使いの場合はこちらでも可能です\n", "# import sagemaker\n", "# bucket = sagemaker.Session().default_bucket()" ] }, { "cell_type": "code", "execution_count": null, "id": "db5a36c5-e0ae-4aca-bd63-fb1e125b0d79", "metadata": { "tags": [] }, "outputs": [], "source": [ "# 以下では\"data/\"フォルダ内のsample-picture.jpgをAmazon S3にアップロードする場合の例\n", "# アップロード対象(ローカル)のパス\n", "filename = 'data/sample-picture.jpg'\n", "# Amazon S3のアップロード先のパス\n", "object_name = 'sample-picture.jpg'\n", "\n", "s3.upload_file(filename, bucket, object_name)" ] }, { "cell_type": "code", "execution_count": null, "id": "6e81cea7-ab1b-4238-862a-b29d2706c2d9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "8fab8558-48d8-42da-8784-2b5ef58b1111", "metadata": {}, "source": [ "### ラベル検出\n", "画像や動画内のラベル(物体やシーン、イベント、アクティビティ)を検出する機能\n", " - 検出された各ラベルは信頼スコア(%)と共に返される\n", " - 物体ラベルの場合は、その位置情報(境界ボックス)も返される\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectLabels.html" ] }, { "cell_type": "code", "execution_count": null, "id": "eb13ea2b-1413-4a24-aac2-185221fefa89", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/skateboard.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo}), width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "20915887-d2ef-4425-96b3-90ce26ae8fb7", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.detect_labels(\n", " Image={'S3Object':{'Bucket':bucket,'Name':photo}},\n", " Features=[\"GENERAL_LABELS\",\"IMAGE_PROPERTIES\"],\n", " # MaxLabels=10,\n", " # MinConfidence=75,\n", " # Settings={\"GeneralLabels\": {\"LabelInclusionFilters\":[\"Cat\"]},\"ImageProperties\": {\"MaxDominantColors\":10}}\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "aafd05d7-4e6a-404d-b5d0-c0152a9632fa", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "print('Detected labels for ' + photo)\n", "print()\n", "for label in response['Labels']:\n", " print(\"Label: \" + label['Name'])\n", " print(\"Confidence: \" + str(label['Confidence']))\n", " print(\"Instances:\")\n", "\n", " for instance in label['Instances']:\n", " print(\" Bounding box\")\n", " print(\" Top: \" + str(instance['BoundingBox']['Top']))\n", " print(\" Left: \" + str(instance['BoundingBox']['Left']))\n", " print(\" Width: \" + str(instance['BoundingBox']['Width']))\n", " print(\" Height: \" + str(instance['BoundingBox']['Height']))\n", " print(\" Confidence: \" + str(instance['Confidence']))\n", " print()\n", "\n", " print(\"Parents:\")\n", " for parent in label['Parents']:\n", " print(\" \" + parent['Name'])\n", "\n", " print(\"Aliases:\")\n", " for alias in label['Aliases']:\n", " print(\" \" + alias['Name'])\n", "\n", " print(\"Categories:\")\n", " for category in label['Categories']:\n", " print(\" \" + category['Name'])\n", " print(\"----------\")\n", " print()\n", "\n", "if \"ImageProperties\" in str(response):\n", " print(\"Quality:\")\n", " print(response[\"ImageProperties\"][\"Quality\"])\n", " print()\n", " print(\"DominantColors:\")\n", " print(response[\"ImageProperties\"][\"DominantColors\"])\n", " print()\n", "\n", "# raw response\n", "# print(response)" ] }, { "cell_type": "markdown", "id": "d6d94404-337d-4912-8110-fecf4e2005cb", "metadata": { "tags": [] }, "source": [ "### 顔検出・分析\n", "- 画像や動画内に含まれる人物の顔を\u000b", "検出し、検出された顔を分析する機能\n", " - 画像上の顔の位置・角度\n", " - ランドマーク座標(左/右目、口 など)\n", " - 顔属性(性別、年齢、感情 など)\n", " - などを検出\n", "- 1 つの画像から最大 100 個検出可能\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectFaces.html" ] }, { "cell_type": "code", "execution_count": null, "id": "28ab58b2-6adb-492f-9d48-0983ce7021c8", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/drive.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo}), width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "1447a676-153f-41db-9baa-b222e887f285", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.detect_faces(\n", " Image={'S3Object':{'Bucket':bucket,'Name':photo}},\n", " Attributes=['ALL']\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "b982dafc-51ae-447a-ad4e-8c2c187a55bb", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "print('Detected faces for ' + photo)\n", "for faceDetail in response['FaceDetails']:\n", " print('The detected face is between ' + str(faceDetail['AgeRange']['Low'])\n", " + ' and ' + str(faceDetail['AgeRange']['High']) + ' years old')\n", "\n", " print('Here are the other attributes:')\n", " print(json.dumps(faceDetail, indent=4, sort_keys=True))\n", "\n", " # Access predictions for individual face details and print them\n", " print(\"Gender: \" + str(faceDetail['Gender']))\n", " print(\"Smile: \" + str(faceDetail['Smile']))\n", " print(\"Eyeglasses: \" + str(faceDetail['Eyeglasses']))\n", " print(\"Emotions: \" + str(faceDetail['Emotions'][0]))\n", " \n", "# raw response\n", "# print(response)" ] }, { "cell_type": "markdown", "id": "537fa3d0-a2ff-42d0-9c83-89f0751453e9", "metadata": {}, "source": [ "### 顔の比較\n", "- ある画像(ソース画像)内の顔と\u000b", "別の画像(ターゲット画像)内の\u000b", "複数の人物の顔を比較し類似度を測定\n", "- ソース画像に含まれる 1 つの顔を、\u000b", "ターゲット画像内の最大 15 の顔と\u000b", "比較可能\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_CompareFaces.html" ] }, { "cell_type": "code", "execution_count": null, "id": "7521c36e-7f1c-454f-9112-03f958a90bdb", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "source_photo = \"assets/StaticImageAssets/SampleImages/source3.jpg\"\n", "target_photo = \"assets/StaticImageAssets/SampleImages/target3.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': source_photo}), width=500))\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': target_photo}), width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "0cf2fe2c-3e61-48c6-8c5f-ec29ed5ef912", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.compare_faces(\n", " SourceImage={'S3Object': {\"Bucket\": bucket, \"Name\": source_photo}},\n", " TargetImage={'S3Object': {\"Bucket\": bucket, \"Name\": target_photo}},\n", " # SimilarityThreshold=80,\n", " # QualityFilter=\"NONE\"\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "950a9e87-8c44-4c22-9a83-bef70c51bde7", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "for faceMatch in response['FaceMatches']:\n", " position = faceMatch['Face']['BoundingBox']\n", " similarity = str(faceMatch['Similarity'])\n", " print('The face at')\n", " print(\" Bounding box\")\n", " print(\" Top: \" + str(faceMatch['Face']['BoundingBox']['Top']))\n", " print(\" Left: \" + str(faceMatch['Face']['BoundingBox']['Left']))\n", " print(\" Width: \" + str(faceMatch['Face']['BoundingBox']['Width']))\n", " print(\" Height: \" + str(faceMatch['Face']['BoundingBox']['Height']))\n", " print(\" Confidence: \" + str(faceMatch['Face']['Confidence']))\n", " print()\n", "\n", " print('Here are the other attributes:')\n", " print(json.dumps(faceMatch, indent=4, sort_keys=True))\n", "\n", "# raw response\n", "# print(response)" ] }, { "cell_type": "markdown", "id": "33d2c68c-4d81-44c6-ac96-34812ffeb0ee", "metadata": { "tags": [] }, "source": [ "### 有名人の認識\n", "- スポーツやビジネス、メディアなど各業界の著名な人物の顔を認識\n", "- 検出された有名人の名前や関連URL (IMDB や Wikidata など) を返す\n", "- 「顔検出・分析」の場合と同様に画像上の顔の位置や、感情などの顔属性に関する情報も返される\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_RecognizeCelebrities.html" ] }, { "cell_type": "code", "execution_count": null, "id": "63f969f1-6a18-4b98-95cf-e74c3885cb91", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/andy_portrait.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo}),width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "a0861c27-7f09-48c0-b691-419df888098a", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.recognize_celebrities(\n", " Image={'S3Object':{'Bucket':bucket,'Name':photo}}\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "8aa5f880-16f4-49db-9836-1136486f0c18", "metadata": { "tags": [] }, "outputs": [], "source": [ "print('Detected faces for ' + photo)\n", "for celebrity in response['CelebrityFaces']:\n", " print('Name: ' + celebrity['Name'])\n", " print('Id: ' + celebrity['Id'])\n", " print('KnownGender: ' + celebrity['KnownGender']['Type'])\n", " print('Smile: ' + str(celebrity['Face']['Smile']['Value']))\n", " print('Position:')\n", " print(' Left: ' + '{:.2f}'.format(celebrity['Face']['BoundingBox']['Height']))\n", " print(' Top: ' + '{:.2f}'.format(celebrity['Face']['BoundingBox']['Top']))\n", " print('Info')\n", " for url in celebrity['Urls']:\n", " print(' ' + url)\n", " print()\n", "\n", "# raw response\n", "# print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "2f7f0ed2-3460-4419-bed2-3ef0a52fed43", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "0cc1e0f2-40df-4c12-83e2-5225c1788527", "metadata": {}, "source": [ "### コンテンツのモデレーション\n", "- 画像や動画内に不適切な内容が含まれているかどうかを判定\n", "- 不適切コンテンツの種類は階層的な分類がなされており、ポリシーに合わせて利用可能(薬物はNGでタバコはOK、など)\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectModerationLabels.html" ] }, { "cell_type": "markdown", "id": "8b25ee6c-d11e-4d95-93d5-4a5689251611", "metadata": {}, "source": [ "※ このノートブックでは不適切なコンテンツが含まれない画像を用いています。不適切なコンテンツを含む場合は、以下のセルのコメントアウトをはずしていただくかご自身で用意したデータでお試しください。" ] }, { "cell_type": "code", "execution_count": null, "id": "c5e73a26-8cf5-4f8f-9f96-f1a046059d60", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/family_picnic.jpg\"\n", "\n", "# 不適切なコンテンツが含まれる場合を試す際はこちら\n", "# photo = \"assets/StaticImageAssets/SampleImages/yoga_swimwear.jpg\"\n", "\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo}), width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "63f44ef6-dfdd-40ab-9343-827e48818a75", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.detect_moderation_labels(\n", " Image={'S3Object':{'Bucket':bucket,'Name':photo}},\n", " # MinConfidence=60\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "61c8b15f-6e34-421e-9c19-4a9c614cddd6", "metadata": { "tags": [] }, "outputs": [], "source": [ "print('Detected labels for ' + photo)\n", "for label in response['ModerationLabels']:\n", " print (label['Name'] + ' : ' + str(label['Confidence']))\n", " print (label['ParentName'])\n", " \n", "# raw response\n", "print(response)" ] }, { "cell_type": "markdown", "id": "0600170e-71c9-4fef-bc69-1d6a2930e972", "metadata": {}, "source": [ "不適切なコンテンツが検出された場合は以下のような実行結果例となります。\n", "\n", "Detected labels for xxxxxx.jpg\n", "- Female Swimwear Or Underwear : 93.13668823242188\n", "- Suggestive\n", "- Suggestive : 93.13668823242188\n", "- Revealing Clothes : 81.7039566040039\n", "- Suggestive\n", "\n", "{'ModerationLabels': [{'Confidence': 93.13668823242188, 'Name': 'Female Swimwear Or Underwear', 'ParentName': 'Suggestive'}, {'Confidence': 93.13668823242188, 'Name': 'Suggestive', 'ParentName': ''}, {'Confidence': 81.7039566040039, 'Name': 'Revealing Clothes', 'ParentName': 'Suggestive'}], 'ModerationModelVersion': '6.0', 'ResponseMetadata': {'RequestId': 'a345e986-0b20-406a-a365-ae3cf63cb8ea', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'a345e986-0b20-406a-a365-ae3cf63cb8ea', 'content-type': 'application/x-amz-json-1.1', 'content-length': '304', 'date': 'Fri, 14 Apr 2023 04:59:57 GMT'}, 'RetryAttempts': 0}}" ] }, { "cell_type": "code", "execution_count": null, "id": "5c086aa9-f945-4d33-8ab5-f7863b13ae0d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "dc666b95-1e65-44d5-ad61-6cabdbea79c4", "metadata": { "tags": [] }, "source": [ "### PPE(個人用保護具)検出\n", "- 画像内の人物が着用している個人用保護具とその位置を検出\n", "- 検出できる保護具は 3 種類\n", " - フェイスカバー(例:マスク)\n", " - ヘッドカバー (例:ヘルメット)\n", " - ハンドカバー (例:手袋)\n", " \n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectProtectiveEquipment.html" ] }, { "cell_type": "code", "execution_count": null, "id": "9d3948c1-cdca-4d7a-a781-c78a49dcdd1d", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/ppe_group_updated.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo}),width=500))" ] }, { "cell_type": "code", "execution_count": null, "id": "e15def39-a0ce-48c9-8549-d66b9bcf8ef2", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.detect_protective_equipment(\n", " Image={'S3Object': {'Bucket': bucket, 'Name': photo}},\n", " SummarizationAttributes={\n", " 'MinConfidence': 80,\n", " 'RequiredEquipmentTypes': ['FACE_COVER','HAND_COVER','HEAD_COVER']}\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "af4b195a-7818-45c6-b34a-bf9c3328c7b9", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "def display_summary(summary_type, summary):\n", " print(summary_type + '\\n\\tIDs: ', end='')\n", " if (len(summary) == 0):\n", " print('None')\n", " else:\n", " for num, id in enumerate(summary, start=0):\n", " if num == len(summary) - 1:\n", " print(id)\n", " else:\n", " print(str(id) + ', ', end='')\n", " \n", "print('Detected PPE for people in image ' + photo)\n", "print('\\nDetected people\\n---------------')\n", "for person in response['Persons']:\n", "\n", " print('Person ID: ' + str(person['Id']))\n", " print('Body Parts\\n----------')\n", " body_parts = person['BodyParts']\n", " if len(body_parts) == 0:\n", " print('No body parts found')\n", " else:\n", " for body_part in body_parts:\n", " print('\\t' + body_part['Name'] + '\\n\\t\\tConfidence: ' + str(body_part['Confidence']))\n", " print('\\n\\t\\tDetected PPE\\n\\t\\t------------')\n", " ppe_items = body_part['EquipmentDetections']\n", " if len(ppe_items) == 0:\n", " print('\\t\\tNo PPE detected on ' + body_part['Name'])\n", " else:\n", " for ppe_item in ppe_items:\n", " print('\\t\\t' + ppe_item['Type'] + '\\n\\t\\t\\tConfidence: ' + str(ppe_item['Confidence']))\n", " print('\\t\\tCovers body part: ' + str(\n", " ppe_item['CoversBodyPart']['Value']) + '\\n\\t\\t\\tConfidence: ' + str(\n", " ppe_item['CoversBodyPart']['Confidence']))\n", " print('\\t\\tBounding Box:')\n", " print('\\t\\t\\tTop: ' + str(ppe_item['BoundingBox']['Top']))\n", " print('\\t\\t\\tLeft: ' + str(ppe_item['BoundingBox']['Left']))\n", " print('\\t\\t\\tWidth: ' + str(ppe_item['BoundingBox']['Width']))\n", " print('\\t\\t\\tHeight: ' + str(ppe_item['BoundingBox']['Height']))\n", " print('\\t\\t\\tConfidence: ' + str(ppe_item['Confidence']))\n", " print()\n", " print()\n", "\n", "print('Person ID Summary\\n----------------')\n", "display_summary('With required equipment', response['Summary']['PersonsWithRequiredEquipment'])\n", "display_summary('Without required equipment', response['Summary']['PersonsWithoutRequiredEquipment'])\n", "display_summary('Indeterminate', response['Summary']['PersonsIndeterminate'])\n", "\n", "\n", "# raw response\n", "# print(response)" ] }, { "cell_type": "markdown", "id": "7afc7767-f0cb-45c2-a105-8560161d458d", "metadata": {}, "source": [ "### テキストの検出\n", "- 画像や動画に含まれるテキストを検出\n", "- 英語など複数の言語に対応(2023年3月現在日本語未対応)\n", "- 画像の場合1枚あたり最大100単語、動画の場合1フレームあたり最大50単語検出可能\n", "\n", "https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectText.html" ] }, { "cell_type": "code", "execution_count": null, "id": "61bd4dc2-271f-4cc8-9b84-dedbe8cc782c", "metadata": { "tags": [] }, "outputs": [], "source": [ "bucket = \"rekognition-console-v4-prod-iad\"\n", "photo = \"assets/StaticImageAssets/SampleImages/coffee_monday.jpg\"\n", "display(Image(url=s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': photo})))" ] }, { "cell_type": "code", "execution_count": null, "id": "c9f92f3f-1ed5-41b2-9f80-c70e8a4b7c1c", "metadata": { "tags": [] }, "outputs": [], "source": [ "response = rekognition.detect_text(\n", " Image={'S3Object': {'Bucket': bucket, 'Name': photo}}\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "aa249bfe-21b5-4558-b0a7-c35964e97285", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "textDetections = response['TextDetections']\n", "print('Detected text\\n----------')\n", "for text in textDetections:\n", " print('Detected text:' + text['DetectedText'])\n", " print('Confidence: ' + \"{:.2f}\".format(text['Confidence']) + \"%\")\n", " print('Id: {}'.format(text['Id']))\n", " if 'ParentId' in text:\n", " print('Parent Id: {}'.format(text['ParentId']))\n", " print('Type:' + text['Type'])\n", " print()\n", "\n", "# raw response\n", "# print(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "31f3dede-08df-46fd-b69f-628eaa9c9da4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "d713076f-ad4c-4aea-ad2c-318240d87408", "metadata": { "tags": [] }, "source": [ "# Amazon Rekognition Video\n" ] }, { "cell_type": "markdown", "id": "766df62b-44b4-4886-a659-21d13ecac91f", "metadata": {}, "source": [ "こちらのノートブックでは Amazon Rekognition Image にはないAmazon Rekognition Video のみにあるAPIを中心にご紹介します。\n", "- 人物の動線検出\n", "- ビデオセグメント検出\n", "- ラベル検出(Optional:Amazon SNS トピックへの分析完了ステータスの発行)\n", "\n", "上記以外の Amazon Rekognition Video API の詳細は以下を参照してください。\n", "- 顔分析\n", " - [StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartFaceDetection.html)\n", " - [GetFaceDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetFaceDetection.html)\n", "- 有名人の認識\n", " - [StartCelecrityRecognition](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartCelebrityRecognition.html)\n", " - [GetCelebrityRecognition](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetCelebrityRecognition.html)\n", "- コンテンツのモデレーション\n", " - [StartContentModeration](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartContentModeration.html)\n", " - [GetContentModeration](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetContentModeration.html)\n", "- テキストの検出\n", " - [StartTextDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartTextDetection.html)\n", " - [GetTextDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetTextDetection.html)" ] }, { "cell_type": "markdown", "id": "986dc94f-30fd-4a3f-a64f-113861756fdb", "metadata": { "tags": [] }, "source": [ "### 事前準備 - 動画データをアップロードするAmazon S3バケットを指定\n", "Amazon Rekognition Videoを使用するためには動画データを予めAmazon S3にアップロードしておく必要があります。\n", "\n", "**動画に関しては、本ノートブックではサンプルデータは準備しておりませんので、ご自身でお持ちのmp4データやオープンソースの動画データセットなどを準備してください。**\n", "\n", "ここではアップロード先となるS3バケットを指定します。Amazon S3バケットを新たに作成するか、既存のS3バケットのバケット名を指定してください。" ] }, { "cell_type": "code", "execution_count": null, "id": "4e7bdc9f-00ef-4b21-9a21-de2a03cb5e3f", "metadata": { "tags": [] }, "outputs": [], "source": [ "# Amazon S3バケットを指定してください\n", "# 作成方法:https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html\n", "bucket = \"<アップロード先となるバケット名を入力>\"\n", "\n", "# Amazon SageMakerをお使いの場合はこちらでも可能です\n", "# import sagemaker\n", "# bucket = sagemaker.Session().default_bucket()" ] }, { "cell_type": "markdown", "id": "84640070-088b-4bb1-8195-ac38965ac28d", "metadata": { "tags": [] }, "source": [ "## 人物の動線検出\n", "動画における人物の動線を追跡する機能\n", "- 検出された人物の位置や顔のランドマークに関する情報をタイムスタンプ付きで返す\n", "- カメラが動いていても検出可能\n", "\n", "詳細は以下をご参照ください\n", "- https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/persons.html\n", "\n", "API ドキュメント\n", "- https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartPersonTracking.html\n", "- https://docs.aws.amazon.com/rekognition/latest/APIReference/API_GetPersonTracking.html" ] }, { "cell_type": "code", "execution_count": null, "id": "ebceab77-0755-4a62-b301-82e523e88067", "metadata": { "tags": [] }, "outputs": [], "source": [ "filename = '<アップロードしたいファイルのパスを入力>'\n", "object_name = '< Amazon S3のアップロード先のパスを入力>'\n", "\n", "s3.upload_file(filename, bucket, object_name)" ] }, { "cell_type": "code", "execution_count": null, "id": "4b3c2b52-e394-4099-bcce-4f67f35d4deb", "metadata": { "tags": [] }, "outputs": [], "source": [ "video_url = s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': object_name})\n", "videoTag = \"\".format(video_url)\n", "videoui = \"
{}
\".format(videoTag)\n", "display(HTML(videoui))" ] }, { "cell_type": "code", "execution_count": null, "id": "8686d5eb-999f-4fc8-998b-90fab28ac6a5", "metadata": { "tags": [] }, "outputs": [], "source": [ "start_person_tracking = rekognition.start_person_tracking(\n", " Video={\n", " 'S3Object':{\n", " 'Bucket': bucket,\n", " 'Name': object_name\n", " }\n", " }\n", ")\n", "job_id = start_person_tracking['JobId']\n", "display(start_person_tracking)" ] }, { "cell_type": "code", "execution_count": null, "id": "f5377106-2edf-4ca5-a683-8872084d3c56", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "import time\n", "response = rekognition.get_person_tracking(\n", " JobId = job_id\n", ")\n", "print(response['JobStatus'])\n", "\n", "while (response['JobStatus'] == 'IN_PROGRESS'):\n", " print('.', end='')\n", " time.sleep(10)\n", " response = rekognition.get_person_tracking(\n", " JobId = job_id\n", " )\n", "display(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "f4df55f2-3c14-41b2-ae31-6be64288dfbc", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "print('Codec: ' + response['VideoMetadata']['Codec'])\n", "print('Duration: ' + str(response['VideoMetadata']['DurationMillis']))\n", "print('Format: ' + response['VideoMetadata']['Format'])\n", "print('Frame rate: ' + str(response['VideoMetadata']['FrameRate']))\n", "print()\n", " \n", "for personDetection in response['Persons']:\n", " print('Index: ' + str(personDetection['Person']['Index']))\n", " print('Timestamp: ' + str(personDetection['Timestamp']))\n", " print(\"Bounding box\")\n", " print(\" Top: \" + str(personDetection['Person']['BoundingBox']['Top']))\n", " print(\" Left: \" + str(personDetection['Person']['BoundingBox']['Left']))\n", " print(\" Width: \" + str(personDetection['Person']['BoundingBox']['Width']))\n", " print(\" Height: \" + str(personDetection['Person']['BoundingBox']['Height']))\n", " print()" ] }, { "cell_type": "code", "execution_count": null, "id": "333c6fae-f84a-456a-9a51-8bcb8dd6e5e7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2fa4c750-b87c-44c0-bd9f-66de299233f0", "metadata": {}, "source": [ "## ビデオセグメント検出\n", "動画における主要なセグメントを検出\n", "- ブラックフレーム\n", "- クレジット\n", "- カラーバー\n", "- スレート / スタジオロゴ\n", "- ショット\n", "\n", "詳細は以下のリンクをご参照ください\n", "- https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/segments.html\n", "\n", "API ドキュメント\n", "- https://docs.aws.amazon.com/rekognition/latest/dg/API_StartSegmentDetection.html\n", "- https://docs.aws.amazon.com/rekognition/latest/dg/API_GetSegmentDetection.html" ] }, { "cell_type": "code", "execution_count": null, "id": "9da331fd-75a6-46d5-a8ce-69eca59157a9", "metadata": { "tags": [] }, "outputs": [], "source": [ "filename = '<アップロードしたいファイルのパスを入力>'\n", "object_name = '< Amazon S3のアップロード先のパスを入力>'\n", "\n", "s3.upload_file(filename, bucket, object_name)" ] }, { "cell_type": "code", "execution_count": null, "id": "c39ade23-2afd-4fc3-8176-e13ef6ecf4aa", "metadata": {}, "outputs": [], "source": [ "video_url = s3.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': video})\n", "videoTag = \"\".format(video_url)\n", "videoui = \"
{}
\".format(videoTag)\n", "display(HTML(videoui))" ] }, { "cell_type": "code", "execution_count": null, "id": "fa1c162c-b17a-4af4-9b55-6e0f06454955", "metadata": { "tags": [] }, "outputs": [], "source": [ "start_segment_detection = rekognition.start_segment_detection(\n", " Video={\n", " 'S3Object':{\n", " 'Bucket': bucket,\n", " 'Name': object_name\n", " }\n", " },\n", " SegmentTypes=[\"TECHNICAL_CUE\", \"SHOT\"],\n", " Filters={\n", " \"TechnicalCueFilter\":{\n", " \"BlackFrame\": {\n", " \"MaxPixelThreshold\": 0.1,\n", " \"MinCoveragePercentage\": 60\n", " },\n", " \"MinSegmentConfidence\": 80.0\n", " },\n", " \"ShotFilter\": {\"MinSegmentConfidence\": 80.0}\n", " }\n", ")\n", "job_id = start_segment_detection['JobId']\n", "display(start_segment_detection)" ] }, { "cell_type": "code", "execution_count": null, "id": "bc267d39-c34e-4061-b8dc-f738c963f460", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "import time\n", "response = rekognition.get_segment_detection(\n", " JobId = job_id\n", ")\n", "while (response['JobStatus'] == 'IN_PROGRESS'):\n", " print('.', end='')\n", " time.sleep(10)\n", " response = rekognition.get_segment_detection(\n", " JobId = job_id\n", " )\n", "display(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "d43cee21-a9c7-424d-b288-bb9285cc5b5b", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "for segment in response['Segments']:\n", " if segment[\"Type\"] == \"TECHNICAL_CUE\":\n", " print(\"Technical Cue\")\n", " print(f\"\\tConfidence: {segment['TechnicalCueSegment']['Confidence']}\")\n", " print(f\"\\tType: {segment['TechnicalCueSegment']['Type']}\")\n", "\n", " if segment[\"Type\"] == \"SHOT\":\n", " print(\"Shot\")\n", " print(f\"\\tConfidence: {segment['ShotSegment']['Confidence']}\")\n", " print(f\"\\tIndex: \" + str(segment[\"ShotSegment\"][\"Index\"]))\n", "\n", " print(f\"\\tDuration (milliseconds): {segment['DurationMillis']}\")\n", " print(f\"\\tStart Timestamp (milliseconds): {segment['StartTimestampMillis']}\")\n", " print(f\"\\tEnd Timestamp (milliseconds): {segment['EndTimestampMillis']}\")\n", "\n", " print(f\"\\tStart timecode: {segment['StartTimecodeSMPTE']}\")\n", " print(f\"\\tEnd timecode: {segment['EndTimecodeSMPTE']}\")\n", " print(f\"\\tDuration timecode: {segment['DurationSMPTE']}\")\n", "\n", " print(f\"\\tStart frame number {segment['StartFrameNumber']}\")\n", " print(f\"\\tEnd frame number: {segment['EndFrameNumber']}\")\n", " print(f\"\\tDuration frames: {segment['DurationFrames']}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "87eb13a6-754f-4d85-9c38-016922cddf60", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "a105b1a4-b212-4e6c-8aa6-551626885be2", "metadata": {}, "source": [ "## ラベル検出 - Amazon SNS トピックへの分析完了ステータスの発行\n", "Amazon Rekognition Video APIでは、オプションでAmazon Simple Notification Service (Amazon SNS) トピックを指定することで、ビデオの分析が完了した際に分析リクエストの完了通知をAmazon SNSトピックに発行することができます。トピック通知はJSON文字列であり、ジョブの識別子や完了ステータス(\"SUCCEEDED\", \"FAILED\", \"ERROR\")などが含まれています。\n", "Amazon SNSトピックに発行された分析完了のステータス情報は、AWS LambdaやAmazon Simple Queue Service (Amazon SQS) を用いて取得することができます。\n", "\n", "以下では、Amazon Rekognition Video におけるラベル検出において、Amazon SNSトピックをオプションで設定し、Amazon SQSで完了ステータスを取得します。" ] }, { "cell_type": "markdown", "id": "60670edc-1400-4c0b-affe-7d0befd51a95", "metadata": {}, "source": [ "#### Amazon SNS トピックとAmazon SQSキューの作成" ] }, { "cell_type": "code", "execution_count": null, "id": "dd6ac05a-0023-43c6-a17d-1be99acab72e", "metadata": { "tags": [] }, "outputs": [], "source": [ "# エラーが出る場合はAmazon SNS および Amazon SQS 操作の権限があるかどうか確認してください\n", "# https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/api-video-roles.html\n", "\n", "sns = boto3.client('sns') \n", "sqs = boto3.client('sqs')\n", "\n", "sns_topic_name=\"amazon-rekognition-notebook-topic\"\n", "topic_response=sns.create_topic(Name=sns_topic_name)\n", "sns_topic_arn = topic_response['TopicArn']\n", "\n", "sqs_queue_name=\"amazon-rekognition-notebook-queue\"\n", "sqs.create_queue(QueueName=sqs_queue_name)\n", "sqs_queue_url = sqs.get_queue_url(QueueName=sqs_queue_name)['QueueUrl']\n", "\n", "attribs = sqs.get_queue_attributes(QueueUrl=sqs_queue_url,AttributeNames=['QueueArn'])['Attributes']\n", "sqs_queue_arn = attribs['QueueArn']\n", "\n", "# Amazon SNS トピックに Amazon SQS キューをサブスクライブ\n", "sns.subscribe(\n", " TopicArn=sns_topic_arn,\n", " Protocol='sqs',\n", " Endpoint=sqs_queue_arn\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "ac67fd96-62d0-4d3b-9e35-b7404de3386b", "metadata": {}, "outputs": [], "source": [ "# Amazon SNSにAmazon SQSキューへの書き込みを許可\n", "queue_policy = \"\"\"{{\n", " \"Version\":\"2012-10-17\",\n", " \"Statement\":[\n", " {{\n", " \"Sid\":\"MyPolicy\",\n", " \"Effect\":\"Allow\",\n", " \"Principal\" : {{\"AWS\" : \"*\"}},\n", " \"Action\":\"SQS:SendMessage\",\n", " \"Resource\": \"{}\",\n", " \"Condition\":{{\n", " \"ArnEquals\":{{\n", " \"aws:SourceArn\": \"{}\"\n", " }}\n", " }}\n", " }}\n", " ]\n", "}}\"\"\".format(sqs_queue_arn, sns_topic_arn)\n", "\n", "response = sqs.set_queue_attributes(\n", " QueueUrl = sqs_queue_url,\n", " Attributes = {\n", " 'Policy' : queue_policy\n", " }\n", ")" ] }, { "cell_type": "markdown", "id": "83723676-c031-4fc5-a305-7b181c691304", "metadata": { "tags": [] }, "source": [ "#### 既存の Amazon SNS トピックへのアクセス権限の付与\n", "- Amazon Rekognition VideoがAmazon SNSトピックに完了ステータスを発行するための権限(IAMロール)を作成します。\n", "- マネジメントコンソールからIAM(Identity and Access Management) にアクセスし、以下のポリシーを持つAmazon Rekognitionの IAM ロールを作成します。トピックARNには上記のsns_topic_arnの返り値となる'arn:...'から始まる文字列を代入してください。ロールを作成したらARNをコピーしておいてください。詳細な手順はこちらをご覧ください。 https://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/api-video-roles.html#api-video-roles-single-topics\n", "```\n", "{\n", " \"Version\": \"2012-10-17\",\n", " \"Statement\": [\n", " {\n", " \"Effect\": \"Allow\",\n", " \"Action\": [\n", " \"sns:Publish\"\n", " ],\n", " \"Resource\": <<上記で作成したsns_topic_arn>>\n", " }\n", " ]\n", "}\n", "```\n" ] }, { "cell_type": "code", "execution_count": null, "id": "1d7ac7b9-60da-4982-b5d2-3e0421259baf", "metadata": { "tags": [] }, "outputs": [], "source": [ "role_arn = \"<上で作成したIAMロールのARNを入力>\"" ] }, { "cell_type": "code", "execution_count": null, "id": "96c7befb-aeab-4a14-aaa6-d11e703d9b11", "metadata": { "tags": [] }, "outputs": [], "source": [ "# StartLabelDetection API \n", "video = 'videos/amazon-go.mp4'\n", "start_label_detection = rekognition.start_label_detection(\n", " Video={\n", " 'S3Object':{\n", " 'Bucket': bucket,\n", " 'Name': video\n", " }\n", " },\n", " NotificationChannel={\n", " 'RoleArn': role_arn,\n", " 'SNSTopicArn': sns_topic_arn\n", " },\n", " Features=['GENERAL_LABELS']\n", ")\n", "job_id = start_label_detection['JobId']\n", "display(start_label_detection)" ] }, { "cell_type": "markdown", "id": "9e103327-ac77-40d0-ba3b-3aad649f8cb7", "metadata": {}, "source": [ "#### Amazon SQSからジョブ完了ステータスを取得" ] }, { "cell_type": "code", "execution_count": null, "id": "d0ebf87f-e167-451d-84d3-0e749bf476f6", "metadata": { "tags": [] }, "outputs": [], "source": [ "jobFound = False\n", "succeeded = False\n", "\n", "dotLine=0\n", "while jobFound == False:\n", " sqsResponse = sqs.receive_message(QueueUrl=sqs_queue_url, MessageAttributeNames=['ALL'], MaxNumberOfMessages=10)\n", " if sqsResponse:\n", " if 'Messages' not in sqsResponse:\n", " if dotLine<40:\n", " print('.', end='')\n", " dotLine=dotLine+1\n", " else:\n", " print()\n", " dotLine=0 \n", " sys.stdout.flush()\n", " time.sleep(5)\n", " continue\n", "\n", " for message in sqsResponse['Messages']:\n", " notification = json.loads(message['Body'])\n", " rekMessage = json.loads(notification['Message'])\n", " print(rekMessage['JobId'])\n", " print(rekMessage['Status'])\n", " if rekMessage['JobId'] == job_id:\n", " print('Matching Job Found:' + rekMessage['JobId'])\n", " jobFound = True\n", " if (rekMessage['Status']=='SUCCEEDED'):\n", " succeeded=True\n", " sqs.delete_message(QueueUrl=sqs_queue_url, ReceiptHandle=message['ReceiptHandle'])" ] }, { "cell_type": "code", "execution_count": null, "id": "e6c1cc99-eabb-44f2-9c13-ed78207487bf", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "response = rekognition.get_label_detection(\n", " JobId = job_id\n", ")\n", "display(response)" ] }, { "cell_type": "code", "execution_count": null, "id": "d24ca145-f84f-4b17-a84e-903e73a69e9a", "metadata": { "scrolled": true, "tags": [] }, "outputs": [], "source": [ "for labelDetection in response['Labels']:\n", " label=labelDetection['Label']\n", "\n", " print(\"Timestamp: \" + str(labelDetection['Timestamp']))\n", " print(\" Label: \" + label['Name'])\n", " print(\" Confidence: \" + str(label['Confidence']))\n", " print(\" Instances:\")\n", " for instance in label['Instances']:\n", " print (\" Confidence: \" + str(instance['Confidence']))\n", " print (\" Bounding box\")\n", " print (\" Top: \" + str(instance['BoundingBox']['Top']))\n", " print (\" Left: \" + str(instance['BoundingBox']['Left']))\n", " print (\" Width: \" + str(instance['BoundingBox']['Width']))\n", " print (\" Height: \" + str(instance['BoundingBox']['Height']))\n", " print (\" Parents:\")\n", " for parent in label['Parents']:\n", " print (\" \" + parent['Name'])\n", " print ()" ] }, { "cell_type": "code", "execution_count": null, "id": "28306f37-445b-4c51-9d42-d2149c08472b", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "availableInstances": [ { "_defaultOrder": 0, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.t3.medium", "vcpuNum": 2 }, { "_defaultOrder": 1, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.t3.large", "vcpuNum": 2 }, { "_defaultOrder": 2, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.t3.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 3, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.t3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 4, "_isFastLaunch": true, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5.large", "vcpuNum": 2 }, { "_defaultOrder": 5, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 6, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 7, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 8, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 9, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 10, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 11, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 12, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.m5d.large", "vcpuNum": 2 }, { "_defaultOrder": 13, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.m5d.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 14, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.m5d.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 15, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.m5d.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 16, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.m5d.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 17, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.m5d.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 18, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.m5d.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 19, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.m5d.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 20, "_isFastLaunch": false, "category": "General purpose", "gpuNum": 0, "hideHardwareSpecs": true, "memoryGiB": 0, "name": "ml.geospatial.interactive", "supportedImageNames": [ "sagemaker-geospatial-v1-0" ], "vcpuNum": 0 }, { "_defaultOrder": 21, "_isFastLaunch": true, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 4, "name": "ml.c5.large", "vcpuNum": 2 }, { "_defaultOrder": 22, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 8, "name": "ml.c5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 23, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.c5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 24, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.c5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 25, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 72, "name": "ml.c5.9xlarge", "vcpuNum": 36 }, { "_defaultOrder": 26, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 96, "name": "ml.c5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 27, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 144, "name": "ml.c5.18xlarge", "vcpuNum": 72 }, { "_defaultOrder": 28, "_isFastLaunch": false, "category": "Compute optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.c5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 29, "_isFastLaunch": true, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g4dn.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 30, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g4dn.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 31, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g4dn.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 32, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g4dn.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 33, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g4dn.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 34, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g4dn.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 35, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 61, "name": "ml.p3.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 36, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 244, "name": "ml.p3.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 37, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 488, "name": "ml.p3.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 38, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.p3dn.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 39, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.r5.large", "vcpuNum": 2 }, { "_defaultOrder": 40, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.r5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 41, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.r5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 42, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.r5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 43, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.r5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 44, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.r5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 45, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 512, "name": "ml.r5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 46, "_isFastLaunch": false, "category": "Memory Optimized", "gpuNum": 0, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.r5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 47, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 16, "name": "ml.g5.xlarge", "vcpuNum": 4 }, { "_defaultOrder": 48, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 32, "name": "ml.g5.2xlarge", "vcpuNum": 8 }, { "_defaultOrder": 49, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 64, "name": "ml.g5.4xlarge", "vcpuNum": 16 }, { "_defaultOrder": 50, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 128, "name": "ml.g5.8xlarge", "vcpuNum": 32 }, { "_defaultOrder": 51, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 1, "hideHardwareSpecs": false, "memoryGiB": 256, "name": "ml.g5.16xlarge", "vcpuNum": 64 }, { "_defaultOrder": 52, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 192, "name": "ml.g5.12xlarge", "vcpuNum": 48 }, { "_defaultOrder": 53, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 4, "hideHardwareSpecs": false, "memoryGiB": 384, "name": "ml.g5.24xlarge", "vcpuNum": 96 }, { "_defaultOrder": 54, "_isFastLaunch": false, "category": "Accelerated computing", "gpuNum": 8, "hideHardwareSpecs": false, "memoryGiB": 768, "name": "ml.g5.48xlarge", "vcpuNum": 192 } ], "instance_type": "ml.t3.medium", "kernelspec": { "display_name": "Python 3 (Data Science)", "language": "python", "name": "python3__SAGEMAKER_INTERNAL__arn:aws:sagemaker:us-east-1:081325390199:image/datascience-1.0" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.10" } }, "nbformat": 4, "nbformat_minor": 5 }